/**
 * Klasse zum Anzeigen eines Kalenders (jQuery)
 * 
 * @author Daniel Lembicz
 */

/**
 * Konstruktor
 */

function TTCalendar (obj) {
    if (typeof obj.dateFromMin == 'undefined') {
        obj.dateFromMin = '0'
    }
    
    if (typeof obj.id != 'undefined') {
        this.idElement = obj.id;
    } else {
        this.idElement = obj.idFrom;
    }
    
    this.monthNames = [];
    this.dayNames = [];
    this.dayNamesMin = [];
    this.options = {};
    this.format = 'yy-mm-dd';
    this.currentDate = obj.curDate;
    this.idConnectedCal = obj.idConnectedCal;
    this.callbackFunction = obj.callback;
    this.dateFromMin = obj.dateFromMin;
    this.dateFromMax = obj.dateFromMax;
    this.callbackFooterContent = obj.callbackFooterContent;
    this.isWeekNameBeforeDate = false;
    this.weekNamesBeforeDate = ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'];
    
    // Umwandlung des Datumformates DD.MM.YYYY
    if (typeof obj.curDate == 'string') {
        var aTmp = obj.curDate.split('.');
        var aTmp2 = obj.curDate.split('_');
        
        if (aTmp.length == 3) {
            var date = new Date(aTmp[2], aTmp[1] - 1, aTmp[0]);
            this.currentDate = date.getTime() / 1000;
        } else if (aTmp2.length == 2) {
            // Angabe 100_days etc. -> Problem in ferien.js
            // var date = new Date();
            // this.currentDate = date.getTime();
            // this.currentDate = date.getTime() / 1000 + (86400 * aTmp2[0]);
        }        
    }
    
    this.init();
}

/**
 * Initialisierung
 */

TTCalendar.prototype.init = function(){
    var oDate = {};
    var idElement = this.idElement;
    var callbackFunction = this.callbackFunction;
    var idConnectedCalendar = this.idConnectedCal;
    
    this.dayNames = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'];
    this.dayNamesMin = ['SO', 'MO', 'DI', 'MI', 'DO', 'FR', 'SA'];
    this.monthNames = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
    
    /* Optionen setzen */
    this.options.monthNames = this.monthNames;
    this.options.dayNamesMin = this.dayNamesMin;
    this.options.dayNames = this.dayNames;
    this.options.firstDay = 1;
    this.format = 'dd/mm/yy';
    this.options.dateFormat = this.format;
    this.options.beforeShowDay = this.beforeShowDay;
    this.options.showAnim = 'fadeIn';
    this.options.showWeeks = true;
    this.options.nextText = '';
    this.options.prevText = '';
    
    /* Frühester Termin */
    TTCalendar.minDate = new Date(parseInt(this.dateFromMin) * 1000);        
    this.options.minDate = TTCalendar.minDate;     
      
    /* Spätester Termin */
    if (typeof this.dateFromMax != 'undefined') {
        TTCalendar.maxDate = new Date(parseInt(this.dateFromMax) * 1000);        
        this.options.maxDate = TTCalendar.maxDate;
    }
    
    if (typeof this.callbackFooterContent != 'undefined') {
        jQuery('#' + idElement).attr('cbContent', this.callbackFooterContent); 
    }
    
    var isWeekNameBeforeDate = this.isWeekNameBeforeDate;
    var weekDay = '';
    var pThis = this;
    
    this.options.onSelect = function(dateText, inst) {
        var date = new Date(inst.currentYear, inst.currentMonth, inst.currentDay);
        
        // Attribut-Feld im DOM-Baum setzen
        var tmpYear = inst.currentYear;
        var tmpMonth = inst.currentMonth + 1;
        var tmpDay = inst.currentDay;
        
        if (tmpMonth < 10) {
            tmpMonth = '0' + tmpMonth;
        }
        
        if (tmpDay < 10) {
            tmpDay = '0' + tmpDay;
        }
        
        jQuery('#' + idElement).attr('date', tmpYear + '-' + tmpMonth + '-' + tmpDay);
        dateText = tmpYear + '-' + tmpMonth + '-' + tmpDay;
        
        this.currentDate = date.getTime();
        // Rückkalender (Minimum-Date) auf den angeklickten Tag setzen
        if (typeof idConnectedCalendar != 'undefined') {
            var oldDate = jQuery('#' + idConnectedCalendar).datepicker('getDate');
            var tmpDate = oldDate;
            
            if (date > oldDate) {
                // Wenn HinTermin > Rücktermin, dann setze Hintermin + 22 Tage 
                var newDate = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 22);
                jQuery('#' + idConnectedCalendar).attr('date', newDate.getFullYear() + '-' + (newDate.getMonth() + 1) + '-' + newDate.getDate());
                jQuery('#' + idConnectedCalendar).datepicker('setDate', newDate);
                tmpDate = newDate;
            }
            
            // Wochentag soll vor das Datum gesetzt werden
            if (pThis.hasWeekNameBeforeDate()) {
                weekDay = pThis.getWeekName(tmpDate.getDay()) + ' ';
                jQuery('#' + idConnectedCalendar).datepicker('option', 'dateFormat', '\'' + weekDay + '\'' + pThis.format);
            } else {
                jQuery('#' + idConnectedCalendar).datepicker('option', 'dateFormat', pThis.format);
            }  
            
            jQuery('#' + idConnectedCalendar).datepicker('option', 'minDate', date);          
        }
        
        // Wochentag soll vor das Datum gesetzt werden
        if (pThis.hasWeekNameBeforeDate()) {
            weekDay = pThis.getWeekName(date.getDay()) + ' ';
            jQuery('#' + idElement).datepicker('option', 'dateFormat', '\'' + weekDay + '\'' + pThis.format);
        } else {
            jQuery('#' + idElement).datepicker('option', 'dateFormat', pThis.format);
        }    
        
        // Callback - Funktion bei Klick auf Datum
        if (typeof callbackFunction != 'undefined') {
            eval(callbackFunction + '(\'' + dateText + '\',\'' + idElement + '\')');
        }         
    };        
 
    /* Default-Datum setzen */
    var oDate = new Date(this.currentDate * 1000);
    this.setDateAttribute(oDate);
    this.options.defaultDate = oDate;
    
    // Bei Rückterminkalender muss das min-Date auf den den Current-Termin vom Hinkalender gesetzt werden
    var format = this.format;
    weekDay = '';
    
    // Wochentag soll vor das Datum gesetzt werden
    if (this.isWeekNameBeforeDate) {
        var weekDay = '\'' + this.getWeekName(oDate.getDay()) + ' ' + '\'';
    }    
   /* 
    setTimeout(function() {
        if (typeof idConnectedCalendar != 'undefined') {
            // Kalender wird über ein Input-Feld geöffnet
            if (jQuery('#' + idConnectedCalendar)[0].nodeName == 'INPUT') {
                jQuery('#' + idConnectedCalendar).datepicker('option', 'dateFormat', weekDay + format);
                jQuery('#' + idConnectedCalendar).datepicker('option', 'minDate', oDate);         
            }
        }        
    }, 500);*/
}

/**
 * Monatsnamen explizit festlegen
 */

TTCalendar.prototype.setMonthNames  = function(months) {
    this.options.monthNames = months;
}

/**
 * Wochennamen explizit festlegen (ausgeschrieben)
 */

TTCalendar.prototype.setWeekNamesFull  = function(weeks) {
    this.options.dayNames = weeks;
}

/**
 * Datums-Format explizit festlegen
 */

TTCalendar.prototype.setFormat  = function(format) {
    this.format = format;
    this.options.dateFormat = format;
}

/**
 * Wochennamen explizit festlegen (Kürzel)
 */

TTCalendar.prototype.setWeekNames  = function(weeks) {
    this.options.dayNamesMin = weeks;
}

/**
 * Wochenname ermitteln
 */

TTCalendar.prototype.getWeekName  = function(num) {
    return this.weekNamesBeforeDate[num];
}

/**
 * Wochentag vor das Datum schreiben (macht nur bei INPUT-Feldern Sinn)
 */

TTCalendar.prototype.showWeekNameBeforeDate = function(weekNames) {
    this.isWeekNameBeforeDate = true;
    this.weekNamesBeforeDate = weekNames;
}

/**
 * Überprüfen, ob Wochennamen vor das Datum bei Input-Feldern gesetzt werden soll
 */

TTCalendar.prototype.hasWeekNameBeforeDate = function() {
    return this.isWeekNameBeforeDate;
}

/**
 * Einfügen des Kalenders in den DOM-Baum
 */

TTCalendar.prototype.show  = function() {
    jQuery('#' + this.idElement).datepicker(this.options);
    
    // Kalender wird über ein Input-Feld geöffnet
    if (typeof jQuery('#' + this.idElement)[0] != 'undefined' && jQuery('#' + this.idElement)[0].nodeName == 'INPUT') {
        var date = this.options.defaultDate;
        var month = date.getMonth() + 1;
        var day = date.getDate();
        var weekDay = '';
            
        if (month < 10) {
            month = '0' + month;
        }
        
        if (day < 10) {
            day = '0' + day;
        }
        
        // Wochentag soll vor das Datum gesetzt werden
        if (this.isWeekNameBeforeDate) {
            weekDay = this.getWeekName(date.getDay()) + ' ';
        }
        
        // weitere Datumsformate müssen hier hinzugefügt werden
        if (this.format == 'dd.mm.yy') {
            jQuery('#' + this.idElement).val(weekDay + day + '.' + month + '.' + date.getFullYear());
        } else if (this.format == 'yy-mm-dd') {
            jQuery('#' + this.idElement).val(weekDay + date.getFullYear() + '-' + month + '-' + day);
        } else if (this.format == 'dd/mm/yy') {
            jQuery('#' + this.idElement).val(weekDay + day + '/' + month + '/' + date.getFullYear());
        } else {
            jQuery('#' + this.idElement).val(weekDay + date.getFullYear() + '-' + month + '-' + day);
        }
    }
}

/**
 * Kalender in Verbindung setzen (Hin/Rück)
 */

TTCalendar.prototype.updateHolidays  = function(state) {
    g_strFerienSelect = state;
    jQuery('#' + this.idElement).datepicker('option', 'buttonText', '');
    
    if (jQuery('#' + this.idElement)[0].nodeName == 'INPUT') {
        jQuery('#' + this.idElement).datepicker('show');
    }
}

/**
 * Call up a previously attached date picker.
 */

TTCalendar.prototype.call  = function() {
    jQuery('#' + this.idElement).datepicker('show');
}

/**
 * Setzt das date-Attribut im DOM-Baum
 */

TTCalendar.prototype.setDateAttribute  = function(oDate, elemId) {
    var tmpYear = oDate.getFullYear();
    var tmpMonth = oDate.getMonth() + 1;
    var tmpDay = oDate.getDate();
    
    if (tmpMonth < 10) {
        tmpMonth = '0' + tmpMonth;
    }
    
    if (tmpDay < 10) {
        tmpDay = '0' + tmpDay;
    }  
      
    if (typeof elemId == 'undefined') {
        elemId = this.idElement;
    }    
      
    jQuery('#' + elemId).attr('date', tmpYear + '-' + tmpMonth + '-' + tmpDay);
}

/**
 * Datum setzen
 */

TTCalendar.prototype.setDate = function(timestamp) {
    var oDate = new Date(timestamp * 1000);
    this.setDateAttribute(oDate);
    
    jQuery('#' + this.idElement).datepicker('setDate', oDate);
    
    // Kalender hat einen dazugehörigen Rückkalender
    if (this.idConnectedCal) {
        jQuery('#' + this.idConnectedCal).datepicker('option', 'minDate', oDate);
    }
    
    // Wochentag soll vor das Datum gesetzt werden
    if (this.isWeekNameBeforeDate) {
        var weekDay = this.getWeekName(oDate.getDay()) + ' ';
        var exp = eval('/' + weekDay + '/g');
        
        // weitere Datumsformate müssen hier hinzugefügt werden
        jQuery('#' + this.idElement).val(weekDay + jQuery('#' + this.idElement).val().replace(exp, ''));
        jQuery('#' + this.idElement).datepicker('setDate', oDate);
        
        // Kalender hat einen dazugehörigen Rückkalender
        if (this.idConnectedCal) {
            var dateConnected = jQuery('#' + this.idConnectedCal).datepicker('getDate');
            weekDay = this.getWeekName(dateConnected.getDay()) + ' ';
            jQuery('#' + this.idConnectedCal).val(weekDay + jQuery('#' + this.idConnectedCal).val().replace(exp, ''));   
        }
    }
}

/**
 * Datum erhalten
 */

TTCalendar.prototype.getDate = function() {
    return jQuery('#' + this.idElement).datepicker('getDate');
}

/**
 * Funktion wird automatisch aufgerufen, bevor der Kalender-Tag angezeigt wird
 */

TTCalendar.prototype.beforeShowDay = function(date) {
    var classNameDay        = 'ui-datepicker-holiday';
    var classNameHoliday    = 'ui-datepicker-day';
    
    // definitiv immer nur ein Mal pro Monat vorhanden
    if (date.getDate() == 15) {
        var tmpThis = this;
        setTimeout(function() {
            if (typeof jQuery(tmpThis).attr('cbContent') != 'undefined' && jQuery('#idDivOuter_').html() == null) {
                var retElem = eval(jQuery(tmpThis).attr('cbContent') + '()');
                var divOuter = document.createElement('div');
                divOuter.id = 'idDivOuter_';
                
                jQuery(divOuter).appendTo(jQuery('#ui-datepicker-div'));
                jQuery(retElem).appendTo(jQuery(divOuter));
            }
        }, 100);
    }
    
    /* Muss für die ferien.js so gesetzt sein */
    date.setHours(12,0,0,0);        
    
    /* Muss über das Attribut gesteuert werden weil man an dieser Stelle sonst 
     * keinen Zugriff auf das eindeutige Kalender-Objekt hat
     */
    var defaultDate = jQuery(this).attr('date');
    
    if (defaultDate != '') {
        var aDefaultDate = defaultDate.split('-');
        var oDate = new Date(aDefaultDate[0], parseFloat(aDefaultDate[1]) - 1, aDefaultDate[2], 12, 0, 0);        
    }
    
    /* Angeklicktes Datum */
    if (typeof oDate != 'undefined' && oDate.getTime() == date.getTime()) {
        classNameDay += ' ui-datepicker-current-day';
        classNameHoliday += ' ui-datepicker-current-day';
    }
    
    /* Angeklicktes Datum früher als Frühester Termin // oder später */
    if (date < TTCalendar.minDate || date > TTCalendar.maxDate) {
        classNameDay = ' ui-datepicker-unselectable';
        classNameHoliday = ' ui-datepicker-unselectable';        
    }
    
    if (typeof g_strFerienSelect != 'undefined' && g_strFerienSelect == '-1') {
        g_strFerienSelect = 'NRW';
    }
    
    /* Überprüfen, ob der anzuzeigende Tag ein Ferien / Feiertag ist */
    if (typeof SindFerien == 'function' && SindFerien(date.getTime())) {
        return [true, classNameDay, g_strToolTip];
    } else {
        return [true, classNameHoliday, ''];
    }
}
