function ETCalendar() {
	this.oDataBase = new Date();
	this.oDataSelecionada = new Date( this.oDataBase );
	
	this.sTabela = '<table cellpadding="0" cellspacing="0" class="calendar">';
	this.sFimTabela = '</table>';
	this.sAnoAnterior = '&lt;&lt;';
	this.sProximoAno = '&gt;&gt;';
	this.sLocal = '';
	this.sVariavel = '';
	this.sFuncao = '';
	
	this.i = 0;
	this.j = 0;
	
	this.oMeses = new Array('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro');
	
	this.montaAno = function() {
		return '<th class="ano"><a href="#" class="anoAnterior" onclick="' + this.sVariavel + '.anoAnterior();">' 
		  + this.sAnoAnterior + '</a> ' + this.oDataSelecionada.getFullYear() 
		  + ' <a href="#" class="proximoAno" onclick="' + this.sVariavel + '.anoPosterior();">' + this.sProximoAno + '</a></th>';
	}
		
	this.montaMeses = function() {
		var sMeses = '<th class="meses"><select name="mesSelecionado" onChange="' + this.sVariavel + '.atualizaMes(this);">';
		
		for( i=1; i<=12; i++ ) {
			sMeses = sMeses + '<option value="' + i + '"';
			if( (1+this.oDataBase.getMonth()) == i )
				sMeses = sMeses + ' selected="true"';
			sMeses = sMeses + '>' + this.oMeses[i-1] + '</option>';
		}
		
		return sMeses + '</select></th>';
	}
	
	this.montaDias = function() {
		var bInicio = false;
		var bFim = false;
		
		var iDia = 1;
		
		var sDia = '';
		
		this.oDataSelecionada.setDate(iDia);
		
		for( i=0; i<6; i++ ) {
			sDia = sDia + '<tr>';
			for( j=1; j<=7; j++ ) {
				if( (!bInicio) && (this.oDataSelecionada.getDay() == (j-1)) )
						bInicio = true;
				
				if( bInicio && (!bFim) ) {
					sDia = sDia + '<td id="dia' + ((i*7)+j) + '" style="cursor: pointer;" onclick="' + this.sVariavel + '.selecionaData(\''+ this.oDataSelecionada.getDateBr() + '\');">' + this.oDataSelecionada.getDate() + '</td>';
					this.oDataSelecionada.setDate(this.oDataSelecionada.getDate()+1);
					if( this.oDataSelecionada.getMonth() != this.oDataBase.getMonth() )
						bFim = true;
				} else {
					sDia = sDia + '<td id="dia' + ((i*7)+j) + '"> </td>';
				}
			}
			sDia = sDia + '</tr>';
		}
		
		return sDia;
	}
	
	this.montaCalendario = function(sNomeVariavel) {
		this.sVariavel = sNomeVariavel;
		this.oDataSelecionada = new Date(this.oDataBase);
		var sResultado = this.sTabela + '<tr>' + this.montaAno() + this.montaMeses() + '</tr>';
		sResultado = sResultado + '<tr><td colspan="2"><table width="100%" cellpadding="0" cellspacing="0" class="dias">' + this.montaDias() + '</table></td></tr>';
		sResultado = sResultado + this.sFimTabela;

		var oTemp = document.getElementById(this.sLocal);
		
		this.innerHTML(oTemp, sResultado);
	}
	
	this.innerHTML = function (oElemento, sHtml) {
		if (document.getElementById && !document.all) {
			var oRange = document.createRange();
			oRange.setStartBefore(oElemento);
			
			var oHtmlFrag = oRange.createContextualFragment(sHtml);
			
			while (oElemento.hasChildNodes())
				oElemento.removeChild(oElemento.lastChild);
				
			oElemento.appendChild(oHtmlFrag);
		} else {
			oElemento.innerHTML = sHtml;
		}
	}
	
	this.anoAnterior = function() {
		this.oDataBase.setFullYear(this.oDataBase.getFullYear() - 1);
		this.montaCalendario(this.sVariavel);
	}
	
	this.anoPosterior = function() {
		this.oDataBase.setFullYear(this.oDataBase.getFullYear() + 1);
		this.montaCalendario(this.sVariavel);
	}
	
	this.atualizaMes = function(oSelect) {
		this.oDataBase.setMonth(parseInt(oSelect.options[oSelect.selectedIndex].value,10)-1);
		this.montaCalendario(this.sVariavel);
	}
	
	this.selecionaData = function(sData) {
		eval( this.sFuncao + '(\'' + sData + '\')' );
	}
	
	this.selecionaLocal = function( sLocalId ) {
		this.sLocal = sLocalId;
	}
	
	this.eventoSelecao = function( sFunc ) {
		this.sFuncao = sFunc;
	}
}