var inputClass     = 'ttkalInput';
var kalInputWidth  = 124;
var kalInputHeight = 20;

var g_calActive       = false;
var g_strFerienSelect = "-1";
var g_focus           = "";
var g_arWeekDays      = ["So","Mo","Di","Mi","Do","Fr","Sa"];
var g_arMonNames      = ["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"];
var g_arFTypen        = ["Winter","Oster","Pfingst","Sommer","Herbst","Weihnachts"];
var g_arFtTypen       = ["Neujahr","Karfreitag","Ostermontag","Maifeiertag","Christi_Himmelfahrt","Pfingstmontag","Tag_der_Deutschen_Einheit","Erster_Weihnachtstag","Zweiter_Weihnachtsfeiertag"];
var g_arSpezFtTypen   = ["Heiligen_drei_Koenige","Fronleichnam","Mariae_Himmelfahrt","Reformationstag","Allerheiligen","Buss_und_Bettag"];
var g_strToolTip      = "";
var g_oBundeslaender  = {
    BW  : "Baden-Württemberg",
    BY  : "Bayern",
    BE  : "Berlin",
    BB  : "Brandenburg",
    HB  : "Bremen",
    HH  : "Hamburg",
    HE  : "Hessen",
    MV  : "Mecklenburg-Vorpommern",
    NDS : "Niedersachsen",
    NRW : "Nordrhein-Westfalen",
    RP  : "Rheinland-Pfalz",
    SL  : "Saarland",
    SN  : "Sachsen",
    SA  : "Sachsen-Anhalt",
    SH  : "Schleswig-Holstein",
    TH  : "Thüringen"
};
var g_Pfad_KAL_IMG = "/kunden_parameter/expDe/images/newqsm/";

Function.prototype.bind = function(object) {
    var __method = this;
    return function() {
        return __method.apply(object, arguments);
    }
};

Object.extend = function(dest,src) {
    for(attr in src) dest[attr]=src[attr];
    return dest;
};

function twoDigit(val){
    return parseInt(val,10)<10?"0"+parseInt(val,10):parseInt(val,10);
}

function _$(id){
    return document.getElementById(id) || null;
}

function str2tstamp(str){
    return str.length==6?(new Date(2000+parseInt(str.substr(4,2),10),parseInt(str.substr(2,2),10)-1,parseInt(str.substr(0,2),10),12,0,0,0)).getTime():0;
}

function isIE(){
    return (navigator.userAgent.indexOf("MSIE") != -1);
}

function isFF() {
    return (navigator.userAgent.indexOf("Firefox") != -1);
}

function isIELT7(){
    if (navigator.userAgent.indexOf("MSIE") != -1) {
        var version = parseFloat(navigator.appVersion.split("MSIE")[1]);
        if (version < 7) {
            return false;
        }
    }
    return true;
}

function getTimestampFromString(sTermin){
    var dt, day, month, year;

    day   = 0;
    month = 0;
    year  = 0;

    if(sTermin.search(/(Mo|Di|Mi|Do|Fr|Sa|So)\. (\d{2})\.(\d{2})\.(\d{4})/i)!=-1){
        day   = parseInt(RegExp.$2, 10);
        month = parseInt(RegExp.$3, 10);
        year  = parseInt(RegExp.$4, 10);
    }else if(sTermin.search(/(\d{2})[\.\/]?(\d{2})[\.\/]?(\d{4})/)!=-1){
        day   = parseInt(RegExp.$1, 10);
        month = parseInt(RegExp.$2, 10);
        year  = parseInt(RegExp.$3, 10);
    }else if(sTermin.search(/(\d{2})[\.\/]?(\d{2})[\.\/]?(\d{2})/)!=-1){
        day   = parseInt(RegExp.$1, 10);
        month = parseInt(RegExp.$2, 10);
        year  = parseInt(RegExp.$3, 10);
        year = year>20?(1900+year):(2000+year);
    }
    if (day >= 1 && day <= 31 && month >= 1 && month <= 12 && year >= 1920 && year < 2020) {
        dt = new Date(year,month-1,day,12,0,0);
    } else {
        dt = new Date();
        dt.setHours(12,0,0,0);
    }
    return dt.getTime();
}

function getStringFromTimestamp(ts, withWeekDay){
    var dt, returnString;

    dt           = new Date(ts);
    returnString = '';
    
    if (withWeekDay != false) {
        returnString = g_arWeekDays[dt.getDay()] + ". ";
    }
    returnString += twoDigit(dt.getDate()) + "." + twoDigit(dt.getMonth() + 1) + "." + (dt.getFullYear());
    return returnString;
}

function setInactive(){
    g_calActive = false;
}

function setActive(){
    g_calActive = true;
}

function updateRueckTermin(){
    if (g_oTermine['tsSelTerminHin'] >= g_oTermine['tsSelTerminRueck']) {
        g_oTermine['tsSelTerminRueck'] = Math.min(g_oTermine['tsTerminMax'],
            (g_oTermine['tsSelTerminHin']+ (22*86400000))
            );
        _$('oKalRueck_input').value = getStringFromTimestamp(g_oTermine['tsSelTerminRueck'], false);
        oKalRueck.sel_termin = g_oTermine['tsSelTerminRueck'];
        oKalRueck.value      = getStringFromTimestamp(g_oTermine['tsSelTerminRueck'], false);
        oKalRueck.active_td  = getStringFromTimestamp(g_oTermine['tsSelTerminRueck'], false);
        oKalRueck.selTermin  = new Date(getTimestampFromString(oKalRueck.value));
        oKalRueck.selTermin.setHours(12,0,0,0);
        oKalRueck.showMonth  = new Date(oKalRueck.selTermin.getTime());
        oKalHin.updateCalendar();
        oKalRueck.updateCalendar();
    }
}

Object.extend(Date.prototype,{

    addMonth: function(month){
        if(typeof(month)=='undefined') month=1;
        month = parseInt(month);
        var years=Math.floor(month/12);
        this.addYear(years);
        month = month%12;
        if((this.getMonth()+month)>11){
            this.addYear();
            this.setMonth((this.getMonth()+month)%12);
        }else{
            this.setMonth(this.getMonth()+month);
        }
    },

    addYear: function(years){
        if(typeof(years)=='undefined') years=1;
        years = parseInt(years);
        var aktYear = this.getFullYear();
        this.setYear(aktYear+years);
        return this;
    },

    addDay: function(days){
        if(typeof(days)=='undefined') days=1;
        days = parseInt(days);
        var aktTs = this.getTime();
        var addTs = days*86400000;
        this.setTime(aktTs+addTs);
        return this;
    },

    resetTime: function(){
        this.setHours(0,0,0,0);
        return this;
    },

    getWeek: function(){
        var dt      = new Date(this.getTime());
        var aktDay  = dt.getDay();
        if(aktDay==0)
            dt.addDay(-6);
        else
            dt.addDay(1-aktDay);
        var aktYear = dt.getFullYear();
        var tmpDt   = new Date(dt.getTime());
        tmpDt.addDay(6);
        if(tmpDt.getFullYear()>aktYear && tmpDt.getDate()>=4)
            return 1;
        var dtFirst = new Date(aktYear,0,1);
        var dFirst  = dtFirst.getDay();
        if(dFirst<=4)
            dtFirst.addDay(1-dFirst);
        else
            dtFirst.addDay(8-dFirst);
        return 1+parseInt((dt.getTime()-dtFirst.getTime())/(86400000*7),10);
    }
});

function Kalender(name, typ) {
    this.name       = name;
    this.blaetter   = 2;
    this.blatt      = 1;
    this.typ        = typ || 'hin';
    this.termin_min = g_oTermine['tsTerminMin'];
    this.termin_max = g_oTermine['tsTerminMax'];
    this.sel_termin = g_oTermine['tsSelTerminHin'];
    this.sel_rueck  = g_oTermine['tsSelTerminRueck'];
    this.active_td  = "";
    this.active_css = "";
    this.tmp_css    = "";
    this.noframe    = isIELT7();
    this.isIE       = isIE();
    this.isFF       = isFF();
    this.tabindex   = (this.typ == 'hin') ? 2 : 2; // Tabindex für beide Felder auf 2 gesetzt -> weil sonst nicht funktionierte. (hst | 01.07.08)
    this.value      = (this.typ == 'hin') ? getStringFromTimestamp(g_oTermine['tsSelTerminHin'], false) : getStringFromTimestamp(g_oTermine['tsSelTerminRueck'], false);
    this.origValue  = '';
    this.resetDates = false;
    this.selTermin  = new Date();

    this.selTermin.setHours(12,0,0,0);
    g_oTermine.showMonth = new Date(this.selTermin.getTime());
    g_oTermine.showMonth.setDate(1);
    g_oTermine.showMonth.resetTime();

    this.showCalendar = function() {

        // Kalender oeffnen
        if (g_calActive == false) {
            this.updateShowMonth();
            var oName    = this.name;
            var divCal   = _$('BOXKAL');
            var offset, posX, posY;

            if (this.isFF) {
                // Nur Firefox
                offset   = jQuery("#" + oName + '_input').offset();
                posX     = offset.left;
                posY     = offset.top + kalInputHeight + "px";
            } else {
                // Alle anderen (inkl. IE7+8)
                offset   = jQuery("#TTKAL_" + oName).position();
                posX     = offset.left;
                posY     = offset.top + kalInputHeight + "px";
            }

            var oStyle = {
                position : "absolute",
                top      : posY,
                left     : posX,
                width    : "297px",
                zIndex   : 9900
            }

            Object.extend(divCal.style, oStyle);
            if (!this.noframe) {
                Object.extend(_$('KAL_IFR').style, {
                    position : "absolute",
                    top      : posY,
                    left     : posY,
                    width    : "297px",
                    zIndex   : 9899
                });
            }

            oKalHin.origValue   = _$('oKalHin_input').value;
            oKalRueck.origValue = _$('oKalRueck_input').value;

            oKalHin.showKalenderControl(1);
            oKalRueck.showKalenderControl(1);

            if (this.typ == "hin") {
                oKalRueck.putInBackground();    
            } else {
                oKalHin.putInBackground();    
            }
            

            if (!this.noframe) {
                _$('KAL_IFR').style.height = _$('BOXKAL').offsetHeight + 'px';
                jQuery('#KAL_IFR').fadeIn("fast");
            }

            jQuery('#BOXKAL').fadeIn("fast");

            g_calActive = true;
        } else {
            saveKal();
        }
    };

    this.putInBackground = function () {
        if (this.typ == "hin") {
            jQuery ("#TTKALBOX_oKalHin").hide();
            jQuery ("#TTKALBOX_oKalRueck").show();
        } else {
            jQuery ("#TTKALBOX_oKalHin").show();
            jQuery ("#TTKALBOX_oKalRueck").hide();
        }
    }

    this.hideCalendar = function (){
        var seltermin, dt;
        
        if (g_calActive != true) {
            if (!this.resetDates) {
                seltermin = _$(this.name+'_input').value;
            } else {
                seltermin = this.origValue;
            }
            dt = new Date(getTimestampFromString(seltermin));
            _$(this.name+'_input').value = twoDigit(dt.getDate()) + "."  + twoDigit(dt.getMonth()+1) + "."  + dt.getFullYear();
            if (this.typ == 'hin') {
                g_oTermine['tsSelTerminHin']   = dt.getTime();
                if (!this.resetDates) {
                    updateRueckTermin();
                }
            }
            else{
                g_oTermine['tsSelTerminRueck'] = dt.getTime();
            }
            if (!this.noframe) {
                jQuery('#KAL_IFR').fadeOut("fast");
            }
            jQuery('#BOXKAL').fadeOut("fast");
        }
    };

    this.init = function(){
        if (this.typ != 'hin') {
            this.termin_max = this.termin_max + 1814400000;
        }

        // ----- Input-Element generieren und an initialisieren ----------------
        var sHTML  = '<input type="text" id="' + this.name + '_input" class="' + inputClass + '" tabindex="' + this.tabindex + '" readonly="readonly">';
        var div = _$('TTKAL_'+this.name);
        if (div) {
            div.innerHTML = sHTML;
            _$(this.name + '_input').onclick       = this.showCalendar.bind(this);
            _$(this.name + '_input').onblur        = function(){
                g_focus = "";
                this.hideCalendar();
            }.bind(this);
            _$(this.name + '_input').onkeypress     = function(e){
                var e = e || window.event;
                var charCode = e.which?e.which:e.keyCode;
                switch (charCode) {
                    case 27: // Esc
                    case 13: // Enter
                        this.hideCalendar();
                        if(e.stopPropagation)
                            e.stopPropagation();
                        if(e.preventDefault)
                            e.preventDefault();
                        else
                            return false;
                        break;
                }
            }.bind(this);

            var refObj      = _$(this.name + '_input');
            var oParent     = refObj.offsetParent;
            this.refObjX    = refObj.offsetTop;
            this.refObjY    = refObj.offsetLeft;
            while (oParent) {
                this.refObjX += oParent.offsetLeft;
                this.refObjY += oParent.offsetTop;
                oParent       = oParent.offsetParent;
            }
            refObj.value = this.value;
        } else {
            alert("Konnte Container für Kalender nicht finden!");
        }

        // ----- Kalenderblaetter erstellen ------------------------------------
        var tmpClass, sHTML2, blatt;
        sHTML2 = '';
        for (blatt = 1; blatt <= this.blaetter; blatt++) {
            tmpClass = 'calDiv';

            if (blatt > 1) {
                tmpClass = 'calDiv2';
            }

            sHTML2 += '<div class="' + tmpClass + '">'
                   +    '<table border="0" cellspacing="2" cellpadding="0" align="center">'
                   +        '<tr>'
                   +            '<td class="kalHeadTage">M</td>'
                   +            '<td class="kalHeadTage">D</td>'
                   +            '<td class="kalHeadTage">M</td>'
                   +            '<td class="kalHeadTage">D</td>'
                   +            '<td class="kalHeadTage">F</td>'
                   +            '<td class="kalHeadTage">S</td>'
                   +            '<td class="kalHeadTage">S</td>'
                   +        '</tr>'
                   +    '</table>'
                   +    '<div id="' + this.name + '_kalTable' + blatt + '" ></div>'
                   + '</div>';
        }

        var div2 = _$('TTKALBOX_'+this.name);
        if (div2) {
            div2.innerHTML = sHTML2;
        } else {
            alert("Konnte Container für Kalender nicht finden!");
        }
    };

    this.updateShowMonth = function(){
        var terminShown = new Date(getTimestampFromString(_$('oKalHin_input').value));

        this.selTermin = new Date(getTimestampFromString(_$(this.name+'_input').value));
        this.selTermin.setHours(12,0,0,0);

        g_oTermine.showMonth = new Date(terminShown.getTime());
        g_oTermine.showMonth.setDate(1);
        g_oTermine.showMonth.resetTime();
    };

    this.showKalenderControl = function(blatt){
        var tmpShowMonth = new Date(g_oTermine.showMonth);
        if (blatt >= 2) {
            tmpShowMonth.addMonth(1);
        }

        this.sel_termin = g_oTermine['tsSelTerminHin'];
        this.sel_rueck  = g_oTermine['tsSelTerminRueck'];

        var divTable    = _$(this.name + '_kalTable' + blatt);
        var divTitel    = _$('kalTitel' + blatt);

        var tmpMonthMin = new Date(this.termin_min);
        tmpMonthMin.setDate(1);
        tmpMonthMin.resetTime();

        var tmpMonthMax = new Date(this.termin_max);
        tmpMonthMax.setDate(1);
        tmpMonthMax.resetTime();

/*CC*/  if ((this.typ == "hin" && this.name == "oKalHin") || (this.typ == "rueck" && this.name == "oKalRueck")) {
            divTitel.innerHTML = g_arMonNames[tmpShowMonth.getMonth()] + ' ' + tmpShowMonth.getFullYear();
        }

        var today = new Date();
        today.setHours(12,0,0,0);

        var startDate = new Date(tmpShowMonth.getTime());
        var diff      = startDate.getDay();

        if(diff) {
            startDate.addDay(1 - diff);
        } else {
            startDate.addDay(-6);
        }

        var chkTerminMin;
        
        if (this.typ == "hin") {
            chkTerminMin = this.termin_min;
        } else {
            chkTerminMin = this.sel_termin
        }

        startDate.setHours(12);
        //var bMonStart = false;
        var aktCss    = "";
        var setWT     = 0;          // Kenner Winterzeit

        var sHTML = '<table cellspacing="2" cellpadding="0" border="0" align="center">';

        for (var i = 0; i < 6; i++) {
            //if (!bMonStart && startDate.getMonth() == tmpShowMonth.getMonth()) {
            //    bMonStart = true;
            //}

            sHTML += " <tr>"

            for ( var j = 0; j < 7; j++) {
                var bSZR = false;
                if ((startDate.getTime() >= this.sel_termin ) && (startDate.getTime() <= this.sel_rueck)) {
                    bSZR = true;
                }

                // ### CSS-Style des Kalendertags bestimmen
                aktCss = "kalwt";
                if (startDate.getMonth() != tmpShowMonth.getMonth() || startDate.getFullYear() != tmpShowMonth.getFullYear()) {
                    aktCss = "kalam";
                } else if (startDate.getTime() <= chkTerminMin || startDate.getTime() > this.termin_max) {
                    aktCss = "klnl";
                } else if (startDate.getDay() == 0 || startDate.getDay() == 6) {
                    aktCss = "kalson2";
                }

                if (aktCss != 'kalam') {
                    //Selektierter Tag - Ausnahme Oktober: Wechsel auf Winterzeit
                    if(startDate.getMonth() == 9 && startDate.getDate()>24 && setWT == 0){
                        if (this.sel_termin == (startDate.getTime()+3600000) && (startDate.getTimezoneOffset() == '-60')){
                            bSZR   = true;
                            setWT  = 1;
                            aktCss = "kalzr";
                        }
                    }

                    //Selektierter Tag - Ausnahme März: Wechsel auf Sommerzeit
/*CC*/              if(startDate.getMonth() == 2 && startDate.getDate()>24 && ((this.typ == "hin" && this.name == "oKalHin") || (this.typ == "rueck" && this.name == "oKalRueck"))){
                        if ((this.sel_rueck+3600000) == startDate.getTime() && (startDate.getTimezoneOffset() == '-120')){
                            bSZR   = true;
                            aktCss = "kalzr";
                        }
                    }
                    //Selektierter Tag: Normalfall (Hin)
                    if (this.typ == "hin") {
                        if (setWT == 0 && aktCss != "kalzr" && (startDate.getTime() == this.sel_termin || (this.sel_termin > (startDate.getTime() - 86400000) && bSZR))) {
                            aktCss = "kalzr";
                        }
                    }

                    //Selektierter Tag: Normalfall (Rueck)
                    if (this.typ == "rueck") {
                        if ((startDate.getTime() == this.sel_rueck || (this.sel_rueck < (startDate.getTime() + 86400000) && bSZR))) {
                            var setTmpAktCss = 1;
                            //Nicht markieren, wenn bei Sprung auf Sommerzeit der folgende Tag der selektierte ist
                            if(startDate.getMonth() == 2 && startDate.getDate()>23 && this.sel_rueck == (startDate.getTime() + 82800000)){
                                setTmpAktCss = 0;
                            }
    /*CC*/                  if (setTmpAktCss == 1 && ((this.typ == "hin" && this.name == "oKalHin") || (this.typ == "rueck" && this.name == "oKalRueck"))){
                                aktCss       = "kalzr";
                            }
                        }
                    }
                }

                // markierung zwischen gewählten Terminen (bei Expedia nicht verwendet)
                if (this.typ != "hin") {
    /*CC*/          if (aktCss != 'kalam' && ((this.typ == "hin" && this.name == "oKalHin") || (this.typ == "rueck" && this.name == "oKalRueck"))) {
                        if ( (startDate.getTime() >= this.sel_termin ) && (startDate.getTime() <= this.sel_rueck)) {
                            aktCss += " kalrd";
                        }
                    }
                }

                // Ferien und Feiertage
                if (aktCss.indexOf("klnl") == -1 && aktCss.indexOf("kalam") == -1 && aktCss != 'kalzr') {
                    var val = twoDigit(startDate.getDate()) + "." + twoDigit(startDate.getMonth()+1) + "." + startDate.getFullYear();
                    var sTooltip = SindFerien(startDate.getTime())?g_strToolTip:"";
                    if (sTooltip == "") {
                        sTooltip = SindAllgemeineFeiertage(startDate.getTime())?g_strToolTip:"";
                    }
                    if (sTooltip != "") {
                        if (sTooltip.search(/ferien/) != -1) {
                            aktCss += " kalferien";
                        } else {
                            aktCss += " kalfeier";
                        }
                    }
                    strLink = ' id="' + val + '" onclick="' + this.name + '.SelectDate(this);" ' + 'style="cursor:pointer;"  title="' + sTooltip + '"';
                } else {
                    strLink = '';
                }

                // Tage verlinken (wenn auswählbar)
                if (aktCss.indexOf("kalam") == -1) {
                    if (startDate.getTime() == today.getTime()) {
                        sHTML += '<td class="' + aktCss + '"' + strLink + '><div id="today">' +  startDate.getDate() +  '</div></td>';
                    } else {
                        sHTML += '<td class="' + aktCss + '"' + strLink + '>' +  startDate.getDate() +  '</td>';
                    }
                } else {
                    sHTML += '<td class="' + aktCss + '"></td>';
                }
                startDate.addDay();
            }

            sHTML += "</tr>";
        }
        sHTML += "</table>";
        divTable.innerHTML = sHTML;
        if (!this.noframe) {
            _$('KAL_IFR').style.height = _$('BOXKAL').offsetHeight + 'px';
        }
        this.blatt++;

        if (this.blatt <= this.blaetter) {
            g_oTermine.tempShowMonth = new Date(g_oTermine.showMonth);
            this.showKalenderControl(this.blatt);
        } else {
            g_oTermine.showMonth = new Date(g_oTermine.tempShowMonth);
            this.blatt = 1;
        }
    };

    this.showNextMonth = function(){
        g_calActive = true;
        var tmpMonth = new Date(g_oTermine.showMonth);
        tmpMonth.addMonth();
        if (tmpMonth.getTime() < this.termin_max) {
            g_oTermine.showMonth = tmpMonth;
            oKalHin.showKalenderControl(1);
            oKalRueck.showKalenderControl(1);
        } else {
            alert("Spätere Termine sind leider nicht auswählbar.");
        }
    };

    this.showPrevMonth = function(){
        g_calActive = true;
        var tmpMonth = new Date(g_oTermine.showMonth);
        tmpMonth.setDate(0);
        tmpMonth.setDate(1);

        var firstMonth = new Date(this.termin_min);
        firstMonth.setDate(1);
        firstMonth.resetTime();

        if(tmpMonth.getTime() >= firstMonth.getTime()) {
            g_oTermine.showMonth = tmpMonth;
            oKalHin.showKalenderControl(1);
            oKalRueck.showKalenderControl(1);
        } else {
            alert("Früherere Termine sind leider nicht auswählbar.");
        }
    };

    this.updateCalendar = function(){
        var tmpMonth = new Date(g_oTermine.showMonth);

        tmpMonth.setDate(1);
        g_oTermine.showMonth = tmpMonth;

        this.showKalenderControl(1);
    };

    this.SelectDate = function(td){
        g_calActive = true;

        this.active_td  = td.id;
        var dt    = new Date(this.active_td.split(".")[2], parseInt(this.active_td.split(".")[1], 10)-1, parseInt(this.active_td.split(".")[0], 10));
        dt.setHours(12,0,0,0);

        _$(this.name+"_input").value = this.active_td;

        if (this.typ == 'hin') {
            g_oTermine['tsSelTerminHin']   = dt.getTime();
            IBE.req['termin'] = g_oTermine['tsSelTerminHin'] / 1000;

        } else if (dt.getTime() > g_oTermine['tsSelTerminHin']) {
            g_oTermine['tsSelTerminRueck'] = dt.getTime();
            IBE.req['ruecktermin'] = g_oTermine['tsSelTerminRueck'] / 1000;

        } else if (dt.getTime() < g_oTermine['tsSelTerminHin']) {
                // Ruecktermin vor Starttermin gewählt => Tausche einfach die Daten aus! (Fall sollte nicht mehr auftauchen)
                var temp = g_oTermine['tsSelTerminHin'];

                g_oTermine['tsSelTerminHin']   = dt.getTime();
                g_oTermine['tsSelTerminRueck'] = temp;

                IBE.req['termin']              = g_oTermine['tsSelTerminHin'] / 1000;
                IBE.req['ruecktermin']         = g_oTermine['tsSelTerminRueck'] / 1000;

                temp = _$("oKalHin_input").value;
                _$("oKalHin_input").value   = _$("oKalRueck_input").value;
                _$("oKalRueck_input").value = temp;
        }

        if (detail == 'termine') {
            document.bengine.refresh.value=1;
        }
        updateRueckTermin();
        oKalHin.updateCalendar();
        oKalRueck.updateCalendar();

        tt_omniClickTrack (_$(this.name + '_input'), "3PP:TT:SrchWzd:" + ((this.name == 'oKalHin') ? 'Dept' : 'Return')  + "Date");
    };

}

function FTermine(w_von, w_bis, o_von, o_bis, p_von, p_bis, s_von, s_bis, h_von, h_bis, we_von, we_bis){
    this.Winter_von     = str2tstamp(w_von);
    this.Winter_bis     = str2tstamp(w_bis);
    this.Oster_von      = str2tstamp(o_von);
    this.Oster_bis      = str2tstamp(o_bis);
    this.Pfingst_von    = str2tstamp(p_von);
    this.Pfingst_bis    = str2tstamp(p_bis);
    this.Sommer_von     = str2tstamp(s_von);
    this.Sommer_bis     = str2tstamp(s_bis);
    this.Herbst_von     = str2tstamp(h_von);
    this.Herbst_bis     = str2tstamp(h_bis);
    this.Weihnachts_von = str2tstamp(we_von);
    this.Weihnachts_bis = str2tstamp(we_bis);
}

function FeierTagTermine(nNeujahr,nKarFr,nOsterMo,nMaiFT,nChristiHF,nPfingstMo,nTdDE,n1WTag,n2WTag){
    this.Neujahr                    = str2tstamp(nNeujahr);
    this.Karfreitag                 = str2tstamp(nKarFr);
    this.Ostermontag                = str2tstamp(nOsterMo);
    this.Maifeiertag                = str2tstamp(nMaiFT);
    this.Christi_Himmelfahrt        = str2tstamp(nChristiHF);
    this.Pfingstmontag              = str2tstamp(nPfingstMo);
    this.Tag_der_Deutschen_Einheit  = str2tstamp(nTdDE);
    this.Erster_Weihnachtstag       = str2tstamp(n1WTag);
    this.Zweiter_Weihnachtsfeiertag = str2tstamp(n2WTag);
}

function SpezFeierTagTermine(nHl3K,nFronl,nMHimmel,nRefTag,nAheiligen,nBBTag){
    this.Heiligen_drei_Koenige = str2tstamp(nHl3K);
    this.Fronleichnam          = str2tstamp(nFronl);
    this.Mariae_Himmelfahrt    = str2tstamp(nMHimmel);
    this.Reformationstag       = str2tstamp(nRefTag);
    this.Allerheiligen         = str2tstamp(nAheiligen);
    this.Buss_und_Bettag       = str2tstamp(nBBTag);
}

function SindFerien(nTStamp){
    if(g_strFerienSelect=="-1")
        return false;

    var bReturn=false;
    var nDate       = new Date(nTStamp);
    var nYear       = nDate.getFullYear();

    g_strToolTip="";
    // Ferientermine
    for(var nPos=0;nPos<g_arFTypen.length;nPos++){
        if(g_oFerien[g_strFerienSelect][nYear][g_arFTypen[nPos]+"_von"]==0){
            continue;
        }else if(nTStamp>=g_oFerien[g_strFerienSelect][nYear][g_arFTypen[nPos]+"_von"] && nTStamp<=g_oFerien[g_strFerienSelect][nYear][g_arFTypen[nPos]+"_bis"]){
            g_strToolTip=g_arFTypen[nPos]+"ferien";
            bReturn=true;
            break;
        }else if(nDate.getMonth()==0){
            var nYearPrev=nYear-1;
            if(nTStamp>=g_oFerien[g_strFerienSelect][nYearPrev]["Weihnachts_von"] && nTStamp<=g_oFerien[g_strFerienSelect][nYearPrev]["Weihnachts_bis"]){
                g_strToolTip="Weihnachtsferien";
                bReturn=true;
                break;
            }
        }
    }

    // Allgemeine Feiertage
    for (var nPos = 0; nPos < 9; nPos++) {
        if (nTStamp == g_oFeiertag[nYear][g_arFtTypen[nPos]]) {
            var strFtTyp=g_arFtTypen[nPos].replace("_"," ");
            strFtTyp=strFtTyp.replace("_"," ");
            strFtTyp=strFtTyp.replace("_"," ");
            g_strToolTip=strFtTyp;
            return true;
        }else if(nTStamp<g_oFeiertag[nYear][g_arFtTypen[nPos]]){
            break;
        }
    }
    if(g_strFerienSelect=="BW" || g_strFerienSelect=="BY" || g_strFerienSelect=="BB" || g_strFerienSelect=="HE" || g_strFerienSelect=="MV" || g_strFerienSelect=="NRW" || g_strFerienSelect=="RP" || g_strFerienSelect=="SL" || g_strFerienSelect=="SN" || g_strFerienSelect=="SA"){
        // Extra
        for(var nPos=0;nPos<6;nPos++){
            if(nTStamp==g_oSpezFeiertag[g_strFerienSelect][nYear][g_arSpezFtTypen[nPos]]){
                var strFtTyp=g_arSpezFtTypen[nPos];
                if(nPos==0){
                    strFtTyp=strFtTyp.replace("_"," ");
                    strFtTyp=strFtTyp.replace("_"," ");
                    strFtTyp=strFtTyp.replace("oe","ö");
                }else if(nPos==3){
                    strFtTyp=strFtTyp.replace("ae_","ä ");
                }else if(nPos==5){
                    strFtTyp=strFtTyp.replace("ss_","ß- ");
                    strFtTyp=strFtTyp.replace("_"," ");
                }
                g_strToolTip=strFtTyp;
                return true;
            }else if(nTStamp==g_oSpezFeiertag[g_strFerienSelect][nYear][g_arSpezFtTypen[nPos]]){
                break;
            }
        }
    }
    return bReturn;
}

function SindAllgemeineFeiertage(nTStamp){
    var bReturn=false;
    var nDate       = new Date(nTStamp);
    var nYear       = nDate.getFullYear();

    g_strToolTip="";

    // Allgemeine Feiertage
    for(var nPos=0;nPos<9;nPos++){
        if(nTStamp==g_oFeiertag[nYear][g_arFtTypen[nPos]]){
            var strFtTyp=g_arFtTypen[nPos].replace("_"," ");
            strFtTyp=strFtTyp.replace("_"," ");
            strFtTyp=strFtTyp.replace("_"," ");
            g_strToolTip=strFtTyp;
            return true;
        }else if(nTStamp<g_oFeiertag[nYear][g_arFtTypen[nPos]]){
            break;
        }
    }

    return bReturn;
}

function saveKal() {
    g_calActive = false; // rein bzw. raus für "übernehmen Funktionalität"
    oKalHin.hideCalendar();
    oKalRueck.hideCalendar();
}

/**
 * Wird vom Schliessen-Button des Kalenders aufgerufen. Schliesst den Kalender
 */
function hideKal() {
    g_calActive = false;
    oKalHin.resetDates   = true;
    oKalRueck.resetDates = true;

    oKalHin.hideCalendar();
    oKalRueck.hideCalendar();

    oKalHin.resetDates   = false;
    oKalRueck.resetDates = false;
}

