var g_calActive       = false;
var g_strFerienSelect = "NRW";
var g_focus           = "";
var g_arWeekDays      = ["So","Mo","Di","Mi","Do","Fr","Sa"];
var g_arMonNames      = ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"];
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"
};

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 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 day   = 0;
  var month = 0;
  var 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) {
    var dt = new Date(year,month-1,day,12,0,0);
  } else {
    var dt = new Date();
    dt.setHours(12,0,0,0);
  }
  return dt.getTime();
}

function getStringFromTimestamp(ts){
  var dt = new Date(ts);  
  return g_arWeekDays[dt.getDay()]+". "+twoDigit(dt.getDate())+"."+twoDigit(dt.getMonth()+1)+"."+dt.getFullYear();
}

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']);
  }
}

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, holidays, anzBlaetter, process)
{
  this.name       = name;
  this.typ        = typ || 'hin';
  this.ferien     = holidays || '-1';
  this.process    = process || 1;
  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.blaetter   = anzBlaetter || 1;
  this.blatt      = 1;
  this.active_td  = "";
  this.active_css = "";
  this.tmp_css    = "";
  this.noframe    = isIELT7();
  this.isIE       = isIE();
  this.tabindex   = (this.typ == 'hin') ? 2 : 3;
  this.value      = (this.typ == 'hin') ? getStringFromTimestamp(g_oTermine['tsSelTerminHin'])
                                        : getStringFromTimestamp(g_oTermine['tsSelTerminRueck']);
  try{
    this.selTermin = new Date(getTimestampFromString(this.value));
  } catch(e) {
    this.selTermin = new Date();
  }

  this.selTermin.setHours(12,0,0,0);
  this.showMonth = new Date(this.selTermin.getTime());
  this.showMonth.setDate(1);this.showMonth.resetTime();
  
  if (typeof(oDefInfoText) != 'undefined'){
    this.txtHdHinKurz = oDefInfoText['hin_kurz'][0];
    this.txtHdRueKurz = oDefInfoText['rueck_kurz'][0];
    this.txtHdHinLang = oDefInfoText['hin_lang'][0];
    this.txtHdRueLang = oDefInfoText['rueck_lang'][0];
    this.txtBlInfo = oDefInfoText['bl_text'][0];
  }
  else{
    this.txtHdHinKurz = "Früheste Hinreise";
    this.txtHdRueKurz = "Späteste Rückriese";
    this.txtHdHinLang = "Früheste Hinreise korrigieren<br>oder Daten übernehmen.";
    this.txtHdRueLang = "Späteste Rückreise korrigieren<br>oder Daten übernehmen.";
    this.txtBlInfo = "Wählen Sie Ihr Bundesland";
  }

  this.showCalendar = function() {
    if (g_calActive == false) {
      this.updateShowMonth();
      var oName    = this.name;
      var divCal   = $(oName + '_cal_box');
      var refObj   = $(oName + '_input');
      var nHeight  = refObj.offsetHeight;
      var posX     = 0;
      var posY     = nHeight;
      var refObjX  = refObj.offsetTop;
      var refObjY  = refObj.offsetLeft;
      var oParent  = refObj.offsetParent;
      while (oParent) {
        refObjX += oParent.offsetLeft;
        refObjY += oParent.offsetTop;
        oParent  = oParent.offsetParent;
      }
      if (!this.isIE) {
        posY -= 1;
      }
      var oStyle = {
        position : "absolute",
        top      : posY + 'px',
        left     : posX + 'px',
        width    : "194px",        
        zIndex   : 9900,
        display  : "block"
      }
      Object.extend($(oName + '_cal_box').style, oStyle);
      if (!this.noframe) {
        Object.extend($(oName + '_ifr_cal').style, {
          position : "absolute",
          top      : posY + 'px',
          left     : posX + 'px',
          width    : "194px",
          zIndex   : 9899,
          display  : "block"
        });
      }
      
      this.showKalenderControl(1);
      if (!this.noframe) {
        $(this.name + '_ifr_cal').style.height = $(this.name + '_cal_box').offsetHeight + 'px';
      }
      this.selectInput();
    }
  };

  this.hideCalendar = function (){    
    var seltermin = $(this.name+'_input').value;
    if (g_calActive != true) {
      if(this.ferien != '-1'){
          if ($(this.name + '_selBL').style.display == "block") {
            this.toggleBLSelect();
          }
      }
      document.onmousemove = null;
      var dt = new Date(getTimestampFromString(seltermin));
      $(this.name+'_input').value = g_arWeekDays[dt.getDay()]
                                  + ". " + twoDigit(dt.getDate())
                                  + "."  + twoDigit(dt.getMonth()+1)
                                  + "."  + dt.getFullYear();
      if (this.typ == 'hin') {
        g_oTermine['tsSelTerminHin']   = dt.getTime();
        updateRueckTermin();
      } else {
        g_oTermine['tsSelTerminRueck'] = dt.getTime();
      }
      $(this.name + '_cal_box').style.display = "none";
      $(this.name + '_cal_box').style.zIndex = "9500";
      if (!this.noframe) {
        $(this.name+'_ifr_cal').style.display = "none";
        $(this.name + '_cal_box').style.zIndex = "9499";
      }        
      setInactive();      
      if (g_focus == this.name) {
        g_focus = "";                    
        //this.stepForward();         
      }
    } else {
      this.selectInput();
    }
  };
  
  this.stepForward = function(){
  
    if (g_calActive == true ) {
      return;
    }
    
    if (this.typ == 'hin'){ 
        //oKalRueck.showCalendar();
        //var oInput = $('oKalRueck_input');        
        //oInput.focus();             
    }
    /*else{         
        var oInput        = $(this.name + '_input');
        var oForm         = oInput.form;
        var aFormElements = oForm.elements;
        var nTabindex     = oInput.getAttribute("tabindex");
    
        for (var i = 0, cnt=aFormElements.length; i < cnt; i++) {
          if (oInput != aFormElements[i] && aFormElements[i].getAttribute("tabindex")>=nTabindex) {
            aFormElements[i].focus();
            break;
          }
        }
    }*/
  };
  
  this.init = function(){
    var sHTML  = '<input type="text" id="' + this.name + '_input" class="ttkalInput" value="' + this.value + '" tabindex="' + this.tabindex + '"><br>' + "\n"
               + '<div id="' + this.name + '_cal_box" class="calDiv" style="display:none;">' + "\n"
               + '<div id="' + this.name + '_cal_info" class="calInfo"></div>' + "\n"
               + '<div style="margin:5px 3px;">' + "\n";
    for(var i = 1; i <= this.blaetter; i++) {
        sHTML  += '<table border="0" cellspacing="0" cellpadding="0">' + "\n"
               +  '<tr>' + "\n"
               +  '<td class="kalhead_le"><a id="' + this.name + '_lnkPrev' + i + '" href="javascript:void(0);"><img src="' + g_Pfad_KAL_IMG + 'pfeil_links.gif" width="11" height="12" title="vorheriger Monat" border="0" onmouseover="this.src=oImages[\'pfeil_links_over\'].src" onmouseout="this.src=oImages[\'pfeil_links\'].src"></td>' + "\n"
               +  '<td id="' + this.name + '_kalTitel' + i + '" class="kalTitel"></td>' + "\n"
               +  '<td class="kalhead_ri"><a id="' + this.name + '_lnkNext' + i + '" href="javascript:void(0);"><img src="' + g_Pfad_KAL_IMG + 'pfeil_rechts.gif" width="11" height="12" title="nächster Monat" border="0" onmouseover="this.src=oImages[\'pfeil_rechts_over\'].src" onmouseout="this.src=oImages[\'pfeil_rechts\'].src"></td>' + "\n"
               +  '</tr>' + "\n"
               +  '</table>' + "\n"
               +  '<table border="0" cellspacing="0" cellpadding="0">' + "\n"
               +  '<tr>' + "\n"
               +  '<td class="kalHeadKW">KW</td>' + "\n"
               +  '<td class="kalHeadSpace">&nbsp;</td>' + "\n"
               +  '<td class="kalHeadTage">M</td>' + "\n"
               +  '<td class="kalHeadTage">D</td>' + "\n"
               +  '<td class="kalHeadTage">M</td>' + "\n"
               +  '<td class="kalHeadTage">D</td>' + "\n"
               +  '<td class="kalHeadTage">F</td>' + "\n"
               +  '<td class="kalHeadTage">S</td>' + "\n"
               +  '<td class="kalHeadSon">S</td>' + "\n"
               /*+  '<td>&nbsp;</td>' + "\n"*/
               +  '</tr>' + "\n"
               +  '</table>' + "\n"
               +  '<div id="' + this.name + '_kalTable' + i + '"></div>' + "\n";
        sHTML  += (i != this.blaetter) ? "<br>" : "";
    }
    sHTML  += '</div>' + "\n";
    
    if (this.ferien != '-1'){
        sHTML  += '<div id="' + this.name + '_cal_FT" class="cal_FT">&nbsp;Ferien anzeigen für:'
               +  '<div class="cal_FTBTN" id="' + this.name +'_cal_FTBTN">'
               +  '<span style="padding-left:5px;" id="' + this.name +'_spn_FTBTN">' + g_strFerienSelect + '</span>'
               +  '</div>'
               +  '<div id="' + this.name +'_selBL" class="selBL">'
               +  '<div class="blTitel">Wählen Sie Ihr Bundesland</div>'
               +  '<div id="' + this.name + '_listBL"></div></div>'
               +  '<iframe src="javascript:void(0);" name="' + this.name + '_ifr_FTBTN" id="' + this.name + '_ifr_FTBTN" frameborder="0" framespacing="0" border="0" class="calIframe" scrolling="no" width="0" height="0" style="position:absolute;display:none;"></iframe>' + "\n"
               +  '<iframe src="javascript:void(0);" name="' + this.name + '_ifr_BL" id="' + this.name + '_ifr_BL" frameborder="0" framespacing="0" border="0" class="calIframe" scrolling="no" width="0" height="0" style="position:absolute;display:none;"></iframe>' + "\n"
               +  '</div>' + "\n";
    }
    
    if(this.process == 2){
        sHTML  += '<div class="divClose"><div id="' + this.name + '_btn_close" class="btnClose">Daten übernehmen</div></div>';
    }
    
    sHTML      +=  '</div>' + "\n";
    
           
    if (this.ferien != '-1'){
        sHTML  +=  '<div id="' + this.name + '_tooltip" class="div_tooltip" style="position:absolute;display:none;">' + "\n"
               +  '<table cellspacing="0" cellpadding="0" border="0">' + "\n"
               +  '<tr>' + "\n"
               +  '<td><img src="' + g_Pfad_KAL_IMG + 'tooltip_start.gif" width="11" height="20"></td>' + "\n"
               +  '<td id="' + this.name + '_tooltip_content" class="tooltip_content"></td>' + "\n"
               +  '<td><img src="' + g_Pfad_KAL_IMG + 'tooltip_end.gif" width="3" height="20"></td>' + "\n"
               +  '</tr>' + "\n"
               +  '</table>' + "\n"
               +  '</div>' + "\n";
    }     
    sHTML  += '<iframe src="javascript:false;" name="' + this.name + '_ifr_cal" id="' + this.name + '_ifr_cal" frameborder="0" framespacing="0" border="0" scrolling="no" width="0" height="0" style="position:absolute;top:0px;left:0px;display:none;"></iframe>' + "\n";
    if (this.ferien != '-1'){
           sHTML  += '<iframe src="javascript:void(0);" name="' + this.name + '_ifr_tt" id="' + this.name + '_ifr_tt" frameborder="0" framespacing="0" border="0" class="calIframe" scrolling="no" width="0" height="0" style="position:absolute;display:none;"></iframe>' + "\n";
    }

    var div = $('TTKAL_'+this.name);
    if (div) {
      div.innerHTML = sHTML;
      this.setInfoText();
      $(this.name + '_cal_box').onclick     = function(){g_calActive=true;this.selectInput();}.bind(this);
      $(this.name + '_cal_box').onmousedown = function(){g_calActive=true;this.selectInput();}.bind(this);
      $(this.name + '_cal_box').onmouseup   = function(){g_calActive=true;this.selectInput();}.bind(this);
      $(this.name + '_input').onfocus       = this.showCalendar.bind(this);
      //$(this.name + '_image').onclick       = this.showCalendar.bind(this);      
      $(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 9:  // Tab
          case 27: // Esc
          case 13: // Enter
            this.hideCalendar();
            if(e.stopPropagation)
              e.stopPropagation();
            if(e.preventDefault)
              e.preventDefault();
            else
              return false;
            break;
        }
      }.bind(this);

      if (this.ferien != '-1'){
        $(this.name + '_cal_FTBTN').onclick   = this.toggleBLSelect.bind(this);
      }
      //---wenn Termin-Wahl = Zeitraum
      if(this.process == 2){
          $(this.name + '_btn_close').onclick   = function(){
            window.setTimeout(function(){
              g_calActive = false;
              this.hideCalendar();
            }.bind(this), 100);
          }.bind(this);
      }

      for(var i = 1; i <= this.blaetter; i++) {
        $(this.name + '_lnkPrev' + i).onclick = this.showPrevMonth.bind(this);
        $(this.name + '_lnkNext' + i).onclick = this.showNextMonth.bind(this);
      }
      var refObj      = $(this.name + '_input');
      var oParent     = refObj.offsetParent;
      var nHeight     = refObj.offsetHeight;
      this.refObjX    = refObj.offsetTop;
      this.refObjY    = refObj.offsetLeft;
      while (oParent) {
        this.refObjX += oParent.offsetLeft;
        this.refObjY += oParent.offsetTop;
        oParent       = oParent.offsetParent;
      }
    } else {
      alert("Konnte Container für Kalender nicht finden!");
    }
  };

  this.setInfoText = function(){    
    if (this.ferien == '-1'){
        if (this.typ == "hin") {
          $(this.name + '_cal_info').innerHTML = this.txtHdHinKurz;
        } else {
          $(this.name + '_cal_info').innerHTML = this.txtHdRueKurz;
        }
    }
    else {
        if ($(this.name + '_selBL').style.display == "block") {
          $(this.name + "_cal_info").innerHTML  = this.txtBlInfo;
        } else if (this.typ == "hin") {
          $(this.name + '_cal_info').innerHTML = this.txtHdHinLang;
        } else {
          $(this.name + '_cal_info').innerHTML = this.txtHdRueLang;
        }
    }
  };
  
  this.updateShowMonth = function(){
    this.selTermin = new Date(getTimestampFromString($(this.name+'_input').value));
    this.selTermin.setHours(12,0,0,0);
    this.showMonth = new Date(this.selTermin.getTime());
    this.showMonth.setDate(1);
    this.showMonth.resetTime();
  };

  this.selectInput = function(){
    g_focus   = this.name;
    var input = $(this.name + '_input');
    input.focus();
    input.select();
    if (typeof(input.selectionStart) != 'undefined') {
      input.selectionStart = 0;
      input.selectionEnd = input.value.length;
    }
    window.setTimeout("setInactive()",200);
  };

  this.showKalenderControl = function(blatt){
    this.sel_termin = g_oTermine['tsSelTerminHin'];
    this.sel_rueck  = g_oTermine['tsSelTerminRueck'];
    var divTable = $(this.name + '_kalTable' + blatt);
    var divTitel = $(this.name + '_kalTitel' + blatt);
    var strTitel = g_arMonNames[this.showMonth.getMonth()]+" "+this.showMonth.getFullYear();
    divTitel.innerHTML = strTitel;
    var today = new Date();
    today.setHours(12,0,0,0);
    var startDate = new Date(this.showMonth.getTime());
    var diff = startDate.getDay();
    if(diff) startDate.addDay(1-diff);
    else startDate.addDay(-6);
    startDate.setHours(12);
    var nKW = 0;
    var bMonStart = false;
    var bMonEnde  = false;
    var aktCss = "";
    var setWT = 0; //Kenner Winterzeit
    
    var sHTML = '<table cellspacing="0" cellpadding="0" border="0">'+"\r\n";
    for (var i = 0; i < 6; i++) {
      if (bMonEnde ||
            (!bMonEnde
              && startDate.getMonth() > this.showMonth.getMonth()
              && startDate.getFullYear() == this.showMonth.getFullYear())) {
        break;
      }
      
      if (!bMonStart && startDate.getMonth() == this.showMonth.getMonth()) {
        bMonStart = true;
      }
      
      nKW    = startDate.getWeek();
      sHTML += "  <tr>\r\n<td class='kalkw'>" + nKW + "</td>";
      if (bMonStart) {
        sHTML += " <td class='rdLeft'>&nbsp;</td>";
      } else {
        sHTML += " <td class='rdSpace'>&nbsp;</td>";
      }
      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() != this.showMonth.getMonth() ||
              startDate.getFullYear() != this.showMonth.getFullYear()) {
          aktCss = "kalam";
        } 
        else if (startDate.getTime() < this.termin_min || 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 && this.typ == 'hin'){
                if (this.sel_termin == (startDate.getTime()+3600000) && (startDate.getTimezoneOffset() == '-60')){
                    bSZR = true;
                    setWT = 1;
                    aktCss = "kalzr";                
                }
            }
            //Selektierter Tag - Ausnahme März: Wechsel auf Sommerzeit
            if(startDate.getMonth() == 2 && startDate.getDate()>24 && this.typ == 'rueck'){
                if ((this.sel_rueck+3600000) == startDate.getTime() && (startDate.getTimezoneOffset() == '-120')){
                    bSZR = true;                
                    aktCss = "kalzr";                
                }
            }
            //Selektierter Tag: Normalfall (Hin)
            if (setWT == 0 && aktCss != "kalzr" && this.typ == 'hin' && (startDate.getTime() == this.sel_termin || (this.sel_termin > (startDate.getTime() - 86400000) && bSZR))) {
                aktCss = "kalzr";
            } 
            //Selektierter Tag: Normalfall (Rueck)        
            if (this.typ == 'rueck' && (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;
                }
                if (setTmpAktCss == 1){
                    aktCss = "kalzr";
                }
            }
        }

        if (aktCss != "klnl" && aktCss.indexOf("kalam") == -1) {
          var val = twoDigit(startDate.getDate())    + "."
                  + twoDigit(startDate.getMonth()+1) + "."
                  + startDate.getFullYear();           
          //Ohne Ferien?
          if(this.ferien == '-1'){              
              strLink = ' id="' + val + '" onclick="' + this.name + '.SelectDate(this);" '
                      + 'style="cursor:pointer;" ';
          }
          else {
              var sTooltip = SindFerien(startDate.getTime())?g_strToolTip:"";
              if (sTooltip != "" && bSZR==false) {
                aktCss += " kalferien";
              }
              strLink = ' id="' + val + '" onclick="' + this.name + '.SelectDate(this);" '
                      + 'style="cursor:pointer;" '
                      + 'onmouseover="' + this.name + '.onMouseOver(this,\'' + this.name + '\',\'' + sTooltip + '\');"';
          }
          
        } else {
          strLink = '';
        }

        if (aktCss.indexOf("kalam") == -1) {
          if (startDate.getTime() == today.getTime()) {
            sHTML += '<td class="' + aktCss + '"' + strLink + '><div id="today">'
                  +  startDate.getDate()
                  +  '</div></td>' + "\r\n";
          } else {
            sHTML += '<td class="' + aktCss + '"' + strLink + '>'
                  +  startDate.getDate()
                  +  '</td>' + "\r\n";
          }
        } else {
          sHTML += '<td class="'+aktCss+'">&nbsp;</td>'+"\r\n";
        }
        startDate.addDay();
      }
      
      if (!bMonEnde) {
        sHTML += " <td class='rdRight'>&nbsp;</td>";
      } else {
        sHTML += " <td></td>";
      }
      sHTML += "</tr><tr><td colspan='10' height='4'></td></tr>\r\n";
    }
    sHTML += "</table>\r\n";
    divTable.innerHTML = sHTML;
    this.blatt++;
    if (this.blatt <= this.blaetter) {
      this.showMonth.addMonth();
      this.showKalenderControl(this.blatt);
    } else {
      this.blatt = 1;
    }
    if(this.ferien == '-1'){}
    else{
        $(this.name +'_spn_FTBTN').innerHTML = g_strFerienSelect;
    }
    if (!this.noframe) {
        $(this.name + '_ifr_cal').style.height = $(this.name + '_cal_box').offsetHeight + 'px';
      }
    this.selectInput();
  };

  this.toggleBLSelect = function(){
    var divBTN = $(this.name + '_cal_FTBTN');
    var divBL  = $(this.name + '_selBL');
    var ifrBTN = $(this.name + '_ifr_FTBTN');
    var ifrBL  = $(this.name + '_ifr_BL');
    
    if (divBL.style.display == "block") {
      divBL.style.display     = "none";
      divBTN.style.width      = "70px";
      divBTN.style.background = "url('" + g_Pfad_KAL_IMG + "pfeil.gif') no-repeat 60px 5px #E7F9FE";
      if (!this.noframe) {
        ifrBTN.style.display = "none";
        ifrBL.style.display  = "none";
      }
      $(this.name + "_spn_FTBTN").innerHTML = g_strFerienSelect;

    } else {
      Object.extend(divBL.style, {
        display : "block",
        height  : "275px",
        width   : "150px",
        left    : "200px",
        bottom  : "0",
        zIndex  : 9499
      });
      Object.extend(divBTN.style, {
        background : "#E7F9FE",
        width      : "76px",
        zIndex     : 9505
      });
      if (!this.noframe) {
        Object.extend(ifrBTN.style,{
          display  : "block",
          top      : 0,
          left     : "124px",
          height   : divBTN.offsetHeight + "px",
          width    : divBTN.offsetWidth + "px",
          zIndex   : 9504
        });

        Object.extend(ifrBL.style,{
          display  : "block",
          height   : divBL.offsetHeight + "px",
          width    : divBL.offsetWidth + "px",
          left     : "200px",
          bottom   : "0",
          zIndex   : 9498
        });
      }
      if ($(this.name + '_listBL').innerHTML == "") {
        var sHTML  = "";
        for (var BL in g_oBundeslaender) {
          sHTML  += '<div id="' + this.name + "_BL_" + BL + '" class="divBLSelect"><span class="spnBLSelect">' + g_oBundeslaender[BL] + '</span></div>';
        }
        $(this.name + '_listBL').innerHTML  = sHTML;
        for (var BL in g_oBundeslaender) {
          $(this.name + "_BL_" + BL).onmouseover = function(){
            var obj = this.id.split('_')[0];
            var bl  = this.id.split('_')[2];
            $(obj + "_BL_" + bl).style.background = "url('" + g_Pfad_KAL_IMG + "pfeil.gif') no-repeat 3px 6px #FFF";
            $(obj + "_spn_FTBTN").innerHTML = bl;
          };
          $(this.name + "_BL_" + BL).onmouseout = function(){
            var obj = this.id.split('_')[0];
            var bl  = this.id.split('_')[2];
            $(obj + "_BL_" + bl).style.background = "#E7F9FE";
            $(obj + "_spn_FTBTN").innerHTML = g_strFerienSelect;
          };
          $(this.name + "_BL_" + BL).onclick = function(){
            var obj = this.id.split('_')[0];
            var bl  = this.id.split('_')[2];
            g_strFerienSelect = bl;
            window[obj].updateCalendar();
            window[obj].toggleBLSelect();
            window[obj].selectInput();
          };
        }
      }
      this.selectInput();
    }
    //this.setInfoText();
  };

  this.showNextMonth = function(){
    g_calActive = true;
    var tmpMonth = new Date(this.showMonth);
    if (this.blaetter == 1){
        tmpMonth.addMonth();
    }
    if (tmpMonth.getTime() < this.termin_max) {
      this.showMonth = tmpMonth;
      this.showKalenderControl(1);
    } else {
      alert("Spätere Termine sind leider nicht auswählbar.");
    }
  };

  this.showPrevMonth = function(){
    g_calActive = true;
    var tmpMonth = new Date(this.showMonth);
    if (this.blaetter == 1){
        tmpMonth.setDate(0);tmpMonth.setDate(1);
    }
    else{
        tmpMonth.setDate(0);tmpMonth.setDate(0);tmpMonth.setDate(1);
    }
    var firstMonth = new Date(this.termin_min);
    firstMonth.setDate(1);firstMonth.resetTime();
    
    if(tmpMonth.getTime() >= firstMonth.getTime()) {
      this.showMonth = tmpMonth;
      this.showKalenderControl(1);
    } else {
      alert("Früherere Termine sind leider nicht auswählbar.");
    }
  };

  this.updateCalendar = function(){
    if (this.blaetter == 2) {
      var tmpMonth = new Date(this.showMonth);
      tmpMonth.setDate(0);tmpMonth.setDate(1);
      this.showMonth = tmpMonth;
    }
    this.showKalenderControl(1);
  };

  this.SelectDate = function(td){
    g_calActive = true;
    
    if (this.active_td != "") {
      var akttd = $(this.active_td);
      if (akttd) {
        akttd.className =this.active_css;
      }
    }
    this.active_td  = td.id;
    this.active_css = this.tmp_css;
    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 = g_arWeekDays[dt.getDay()] + ". "
                                + this.active_td;
    
    if (this.process == 1){ 
        
        if (this.typ == 'hin') {
          g_oTermine['tsSelTerminHin']   = dt.getTime();
        } else if (dt.getTime() > g_oTermine['tsSelTerminHin']) {
          g_oTermine['tsSelTerminRueck'] = dt.getTime();
        }
        updateRueckTermin();
        g_calActive = false;
        g_focus = "";
        this.hideCalendar();
        
    }
    else{
    
        this.selectInput();
        if (this.typ == 'hin') {
          g_oTermine['tsSelTerminHin']   = dt.getTime();
        } else if (dt.getTime() > g_oTermine['tsSelTerminHin']) {
          g_oTermine['tsSelTerminRueck'] = dt.getTime();
        }
        updateRueckTermin();
        this.updateCalendar();
    
    }
    
  };

  this.onMouseOver = function(td,oname,tooltip){
    var className_org = td.className;
    this.tmp_css  = className_org;
    td.onmouseout = function(){
      $(oname+"_tooltip").style.display = "none";
      if (this.id != window[oname].active_td) {
        this.className   = className_org;
        this.onmouseout  = null;
      }
      if (!oname.noframe) {
        $(oname + '_ifr_tt').style.display = "none";
      }
    }
    if (tooltip != "") {
      if (document.onmousemove == null) {
        document.onmousemove = function(e) {
          var htmlBody = document.getElementsByTagName('body')[0];
          var oTooltip = $(oname + "_tooltip");
          Object.extend(oTooltip.style, {
            "filter"       : "alpha(opacity=75)",
            "opacity"      : ".75",
            "-moz-opacity" : ".75",
            zIndex         : 9950
          });

          var e    = (e) ? e : window.event;
          var posX = (e.x) ? (e.x + 5) : (e.pageX+5);
          var posY = (e.y) ? (e.y - 20) : (e.pageY-20);
          posX     = isNaN(posX) ? 0 : posX;
          posY     = isNaN(posY) ? 0 : posY;
          if (!this.isIE) {
            posY -= this.refObjY;
            posX -= this.refObjX;
          }
          oTooltip.style.top  = posY+"px";
          oTooltip.style.left = posX+"px";

          if (!this.noframe) {
            var ttback = $(oname + '_ifr_tt');
            Object.extend(ttback.style,{
              top      : posY+"px",
              left     : posX+"px",
              height   : oTooltip.offsetHeight + "px",
              width    : oTooltip.offsetWidth + "px",
              zIndex   : 9949,
              filter   : "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"
            });
          }
        }.bind(this);
      }
      $(oname+"_tooltip_content").innerHTML = tooltip;
      $(oname+"_tooltip").style.display = "block";
      if (!this.noframe) {
        $(oname + '_ifr_tt').style.display = "block";
      }
    } else if ((tooltip == "") && (td.className.indexOf('kalzr') == -1)) {
      td.className = "td_active";
      document.onmousemove = null;
    }
  };
}

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;
}
