/************************************************************************
Dieses JavaScript initialisiert die Verwendung des Datepickers.

Alle input-Felder mit dem Type "text" und einer der Klassen 
  "date", 
  "date_birthday",
  "date_from" oder
  "date_to"
werden mit dem Datepicker erweitert.
*************************************************************************/


(function($) {

    /*
    Wandelt einen deutschen oder einen ISO-Datumsstring in ein Date-Objekt um.

    :param value: "1.1.2009" oder "01.01.2009" oder "2009-01-01"
    :return: Date-Objekt mit dem Datum oder "null". 
    */
    function string_to_date(value) {

        var splitted;
        var year;
        var month;
        var day;
        var date;

        try {
            if (typeof value == "string") {
                /* Text parsen und prüfen ob drei Werte vorhanden sind */        
                if (value.indexOf("-") > -1) {
                    // ISO-Datum
                    splitted = value.split("-");
                    if (!splitted.length === 3) {
                        return null;
                    }
                    year = parseInt(splitted[0], 10);
                    month = parseInt(splitted[1], 10) - 1;
                    day = parseInt(splitted[2], 10);
                } else if (value.indexOf(".") > -1) {
                    // Deutsches Datum
                    splitted = value.split(".");
                    if (!splitted.length == 3) {
                        return null;
                    }
                    day = parseInt(splitted[0], 10);
                    month = parseInt(splitted[1], 10) - 1;
                    year = parseInt(splitted[2], 10);
                } else {
                    // Fehler
                    return null; 
                }
                
                /* Prüfen ob die Werte in akzeptablen Grenzen liegen */
                // Achtung: Monat beginnt bei 0 
                if (!((day > 0) && (day < 32))) return null;
                if (!((month >= 0) && (month < 12))) return null; 

                /* Zusammen setzen */
                date = new Date(year, month, day);
                date.setFullYear(year);
                date.setMonth(month);
                date.setDate(day);
            } else {
                /* Datum direkt übernehmen */
                date = new Date(value);
            }
            
            /* Zurück geben */
            if (isNaN(date)) {
                return null;
            }
            if (date == "Invalid Date") {
                return null;
            }
            return date;
        } catch (e) {
            alert("Error: " + e);
            return null;
        }
    }
    

    /*
    Wandelt ein Datum in einen deutschen oder einen ISO-Datumsstring um.

    :param date: Date-Objekt
    :param language_code: Sprachcode (z.B. "de" oder "en") oder das Kürzel "iso"
    :return: String; entweder deutscher oder ISO-Datumsstring. 
    */
    function date_to_string(date, language_code) {

        if(!language_code) language_code = "de";
        
        var day_string;
        var month_string;
        var date_string;
        
        day_string = new String("0" + date.getDate());
        day_string = day_string.substr(day_string.length - 2);
        month_string = new String("0" + (date.getMonth() + 1));
        month_string = month_string.substr(month_string.length - 2);
        
        if (language_code == "de") {
            date_string = day_string + "." + month_string + "." + date.getFullYear();
        } else {
            date_string = date.getFullYear() + "-" + month_string + "-" + day_string;
        }
        
        return date_string;
    }


    /* 
    Flash als jQuery-Funktion 
    */
    jQuery.fn.short_flash = function() {
        this
            .animate({opacity: 0.25}, "fast")
            .animate({opacity: 1.0}, "fast")
            .animate({opacity: 0.25}, "fast")
            .animate({opacity: 1.0}, "fast")
        ;
        return this;
    }


    $(document).ready(function() {
        
        var language_code = $("html").attr("lang");
        var $datecontrols = $("input[type=text].date");
        var $datecontrols_birthday = $("input[type=text].date_birthday");
        var $datecontrols_from = $("input[type=text].date_from");
        var $datecontrols_to = $("input[type=text].date_to");
        var date_format = "dd.mm.yy"
        var id_counter = 0;
        var from_ids = [];
        
        // Sprach- und Standardeinstellungen
        $.datepicker.setDefaults($.datepicker.regional[""]);
        $.datepicker.setDefaults($.extend(
            $.datepicker.regional[language_code],
            {
                "showAnim": "",
                "dateFormat": date_format,
                "showMonthAfterYear": true,
                "changeMonth": true, 
                "changeYear": true
            }
        ));
        
        // Input-Felder initialisieren
        $datecontrols.datepicker({
            "yearRange": "-0y:+2y",
            "minDate": "-0d",
            "maxDate": "+2y"
        });
        $datecontrols_birthday.datepicker({
            "yearRange": "-100y:+0y",
            "minDate": "-100y",
            "maxDate": "-0d"
        });
        $datecontrols_from.datepicker({
            "yearRange": "-0y:+2y",
            "minDate": "-0d",
            "maxDate": "+2y"
        });
        $datecontrols_to.datepicker({
            "yearRange": "-0y:+2y",
            "minDate": "1d",
            "maxDate": "+2y"
        });
        
        // Direkte Bearbeitung der Datumsfelder verhindern
        $datecontrols.keypress(function() {
            return false;
        }); 
        $datecontrols_birthday.keypress(function() {
            return false;
        });  
        $datecontrols_from.keypress(function() {
            return false;
        });  
        $datecontrols_to.keypress(function() {
            return false;
        });  
        
        // Font-Size für Datepicker-Widgets setzen
        $("div.ui-datepicker").css("font-size", "80%");
        
        // IDs der From- und To-Controls in Arrays speichern
        $datecontrols_from.each(function() {
            from_ids[from_ids.length] = $(this).attr("id");
        });
        
        
        // Nachdem sich das Datum geändert hat, wird geprüft, ob das Von-Datum
        // auch wirklich vor dem Bis-Datum ist. Wenn nicht --> ausbessern.
        function check_from_to_date() {
            
            var DAY_MILLISECONDS = 60 * 60 * 24 * 1000;
            var $this = $(this);
            var id = $this.attr("id");
            var from_datestring = $datecontrols_from.val();
            var to_datestring = $datecontrols_to.val();
            var from_date = string_to_date(from_datestring);
            var to_date = string_to_date(to_datestring);
            var new_date = null;
            
            if (!from_datestring && !to_datestring) return;
            
            if ($.inArray(id, from_ids) > -1) {
                // Das aktuelle Steuerelement ist ein FROM
                if (!!from_date) {
                    if (
                        (!to_datestring) || 
                        (to_date.getTime() < (from_date.getTime() + DAY_MILLISECONDS))
                    ) {
                        new_date = new Date(from_date.getTime() + DAY_MILLISECONDS);
                        $datecontrols_to.val(date_to_string(new_date));
                        $datecontrols_to.short_flash();
                    }
                }
            } else {
                // Das aktuelle Steuerelement ist ein TO
                if (!!to_date) {
                    if (!from_datestring) {
                        new_date = new Date(to_date.getTime() - DAY_MILLISECONDS)
                        $datecontrols_from.val(date_to_string(new_date));
                        $datecontrols_from.short_flash();
                    } else {
                        if (to_date.getTime() < (from_date.getTime() + DAY_MILLISECONDS)) {
                            new_date = new Date(to_date.getTime() - DAY_MILLISECONDS);
                            $datecontrols_from.val(date_to_string(new_date));
                            $datecontrols_from.short_flash();
                        }
                    }
                }
            }
        }
        
        $datecontrols_from.change(check_from_to_date);
        $datecontrols_to.change(check_from_to_date);
    });
}(jQuery));


