﻿Tesla.UI.Calendario = function(id, greatBoxID, labelMesID, uLDiasID) {
    this.ids = { id: id, greatBoxID: greatBoxID, labelMesID: labelMesID, uLDiasID: uLDiasID };
    this.CurrentYear = 2009;
    this.CurrentMonth = 4;
    this.CurrentDate = new Date(2009, 4, 1);
    this.OnMonthChanged = null;
    this.OnDaySelected = null;
    this.Events = null;
    this.Holidays = null;
    this.GetControl = function(id) {
        return document.getElementById(id);
    }
    this.SetDate = function(dt) {
        this.CurrentDate = dt;
        this.CurrentYear = dt.getFullYear();
        this.CurrentMonth = dt.getMonth();
    }
    this.Show = function() {
        this.MonthChanged();
        this.Refresh();
    }
    this.GoToPreviousMonth = function() {
        this.CurrentMonth--; if (this.CurrentMonth < 0) { this.CurrentMonth = 11; this.CurrentYear--; }
        this.MonthChanged();
        this.Refresh();
    }
    this.GoToNextMonth = function() {
        this.CurrentMonth++; if (this.CurrentMonth > 11) { this.CurrentMonth = 0; this.CurrentYear++; }
        this.MonthChanged();
        this.Refresh();
    }
    this.MonthChanged = function() {
        this.CurrentDate = new Date(this.CurrentYear, this.CurrentMonth, 1);
        if (this.OnMonthChanged) this.OnMonthChanged();
    }
    this.SelectDay = function(li, date) {
        //Executado ao clicar no dia, seleciona o dia no calendário e roda evento OnDaySelected()
        this.CurrentDate = date;

        //Marca o dia selecionado no calendário
        this.MarkDay(date.getDate());

        if (this.OnDaySelected) this.OnDaySelected();
    }
    this.MarkDay = function(day) {
        //Marca o dia selecionado no calendário
        var ulDias = this.GetControl(this.ids.uLDiasID);
        var listaLiDias = ulDias.childNodes;
        for (var i = 0; i < listaLiDias.length; i++) {
            this.MarkLiDay(listaLiDias[i], i + 1 == day);
        }
    }
    this.MarkLiDay = function(li, mark) {
        var marked = (li.className.indexOf('selecionado') != -1);
        if (!marked) {
            if (mark) {
                li.className = li.className + ' selecionado';
            }
            else {
                //ok
            }
        }
        else {
            if (mark) {
                //ok
            }
            else {
                //ok
                li.className = li.className.replace(' selecionado', '');
            }
        }
    }
    this.Refresh = function() {
        this.GetControl(this.ids.labelMesID).innerHTML = this.CurrentDate.ToString("MMMM yyyy");
        var ulDias = this.GetControl(this.ids.uLDiasID);
        var dtInicio = new Date(this.CurrentYear, this.CurrentMonth, 1);
        ulDias.className = 'lista_dias inicio_' + ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sab'][dtInicio.getDay()];
        var diasNoMes = this.GetDaysInMonth(this.CurrentYear, this.CurrentMonth);
        ulDias.innerHTML = '';
        for (var i = 1; i <= diasNoMes; i++) {
            var date = new Date(this.CurrentYear, this.CurrentMonth, i);

            var diaStyle = 'dia_comum';

            if (i == 1)
                diaStyle = diaStyle + ' primeiro';

            var hasEvents = this.HasEvents(date);
            var hasHolidays = this.HasHolidays(date);

            if (hasEvents && hasHolidays)
                diaStyle = diaStyle + ' eventos_feriados';
            else if (hasEvents)
                diaStyle = diaStyle + ' eventos';
            else if (hasHolidays)
                diaStyle = diaStyle + ' feriados';

            var li = this.CreateLiDia(this, i, date, diaStyle);
            ulDias.appendChild(li);
        }

        var primeiroDia = new Date(this.CurrentYear, this.CurrentMonth, 1);
        var qtdDiasMes = this.GetDaysInMonth(this.CurrentYear, this.CurrentMonth);
        var primeiraSemanaMes = primeiroDia.getDay();

        if ((primeiraSemanaMes == 5 && qtdDiasMes == 30) || (primeiraSemanaMes >= 5 && qtdDiasMes == 31)) {
            ulDias.style.height = '150px';
        } else {
            ulDias.style.height = '125px';
        }
    }

    this.GetDaysInMonth = function(year, month) {
        var dias = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        if ((month == 1) && (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) return 29;
        return dias[month];
    }
    this.CreateLiDia = function(calendar, dia, date, css) {
        var ret = document.createElement('li');
        ret.innerHTML = dia;
        ret.date = date;
        ret.className = css;
        ret.calendar = calendar;
        ret.onclick = function(e) { this.calendar.SelectDay(this, this.date); return false; };
        return ret;
    }
    this.HasEvents = function(date) {
        return (this.GetEvents(date).length > 0);
    }
    this.GetEvents = function(date) {
        var ret = [];
        if (this.Events) {
            for (var i = 0; i < this.Events.length; i++) {
                var dt = this.Events[i].Data;
                if (dt.getDate() == date.getDate() && dt.getMonth() == date.getMonth() && dt.getFullYear() == date.getFullYear())
                    ret.push(this.Events[i]);
            }
        }
        return ret;
    }
    this.HasHolidays = function(date) {
        return (this.GetHolidays(date).length > 0);
    }
    this.GetHolidays = function(date) {
        var ret = [];
        if (this.Holidays) {
            for (var i = 0; i < this.Holidays.length; i++) {
                var dt = this.Holidays[i].Data;
                if (dt.getDate() == date.getDate() && dt.getMonth() == date.getMonth() && dt.getFullYear() == date.getFullYear())
                    ret.push(this.Events[i]);
            }
        }
        return ret;
    }
}
Tesla.UI.Evento = function(data, detalhe)
{   
    this.Data = data;
    this.Detalhe = detalhe;
}
