/*Autor: Luis Carlos Sanchez Gonzalez
 *Este plugin transforma un datepicker en un componente tipo agenda que resalta
 *las fechas en las que se encuentran registrados uno o varios eventos
 *
 *Modo de Uso:
 *
 *eventosCss: Es el conjunto de reglas de estilo que se le aplicaran a los dias
 *            en los que se encuentra registrado algun evento.
 *soloEventos: Es un valor booleano que determina si solo se genera el evento onSelect
 *             para los dias en los que se encuentre registrado algun evento.
 *getDiasEventos: Es la funcion que se ejecuta para obtener los dias en los que
 *                se encuentran registrados eventos, los parametros son el aņo y
 *                el mes.
 *getMensajeToolTip: Es la funcion que se ejecutara para formatear la salida de los
 *                   eventos que sera mostrada en el tooltip recibe un arreglo de
 *                   objetos javascript.
 *configuracionDatePciker: Es la configuracion del datepicker.
 *
 *Ejemplo:
 *
 *$('#datepicker').Agenda({
 *  soloEventos:true,
 *	getDiasEventos:function(year,month){
 *      return [{dia:1,eventos:[{Hora:"9:30",Lugar:"Salon artesanias"},{Hora:"10:30",Lugar:"Salon Esmeralda"}]},{dia:2,eventos:[{Hora:"9:30",Lugar:"Salon artesanias"},{Hora:"10:30",Lugar:"Salon Esmeralda"}]},{dia:5,eventos:[{Hora:"9:30",Lugar:"Salon artesanias"},{Hora:"10:30",Lugar:"Salon Esmeralda"}]},{dia:10,eventos:[{Hora:"9:30",Lugar:"Salon artesanias"},{Hora:"10:30",Lugar:"Salon Esmeralda"}]}];
 *  },
 *  getMensajeToolTip:function(eventosDia){
 *      var mensaje = "";
 *		for(var i =0;i<eventosDia.length;i++){
 *          for(var j in eventosDia[i]){
 *              mensaje += j+": "+eventosDia[i][j]+" ";
 *          }
 *          mensaje += "<br/>";
 *          }
 *          return mensaje;
 *  },
 *  onSelect:function(dateText, inst){
 *      alert(dateText);
 *  }
 *});
 **/
(function($) {
    $.fn.Agenda = function(config) {
        var configuracion = $.extend({}, $.fn.Agenda.defaults, config);
        var configuracionDatePciker = {
            onChangeMonthYear: function(year, month, inst) {
                var diasEventos = configuracion.getDiasEventos(year,month);
                resaltarDiasEventos(diasEventos, true, configuracion);
            },
            onSelect: function(dateText, inst){
                var parametrosFecha = dateText.split('/');
                var diasEventos = configuracion.getDiasEventos(parametrosFecha[2],parametrosFecha[0]);
                resaltarDiasEventos(diasEventos, true, configuracion);
                if(configuracion.soloEventos){
                    $(".ui-datepicker-calendar td a:contains('"+parseInt(parametrosFecha[1],10)+"')").each(function(){
                        if($(this).text() == parseInt(parametrosFecha[1],10)){
                            if($(this).hasClass('evento')){
                                configuracion.onSelect(dateText, inst);
                            }
                        }
                    });
                }else{
                    configuracion.onSelect(dateText, inst);
                }
            }
        } ;
        configuracionDatePciker = $.extend({}, configuracionDatePciker, configuracion.configuracionDatePciker);
        $(this).datepicker(configuracionDatePciker);
    }
    $.fn.Agenda.defaults = {
        eventosCss: {
            'color':'red'
        },
        soloEventos: false,
        configuracionDatePciker:{},
        getDiasEventos:function(year,month){
            return [];
        },
        getMensajeToolTip:function(eventosDia){
            var mensaje = "";
            for(var i =0;i<eventosDia.length;i++){
                for(var j in eventosDia[i]){
                    mensaje += j+": "+eventosDia[i][j]+" ";
                }
                mensaje += "<br/>";
            }
            return mensaje;
        }
    }
    function indexOf(array, searchedValue){
        for(var i=0;array.length;i++){
            if(searchedValue == array[i]){
                return i;
            }
        }
        return -1;
    }
    function resaltarDiasEventos(dias, esperar, configuracion){
        if(!esperar){
            for(var i=0;i<dias.length;i++){
                $(".ui-datepicker-calendar td a:contains('"+dias[i].dia+"')").each(function(){
                    if($(this).text() == dias[i].dia){
                        $(this).css(configuracion.eventosCss);
                        $(this).addClass('evento');
                        var eventos = dias[i].eventos;
                        $(this).tooltip({
                            bodyHandler: function() {
                                return configuracion.getMensajeToolTip(eventos);
                            },
                            showURL: false
                        });
                    }
                });
            }
        }else{
            setTimeout(function(){
                resaltarDiasEventos(dias, false, configuracion)
            }, 1);
        }
    }
})(jQuery);
