/**
*@fileoverview Definiert die Methoden zur Datumsauswahl und zur Anzeige des Kalenders
*/

/**
*@constructor
*@extends TTIBE
*@requires Date
*@requires Zeitraum
*/
function Terminauswahl(){
  /**
  *Liefert die anzahl der Tage eines Monats zu einem £bergebenen Datum.
  *Liegt der maximale Termin vor dem letzten Tag im Monat, wird der maximale Termin zur£ckgegeben
  *@param {String} strDate Datum im Format DD.MM.YYYY
  *@param {Bool} hin Kenner ob es sich um das Hin- oder R£ckdatum handelt (hin=1)
  *@return {int} Anzahl Tage
  */
  this.GetTage = function(strDate,hin){
    var myDate = new Date(strDate.split(".")[2],parseInt(strDate.split(".")[1],10),1);
    myDate.setDate(0);
    var nTage = myDate.getDate();

    lts=(hin)?(this.letzter_termin_hin.split(".")):(this.letzter_termin_rueck.split("."));
    if(twoDigit(lts[1])==twoDigit(myDate.getMonth()+1) && lts[2]==myDate.getFullYear()){
      nTage=parseInt(lts[0],10);
    }
    return nTage;
  };

  /**
  *Wird aufgerufen, wenn sich der Hintermin geändert hat und ändert entsprechend
  *den R£cktermin
  */
  this.ChangeRueck = function(){
    var lts=this.letzter_termin_rueck.split(".");
    var lDate = new Date(lts[2],parseInt(lts[1]-1,10),parseInt(lts[0]),10);
    var d=this.getValue('ktag');
    var lMon=this.getValue('kmonat').split(".");
    d = new Date(lMon[1],lMon[0]-1,d);
    var nTime = d.getTime()+(22*86400000);
    if(nTime>lDate.getTime())
      d.setTime(lDate.getTime());
    else
      d.setTime(nTime);
    var nMon=twoDigit(parseInt(d.getMonth(),10)+1);
    var nDay=twoDigit(parseInt(d.getDate(),10));
    this.SetDatum(nDay+"."+nMon+"."+d.getFullYear(),"",2);
  };

  /**
  *Liest den Wert aus einer Selectbox
  *@return {Selectboxvalue}
  */
  this.getValue = function(name){
    return document.forms[this.formname].elements[name].value;
  };

  /**
  *Setzt die RequestParameter "termin" bzw. "ruecktermin" und das Hiddenfeld
  *"termin"
  */
  this.UpdateTermine = function(kenner,y,m,d){
    var date=new Date(y,m-1,d);
    var bform = document.forms[this.formname];
    dn=date.getTime()/1000;
    if(kenner=="k"){
      this.req['termin']=dn;
      bform.termin.value=dn;
    }else{
      this.req['ruecktermin']=dn;
    }
  };

  /**
  *Selektiert ein Datum
  *@param {String} strDate das zu setzende Datum
  *@param {Bool} strKenner Kenenr f£r Hin- oder R£cktermin
  *@param {Int} noMon Kenner ob Monatsselectbox auch aktualisiert werden soll
  *@param {Int} noMon Kenner ob Monatsselectbox auch aktualisiert werden soll
  *@param form Unbekannte Funktion
  */
  this.SetDatum = function(strDate, strRKenner, noMon, form){
    var myDate = new Date(strDate.split(".")[2],parseInt(strDate.split(".")[1],10)-1,parseInt(strDate.split(".")[0],10));
    var nTage=this.GetTage(strDate,strRKenner!="");
    var com=(strRKenner)?document.forms[this.formname].ktag:document.forms[this.formname].rueckktag;
    var comMon=(strRKenner)?document.forms[this.formname].kmonat:document.forms[this.formname].rueckkmonat;
    var len=com.length;
    var nMax=(len>nTage)?len:nTage;

    for(i=0;i<nMax;i++){
      if(i<nTage){
        if(i>=len){
          com.options[i]=new Option();
        }
        com.options[i].text=i+1;
        com.options[i].value=i+1;
      }else{
        com[nTage] = null;
      }
    }
    var nSel=myDate.getDate();
    if(nSel>nTage)
      nSel = nTage;

    com.value = nSel;
    this.UpdateTermine(((strRKenner!="")?"k":""),strDate.split(".")[2],strDate.split(".")[1],nSel);

    if(noMon != 1){
      comMon.value = twoDigit(myDate.getMonth()+1)+"."+myDate.getFullYear();
    }
    if(noMon!=2 && strRKenner!="") this.ChangeRueck();

  };

  /**
  *Initiiert die Aktualisierung einer Auswahlbox
  *@param {String} Typ "k" oder "rueck"
  */
  this.UpdateDate = function(strKenner){
    var nTag = this.getValue(strKenner+"tag");
    var strMon = this.getValue(strKenner+"monat");
    this.SetDatum(nTag+"."+strMon,(strKenner=="rueckk")?"":"dummy",2);
  };

  /**
  *Initiiert die Aktualisierung einer "Tag"-Auswahlbox
  *@param {String} strKenner Typ "k" oder "rueck"
  */
  this.SetDay = function(strKenner){
    var nTag=this.getValue(strKenner+"tag");
    var cMon=document.forms[this.formname][strKenner+"monat"];
    var strMon=this.getValue(strKenner+"monat");
    var ets=this.erster_termin.split(".");

    if(ets[1]+"."+ets[2]==strMon && nTag < parseInt(ets[0],10)){
      cMon.selectedIndex=1;
      strMon=this.getValue(strKenner+"monat");
      this.SetDatum(nTag+"."+strMon,(strKenner=="rueckk")?"":"dummy",1);
      nTag=this.getValue(strKenner+"tag");
    }
    if(strKenner=="k"){
      this.ChangeRueck();
    }
    this.UpdateTermine(strKenner,strMon.split(".")[1],strMon.split(".")[0],nTag);
  };

  /**
  *Initiiert die Aktualisierung einer "Monat"-Auswahlbox
  *@param {String} strKenner Typ "k" oder "rueck"
  */
  this.SetMonth = function(strKenner){
    var nTag=this.getValue(strKenner+"tag");
    var strMonat=this.getValue(strKenner+"monat");
    var ets=this.erster_termin.split(".");
    if(ets[1]+"."+ets[2]==strMonat && nTag<parseInt(ets[0],10)){
      nTag=ets[0];
    }
    var strDate=nTag+"."+strMonat;
    this.SetDatum(strDate,(strKenner=="rueckk")?"":"dummy",1);
  };

  /**
  *F£llen der "Tag" Selectbox (beim erstmaligen Laden der Seite)
  *@param {Bool} Hinkenner (hin=true)
  */
  this.InitDays = function(hin){
    var nTage=this.GetTage((hin)?this.termin_hin:this.termin_rueck,hin);
    var SelTag=(hin)?this.termin_hin.split(".")[0]:this.termin_rueck.split(".")[0];
    var selBox = document.forms[this.formname].elements[(hin)?'ktag':'rueckktag'];
    for(i=1;i<=nTage;i++){
      selBox.options[i-1] = new Option(i,i);
      if(i==SelTag) selBox.options[i-1].selected=true;
    }
  };

  /**
  *F£llen der "Monat" Selectbox (beim erstmaligen Laden der Seite)
  *@param {Bool} Hinkenner (hin=true)
  */
  this.InitMonth = function(hin){
    var m    = new Array("Sty.","Lut.","Mar.","Kwi.","Maj","Cze.","Lip.","Sie.","Wrz.","Pa"+String.fromCharCode(378)+".","Lis.","Gru.");
    var ets  = this.erster_termin.split(".");
    var lts  = (hin)?(this.letzter_termin_hin.split(".")):(this.letzter_termin_rueck.split("."));
    var sels = (hin)?(this.termin_hin.split(".")):(this.termin_rueck.split("."));
    var selBox  = document.forms[this.formname].elements[(hin)?'kmonat':'rueckkmonat'];
    var aktDate = new Date(ets[2],parseInt(ets[1],10)-1,1);
    var selDate = new Date(sels[2],parseInt(sels[1],10)-1,1);
    var maxDate = new Date(lts[2],parseInt(lts[1],10)-1,1);
    while(aktDate.getTime()<=maxDate.getTime()){
      var sel = aktDate.getTime()==selDate.getTime()?" selected":"";
      var val = (aktDate.getMonth()+1)<10?"0"+(aktDate.getMonth()+1):(aktDate.getMonth()+1);
      var optVal = val+'.'+aktDate.getFullYear();
      var optLbl = m[aktDate.getMonth()]+' '+String(aktDate.getFullYear()).substr(2,2);
      selBox.options[selBox.options.length] = new Option(optLbl,optVal);
      if(aktDate.getTime()==selDate.getTime())
        selBox.options[selBox.options.length-1].selected = true;
      aktDate.addMonth();
    }
  };
  
  /**
  *Öffnet den Kalender
  *@param {String} Typ "hin" oder "rueck"
  */
  this.showKalender = function(strTyp){
    if(strTyp=='hin' && typeof(kalender_rueck)!='undefined') kalender_rueck.close();
    else if(strTyp=='rueck' && typeof(kalender_hin)!='undefined') kalender_hin.close();
    var top=screen.height;
    var left=screen.width;
    var posx=((left/2)-100);
    var posy=((top/2)-180);
    var wndName = 'kalender_'+strTyp+'__'+this.formname+'__'+this.name;
    var infowin = window.open('kalender.html',wndName,'width=200,height=230,scrollbars=no,screenX='+posx+',screenY='+posy+',left='+posx+',top='+posy);
    infowin.focus();
  }
}
