var Prev_Day;
var Prev_Month;
var Prev_Year;
var Selected_Month;
var Selected_Year;
var Current_Date = new Date();
var Current_Month = Current_Date.getMonth();
var Days_in_Month = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
//var Month_Label = new Array('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Augusto', 'Septiembre', 'Octubre', 'Noviembre', 'Deciembre');
//var Day_Label = new Array('Lun','Mar','Mier','Jue','Vie','Sab','Dom');
//var firstDayOfWeek = 0;
var Current_Year = Current_Date.getFullYear();
var Today = Current_Date.getDate();

var NormalDayClassName   = "calChooser";
var DisabledDayClassName = "calChooserExpired";
var SpecialDayClassName  = "calChooserSpecial";

//setable params
var ExpiredDayClass    = NormalDayClassName;
var DisableExpiredDays = false;
var StartYear          = Current_Year - 50;
var EndYear            = Current_Year + 50;

//the component that this chooser is working for
var Date_Component;

var NS6 = new String("Netscape6");
var NS  = new String("Netscape");
var IE  = new String("Microsoft");

var browserVendor = NS;

if (document.all) { //IE
	browserVendor = IE;
} else if (document.getElementById) { //Netscape 6
	browserVendor= NS6;
}

function isInteger(s) {
  var i;
  for (i = 0; i < s.length; i++) {
    // Check that current character is number.
    var c = s.charAt(i);
    if (((c < "0") || (c > "9")))
       return false;
  }

  // All characters are numbers.
  return true;
}

function daysInFebruary (year) {
  // February has 29 days in any year evenly divisible by four,
  // EXCEPT for centurial years which are not also divisible by 400.
  return (((year % 4 == 0) && ((! (year % 100 == 0)) || (year % 400 == 0)))? 29: 28);
}

function validDate(theForm, compName) {
  dayComp   = eval(theForm + compName + 'day');
  alert(dayComp);
  monthComp = eval(theForm + compName + 'month');
  alert(monthComp);
  yearComp  = eval(theForm + compName + 'year');
  alert(yearComp);

  if (! isInteger(monthComp.value)) {
    alert("Please enter a valid month");
    monthComp.focus();
    return false;
  }
  
  if (! isInteger(dayComp.value)) {
    alert("Please enter a valid day");
    dayComp.focus();
    return false;
  }
  
  if (! isInteger(yearComp.value)) {
    alert("Please enter a valid year");
    yearComp.focus();
    return false;
  }
  
  month = parseInt(monthComp.value) ;
  day   = parseInt(dayComp.value);
  year  = parseInt(yearComp.value);
  
  if (monthComp.value.length < 1 || month < 1 || month > 12) {
    alert("Please enter a valid month");
    monthComp.focus();
    return false;
  }
  
  var daysInMonth = DaysArray(12)
  if (dayComp.value.length < 1 || day < 1 || day > 31 || (month == 2 && day > daysInFebruary(year)) || day > Days_in_Month[month]) {
    alert("Please enter a valid day");
    dayComp.focus();
    return false;
  }
  
  if (yearComp.value.length != 4 || year == 0 || year < StartYear || year > EndYear){
    alert("Please enter a valid 4 digit year between " + minYear + " and " + maxYear);
    yearComp.focus();
    return false;
  }
  
  return true;
}

function Header(Year, Month) {
	if (Month == 1) {
		if ((Year % 400 == 0) || ((Year % 4 == 0) && (Year % 100 != 0))) {
			Days_in_Month[1] = 29;
		}
	}
	var Header_String = Month_Label[Month] + ' ' + Year;
	return Header_String;
}

function Make_Calendar(Year, Month) {
	var First_Date = new Date(Year, Month, 1);
	var Heading = Header(Year, Month);
	var First_Day = First_Date.getDay() + 1;
	First_Day -= firstDayOfWeek;
	//if (((Days_in_Month[Month] == 31) && (First_Day >= 6)) ||
	//	((Days_in_Month[Month] == 30) && (First_Day == 7))) {
		var Rows = 6;
	//}
	//else if ((Days_in_Month[Month] == 28) && (First_Day == 1)) {
	//	var Rows = 4;
	//}
	//else {
	//	var Rows = 5;
	//}
	var HTML_String = '<!--<table><tr><td valign="top" class=calChooser>--><table border=1 name=calTable class=calChooser>';
	HTML_String += "<tr><td class=calChooserHeading colspan=7><table width=100%><tr><th align=left class=calChooserHeading width=20%>";
	if (TestYear(Selected_Year, -1)) {
		HTML_String += "<a href=\"javascript:SkipYear(\'-\');\"><img src=/kserver/images/PrevYear.gif border=0 alt=\"Previous Year\"></a>";
	}
	if (TestMonth(Selected_Month, -1)) {
		HTML_String += "<a href=\"javascript:SkipMonth(\'-\');\"><img src=/kserver/images/PrevMonth.gif border=0 alt=\"Previous Month\"></a>";
	}
	HTML_String += "</th><th align=center class=calChooserHeading>";
	HTML_String += Heading;
	HTML_String += "</th><th align=right class=calChooserHeading width=20%>";
	if (TestMonth(Selected_Month, 1)) {
		HTML_String += "<a href=\"javascript:SkipMonth(\'+\');\"><img src=/kserver/images/NextMonth.gif border=0 alt=\"Next Month\"></a>";
	}
	if (TestYear(Selected_Year, 1)) {
		HTML_String += "<a href=\"javascript:SkipYear(\'+\');\"><img src=/kserver/images/NextYear.gif border=0 alt=\"Next Year\"></a>";
	}
	HTML_String += "</th></tr></table></td></tr><tr>";
	for (var i=0; i<Day_Label.length; i++) {
		HTML_String += '<th class=calChooser width=14%>';
		HTML_String += Day_Label[i];
		HTML_String += '</th>';
	}
	HTML_String += '</tr>';
	var Day_Counter = 1;
	var Loop_Counter = 1;
	for (var j = 1; j <= Rows; j++) {
		HTML_String += '<tr ALIGN="left" VALIGN="top">';
		for (var i = 1; i < 8; i++) {
			if ((Loop_Counter >= First_Day) && (Day_Counter <= Days_in_Month[Month])) {
				if ((Day_Counter == Today) && (Year == Current_Year) && (Month == Current_Month)) {
					HTML_String += '<td class=calChooserToday><a class=calChooserToday href="javascript:selectDate(' + Day_Counter + ');">' + Day_Counter + '</a></td>';
				}
				else if (Year == Prev_Year && Month == Prev_Month && Day_Counter == Prev_Day) {
					HTML_String += '<td class=calChooserSelected><a class=calChooserSelected href="javascript:selectDate(' + Day_Counter + ');">' + Day_Counter + '</a></td>';
				}
				else if ((Year == Current_Year && Month >= Current_Month && Day_Counter >= Today) || (Year > Current_Year) ) {
					HTML_String += '<td class=calChooser><a class=calChooser href="javascript:selectDate(' + Day_Counter + ');">' + Day_Counter + '</a></td>';
				}
				else {
					HTML_String += "<td class=" + ExpiredDayClass + "><a class=" + ExpiredDayClass;
					if (!DisableExpiredDays) {
						HTML_String += " href=\"javascript:selectDate(" + Day_Counter + ");\"";
					}
					HTML_String += ">" + Day_Counter + "</a></td>";
				}
				Day_Counter++;
			}
			else {
				HTML_String += '<td class=calChooserOtherMonth>&nbsp;</td>';
			}
			Loop_Counter++;
		}
		HTML_String += '</tr>';
	}
	HTML_String += '</table><!--</td></tr></table>-->';
	if (browserVendor == IE) {
		document.all.CalChooser.innerHTML = HTML_String;
	}
	else if (browserVendor == NS6) {
		document.getElementById('CalChooser').innerHTML = HTML_String;
	}
	else {
		document.layers["CalChooser"].document.writeln(HTML_String);
		document.layers["CalChooser"].document.close();
	}
}

function Check_Nums() {
	if ((event.keyCode < 48) || (event.keyCode > 57)) {
		return false;
	}
}

function InitDefaults() {
	Prev_Year = -1;
	Prev_Month = -1;
	Prev_Day = -1;
	Selected_Month = Current_Month;
	Selected_Year = Current_Year;
	ExpiredDayClass = NormalDayClassName;
	DisableExpiredDays = false;
	StartYear = Current_Year - 50;
	EndYear = Current_Year  + 50;
}

function TestMonth(month, delta) {
	month = parseInt(month);
	if (month + delta > 11 && Selected_Year == EndYear) {
		return false;
	}
	if (month + delta < 0 && Selected_Year == StartYear) {
		return false;
	}
	return true;
}

function TestYear(year, delta) {
	year = parseInt(year);
	return ((year + delta) <= EndYear && (year + delta) >= StartYear);
}

function SkipMonth(Direction) {
	if (Direction == '+') {
		if (!TestMonth(Selected_Month, 1)) {
			return;
		}
		if (Selected_Month == 11) {
			Selected_Month = 0;
			Selected_Year++;
		}
		else {
			Selected_Month++;
		}
	}
	else {
		if (!TestMonth(Selected_Month, -1)) {
			return;
		}
		if (Selected_Month == 0) {
			Selected_Month = 11;
			Selected_Year--;
		}
		else {
			Selected_Month--;
		}
	}
	Make_Calendar(Selected_Year, Selected_Month);
}

function SkipYear(Direction) {
	if (Direction == '+') {
		if (!TestYear(Selected_Year, 1)) {
			return;
		}
		Selected_Year++;
	}
	else {
		if (!TestYear(Selected_Year, -1)) {
			return;
		}
		Selected_Year--;
	}
	SetYear(Selected_Year);
	Make_Calendar(Selected_Year, Selected_Month);
}

function SetYear(year) {
	if (year == null || year == "") {
		year = Current_Date.getFullYear();
	}
	if (year >= StartYear && year <= EndYear) {
		Selected_Year = year;
	}
}

function SetMonth(month) {
	if (month == null || parseInt(month) < 0) {
		month = Current_Date.getMonth();
	}
	Selected_Month = month;
}

function SetPrevYear(year) {
	if (year != null && year != "") {
		Prev_Year = year;
	}
}

function SetPrevMonth(month) {
	if (month != null && parseInt(month) >= 0) {
		Prev_Month = month;
	}
}

function selectDate(Selected_Day) {
	setDateComponentValue(Date_Component, Selected_Month, Selected_Day, Selected_Year);
	hideChooserComponent();
	if (Date_Component.hideCallback) {
		Date_Component.hideCallback();
	}
}

function setDateComponent(comp) {
	Date_Component = comp;
}

function showChooserComponent(event) {
	if (browserVendor == IE) {
		event = window.event;
		document.all.CalChooser.style.pixelLeft = 0;
		document.all.CalChooser.style.pixelTop = event.srcElement.offsetHeight;
		var p = event.srcElement;
		while (p != null) {
			document.all.CalChooser.style.pixelLeft += p.offsetLeft;
			document.all.CalChooser.style.pixelTop += p.offsetTop;
			p = p.offsetParent;
		}
		document.all.CalChooser.style.display = "";
	}
	else if (browserVendor == NS6) {
		document.getElementById('CalChooser').style.display = "";
		var x = event.target.offsetLeft;
		var y = event.target.offsetTop;
		var p = event.target.offsetParent;
		while (p != null) {
			x += p.offsetLeft;
			y += p.offsetTop;
			p = p.offsetParent;
		}
		y += event.target.offsetHeight;
		document.getElementById('CalChooser').style.left = x + 'px';
		document.getElementById('CalChooser').style.top =  y + 'px';
	}
	else {
		alert(browserVendor);
		document.layers["CalChooser"].moveTo(event.target.offsetLeft, event.target.offsetTop + event.target.offsetHeight);
		document.layers["CalChooser"].display = "";
	}

	document.onmousedown = hideChooserEvtHandler;
	
}

function intersect(px, py, left, top, width, height) {
	return (px >= left && px <= left+width && py >= top && py <= top+height);
}

function hideChooserEvtHandler(event) {
	var hideChooser = false;

	//if the event coordinates where inside the chooser, force to hide it
	if (browserVendor == IE) {
		event = window.event;
		var cal = document.all.CalChooser;
		hideChooser = (!(intersect(event.clientX+document.body.scrollLeft, event.clientY+document.body.scrollTop, cal.style.pixelLeft, cal.style.pixelTop, cal.offsetWidth, cal.offsetHeight)));
	}
	else if (browserVendor == NS6) {
		var cal = document.getElementById('CalChooser');
		hideChooser = (!(intersect(event.pageX, event.pageY, cal.offsetLeft, cal.offsetTop, cal.offsetWidth, cal.offsetHeight)));
	}
	else {
		var cal = document.layers['CalChooser'];
		hideChooser = (!(intersect(event.pageX, event.pageY, cal.left, cal.top, cal.width, cal.height)));
	}

	//else hide the chooser
	if (hideChooser) {
		hideChooserComponent();
		document.onmousedown = null;
	}

	return true;
		
}

function hideChooserComponent() {
	if (browserVendor == IE) {
		document.all.CalChooser.style.display="none";
	}
	else if (browserVendor == NS6) {
		document.getElementById('CalChooser').style.display="none";
	}
	else {
		document.layers["CalChooser"].display="none";
	}
}

function SetParams(start, params) {
	for (var i=start; i<params.length; i++) {
		eval(params[i]);
	}
}

//-- date component integration --//

function showChooser(event, yearComp, monthComp, monthGetter, monthSetter, dayComp, daySetter, dayGetter, hideCallback) {

	//if already visible, return

	InitDefaults();

	var dateComponent = new Object();
	dateComponent.yearComp = yearComp;
	dateComponent.monthComp = monthComp;
	dateComponent.setMonthValue = monthSetter;
	dateComponent.dayComp = dayComp;
	dateComponent.setDayValue = daySetter;
	dateComponent.hideCallback = hideCallback;

	SetParams(8, arguments);

	SetYear(yearComp.value);
	SetMonth(monthGetter(monthComp));

	SetPrevYear(yearComp.value);
	SetPrevMonth(monthGetter(monthComp));
	if (dayGetter) {
		Prev_Day = dayGetter(dayComp);
	}

	setDateComponent(dateComponent);

	Make_Calendar(Selected_Year, Selected_Month);
	showChooserComponent(event);

	return false;
}

function setDateComponentValue(dateComponent, month, day, year) {
	dateComponent.yearComp.value = year;
	dateComponent.setMonthValue(dateComponent.monthComp, month);
	if (dateComponent.dayComp != null) {
		dateComponent.setDayValue(dateComponent.dayComp, day);
	}
}

function getMonthText(monthComponent) {
	if (monthComponent.value == null || monthComponent.value == '') {
		return -1;
	}
	if (monthComponent.value > 12) {
		return 11;
	}
	else if(monthComponent.value < 1) {
		return 0;
	}
	return monthComponent.value-1;
}

function getMonthSelect(monthComponent) {
	if (monthComponent.selectedIndex == 0) {
		return 0;
	}
	return monthComponent.selectedIndex-1;
}

function setMonthText(monthComponent, month) {
	monthComponent.value = month+1;
}

function setMonthSelect(monthComponent, month) {
	monthComponent.selectedIndex = month+1;
}

function setDayText(dayComponent, day) {
	dayComponent.value = day;
}

function setDaySelect(dayComponent, day) {
	dayComponent.selectedIndex = day+1;
}

function getDayText(dayComponent) {
	return dayComponent.value;
}

function getDaySelect(dayComponent) {
	return dayComponent.selectedIndex-1;
}