//	Last updated 10 June 2009
//	Modified by Andrés Murman y Candelaria Montes de Oca

//You can edit these variables
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; // Muestra el numero de la semana. 0 - no muestra; 1 - sí muestra.
var showToday = 1; // Muestra el día actual al pie del calendario. 0 - no muestra; 1 - sí muestra.
var imgDir = "./img/"; // directory for images ... e.g. var imgDir="/img/"
var todayString = "";
var monthName =	new Array("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");

//Don't Edit these variables
var crossobj, crossMonthObj, crossYearObj, monthSelected, yearSelected, dateSelected, omonthSelected, oyearSelected, odateSelected, monthConstructed, yearConstructed, intervalID1, intervalID2, timeoutID1, timeoutID2, ctlToPlaceValue, ctlNow, dateFormat, nStartingYear, day, month, year;
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 img	= new Array();
var bShow = false;

if (dom){
	document.write ("<div onclick='bShow=true' id='calendar'style='z-index:+999;position:absolute;visibility:hidden;'>");
	document.write ("<table class='table-calendar' width="+((showWeekNumber==1)?250:210)+" >");
	document.write ("	<tr>");
	document.write ("		<td width='"+((showWeekNumber==1)?248:218)+"' class='month'>" + "<a href=\"javascript:void(0);\" onclick=\"javascript:hideCalendar();\" class='close'><img src='"  + imgDir + "calendar_close.png' border=0 align=middle></a>");
	document.write ("			<span id='caption'></span></td>");
	document.write ("		</td>");
	document.write ("	</tr><tr>");
	document.write ("		<td class='number'>");
	document.write ("			<span id='content'></span>");
	document.write ("		</td>");
	document.write ("	</tr>");
	if (showToday==1) {
		document.write ("<tr><td class='date'><span id='lblToday'></span></td></tr>")
	}
	document.write ("</table></div>");
	//dropdown 
	document.write ("<div id='selectMonth' class='select'></div>");
	document.write ("<div id='selectYear' class='select'></div>");
}

if (startAt == 0){
	dayName = new Array	("Dom","Lun","Mar","Mie","Jue","Vie","Sab");
} else {
	dayName = new Array	("Lun","Mar","Mie","Jue","Vie","Sab","Dom");
}

document.onkeypress = function hidecal1 () {
	if (event.keyCode==27)
		hideCalendar();
}

document.onclick = function hidecal2 () { 		
	if (!bShow)
		hideCalendar();
	bShow = false;
}

if(ie) {
	init();
} else {
	window.onload=init;
}

function loadLanguage(i) {
  	if (i == 'en') { // paso a ingles
		monthName =	new Array("January","February","March","April","May","June","July","August","September","October","November","December");	
		if (startAt==0) {
			dayName = new Array	("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
		} else {
			dayName = new Array	("Mon","Tue","Wed","Thu","Fri","Sat","Sun");
		}	
		todayString = "Today is ";	
	}  
	if (i == 'po') { // paso a portugues  
		monthName =	new Array("Janeiro","Fevereiro","Marzo","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");
 		if (startAt==0) {
			dayName = new Array	("Dom","Pri","Seg","Ter","Qua","Qui","Sab");
		} else {
			dayName = new Array	("Pri","Seg","Ter","Qua","Qui","Sab","Dom");
		}	
		todayString = "Hoje ? "
	}
}

// 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 != null && 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 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.all.calendar : document.calendar
		hideCalendar()
		crossMonthObj=(dom)?document.getElementById("selectMonth").style : ie? document.all.selectMonth	: document.selectMonth
		crossYearObj=(dom)?document.getElementById("selectYear").style : ie? document.all.selectYear : document.selectYear
		monthConstructed=false;
		yearConstructed=false;
		if (showToday==1)
		{
			document.getElementById("lblToday").innerHTML = todayString + " <a class='date' href=\"javascript:void(0);\" onclick='javascript:dateSelected=dateNow;monthSelected=monthNow;yearSelected=yearNow;closeCalendar();'>"+dayName[(today.getDay()-startAt==-1)?6:(today.getDay()-startAt)]+", " + dateNow + " " + monthName[monthNow].substring(0,3) + " " + yearNow + "</a>"
		}
		//meses - flecha
		sHTML1="<span id='spanMonth' onclick='popUpMonth()'></span>&nbsp;"
		sHTML1+="<span id='spanYear'  onclick='popUpYear()'></span>&nbsp;"
		document.getElementById("caption").innerHTML  =	sHTML1
		bPageLoaded=true
	}
}

function hideCalendar()	{
	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 ("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[m])
	return sTmp.replace ("yyyy",y)
}

function closeCalendar() {
	var sTmp;
	hideCalendar();
	ctlToPlaceValue.value =	constructDate(dateSelected,monthSelected,yearSelected);
	ctlToPlaceValue.focus();
}


// 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++) {
			sName =	monthName[i];
			if (i == monthSelected) {
				sName =	"<B>" +	sName +	"</B>";
			}
			sHTML += "<tr><td id='m" + i + "' onmouseover='this.className=\"dropSelect\"' onmouseout='this.className=\"\"' style='cursor:pointer' onclick='monthConstructed=false;monthSelected=" + i + ";constructCalendar();popDownMonth();event.cancelBubble=true'>&nbsp;" + sName + "&nbsp;</td></tr>"
		}
		//style meses
		document.getElementById("selectMonth").innerHTML = "<table width=70	class='table-drop' cellspacing=0 onmouseover='clearTimeout(timeoutID1)'	onmouseout='clearTimeout(timeoutID1);timeoutID1=setTimeout(\"popDownMonth()\",100);event.cancelBubble=true'>" +	sHTML +	"</table>";
		monthConstructed=true;
	}
}


function popUpMonth() {
	constructMonth();
	crossMonthObj.visibility = (dom||ie)? "visible"	: "show";
	crossMonthObj.left = parseInt(crossobj.left) + 9 + "px";
	crossMonthObj.top =	parseInt(crossobj.top) + 34 + "px";
	hideElement( 'SELECT', document.getElementById("selectMonth"));
	hideElement( 'APPLET', document.getElementById("selectMonth"));	
}

function popDownMonth()	{
	crossMonthObj.visibility= "hidden";
}

// Year Pulldown

function incYear() {
	for	(i=0; i<7; i++) {
		newYear	= (i+nStartingYear) + 1;
		if (newYear==yearSelected){
			txtYear = "&nbsp;<B>" + newYear + "</B>&nbsp;"
		} else {
			txtYear = "&nbsp;" + newYear + "&nbsp;";
		}
		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 = "&nbsp;<B>" + newYear + "</B>&nbsp;"
		} else {
			txtYear = "&nbsp;" + newYear + "&nbsp;";
		}
		document.getElementById("y"+i).innerHTML = txtYear;
	}
	nStartingYear --;
	bShow=true;
}

function selectYear(nYear) {
	yearSelected=parseInt(nYear+nStartingYear);
	yearConstructed=false;
	constructCalendar();
	popDownYear();
}


function constructYear() {
	popDownMonth();
	sHTML =	"";
	if (!yearConstructed) {
		sHTML =	"<tr><td align='center'	onmouseover='this.className=\"dropSelect\"' onmouseout='clearInterval(intervalID1);this.className=\"\"' style='cursor:pointer'	onmousedown='clearInterval(intervalID1);intervalID1=setInterval(\"decYear()\",30)' onmouseup='clearInterval(intervalID1)'>-</td></tr>";
		j = 0;
		nStartingYear =	yearSelected - 3;
		for	(i=(yearSelected-3); i<=(yearSelected+3); i++) {
			sName =	i;
			if (i == yearSelected) {
				sName =	"<B>" +	sName +	"</B>";
			}
			sHTML += "<tr><td id='y" + j + "' onmouseover='this.className=\"dropSelect\"' onmouseout='this.className=\"\"' style='cursor:pointer' onclick='selectYear("+j+");event.cancelBubble=true'>&nbsp;" + sName + "&nbsp;</td></tr>";
			j ++;
		}
		//dropdown año
		sHTML += "<tr><td align='center' onmouseover='this.className=\"dropSelect\"' onmouseout='clearInterval(intervalID2);this.className=\"\"' style='cursor:pointer' onmousedown='clearInterval(intervalID2);intervalID2=setInterval(\"incYear()\",30)'	onmouseup='clearInterval(intervalID2)'>+</td></tr>";
		document.getElementById("selectYear").innerHTML	= "<table width=44 class='table-drop' onmouseover='clearTimeout(timeoutID2)' onmouseout='clearTimeout(timeoutID2);timeoutID2=setTimeout(\"popDownYear()\",100)' cellspacing=0>" + sHTML + "</table>";
		yearConstructed	= true;
	}
}

function popDownYear() {
	clearInterval(intervalID1);
	clearTimeout(timeoutID1);
	clearInterval(intervalID2);
	clearTimeout(timeoutID2);
	crossYearObj.visibility= "hidden";

}

function popUpYear() {
	var leftOffset;
	constructYear();
	crossYearObj.visibility	= (dom||ie)? "visible" : "show";
	leftOffset = parseInt(crossobj.left) + document.getElementById("spanYear").offsetLeft;
	if (ie)
		leftOffset += 6;
	crossYearObj.left =	leftOffset + "px";
	crossYearObj.top = parseInt(crossobj.top) + 34 + "px";
}


function WeekNbr(n) {
	// Algorithm used:
	// From Klaus Tondering's Calendar document (The Authority/Guru)
	// hhtp://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 startDate =	new Date (yearSelected,monthSelected,1);
	var endDate;
	var sClass = '';
	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;
		//style numeros
	sHTML =	'<table border="0"><tr>';
	if (showWeekNumber==1) 
		sHTML += "<td width=22><b>wk</b></td><td width=1 rowspan=7 style='padding:0px'></td>";
	for (i=0; i<7; i++) {
		sHTML += "<td width='22' align='right'><B>"+ dayName[i]+"</B></td>";
	}
	sHTML +="</tr><tr>";
	if (showWeekNumber==1)
		sHTML += "<td align=right>" + WeekNbr(startDate) + "&nbsp;</td>";
	for	( var i=1; i<=dayPointer;i++ ) {
		sHTML += "<td>&nbsp;</td>";
	}
	for (datePointer=1; datePointer <= numDaysInMonth; datePointer++ ) {
		dayPointer++;
		sHTML += "<td align=right>";
		sClass = '';
		if ((datePointer == odateSelected) && (monthSelected == omonthSelected) && (yearSelected == oyearSelected)) {
			sClass = "class='selectedDay'";
		}
		var regexp= /\"/g;
		if ((datePointer==dateNow)&&(monthSelected==monthNow)&&(yearSelected==yearNow)) {
			sHTML += "<b><a " + sClass + " href=\"javascript:void(0);\" onclick='javascript:dateSelected="+datePointer+";closeCalendar();'><span onmouseover=this.style.fontWeight='bold'; onmouseout=this.style.fontWeight='normal' class='dateselect'>&nbsp;" + datePointer + "</span>&nbsp;</a></b>"
		} else if (dayPointer % 7 == (startAt * -1)+1) {
			sHTML += "<a " + sClass + " href=\"javascript:void(0);\" onclick='javascript:dateSelected="+datePointer + ";closeCalendar();'>&nbsp;<span onmouseover=this.style.fontWeight='bold'; onmouseout=this.style.fontWeight='normal' style='color:#909090'>" + datePointer + "</span>&nbsp;</a>"
		} else {
			sHTML += "<a " + sClass + " href=\"javascript:void(0);\" onclick='javascript:dateSelected="+datePointer + ";closeCalendar();'>&nbsp;<span onmouseover=this.style.fontWeight='bold'; onmouseout=this.style.fontWeight='normal' >" + datePointer + "&nbsp;</span></a>"
		}
		sHTML += "";
		if ((dayPointer+startAt) % 7 == startAt) {
			sHTML += "</tr><tr>";
			if ((showWeekNumber==1) && (datePointer < numDaysInMonth)) {
				sHTML += "<td align=right>" + (WeekNbr(new Date(yearSelected,monthSelected,datePointer+1))) + "&nbsp;</td>"
			}
		}
	}
	document.getElementById("content").innerHTML   = sHTML;
	document.getElementById("spanMonth").innerHTML = "&nbsp;" + monthName[monthSelected] + "&nbsp;<IMG id='changeMonth' SRC='./img/drop2.gif' WIDTH='8' HEIGHT='8' BORDER=0>";
	document.getElementById("spanYear").innerHTML =	"&nbsp;" + yearSelected	+ "&nbsp;<IMG id='changeYear' SRC='./img/drop2.gif' WIDTH='8' HEIGHT='8' BORDER=0>";
}



function popUpCalendar(ctlId, format) {
	var ctl = document.getElementById(ctlId);
	var leftpos=0;
	var toppos=0;
	imgDir = './img';
	if (bPageLoaded) {
		if ( crossobj.visibility == "hidden" ) {
			ctlToPlaceValue	= ctl;
			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) {
							// invalid date	format
							formatChar="";
						}
					}
				}
			}
			tokensChanged =	0;
			if ( formatChar	!= "" ) {
				// use user's date
				aData =	ctl.value.split(formatChar);
				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[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.offsetParent != null && aTag.tagName!="BODY");
			crossobj.left =	fixedX == -1 ? ctl.offsetLeft + leftpos + "px": fixedX;
			crossobj.top = fixedY == -1 ? ctl.offsetTop + toppos + ctl.clientHeight + 4 + "px": fixedY;
			constructCalendar (1, monthSelected, yearSelected);
			crossobj.visibility=(dom||ie) ? "visible" : "show";
			hideElement('SELECT',document.getElementById("calendar"));
			hideElement('APPLET',document.getElementById("calendar"));
			bShow = true;
		}
		else {
			hideCalendar();
			if (ctlNow!=ctl) {
				popUpCalendar(ctl, format);
			}
		}
		ctlNow = ctl;
	}
}