// Define constants
var MINUTE=60*1000;
var HOUR=MINUTE*60;
var DAY=HOUR*24;
var DUEDAY=28*DAY;

// Define static finals
var datTodaysDate=new Date();
var datZeroDate=new Date(0);

//Declare page object and children to mimic form
//because 3.0 can't bind a form to an OO model.
var objOvulation=new Object();
objOvulation.month1=new Object();
objOvulation.day1=new Object();
objOvulation.month2=new Object();
objOvulation.day2=new Object();
objOvulation.month3=new Object();
objOvulation.day3=new Object();

//Declare page object properties
objOvulation.datDateObject1=new Date(Date.parse(datZeroDate));

objOvulation.datDateObject2=new Date(Date.parse(datZeroDate));

objOvulation.datDateObject3=new Date(Date.parse(datZeroDate));

//Declare page object methods
objOvulation.ReadMonth1=ReadMonth1;
objOvulation.ReadDay1=ReadDay1;
objOvulation.WriteMonth1=WriteMonth1;
objOvulation.WriteDay1=WriteDay1;

objOvulation.ReadMonth2=ReadMonth2;
objOvulation.ReadDay2=ReadDay2;
objOvulation.WriteMonth2=WriteMonth2;
objOvulation.WriteDay2=WriteDay2;

objOvulation.ReadMonth3=ReadMonth3;
objOvulation.ReadDay3=ReadDay3;
objOvulation.WriteMonth3=WriteMonth3;
objOvulation.WriteDay3=WriteDay3;

objOvulation.AdjustDates=AdjustDates;
objOvulation._SetDateObj1=objOvulation_SetDateObj1;
objOvulation._SetDateObj2=objOvulation_SetDateObj2;
objOvulation._SetDateObj3=objOvulation_SetDateObj3;

objOvulation.CalculateAnswer=CalculateAnswer;
objOvulation.ClearAnswers=ClearAnswers;
objOvulation.Reset=Reset;

//functions to bind form values
function ReadMonth1(strSubToRead){ return eval('document.OvulationForm.month1.options[document.OvulationForm.month1.selectedIndex].'+strSubToRead);}
function WriteMonth1(strSubToWrite,newValue){
  for(x=0;x<document.OvulationForm.month1.options.length;x++){
    if(eval('document.OvulationForm.month1.options[x].'+strSubToWrite)==newValue) document.OvulationForm.month1.selectedIndex=x;
  }
  return true;
}
function ReadDay1(strSubToRead){ return eval('document.OvulationForm.day1.options[document.OvulationForm.day1.selectedIndex].'+strSubToRead);}
function WriteDay1(strSubToWrite,newValue){
  for(x=0;x<document.OvulationForm.day1.options.length;x++){
    if(eval('document.OvulationForm.day1.options[x].'+strSubToWrite)==newValue) document.OvulationForm.day1.selectedIndex=x;
  }
  return true;
}

function ReadMonth2(strSubToRead){ return eval('document.OvulationForm.month2.options[document.OvulationForm.month2.selectedIndex].'+strSubToRead);}
function WriteMonth2(strSubToWrite,newValue){
  for(x=0;x<document.OvulationForm.month2.options.length;x++){
    if(eval('document.OvulationForm.month2.options[x].'+strSubToWrite)==newValue) document.OvulationForm.month2.selectedIndex=x;
  }
  return true;
}
function ReadDay2(strSubToRead){ return eval('document.OvulationForm.day2.options[document.OvulationForm.day2.selectedIndex].'+strSubToRead);}
function WriteDay2(strSubToWrite,newValue){
  for(x=0;x<document.OvulationForm.day2.options.length;x++){
    if(eval('document.OvulationForm.day2.options[x].'+strSubToWrite)==newValue) document.OvulationForm.day2.selectedIndex=x;
  }
  return true;
}

function ReadMonth3(strSubToRead){ return eval('document.OvulationForm.month3.options[document.OvulationForm.month3.selectedIndex].'+strSubToRead);}
function WriteMonth3(strSubToWrite,newValue){
  for(x=0;x<document.OvulationForm.month3.options.length;x++){
    if(eval('document.OvulationForm.month3.options[x].'+strSubToWrite)==newValue) document.OvulationForm.month3.selectedIndex=x;
  }
  return true;
}
function ReadDay3(strSubToRead){ return eval('document.OvulationForm.day3.options[document.OvulationForm.day3.selectedIndex].'+strSubToRead);}
function WriteDay3(strSubToWrite,newValue){
  for(x=0;x<document.OvulationForm.day3.options.length;x++){
    if(eval('document.OvulationForm.day3.options[x].'+strSubToWrite)==newValue) document.OvulationForm.day3.selectedIndex=x;
  }
  return true;
}

//functions to manipulate form values
function AdjustDates(objFormObjectCaller){
  objOvulation.ClearAnswers();
  var strFormObjectCallerName=objFormObjectCaller.name;
  if((strFormObjectCallerName=='month1')||(strFormObjectCallerName=='day1')){
  //objOvulation.datDateObject1 source changed
    objOvulation._SetDateObj1();
  }
  if((strFormObjectCallerName=='month2')||(strFormObjectCallerName=='day2')){
  //objOvulation.datDateObject2 source changed
    objOvulation._SetDateObj2();
  }
  if((strFormObjectCallerName=='month3')||(strFormObjectCallerName=='day3')){
  //objOvulation.datDateObject3 source changed
    objOvulation._SetDateObj3();
  }
}

function objOvulation_SetDateObj1(){
  if((gIsNumber(objOvulation.ReadMonth1('value')))&&(gIsNumber(objOvulation.ReadDay1('value')))){
  //objOvulation.datDateObject1 sources not empty

  var month = parseInt( objOvulation.ReadMonth1('value') ) +1;
  var day   = parseInt( objOvulation.ReadDay1('value') );
  var year  = getCorrectYear( month );

  objOvulation.datDateObject1 = new Date( month + '/' + day + '/' + year );
	
  }
}

function objOvulation_SetDateObj2(){
  if((gIsNumber(objOvulation.ReadMonth2('value')))&&(gIsNumber(objOvulation.ReadDay2('value')))){
  //objOvulation.datDateObject2 sources not empty

  var month = parseInt( objOvulation.ReadMonth2('value') +1);
  var day   = parseInt( objOvulation.ReadDay2('value') );
  var year  = getCorrectYear( month );

  objOvulation.datDateObject2 = new Date( month + '/' + day + '/' + year );

  }
}

function objOvulation_SetDateObj3(){
  if((gIsNumber(objOvulation.ReadMonth3('value')))&&(gIsNumber(objOvulation.ReadDay3('value')))){
  //objOvulation.datDateObject3 sources not empty

  var month = parseInt( objOvulation.ReadMonth3('value') +1);
  var day   = parseInt( objOvulation.ReadDay3('value') );
  var year  = getCorrectYear( month );

  objOvulation.datDateObject3 = new Date( month + '/' + day + '/' + year );

  }
}

function getCorrectYear( dateToCheck ) {
  //if the monthToCheck is greater than datTodaysDate month
  //it must mean LAST year

  if ( dateToCheck > (datTodaysDate.getMonth() + 1) ) {
    return datTodaysDate.getFullYear() - 1;
  } else { 
    return datTodaysDate.getFullYear();
  }

}

function CalculateAnswer(){
  var intNumberOfDatesSelected=intDividend=intDivisor=intQuotient=0;

  if(Date.parse(objOvulation.datDateObject1)!=0) intNumberOfDatesSelected++;
  if(Date.parse(objOvulation.datDateObject2)!=0) intNumberOfDatesSelected++;
  if(Date.parse(objOvulation.datDateObject3)!=0) intNumberOfDatesSelected++;

  if (intNumberOfDatesSelected<1){
    alert('Favor selecionar uma data.');
    return;
  }


  //if they've only entered one date, guess the others
  if (intNumberOfDatesSelected==1){
    if(Date.parse(objOvulation.datDateObject1)!=0){
        objOvulation.datDateObject2=new Date(objOvulation.datDateObject1.valueOf()-DUEDAY);
        objOvulation.WriteMonth2('value',objOvulation.datDateObject2.getMonth());
        objOvulation.WriteDay2('value',objOvulation.datDateObject2.getDate());
        objOvulation.datDateObject3=new Date(objOvulation.datDateObject1.valueOf()-DUEDAY-DUEDAY);
        objOvulation.WriteMonth3('value',objOvulation.datDateObject3.getMonth());
        objOvulation.WriteDay3('value',objOvulation.datDateObject3.getDate());
    }else if(Date.parse(objOvulation.datDateObject2)!=0){
        objOvulation.datDateObject1=new Date(objOvulation.datDateObject2.valueOf()+DUEDAY);
        objOvulation.WriteMonth1('value',objOvulation.datDateObject1.getMonth());
        objOvulation.WriteDay1('value',objOvulation.datDateObject1.getDate());
        objOvulation.datDateObject3=new Date(objOvulation.datDateObject2.valueOf()-DUEDAY);
        objOvulation.WriteMonth3('value',objOvulation.datDateObject3.getMonth());
        objOvulation.WriteDay3('value',objOvulation.datDateObject3.getDate());
    }else if(Date.parse(objOvulation.datDateObject3)!=0){
        objOvulation.datDateObject1=new Date(objOvulation.datDateObject3.valueOf()+DUEDAY+DUEDAY);
        objOvulation.WriteMonth1('value',objOvulation.datDateObject1.getMonth());
        objOvulation.WriteDay1('value',objOvulation.datDateObject1.getDate());
        objOvulation.datDateObject2=new Date(objOvulation.datDateObject3.valueOf()+DUEDAY);
        objOvulation.WriteMonth2('value',objOvulation.datDateObject2.getMonth());
        objOvulation.WriteDay2('value',objOvulation.datDateObject2.getDate());
    }
  }

  //adjust second year off first
  if ( ( Date.parse( objOvulation.datDateObject1 ) != 0 ) 
       && ( Date.parse( objOvulation.datDateObject2 ) != 0 ) ) { //if one and two have been changed.
    if ( Date.parse( objOvulation.datDateObject1 ) < Date.parse( objOvulation.datDateObject2 ) ) {
      while ( Date.parse( objOvulation.datDateObject1 ) < Date.parse( objOvulation.datDateObject2 ) ) {
        objOvulation.datDateObject2.setYear( objOvulation.datDateObject2.getYear() - 1 );
      }
    }
    var intDateObject1N2Deviation=(Date.parse(objOvulation.datDateObject1)-Date.parse(objOvulation.datDateObject2));
    intDivisor++;
  }else{
    var intDateObject1N2Deviation=0;
  }

  //adjust third year off second
  if((Date.parse(objOvulation.datDateObject2)!=0)&&(Date.parse(objOvulation.datDateObject3)!=0)){
    //if two and three have been changed.
    if(Date.parse(objOvulation.datDateObject2)<Date.parse(objOvulation.datDateObject3)){
      while(Date.parse(objOvulation.datDateObject2)<Date.parse(objOvulation.datDateObject3)){
        objOvulation.datDateObject3.setYear(objOvulation.datDateObject3.getYear()-1);
      }
    }
    var intDateObject2N3Deviation=(Date.parse(objOvulation.datDateObject2)-Date.parse(objOvulation.datDateObject3));
    intDivisor++;
  }else{
    var intDateObject2N3Deviation=0;
  }

  //adjust third year off first
  if((Date.parse(objOvulation.datDateObject1)!=0)&&(Date.parse(objOvulation.datDateObject3)!=0)){
    //if one and three have been changed.
    if(Date.parse(objOvulation.datDateObject1)<Date.parse(objOvulation.datDateObject3)){
      while(Date.parse(objOvulation.datDateObject1)<Date.parse(objOvulation.datDateObject3)){
        objOvulation.datDateObject3.setYear(objOvulation.datDateObject3.getYear()-1);
      }
    }
    var intDateObject1N3Deviation=(Date.parse(objOvulation.datDateObject1)-Date.parse(objOvulation.datDateObject3));
    intDivisor+=2;
  }else{
    var intDateObject1N3Deviation=0;
  }

  //validate dates
  if(Date.parse(objOvulation.datDateObject1)!=0){
    if(!(gIsValidDate((parseInt(objOvulation.ReadMonth1('value'))+1)+'/'+parseInt(objOvulation.ReadDay1('value'))+'/'+objOvulation.datDateObject1.getFullYear()))){
      alert('A primeira data entrada não é válida.');
      return;
    }
  }
  if(Date.parse(objOvulation.datDateObject2)!=0){
    if(!(gIsValidDate((parseInt(objOvulation.ReadMonth2('value'))+1)+'/'+parseInt(objOvulation.ReadDay2('value'))+'/'+objOvulation.datDateObject2.getFullYear()))){
      alert('A segunda data entrada não é válida.');
      return;
    }
  }
  if(Date.parse(objOvulation.datDateObject3)!=0){
    if(!(gIsValidDate((parseInt(objOvulation.ReadMonth3('value'))+1)+'/'+parseInt(objOvulation.ReadDay3('value'))+'/'+objOvulation.datDateObject3.getFullYear()))){
      alert(' A terceira data entrada não é válida.');
      return;
    }
  }

  //make sure that they haven't selected a date too far in the past
  var intCheckDate = (Date.parse(datTodaysDate) / DAY) - (Date.parse(objOvulation.datDateObject1) / DAY);
  if ((intQuotient < 0) || (intCheckDate > 33)) {
    alert('Não se pode calcular ciclos menores que 22 dias ou maiores que 33 dias.');
    return;
  }


  //calculate the average cycle
  intDividend=(intDateObject1N2Deviation/DAY)+(intDateObject2N3Deviation/DAY)+(intDateObject1N3Deviation/DAY);
  if ( intDivisor != 0 ) {
    intQuotient = intDividend / intDivisor;
  }
  
  if((intQuotient<22)||(intQuotient>33)){
    alert('Não se pode calcular ciclos menores que 22 dias ou maiores que 33 dias.');
    return;
  }
  document.OvulationForm.Cycle.value=Math.round(intQuotient);

  var datNextPeriod=new Date(0);
  if(Date.parse(objOvulation.datDateObject1)!=0){
    datNextPeriod=new Date(Date.parse(objOvulation.datDateObject1)+(intQuotient*DAY));
  }else if(Date.parse(objOvulation.datDateObject2)!=0){
    datNextPeriod=new Date(Date.parse(objOvulation.datDateObject2)+((intQuotient*DAY)*2));
  }else if(Date.parse(objOvulation.datDateObject3)!=0){
    datNextPeriod=new Date(Date.parse(objOvulation.datDateObject1)+((intQuotient*DAY)*3));
  }else{
    return;
  }

  if(Date.parse(datNextPeriod)!=0){
    document.OvulationForm.Nextperiod.value=(datNextPeriod.getMonth()+1)+'/'+datNextPeriod.getDate()+'/'+gReturnY2KDate(datNextPeriod);

    var datEndFertitlity=new Date(Date.parse(datNextPeriod)-(DAY*15));
    document.OvulationForm.Fertile2.value=(datEndFertitlity.getMonth()+1)+'/'+datEndFertitlity.getDate()+'/'+gReturnY2KDate(datEndFertitlity);

    var m=(4.875-3)/(31-22);
    var b=(3-(m*22));
    x=intQuotient;
    var y=(m*x)+b;
    var datStartFertitlity=new Date(Date.parse(datEndFertitlity)-(DAY*(y)));
    document.OvulationForm.Fertile1.value=(datStartFertitlity.getMonth()+1)+'/'+datStartFertitlity.getDate()+'/'+gReturnY2KDate(datStartFertitlity);
  }
}

function ClearAnswers(){
  document.OvulationForm.Cycle.value='';
  document.OvulationForm.Nextperiod.value='';
  document.OvulationForm.Fertile2.value='';
  document.OvulationForm.Fertile1.value='';
}

function Reset(){
  objOvulation.datDateObject1=new Date(Date.parse(datZeroDate));
  objOvulation.datDateObject2=new Date(Date.parse(datZeroDate));
  objOvulation.datDateObject3=new Date(Date.parse(datZeroDate));
  ClearAnswers();
}






