﻿// Definições
calImgUp = '';
calImgDown = '';
calImgClose = '';
bHasDropDown = true;
dateFormat = "dd-MM-yyyy";
daysOfWeek = ["Domingo", "Segunda-feira", "Terça-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado"];
months = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"];

offsetX = 3;
offsetY = -13;

// Variável global com a referência do objecto Calendar
var cal;

// events capturing
//window.onload=calendar_onload;
//SafeAddOnload(calendar_onload);

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;
	}
}

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:10000"></div>');

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>';
	
	if(calImgClose == "")
		tmpStr += '<td align="right" valign="middle" title="fechar"><a href="javascript:cal.hide()">x</a></td>';
	else
		tmpStr += '<td align="right" valign="middle" title="fechar"><a href="javascript:cal.hide()"><img src="' + calImgClose + '" border="0" align="absmiddle"></a></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>';
		
		if(calImgDown == "")
			tmpStr += '<a href="javascript:cal.changeMonth(-1);" title="mês anterior">«</a>';
		else
			tmpStr += '<a href="javascript:cal.changeMonth(-1);" title="mês anterior"><img name="calendar" src="' + calImgDown + '" border="0"></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>';
		
		if(calImgUp == "")
			tmpStr += '<a href="javascript:cal.changeMonth(1);" title="próximo mês">»</a>';
		else
			tmpStr += '<a href="javascript:cal.changeMonth(1);" title="próximo mês"><img name="calendar" src="' + calImgUp + '" border="0"></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(); // to prevent calling it in a loop
	var iDaysInMonth = this.getDaysInMonth(); // to prevent calling it in a loop
	
	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)
{
	if (this.dateFormat == 'dd-mmm-yyyy')
	{
		this.targetInput.value = padZero(day) + "-" + this.months[this.month].substr(0,3) + "-" + + this.year;
		//this.targetD.value = padZero(day);
		//this.targetM.value = this.months[this.month].substr(0,3)
		//this.targetY.value = this.year;
	}
	if (this.dateFormat == 'dd-mm-yyyy')
	{
		this.targetInput.value = padZero(day) + "-" + padZero(this.month+1) + "-" + this.year;
		//this.targetD.value = padZero(day);
		//this.targetM.value = padZero(this.month+1);
		//this.targetY.value = this.year;
	}
	if (this.dateFormat == 'dd-MM-yyyy')
	{
		this.targetInput.value = padZero(day) + "-" + padZero(this.month+1) + "-" + this.year;
		//this.targetD.value = padZero(day);
		//this.targetM.value = padZero(this.month+1);
		//this.targetY.value = this.year;
	}		
	if (this.dateFormat == 'mm-dd-yyyy')
	{
		this.targetInput.value = padZero(this.month+1) + "-" + padZero(day) + "-" + this.year;
		//this.targetM.value = padZero(this.month+1);
		//this.targetD.value = padZero(day);
		//this.targetY.value = this.year;
	}
	if (this.dateFormat == 'yyyy-MM-dd')
	{
		this.targetInput.value =  this.year + "-" + padZero(this.month+1) + "-" + padZero(day) ;
		//this.targetM.value = padZero(this.month+1);
		//this.targetD.value = padZero(day);
		//this.targetY.value = this.year;
	}
	
	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 + event.srcElement.height + offsetY;
	}

	if (browser.ns6 || browser.ns4)
	{
		containerLeft = event.target.x + event.target.width + offsetX;
		containerTop = event.target.y + event.target.height + 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 = bHasDropDown;
	this.dateFormat = dateFormat;

	// if no restrictions let choose any date between 1900 and 3000
	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;
	//this.targetD = targetD;
	//this.targetM = targetM;
	//this.targetY = targetY;
	
	if (targetInput && targetInput.value)
	{
		var dateParts = targetInput.value;
		dateParts = dateParts.replace(/\D/gi, "-");
		dateParts += "--"; //assegura que a existem pelo menos 3 indexes após o split
		dateParts = (targetInput.value).split('-');
		
		var atmp;
		
		switch(this.dateFormat)
		{
			case  "yyyy-mm-dd":
				atmp = new Array(parseInt(dateParts[2], 10), parseInt(dateParts[1], 10), parseInt(dateParts[0], 10))
				break;
			case  "yyyy-MM-dd":
				atmp = new Array(parseInt(dateParts[2], 10), parseInt(dateParts[1], 10), parseInt(dateParts[0], 10))
				break;
			default:
				atmp = new Array(parseInt(dateParts[0], 10), parseInt(dateParts[1], 10), parseInt(dateParts[2], 10))
			
		}
		
        if (atmp[1] < 1) atmp[1] = 1;
		if (atmp[1] > 12) atmp[1] = 12;
		if (atmp[0] == 0) atmp[0] = 1;
		this.day = this.oDay = this.dateFormat.substr(0,2) == 'dd' ? atmp[0] : atmp[2];
		if (this.dateFormat == 'dd-mm-yyyy')
		{
		
			for (var i=0; i<this.months.length; i++)
			{
			    if (atmp[1] == this.months[i].substr(0,3))
				{
				  this.month = this.oMonth = i;
				  break;
				}
			}
		}
		else
		{
			if (this.dateFormat.substr(0,4) == 'yyyy')
			{
				this.month = this.oMonth = atmp[1] - 1;
			}
			else
			{
				if (this.dateFormat.substr(0,2) == 'dd')
					this.month = this.oMonth = atmp[1] - 1;
				else
					this.month = this.oMonth = atmp[0] - 1;
			}
		}
		this.year = this.oYear = atmp[2];
		
		if (this.day > this.getDaysInMonth()) this.day = this.getDaysInMonth();
	}
	else // no date set, default to today
	{
		var theDate = this.getDefaultDate();
		
		// se o dia actual sair fora do intervalo permitido, o default é o primeiro dia do intervalo
		if(theDate < this.dateFrom || theDate > this.dateTo)
			theDate = this.dateFrom;
			
		this.year = this.oYear = theDate.getFullYear();
		this.month = this.oMonth = theDate.getMonth();
		this.day = this.oDay = theDate.getDate();
	}
	
	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()
{	
	this.year = this.month = this.day = "11";
	if (browser.ns4)
		this.containerLayer.hidden = true;
		
	if (browser.dom || browser.ie4)
		this.containerLayer.style.visibility = 'hidden';

	this.containerLayer.bgcolor = 'black';
	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];
	//var longDate = weekday.split('-')[0] + ', ' + padZero(this.oDay) + '-' + padZero(this.oMonth + 1) + '-' + this.oYear;
	return longDate;
}

function calendar_onload()
{
	cal = new Calendar();
}

Calendar.prototype.restoreOverlappedElements = function()
{
	this.displayOverlappedElements("SELECT", true);
	this.displayOverlappedElements("OBJECT", true);
	this.displayOverlappedElements("IFRAME", true);
}

Calendar.prototype.hideOverlappedElements = function()
{
	if(browser.name=="microsoft internet explorer")
	{
		if(browser.platform=="win32")
		{
			this.displayOverlappedElements("SELECT", false);
			this.displayOverlappedElements("OBJECT", false);
		}
		
		if(browser.palatform!="win32" || browser.version < 5.5)
			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;
}



