var xmlHttp;

// AJAX utility
// create new xmlHTTP object based on the type of browser 
function GetXmlHttpObject() {
  var xmlHttp=null;
  try 
  {
    // Firefox, Opera 8.0+, Safari
    xmlHttp=new XMLHttpRequest();
  }
  catch (e) 
  {
    // Internet Explorer
    try {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e) {
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  return xmlHttp;
}

function facesettingchange()
{
document.getElementById('liftbutton').style.display="block";
document.getElementById('messagebox').innerHTML="Face settings have changed, please press the button above to calculate new resulting face.";
document.getElementById('messagebox').style.display="block";

}

function displaymessage(mnum)
{
message="";
switch (mnum) 
{
case 0:
{
msg0="The operations involved in this visualization are ";
msg1="The operation involved in this visualization is ";
str=2;
for (i=34;i>19;i--)
if (settings[i]>0) 
	if (str==0) 
		{
		if (getToolName(i)!="") 
			{message=getToolName(i)+', '+message;}
		} 
	else if (str==1) 
		{
		if (getToolName(i)!="") 
			{message=getToolName(i)+' and '+message;str=0;}
		} 
	else if (getToolName(i)!="") {message=getToolName(i)+'.';str=1;};
opsinvolved=message;
if (str==0) {message=msg0+message;} else message=msg1+message;
str=1;
for (i=20;i<35;i++) if (getToolName(i)!="") if (settings[i]!=1.4) str=0;
if (str==0) {str=2;for (i=20;i<35;i++) if (getToolName(i)!="") if (settings[i]!=optionlevel(i)) str=0;}
if (str==1) {message="All operations were involved with this visualization at a subtle level.";}
if (str==2) {message="All operations were involved with this visualization at a full level.";}
}
break;
case 1:message="Your image appears to be slightly rotated.  For best results, use the rotate buttons to make the image straight.";break;
case 2:message="We had a problem processing your image.  Please make sure you only upload a FRONTAL photo of a face.";break;
case 3:message="We had a problem processing your image.  Please make sure you only upload a FRONTAL photo of a face.";break;
case 4:message="We had a problem processing your image.  Please make sure you only upload a FRONTAL photo of a face.";break;
}
document.getElementById('messagebox').innerHTML=message;
document.getElementById('messagebox').style.display="block";

}


//AJAX caller for all facetool changes
function doJob(pid) {
  if (picOrig=="default.jpg")
  {
    alert("Please upload an image first.");
  }
  else
  {
    showloader(1);
//    indicateprogress();
    data=packdata();
    //alert("packed:"+data);
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
    {
      alert("Browser does not support HTTP Request");
      return;
    }
    
    var url="ajax/change.php";
    url=url+"?data="+data;
    url=url+"&sid="+Math.random();
    xmlHttp.onreadystatechange=function() 
    {
      if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") 
      {
        //alert("unpacking:"+xmlHttp.responseText);
	document.getElementById('finalresulttd').style.display="block";
	document.getElementById('compare').style.display="block";
	document.getElementById('midtoolnotice').style.display='none';

        unpackdata(xmlHttp.responseText);
        update_pictures(2);
	showafter();
        doneprogress();
	showloader(0);
 
     }
    }
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
      
//    displayValues();
  }
}


//AJAX caller for all imagetool changes
function doRotate(pid) {
//if (tool>1) document.getElementById('currentimagetool').style.display="none";
  if (picOrig=="default.jpg")
  {
    alert("Please upload an image first.");
  }
  else
  {
    data=packdata();
    showloader(1);
    //alert("packed:"+data);
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
    {
      alert("Browser does not support HTTP Request");
      return;
    }
    
//        cropper.removeit();
    var url="ajax/rotate.php";
    url=url+"?data="+data;
    url=url+"&sid="+Math.random();
	cropper.removeit();

    xmlHttp.onreadystatechange=function() 
    {
      if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") 
      {
        //alert("unpacking:"+xmlHttp.responseText);
       unpackdata(xmlHttp.responseText);
        update_pictures(1);
	//cropper.init(facecoords[0],facecoords[1],facecoords[2],facecoords[3]);
	showloader(0); 
 
      }
    }
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
//    displayValues();
  }

}


//AJAX caller for sending email
function mailsend(target) {
  if (picOrig=="default.jpg")
  {
    alert("Please upload an image first.");
  }
  else
  {
    data=packdata();
    showloader(1);
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
    {
      alert("Browser does not support HTTP Request");
      return;
    }
    
    var url="ajax/mailer.php";
    url=url+"?data="+data;
    url=url+"&target="+target;
    url=url+"&ops="+opsinvolved;
    url=url+"&sid="+Math.random();
    xmlHttp.onreadystatechange=function() 
    {
      if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") 
      {
        //alert("unpacking:"+xmlHttp.responseText);
        //unpackdata(xmlHttp.responseText);
        //update_pictures();
        //cropper.init(facecoords[0],facecoords[1],facecoords[2],facecoords[3]);
	document.getElementById('sendmail').style.display='none';
	document.getElementById('mailbutton').style.display='block';
	showloader(0); 
 	alert('Email has been sent!');
      }
    }
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
    //displayValues();
  }

}

/*
option orders
around eyes   forehead   mid-brow   inner cheek   outer cheek   jaw   eyebrow   lip   outer lip   cheek lift  under eyes   nose   beside eyes 	weight
0             1          2          3             4             5     6         7     8           9           10           11     12	13
*/

function packdata()
{
    data=picCur;                                                              //data[0]
    for (i=0;i<4;i++) data+=","+facecoords[i];                                //data[1]-data[4]  
    data+=","+picOrig;
    for (i=0;i<4;i++) data+=","+origcoords[i];                                //data[6]-data[9]
    data+=","+picWork;
    data+=","+settings[3];                                                    //data[11],data[12]
    data+=","+settings[4];
    for (i=0;i<3;i++) data+=","+settings[i];
//modified settings order to match javascript with c program. A better solution (if time permits) would be to modify the c program to use the settings[] order.
    //for (i=20;i<33;i++) data+=","+settings[i];
data+=","+settings[23]*toolweight(23);
data+=","+settings[20]*toolweight(20);
data+=","+settings[22]*toolweight(22);
data+=","+settings[26]*toolweight(26);
data+=","+settings[27]*toolweight(27);
data+=","+settings[32]*toolweight(32);
data+=","+settings[21]*toolweight(21);
data+=","+settings[31]*toolweight(31);
data+=","+settings[30]*toolweight(30);
data+=","+settings[28]*toolweight(28);
data+=","+settings[25]*toolweight(25);
data+=","+settings[29]*toolweight(29);
data+=","+settings[24]*toolweight(24);
data+=","+settings[33]*toolweight(33);
data+=","+settings[34]*toolweight(34);


  return (data);
}

function unpackdata(data)
{
  tempArray=new Array();
  tempArray=data.split(",");
  
  picCur=tempArray[0];
  for (i=0;i<4;i++) facecoords[i]=eval(tempArray[i+1]);  
  picOrig=tempArray[5];
  for (i=0;i<4;i++) origcoords[i]=eval(tempArray[i+6]);
  picWork=tempArray[10];
  settings[3]=eval(tempArray[11]);
  settings[4]=eval(tempArray[12]);
  for (i=0;i<3;i++) settings[i]=eval(tempArray[i+13]);
//modified settings
  //for (i=20;i<33;i++) settings[i]=eval(tempArray[i-4]);

/*
		settings[23]=eval(tempArray[16])/toolweight(23);
		settings[20]=eval(tempArray[17])/toolweight(20);
		settings[22]=eval(tempArray[18])/toolweight(22);
		settings[26]=eval(tempArray[19])/toolweight(26);
		settings[27]=eval(tempArray[20])/toolweight(27);
		settings[32]=eval(tempArray[21])/toolweight(32);
		settings[21]=eval(tempArray[22])/toolweight(21);
		settings[31]=eval(tempArray[23])/toolweight(31);
		settings[30]=eval(tempArray[24])/toolweight(30);
		settings[28]=eval(tempArray[25])/toolweight(28);
		settings[25]=eval(tempArray[26])/toolweight(25);
		settings[29]=eval(tempArray[27])/toolweight(29);
		settings[24]=eval(tempArray[28])/toolweight(24);
		settings[33]=eval(tempArray[29])/toolweight(33);
		settings[34]=eval(tempArray[30])/toolweight(34);
*/
 anyerror=new Array();
 anyerror=data.split("#");
 if (anyerror.length>1) displaymessage(parseInt(anyerror[1]));
}


//changes the tool selected
function toolChange(nextTool) {
if (tool>19)
{
  document.getElementById('option'+(tool-19)).className="option";
document.getElementById('higher'+(tool-19)).style.display="none";
document.getElementById('lower'+(tool-19)).style.display="none";

valx=Math.round(9*settings[tool]/3);
document.getElementById("option"+(tool-19)).style.background="url('images/lmlevel"+valx+".png') no-repeat";
}
tool=nextTool;
if (tool<2)
{
//  document.getElementById('currentimagetool').style.display="block";
} else
{
if (tool>19)
{  
document.getElementById('higher'+(tool-19)).style.display="block";
document.getElementById('lower'+(tool-19)).style.display="block";
document.getElementById('option'+(tool-19)).className="optionselected";
}
}
//displayValues();
if (tool>19)
{
valx=Math.round(9*settings[tool]/3);
document.getElementById("option"+(tool-19)).style.background="url('images/xlmlevel0"+valx+".png') no-repeat";
}
}

//redetects the face
function faceChange(pid) {
  tool=5;
//  document.getElementById('currentimagetool').style.display="none";

  //needs to call the real php function.
  if (picOrig=="default.jpg")
  {
    alert("Please upload an image first.");
    return;
  }
    showloader(1);
    data=packdata();
    //alert("packed:"+data);
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
    {
      alert("Browser does not support HTTP Request");
      return;
    }
    
//        cropper.removeit();
    var url="ajax/detect.php";
    url=url+"?data="+data;
    url=url+"&sid="+Math.random();
   cropper.removeit();
    xmlHttp.onreadystatechange=function() 
    {
      if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") 
      {
        //alert("unpacking:"+xmlHttp.responseText);
        unpackdata(xmlHttp.responseText);
        update_pictures(1);
        //cropper.init(facecoords[0],facecoords[1],facecoords[2],facecoords[3]);
  	showloader(0);
      }
    }
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
//    displayValues();
}

//placeholder for enhance button
function enhanceChange(pid,amount) {
tool=6;
//displayValues();
}

//lowers the value of the slider
function lower(tool)
{
  st=0.75;
  if (tool<20) st=0.25;

  if ((settings[tool]>0)&&(tool>1)) facesettingchange();
  if (settings[tool]<=st)
  {
    settings[tool]=0;
  }
  else
  {
    settings[tool]-=st;
  }

if (tool<3)
{
  doRotate();
}
tiesthatbond(tool);
displayValues();
}

function optionlevel(num)
{
switch (num)
{
    case 20:return 0;   //forehead
    case 21:return 3; //browlift
    case 22:return 3; //frown lines
    case 23:return 2.2; //around eyes
    case 24:return 2.2; //crows feet
    case 25:return 2; //under eyes
    case 26:return 2.3; //smile lines
    case 27:return 0;  //outer cheek
    case 28:return 1; //cheek enhancement
    case 29:return 0; //nose reduction
    case 30:return 2.7; //mouth frown
    case 31:return 3; //lip volume
    case 32:return 2.4; //jaw contour
    case 33:return 0; //weight reduction
    case 34:return 0; //lower lip
}
}

function setalloptions(val)
{

  facesettingchange();

  for (i=20;i<35;i++) if (getToolName(i)!="") 
		{toolChange(i);if (val<2) {settings[i]=val;} else settings[i]=optionlevel(i);
//  displayValues();
  }

for (i=20;i<35;i++)
{
document.getElementById('higher'+(i-19)).style.display="none";
document.getElementById('lower'+(i-19)).style.display="none";

  document.getElementById('option'+(i-19)).className="option";
valx=Math.round(9*settings[i]/3);
document.getElementById("option"+(i-19)).style.background="url('images/lmlevel"+valx+".png') no-repeat";
}

}

function higher(tool)
{
  st=0.75;
  if (tool<20) st=0.25;
  if ((settings[tool]<3)&&(tool>1)) facesettingchange();
  if (settings[tool]>=3-st)
  {
    settings[tool]=3;
  }
  else
  {

    settings[tool]+=st;
  }

if (tool<3)
{
  doRotate();
}
tiesthatbond(tool);
displayValues();
}

function tiesthatbond(tool)
{
switch (tool)
{
case 25:settings[23]=settings[25];break;
//case 26:settings[28]=settings[26];break;
//case 34:settings[32]=settings[34]/5;break;
}
}

//for displaying the currently selected tool
function getToolName(tool)
{
  var toolname="no tools selected";
  switch (tool)
  {
    case 0:
      toolname="contrast";
      break
    case 1:
      toolname="brightness";
      break
    case 2:
      toolname="colour";
      break
    case 3:
      toolname="rotate";
      break
    case 4:
      toolname="zoom";
      break
    case 5:
      toolname="face detect";
      break
    case 6:
      toolname="enhance";
      break
    case 20:
//      toolname="forehead enhancement";
	toolname="";
      break
    case 21:
      toolname="Brow lift";
      break
    case 22:
      toolname="Frown lines";
      break
    case 23:
//      toolname="around eyes";
	toolname="";
      break
    case 24:
      toolname="Crow's feet";
      break
    case 25:
      toolname="Under eyes";
	//link to 23 - 25 is just tear trough
      break
    case 26:
      toolname="Smile lines";
	//link to 28 - 26 is just cheek enhancement
      break
    case 27:
//      toolname="outer cheek";
	toolname="";
      break
    case 28:
      toolname="Cheek enhancement";
      break
    case 29:
//      toolname="nose reduction";
	toolname="";
      break
    case 30:
      toolname="Mouth frown";
      break
    case 31:
      toolname="Lip volume";
      break
    case 32:
      toolname="Jaw contour";
      break
    case 33:
//      toolname="weight reduction";
	toolname="";
      break
    case 34:
//     toolname="Lower lip";
	toolname="";

      break
    default:
      toolname="";
  }
  return(toolname);
}

function toolweight(tool)
{
  switch (tool)
  {
    case 20:return 1;   //forehead
    case 21:return 1; //browlift
    case 22:return 1; //frown lines
    case 23:return 1; //around eyes
    case 24:return 0.5; //crows feet
    case 25:return 0.5; //under eyes
    case 26:return 0.7; //smile lines
    case 27:return 1;  //outer cheek
    case 28:return 1; //cheek enhancement
    case 29:return 1; //nose reduction
    case 30:return 1; //mouth frown
    case 31:return 1.2; //lip volume
    case 32:return 0.7; //jaw contour
    case 33:return 1; //weight reduction
    case 34:return 1; //lower lip
    default:return 1;
  }
  return(toolname);
}

//display the value of the current tool
function displayValues()
{
    if (tool>=20) {
	valx=Math.round(9*settings[tool]/3);
	document.getElementById("option"+(tool-19)).style.background="url('images/xlmlevel0"+valx+".png') no-repeat";
	}
}


function update_pictures(num)
{
  
if (num==1)  document.getElementById("picture").src = "img/"+picWork;
if (num==2)  document.getElementById("pictureResult").src = "img/"+picCur;
}



//set progressbar
function indicateprogress()
{
  document.getElementById('liftbutton').style.display='none';
  document.getElementById('progressBar').style.display='block';
}
//hide progressbar, set "show me" bar
function doneprogress()
{
  document.getElementById('liftbutton').style.display='none';
//  document.getElementById('progressBar').style.display='none';
  document.getElementById('comparediv').style.display='block';
  document.getElementById('resultdiv').style.display='block';
}


function setrotate(cw)
{
  tool=3;
  settings[3]=settings[3]+cw;
}

function setzoom(zm)
{
  tool=4;
  if (settings[4]>0)
  {
    for (i=0;i<4;i++) facecoords[i]=origcoords[i];
    document.getElementById("zoom").innerHTML = "Zoom in";
    y=settings[4]-zm;
  }
  else
  {
    for (i=0;i<4;i++) origcoords[i]=facecoords[i];
    document.getElementById("zoom").innerHTML = "Zoom out";
    y=settings[4]+zm;
  }
  if (y>7) y=7;
  if (y<0) y=0;
  settings[4]=y;
}

function showbefore()
{
document.getElementById('before').className="pictitleon";
document.getElementById('after').className="pictitleoff";
document.getElementById('pictureResult').src="img/xlmforig-"+picCur;
}

function showafter()
{
document.getElementById('before').className="pictitleoff";
document.getElementById('after').className="pictitleon";
document.getElementById("pictureResult").src = "img/"+picCur;
}

//Function used for slider. Refer to line 105 of slider.js
function sliderSave(n_value,mouseUp)
{
  if(((tool==1)||(tool==0))&&(n_value!=settings[tool])&&(mouseUp==1))
	{
//    document.getElementById('valueDisplay').innerHTML= n_value.toFixed(2);//in this case it's the div valueDisplay in lift2.htm
//    document.getElementById("imagevalueDisplay").innerHTML=Math.round(n_value*100/3)+"%";

    settings[tool]=n_value;                        //directly tied to settings[] in lift2.htm
    doRotate();
  }
  else
  {
//    document.getElementById("valueDisplay").innerHTML=Math.round(n_value*100/3)+"%";

   if ((tool>=20)&&(n_value!=settings[tool])&&(mouseUp==1)) facesettingchange();

    settings[tool]=n_value;                        //directly tied to settings[] in lift2.htm
    tiesthatbond(tool);
    if (tool>=20) {
	valx=Math.round(9*settings[tool]/3);
	
document.getElementById("option"+(tool-19)).style.background="url('images/xlmlevel0"+valx+".png') no-repeat";
	}

  }

}
