/**
 * Calculadora de Evolucaion
 */
var DEBUG = false

	
	
	// Definicion de constantes
	var MINUTE=60*1000;
	var HOUR=MINUTE*60;
	var DAY=HOUR*24;
	var DUEDAY=28*DAY;
	
	
	// Variables
	var datTodaysDate=new Date();
	var datZeroDate=new Date(0);
	
	
	/**
	 * Definicion de Clase de objOvulacion
	 */
	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();
		
		objOvulation.datDateObject1=new Date(Date.parse(datZeroDate));
		objOvulation.datDateObject2=new Date(Date.parse(datZeroDate));
		objOvulation.datDateObject3=new Date(Date.parse(datZeroDate));
		
		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;
	
	
	
	/**
	 * Definicion de las funciones
	 */
	
	function debug(mesage){ 
		if (DEBUG == true)
			alert(mesage);
	}
	
	
	function ReadMonth1(strSubToRead){ 
		debug(eval('document.OvulationForm.month1.options[document.OvulationForm.month1.selectedIndex].'+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;
	}
	
	function AdjustDates(objFormObjectCaller){
		objOvulation.ClearAnswers();
		var strFormObjectCallerName=objFormObjectCaller.name;
		if((strFormObjectCallerName=='month1')||(strFormObjectCallerName=='day1')){
			objOvulation._SetDateObj1();
		}
		if((strFormObjectCallerName=='month2')||(strFormObjectCallerName=='day2')){
			objOvulation._SetDateObj2();
		}
		if((strFormObjectCallerName=='month3')||(strFormObjectCallerName=='day3')){
			objOvulation._SetDateObj3();
		}
	}
	
	function objOvulation_SetDateObj1(){
		if((gIsNumber(objOvulation.ReadMonth1('value')))&&(gIsNumber(objOvulation.ReadDay1('value')))){
			objOvulation.datDateObject1=new Date((parseInt(objOvulation.ReadMonth1('value'))+1)+'/'+parseInt(objOvulation.ReadDay1('value'))+'/'+datTodaysDate.getFullYear());
		if (objOvulation.datDateObject1 > datTodaysDate) {
	 		objOvulation.datDateObject1=new Date((parseInt(objOvulation.ReadMonth1('value'))+1)+'/'+parseInt(objOvulation.ReadDay1('value'))+'/'+(datTodaysDate.getFullYear()-1)); }
		}
	}
	
	function objOvulation_SetDateObj2(){
		if((gIsNumber(objOvulation.ReadMonth2('value')))&&(gIsNumber(objOvulation.ReadDay2('value')))){
			objOvulation.datDateObject2=new Date((parseInt(objOvulation.ReadMonth2('value'))+1)+'/'+parseInt(objOvulation.ReadDay2('value'))+'/'+datTodaysDate.getFullYear());
			if (objOvulation.datDateObject2 > datTodaysDate) {
		 		objOvulation.datDateObject2=new Date((parseInt(objOvulation.ReadMonth2('value'))+1)+'/'+parseInt(objOvulation.ReadDay2('value'))+'/'+(datTodaysDate.getFullYear()-1)); 
	 		}
		}
	}
	
	function objOvulation_SetDateObj3(){

		if((gIsNumber(objOvulation.ReadMonth3('value')))&&(gIsNumber(objOvulation.ReadDay3('value')))){
			objOvulation.datDateObject3 = 
						new Date((parseInt(objOvulation.ReadMonth3('value'))+1)+'/'
									+parseInt(objOvulation.ReadDay3('value'))+'/'
									+datTodaysDate.getFullYear());
		 	if (objOvulation.datDateObject3 > datTodaysDate) {
		 		objOvulation.datDateObject3 = 
		 				new Date((parseInt(objOvulation.ReadMonth3('value'))+1)+'/'
		 							+parseInt(objOvulation.ReadDay3('value'))+'/'
		 							+(datTodaysDate.getFullYear()-1)); 
		 	}
		}
	}
	
	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('Por favor, seleccione una fecha.');
			return;
		}
	
		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());
			}
		}
	
		if((Date.parse(objOvulation.datDateObject1)!=0)&&(Date.parse(objOvulation.datDateObject2)!=0)){
			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;
		}
	
		if((Date.parse(objOvulation.datDateObject2)!=0)&&(Date.parse(objOvulation.datDateObject3)!=0)){
			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;
		}
	
		if((Date.parse(objOvulation.datDateObject1)!=0)&&(Date.parse(objOvulation.datDateObject3)!=0)){
			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;
		}
	
		if(Date.parse(objOvulation.datDateObject1)!=0){
			
			if(!(gIsValidDate((parseInt(objOvulation.ReadMonth1('value'))+1)+'/'+parseInt(objOvulation.ReadDay1('value'))+'/'+objOvulation.datDateObject1.getFullYear()))){
				alert('La primera fecha ingresada no es valida.' + (parseInt(objOvulation.ReadMonth1('value'))+1)+'/'+parseInt(objOvulation.ReadDay1('value'))+'/'+objOvulation.datDateObject1.getFullYear());
				return;
			}
		}
		if(Date.parse(objOvulation.datDateObject2)!=0){
			if(!(gIsValidDate((parseInt(objOvulation.ReadMonth2('value'))+1)+'/'+parseInt(objOvulation.ReadDay2('value'))+'/'+objOvulation.datDateObject2.getFullYear()))){
				alert('La segunda fecha ingresada no es valida.');
				return;
			}
		}
		if(Date.parse(objOvulation.datDateObject3)!=0){
			if(!(gIsValidDate((parseInt(objOvulation.ReadMonth3('value'))+1)+'/'+parseInt(objOvulation.ReadDay3('value'))+'/'+objOvulation.datDateObject3.getFullYear()))){
				alert('La tercera fecha ingresada no es valida.');
				return;
			}
		}
	
		intDividend=(intDateObject1N2Deviation/DAY)+(intDateObject2N3Deviation/DAY)+(intDateObject1N3Deviation/DAY);
		if(intDivisor!=0){
			intQuotient=(intDateObject1N2Deviation/DAY+intDateObject2N3Deviation/DAY+intDateObject1N3Deviation/DAY)/intDivisor;
		}
//		alert (intQuotient);
		
		if((intQuotient<22)||(intQuotient>33)){
			alert('Imposible calcular ciclos menores de 22 dias o mayores de 33.');
			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.getDate()+'/'+(datNextPeriod.getMonth()+1)+'/'+gReturnY2KDate(datNextPeriod);
			
			
			//alert(Math.round(intQuotient/2));
			var datEndFertitlity=new Date(Date.parse(datNextPeriod)-(DAY*15));
			var dtIniOvulacion = new Date(Date.parse(datNextPeriod)-(DAY*(Math.round(intQuotient/2) - 2)));
			var dtFinOvulacion = new Date(Date.parse(datNextPeriod)-(DAY*(Math.round(intQuotient/2) + 4 )));
			document.OvulationForm.Fertile3.value=(dtIniOvulacion.getDate())+'/'+(dtIniOvulacion.getMonth()+1)+'/'+gReturnY2KDate(dtIniOvulacion);
			document.OvulationForm.Fertile2.value=(dtFinOvulacion.getDate())+'/'+(dtFinOvulacion.getMonth()+1)+'/'+gReturnY2KDate(dtFinOvulacion);

				/**
				 * Período de probable ovulación
				 * 
				 * Al comienzo del último período se le suma el ciclo y se 
				 * divide por dos. Luego se cuentan cuatro días hacia atrás y 
				 * dos hacia delante.
				 */

			var datEndFertitlity=new Date(Date.parse(datNextPeriod)+(DAY*263));
			
			document.getElementById("fechaParto").value = datEndFertitlity.getDate()+'/'+(datEndFertitlity.getMonth()+1)+'/'+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)-(2*DAY*(y)));
			document.OvulationForm.Fertile1.value=datStartFertitlity.getDate()+'/'+(datStartFertitlity.getMonth()+1)+'/'+gReturnY2KDate(datStartFertitlity);
		}
		
		
		

		
		
		
	}
	
	
	
	function ClearAnswers(){
		document.OvulationForm.Cycle.value='';
		document.OvulationForm.Nextperiod.value='';
		document.OvulationForm.Fertile3.value='';
		document.OvulationForm.Fertile2.value='';
		document.OvulationForm.Fertile1.value='';
		document.getElementById("fechaParto").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();
	}
	
	
	
/**
 * Fecha de Parto
 */	
	function getFechaParto(date){
		addDays = 280;
	}
	
	
	function calcNewDate(month,day,year,adddays) {
		newday = eval(day) + adddays
		newmonth = month + 1
		newyear = eval(year)
	 	var max
		for (var i = 0; i < 12; i++) {
		  if (newmonth == 2 && (newyear % 4) == 0) {
			  max = 29
		  } else
		    max = maxday[newmonth]
		  if (newday > max) {
		    newday = newday - max
		   newmonth = newmonth + 1
		    if (newmonth > 12) {
		      newyear = newyear + 1
		      newmonth = 1
		    }
		  }
		 else
		    break
		}
		var datestring = monthname[newmonth] + " " + newday + ", " + newyear
		return datestring
	}	
	
	
