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++)
		Obj('calen'+ dfID[i].nome).style.display = 'none';
}

function showCalendar(name,obj){
	var df = findDateField(name);
	if(df){
		if(Obj('calen'+ df.nome).style.display == ''){
			Obj('calen'+ df.nome).style.display = 'none';
			return null;
		}
		hideAllDF();

		if(isDateAlt(obj.value)){
			df._dia = parseInt(obj.value.substring(0,2));
			df._mes = parseInt(obj.value.substring(3,5)-1);
			df._ano = obj.value.substring(6,10);
			df._idia = obj.value.substring(0,2);
			df._imes = parseInt(obj.value.substring(3,5)-1);
			df._iano = parseInt(obj.value.substring(6,10));
			df.date  = new Date(df._iano,df._imes,df._idia,0,0,0,0);
		}else{
			obj.value = '';	
		}
		
		df.draw();
		eval('document.'+df.form+'.'+df.nome).focus();
		var b = new htcBrowserInfo();
		//alert(b.screenWidth);
		switch(df.displayOn){
			case 'right':
				Obj('calen' + df.nome).style.left = moveXbySlicePos(0,obj);
				Obj('calen' + df.nome).style.top = moveYbySlicePos(19,obj);
				break;
			case 'top-right':
				Obj('calen' + df.nome).style.left = moveXbySlicePos(95,eval('div'+df.nome));
				Obj('calen' + df.nome).style.top = moveYbySlicePos(-110,obj);
				break;
			case 'top-left':
				Obj('calen' + df.nome).style.left = moveXbySlicePos(-218,eval('div'+df.nome));
				Obj('calen' + df.nome).style.top = moveYbySlicePos(-110,eval('div'+df.nome));
				break;
			case 'top':
				Obj('calen' + df.nome).style.left = moveXbySlicePos(5,eval('div'+df.nome));
				Obj('calen' + df.nome).style.top = moveYbySlicePos(-140,eval('div'+df.nome));
				break;
			case 'bottom':
				Obj('calen' + df.nome).style.left = moveXbySlicePos(5,eval('div'+df.nome));
				Obj('calen' + df.nome).style.top = moveYbySlicePos(19,obj);
				break;
			case 'bottom-left':
				Obj('calen' + df.nome).style.left = moveXbySlicePos(92,eval('div'+df.nome));
				Obj('calen' + df.nome).style.top = moveYbySlicePos(2,obj);
				break;
			case 'bottom-right':
				Obj('calen' + df.nome).style.left = moveXbySlicePos(-135,eval('div'+df.nome));
				Obj('calen' + df.nome).style.top = moveYbySlicePos(19,obj);
				break;
		}
		Obj('calen'+ df.nome).style.display = '';
		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;
		Obj('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{
			eval('document.'+df.form+'.'+df.nome).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();
		Obj('calen'+ df.nome).style.display = '';
	}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();
		Obj('calen'+ df.nome).style.display = '';
	}else{
		status = 'df - Not Found On SetYear';
	}
}

function dfGetKey(e, o){
	var df = findDateField(o.id);
	if(tmrDF)
		clearTimeout(tmrDF);

	if(df){
		var tb = df.markedcell.parentNode.parentNode.parentNode;
		var kc = (window.Event)?e.which:e.keyCode;
		switch(kc){
			case 40:
				if(_gel('calen'+ o.id).style.display != ''){
					showCalendar(o.id ,o);
				}else{
					if(tb.rows[ df.markedcell.parentNode.rowIndex+1 ]){
						if(tb.rows[ df.markedcell.parentNode.rowIndex+1 ].cells[ df.markedcell.cellIndex ].className != 'dfNull'){
							tb.rows[ df.markedcell.parentNode.rowIndex+1 ].cells[ df.markedcell.cellIndex ].className = 'dfDaySelected';
							df.markedcell.className = 'dfDay';
							var tmp = tb.rows[ df.markedcell.parentNode.rowIndex+1 ].cells[ df.markedcell.cellIndex ];
							df.markedcell = tmp;
						}else{
							dfSetYear(o.id,'prev');
						}
					}else{
						dfSetYear(o.id,'prev');
					}
				}
			break;
			case 38:
				if(_gel('calen'+ o.id).style.display == ''){
					if(tb.rows[ df.markedcell.parentNode.rowIndex-1 ]){
						if(tb.rows[ df.markedcell.parentNode.rowIndex-1 ].cells[ df.markedcell.cellIndex ].className != 'dfNull'){
							tb.rows[ df.markedcell.parentNode.rowIndex-1 ].cells[ df.markedcell.cellIndex ].className = 'dfDaySelected';
							df.markedcell.className = 'dfDay';
							var tmp = tb.rows[ df.markedcell.parentNode.rowIndex-1 ].cells[ df.markedcell.cellIndex ];
							df.markedcell = tmp;
						}else{
							dfSetYear(o.id,'next');
						}
					}else{
						dfSetYear(o.id,'next');
					}
				}
			break;
			case 39:
				if(_gel('calen'+ o.id).style.display == ''){
					if(tb.rows[ df.markedcell.parentNode.rowIndex ].cells[ df.markedcell.cellIndex+1 ]){
						if(tb.rows[ df.markedcell.parentNode.rowIndex ].cells[ df.markedcell.cellIndex+1 ].className != 'dfNull'){
							tb.rows[ df.markedcell.parentNode.rowIndex ].cells[ df.markedcell.cellIndex+1 ].className = 'dfDaySelected';
							df.markedcell.className = 'dfDay';
							var tmp = tb.rows[ df.markedcell.parentNode.rowIndex ].cells[ df.markedcell.cellIndex+1 ];
							df.markedcell = tmp;
						}else{
							dfSetMonth(o.id,'next');
						}
					}else{
						dfSetMonth(o.id,'next');
					}
				}
			break;
			case 37:
				if(_gel('calen'+ o.id).style.display == ''){
					if(tb.rows[ df.markedcell.parentNode.rowIndex ].cells[ df.markedcell.cellIndex-1 ]){
						if(tb.rows[ df.markedcell.parentNode.rowIndex ].cells[ df.markedcell.cellIndex-1 ].className != 'dfNull'){
							tb.rows[ df.markedcell.parentNode.rowIndex ].cells[ df.markedcell.cellIndex-1 ].className = 'dfDaySelected';
							df.markedcell.className = 'dfDay';
							var tmp = tb.rows[ df.markedcell.parentNode.rowIndex ].cells[ df.markedcell.cellIndex-1 ];
							df.markedcell = tmp;
						}else{
							dfSetMonth(o.id,'prev');
						}
					}else{
						dfSetMonth(o.id,'prev');
					}
				}
			break;
			case 13:
				dfSetDay(o.id , df.markedcell.innerHTML);
			break;
			case 27:
				hideAllDF();
			break;
		}
	}else{
		status = 'df - Not Found get key';
	}
}


function htcCalendario(nome,ano,mes,dia){
	//=====Variaver Default=========
	this.nome 		= nome;
	this.obj		= _gel(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;
	
	this.dfMask 	= new Mask('dd/mm/yyyy','date');
	this.markedcell = 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());
		$addEvent(this.obj, "onkeydown", "dfGetKey(event, this);", true);
		this.dfMask.attach(_gel(this.nome));
	}
	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"><img src="/htcFW/geral/pictures/btb_ano_anterior.gif" title="ano anterior" /></td>';
	if(this.navMonth)
		head += '      <td onSelectStart="return false;" onClick="dfSetMonth(\''+ this.nome +'\',\'prev\');" class="dfNavMonth"><img src="/htcFW/geral/pictures/btb_mes_anterior.gif" title="mês anterior" /></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"><img src="/htcFW/geral/pictures/btb_mes_proximo.gif" title="próximo mês"></td>';
	if(this.navYear)
		head += '      <td onSelectStart="return false;" onClick="dfSetYear(\''+ this.nome +'\',\'next\');" class="dfNavYear"><img src="/htcFW/geral/pictures/btb_ano_proximo.gif" title="próximo ano" /></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>';
	
	Obj(this.nome + '_calen').innerHTML = calendario;
	Obj('mes_'+ this.nome).innerHTML = this.monthName(this._mes);
	Obj('ano_'+ this.nome).innerHTML = this._ano;
	
	this.markedcell = null;
	var cntr = Obj(this.nome + '_calen');
	var tbl = cntr.childNodes[0];
	for(var i=0;i<tbl.rows.length;i++){
		for(var j=0;j<tbl.rows[i].cells.length;j++){
			if(tbl.rows[i].cells[j].className == 'dfDaySelected'){
				this.markedcell = tbl.rows[i].cells[j];
			}			
		}
	}
	if(this.markedcell == null){
		for(var i=0;i<tbl.rows.length;i++){
			for(var j=0;j<tbl.rows[i].cells.length;j++){
				if(tbl.rows[i].cells[j].className == 'dfDayCurrent'){
					this.markedcell = tbl.rows[i].cells[j];
				}			
			}
		}	
	}
	
}

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;
}


