//	written	by Tan Ling	Wee	on 2 Dec 2001
//	last updated 24 Feb 2003
//	email : fuushikaden@yahoo.com
//	website : www.pengz.com
//	TabSize: 4
//
//	modified by ALQUANTO 30 July 2003 - german language included.
//									  - modified languageLogic with the ISO-2letter-strings
//									  - changes in in showCalendar: defaultLanguage is already set...
//									  - js and html corrected... more xhtml-compliant... simplier css
//	email: popcalendar@alquanto.de
//
//	modified by PinoToy 25 July 2003  - new logic for multiple languages (English, Spanish and ready for more).
//									  - changes in popUpMonth & popDownMonth methods for hidding	popup.
//									  - changes in popDownYear & popDownYear methods for hidding	popup.
//									  - new logic for disabling dates in	the past.
//									  - new method showCalendar, dynamic	configuration of language, enabling	past & position.
//                                    - changes in the styles.
//	email  : pinotoy@yahoo.com

	var language = 'es';	// Default Language: en - english ; es - spanish; de - german
	var enablePast = 1;		// 0 - disabled ; 1 - enabled
	var fixedX = -1;		// x position (-1 if to appear below control)
	var fixedY = -1;		// y position (-1 if to appear below control)

	var startAt = 1;		// 0 - sunday ; 1 - monday
	var showWeekNumber = 0;	// 0 - don't show; 1 - show
	var showToday = 1;		// 0 - don't show; 1 - show
	// directory for images ... e.g. var imgDir="/img/"
	var imgDir = 'pages/img/calendario/';
	var anchoCalendario = 250;
	var dayName = '';
	
	var estiloPosicion = 'posicionCalendario ';

	var idiomas = {
		en : 'Ingles',
		es : 'Castellano',
		de : 'Aleman'
	};
	var gotoString = {
		en : 'Go To Current Month',
		es : 'Ir al Mes Actual',
		de : 'Gehe zu aktuellem Monat'
	};
	var todayString = {
		en : 'Today is',
		es : 'Hoy es',
		de : 'Heute ist'
	};
	var weekString = { 
		en : 'Wk',
		es : 'Sem',
		de : 'KW'
	};
	var scrollLeftMessage = {
		en : 'Click to scroll to previous month. Hold mouse button to scroll automatically.',
		es : 'Presione para pasar al mes anterior. Deje presionado para pasar varios meses.',
		de : 'Klicken um zum vorigen Monat zu gelangen. Gedr\u00EFckt halten, um automatisch weiter zu scrollen.'
	};
	var scrollRightMessage = {
		en : 'Click to scroll to next month. Hold mouse button to scroll automatically.',
		es : 'Presione para pasar al siguiente mes. Deje presionado para pasar varios meses.',
		de : 'Klicken um zum n\u00F6chsten Monat zu gelangen. Gedr\u00EFckt halten, um automatisch weiter zu scrollen.'
	};
	var comboMesMessage = {
		en : 'Click to select a month.',
		es : 'Presione para seleccionar un mes',
		de : 'Klicken um Monat auszuw\u00E4hlen'
	};
	var comboAnioMessage = {
		en : 'Click to select a year.',
		es : 'Presione para seleccionar un a\u00F1o',
		de : 'Klicken um Jahr auszuw\u00E4hlen'
	};
	var comboBorrarMessage = {
	   en : 'Click to delete the prior date.',
	   es : 'Presione para borrar la fecha anterior',
	   de : 'Klicken um das vorhergehende Datum l\u00F6schen'
	};
	var inputDelete = {
	   en : 'Delete',
	   es : 'Borrar',
	   de : 'L\u00F6schen'
	};
	var selectDateMessage = {		// do not replace [date], it will be replaced by date.
		en : 'Select [date] as date.',
		es : 'Seleccione [date] como fecha',
		de : 'W\u00E4hle [date] als Datum.'
	};
	var	monthName = {
		en : new Array('January','February','March','April','May','June','July','August','September','October','November','December'),
		es : new Array('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'),
		de : new Array('Januar','Februar','M?rz','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember')
	};
	var	monthName2 = {
		en : new Array('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'),
		es : new Array('ENE','FEB','MAR','ABR','MAY','JUN','JUL','AGO','SEP','OCT','NOV','DIC'),
		de : new Array('JAN','FEB','MRZ','APR','MAI','JUN','JUL','AUG','SEP','OKT','NOV','DEZ')
	};
	var formatoFecha = {
		en : 'mm/dd/yyyy',
		es : 'dd/mm/yyyy',
		de : 'dd/mm/yyyy'
	};
	var fechaDesde = {
		en : 'Date is invalid.\nSearch start date must be smaller than search end date.', 
		es : 'Fecha no valida. \nLa fecha de inicio de busqueda ha de ser anterior a la de fin de busqueda.',
		de : ''
	};
	var fechaUnicaDesde = {
		en : 'Date is invalid.\nStart date must be smaller than end date.',
		es : 'Fecha no valida. \nLa fecha de inicio ha de ser anterior a la de finalizacion.',
		de : ''
	};
	var fechaHasta = {
		en : 'Date is invalid.\nSearch end date must be greater than search start date.',
		es : 'Fecha no valida. \nLa fecha de fin de busqueda ha de ser posterior a la de inicio de busqueda.',
		de : ''
	};
	var fechaUnicaHasta = {
		en : 'Date is invalid.\nEnd date must be greater than start date.',
		es : 'Fecha no valida. \nLa fecha de finalizacion  ha de ser posterior a la de inicio.',
		de : ''
	};
	var fechaUnica = {
		en : 'Date is invalid.',
		es : 'Fecha no valida.',
		de : ''
	};

	if (startAt==0) {
		dayName = {
			en : new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat'),
			es : new Array('Dom','Lun','Mar','Mie','Jue','Vie','Sab'),
			de : new Array('So','Mo','Di','Mi','Do','Fr','Sa')
		};
	} else {
		dayName = {
			en : new Array('Mon','Tue','Wed','Thu','Fri','Sat','Sun'),
			es : new Array('Lun','Mar','Mie','Jue','Vie','Sab','Dom'),
			de : new Array('Mo','Di','Mi','Do','Fr','Sa','So')
		};
	}

	var crossobj, crossMonthObj, crossYearObj, monthSelected, yearSelected, dateSelected, omonthSelected, oyearSelected, odateSelected, monthConstructed, yearConstructed, intervalID1, intervalID2, timeoutID1, timeoutID2, ctlToPlaceValue, ctlNow, dateFormat, nStartingYear, selDayAction, isPast;
	var visYear  = 0;
	var visMonth = 0;
	var bPageLoaded = false;
	var ie       = document.all;
	var dom      = document.getElementById;
	var ns4      = document.layers;
	var today    = new Date();
	var dateNow  = today.getDate();
	var monthNow = today.getMonth();
	var yearNow  = today.getYear();
	var imgsrc   = new Array('drop1.gif','drop2.gif','left1.gif','left2.gif','right1.gif','right2.gif');
	var img      = new Array();
	var bShow    = false;
	var tipof, comparaf, formulariof;

	/* hides <select> and <applet> objects (for IE only) */
	function hideElement( elmID, overDiv ) {
		if(ie) {
			for(i = 0; i < document.all.tags( elmID ).length; i++) {
				obj = document.all.tags( elmID )[i];
				if(!obj || !obj.offsetParent) continue;
				
				// Find the element's offsetTop and offsetLeft relative to the BODY tag.
				objLeft   = obj.offsetLeft;
				objTop    = obj.offsetTop;
				objParent = obj.offsetParent;

				/*
				while(objParent.tagName.toUpperCase() != 'BODY') {
					objLeft  += objParent.offsetLeft;
					objTop   += objParent.offsetTop;
					objParent = objParent.offsetParent;
				}
				*/
		
				objHeight = obj.offsetHeight;
				objWidth  = obj.offsetWidth;

				if((overDiv.offsetLeft + overDiv.offsetWidth) <= objLeft);
				else if((overDiv.offsetTop + overDiv.offsetHeight) <= objTop);
				/* CHANGE by Charlie Roche for nested TDs*/
				else if(overDiv.offsetTop >= (objTop + objHeight + obj.height));
				/* END CHANGE */
				else if(overDiv.offsetLeft >= (objLeft + objWidth));
				else {
					obj.style.visibility = 'hidden';
				}
			}
		}
	}

	/*
	* unhides <select> and <applet> objects (for IE only)
	*/
	function showElement(elmID) {
		if(ie) {
			for(i = 0; i < document.all.tags( elmID ).length; i++) {
				obj = document.all.tags(elmID)[i];
				if(!obj || !obj.offsetParent) continue;
				obj.style.visibility = '';
			}
		}
	}

	function HolidayRec (d, m, y, desc) {
		this.d = d;
		this.m = m;
		this.y = y;
		this.desc = desc;
	}

	var HolidaysCounter = 0;
	var Holidays = new Array();

	function addHoliday (d, m, y, desc) {
		Holidays[HolidaysCounter++] = new HolidayRec (d, m, y, desc);
	}

	if (dom) {
		for	(i=0;i<imgsrc.length;i++) {
			img[i] = new Image;
			img[i].src = imgDir + imgsrc[i];
		}
		//Aniadido enlace Borrar
		// Esta es la capa del calendario
		// Contiene las tablas :
		//    * popupCalendar -> todo el calendario
		//    * botonera      -> botones superiores
		document.write ('<div id="calendar" class="' + estiloPosicion + '" width="' + anchoCalendario + 'px" onclick="bShow=true">');
		document.write ('  <table id="popupCalendar" >')
		document.write ('	   <tr>')
		document.write ('	     <td class="celda_botonera">');
		document.write ('        <table id="botonera">');
		document.write ('          <tr>');
		document.write ('            <td><span id="caption"></span></td>');
		document.write ('            <td><a href="javascript:hideCalendar()"><img src="'+imgDir+'close.gif" width="15" height="13" border="0" /></a></td>');
		document.write ('          </tr>');
		document.write ('        </table>');
		document.write ('      </td>');
		document.write ('    </tr>');
		document.write ('    <tr>');
		document.write ('      <td><span id="contenido"></span></td>');
		document.write ('    </tr>');
	
		if (showToday == 1) {
			document.write ('    <tr class="barra_estado">');
			document.write ('      <td><span id="pie_calendario"></span></td>');
			document.write ('    </tr>');
		}
			
		document.write ('  </table>');
		// Esta es la capa desplegable de los meses
		document.write ('<div id="comboMes" class="' + estiloPosicion + '"></div>');
		// Esta es la capa desplegable de los anios
		document.write ('<div id="comboAnio" class="' + estiloPosicion + '"></div>');
		// Cerramos #calendar
		document.write ('</div>');
	}

	var   styleAnchor = 'ancla';
	var	styleLightBorder = '';

	function swapImage(srcImg, destImg) {
		if (ie) document.getElementById(srcImg).setAttribute('src',imgDir + destImg);
	}

	function init() {
		if (!ns4)
		{
			if (!ie) yearNow += 1900;
		

//			crossobj=(dom)?document.getElementById('calendar').style : ie? document.calendar : document.calendar;
			crossobj = document.getElementById('calendar').style;
			hideCalendar();

//			crossMonthObj = (dom) ? document.getElementById('comboMes').style : ie ? document.all.comboMes : document.comboMes;
			crossMonthObj = document.getElementById('comboMes').style;
//			crossYearObj = (dom) ? document.getElementById('comboAnio').style : ie ? document.all.comboAnio : document.comboAnio;
			crossYearObj = document.getElementById('comboAnio').style;
			monthConstructed = false;
			yearConstructed = false;

			if (showToday == 1) {
				document.getElementById('pie_calendario').innerHTML = todayString[language] + ' <a onmousemove="window.status=\''+gotoString[language]+'\'" onmouseout="window.status=\'\'" title="'+gotoString[language]+'" href="javascript:monthSelected=monthNow;yearSelected=yearNow;constructCalendar();">' + dayName[language][(today.getDay()-startAt==-1)?6:(today.getDay()-startAt)]+', ' + dateNow + ' ' + monthName[language][monthNow].substring(0,3) + ' ' + yearNow + '</a>';
			}
			
			bordeColorFoco = '#8af';
			bordeColorNormal = '#36f';

			sHTML1 =  '<span id="botonMesAtras"   class="boton_imagen" onmouseover="swapImage(\'changeLeft\',\'left2.gif\');this.style.borderColor=\'' + bordeColorFoco + '\';window.status=\'' + scrollLeftMessage[language] + '\'" onclick="decMonth()" onmouseout="clearInterval(intervalID1);swapImage(\'changeLeft\',\'left1.gif\');this.style.borderColor=\'' + bordeColorNormal + '\';window.status=\'\'" onmousedown="clearTimeout(timeoutID1);timeoutID1=setTimeout(\'StartDecMonth()\',500)" onmouseup="clearTimeout(timeoutID1);clearInterval(intervalID1)">&nbsp<img id="changeLeft" src="' + imgDir + 'left1.gif" width="10" height="11" border="0">&nbsp</span>&#160;';
			sHTML1 += '<span id="botonMesAvanzar" class="boton_imagen" onmouseover="swapImage(\'changeRight\',\'right2.gif\');this.style.borderColor=\'' + bordeColorFoco + '\';window.status=\'' + scrollRightMessage[language] + '\'" onmouseout="clearInterval(intervalID1);swapImage(\'changeRight\',\'right1.gif\');this.style.borderColor=\'' + bordeColorNormal + '\';window.status=\'\'" onclick="incMonth()" onmousedown="clearTimeout(timeoutID1);timeoutID1=setTimeout(\'StartIncMonth()\',500)" onmouseup="clearTimeout(timeoutID1);clearInterval(intervalID1)">&nbsp<img id="changeRight" src="' + imgDir + 'right1.gif" width="10" height="11" border="0">&nbsp</span>&#160;';
			sHTML1 += '<span id="capaMes"         class="boton_imagen" onmouseover="swapImage(\'changeMonth\',\'drop2.gif\');this.style.borderColor=\'' + bordeColorFoco + '\';window.status=\'' + comboMesMessage[language] + '\'" onmouseout="swapImage(\'changeMonth\',\'drop1.gif\');this.style.borderColor=\'' + bordeColorNormal + '\';window.status=\'\'" onclick="popUpMonth()">';
			// Esta es la capa desplegable de los meses
			sHTML1 += '<div id="comboMes"         class="' + estiloPosicion + '"></div>';
			sHTML1 += '</span>&#160;'; // Cierre de capaMes
			// Esta es la capa desplegable de los anios
			sHTML1 += '<span id="capaAnio"        class="boton_imagen" onmouseover="swapImage(\'changeYear\',\'drop2.gif\');this.style.borderColor=\'' + bordeColorFoco + '\';window.status=\'' + comboAnioMessage[language] + '\'" onmouseout="swapImage(\'changeYear\',\'drop1.gif\');this.style.borderColor=\'' + bordeColorNormal + '\';window.status=\'\'" onclick="popUpYear()">';
			sHTML1 += '<div id="comboAnio"        class="' + estiloPosicion + '"></div>';
			sHTML1 += '</span>&#160;';

			sHTML1 += '<span id="spanBorrar"      class="boton_imagen" onmouseover="window.status=\'' + comboBorrarMessage[language] + '\'" onmouseout="window.status=\'\'" onclick="limpiarCampo()">Borrar</span>&#160;';
			
			document.getElementById('caption').innerHTML = sHTML1;

			bPageLoaded=true;
		}
	}

	function hideCalendar() {
		// Posicionamos el calendario fuera de los margenes de la pantalla
		crossobj.top = 0+'px';
		crossobj.left = -500+'px';

		crossobj.visibility = 'hidden';

		if (crossMonthObj != null) crossMonthObj.visibility = 'hidden';
		if (crossYearObj  != null) crossYearObj.visibility = 'hidden';
		showElement('select');
		showElement('APPLET');
	}

	function padZero(num) {
		return (num	< 10) ? '0' + num : num;
	}

	function constructDate(d,m,y) {
		sTmp = dateFormat;
		sTmp = sTmp.replace ('dd','<e>');
		sTmp = sTmp.replace ('d','<d>');
		sTmp = sTmp.replace ('<e>',padZero(d));
		sTmp = sTmp.replace ('<d>',d);
		sTmp = sTmp.replace ('mmmm','<p>');
		sTmp = sTmp.replace ('mmm','<o>');
		sTmp = sTmp.replace ('mm','<n>');
		sTmp = sTmp.replace ('m','<m>');
		sTmp = sTmp.replace ('<m>',m+1);
		sTmp = sTmp.replace ('<n>',padZero(m+1));
		sTmp = sTmp.replace ('<o>',monthName[language][m]);
		sTmp = sTmp.replace ('<p>',monthName2[language][m]);
		sTmp = sTmp.replace ('yyyy',y);
		return sTmp.replace ('yy',padZero(y%100));
	}

	function closeCalendar() {
		
		var fechaseleccionada = constructDate(dateSelected,monthSelected,yearSelected); 
		
		if (validarFecha(fechaseleccionada ,comparaf,tipof,comparaf,formulariof)==1){
		hideCalendar();
		ctlToPlaceValue.value =fechaseleccionada ; 
		}
	}

	/*** Month Pulldown	***/
	function StartDecMonth() {
		intervalID1 = setInterval("decMonth()",80);
	}

	function StartIncMonth() {
		intervalID1 = setInterval("incMonth()",80);
	}

	function incMonth () {
		monthSelected++;
		if (monthSelected > 11) {
			monthSelected = 0;
			yearSelected++;
		}
		constructCalendar();
	}

	function decMonth () {
		monthSelected--;
		if (monthSelected < 0) {
			monthSelected = 11;
			yearSelected--;
		}
		constructCalendar();
	}

	function constructMonth() {
		popDownYear()
		if (!monthConstructed) {
			sHTML = "";
			for (i=0; i<12; i++) {
				sCodigoEventoMes = 'monthConstructed=false;monthSelected=' + i + ';constructCalendar();popDownMonth();event.cancelBubble=true';
				sName = monthName[language][i];
				if (i == monthSelected){
					sName = '<b>' + sName + '</b>';
				}
				sHTML += '<tr>';
					sHTML += '<td id="m' + i + '" class="celda_combo_mes">';
						sHTML += '&#160;<a onclick="' + sCodigoEventoMes + '">' + sName + '</a>&#160;'
					sHTML += '</td>';
				sHTML += '</tr>';
			}

			document.getElementById('comboMes').innerHTML = '<table class="menu_desplegable" cellspacing="0" onmouseover="clearTimeout(timeoutID1)" onmouseout="clearTimeout(timeoutID1);timeoutID1=setTimeout(\'popDownMonth()\',100);event.cancelBubble=true">' + sHTML + '</table>';

			monthConstructed = true;
		}
	}

	function popUpMonth() {
		if (visMonth == 1) {
			popDownMonth();
			visMonth--;
		} else {
			constructMonth();
			//crossMonthObj.visibility = (dom||ie) ? 'visible' : 'show';
			crossMonthObj.visibility = 'visible';
			crossMonthObj.left = parseInt(crossobj.left) + 50;
			crossMonthObj.top =	parseInt(crossobj.top) + 26;
		//	hideElement('SELECT', document.getElementById('comboMes'));
		//	hideElement('APPLET', document.getElementById('comboMes'));
			visMonth++;
		}
	}

	function popDownMonth() {
		crossMonthObj.visibility = 'hidden';
		visMonth = 0;
	}

	/*** Year Pulldown ***/
	function incYear() {
		for	(i=0; i<7; i++) {
			newYear	= (i + nStartingYear) + 1;
			if (newYear == yearSelected)
				txtYear = '<span class="anio negrita">' + newYear + '</span>';
			else
				txtYear = '<span class="anio">' + newYear + '</span>';
			document.getElementById('y'+i).innerHTML = txtYear;
		}
		nStartingYear++;
		bShow=true;
	}

	function decYear() {
		for	(i=0; i<7; i++) {
			newYear = (i + nStartingYear) - 1;
			if (newYear == yearSelected)
				txtYear = '<span class="anio negrita">' + newYear + '</span>';
			else
				txtYear = '<span class="anio">' + newYear + '</span>';
			document.getElementById('y'+i).innerHTML = txtYear;
		}
		nStartingYear--;
		bShow=true;
	}

	function comboAnio(nYear) {
		yearSelected = parseInt(nYear + nStartingYear);
		yearConstructed = false;
		constructCalendar();
		popDownYear();
	}

	function constructYear() {
		popDownMonth();
		sHTML = '';

		if (!yearConstructed) {
			sHTML = '<tr>';
				sHTML += '<td class="menu_desplegable_control">';
					sHTML += '<a onmouseout="clearInterval(intervalID1);" onmousedown="clearInterval(intervalID1);intervalID1=setInterval(\'decYear()\',30)" onmouseup="clearInterval(intervalID1)">-</a>';
				sHTML += '</td>';
			sHTML += '</tr>';

			j = 0;
			nStartingYear =	yearSelected - 3;
			for ( i = (yearSelected-3); i <= (yearSelected+3); i++ ) {
				sName = i;
				if (i == yearSelected) sName = '<span class="anio negrita">' + sName + '</span>';
				sHTML += '<tr>';
					sHTML += '<td class="celda_combo_anio">';
						sHTML += '<a onclick="comboAnio('+j+');event.cancelBubble=true" id="y' + j + '"><span class="anio">' + sName + '</span></a>';
					sHTML += '</td>';
				sHTML += '</tr>';
				j++;
			}

			sHTML += '<tr>';
				sHTML += '<td class="menu_desplegable_control">';
					sHTML += '<a onmouseout="clearInterval(intervalID2);" onmousedown="clearInterval(intervalID2);intervalID2=setInterval(\'incYear()\',30)" onmouseup="clearInterval(intervalID2)">+</a>';
				sHTML += '</td>';
			sHTML += '</tr>';

			document.getElementById('comboAnio').innerHTML = '<table class="menu_desplegable" cellspacing="0" onmouseover="clearTimeout(timeoutID2)" onmouseout="clearTimeout(timeoutID2);timeoutID2=setTimeout(\'popDownYear()\',100)">' + sHTML + '</table>';

			yearConstructed = true;
		}
	}

	function popDownYear() {
		clearInterval(intervalID1);
		clearTimeout(timeoutID1);
		clearInterval(intervalID2);
		clearTimeout(timeoutID2);
		crossYearObj.visibility= 'hidden';
		visYear = 0;
	}

	function popUpYear() {
		var leftOffset
		if (visYear==1) {
			popDownYear();
			visYear--;
		} else {
			constructYear();
			crossYearObj.visibility	= (dom||ie) ? 'visible' : 'show';
			leftOffset = parseInt(crossobj.left) + document.getElementById('capaAnio').offsetLeft;
			if (ie) leftOffset += 6;
			crossYearObj.left = leftOffset;
			crossYearObj.top = parseInt(crossobj.top) + 26;
			visYear++;
		}
	}

	/*** calendar ***/
	function WeekNbr(n) {
		// Algorithm used:
		// From Klaus Tondering's Calendar document (The Authority/Guru)
		// http://www.tondering.dk/claus/calendar.html
		// a = (14-month) / 12
		// y = year + 4800 - a
		// m = month + 12a - 3
		// J = day + (153m + 2) / 5 + 365y + y / 4 - y / 100 + y / 400 - 32045
		// d4 = (J + 31741 - (J mod 7)) mod 146097 mod 36524 mod 1461
		// L = d4 / 1460
		// d1 = ((d4 - L) mod 365) + L
		// WeekNumber = d1 / 7 + 1

		year = n.getFullYear();
		month = n.getMonth() + 1;
		if (startAt == 0) {
			day = n.getDate() + 1;
		} else {
			day = n.getDate();
		}

		a = Math.floor((14-month) / 12);
		y = year + 4800 - a;
		m = month + 12 * a - 3;
		b = Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400);
		J = day + Math.floor((153 * m + 2) / 5) + 365 * y + b - 32045;
		d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461;
		L = Math.floor(d4 / 1460);
		d1 = ((d4 - L) % 365) + L;
		week = Math.floor(d1/7) + 1;

		return week;
	}

	function constructCalendar () {
		var aNumDays = Array (31,0,31,30,31,30,31,31,30,31,30,31);
		var dateMessage;
		var startDate = new Date (yearSelected,monthSelected,1);
		var endDate;

		if (monthSelected==1) {
			endDate = new Date (yearSelected,monthSelected+1,1);
			endDate = new Date (endDate - (24*60*60*1000));
			numDaysInMonth = endDate.getDate();
		} else {
			numDaysInMonth = aNumDays[monthSelected];
		}

		datePointer = 0;
		dayPointer = startDate.getDay() - startAt;
		
		if (dayPointer<0) dayPointer = 6;

		sHTML = '<table id="tabla_calendario"><tr class="nombre_dia">';

		// Numero de Semana
		if	(showWeekNumber == 1) {
			sHTML += '<td class="celda_dia"><span class="num_semana">' + weekString[language] + '</span></td>';
			sHTML += '<td class="celda_separadora" width="1" rowspan="7"><img src="'+imgDir+'divider.gif"></td>';
		}

		// Nombre de los dias de la semana.
		for	(i = 0; i<7; i++) {
			sHTML += '<td class="celda_dia"><span class="dia_semana">' + dayName[language][i] + '</span></td>';
		}

		// Pintamos los dias del calendario
		sHTML += '</tr><tr>';

		// Mostramos el numero de la semana.
		if	(showWeekNumber == 1) {
		}
		diaSemana = 0;

		for	( var i=1; i<=dayPointer;i++ ) {
			diaSemana++;
			sHTML += '<td>&#160;</td>';
		}
	
		for	( datePointer=1; datePointer <= numDaysInMonth; datePointer++ ) {
			dayPointer++;
			// Abrimos la celda para cada dia.
			sHTML += '<td class="celda_dia">';
			sStyle=styleAnchor;
			if ((datePointer == odateSelected) && (monthSelected == omonthSelected) && (yearSelected == oyearSelected))
			{ sStyle+=styleLightBorder }

			sHint = '';
			for (k = 0;k < HolidaysCounter; k++) {
				if ((parseInt(Holidays[k].d) == datePointer)&&(parseInt(Holidays[k].m) == (monthSelected+1))) {
					if ((parseInt(Holidays[k].y)==0)||((parseInt(Holidays[k].y)==yearSelected)&&(parseInt(Holidays[k].y)!=0))) {
						sStyle+= 'vacaciones';
						sHint += sHint=="" ? Holidays[k].desc : "\n"+Holidays[k].desc;
					}
				}
			}

			sHint = sHint.replace('/\"/g', '&quot;');

			dateMessage = 'onmousemove="window.status=\''+selectDateMessage[language].replace('[date]',constructDate(datePointer,monthSelected,yearSelected))+'\'" onmouseout="window.status=\'\'" ';


			//////////////////////////////////////////////
			//////////  Modifications PinoToy  //////////
			//////////////////////////////////////////////
			if (enablePast == 0 && ((yearSelected < yearNow) || (monthSelected < monthNow) && (yearSelected == yearNow) || (datePointer < dateNow) && (monthSelected == monthNow) && (yearSelected == yearNow))) {
				selDayAction = '';
				isPast = 1;
			} else {
				selDayAction = 'href="javascript:dateSelected=' + datePointer + ';closeCalendar();"';
				isPast = 0;
			}

			if ((datePointer == dateNow) && (monthSelected == monthNow) && (yearSelected == yearNow)) {	///// HOY
					sEstiloDia = "hoy";
			} else if (dayPointer % 7 == (startAt * -1)+1) {									///// SI ES DOMINGO
				if (isPast==1)
	 				sEstiloDia = "laboral";
				else
					sEstiloDia = "domingo";
			} else if ((dayPointer % 7 == (startAt * -1)+7 && startAt==1) || (dayPointer % 7 == startAt && startAt==0)) {	///// SI ES SABADO
				if (isPast==1)
					sEstiloDia = "laboral";
				else
					sEstiloDia = "sabado";
			} else {																			///// CUALQUIER OTRO DIA
				if (isPast==1)
					sEstiloDia = "festivo";
				else
					sEstiloDia = "laboral";
			}
			sHTML += "<a " + dateMessage + " title=\"" + sHint + "\" class=\"" + sStyle + "_" + sEstiloDia + "\" " + selDayAction + "><span class=\"" + sEstiloDia + "\">" + datePointer + "</span></a>";

			// Cerramos la celda para cada dia.
			sHTML += '</td>';
			// Si cambiamos de semana, cambiamos de tr de la tabla.
			if ((dayPointer+startAt) % 7 == startAt) {
				sHTML += '</tr><tr>';
				diaSemana = 1;
				if ((showWeekNumber == 1) && (datePointer < numDaysInMonth)) {
					sHTML += '<td class="celda_dia">' + (WeekNbr(new Date(yearSelected,monthSelected,datePointer+1))) + '&#160;</td>';
				}
			} else diaSemana++;
		}
		
		// Al salir, cerramos la tabla
		sHTML += '</table>';

		// Guardamos el codigo HTML generado en cada elemento contenedor del calendario
		document.getElementById('contenido').innerHTML = sHTML
		document.getElementById('capaMes').innerHTML = '&#160;' + monthName[language][monthSelected] + '&#160;<img id="changeMonth" src="'+imgDir+'drop1.gif" width="12" height="10" border="0">'
		document.getElementById('capaAnio').innerHTML = '&#160;' + yearSelected	+ '&#160;<img id="changeYear" src="'+imgDir+'drop1.gif" width="12" height="10" border="0">';
		document.getElementById('spanBorrar').innerHTML = '&#160;' + inputDelete[language] + '&#160;';
	}
	
	var windowx,windowy;
	

	if (!bPageLoaded) {
		init();
	}
	
	/**
	 *  Capturamos el evento de ONMOUSECLICK del servidor.
	 */
	// If NS -- that is, !IE -- then set up for mouse capture
	if (!ie) {
		 document.captureEvents(Event.MOUSEDOWN);
		 document.onmousedown = getMouseXY;
	}

	/**
	 *  Calcula la posicion relativa a la pagina en FF
	 */
	function getMouseXY (Event) {
		if (ie) {
			windowx = e.clientX + document.documentElement.scrollLeft;
			windowy = e.clientY + document.documentElement.scrollTop;
		} else {
			windowx = Event.pageX;
			windowy = Event.pageY;
		}
	}
	
   function Calendario(ctl,formulario,ctl2,tipo,campoCompara,format,lang,posx,posy) {
		
		if ((lang!=null && lang!='') 
   		         && (typeof(idiomas[lang])== 'undefined')) {
   		     lang = language;
		}			

		if ((format == null || format == '')
				&& (typeof(formatoFecha[lang])!='undefined')) {
				format = formatoFecha[lang];
		}

		if (campoCompara != ""){
			compara = eval("document.forms['"+formulario+"']."+campoCompara+".value");
		} else {
			compara = "";
		};

		tipof = tipo;
		formulariof = formulario;
		comparaf = compara;

		controlCal = document.getElementById(ctl);
		
		// Calculando la situacion HORIZONTAL
		if (posx == 0) {
			if (ie) { 
				windowx = obtenerPosX(event);
			}
			// Calculamos la posicion X segun el evento clic, 
			//          el ancho de la capa calendario y 
			//          el ancho del control que recibio el clic.
			windowx = windowx - anchoCalendario - ((controlCal)?((ie)?controlCal.width:12):12)
		} else {
			if (ie) {
				tamx = window.innerWidth;
			} else {
				tamx = document.body.offsetWidth;
			}	
			if ( posx == 0 ) {
				posx = ( tamx * 220 / 1152 );
			} 

			//Posiciono el calendario segun la resolucion
			windowx = posx;
		}
		
		// Calculando la situacion VERTICAL
		if (posy == 0) {
			if (ie) { 
				windowy = obtenerPosY(event);
			}
		} else {
			if (ie) {
				tamy = window.innerHeight;    
			} else {
				tamy = document.body.offsetHeight;
			}	
			if ( posy == 0 ) {
				posy = ( tamx * anchoCalendario / 1152 );
			}
			
			//Posiciono el calendario segun la resolucion
			windowy = posy;
		}
		//alert(windowx + " x " + windowy);
		showCalendar(ctl,ctl2,format,lang,1,windowx,windowy);
}

	function showCalendar(ctl, ctl2, format, lang, past, fx, fy) {

		if (lang != null && lang != '') language = lang;
		if (past != null) enablePast = past;
		else enablePast = 0;
		
		if (fx != null) fixedX = fx;
		else fixedX = -1;
		if (fy != null) fixedY = fy;
		else fixedY = -1; 
		
		if (showToday == 1) {
			document.getElementById('pie_calendario').innerHTML = todayString[language] + ' <a onmousemove="window.status=\''+gotoString[language]+'\'" onmouseout="window.status=\'\'" title="'+gotoString[language]+'" href="javascript:monthSelected=monthNow;yearSelected=yearNow;constructCalendar();">'+dayName[language][(today.getDay()-startAt==-1)?6:(today.getDay()-startAt)]+', ' + dateNow + ' ' + monthName[language][monthNow].substring(0,3) + ' ' + yearNow + '</a>';
		} 

		popUpCalendar(ctl, ctl2, format);
	}

	function popUpCalendar(ctl, ctl2, format) {
		var leftpos = 0;
		var toppos  = 0;

		if (bPageLoaded) {
			if (crossobj.visibility == 'hidden') {
				ctlToPlaceValue = ctl2;
				dateFormat = format;
				formatChar = ' ';
				aFormat = dateFormat.split(formatChar);
				if (aFormat.length < 3) {
					formatChar = '/';
					aFormat = dateFormat.split(formatChar);
					if (aFormat.length < 3) {
						formatChar = '.';
						aFormat = dateFormat.split(formatChar);
						if (aFormat.length < 3) {
							formatChar = '-';
							aFormat = dateFormat.split(formatChar);
							if (aFormat.length < 3) {
								formatChar = '';					// invalid date format

							}
						}
					}
				}

				tokensChanged = 0;
				if (formatChar != "") {
					aData =	ctl2.value.split(formatChar);			// use user's date

					for (i=0; i<3; i++) {
						if ((aFormat[i] == "d") || (aFormat[i] == "dd")) {
							dateSelected = parseInt(aData[i], 10);
							tokensChanged++;
						} else if ((aFormat[i] == "m") || (aFormat[i] == "mm")) {
							monthSelected = parseInt(aData[i], 10) - 1;
							tokensChanged++;
						} else if (aFormat[i] == "yyyy") {
							yearSelected = parseInt(aData[i], 10);
							tokensChanged++;
						} else if (aFormat[i] == "mmm") {
							for (j=0; j<12; j++) {
								if (aData[i] == monthName[language][j]) {
									monthSelected=j;
									tokensChanged++;
								}
							}
						} else if (aFormat[i] == "mmmm") {
							for (j=0; j<12; j++) {
								if (aData[i] == monthName2[language][j]) {
									monthSelected = j;
									tokensChanged++;
								}
							}
						}
					}
				}

				if ((tokensChanged != 3) || isNaN(dateSelected) || isNaN(monthSelected) || isNaN(yearSelected)) {
					dateSelected  = dateNow;
					monthSelected = monthNow;
					yearSelected  = yearNow;
				}

				odateSelected  = dateSelected;
				omonthSelected = monthSelected;
				oyearSelected  = yearSelected;
				/*
				aTag = ctl;
				do {
					aTag     = aTag.offsetParent;
					leftpos += aTag.offsetLeft;
					toppos  += aTag.offsetTop;
				} while (aTag.tagName != 'BODY');
				*/
				
				posicionX = (fixedX == -1) ? ctl.offsetLeft + leftpos : fixedX;
				posicionY = (fixedY == -1) ? ctl.offsetTop + toppos + ctl.offsetHeight + 2 : fixedY;

				crossobj.left = Math.round(posicionX, 0) + 'px';
				crossobj.top = Math.round(posicionY, 0) + 'px';

				constructCalendar (1, monthSelected, yearSelected);
				
				//crossobj.visibility = (dom||ie) ? "visible" : "show";
				crossobj.visibility = 'visible';

				bShow = true;
				
			} else {
				// Ocultamos el calendario si esta cargado y queremos mostrar otro calendario.
				hideCalendar();
				if (ctlNow!=ctl) popUpCalendar(ctl, ctl2, format);
			}
			ctlNow = ctl;
		}
	}
	
	/* Funciones para posicionar el calendario */
	function obtenerPosX(e) {
		if (ie) {
			return e.clientX + document.documentElement.scrollLeft;
		} else {
			return windowx;
		}
	}

	function obtenerPosY(e) {
		if (ie) { 
			return e.clientY + document.documentElement.scrollTop;
		} else {
			return windowy; 
		}
	}	

	/* Funcion para limpiar el contenido del campo */
	function limpiarCampo() {
  		ctlToPlaceValue.value="";
		hideCalendar();
	}
	
	
	/* Funcion que compara dos fechas segun un formato determinado */
	
	function comparafechas (f1,f2){
		
		var pidia = dateFormat.indexOf('d',0);
		var pfdia= dateFormat.lastIndexOf('d',dateFormat.length)+1;
		var pimes = dateFormat.indexOf('m',0);
		var pfmes= dateFormat.lastIndexOf('m',dateFormat.length)+1;
		var pianio = dateFormat.indexOf('y',0);
		var pfanio= dateFormat.lastIndexOf('y',dateFormat.length)+1;
	
		var dateFI = new Date(f1.substring(pianio,pfanio),
                            	f1.substring(pimes,pfmes)-1,
                            	f1.substring(pidia,pfdia));



		var dateFF = new Date(f2.substring(pianio,pfanio),
                            	f2.substring(pimes,pfmes)-1,
                            	f2.substring(pidia,pfdia));

		if (dateFI <= dateFF)
			return 1;
		else return 0;
	}
	


/* Funcion que valida una fecha comparandola con otra */
	
   function validarFecha(fechaNueva,fechaCompara,tipo,formulario) {	
	   var comparacion = 1;	
	   switch (tipo) {
	   	case 'desde':
			if (fechaCompara != "") {
				if ((comparacion = comparafechas (fechaNueva, fechaCompara))==0) {
					alert (fechaDesde[language]);
				}
			}
			break;
	  	case 'unica_desde':
			if (fechaCompara != "")	{
				if ((comparacion = comparafechas (fechaNueva, fechaCompara))==0) {
					alert (fechaUnicaDesde[language]);
				}
			}	
			break;
		case 'hasta':
			if ((comparacion = comparafechas(fechaCompara, fechaNueva)) ==0) {
				alert (fechaHasta[language]);
		  		}
			break;		
		case 'unica_hasta':
			if ((comparacion = comparafechas(fechaCompara, fechaNueva)) ==0) {
					alert (fechaUnicaHasta[language]);
		  		}
			break;
	
		case 'unica':
			if ((comparacion = comparafechas(fechaCompara, fechaNueva)) ==0) {
				  alert (fechaUnica[language]);
		   		}
		 	break;
	   }
	
		return comparacion;
	}