// Aktuelle Position
var lastX = 0; var lastY = 0;

// Letzter Tag/Monat
var lastDay = ""; var lastMonth = "";

// Monatsansicht?
var monthlyview = false;

// MSIE?
var ismsie = false;
if (!window.opera && navigator.userAgent.indexOf("MSIE") !=-1) ismsie = true;

// XML Objekte
var ioget = null;
var ioset = null;
var iopop = null;

// Aktuelles Datum
var selDate = null;

// Aktuelles Jahr
var cYear   = null;

// Timer fuer regelmaessige Updates
var myTimer = null;

// Wrapper fuer setTimeout
function sT(f,v) {return setTimeout(f,v);};

// Wrapper fuer getElementById
function gE(id) {return dcm.getElementById(id);};

// Wrapper fuer die createElement Funtion
function cE(el) {return dcm.createElement(el);};

// AppendChild wrapper
function aC(c,t) {c.appendChild(t);};

// Wrapper fuer getElementsByTagName
function eB(o,t,e) {var r = o.getElementsByTagName(t); return (e==null)?r:r[e];};

// Wrapper fuer die createTextNode Funktion
function cN(tx) {return dcm.createTextNode(tx);};

// Monate
var Monate = new Array("Januar","Februar","M&auml;rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");

// Tage im Monat
var Tage = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

// Tagesnamen
var Tagesnamen = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

// Tagesnamen kurz
var TagesnamenK = new Array("SO","MO","DI","MI","DO","FR","SA");

// Aktuelles Jahr
var currentYear = 0;

// Aktuelle Termine
var terminXML = null;

// Mouse
var mX = 0; var mY = 0;

// Register Mouse Position
function regpos(ev) {

  // Eventobjekt holen
  var e = getEvent(ev);
  mX = e.clientX; mY = e.clientY;
}

// Klasse zuweisen (Crossbrowser Version)
function setclass(o, c) { if (ismsie) o.setAttribute("className",c); else o.setAttribute("class",c); }

// Event programmieren
function bindEvent(obj, evType, fn, useCapture) {

  // Objekt existiert nicht
  if (!obj) {
    alert("Assign fail for "+evType); return;
  }
  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;
  }
}

// Get event object - Crossbrowser version
function getEvent(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;
}

// Kalender fuer einen Monat anzeigen
function monthview(m) {

  // Mastercontainer
  var master = gE("yearview"); if (!master) return;
  hide("detail",true); hide("lyv",false);

  // Monatsansicht aktivieren
  monthlyview = m+1;

  // Alte Elemente loeschen
  clearTree(master);

  // Erster Tag des Monats
  var t = new Date(currentYear,m,1,0,0,1); 
  for (var f=0;f<t.getDay();f++) {
    var e = cE("div"); setclass(e,"bigday");
    e.innerHTML = "&nbsp;&nbsp;"; 
    e.style.border = "1px solid white";
    aC(master,e);
  }

  // Tage einzeichnen
  var c = new Date(); var l = t.getDay(); 
  for (var f=1;f<=Tage[m];f++) {
    var e = cE("div"); 
    setclass(e,"bigday");

    // Heute?
    if (c.getDate()==f && c.getMonth()==m) {
      e.style.background = "#9ed7e1";
    }

    var z = (f<10)?"0"+f:f; e.prio = 0;
    e.innerHTML = "<b>"+TagesnamenK[l]+", "+z+"</b><br />";
    e.id = ((f<10)?"0"+f:f)+""+((m+1<10)?"0"+(m+1):(m+1));
    e.month = m+1; e.day = f; e.year = currentYear; e.dow = l;
    e.style.cursor = "pointer"; e.termin = false;
    bindEvent(e,'click',showdate,false);
    aC(master,e); l++;
    if (l == 7) {
      l = 0;
      var b = cE("br"); setclass(b,"cleaner"); 
      aC(master,b);
    }
  }

  // Aktuelle Termine abfragen
  fetchDates();
}

// Jahr wechseln
function changeYear(jahr) {

  // Jahr modifizieren
  if (jahr == -1) {
    currentYear--;
  } else if (jahr == 1) {
    currentYear++;
  }

  // Kalender anzeigen
  if (monthlyview) monthview(monthlyview-1)
  else createCalendar(null,currentYear);
}

// Kalender anzeigen
function createCalendar(ev,jahr,monat) {

  // Mastercontainer
  var master = gE("yearview"); if (!master) return;
  monthlyview = false; hide("detail",true);

  // Alte Elemente loeschen
  clearTree(master);

  // Detailanzeige erstellen
  if (gE("detail")==null) {
    var d = cE("div"); d.id = "detail";
    aC(eB(dcm,"body",0),d);
  }

  // XML Objekte initialisieren
  if (io == null) {
    io = new xrq();
    ioget = io.newconn("get");
    ioset = io.newconn("set");
    iopop = io.newconn("pop");
    bindEvent(dcm,"mousemove",regpos,false);
  }

  // Jahr wurde angegeben?
  var c = new Date();
  if (jahr == null) {
    if (cYear==null) {
      var j = c.getYear(); if (j<999) j+=1900;
      cYear = j;
    } else {
      j = cYear;
    }
  } else j = jahr;

  // Nur einen Monat anzeigen
  if (!complete) {
    if (monat != null && monat == '-') {
      am--; if (!am) { am = 12; j--; cYear--;}
    } else if (monat != null && monat == '+') {
      am++; if (am==13) {am = 1;j++; cYear++;}
    }
  } 

  // Aktuelles Jahr setzen
  currentYear = j;

  // Alte Elemente loeschen
  var d = master.getElementsByTagName("*");
  for (var i = d.length-1; i >= 0; i--) {
    if (d[i].className.search(/\bmonth\b/) != -1 || d[i].className.search(/\bbigday\b/) != -1) {
      d[i].parentNode.removeChild(d[i]);
    }
  }

  // Schaltjahr beachten
  Tage[1] = (j % 4 == 0)?29:28;
  for (var i=1;i<=12;i++) {
    if (am && i != am) continue;

    var m = cE("div"); setclass(m,"month");
    m.style.marginRight = ((ismsie)?10:30)+"px";
    if (ismsie) m.style.width = "210px";
    if (!complete) { m.style.width="258px"; m.style.height="180px";m.style.float="none"; }
    if (i % 4 == 0 && complete) { m.style.marginRight = "0px"; }
    aC(master,m); 

    // Monatsname anzeigen
    var n = cE("span"); 
    if (complete) {
      setclass(n,"profil_nickname");
      n.innerHTML = "<a href='javascript:monthview("+(i-1)+")'>"+Monate[i-1]+"</a>"; 
    } else {
      n.style.textAlign = "center"; n.innerHTML = Monate[i-1]+", "+currentYear; setclass(n,"monatsname");
    }
    aC(m,n);

    // Wochentage einblenden
    var tab = cE("table"); setclass(tab,"monthtable"); aC(m,tab);
    var tb = cE("tbody"); aC(tab,tb); 
    if (!complete) {
      tab.style.width="258px"; tab.style.margin = "5px 10px";
    }
    
    var d = cE("tr"); aC(tb,d);
    for (var y=0;y<TagesnamenK.length;y++) {
      var e = cE("th"); e.innerHTML = TagesnamenK[y]; aC(d,e);
      if (l<6) e.style.paddingRight = "4px";
    }

    // Erster Tag des Monats
    var d = cE("tr"); aC(tb,d);
    var t = new Date(j,i-1,1,0,0,1);
    for (var f=0;f<t.getDay();f++) {
      var e = cE("td"); e.style.paddingRight = "4px";
      e.innerHTML = " &nbsp;"; aC(d,e);
    }

    // Tage einzeichnen
    var l = t.getDay();
    for (var f=1;f<=Tage[i-1];f++) {
      var e = cE("td"); if (l<6) e.style.paddingRight = "4px";
      if (!l) e.style.backgroundColor = "#f1efe8";

      // Heute?
      if (c.getDate()==f && c.getMonth()==i-1) {
        e.style.border = "1px solid #083154"; e.style.fontWeight = "bold";
      }

      var z = (f<10)?"0"+f:f; e.prio = 0;
      e.innerHTML = z; e.id = ((f<10)?"0"+f:f)+""+((i<10)?"0"+i:i);
      e.month = i; e.day = f; e.year = j; e.dow = l;
      e.style.cursor = "pointer"; e.termin = false;
      aC(d,e); l++;
      bindEvent(e,'click',showdate,false);
      if (l==7) {
        l = 0; var d = cE("tr"); aC(tb,d);
      }
    }

    /* Neue Zeile */
    if (i % 4==0) {
      var e = cE("div"); setclass(e,"cleaner");
      aC(m,e);
    }
  }

  // Aktuelle Termine abfragen
  fetchDates((complete)?0:am);
}

// Termine laden
function fetchDates(month) {
  if (io!=null) {
    if (myTimer != null) clearTimeout(myTimer);
    myTimer = null;
    var r = io.fetch(ioget,true,geturl+"/month/"+month,"",mycalendar);
    //if (r == null) io.lasterror(ioget,true);
  }
}

// Short wrapper
function get(x,s,l) { 
  var r = x.getElementsByTagName(s);
  if ((r.length) && (r[0].firstChild)) {
    var b = r[0].firstChild.nodeValue; 
    return (l)?parseInt(b):b;
  } 

  // Standardwerte
  return (l)?0:"";
}

// Callback Funktion
function mycalendar() {

  // Uebertragung abgeschlossen
  if (io.isfetched(ioget)) {

    // Jahr anzeigen
    var y = gE("jahr"); if (y) y.innerHTML = currentYear;

    // Get XML Document
    var d = io.getresponse(ioget); if ((!d) || (d.length == 0)) return;
    terminXML = d;

    // Wurde ein Termin geloescht?
    var id = get(d,"Deleted");  
    if (id.length) {
      gE(id).style.background = "white"; gE(id).prio = 0;
    }

    // Alle Termine erstmal auf weiss stellen
    var a = gE("yearview").getElementsByTagName("*");
    for (var i = a.length-1; i >= 0; i--) {
      if (a[i].prio > 0) {
        a[i].style.background = "#ffffff"; a[i].prio = 0;
      }

      // Listen loeschen
      if (a[i].className.search(/\blist\b/) != -1) a[i].parentNode.removeChild(a[i]);
    }

    // Termine auslesen
    var e = eB(d,"Entry"); 
    for (var i=0;i<e.length;i++) {
      var day   = get(e[i],"Day",true);
      var month = get(e[i],"Month",true);

      // Jahr pruefen
      var year  = get(e[i],"Year",true);
      if (year > 0 && year != currentYear || (monthlyview > 0 && monthlyview != month)) continue;

      // Prioritaet setzen
      var prio  = get(e[i],"Prio");
      var id = ((day<10)?"0"+day:day)+""+((month<10)?"0"+month:month);

      // Termin vermerken
      var v = gE(id); if (!v) continue;
      v.termin = true;
      switch (prio) {
        case 'MEDIUM':
          if (v.prio < 2) {
            v.prio = 2;
            v.style.background = "#f3f287";
          }
        break;
        case 'HIGH':
          v.prio = 3;
          v.style.background = "#ef7192";
        break;
        default:
          if (v.prio < 1) {
            v.prio = 1;
            v.style.background = "#cafd9d";
          }
        break;
      }

      // In der Monatsansicht die Kurzbeschreibung anzeigen
      if (monthlyview) {
        var s = cE("span"); s.innerHTML = "- "+get(e[i],"Short")+"<br />";
        setclass(s,"list"); aC(v,s); 
      }
    }

    // Neuen Timer setzen (jede Minute ein Update)
    myTimer = sT("fetchDates()",60000);
  }
}

// Get X and Y position
function findPos(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;
  }

  // Return position in pixels
  return l;
}

// Termindaten fuer einen gewaehlten Tag anzeigen
function termine(d,t) {

  // Kein XML verfuegbar!
  if (terminXML == null) return;
  var e = eB(terminXML,"Entry"); var l = 0; d.innerHTML += "<br />";
  for (var i=0;i<e.length;i++) {
    if (get(e[i],"Day",true)==t.day && get(e[i],"Month",true)==t.month) {

      // Jedes Jahr od. nur zu einem bestimmten Jahr?
      if (get(e[i],"Year",true) > 0 && get(e[i],"Year",true) != currentYear) continue;

      // Kurzbezeichnung anzeigen
      var eid = get(e[i],"EID",true);
      d.innerHTML+=get(e[i],"Short")+" &nbsp;[<a class='modlink' style='font-size:11px' href=\"javascript:hide('full_"+l+"')\">Details</a>";

      // User darf loeschen?
      if (eid>0) d.innerHTML+=" - <a class='modlink' style='font-size:11px' href=\"javascript:tdelete("+eid+",'"+t.id+"')\">L&ouml;schen</a>";

      // Es gibt einen Link zu diesem Termin?
      var lnk = get(e[i],"Lnk"); 
      if (lnk.length) d.innerHTML += " - <a class='modlink' style='font-size:11px' target='infowin' href='"+lnk+"'>weitere Infos</a>";

      // Abschluss
      d.innerHTML += "]<br />\n";
      d.innerHTML += "<div class='tdetails' id='full_"+l+"'>"+get(e[i],"Long")+"<br /></div>\n";
      gE("full_"+l).ishidden = true; l++;
    }
  }
}

// Termin loeschen
function tdelete(eid,id,cf) {

  // Sicherheitsabfrage
  if (cf != true) {
    warnfenster('Termin l&ouml;schen','Willst du diesen Termin wirklich l&ouml;schen?',false,true,"javascript:tdelete("+eid+","+id+",true)",null)
    return;
  }

  // Daten senden
  if (io) {
    var r = io.fetch(ioget,true,geturl+"/delete/"+eid+"/id/"+id,"",mycalendar);
    //if (r == null) io.lasterror(ioget,true);
    warnfenster('','',true); mailwindow();
  }
}

function scrollFromTop() {
  if (ismsie) {
    if (document.documentElement && document.documentElement.scrollTop) {
      return document.documentElement.scrollTop;
    } else {
      return document.body.scrollTop;
    }
  } else return (self.pageYOffset)?self.pageYOffset:0;
}

// Alle alten Elemente loeschen
function clearTree(master) {
  var d = master.getElementsByTagName("*");
  for (var i = d.length-1; i >= 0; i--) d[i].parentNode.removeChild(d[i]);
}

// Infos anzeigen
function showdate(ev) {
  var e = getEvent(ev);
  var t = e.target?e.target:e.srcElement;
  if (typeof t.day == 'undefined') return false;

  // Fensterdimension ermitteln
  if (ismsie)
    var h = document.documentElement.clientHeight;
  else 
    var h = window.innerHeight;
  var y = scrollFromTop();
  var d = gE("mailwindow"); clearTree(d); d.style.top = 160+y+"px";
  gE("datatransfer").style.top = y+"px";
  hide("mailwindow",false); mailwindow(true,h); 
  d.style.backgroundColor = "#ffffff"; d.style.width = "400px";

  // Infos einblenden
  var e = cE("div"); setclass(e,"detailhead");
  e.innerHTML = Tagesnamen[t.dow]+", "+t.day+". "+Monate[t.month-1]+" "+t.year;
  lastDay = t.day; lastMonth = t.month; aC(d,e); 
  e = cE("div"); setclass(e,"detailbody"); aC(d,e);

  // Termine vorhanden?
  if (t.termin == true) termine(e,t);

  // Neuer Termin
  if (loggedin)
    e.innerHTML += "<br /><p style='padding:0;margin:0;' align='right'><a class='fremdprofil' href='javascript:addtermin(null,true,\""+t.id+"\")'>Neuer Termin</a><a class='fremdprofil' href='javascript:mailwindow()'>schliessen</a></p>";
  else
    e.innerHTML += "<br /><p style='padding:0;margin:0;' align='right'><a class='fremdprofil' href='javascript:mailwindow()'>schliessen</a></p>";
  return false;
}

// Neuen Termin pruefen
function checktermin() {

  // FORM Referenz
  var F = dcm.forms.add;

  // Daten pruefen und speichern
  F.sb.disabled = true;
  if (!F.day.value.length || !F.month.value.length) {
    warnfenster("Fehlerhafte Eingabe","Tag und Monat sind Pflichtfelder!",false);
    F.sb.disabled = false; return;
  }

  // Jahr auf 0 setzen wenn nicht angegeben
  if (!F.year.value.length) F.year.value = "0";

  if (!F.shrt.value.length) {
    warnfenster("Fehlerhafte Eingabe","Bitte gib eine Kurzbezeichnung f&uuml;r diesen Termin ein!",false);
    F.sb.disabled = false; return;
  }

  // Ist dieser Termin public?
  var p = (F.is_public==null)?0:(F.is_public.checked)?1:0;
  var l = (F.link == null)?"":escape(F.link.value);

  // Daten speichern
  F.sb.value="Termin wird gespeichert...";
  var r = io.fetch(ioset,false,posturl,"day="+F.day.value+"&month="+F.month.value+"&year="+F.year.value+"&tags="+escape(F.tags.value)+"&short="+escape(F.shrt.value)+"&public="+p+"&link="+l+"&prio="+F.priority.options[F.priority.selectedIndex].value+"&long="+escape(F.lng.value),senddone);
  if (r == null) mailwindow();
}

// Neuen Termin einfuegen
function addtermin(cb,init,d) {

  // Daten laden
  if (init) {

    // Fensterdimension ermitteln
    if (ismsie)
      var h = document.documentElement.clientHeight;
    else 
      var h = window.innerHeight;

    // Eingabefenster anzeigen
    seldate = d;
    var r = io.fetch(iopop,true,newtermin,"",addtermin);
    mailwindow(true,h); hide('detail',true); gE("mailwindow").style.top = 160+scrollFromTop()+"px";
  } else if (init == false) {
    mailwindow(); return;
  }

  if (io.isfetched(iopop)) {
    var html = io.getresponse(iopop,true);
    var d = gE("mailwindow"); if (d!=null) d.innerHTML = html;
    hide("mailwindow",false);
    var F = dcm.forms.add;
    F.day.value = seldate.substr(0,2); F.month.value = seldate.substr(2,2);
  }
}

// Termin gespeichert
function senddone() {
  if (io.isfetched(ioset)) {

    // Eingabemaske loeschen
    mailwindow();

    // Get XML Document
    var d = io.getresponse(ioset);
    if (get(d,"Ok",true)==1) 
      sT("fetchDates()",150);
    else
      warnfenster("Fehler","Fehler beim Speichern des Termins",false);
  }
}
