/*
 jQuery Time Picker v0.1
 Creado por Diego Lago (beosman@gmail.com).
 Copyright (C) 2008 Diego Lago (http://beosman.dyndns.org/proyectos/timepicker)
 Fecha: 2008-05-27
 Licencia: GPLv3 (http://www.gnu.org/licenses/gpl-3.0.html)

 Requiere:	jQuery v1.2.6+ (http://jquery.com)
 			jQuery Mousewheel v3.0+ (http://plugins.jquery.com/project/mousewheel)
 */
(function($){
    jQuery.fn.timepicker = function(options){

        // Opciones varias que de momento no funcionan
        var options = options;

        // El control donde va a salir el selector (un input generalmente)
        this.control = null;

        // Inicializamos la hora
        var date = new Date();
        this.hour = date.getHours();
        if (this.hour < 10) {
            this.hour = "0" + this.hour;
        }
        this.minute = date.getMinutes();
        if (this.minute < 10) {
            this.minute = "0" + this.minute;
        }

        // Texto de ayuda como 'tip' para que se pueda traducir c贸modamente
        var hourHelpText = "Usa la rueda del rat髇 para cambiar la hora";
        var minuteHelpText = "Usa la rueda del rat髇 para cambiar los minutos";

        // El elemento del DOM que se a帽ade
        this.timePickerElement = "<div id=\"__timepicker\" style=\"position: fixed; display:none;\" class=\"timepicker\"><span title=\"" + hourHelpText + "\" class=\"hours\">" + this.hour + "</span>:<span title=\"" + minuteHelpText + "\" class=\"minutes\">" + this.minute + "</span></div>";

        // A帽adimos el elemento al DOM
        jQuery("body").append(this.timePickerElement);

		// En IE se env铆an 4 eventos por cada toque en la rueda. Este contador es para que
		// s贸lo cuente 1. Esto deber铆a estar puesto como una opci贸n.
		counter = 3;
		contador = 0;
        // Asignamos el evento a las horas de la rueda del rat贸n
        jQuery("div#__timepicker .hours").mousewheel(function(event, delta){
			if(contador>0){
				contador = 0;
				return false;
			}
        	var html = jQuery(this).html();
            contador++;
            val = parseInt(html, 10); // si no pones 10 y el n煤mero comienza por 0 se considera octal
//             sum = val + parseInt(delta);  // el parseInt es porque en Firefox de Windows es un float (1,6666 y -1,6666)
//			if(jQuery.browser.msie) {
				// En IE cada vez que se produce toque en la rueda del rat贸n, se env铆an 4 eventos por lo que
				// se restaban 4 del valor, de ah铆 esta chapuza con el contador.
//				if(counter == 0) {
//					sum = val + (delta < 0 ? -1 : 1);
//					counter = 3;
//				} else {
//					sum = val;
//					counter--;
//				}
//			} else {
				sum = val + (delta < 0 ? -1 : 1);
//			}
            modulo = sum % 24;
            if (modulo <= -1) {
                modulo = 23;
            }
            jQuery.fn.timepicker.hour = (modulo < 10 ? "0" : "") + modulo.toString();
            jQuery(this).html(jQuery.fn.timepicker.hour);
            if (jQuery.fn.timepicker.control != null) {
                jQuery(jQuery.fn.timepicker.control).val(jQuery.fn.timepicker.hour + ":" + jQuery.fn.timepicker.minute);
            }
        });

        // Asignamos el evento a los minutos de la rueda del rat贸n
        jQuery("div#__timepicker .minutes").mousewheel(function(event, delta){
            if(contador>0){
				contador = 0;
				return false;
			}
        	var html = jQuery(this).html();
            contador++;
            val = parseInt(html, 10); // si no pones 10 y el n煤mero comienza por 0 se considera octal
//             sum = val + parseInt(delta);  // el parseInt es porque en Firefox en Windows es un float (-1,6666 y 1,6666)
//			if(jQuery.browser.msie) {
				// En IE cada vez que se produce toque en la rueda del rat贸n, se env铆an 4 eventos por lo que
				// se restaban 4 del valor, de ah铆 esta chapuza con el contador.
//				if(counter == 0) {
//					sum = val + (delta < 0 ? -1 : 1);
//					counter = 3;
//				} else {
//					sum = val;
//					counter--;
//				}
//			} else {
				sum = val + (delta < 0 ? -1 : 1);
//			}
            modulo = sum % 60;
            if (modulo <= -1) {
                modulo = 59;
            }
            jQuery.fn.timepicker.minute = (modulo < 10 ? "0" : "") + modulo.toString();
            jQuery(this).html(jQuery.fn.timepicker.minute);
            if (jQuery.fn.timepicker.control != null) {
                jQuery(jQuery.fn.timepicker.control).val(jQuery.fn.timepicker.hour + ":" + jQuery.fn.timepicker.minute);
            }
        });

        // Funci贸n que actualiza la hora en el selector dado el propio elemento,
		// las horas y los minutos.
        function updateTime(elem, hour, minute){
            jQuery(elem).find("span.hours").html(hour);
            jQuery(elem).find("span.minutes").html(minute);
        }

        // Funci贸n que muestra el elemento (div selector) debajo del input
		// donde est谩 la hora y donde se va a asignar. Se le pasa el propio
		// elemento a mostrar. La posici贸n se calcula seg煤n el input que es
		// una variable de instancia.
        function showTimePicker(elem){
            var control = jQuery.fn.timepicker.control;
            var offset = jQuery(control).offset();
            var height = jQuery(control).height();
            var scrollY = jQuery(window).scrollTop();
            jQuery(elem).css("position", "absolute");
            jQuery(elem).css("top", (offset.top + height + 5) + "px");
            jQuery(elem).css("left", offset.left + "px");
            jQuery(elem).show();
        }

        // Dada la cadena del input, se devuelve un array con la hora y los minutos
        // o la hora actual en caso de que sea una hora v谩lida (HH:MM).
        function getTimeFromString(value){
            var result = new Array();
            if (value == "" || value == null || value == 'undefined') {
                var date = new Date();
                hour = date.getHours();
                if (hour < 10) {
                    hour = "0" + hour;
                }
                minute = date.getMinutes();
                if (minute < 10) {
                    minute = "0" + minute;
                }
                result['hour'] = hour;
                result['minute'] = minute;
            }
            else {
                var inputTime = value.split(":");
                hour = parseInt(inputTime[0], 10);
                minute = parseInt(inputTime[1], 10);
                if (isNaN(hour) || isNaN(minute)) {
                    var date = new Date();
                    hour = date.getHours();
                    minute = date.getMinutes();
                }
                else
                    if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
                        var date = new Date();
                        hour = date.getHours();
                        minute = date.getMinutes();
                    }
                if (hour < 10) {
                    hour = "0" + hour;
                }
                if (minute < 10) {
                    minute = "0" + minute;
                }
                result['hour'] = hour;
                result['minute'] = minute;
            }
            return result;
        }

        // Asigna la hora de un input, bien construida, al selector. Se le pasa
		// como par谩metro el input donde est谩 la hora y donde hay que ponerla.
        function assignTimeFromTo(input, to){
            var value = jQuery(input).val();
            var result = getTimeFromString(value);
            jQuery.fn.timepicker.hour = result['hour'];
            jQuery.fn.timepicker.minute = result['minute'];
            updateTime(to, result['hour'], result['minute']);
        }

        // El quiz del plugin de jQuery. Para cada elemento del selector de jQuery
        // se asignan los eventos.
        this.each(function(){
            // Evento al ganar el foco -> se muestra el selector
            jQuery(this).bind("focus", function(){
                jQuery.fn.timepicker.control = this;
                var item = jQuery("div#__timepicker");
                assignTimeFromTo(jQuery.fn.timepicker.control, item);
                showTimePicker(item);
            });

            // Evento al perder el foco -> se oculta el selector
            jQuery(this).bind("blur", function(){
                jQuery("div#__timepicker").hide();
                jQuery.fn.timepicker.control = null;
            });

            // Evento al cambiar la hora a mano -> si es v谩lida (lo comprueba
            // la funci贸n "assignTimeFromTo") se asigna al selector de hora.
            jQuery(this).bind("keyup", function(){
                var item = jQuery("div#__timepicker");
                assignTimeFromTo(jQuery.fn.timepicker.control, item);
            });
        });

        // Devolvemos jQuery.
        return this;
    }
})(jQuery);

