/*
	js_datefuncs.js
	funciones para manejo de popup-calendar y validacion de fechas, 
	modificada x J.Papadopolo en Dic/2006
	
para usarla siga las 3 instrucciones siguientes:

1) entre <HEAD> y </HEAD>, deberán estar estas instrucciones:
	<script language="JavaScript" src="js_datefuncs.js"></script>	
	<style>
	.today {COLOR: black; FONT-FAMILY: sans-serif; FONT-SIZE: 10pt; FONT-WEIGHT: bold; 
		cursor: hand }
	.days {COLOR: navy; FONT-FAMILY: sans-serif; FONT-SIZE: 10pt; FONT-WEIGHT: bold; TEXT-ALIGN: center;
		background-color:#ACB4BF; cursor: hand }
	.dates {COLOR: black; FONT-FAMILY: sans-serif; FONT-SIZE: 10pt;  cursor: hand  }
	.dias {COLOR: black; FONT-FAMILY: sans-serif; FONT-SIZE: 10pt; background-color:#DBE2EB; 
		FONT-WEIGHT: bold }
	.subbarnotselone {
		vertical-align: middle; cursor: hand; }
	.subbarhover {
		vertical-align: middle; cursor: hand; color:#6B3F5B ; background-color: #BCBCE6 }
	.subbarhover2 {
		border-right: black 1px solid; border-top: white 1px solid; vertical-align: middle; 
		border-left: white 1px solid; cursor: hand; color: red; border-bottom: black 1px solid; 
		background-color: #cc99ff }
	</style>
	
2) entre <BODY> y </BODY>, deberán estar estas instrucciones, que son el calendario popup:
	<TABLE bgColor=#E8F0FB border=1 cellPadding=0 cellSpacing=3 id=calendar 
			style="DISPLAY: none; POSITION: absolute; Z-INDEX: 4">
	  <TBODY >
	  <TR>
	    <TD colSpan=7 vAlign=center>
		<!-- Month combo box -->
		<SELECT id=month onchange=newCalendar()> 
	    	<SCRIPT language=JavaScript>
			// Output months into the document, selecting current month.
			for (var intLoop = 0; intLoop < months.length; intLoop++)
				document.write("<OPTION " +	(today.month == intLoop ? "Selected" : "") + ">" + months[intLoop]);
			</SCRIPT>
		</SELECT> 
		<!-- Year combo box -->
		<SELECT id=year onchange=newCalendar()> 
	        <SCRIPT language=JavaScript>
			// Output years into the document, selecting current year.
			for (var intLoop = 1998; intLoop < 2012; intLoop++)
				document.write("<OPTION " + (today.year == intLoop ? "Selected" : "") + ">" + intLoop);
			</SCRIPT>
		</SELECT> 
		</TD>
	  </TR>
	  <TR>
		<!-- Generate column for each day. -->
	    <SCRIPT language=JavaScript>
		// Output days.
		for (var intLoop = 0; intLoop < days.length; intLoop++)
			document.write("<TD align=center bgcolor='#ACB4BF'>" + days[intLoop] + "</TD>");
		</SCRIPT>
	  </TR>
	  <TBODY id=dayList onclick="getDate('')" vAlign=center>
	  <!-- Generate grid for individual days. -->
	  <SCRIPT language=JavaScript>
		for (var intWeeks = 0; intWeeks < 6; intWeeks++)
		{
			document.write("<TR>");
			for (var intDays = 0; intDays < days.length; intDays++)
				document.write("<TD class='subbarnotselone' onmouseover='this.className=\"subbarhover\"' onmouseout='this.className=\"subbarnotselone\"'></TD>");
			document.write("</TR>");
		}
	  </SCRIPT>
	  </TBODY>
	  <TBODY>
	  <!-- Generate today day. -->
	  <TR>
	    <TD class=today colSpan=5 id=todayday onclick=getTodayDay() Align=center bgcolor='#ACB4BF'></TD>
	    <TD align=center colSpan=2 bgcolor='#ACB4BF'><A href="javascript:HideCalendar();"><SPAN style="COLOR: black; FONT-SIZE: 10px"><B>Cerrar</B></SPAN></A></TD>
	  </TR>
	  </TBODY>
	</TABLE>
	
3) Para armar el FORM para ingreso de datos con fechas, vea el sig. ejemplo:
	Inicio: <INPUT id="MyDate_tb" name="MyDate_tb" onBlur="checkdate(this)" onFocus='veriDate(this)' size=10> 
		<a href="JavaScript:;" onClick="toggleCalendar('MyDate_tb')"><IMG SRC='btn_cal_up.gif' Border=0>
		</a>
		<INPUT Type='hidden' Name='MyDate' ReadOnly>
	IMPORTANTE:
		1.para cada INPUT deberá existir un ID='xxx_tb' y NAME='xxx_tb'  IGUALES!! que hacen referencia al
		  nombre de la variable del FORM donde guardará la fecha. NOTESE que en el nombre de la variable se encuentra
		  al final una "_tb". Esto se dejó así para que las rutinas de javascript muestren una fecha "humana" con
		  letras y numeros legible en español, (ej: 15-May-2006) pero internamente manejará en una variable HIDDEN
		  el valor correcto para MySQL (ej: 2006-05-15)
		2.Por consiguiente deberá incluir la línea con el INPUT type='hidden' con el nombre correcto de la variable de
		  la fecha (sin el "_tb"), para que lo maneje el <FORM POST> y lo pueda almacenar en la base de datos
		  posteriormente.
*/
var months = new Array(	"Enero", "Febrero", "Marzo", "Abril", 
						"Mayo", "Junio", "Julio", "Agosto", 
						"Septiembre", "Octubre", "Noviembre", "Diciembre");
var strMeses = new Array(	"Ene", "Feb", "Mar", "Abr", "May", "Jun", 
						"Jul", "Ago", "Sep", "Oct", "Nov", "Dic");
var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var days = new Array("D", "L", "M", "M", "J", "V", "S");
var DateDy=0, DateMo=0, DateMd=0, DateYr=0 ;
today = new getToday();	
var DateErr, DateErrVal, element_id;
var DateErrMsgs = new Array ( "",
	"Falta al menos un elemento (dia/mes/año)",
	"Dia malo, deberá ser (1-31)",
	"Mes malo, deberá ser (1-12) ó (Ene-Dic)",
	"Año malo, deberá ser (00-99) ó (1900-2099)",
	"Mes malo, deberá ser (1-12) ó (ene-dic)",
	"Dia malo, deberá ser (1-31)",
	"Dia malo, deberá ser (1-30)",
	"Dia malo, en febrero",
	"Dia malo, en febrero para año bisiesto",
	"Dia malo, en febrero para año No-bisiesto"
	);
function getDays(month, year) 
{	// Test for leap year when February is selected.
	if (1 == month) {
		return ((0 == year % 4) && (0 != (year % 100))) ||
			(0 == year % 400) ? 29 : 28;
	} else {
		return daysInMonth[month];
	} // if (1 == month
} // function getDays(month, year) 
function getToday()
{	// Generate today's date.
	this.now = new Date();
	this.year = this.now.getFullYear() ; // Returned year XXXX
	this.month = this.now.getMonth();
	this.day = this.now.getDate();
} // function getToday()
function newCalendar(ElemName) 
{
	if (ElemName) {
		var valorfec = document.all[ElemName].value;
		var nuevocal=0;
		if (valorfec) {
			var formatofecha=FormatoFecha(valorfec);
			// siempre deberá venir como dd-mmm-aaaa
			var xdia = valorfec.substr(0, 2);
			var parseYear = parseInt(valorfec.substr(7, 4));
			var xmes = parseInt(MonStrNum(valorfec.substr(3, 3)));
			var newCal = new Date(parseYear , xmes, 1);
		} else {
			nuevocal=1;
		}
	} else {
			nuevocal=1;
	}
	if (nuevocal==1) {
		var parseYear = parseInt(document.all.year[document.all.year.selectedIndex].text);
		var newCal = new Date(parseYear , document.all.month.selectedIndex, 1);
	}
	var day = -1;
	var startDay = newCal.getDay();
	var daily = 0; 
	today = new getToday(); // 1st call
	if ((today.year == newCal.getFullYear() ) &&   (today.month == newCal.getMonth()))
		day = today.day;
	// Cache the calendar table's tBody section, dayList.
	var tableCal = document.all.calendar.tBodies.dayList;
	var intDaysInMonth =
		getDays(newCal.getMonth(), newCal.getFullYear() );
	//alert("Dia:"+day+"/Mes:"+newCal.getMonth()+"/Año:"+newCal.getFullYear());
	for (var intWeek = 0; intWeek < tableCal.rows.length;  intWeek++) 
	{
		for (var intDay = 0;
			 intDay < tableCal.rows[intWeek].cells.length;
			 intDay++)
		{
			var cell = tableCal.rows[intWeek].cells[intDay];
			// Start counting days.
			if ((intDay == startDay) && (0 == daily))
				{ daily = 1; }
			// Highlight the current day.
			cell.style.color = (day == daily) ? "red" : "";
			if(day == daily) {
				document.all.todayday.innerText= "Hoy: " +  day + "." + 
					strMeses[(newCal.getMonth())] + "." + newCal.getFullYear() ;
			} // if(day == daily)
			// Output the day number into the cell.
			if ((daily > 0) && (daily <= intDaysInMonth)) 
			{
			 	cell.innerText = daily++;
			} else {
				cell.innerText = "";
			} // if ((daily > 0) && (daily <= 
	   } // for (var intDay = 0;...
	} // for (var intWeek = 0; ...
} // function newCalendar(...
function getTodayDay()
{
	DateDy = today.day ;
	DateMo = (today.month+1) ;
	DateMd = today.month ;
	DateYr = today.year ;
	setDateVars();
	HideCalendar();
	// ?? document.all.year.selectedIndex =100;   
	document.all.month.selectedIndex = today.month; 
} // function getTodayDay()
function getDate() 
{
	// This code executes when the user clicks on a day
	// in the calendar.
	if ("TD" == event.srcElement.tagName)
	{	// Test whether day is valid.
		if ("" != event.srcElement.innerText)
		{ 
			DateDy = event.srcElement.innerText ;
			DateMo = (document.all.month.selectedIndex+1) ;
			DateMd = document.all.month.selectedIndex ;
			DateYr = document.all.year [document.all.year.selectedIndex].text ;
			setDateVars();
			HideCalendar();
		} // if ("" != event.srcElement.innerText)
	} // if ("TD" == event.srcElement.tagName)
} // function getDate() 
function setDateVars()
{	// sets the variables, visual and table
	var dia; // variable temporal para el dia de la fecha en 2 digitos
	var mes; // variable temporal para el mes de la fecha en 2 digitos
	if (DateDy<10) { dia="0"+DateDy; } else { dia=DateDy; }
	if (DateMo<10) { mes="0"+DateMo; } else { mes=DateMo; }
	document.all[element_id].value = dia + "-" + strMeses[DateMd] + "-" + DateYr;
	// actualizamos variable para tabla
	//alt_eid = element_id + "_tb";
	datevar = dateVarName(element_id); // variable para tabla de base de datos, quitamos "_tb"
	document.all[datevar].value = DateYr + "-" + mes + "-" + dia ;
	//document.all[""].value = ;
} // function setDateVars()
function dateVarName(dvar) 
{ // saca el nombre de variable para tabla de base de datos, quitamos "_tb"
	var tmpvar = dvar+"" ;
	return tmpvar.slice(0,-3);
}
function GetBodyOffsetX(el_name, shift)
{
	var x=0, y=0, elem = document.all[el_name];
	do 	{
		x += elem.offsetLeft;
		y += elem.offsetTop;
		if (elem.tagName == "BODY")
		{	break;	}
		elem = elem.offsetParent; 
	} while  (1 > 0);
	shift[0] = x;
	shift[1] = y;
	return  x;
} // function GetBodyOffsetX(el_name, shift)
function SetCalendarOnElement(el_name)
{
	if (el_name=="") 
	{ el_name = element_id; }
	var shift = new Array(2);
	GetBodyOffsetX(el_name, shift);
	var xx=shift[0]; var yy=shift[1]+25;
	if (yy>500) { yy=yy-220; }
	document.all.calendar.style.pixelLeft  = xx; //  - document.all.calendar.offsetLeft;
	document.all.calendar.style.pixelTop = yy ;
} // function SetCalendarOnElement
function ShowCalendar(elem_name)
{
		if (elem_name=="")
		{ elem_name = element_id; }
		element_id	= elem_name; // element_id is global variable
		newCalendar(elem_name);
		SetCalendarOnElement(element_id);
		//document.all.calendar.style.visibility = "visible";
		document.all.calendar.style.display="inline";
}	// function ShowCalendar(elem_name)
function HideCalendar()
{	//document.all.calendar.style.visibility="hidden";
	document.all.calendar.style.display="none";
} // function HideCalendar()
function toggleCalendar(elem_name)
{	//if (document.all.calendar.style.visibility == "hidden")
	if(document.all.calendar.style.display=="none")
	{	ShowCalendar(elem_name);	} 
	else 
	{	HideCalendar();	}
} // function toggleCalendar(elem_name)

// Added Check-Date-Funcions
function checkdate(objName) {
	var datefield = objName;
	if (chkdate(objName) == false) {
		datefield.select();
		alert("Fecha inválida!.\n" + DateErrMsgs[DateErr] +
		"\n" + DateErrVal + "\nUse: [dd-mm-aa] ó [dd-mm-aaaa] ó [dd-MMM-aaaa]");
		datefield.focus();
		return false;
	} else {
		return true;
	} // if (chkdate(objName) == false
} // function checkdate(objName)
function chkdate(objName) {
	var dia; // variable temporal para el dia de la fecha en 2 digitos
	var strDate;
	var strDateArray;
	var strDay;
	var strMonth;
	var strYear;
	var intday;
	var intMonth;
	var intYear;
	var booFound = false;
	var datefield = objName;
	var strSeparatorArray = new Array("-"," ","/",".");
	var intElementNr;
	DateErr = 0;
	strDate = datefield.value;
	if (strDate.length < 1) {
		return true;
	}
	for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
		if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
			strDateArray = strDate.split(strSeparatorArray[intElementNr]);
			if (strDateArray.length != 3) {
				DateErr = 1; DateErrVal="de ["+strDate+"] lo malo fué=["+strDate+"]";
				return false;
			} else {
				strDay = strDateArray[0];
				strMonth = strDateArray[1];
				strYear = strDateArray[2];
			} // if (strDateArray.length != 3
			booFound = true;
		} // if (strDate.indexOf(strSeparatorArray[intElementNr
	} // for (intElementNr = 0; intElementNr < strSeparatorArray.length;
	if (booFound == false) {
		if (strDate.length>5) {
			strDay = strDate.substr(0, 2);
			strMonth = strDate.substr(2, 2);
			strYear = strDate.substr(4);
		} else {
				DateErr = 1; DateErrVal="de ["+strDate+"] lo malo fué=["+strDate+"]";
				return false;
		} // if (strDate.length>5
	} // if (booFound == false
	if (strYear<10) { strYear=String("0"+(+strYear)); }
	if (strYear.length == 2) {
		if (strYear>50) { // siglo pasado?
			strYear = '19' + strYear;
		} else {
			strYear = '20' + strYear;
		} // if (strYear>50
	} // if (strYear.length == 2
	intday = parseInt(strDay, 10);
	if (isNaN(intday)) {
		DateErr = 2; DateErrVal="de ["+strDate+"] lo malo fué=["+intday+"]";
		return false;
	} // if (isNaN(intday))
	intMonth = parseInt(strMonth, 10);
	if (isNaN(intMonth)) {
		intMonth = MonStrNum(strMonth);
		strMonth = strMeses[intMonth];
		intMonth = intMonth+1;
		/*
		for (var i=0; i<12; i++) {
			if (strMonth.toUpperCase() == strMeses[i].toUpperCase()) {
				intMonth = i+1;
				strMonth = strMeses[i];
				i = 12;
			} // if (strMonth.toUpperCase() == strMeses[i].toUpperCase())
		} // for (var i=0;i<12;i++)
		*/
		if (isNaN(intMonth)) {
			DateErr = 3; DateErrVal="de ["+strDate+"] lo malo fué=["+intMonth+"]";
			return false;
		} // if (isNaN(intMonth)
	} // if (isNaN(intMonth)) 
	intYear = parseInt(strYear, 10);
	if (isNaN(intYear)) {
		DateErr = 4; DateErrVal="de ["+strDate+"] lo malo fué=["+intYear+"]";
		return false;
	} // if (isNaN(intYear))
	if (intYear<999) {
		DateErr = 4; DateErrVal="de ["+strDate+"] lo malo fué=["+intYear+"]";
		return false;
	}
	if (intMonth>12 || intMonth<1) {
		DateErr = 5; DateErrVal="de ["+strDate+"] lo malo fué=["+intMonth+"]";
		return false;
	} // if (intMonth>12 || intMonth<1)
	if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
		DateErr = 6; DateErrVal="de ["+strDate+"] lo malo fué=["+intday+"/"+intMonth+"]";
		return false;
	} // if ((intMonth == 1 || intMonth == 3 ||...
	if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
		DateErr = 7; DateErrVal="de ["+strDate+"] lo malo fué=["+intday+"/"+intMonth+"]";
		return false;
	} // if ((intMonth == 4 || intMonth == 6 || intMont...
	if (intMonth == 2) {
		if (intday < 1) {
			DateErr = 8; DateErrVal="de ["+strDate+"] lo malo fué=["+intday+"]";
			return false;
		} // if (intday < 1
		if (LeapYear(intYear) == true) {
			if (intday > 29) {
				DateErr = 9; DateErrVal="de ["+strDate+"] lo malo fué=["+intday+"]";
				return false;
			} // if (intday > 29
		} else {
			if (intday > 28) {
				DateErr = 10; DateErrVal="de ["+strDate+"] lo malo fué=["+intday+"]";
				return false;
			} // if (intday > 28
		} // if (LeapYear(intYear
	} // if (intMonth == 2) 
	// preparamos variable final
	if (intday<10) { dia="0"+intday; } else { dia=intday; }
	datefield.value = dia + "-" + strMeses[intMonth-1] + "-" + strYear;
	var mes=intMonth; // variable temporal para el mes de la fecha en 2 digitos
	if (intMonth<10) { mes="0"+intMonth; }
	var datevar=dateVarName(objName.name); // sacamos nombre variable para tabla, quitamos "_tb"
	//document.forms["mfJPW"].elements[datevar].value = strYear + "-" + mes + "-" + dia ;
	document.all[datevar].value = strYear + "-" + mes + "-" + dia ;
	return true;
} // function chkdate(objName
function MonStrNum(month) {
	// month string to number
	// search the name and get the month number
	var intMonth=0;
	for (var i=0; i<12; i++) {
		if (month.toUpperCase() == strMeses[i].toUpperCase()) {
			intMonth = i;
			i = 12;
		} // if (strMonth.toUpperCase() == strMeses[i].toUpperCase())
	} // for (var i=0;i<12;i++)
	return intMonth;
}
function LeapYear(intYear) {
	if (intYear % 100 == 0) {
		if (intYear % 400 == 0) { return true; }
	} else {
		if ((intYear % 4) == 0) { return true; }
	} // if (intYear % 100 == 0)
	return false;
} // function LeapYear(intYear
function doDateCheck(from, to) {
	if (Date.parse(from.value) <= Date.parse(to.value)) {
		alert("Fechas son inválidas.");
	} else {
		if (from.value == "" || to.value == "")
			alert("Ambas fechas deben ingresarse.");
		else
			alert("Fecha inicial debe ser ANTES que fecha final.");
	} // if (Date.parse(from.value) <= Date.parse(to.value
} // function doDateCheck(from, to)

function veriDate(NomFec) {
	// esta funcion sirve para actualizar el valor de la variable de pantalla (Ej: fecha_tb)
	// en forma "amistosa" (Ej: dd-mmm-aaaa), usando el valor de la variable mysql (Ej: aaaa-mm-dd)
	var x;
	var xdia;
	var xmes;
	var xano;
	var guion;
	var leevar=false;
	var Campo = NomFec.name; // Ej: NomFec => 'fecha_tb'
	var valorfec = NomFec.value;
	if (valorfec) { // analizamos lo que tiene ahora
		if (FormatoFecha(valorfec)=='M') { // tiene año primero (ej: aaaa-mm-dd)
			xano = valorfec.substr(0, 4);
			xmes = valorfec.substr(5, 2);
			xdia = valorfec.substr(8, 2);
		} else { // seguramente tiene formato dd-mmm-aaaa
			// por tanto leemos valor de variable mysql
			leevar=true;
		} // if (guion!='-'
	} // if ($valorfec
	if (leevar) { // jalamos valor de la variable mysql
		var datevar = dateVarName(Campo); // sacamos nombre variable para tabla, quitamos "_tb"
		var valorfec = document.all[datevar].value;
	} // if (leevar
	if (valorfec) { // Ej: datevar => fecha => '2007-04-18'
		xano = valorfec.substr(0, 4);
		xmes = valorfec.substr(5, 2);
		xdia = valorfec.substr(8, 2);
		NomFec.value = xdia + "-" + xmes + "-" + xano;
		x = chkdate(NomFec); // ademas de verificar la fecha, convierte a fecha "amistosa"
		NomFec.select(); // dejamos seleccionada la fecha
	} else {
		x = true;
	} // if (strDate.length>0
	return x;
}
function FormatoFecha(fecha) {
	// para ver si la fecha es formato mysql aaaa-mm-dd ó "amistoso" dd-mmm-aaaa ó normal "aa-mm-aaaa"
	var respuesta;
	if (fecha.length>4) {
		var guion = fecha.substr(4,1);
		if (guion=='-') {
			respuesta = "M"; // mysql
		} else {
			respuesta = "N"; // normal 
		}
	} else {
		respuesta = "0"; // error
	}
	return respuesta;
}


