

	dias = function(){
		var date = new Date() ;
		this.hoy = date.getDate() ;
		this.actual = date.getDate() ;
		this.nombresCortos = new Array('D', 'L', 'M', 'M', 'J', 'V', 'S') ;
		this.nombresLargos = new Array('Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado') ;
	}


	meses = function(){
		var date = new Date() ;
		this.actual = date.getMonth() ;
		this.hoy = date.getMonth() ;
		this.nombresCortos = new Array('Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic') ;
		this.nombresLargos = new Array('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre') ;
		this.ultimosDias = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) ;
		this.semanas = 6 ;
		this.dias = new dias() ;
	}

	evento = function(){
		this.dia = null ;
		this.mes = null ;
		this.ano = null ;
		this.link = null ;
		this.label = null ;
	}

	anos = function(){
		var date = new Date() ;
		this.actual = date.getFullYear() ;
		this.hoy = date.getFullYear() ;
		this.anos = new Array(2006, 2007, 2008) ;
		this.meses = new meses() ;
		this.eventos = new Array() ;
		this.paraFormulario = false ;
		this.bisiesto(this.actual) ;
		this.setPrimerDia() ;
		this.contenedor = null ;
	}

	anos.prototype.agregarEvento = function(dia, mes, ano, link, label){

		var nuevo_evento = new evento() ;
		nuevo_evento.dia = dia ;
		nuevo_evento.mes = mes ;
		nuevo_evento.ano = ano ;
		nuevo_evento.link = link ;
		nuevo_evento.label = label ;

		this.eventos.push(nuevo_evento) ;
	}
/*
	anos.prototype.agregarEvento = function(evento, elemento, funcion) {
		if(elemento.addEventListener){
			elemento.addEventListener(evento, funcion, false);
		}
		else if(elemento.attachEvent){
			var retorno = elemento.attachEvent('on' + evento, funcion) ;
			return retorno ;
		}
		else throw 'No se puede agregar el evento' ;
	}
*/
	anos.prototype.irA = function(raiz, d, m, y){
		window.location.replace(raiz + (d ? '&d=' + d : '') + (m ? '&m=' + m : '') + (y ? '&y=' + y : '')) ;
	}

	function emergerCalendario(input){

		// en esta funcion, el this es el input que tiene el evento y no anos, asaber porque pero me conviene :)
		var contenedor = input.parentNode ;
		inputDeUsoActual = input ; // indico cual es el input que se esta usando para luego poder retornarle el valor

		var calendarioEmergente = new anos() ;
		calendarioEmergente.esParaFormulario(true) ;

		if(document.getElementById('calendarioEmergente')){ // si ya hay un div con id 'calendario' ...
			var div = document.getElementById('calendarioEmergente') ;
		}
		else{ // si no se crea uno
			var div = document.createElement('div') ;
			div.id = 'calendarioEmergente' ;
			div.style.position = 'absolute' ;
			//div.style.zIndex = '1000' ;
		}
		contenedor.appendChild(div) ;
		calendarioEmergente.imprimir() ;
	}

	anos.prototype.setearValorInput = function(fecha){
		inputDeUsoActual.value = fecha ;
		this.removerCalendario() ;
	}

	anos.prototype.removerCalendario = function(){

		if(document.getElementById('calendarioEmergente')){
			contenedor = document.getElementById('calendarioEmergente') ;
			contenedor.parentNode.removeChild(contenedor) ;
		}
		else{
			alert('No existe el contenedor del calendario') ;
		}
	}

	anos.prototype.esParaFormulario = function(boleano){
		this.paraFormulario = boleano ;
		this.buscarInputsFecha() ;
	}

	anos.prototype.buscarInputsFecha = function(){

		var inputs = document.getElementsByTagName('input') ;
		for(i = 0 ; i < inputs.length ; i++){
			if(inputs[i].getAttribute('fecha') == 'true'){

				inputs[i].onclick = function(){ emergerCalendario(this) }
				inputs[i].style.cursor = 'pointer' ;
			}
		}
	}

	anos.prototype.setPrimerDia = function(){
		var miFecha = new Date(this.actual, this.meses.actual, 1, 0, 0, 0) ;
		this.primerDia = miFecha.getDay() ;
	}

	anos.prototype.bisiesto = function(ano){
		if((ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0){
			this.meses.ultimosDias[1] = 29 ;
		}
		else{
			this.meses.ultimosDias[1] = 28 ;
		}
	}

	anos.prototype.cambiarMes = function(mes){
		if(mes == 12){ // si el mes va a ser 12 (despues de diciembre)...
			this.cambiarAno((this.actual + 1), 0) ; // ... se setea el primer mes del año siguiete (enero)
		}else if(mes == -1){ // si el mes va a ser -1 (antes de enero)...
			this.cambiarAno((this.actual - 1), 11) ; // ... se setea al ultimo mes (diciembre) del año anterior
		}else{ // sino, se cambia el mes, se busca cual es el primer dia y se imprime
			this.meses.actual = mes ;
			this.setPrimerDia() ;
			this.imprimir() ;
		}
	}

	anos.prototype.cambiarAno = function(ano, mes){
		this.bisiesto(ano) ;
		this.actual = ano ;
		this.meses.actual = mes ;
		this.setPrimerDia() ;
		this.imprimir() ;
	}

	anos.prototype.cambiarMes = function(mes){
		if(mes == 12){ // si el mes va a ser 12 (despues de diciembre)...
			this.cambiarAno((this.actual + 1), 0) ; // ... se setea el primer mes del año siguiete (enero)
		}else if(mes == -1){ // si el mes va a ser -1 (antes de enero)...
			this.cambiarAno((this.actual - 1), 11) ; // ... se setea al ultimo mes (diciembre) del año anterior
		}else{ // sino, se cambia el mes, se busca cual es el primer dia y se imprime
			this.meses.actual = mes ;
			this.setPrimerDia() ;
			this.imprimir() ;
		}
	}

	anos.prototype.cambiarAno = function(ano, mes){
		this.bisiesto(ano) ;
		this.actual = ano ;
		this.meses.actual = mes ;
		this.setPrimerDia() ;
		this.imprimir() ;
	}

	anos.prototype.imprimir = function(){

		htmlCalendario =	'<table cellpadding="0" cellspacing="0">' ;

		// se imprime el selector de años
		htmlCalendario +=	'<tr>' ;
		htmlCalendario +=		'<td class="nombre-ano">' ;
		htmlCalendario +=			'<a class="nombre-ano" href="javascript:calendario.cambiarAno(' + (this.actual - 1) + ', 0)"><img src="images/cal-back.gif" /></a>' ;
		htmlCalendario +=		'</td>' ;
		htmlCalendario +=		'<td  class="nombre-ano" colspan =" ' + (this.meses.dias.nombresCortos.length - 2) + ' ">' ;
		htmlCalendario +=			this.actual ;
		htmlCalendario +=		'</td>' ;
		htmlCalendario +=		'<td class="nombre-ano">' ;
		htmlCalendario +=			'<a class="nombre-ano" href="javascript:calendario.cambiarAno(' + (this.actual + 1) + ', 0)"><img src="images/cal-next.gif" /></a>' ;
		htmlCalendario +=		'</td>' ;
		htmlCalendario +=	'</tr>' ;
		// hasta aqui se imprime el selector de años

		// se imprime el selector de meses
		htmlCalendario +=	'<tr>' ;
		htmlCalendario +=		'<td class="nombre-mes">' ;
		htmlCalendario +=			'<a href="javascript:calendario.cambiarMes(' + (this.meses.actual - 1) + ')"><img src="images/cal-back.gif" /></a>' ;
		htmlCalendario +=		'</td>' ;
		htmlCalendario +=		'<td class="nombre-mes" colspan =" ' + (this.meses.dias.nombresCortos.length - 2) + ' ">' ;
		htmlCalendario +=			this.meses.nombresLargos[this.meses.actual] ;
		htmlCalendario +=		'</td>' ;
		htmlCalendario +=		'<td class="nombre-mes">' ;
		htmlCalendario +=			'<a href="javascript:calendario.cambiarMes(' + (this.meses.actual + 1) + ')"><img src="images/cal-next.gif" /></a>' ;
		htmlCalendario +=		'</td>' ;
		htmlCalendario +=	'</tr>' ;
		// hasta aqui se imprime el selector de meses

		htmlCalendario +=	'<tr>' ;

		for(var i = 0 ; i < this.meses.dias.nombresCortos.length ; i++){
			htmlCalendario += '<td class="cabeceras"><div>' + this.meses.dias.nombresCortos[i] + '</div></td>' ;
		}

		htmlCalendario +=	'</tr>' ;
		var contador = 1 ;
		var dia = 1 ;
		for(var semana = 0 ; semana < this.meses.semanas ; semana++){
			htmlCalendario +=	'<tr>' ;

			for(var i = 0 ; i < this.meses.dias.nombresCortos.length ; i++){
				if(this.eventos.length > 0){ // si se setearon los eventos
					// este for (del arreglo de eventos (dia - mes)) cambia el estilo y agrega eventos al td donde hay eventos
					for(var evento in this.eventos){
						if((contador > this.primerDia && dia <= this.meses.ultimosDias[this.meses.actual]) &&
						(dia == this.eventos[evento].dia && this.meses.actual == ((this.eventos[evento].mes) - 1) && this.actual == this.eventos[evento].ano)/* || (dia == this.meses.dias.hoy && this.meses.actual == this.meses.hoy && this.actual == this.hoy)*/){
							tdTemporal = '<td class="evento">' + (this.paraFormulario != true ? '<a href="' + this.eventos[evento].link + '" onMouseOver="showEventLabel(this, \'' + this.eventos[evento].label + '\')">' : '') ;
							break ;
						}else{
							tdTemporal = '<td class="dias">' ;
							continue ;
						}
					} // fin del for que cambia el td de eventos
				}else{
					tdTemporal = '<td class="' + (dia == this.meses.dias.hoy && this.meses.actual == this.meses.hoy && this.actual == this.hoy ? 'evento' : 'dias') + '">' ;
				} // fin de la comprobacion si los eventos fueron seteados
				htmlCalendario += tdTemporal ; // agrego al html el td que puede o no contener eventos

				if(contador > this.primerDia && dia <= this.meses.ultimosDias[this.meses.actual]){
					if(this.paraFormulario == true){
						htmlCalendario += '<a ' + (dia == this.meses.dias.hoy && this.meses.actual == this.meses.hoy && this.actual == this.hoy ? 'class="evento"' : '') + ' href="javascript:calendario.setearValorInput(\'' + dia + '/' + (this.meses.actual + 1) + '/' +this.actual+ '\')">' + dia + '</a>' ;
					}
					else{
						htmlCalendario += dia ;
					}
					dia++ ;
				}else{
					htmlCalendario += '&nbsp;' ;
				}
				contador++ ;
				htmlCalendario += (this.paraFormulario != true ? '</a>' : '') + '</td>' ;
			}
			htmlCalendario += '</tr>' ;
		}

		if(this.paraFormulario == true){
			htmlCalendario +=	'<tr>' ;
			htmlCalendario +=		'<td align="right" colspan =" ' + (this.meses.dias.nombresCortos.length) + ' ">' ;
			htmlCalendario +=			'<a href="javascript:calendario.removerCalendario()">Cerrar X</span>' ;
			htmlCalendario +=		'</td>' ;
			htmlCalendario +=	'</tr>' ;
		}

		/*
		htmlCalendario +=	'<tr>' ;
		htmlCalendario +=		'<td class="hoy-es" colspan =" ' + (this.meses.dias.nombresCortos.length) + ' ">' ;
		htmlCalendario +=			'Hoy es ' + this.meses.dias.hoy + ' de ' + this.meses.nombresLargos[this.meses.hoy] + ' del ' + this.hoy ;
		htmlCalendario +=		'</td>' ;
		htmlCalendario +=	'</tr>' ;
		htmlCalendario +=	'</table>' ;
		*/

		if(document.getElementById('calendario') && this.paraFormulario != true){
			document.getElementById('calendario').innerHTML = htmlCalendario ;
		}
		else	if(document.getElementById('calendarioEmergente')){
			// el calendario emergente se mete en otro div con id 'calendarioEmergente'
			document.getElementById('calendarioEmergente').innerHTML = htmlCalendario ;
		}
		else{
			alert('Si llamás la función imprimir(), debés poner un div con id \'calendario\' para mostrarlo ahí...') ;
		}

	}

