//
// Kalender Popup 1.0

// Kalender Objekt initialisieren
var Kalender = {

  //
  // Ein Tag hat wieviel Millisekunden?
  //
  oneDay : 86400000,
  destObj: null,
  layout : "%d.%m.%y",
  lastMouseX: 0,
  lastMouseY: 0,

  //
  // Monatsnamen in deutsch
  //
  monate : new Array("Januar","Februar","M&auml;rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"),
  mshort : new Array("Jan","Feb","M&auml;r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"),

  //
  // Tagesnamen
  //
  weekdays : new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"),

  //
  // Tage pro Monat
  //
  daysinmonth : new Array(31,28,31,30,31,30,31,31,30,31,30,31),

  // 
  // Event programmieren
  //
  eH: function(obj, evType, fn, useCapture) {
    if (obj.addEventListener) {
      obj.addEventListener(evType, fn, useCapture);
      return true;
    } else if (obj.attachEvent) {
      var r = obj.attachEvent('on'+evType,fn);
      return r;
    } else {
      obj['on'+evType] = fn;
    }
  },  

  //
  // Style auf ein Objekt anwenden
  //
  style: function(o, t, v) { eval(o+".style."+t+"='"+v+"';"); },

  //
  // Kalender initialisieren
  //
  init: function() {

    // Kein DOM Support :(
    if (!document.getElementById) alert("kein DOM Support");

    // Kalender Objekt in die Seite einf?gen
    var b = document.getElementsByTagName("body");
    
    // Fehler auf der Seite - mehr als 1 Body Tag
    if (b.length != 1) return;

    // Containerelemente (DIV) erstellen
    var container = document.createElement("div"); 
    container.id = "jscontainer";

    // Kalender erstellen
    var cal = document.createElement("p"); 

    // Header erstellen (DIV)
    //var monat = document.createElement("div"); 
    //monat.id = "monat";
 
    var cstring   = document.createElement("h3"); 
    cstring.id = "cstring"; 

    // Tabelle erstellen
    
   
    var tab = document.createElement("table");
    var tb = document.createElement("tbody");   
    var tr = document.createElement("tr");
    var tr2 = document.createElement("tr");
    var tr3 = document.createElement("tr");
    var tr4 = document.createElement("tr");

    var td2 = document.createElement("td");

    var td4 = document.createElement("td");

    var content = document.createElement("td");
    content.id="days";
    
    var days = document.createElement("td");
   
    var monat = document.createElement("td");
    monat.id="monat";
    
    var cstring = document.createElement("span"); 
    cstring.id="cstring";
    
    var cls   = document.createElement("span"); 
    
   
    tab.appendChild(tb);    
        tb.appendChild(tr2);
        tr2.appendChild(monat);
    
        tb.appendChild(tr3);
        tr3.appendChild(days);
    
        tb.appendChild(tr4);
        tr4.appendChild(content);
    
    /*tab.style.background = "#fff";
    tab.style.width = "16em"; 
    tab.style.clear = "both";    */
   

    // Tagescontainer erstellen
    //var days = document.createElement("p"); 

    // Content Element erstellen (DIV)
   // var content = document.createElement("p"); 
    content.id = "days";
    

    // Fenster zusammenfuegen und oberstes zurueckgeben
    container.appendChild(cstring);
    container.appendChild(cls);
    cal.appendChild(tab);

    container.appendChild(cal);


    
    //cal.appendChild(content); 
    
    // Erscheinungsbild definieren
    /*container.style.zIndex = "9999";
    container.style.padding = "0";
    container.style.background = "#fff";
    container.style.top = "0";
    container.style.left = "0";
    container.style.margin = "0";
    container.style.position = "absolute";
    container.style.display = "none";
    container.style.border = "1px solid #ccc";*/
 

    // Kalender Layout
    cal.style.margin = "0";
    cal.style.padding = "0";
    
    
    // Monatsanzeige
    /*monat.style.textAlign = "center";
    monat.style.margin = "0.4em 0.4em";
    monat.style.padding = "0.2";
    monat.style.color = "#000";
    monat.style.background = "#E6EEDE";
    monat.style.fontWeight = "bold";
    monat.style.fontFamily = "arial,sans-serif";*/

    // Close Option
    /*cls.style.fontFamily = "arial,sans-serif";
    cls.style.fontWeight = "normal";    
    cls.style.background = "#E6EEDE"; 
    cls.style.textAlign = "center";
    cls.style.margin = "0";
    cls.style.padding = "0" ; */
    cls.innerHTML="<a href='JavaScript:Kalender.close()'>X</a>"; 

    cstring.innerHTML = "<h3'>Kalender</h3>";
    /*cstring.style.background = "#7AB800";
       cstring.style.padding = "0";
             cstring.style.margin = "0";
    */

    // Wochentage
    /*days.style.background = "#fff";
    days.style.color = "#666";
    days.style.fontWeight = "normal";
    days.style.fontFamily = "arial, sans-serif";*/
    days.innerHTML = "<th id='so'>So</th> <th id='mo'>Mo</th> <th id=di'>Di</th> <th id='mi'>Mi</th> <th id='do'>Do</th> <th id='fr'>Fr</th> <th id='sa'>Sa</th>";

    // Inhalt layouten
    /*content.style.fontFamily = "arial, sans-serif";
    content.style.fontSize = "12px"; 
    content.style.fontWeight = "normal";
    content.style.background = "#fff"; 
    content.style.padding = "0.3em"; */

    // Kalenderobjekt in die Seite einfuegen
    b[0].appendChild(container);

    // Aktueller Monat und aktuelles Jahr
    var d = new Date();
    Kalender.curMonat = d.getMonth()+1; 
    Kalender.curJahr = d.getFullYear();

    // Datumsgrenzen
    Kalender.selectionStart = Kalender.selectionEnd = 0;

    // Mausebewegungen abfangen
    Kalender.eH(document.getElementById("cstring"),'mousedown',Kalender.verschieben,false);

    Kalender.eH(document,'mousemove',Kalender.move,false);
  },

  //
  // Kalender nicht laenger anzeigen
  //
  close: function() { 
    document.getElementById("jscontainer").style.display = "none";
    document.getElementById(Kalender.destObj).className = Kalender.destObj_old_input_classname;
    Kalender.destObj = null;
    Kalender.destObj_old_input_classname = null; 
  },

  //
  // Naechsten Monat anzeigen
  //
  nextMon: function() {
    if (Kalender.curMonat == 12) {
      Kalender.curMonat = 1; Kalender.curJahr++;
    } else Kalender.curMonat++;
    Kalender.anzeige();
  },

  //
  // Vorherigen Monat anzeigen
  //
  prevMon: function() {
    if (Kalender.curMonat == 1) {
      Kalender.curMonat = 12; Kalender.curJahr--;
    } else Kalender.curMonat--;
    Kalender.anzeige();
  },

  //
  // Datum in das entsprechende Objekt einfuegen
  //
  setzen: function(ts) {
    var d = new Date(ts);
    if (Kalender.destObj) {
      var m = d.getMonth()+1; var y = d.getDate();
      if (m<10) m = "0"+m; if (y<10) y = "0"+y;
      var z = document.getElementById(Kalender.destObj);

      // Layoutstring erzeugen
      var l = Kalender.layout;
      l = l.replace(/%d/g,y);  
      l = l.replace(/%m/g,m);     
      l = l.replace(/%b/g,Kalender.mshort[d.getMonth()]);
      l = l.replace(/%B/g,Kalender.monate[d.getMonth()]);
      l = l.replace(/%y/g,d.getFullYear());     
      l = l.replace(/%a/g,Kalender.weekdays[d.getDay()]);

      z.value = l;
    }

    // Kalender schliessen
    Kalender.close();
    
  },

  //
  // Kalender fuer einen bestimmten Monat anzeigen
  // Wenn monat / jahr nicht angegeben wird, wird das jeweils aktuelle genommen
  // obj ist das Objekt in welches sp?ter das gewaehlte Datum geschrieben wird
  // pdays versteht sich als Startoffset fuer gueltige Tage ab dem aktuellen
  // tdays ist der Endoffset fuer gueltige Tage ab dem aktuellen
  //
  anzeige: function(monat, jahr, obj, pdays, tdays, layout, input_classname) {
    // Monat & Jahr sind angegeben und Monat ist zwischen 1 und 12
    if (monat == null) {
      monat = Kalender.curMonat;  
    }
    if (jahr == null) {
      jahr = Kalender.curJahr;
    }
 

    // Datumslayout zuweisen
    if (layout) Kalender.layout = layout;


    //prüfen ob vorher Kalender fuer andere Inputbox geoeffnet war
    if(Kalender.destObj != null) {
        document.getElementById(Kalender.destObj).className = Kalender.destObj_old_input_classname; 
    }

    // Zielobjekt setzen
    if (obj) {
      Kalender.destObj = obj;

      // Container genau auf die Mausposition setzen
      var c = document.getElementById("jscontainer");
      c.style.left = Kalender.lastMouseX + "px"; 
      c.style.top =  Kalender.lastMouseY + "px";
    }
	else {
		obj = Kalender.destObj;
	}
	

    // Monat ist gueltig?
    if ((isNaN(parseInt(monat))) || ((monat < 1) || (monat > 12))) return;

    // Monat & Jahr setzen
    Kalender.curJahr = jahr; Kalender.curMonat = monat;

    // Monat und Jahr inkl. Links einblenden
    document.getElementById("monat").innerHTML = "<a class='left' href='JavaScript:Kalender.prevMon()'><span>&nbsp;&nbsp;&nbsp;</span></a><a class='right' href='JavaScript:Kalender.nextMon()'><span>&nbsp;&nbsp;&nbsp;</span></a> "+Kalender.monate[monat-1]+" "+jahr+" ";
    //document.getElementById("monat").innerHTML = "hallo";
    //monat.innerHTML = "hallo";

    // Zeitgrenzen setzen
    if (pdays != null) {
      var h = new Date();
      var n = new Date(h.getFullYear(),h.getMonth(),h.getDate(),0,0,1);
      Kalender.selectionStart = n.getTime()+(Kalender.oneDay*pdays);
      Kalender.selectionEnd = ((tdays == null)||(tdays == 0))?0:tdays;
    }

    if (pdays == 'no_offset') {
      Kalender.selectionStart = 0;
    }

    // Datumsobjekt initialisieren
    var d = new Date(jahr,monat-1,1,0,0,1); var n = d.getTime(); 
   
    var f = n; 
    var t = (Kalender.selectionEnd != 0)?Kalender.selectionStart+Kalender.oneDay*Kalender.selectionEnd:0;

    // Tage in den Kalender einfuegen
    var o = "<table><tr>"; var j = 1; var l = 0;
    
    for (var i = 1; i <= d.getDay(); i++) {
      o+= "<td style='border:1px solid white;padding:0.5em;min-width:1.1em;text-align:center'>&nbsp;</td> "; j++;;
    }
    o += "";
    var dim = Kalender.daysinmonth[monat-1];

    // Schaltjahr?
    if (dim == 28) {
      if (jahr % 4   == 0) dim++;
      if (jahr % 100 == 0) dim--;
      if (jahr % 400 == 0) dim++;
    }
    for (i = 1; i <= dim; i++) {

      // Datum gueltig ab?
      if ((f) && (f >= Kalender.selectionStart)) {
        f = 0; o += ""; l = 1;
      }

      // Datum gueltig bis?
      if ((t>0) && (n >= t)) {
        t = -1; l = 0; o += ""; 
      }

      
      
      // Link einfuegen
      if (l) {
      o += "<td style='border:1px solid #ccc;padding:0.5em;min-width:1.1em;text-align:center'><a style='color: #00388E;text-decoration:none;' href='JavaScript:Kalender.setzen("+n+")'>"+i;j++;
      }else{
      // Datum setzen
      o += (i<10)?"":""; o+= "<td style='border:1px solid #ccc;padding:0.5em;min-width:1.1em ;color:#ccc; text-align:center'>"+i; j++; 
      }
      
      
      o += (l)?"</a></td>":"";
      n+=Kalender.oneDay; f += (f)?Kalender.oneDay:0;
      if (j == 8) {
        j = 1; o += "</tr><tr>";
      } else o += "</td>";
    }
    if (j!=1) for (i = j; i <= 8; i++) o+= "";
    else o += "</tr><tr>";
    if (t == -1) o += "</tr></table></td>";

    // Daten anzeigen
    document.getElementById("days").innerHTML = o;

    // Kalender anzeigen
    document.getElementById("jscontainer").style.display = "block";
    
    //Box mit Rand drum machen tun
    if (input_classname == null) {
        input_classname = "active";     
    }
    destObj = document.getElementById(obj);
    Kalender.destObj_old_input_classname = destObj.className;    
    destObj.className = input_classname;
  },

  //
  // X Position innerhalb eines Objektes finden
  //
  findPos: function(o,x) {
    var l = 0;
    if (o.offsetParent) {
      do {
        l += (x)?o.offsetLeft:o.offsetTop;
      } while (o = o.offsetParent);
    } else if (o.x) {
      l += (x)?o.x:o.y;
    }

    // Position innerhalb des Objektes uebergeben
    return l;
  },

  //
  // Kalender wird in der Seite verschoben
  //
  verschieben: function(e) {

    // Daten korrigieren
    e = Kalender.chkEvH(e);

    // Target Element holen
    var t = e.target?e.target:e.srcElement;
    t.style.cursor = "move";

    Kalender.obj = document.getElementById("monat");
    Kalender.obj.clickAtX = e.clientX - Kalender.findPos(t,1);
    Kalender.obj.clickAtY = e.clientY - Kalender.findPos(t,0);

    // Mausbewegungen verfolgen
    Kalender.eH(document,'mouseup',Kalender.stop,false);
  },

  //
  // Maus wird bewegt
  //
  move: function(e) {

    // Event zuordnen
    e = Kalender.chkEvH(e);

    // X und Y Position zuweisen
    var x = e.clientX; var y = e.clientY;

    // Objekt holen
    var o = Kalender.obj; if (o == null) {
      Kalender.lastMouseX = x; Kalender.lastMouseY = y;
      return false;
    }

    // Kalenderposition ermitteln
    var kx = o.style.top;
    var ky = o.style.left;

    // Daten nun verarbeiten und Objekt bewegen
    document.getElementById("jscontainer").style.left = (x-o.clickAtX) + "px";
    document.getElementById("jscontainer").style.top  = (y-o.clickAtY) + "px";
    o.lastMouseX = x; o.lastMouseY = y;
    return false;
  },

  //
  // Mausbutton wurde losgelassen
  //
  stop: function(e) {
    
    // Eventhandler loeschen
    document.getElementById("monat").style.cursor = "auto";
    Kalender.obj = null;
  },

  //
  // DIV Position uebergeben
  //
  chkEvH: function(e) {
    if (typeof e == 'undefined') e = window.event;
    if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
    if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
    return e;
  }
};

//
// Initialisierung durchfuehren wenn die Seite geladen wurde
//
Kalender.eH(window,'load',Kalender.init,false);
