var dfID = new Array();
var tmrDF = null;

function dfAddCalen(name,display,ano,mes,dia){
	if(findDateField(name) == null){
		var d = new htcCalendario(name,ano,mes,dia);
		d.displayOn = display;
		dfID.push(d);
		d.initCalen();
	}
}

function findDateField(name){
	for(var i = 0;i < dfID.length;i++)
		if(dfID[i].nome == name)
			return dfID[i];
	return null;
}

function hideAllDF(){
	if(tmrDF)
		clearTimeout(tmrDF);
	for(var i = 0;i < dfID.length;i++)
		eval('calen'+ dfID[i].nome).style.display = 'none';
}

function showCalendar(name,obj){
	var df = findDateField(name);
	if(df){
		if(eval('calen'+ df.nome).style.display == 'block'){
			eval('calen'+ df.nome).style.display = 'none';
			return null;
		}
		hideAllDF();
		df.draw();
		var b = new htcBrowserInfo();
		//alert(b.screenWidth);
		switch(df.displayOn){
			case 'right':
				eval('calen' + df.nome).style.left = moveXbySlicePos(0,obj);
				eval('calen' + df.nome).style.top = moveYbySlicePos(19,obj);
				break;
			case 'top-right':
				eval('calen' + df.nome).style.left = moveXbySlicePos(95,eval('div'+df.nome));
				eval('calen' + df.nome).style.top = moveYbySlicePos(-110,obj);
				break;
			case 'top-left':
				eval('calen' + df.nome).style.left = moveXbySlicePos(-218,eval('div'+df.nome));
				eval('calen' + df.nome).style.top = moveYbySlicePos(-110,eval('div'+df.nome));
				break;
			case 'top':
				eval('calen' + df.nome).style.left = moveXbySlicePos(5,eval('div'+df.nome));
				eval('calen' + df.nome).style.top = moveYbySlicePos(-140,eval('div'+df.nome));
				break;
			case 'bottom':
				eval('calen' + df.nome).style.left = moveXbySlicePos(5,eval('div'+df.nome));
				eval('calen' + df.nome).style.top = moveYbySlicePos(19,obj);
				break;
			case 'bottom-left':
				eval('calen' + df.nome).style.left = moveXbySlicePos(92,eval('div'+df.nome));
				eval('calen' + df.nome).style.top = moveYbySlicePos(2,obj);
				break;
			case 'bottom-right':
				eval('calen' + df.nome).style.left = moveXbySlicePos(-135,eval('div'+df.nome));
				eval('calen' + df.nome).style.top = moveYbySlicePos(19,obj);
				break;
		}
		eval('calen'+ df.nome).style.display = 'block';
		tmrDF = setTimeout('hideAllDF()',1500);
	
	}else{
		status = 'df - Not Found On Show';
	}
}

function addSkipDF(name,obj){
	var df = findDateField(name);
	if(df){
		df.skipOnSelect = obj;
	}else{
		status = 'df - Not Found On Skip';
	}
}

function dfSetDay(name,dia){
	var df = findDateField(name);
	if(df){
		if(tmrDF)
			clearTimeout(tmrDF);
		eval('document.'+df.form+'.'+df.nome).value = poeZ(''+ dia,2) + '/' + poeZ(''+(df._mes+1),2) +'/'+ df._ano;
		eval('calen'+ df.nome).style.display = 'none';
		df._dia = dia;
		df._idia = dia;
		df._imes = df._mes;
		df._iano = df._ano;
		
		if(df.skipOnSelect)
			df.skipOnSelect.focus();			
	}else{
		status = 'df - Not Found On SetDay';
	}
}

function dfSetMonth(name,mes){
	var df = findDateField(name);
	if(df){
		if(mes == 'prev'){
			if((df._mes - 1) < 0){
				df._mes = 11;
				df._ano--;
			}else{
				df._mes--;
			}
		}else{
			if((df._mes + 1) > 11){
				df._mes = 0;
				df._ano++;
			}else{
				df._mes++;
			}
		}
		df.draw();
		eval('calen'+ df.nome).style.display = 'block';
	}else{
		status = 'df - Not Found On SetMonth';
	}
}

function dfSetYear(name,ano){
	var df = findDateField(name);
	if(df){
		(ano == 'prev')?df._ano--:df._ano++;
		df.draw();
		eval('calen'+ df.nome).style.display = 'block';
	}else{
		status = 'df - Not Found On SetYear';
	}
}

function htcCalendario(nome,ano,mes,dia){
	//=====Variaver Default=========
	this.nome 		= nome;
	if(isDateAlt(dia+'/'+(mes-1)+'/'+ano))
		this.date = new Date(ano,(mes-1),dia,0,0,0,0);
	else
		this.date = new Date();
		
	this._dia = this.date.getDate();
	this._mes = this.date.getMonth();
	this._ano = this.date.getFullYear();
	this._idia = this.date.getDate();
	this._imes = this.date.getMonth();
	this._iano = this.date.getFullYear();
	
	this.navMonth 	= true;
	this.navYear	= true;
	this._initialized = false;
	this.displayOn	= 'bottom';
	this.form		= 'all';
	this.skipOnSelect = null;
	//TODO==========================
	//this.selectMultiple 	= false;
	//this.selectedDates	= new Array();
	//==============================
	this.monthFN	= new Array('Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro');		
	this.monthSN	= new Array('Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez');	
	this.weekName 	= new Array('Dom','Seg','Ter','Qua','Qui','Sex','Sab');	
	//==============================
	this.monthName	= function(n){
		if(isNaN(n)){
			return '';
		}else{
			return this.monthFN[n];
		}
	};
	this.shortMonthName	= function(n){
		if(isNaN(n)){
			return '';
		}else{
			return this.monthSN[n];
		}
	};
	this.weekDayName = function(n){
		if(isNaN(n)){
			return '';
		}else{
			return this.weekName[n];
		}
	};
	//================================
	this.getMonthSize = monthSize;
	//================================
	this.draw		= drawCalen;
	this.makeHead	= drawHead;
	this.makeBody	= drawBody;
	this.initCalen 	= drawCalen;
}

function drawCalen(){
	if(!this._initialized){
		document.writeln(this.makeHead());
	}
	this.makeBody();
}

function drawHead(){

	var head = '';
	head += '<div id=\'calen'+ this.nome +'\' class="dfBase" style="display:none;">';
	head += '  <table width="221" border="0" cellpadding="0" cellspacing="1" id="tbcalen'+ this.nome +'">';
	head += '	<tr><td colspan="8">';
	head += '	<table width="100%" border="0" cellpadding="0" cellspacing="1" id="tit_'+ this.nome +'" onMouseOver="clearTimeout(tmrDF);" onMouseOut="tmrDF = setTimeout(\'hideAllDF()\',1500);">';
	head += '    <tr> ';
	if(this.navYear)
		head += '      <td onSelectStart="return false;" onClick="dfSetYear(\''+ this.nome +'\',\'prev\');" class="dfNavYear"><font face=\"Webdings\" size="2"><div title="Retorna um ano">7</font></td>';
	if(this.navMonth)
		head += '      <td onSelectStart="return false;" onClick="dfSetMonth(\''+ this.nome +'\',\'prev\');" class="dfNavMonth"><font face=\"Webdings\" size="2"><div title="Retorna um mês">3</font></td>';
	
	head += '      <td onSelectStart="return false;" id="'+ this.nome +'_mes" class="dfTitle"><span class="dfMonth" id="mes_'+ this.nome +'">'+ this.monthName(this._mes) +'</span> - <span class="dfYear" id="ano_'+ this.nome +'">'+ this._ano +'</span></td>';

	if(this.navMonth)
		head += '      <td onSelectStart="return false;" onClick="dfSetMonth(\''+ this.nome +'\',\'next\');" class="dfNavMonth"><font face=\"Webdings\" size="2"><div title="Avança um mês">4</font></td>';
	if(this.navYear)
		head += '      <td onSelectStart="return false;" onClick="dfSetYear(\''+ this.nome +'\',\'next\');" class="dfNavYear"><font face=\"Webdings\" size="2"><div title="Avança um ano">8</div></font></td>';
	
	head += '    </tr>';
	head += '  </table>';
	head += '    </td></tr>';
	head += '    <tr align="center">';
	
	for(var i = 0;i < this.weekName.length;i++)
		head += '      <td width="28" class="dfWeekDay">'+ this.weekName[i] +'</td>';

	head += '    </tr>';
	head += '    <tr align="center"> ';
	head += '      <td colspan="8" id="'+ this.nome +'_calen">&nbsp;</td>';
	head += '    </tr>';
	head += '  </table>';
	head += '</div>';
	this._initialized = true;
	return head;
	
}

function drawBody(){
	var calendario = '';
	var distEvent = '';
	//1-verificar qual o e qual o ultimo dia do mes
	var count = this.getMonthSize(this._mes,this._ano);
	var tday = new Date().getDate();

	this.date = new Date(parseInt(this._iano),parseInt(this._imes),parseInt(this._idia)); 
	var imes = new Date(parseInt(this._ano),parseInt(this._mes),1);
	var fmes = new Date(parseInt(this._ano),parseInt(this._mes),count);
	
	var d_imes = imes.getDay();
	var d_fmes = 6 - fmes.getDay();
	
	calendario += '<table width="100%" border="0" cellpadding="0" cellspacing="1"><tr>';
	var cweek = 0
	
	imes.setMonth(imes.getMonth() - 1);
	for(var i = 1;i <= d_imes;i++){
		imes.setDate( this.getMonthSize(imes.getMonth(),this._ano) - (d_imes - i) );
		calendario += '<td width="28" class="dfNull">'+ imes.getDate() +'</td>';
		cweek++;
	}
	for(var i = 1;i <= count;i++){
		if(cweek == 7){
			calendario += '</tr><tr>';
			cweek = 0;
		}
		var imes = new Date(parseInt(this._ano),parseInt(this._mes),i);
		distEvent = ' onMouseOver="this.className = \'dfDayOver\',clearTimeout(tmrDF);"';
		distEvent += ' onClick="dfSetDay(\''+ this.nome +'\','+ imes.getDate() +')"';
		if(dateDiff('d',this.date.getDate()+'/'+this.date.getMonth()+'/'+this.date.getFullYear(),imes.getDate()+'/'+imes.getMonth()+'/'+imes.getFullYear()) == 0)
			calendario += '<td onSelectStart="return false;" title="dia selecionado" width="28" class="dfDaySelected" '+ distEvent +' onMouseOut="this.className = \'dfDaySelected\',tmrDF = setTimeout(\'hideAllDF()\',1500);">'+ imes.getDate() +'</td>';
		else
			if(tday == imes.getDate())
				calendario += '<td onSelectStart="return false;" title="dia atual no mês selecionado" width="28" class="dfDayCurrent" '+ distEvent +' onMouseOut="this.className = \'dfDayCurrent\',tmrDF = setTimeout(\'hideAllDF()\',1500);">'+ imes.getDate() +'</td>';
			else
				calendario += '<td onSelectStart="return false;" title="'+ poeZ(''+ imes.getDate(),2) + '/' + poeZ(''+(this._mes+1),2) +'/'+ this._ano +'" width="28" class="dfDay" '+ distEvent +' onMouseOut="this.className = \'dfDay\',tmrDF = setTimeout(\'hideAllDF()\',1500);">'+ imes.getDate() +'</td>';
		cweek++;
	}
	fmes.setMonth(fmes.getMonth() - 1);
	for(var i = 1;i <= d_fmes;i++){
		fmes.setDate(i);
		calendario += '<td onSelectStart="return false;" width="28" class="dfNull">'+ fmes.getDate() +'</td>';
		cweek++;
	}
	
	calendario += '</tr></table>';
	
	eval(this.nome + '_calen').innerHTML = calendario;
	eval('mes_'+ this.nome).innerHTML = this.monthName(this._mes);
	eval('ano_'+ this.nome).innerHTML = this._ano;
}

function poeZ(s,n){
	while(s.length < n)
		s = '0' + s;
	return s;
}

function monthSize(mes,ano){
	switch(parseInt(mes)){
		case 0:
		case 2:
		case 4:
		case 6:	
		case 7:
		case 9:
		case 11: //31 dias
			return 31;
			break;
		case 3:
		case 5:
		case 8:
		case 10: //30 dias
			return 30;
			break;
		case 1: // fevereiro
			//Ano bisexto
			if((ano%4 == 0 && ano%100 != 0)|| ano%400 == 0){  //29 dias
				return 29;
			}
			else{
				return 28;
			}
			break;
	}
	return 0;
}

