// Definições
var calImgUp = "/esel/images/calendar_up.gif";
var calImgDown = "/esel/images/calendar_down.gif";
var calImgClose = "/esel/images/close.gif";
var hasDropDown = true;
var dateFormat =  "dd-mm-yyyy"; // dd-mm-yyyy | mm-dd-yyyy | yyyy-mm-dd
var dateSeparator = "-";
var daysOfWeek = ["Domingo", "Segunda-feira", "Terca-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sabado"];
var months = ["Janeiro", "Fevereiro", "Marco", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"];
var offsetX = 4;
var offsetY = 0;

var browser = new Browser();
if (browser.dom || browser.ie4) document.write('<div id="calendarcontainer" class="calendar-container" style="position: absolute;left: 100;top: 100;visibility: hidden;z-index:1000"></div>');
var cal;
function Browser()
{
	this.dom = document.getElementById?1:0;
	this.ie4 = (document.all && !this.dom)?1:0;
	this.ns4 = (document.layers && !this.dom)?1:0;
	this.ns6 = (this.dom && !document.all)?1:0;
	this.ie5 = (this.dom && document.all)?1:0;
	this.ok = this.dom || this.ie4 || this.ns4;
	this.platform = navigator.platform.toLowerCase();
	this.userAgent = navigator.userAgent.toLowerCase();
	this.name = navigator.userAgent.indexOf("Opera")>-1 ? "opera" : navigator.appName.toLowerCase();
	switch(this.name)
	{
		case "netscape":
			this.version = parseFloat(navigator.appVersion);
			break;
		case "microsoft internet explorer":
			this.version = parseFloat((this.userAgent).substr((this.userAgent).indexOf("msie ")+("msie ").length, 4));
			break;
		case "opera":
			this.version = parseFloat((this.userAgent).substr((this.userAgent).indexOf("opera ")+("opera ").length, 4));
			break;
	}
}
function Calendar()
{
	this.daysOfWeek = daysOfWeek;
	this.months = months;
	this.daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	if (browser.ns4)
	{
		var tmpLayer = new Layer();
		tmpLayer.x = 100;
		tmpLayer.y = 100;
		tmpLayer.bgColor = '#FFFFFF';
	}
	if (browser.dom || browser.ie4) var tmpLayer = browser.dom?document.getElementById('calendarcontainer'):document.all.calendarcontainer;
	this.containerLayer = tmpLayer;
	return this;
}
Calendar.prototype.getFirstDOM = function()
{
	var thedate = this.getDefaultDate();
	thedate.setDate(1);
	thedate.setMonth(this.month);
	thedate.setFullYear(this.year);
	return thedate.getDay();
}
Calendar.prototype.getDaysInMonth = function ()
{
	if (this.month!=1) return this.daysInMonth[this.month]
	else
		if (this.isLeapYear(this.year)) return 29;
		else return 28;
}
Calendar.prototype.isLeapYear = function()
{
	if (this.year % 4 == 0 && ((this.year % 100 != 0) || (this.year % 400 == 0))) return true;
	else return false;
}
Calendar.prototype.buildString = function()
{
	var tmpStr = '';
	tmpStr += '<table border="0" cellspacing="0" cellpadding="0">';
	tmpStr += '<tr>';
	tmpStr += '<td align="center">';
	tmpStr += '<table border="0" cellspacing="0" cellpadding="0" class="calendar-header" align="center" width="100%">';
	tmpStr += '<tr>';
	tmpStr += '<td align="left" valign="middle">';
	if(this.month != this.oMonth || this.year != this.oYear) tmpStr += '<a href="javascript: cal.selectToday()">';
	tmpStr += this.getSelectedDayText();
	if(this.month != this.oMonth || this.year != this.oYear) tmpStr += '</a>';
	tmpStr += '</td>';
	tmpStr += "<td></td>"
	tmpStr += '</tr>';	
	tmpStr += '</table>';
	tmpStr += '</td>';
	tmpStr += '</tr>';	
	tmpStr += '<tr>';
	tmpStr += '<td align="center">';
	tmpStr += '<table border="0" cellspacing="0" cellpadding="0" class="calendar-selection" align="center" width="100%">';
	tmpStr += '<tr>';
	if (this.hasDropDown)
	{
		tmpStr += '<td align="center" valign="middle" nowrap>';
		tmpStr += '<a href="javascript: cal.changeMonth(-1);"><img name="calendar" src="' + calImgDown + '" border="0" alt="mês anterior"></a>';
		tmpStr += '</td>';
		tmpStr += '<td align="center" valign="center" nowrap>';
		tmpStr += '<select class="month" name="month" onchange="cal.selectChange(this);">';
		for (var i=0; i<this.months.length; i++)
		{
			tmpStr += '<option value="' + i + '"';
			if (i == this.month) tmpStr += ' selected';
			tmpStr += '>' + this.months[i] + '</option>';
		}
		tmpStr += '</select>';
		tmpStr += '&nbsp;';		
		tmpStr += '<input class="year" type="text" size="' + ((browser.ns4 && browser.platform=='Win32')? '1': '4') + '" name="year" maxlength="4" onBlur="cal.inputChange(this);" onKeyUp="window.event.keyCode == 13 ? cal.inputChange(this) : null;" value="' + this.year + '">';
		tmpStr += '</td>';
		tmpStr += '<td align="center" valign="middle" nowrap>';
		tmpStr += '<a href="javascript: cal.changeMonth(1);"><img name="calendar" src="' + calImgUp + '" border="0" alt="próximo mês"></a>';
		tmpStr += '</td>';
	}
	else
	{
		tmpStr += '<td align="center" valign="middle" nowrap>';
		tmpStr += '<a href="javascript: cal.changeMonth(-1);"><img name="calendar" src="' + calImgDown + '" border="0" alt="mês anterior"></a>';
		tmpStr += '</td>';
		tmpStr += '<td width="100%" align="center">' + (this.months[this.month]).toUpperCase() + '</td>';
		tmpStr += '<td align="center" valign="middle" nowrap>';
		tmpStr += '<a href="javascript: cal.changeMonth(1);"><img name="calendar" src="' + calImgUp + '" border="0" alt="próximo mês"></a>';
		tmpStr += '</td>';
		tmpStr += '<td align="center" valign="middle" nowrap>';
		tmpStr += '<a href="javascript: cal.changeYear(-1);"><img name="calendar" src="' + calImgDown + '" border="0" alt="ano anterior"></a>';
		tmpStr += '</td>';
		tmpStr += '<td align="center">' + this.year + '</td>';
		tmpStr += '<td align="center" valign="middle" nowrap>';
		tmpStr += '<a href="javascript: cal.changeYear(1);"><img name="calendar" src="' + calImgUp + '" border="0" alt="próximo ano"></a>';	          
		tmpStr += '</td>';
	}
	tmpStr += '</tr>';
	tmpStr += '</table>';	
	tmpStr += '</td></tr><tr><td align="center">';
	tmpStr += '<table border="0" cellspacing="0" cellpadding="0" class="calendar" align="center">';
	tmpStr += '<tr>';
	var iCount = 1;
	var iFirstDOM = this.getFirstDOM();
	var iDaysInMonth = this.getDaysInMonth();
	for (var i=0;i<this.daysOfWeek.length;i++) tmpStr += '<th>' + this.daysOfWeek[i].substr(0,1) + '</th>';
	tmpStr += '</tr>';
	var tmpFrom = parseInt('' + this.dateFromYear + this.dateFromMonth + this.dateFromDay, 10);
	var tmpTo = parseInt('' + this.dateToYear + this.dateToMonth + this.dateToDay, 10);
	var tmpCompare;
	for (var j=1; j<=6; j++)
	{
		if ((7*(j-1) + i) >= iFirstDOM+1 && iCount <= iDaysInMonth)
		{
			tmpStr += '<tr>';
			for (var i=1;i<=7;i++)
			{
				tmpStr += '<td '
				if ((7*(j-1) + i) >= iFirstDOM+1  && iCount <= iDaysInMonth)
				{
		 			if (iCount == this.day && this.year == this.oYear && this.month == this.oMonth)
		 				tmpStr += 'class="today"';
		 			else 
		 			{
		    			if (i==1 || i==7)
		    				tmpStr += 'class="weekend"';
						else
							tmpStr += 'class="weekday"';
		 			}
					
		 			tmpStr += '>';
					tmpCompare = parseInt('' + this.year + padZero(this.month) + padZero(iCount), 10);
					
		 			if (tmpCompare >= tmpFrom && tmpCompare <= tmpTo)
					{
						if (this.disableWeekends && (i==1 || i==7))
							tmpStr += '<span class="disabled">' + iCount + '</span>';
						else
							tmpStr += '<a href="javascript: cal.clickDay(' + iCount + ');">' + iCount + '</a>';
					}
					else
						tmpStr += '<span class="disabled">' + iCount + '</span>';
						
					iCount++;
				}
				else
				{
		 			if (i==1 || i==7)
		 				tmpStr += 'class="weekend"';
					
		 			tmpStr += '>&nbsp;';
				}
				tmpStr += '</td>';
			}
			tmpStr += '</tr>';
		}
	}
	tmpStr += '</table></td></tr>';
	tmpStr += '</table>';
	return tmpStr;
}
Calendar.prototype.selectChange = function(month)
{
	this.month = month.selectedIndex;
	this.writeString(this.buildString());
}
Calendar.prototype.inputChange = function(year)
{
	var tmp = year.value;
	if (tmp >= 1900 || tmp <= 2100)
	{
		this.year = tmp;
		this.writeString(this.buildString());
	}
	else tmp = this.year;
}
Calendar.prototype.changeYear = function(incr)
{
	(incr==1) ? this.year++ : this.year--;
	this.writeString(this.buildString());
}
Calendar.prototype.changeMonth = function(incr)
{
	if (this.month==11 && incr==1)
	{
		this.month = 0;
		this.year++;
	}
	else
	{
		if (this.month==0 && incr==-1)
		{
			this.month = 11;
			this.year--;
		}
		else
			(incr==1) ? this.month++ : this.month--;
	}
	this.writeString(this.buildString());
}
Calendar.prototype.clickDay = function(day)
{
	var formattedDate;
	switch(this.dateFormat)
	{
		case 'yyyy-mm-dd':
			formattedDate =  this.year + this.dateSeparator + padZero(this.month+1) + this.dateSeparator + padZero(day) ;
			break;
		case 'mm-dd-yyyy':
			formattedDate = padZero(this.month+1) + this.dateSeparator + padZero(day) + this.dateSeparator + this.year;
			break;
		default:
			formattedDate = padZero(day) + this.dateSeparator + padZero(this.month+1) + this.dateSeparator + this.year;
			break;	
	}
	this.targetInput.value = formattedDate;
	this.hide()
}
Calendar.prototype.writeString = function(str)
{
	if (browser.ns4)
	{
		this.containerLayer.document.open();
		this.containerLayer.document.write(str);
		this.containerLayer.document.close();
	} 
	if (browser.dom || browser.ie4) this.containerLayer.innerHTML = str;
	this.hideOverlappedElements();
}
Calendar.prototype.show = function(event, targetInput, dateFrom, dateTo, disableWeekends)
{
	if (browser.ie5 || browser.ie4) var event = window.event;
	if (browser.ns4)
	{
		this.containerLayer.x = event.x + offsetX;
		this.containerLayer.y = event.y + offsetY;
	}
	if (browser.ie5 || browser.ie4)
	{
		var obj = event.srcElement;
		x = 0;
		while (obj.offsetParent != null)
		{
			x += obj.offsetLeft;
			obj = obj.offsetParent;
		}
		x += obj.offsetLeft;
		y = 0;
		var obj = event.srcElement;
		while (obj.offsetParent != null)
		{
			y += obj.offsetTop;
			obj = obj.offsetParent;
		}
		y += obj.offsetTop;
		containerLeft = x + event.srcElement.width + offsetX;
		if (event.y > 0) containerTop = y + offsetY;
	}
	if (browser.ns6 || browser.ns4)
	{
		containerLeft = event.target.x + event.target.width + offsetX;
		containerTop = event.target.y + offsetY;
	}
	if (browser.ns4)
	{
		if (!this.containerLayer.hidden)
		{		
			this.hide();
			if ((this.containerLayer.x).replace(/\D/g, '') == containerLeft && (this.containerLayer.y).replace(/\D/g, '') == containerTop) return;
		}
		this.containerLayer.x = containerLeft;
		this.containerLayer.y = containerTop;	
	}
	if (browser.dom || browser.ie4)
	{		
		if (this.containerLayer.style.visibility == 'visible')
		{
			this.hide();
			if ((this.containerLayer.style.left).replace(/\D/g, '') == containerLeft && (this.containerLayer.style.top).replace(/\D/g, '') == containerTop) return;
		}
		this.containerLayer.style.left = containerLeft;
		this.containerLayer.style.top = containerTop;
	}
	this.disableWeekends = (disableWeekends ? true : false);
	this.hasDropDown = hasDropDown;
	this.dateFormat = dateFormat;
	this.dateSeparator = dateSeparator.replace(/\d/gi, "?");
	if (dateFrom) this.dateFrom = dateFrom;
	else this.dateFrom = new Date(1900,0,1);
	if (dateTo) this.dateTo = dateTo;
	else this.dateTo = new Date(3000,0,1);
	this.dateFromDay = padZero(this.dateFrom.getDate());
	this.dateFromMonth = padZero(this.dateFrom.getMonth());
	this.dateFromYear = this.dateFrom.getFullYear();
	this.dateToDay = padZero(this.dateTo.getDate());
	this.dateToMonth = padZero(this.dateTo.getMonth());
	this.dateToYear = this.dateTo.getFullYear();
	this.targetInput = targetInput;
	
	if (this.targetInput && this.targetInput.value)
	{
		var dateParts = this.targetInput.value;
		dateParts = dateParts.replace(/\D+/gi, "\n");
		dateParts += "\n\n";
		dateParts = (dateParts).split("\n");
		
		switch(this.dateFormat)
		{
			case "yyyy-mm-dd":
				this.day = parseInt(dateParts[2], 10);
				this.month = parseInt(dateParts[1], 10);
				this.year = parseInt(dateParts[0], 10);
				break;
			case "mm-dd-yyyy":
				this.day = parseInt(dateParts[1], 10);
				this.month = parseInt(dateParts[0], 10);
				this.year = parseInt(dateParts[2], 10);
			default:
				this.day = parseInt(dateParts[0], 10);
				this.month = parseInt(dateParts[1], 10);
				this.year = parseInt(dateParts[2], 10);
				break;
		}
		
		if (isNaN(this.day)) this.day = this.getDefaultDate().getDate();
		if (isNaN(this.month)) this.month = this.getDefaultDate().getMonth() - 1;
		if (isNaN(this.year)) this.year = this.getDefaultDate().getFullYear();

		if (this.year < 1900) this.year = 1900;
		if (this.year > 3000) this.year = 3000;

		if (this.month < 1) this.month = 1;
		if (this.month > 12) this.month = 12;
		this.month = this.month - 1; // Janeiro=0 ... Dezembro=12

		if (this.day < 1) this.day = 1;
		if (this.day > this.getDaysInMonth()) this.day = this.getDaysInMonth();
	}
	else
	{
		var theDate = this.getDefaultDate();
		if(theDate < this.dateFrom || theDate > this.dateTo) theDate = this.dateFrom;
		this.year = theDate.getFullYear();
		this.month = theDate.getMonth();
		this.day = theDate.getDate();
	}

	this.oYear = this.year;
	this.oMonth = this.month;
	this.oDay = this.day;

	this.writeString(this.buildString());
	if (browser.ns4) this.containerLayer.hidden = false;
	if (browser.dom || browser.ie4) this.containerLayer.style.visibility = 'visible';
}
Calendar.prototype.hide = function()
{	
	if (browser.ns4) this.containerLayer.hidden = true;
	if (browser.dom || browser.ie4) this.containerLayer.style.visibility = 'hidden';
	this.restoreOverlappedElements();	
}
function padZero(num)
{
	return ((num <= 9) ? ("0" + num) : num);
}
Calendar.prototype.getDefaultDate = function()
{
	var theDate, hasReference;
	if (hasReference = document.forms['server_reference_date'])
	{
		var inputDay = document.forms['server_reference_date'].elements['day'];
		var inputMonth = document.forms['server_reference_date'].elements['month'];
		var inputYear = document.forms['server_reference_date'].elements['year'];
		hasReference = Boolean(inputDay && inputMonth && inputYear && inputDay.value && inputMonth.value && inputYear.value);
	}
	if(hasReference)
	{
		var day = inputDay.value;
		var month = inputMonth.value - 1;
		var year = inputYear.value;
		theDate = new Date(year, month, day);
	}
	else theDate = new Date();
	return theDate;
}
Calendar.prototype.dateAdd = function(numDays, numMonths, numYears)
{
	var returnDate = this.getDefaultDate();
	var yearsToAdd = numYears;
	var month = returnDate.getMonth() + numMonths;
	if (month > 11)
	{
		yearsToAdd = Math.floor((month+1) / 12);
		month -= 12*yearsToAdd;
		yearsToAdd += numYears;
	}
	returnDate.setMonth(month);
	returnDate.setFullYear(returnDate.getFullYear()	+ yearsToAdd);
	returnDate.setTime(returnDate.getTime() + 60000*60*24*numDays);
	return returnDate;
}

Calendar.prototype.addYears = function(numYears)
{
	return this.dateAdd(0, 0, numYears);
}
Calendar.prototype.addMonths = function(numMonths)
{
	return this.dateAdd(0, numMonths, 0);
}
Calendar.prototype.addDays = function(numDays)
{
	return this.dateAdd(numDays, 0, 0);
}
Calendar.prototype.selectToday = function()
{
	this.month = this.oMonth;
	this.year = this.oYear;
	this.day = this.oDay;
	this.writeString(this.buildString());	
}
Calendar.prototype.getSelectedDayText = function()
{
	var weekday = this.daysOfWeek[(new Date(this.oYear, this.oMonth, this.oDay)).getDay()];
	var longDate = weekday.split('-')[0] + ', ' + this.oDay + ' de ' + this.months[this.oMonth];
	return longDate;
}
Calendar.prototype.restoreOverlappedElements = function()
{
	if(browser.name=="microsoft internet explorer")
	{
		if(browser.platform=="win32") this.displayOverlappedElements("SELECT", true);
		if(browser.platform=="win32") this.displayOverlappedElements("OBJECT", true);
		if(browser.palatform!="win32" || browser.version < 5.5) this.displayOverlappedElements("IFRAME", true);
	}
	this.displayOverlappedElements("IFRAME", true);
}
Calendar.prototype.hideOverlappedElements = function()
{
	if(browser.name=="microsoft internet explorer")
	{
		if(browser.platform=="win32") this.displayOverlappedElements("SELECT", false);
		if(browser.platform=="win32") this.displayOverlappedElements("OBJECT", false);
		if(browser.palatform!="win32" || browser.version < 5.5) this.displayOverlappedElements("IFRAME", false);
	}
	this.displayOverlappedElements("IFRAME", false);
}
Calendar.prototype.displayOverlappedElements = function(elementTag, bDisplay)
{
	var elements = browser.name=="Microsoft Internet Explorer" ? document.all.tags(elementTag) : document.getElementsByTagName(elementTag);
	for(var j=0; j<elements.length; j++)
	{
		var isPartOfCalendar=0, element = elements.item(j);
		for(var t=element.offsetParent; t; t=t.offsetParent) if(t.id && t.id.indexOf("calendarcontainer")>=0) isPartOfCalendar = 1;
		if(isPartOfCalendar) continue;
		else 
			if(this.isOverlapping(element))
			{
				if(bDisplay) element.style.visibility = "";
				else element.style.visibility = "hidden";
			}
			else if(!bDisplay) element.style.visibility = "";
	}
}
Calendar.prototype.isOverlapping = function(element)
{
	var eLeft=0, eTop=0, eWidth=element.offsetWidth, eHeight=element.offsetHeight;
	if(eWidth) element._wd = eWidth;
	else eWidth = element._wd;
	if(eHeight) element._ht = eHeight;
	else eHeight = element._ht;
	while(element)
	{		
		eLeft+=element.offsetLeft;
		eTop+=element.offsetTop;
		element = element.offsetParent;
	}
	var oLeft = (this.containerLayer).offsetLeft, oTop = (this.containerLayer).offsetTop, oWidth = (this.containerLayer).offsetWidth, oHeight = (this.containerLayer).offsetHeight;
	return eLeft<oWidth+oLeft && eLeft+eWidth>oLeft && eTop<oHeight+oTop && eTop+eHeight>oTop;
}
