var Calendario_nombres_mes = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
var Calendario_nombres_dia = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo'];
var Calendario_nombres_dia_corto = ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá', 'Do'];
var Calendario_duracion_meses = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

var defaultClass_laborable = '';
var defaultClass_laborable = '';


function cBdsCalendario() {

    this.hoy = new Date();
	
	this.layer_id = '';
	this.fechas_destacadas = new Array();

    this.hoy_anyo = this.hoy.getFullYear();
    this.hoy_mes = this.hoy.getMonth();
    this.hoy_dia = this.hoy.getDate();

    this.actual_anyo = 0;
    this.actual_mes = 0;
    this.actual_dia = 0;

    this.class_laborable = '';
    this.class_festivo = '';
    this.class_hoy = '';
    this.class_evento1 = '';
    this.class_evento2 = '';
    this.class_evento3 = '';

    this.titulo = null;
    this.tabla = null;
}

cBdsCalendario.prototype = {

    /**
     * Devuelve la duraciÃ³n de un mes
     *
     * @param {Object} anyo
     * @param {Object} mes
     */
    getDuracionMes : function(anyo, mes) {
    	var duracion = Calendario_duracion_meses[mes];
    	if(mes == 1) {
    		if(this.esAnyoBisiesto(anyo)) {
    			duracion++;
    		}
        }
        return duracion;
    },


    /**
     * Informa de si un aÃ±o es bisiesto
     *
     * @param {Object} anyo
     */
    esAnyoBisiesto : function(anyo) {
	    return ((anyo % 4 == 0) && (anyo % 100 != 0)) || (anyo % 500 == 0);
    },


    esHoy : function(anyo, mes, dia) {
        return (anyo == this.hoy_anyo && mes == this.hoy_mes && dia == this.hoy_dia);
    },


    escribeCabecera : function() {
        var fila_cabecera = this.tabla.childNodes[0].childNodes[0];
        for(var i=0; i<7; i++) fila_cabecera.childNodes[i].innerHTML = Calendario_nombres_dia_corto[i];
    },


    init : function() {
        this.dibujaMes(this.hoy_anyo, this.hoy_mes);
    },

    link_evento : function(anyo, mes, dia) {
        mes+=1;
        var cad = anyo + '-';
        cad += ('00' + mes).substr(('00' + mes).length - 2) + '-';
        cad += ('00' + dia).substr(('00' + dia).length - 2);
       for(var i=0; i<this.fechas_destacadas.length; i+=2) {
            if(this.fechas_destacadas[i+1] == cad) return this.fechas_destacadas[i];
       }
       return '';
    },

    dibujaMes : function(anyo, mes) {

        //Año y mes (corrige para que el mes sea un valor válido)
        this.actual_anyo = anyo;
        this.actual_mes = mes;
        for(; this.actual_mes > 11; ) {
            this.actual_anyo ++;
            this.actual_mes -= 12;
        }
        for(; this.actual_mes < 0; ) {
            this.actual_anyo --;
            this.actual_mes += 12;
        }

        // Encabezado
        var nombre_mes = Calendario_nombres_mes[this.actual_mes] + ' ' + this.actual_anyo;

    	var inicio = new Date(this.actual_anyo, this.actual_mes, 1);
        var inicio_dia = (inicio.getDay() + 6) % 7;
    	var duracion = this.getDuracionMes(this.actual_anyo, this.actual_mes);

        var cad = '';
        cad += '';
        cad += '<table class="calendar" cellpadding="0" summary="Calendario de Eventos">';
        cad += '<tr>';
        cad += '<td class="dias">';
        //cad += '<a href="javascript:;" onclick="BdsCalendario.cambiaMes(-1);" title="anterior"><img src="html/images/calendar_ant.gif" alt="anterior" /></a>';
		cad += '<img id="mes_anterior" src="html/images/calendar_ant.gif" alt="anterior" />';
        cad += '</td>';
        cad += '<td class="mes" colspan="5"><span class="txt_mes">' + nombre_mes + '</span></td>';
        cad += '<td class="dias">';
        //cad += '<a href="javascript:;" onclick="BdsCalendario.cambiaMes(1);" title="siguiente"><img src="html/images/calendar_sig.gif" alt="siguiente" /></a>';
		cad += '<img id="mes_siguiente" src="html/images/calendar_sig.gif" alt="siguiente" />';
        cad += '</td>';
        cad += '</tr>';

        cad += '<tr>';
        cad += '<td class="dias"><span class="txt_calendar">lu</span></td>';
        cad += '<td class="dias"><span class="txt_calendar">ma</span></td>';
        cad += '<td class="dias"><span class="txt_calendar">mi</span></td>';
        cad += '<td class="dias"><span class="txt_calendar">ju</span></td>';
        cad += '<td class="dias"><span class="txt_calendar">vi</span></td>';
        cad += '<td class="dias"><span class="txt_calendar">sa</span></td>';
        cad += '<td class="dias"><span class="txt_calendar">do</span></td>';
        cad += '</tr>';


        var num_abs = 0;

        // Antes de empezar
        for(var i=0; i<inicio_dia; i++) {
            if(num_abs % 7 == 0) {
                cad += '<tr>';
            }
            cad += '<td class="vacio">&nbsp;</td>';
            num_abs++;
            if(num_abs % 7 == 0) cad += '</tr>';
        }

        // Empezamos
        for(var i=1; i<=duracion; i++) {
            if(num_abs % 7 == 0) {
                cad += '<tr>';
            }

            var link_evento = this.link_evento(anyo, mes, i);
            var es_hoy = this.esHoy(anyo, mes, i);
			var link_start = '';
			var link_end = '';

            if(link_evento != '') {
                clase1 = 'evento';
				link_start = link_evento;
				link_end = '</a>';
            } else {
                if (es_hoy) {
                    clase1 = 'hoy';
                } else {
                clase1 = (num_abs % 7 > 4) ? 'festivo' : 'no_evento';
                }
            }

            if(es_hoy) {
                clase2 = 'txt_calendar_on';
            } else {
                clase2 = 'txt_calendar';
            }

            cad += '<td class="' + clase1 + '"><span class="' + clase2 + '">' + link_start + i + link_end + '</a></td>';
            num_abs++;
            if(num_abs % 7 == 0) cad += '</tr>';
        }

        // Terminamos
        for( ; num_abs % 7 > 0; ) {
            cad += '<td class="vacio">&nbsp;</td>';
            num_abs++;
            if(num_abs % 7 == 0) cad += '</tr>';
        }

        cad += '</table>';
        $(this.layer_id).update(cad);

		$('mes_anterior').observe('click', this._cambiaMesHandler.bindAsEventListener(this, -1));
		$('mes_siguiente').observe('click', this._cambiaMesHandler.bindAsEventListener(this, 1));
		       


        return;



        // Dibuja
        for(var semana = 0; semana <= 5; semana++) {
            var fila = document.getElementById('calendariofila' + (semana +1));
            fila.style.display = (7 * semana + 1 > dias_mes.length) ? 'none' : 'block';

            var celdas = Array();
            for(var num=0; num<fila.childNodes.length; num++) {
                if(fila.childNodes[num].tagName == 'TD')
                    celdas[celdas.length] = fila.childNodes[num];
            }
            for(var dia=0; dia<7; dia++) {
                var dia_mes = 7 * semana + dia + 1;
                var texto = dias_mes[dia_mes - 1];
                if(texto == undefined) texto = '&nbsp;';
                var dia_del_mes = parseInt(texto);
                if(isNaN(dia_del_mes)) dia_del_mes = 0;

                var clase;
                if(this.esHoy(this.actual_anyo, this.actual_mes, dia_del_mes))
                    clase = this.class_hoy;
                else if(dia < 5)
                    clase = this.class_laborable;
                else
                    clase = this.class_festivo;

                celdas[dia].childNodes[0].innerHTML = texto;
                celdas[dia].className = clase;

				if(this.esHoy(this.actual_anyo, this.actual_mes, dia_del_mes)) {
					celdas[dia].childNodes[0].className='txt_calendar_on';
				} else {
					celdas[dia].childNodes[0].className='txt_calendar';
				}
            }
        }
    },

	/**
	 * Handler para mostrar el select de eligir modelo
	 * @param {Object} event
	 */
	_cambiaMesHandler : function(event) {
		var value = arguments[1];
		this.cambiaMes(value);
	},

    cambiaMes : function(despl) {
        this.dibujaMes(this.actual_anyo, this.actual_mes + despl);
    }

}
