Calendario=new Class({
    Implements: [Options],
    options: {
        contenedor: '',
        div_mes: null,
        hoy: null,
        primer_dia_mes: null,
        div_dias: [],
        eventos:[],
        div_fecha_evento:null,
        div_texto_evento:null
    },
    initialize: function(options){
        this.setOptions(options);
        Object.append(this,this.options);
        this.options=null;
        this.crearDOM();
    },
    pedirDatosMes: function(){
        var year=this.primer_dia_mes.get('fullyear');
        var month=this.primer_dia_mes.get('month')+1;
        var yo=this;
        if(this.eventos[year]==null){
            this.eventos[year]=new Array();
        }
        if(this.eventos[year][month]==null){
            var variables='year='+year+'&month='+month;
            var post = new Request({
                url: 'getEventosMes.php',
                method: 'post',
                onSuccess: function(responseText){
                    yo.agregarEventos(year,month,responseText);
                }
            });
            post.send(variables);
        }
    },
    agregarEventos: function(year,month,responseText){
        this.eventos[year][month]=new Array();
        var eventos=responseText.split('-----');
        var i,itop=eventos.length;
        var evento;
        for(i=0;i<(itop-1);i++){
            evento=eventos[i].split('&&&&&');
            this.eventos[year][month][parseInt(evento[0])]=evento[1];
        }
        this.actualizarDias();
    },
    crearDOM: function(){
        this.hoy = new Date();
        //this.day=this.hoy.get('date');
        //this.month=this.hoy.get('month');
        //this.year=this.hoy.get('fullyear');
        this.primer_dia_mes = this.hoy.clone();
        this.primer_dia_mes.set('date',1);
        this.pedirDatosMes();
        var span,div;
        var div_superior,div_herramientas,div_boton,div_medio,div_tabla,div_fila,div_celda,div_fechas,div_relativo;
        
        div_relativo=new Element('div',{
            styles: {
                'position':'relative',
                'top':'0',
                'left':'0'
            }
        }).inject(this.contenedor);
        this.div_fondo_evento=new Element('div',{
            styles: {
                'position':'absolute',
                'top':'0px',
                'width': '0px',
                'height': '0px',
                'background-color': '#fff',
                'z-index':'1'
            }
        }).inject(div_relativo);
        this.div_evento=new Element('div',{
            styles: {
                'position':'absolute',
                'top':'0px',
                'width': '0px',
                'height': '0px',
                'overflow':'hidden',
                'background-color': '#fff',
                'z-index':'10'
            }
        }).inject(div_relativo);
        div_tabla=new Element('div',{
            styles: {
                'display': 'table',
                'width': '100%'
            }
        }).inject(this.div_evento);
        div_fila=new Element('div',{
            styles: {
                'display': 'table-row'
            }
        }).inject(div_tabla);
        div=new Element('div',{
            styles: {
                'display': 'table-cell',
                'text-align': 'left'
            }
        }).inject(div_fila);
        div.innerHTML='Eventos';
        div.addClass('calendario_mes');
        div=new Element('div',{
            styles: {
                'display': 'table-cell',
                'text-align': 'right'
            }
        }).inject(div_fila);
        div_boton=new Element('div',{
        }).inject(div);
        div_boton.innerHTML='X';
        div_boton.addClass('calendario_boton');
        div_boton.addEvent('click',function(){
            yo.ocultarEvento();
        });
        this.div_fecha_evento=new Element('div',{
        }).inject(this.div_evento);
        this.div_fecha_evento.addClass('calendario_fecha_evento');
        this.div_texto_evento=new Element('div',{
        }).inject(this.div_evento);
        this.div_texto_evento.addClass('calendario_texto_evento');
        
        div_superior=new Element('div',{
        }).inject(this.contenedor);
        div_superior.addClass('calendario_contenedor_herramientas');
        div_tabla=new Element('div',{
            styles: {
                'display': 'table',
                'width': '100%'
            }
        }).inject(div_superior);
        div_fila=new Element('div',{
            styles: {
                'display': 'table-row'
            }
        }).inject(div_tabla);
        var yo=this;
        this.div_mes=new Element('div',{
            styles: {
                'display': 'table-cell',
                'text-align': 'left'
            }
        }).inject(div_fila);
        this.div_mes.addClass('calendario_mes');
        this.div_mes.innerHTML=this.mesToString(this.hoy.get('month'))+' '+this.hoy.get('fullyear');
        div_herramientas=new Element('div',{
            styles: {
                'display': 'table-cell',
                'text-align': 'right'
            }
        }).inject(div_fila);
        div_boton=new Element('div',{
        }).inject(div_herramientas);
        div_boton.innerHTML='&lt;';
        div_boton.addClass('calendario_boton');
        div_boton.addEvent('click',function(){
            yo.anteriorMes();
        });
        div_boton=new Element('div',{
        }).inject(div_herramientas);
        div_boton.innerHTML='&gt;';
        div_boton.addClass('calendario_boton');
        div_boton.addEvent('click',function(){
            yo.siguienteMes();
        });
        div_medio=new Element('div',{
        }).inject(this.contenedor);
        div_medio.addClass('calendario_contenedor_tit_dias');
        div_tabla=new Element('div',{
            styles: {
                'display': 'table',
                'width': '100%'
            }
        }).inject(div_medio);
        div_fila=new Element('div',{
            styles: {
                'display': 'table-row'
            }
        }).inject(div_tabla);
        var dias=new Array('DOM','LUN','MAR','MIE','JUE','VIE','SAB');
        var i;
        for(i=0;i<7;i++){
            div_celda=new Element('div',{
                styles: {
                    'display': 'table-cell',
                    'width': '20px',
                    'text-align': 'center'
                }
            }).inject(div_fila);
            div_celda.addClass('calendario_tit_dia');
            div_celda.innerHTML=dias[i];
        }
        div_fechas=new Element('div',{
        }).inject(this.contenedor);
        div_fechas.addClass('calendario_contenedor_dias');
        div_relativo=new Element('div',{
            styles: {
                'position': 'relative',
                'top': '0',
                'left': '0'
            }
        }).inject(div_fechas);
        this.div_dias=new Array();
        itop=42;
        var j;
        var pos_div=0;
        var pos_top=0;
        var pos_left_inicial=-7;
        var dia_semana=this.primer_dia_mes.get('day');
        var ancho=37;
        var alto=20;
        var pos_left=pos_left_inicial+(dia_semana*ancho);
        j=this.primer_dia_mes.get('day');
        for(i=0;i<31;i++){
            this.div_dias[pos_div]=new Element('div',{
                styles: {
                    'display': 'table-cell',
                    'position': 'absolute',
                    'top': pos_top+'px',
                    'left': pos_left+'px',
                    'width': ancho+'px',
                    'text-align': 'right'
                }
            }).inject(div_relativo);
            pos_div++;
            pos_left+=ancho;
            j++;
            if(!(j<7)){
                pos_top+=alto;
                pos_left=pos_left_inicial;
                j=0;
            }
        }
        var itop=this.hoy.get('lastdayofmonth');
        pos_div=0;
        for(i=1;i<=itop;i++){
            this.div_dias[pos_div].innerHTML='';
            span=new Element('span',{
            }).inject(this.div_dias[pos_div]);
            span.addClass('calendario_dia_normal');
            span.innerHTML=i;
            pos_div++;
        }
        for(i=itop;i<31;i++){
            this.div_dias[i].innerHTML='&nbsp;';
        }
    },
    mostrarEvento: function(dia){
        var fecha=this.primer_dia_mes.clone();
        fecha.set('date',parseInt(dia));
        var year=fecha.get('fullyear');
        var month=fecha.get('month')+1;
        var day=parseInt(dia);
        var dia_semana=this.diaToString(fecha.get('day'));
        if(month<10){
            month='0'+month;
        }
        if(day<10){
            day='0'+day;
        }
        this.div_fecha_evento.innerHTML=day+'.'+month+'.'+year+' '+dia_semana;
        month=fecha.get('month')+1;
        this.div_texto_evento.innerHTML=this.eventos[year][month][parseInt(dia)];
        this.div_evento.morph({'width': 262,'height': 169});
        this.div_fondo_evento.morph({'width': 262,'height': 172});
    },
    ocultarEvento: function(){
        this.div_evento.morph({'width': 0,'height': 0});
        this.div_fondo_evento.morph({'width': 0,'height': 0});
    },
    actualizarDias: function(){
        var year=this.primer_dia_mes.get('fullyear');
        var month=this.primer_dia_mes.get('month')+1;
        this.div_mes.innerHTML=this.mesToString(this.primer_dia_mes.get('month'))+' '+this.primer_dia_mes.get('fullyear');
        var itop=this.primer_dia_mes.get('lastdayofmonth');
        var i,span,mes_actual=(this.hoy.get('fullyear')==this.primer_dia_mes.get('fullyear'))&&(this.hoy.get('month')==this.primer_dia_mes.get('month'));
        if(this.eventos[year]==null){
            this.eventos[year]=new Array();
        }
        var tiene_eventos=this.eventos[year][month]!=null;
        var yo=this;
        for(i=itop;i<31;i++){
            this.div_dias[i].innerHTML='&nbsp;';
        }
        for(i=0;i<itop;i++){
            this.div_dias[i].innerHTML='';
            span=new Element('span',{
            }).inject(this.div_dias[i]);
            span.addClass('calendario_dia_normal');
            if(mes_actual&&(this.hoy.get('date')==(i+1))){
                span.addClass('calendario_dia_actual');
            }
            if(tiene_eventos&&this.eventos[year][month][i+1]!=null){
                span.addClass('calendario_dia_evento');
                span.addEvent('click',function(){
                    yo.mostrarEvento(this.innerHTML);
                });
            }
            pos_div++;
            span.innerHTML=(i+1);
        }
        var pos_div=0;
        var pos_top=0;
        var pos_left_inicial=-7;
        var dia_semana=this.primer_dia_mes.get('day');
        var ancho=37;
        var alto=20;
        var pos_left=pos_left_inicial+(dia_semana*ancho);
        var j=this.primer_dia_mes.get('day');
        for(i=0;i<31;i++){
            this.div_dias[pos_div].morph({top: pos_top, left: pos_left});
            pos_div++;
            pos_left+=ancho;
            j++;
            if(!(j<7)){
                pos_top+=alto;
                pos_left=pos_left_inicial;
                j=0;
            }
        }
    },
    anteriorMes: function(){
        this.primer_dia_mes.decrement('month');
        this.actualizarDias();
        this.pedirDatosMes();
    },
    siguienteMes: function(){
        this.primer_dia_mes.increment('month');
        this.actualizarDias();
        this.pedirDatosMes();
    },
    mesToString: function(mes){
        switch(mes){
            case 0:
                return 'Enero';
            case 1:
                return 'Febrero';
            case 2:
                return 'Marzo';
            case 3:
                return 'Abril';
            case 4:
                return 'Mayo';
            case 5:
                return 'Junio';
            case 6:
                return 'Julio';
            case 7:
                return 'Agosto';
            case 8:
                return 'Septiembre';
            case 9:
                return 'Octubre';
            case 10:
                return 'Noviembre';
            case 11:
                return 'Diciembre';
        }
        return null;
    },
    diaToString: function(mes){
        switch(mes){
            case 0:
                return 'Domingo';
            case 1:
                return 'Lunes';
            case 2:
                return 'Martes';
            case 3:
                return 'Miercoles';
            case 4:
                return 'Jueves';
            case 5:
                return 'Viernes';
            case 6:
                return 'Sabado';
        }
        return null;
    }
});
