/* This notice must be untouched at all times.

RodgerCalendar v. 1.0

Copyright (c) 2007 Glauber Rodger. All rights reserved.
Created 07.03.2007 by Glauber Rodger (bluebossa.art.br)
Last modified: 07.03.2007

Easy-to-use crossbrowser calendar with Google Calendar™ integration.
It uses Walter Zorn's WZ Tooltip (v4.11) javascript library for tool tips.

Special thanks to Basic Calendar-By Brian Gosselin (scriptasylum.com/bgaudiodr)

*/

Calendario = {
    bed             : null,
    minAno          : 2006,
    maxAno          : 2008,
    mes             : null,
    ano             : null,
    classPrincipal  : "classPrincipal",
    classMes        : "classMes",
    classDiasSemana : "classDiasSemana",
    classDia        : "classDia",
    ultimoDiaMes    : null,
    arrayMeses      : ['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
    dim             : [31,0,31,30,31,30,31,31,30,31,30,31],
    borda           : 0,
    gCalendarURL    : null,
    gCalStartDate   : null,
    gCalEndDate     : null,
    eventosDia      : new Array(31),
    flProcessing    : false,
    qtLetrasDias    : 3,

    buildCalendar: function(mes, ano, bed){

        Calendario.eventosDia = new Array(31);
        if (!mes) return false;
        if (!ano) return false;
        if (!bed) return false;

        Calendario.mes = mes;
        Calendario.ano = ano;
        Calendario.bed = bed;

        var bgC, diaCorrente;
        var diaSemana = 0;
        var oD            = new Date(ano, mes-1, 1);
        oD.od             = oD.getDay() + 1;

        var dataAtual     = new Date();
        var buscaDiaAtual = (ano == dataAtual.getFullYear() && mes == dataAtual.getMonth()+1) ? dataAtual.getDate() : 0;

        Calendario.dim[1] = (((oD.getFullYear()%100!=0) && (oD.getFullYear()%4==0)) || (oD.getFullYear()%400 == 0)) ? 29 : 28;

        var html;
        html  = '<div class="'+Calendario.classPrincipal+'"><table class="'+Calendario.classPrincipal+'" cols="7" cellpadding="0" border="'+Calendario.borda+'" cellspacing="0"><tr align="center">';
        html += '<td class="'+Calendario.classMes+'" style="background:url(imagens/calbgtl.gif) top left no-repeat #d7d8da; ';
        if(ano==Calendario.minAno&&mes==1)html+='">';else html+='cursor:pointer;" onclick="Calendario.getPreviousMonth()">&laquo;';
        html += '</td>';
        html += '<td colspan="5" align="center" class="'+Calendario.classMes+'">'+Calendario.arrayMeses[mes-1].toLowerCase()+' '+ano+'</td>';
        html += '<td class="'+Calendario.classMes+'" style="background:url(imagens/calbgtr.gif) top right no-repeat #d7d8da; ';
        if(ano==Calendario.maxAno&&mes==12)html+='"></td>';else html += 'cursor:pointer;" onclick="Calendario.getNextMonth()">&raquo;';
        html += '</td></tr><tr align="center">';
        for(s=0;s<21;s=s+3)html+='<td class="'+Calendario.classDiasSemana+'">'+"DomSegTerQuaQuiSexSáb".substr(s,Calendario.qtLetrasDias)+'</td>';
        html += '</tr><tr align="center">';
        for(i=1;i<=42;i++){
            diaSemana++;
            var x = ((i-oD.od>=0)&&(i-oD.od < Calendario.dim[mes-1]))? i-oD.od+1 : '&nbsp;';
            if (x == buscaDiaAtual){
                if(x.toString().length==1)x="0"+x;
                html += '<td id="dia'+x+'" class="'+Calendario.classDia+'" style="cursor:default;">' + x + '</td>';
            }else{
                diaCorrente = (x!="&nbsp;") ? x : "";
                if(diaCorrente.toString().length==1)diaCorrente="0"+diaCorrente;
                bgC = Calendario.getTDBgColor(diaSemana);
                html += '<td id="dia'+diaCorrente+'" class="'+Calendario.classDia+'" style="background-color:'+bgC+';cursor:default;';
                if(i>=36){
                    html += 'line-height:5px;';
                    if(i==36) html += 'background:url(imagens/calbgbl.gif) bottom left no-repeat #dedfe1;';
                    else if(i==42) html += 'background:url(imagens/calbgbr.gif) bottom right no-repeat #dedfe1;';
                }
                html += '">' + x + '</td>';
            }
            if(((i)%7==0)&&(i<36))
                html += '</tr><tr align="center">';
            if(x!="&nbsp;")Calendario.ultimoDiaMes=x;
            if(i%7==0)diaSemana=0;
        }
        html += '</tr></table></div>';
        bed.innerHTML = html;

        Calendario.getGoogleCalendarEvents(mes,ano);

    },

    getEventInfo: function(conteudo, diaTxt){
        return function(){Tip(
            conteudo,
            BGCOLOR, '#fff',
            WIDTH, 150,
            CLICKCLOSE, true,
            CLOSEBTN, true,
            CLOSEBTNCOLORS, ['', '#fff', '#cccdcf', '#fff'],
            STICKY, true,
            BORDERWIDTH, 0,
            SHADOW, false,
            FONTSIZE, '10px',
            FONTCOLOR, '#9f9fa2',
            FONTFACE, 'Verdana',
            TITLE, '<span style=\'float:left\'>'+diaTxt+'</span>',
            TITLEBGCOLOR, '#cccdcf',
            TITLEFONTCOLOR, '#77777b',
            TITLEFONTFACE, 'Verdana',
            TITLEFONTSIZE, '10px',
            PADDING, 10);
        }
    },

    getTDBgColor: function(diaSemana) {
        switch(diaSemana){
            case 1:
                return "#dedfe1";
            case 2:
                return "#e6e7e9";
            case 3:
                return "#e8e8ea";
            case 4:
                return "#e9e9eb";
            case 5:
                return "#eaeaec";
            case 6:
                return "#ebebed";
            case 7:
                return "#dedfe1";
        }
    },

    getPreviousMonth: function() {
        if(!Calendario.flProcessing){
            if(Calendario.mes==1){Calendario.ano--;Calendario.mes=12;}else Calendario.mes--;
            Calendario.buildCalendar(Calendario.mes,Calendario.ano,Calendario.bed);
        }
    },

    getNextMonth: function(){
        if(!Calendario.flProcessing){
            if(Calendario.mes==12){Calendario.ano++;Calendario.mes=1;}else Calendario.mes++;
            Calendario.buildCalendar(Calendario.mes,Calendario.ano,Calendario.bed);
        }
    },

    getGoogleCalendarEvents: function(mes,ano){
        Calendario.flProcessing = true;
        if (!Calendario.gCalendarURL||!mes) return false;
        if(mes.toString().length==1)mes="0"+mes;
        var urlGCalendar = "";
        var startDate    = "&start-min="+ano+"-"+mes+"-01T00:00:00";
        var endDate      = "&start-max="+ano+"-"+mes+"-"+Calendario.ultimoDiaMes+"T23:59:59";
        var callBack     = "&callback=Calendario.getEventos";
        urlGCalendar     = Calendario.gCalendarURL+callBack+startDate+endDate;

        var head    = document.getElementsByTagName('head').item(0);
        var script  = document.createElement('script');
    	script.src  = urlGCalendar;
    	script.type = 'text/javascript';
    	script.id   = 'gCalScript';
    	void(head.appendChild(script));

    },

    xBrowserAddHandler: function(target,eventName,handlerName) { 
        if(target.addEventListener){ 
            target.addEventListener(eventName, function(e){target[handlerName](e);}, false);
        }else if(target.attachEvent){ 
            target.attachEvent("on" + eventName, function(e){target[handlerName](e);});
        }else{
            var originalHandler = target["on" + eventName]; 
            if(originalHandler ){ 
                target["on" + eventName] = function(e){originalHandler(e);target[handlerName](e);}; 
            }else{ 
                target["on" + eventName] = target[handlerName]; 
            } 
        } 
    },

    addEventoDia: function(dia, objEvento){
        var x;
        if(dia.toString().substring(0,1)=="0")dia=parseInt(dia.toString().substring(1,2));
        if (Calendario.eventosDia[dia]==undefined)
            Calendario.eventosDia[dia] = new Array();
        Calendario.eventosDia[dia][Calendario.eventosDia[dia].length] = objEvento;
    },

    createTips: function(){
        var i, j, title, diaTxt, objEvento, conteudo, d, horaInicio, horaFim;
        for(i=1;i<=Calendario.eventosDia.length;i++){
            if(Calendario.eventosDia[i]!=undefined){
                conteudo = "<table style='font-family:Tahoma;font-size:10px;'>";
                for(j=0;j<Calendario.eventosDia[i].length;j++){
                    objEvento = Calendario.eventosDia[i][j];
                    diaTxt = i+' de '+Calendario.arrayMeses[parseFloat(objEvento.gd$when[0].startTime.substring(5,7))-1].toLowerCase();

                    //Evento tem horário de duração
                    if(objEvento.gd$when[0].startTime.length>10){
                        horaInicio = objEvento.gd$when[0].startTime.substring(11,16);
                        horaFim    = objEvento.gd$when[0].endTime.substring(11,16);
                        horaInicio = horaInicio.replace(":","h");
                        horaFim    = horaFim.replace(":","h");
                        if(horaInicio.substring(3,5)=="00")horaInicio = horaInicio.substring(0,2)+"h";
                        if(horaInicio.substring(0,1)=="0")horaInicio = horaInicio.substring(1,horaInicio.length);
                        if(horaFim.substring(3,5)=="00")horaFim = horaFim.substring(0,2)+"h";
                    }

                    //if(Calendario.eventosDia[i].length>1){
                        //conteudo += "&middot; "+objEvento.title.$t+"<br>";
                        conteudo += '<tr>';
                        if(horaInicio!=null){
                            conteudo += '   <td valign="top" style="color:#000">';
                            conteudo +=         horaInicio
                            conteudo += '   </td>';
                        }
                        conteudo += '   <td ';
                        if(horaInicio==null)
                            conteudo += 'colspan="2"';
                        conteudo += ' valign="top">';
                        conteudo +=         objEvento.title.$t;
                        conteudo += '   </td>';
                        conteudo += '</tr>';
                    //}else
                    //    conteudo += objEvento.title.$t+"<br>";
                }

                conteudo += '</table>';
                d=(i.toString().length==1)?"0"+i:i;
                $('dia'+d).tip = Calendario.getEventInfo(conteudo, diaTxt);
                Calendario.setEventStyle($('dia'+d));
                Calendario.xBrowserAddHandler($('dia'+d),"mouseover","tip"); 
            }
        }
        Calendario.flProcessing = false;
    },

    getEventos: function(obj){
        var i, j, k, diaInicio, diaFim, mesInicio, mesFim, entry;
        if(obj.feed.entry){
            for(i=0;i<obj.feed.entry.length;i++){
                entry     = obj.feed.entry[i];
                for(k=0;k<entry.gd$when.length;k++){
                    diaInicio = entry.gd$when[k].startTime.substring(8,10);
                    diaFim    = entry.gd$when[k].endTime.substring(8,10);
                    mesInicio = entry.gd$when[k].startTime.substring(5,7);
                    mesFim    = entry.gd$when[k].endTime.substring(5,7);
                    if(diaFim!=diaInicio && (parseFloat(diaFim)>(parseFloat(diaInicio)+1) ) || parseFloat(diaFim)<parseFloat(diaInicio)){
                        //Ends in next month
                        if(parseFloat(diaFim)<parseFloat(diaInicio)){
                            //Current month equals to start month
                            if(parseFloat(Calendario.mes) == parseFloat(mesInicio))
                                diaFim = Calendario.ultimoDiaMes+1;
                            else diaInicio = 1;
                        }
                        for(j=diaInicio;j<=parseFloat(diaFim)-1;j++)
                            Calendario.addEventoDia(j,entry);
                    }else{
                        if(Calendario.mes == mesInicio)
                            Calendario.addEventoDia(diaInicio,entry);
                    }
                }
            }
        }
        Calendario.createTips();
    },

    setEventStyle: function(dia){
        $(dia).style.backgroundColor = "#d7d8da";
        $(dia).style.color = "#000";
        $(dia).style.cursor = "pointer";
    }
}
