// // Kalender Popup 1.2 // Written by KjM // Download und Dokumentation: http://www.goweb.de/javascriptkalender.htm // // Danke an Volker Umpfenbach, H. Petrich, Jürgen Vollmer und Sebastian Ohme // für Hinweise od. Fehlermeldungen und Tipps zur Behebung. // // Neu in 1.2 // Primäres DIV wurde von 'container' in 'container_dom_cal' umbenannt // 29.2. wurde nicht angezeigt aufgrund eines Fehlers. // Danke an Herrn Jürgen Vollmer für den Hinweis // // Neu in 1.1 // Berechnung der aktuellen Position auch wenn der User schon gescrollt hat // // Das Script kann frei auf jeder Seite verwendet werden // Ich würde mich sehr über einen Backlink auf www.goweb.de freuen // // Shortcut function gE(d) { return document.getElementById(d); } // // Kalender Objekt initialisieren var Kalender = { // // Ein Tag hat wieviel Millisekunden? // oneDay : 86400000, destObjYM: null, // Element-Name für Monat/Jahr-Feld "YYYY-MM" destObjD: null, layout : "%d.%m.%y", lastMouseX: 0, lastMouseY: 0, // Microsoft product ismsie: false, // Keine Verschiebung des Kalenders wenn withmove=false withmove: true, // // Monatsnamen in deutsch // monate : new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"), mshort : new Array("Jan","Feb","Mä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) return; // MSIE? if (!window.opera && navigator.userAgent.indexOf("MSIE") !=-1) Kalender.ismsie = true; // 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 = "container_dom_cal"; //iframe anhaengen /*var iframe = document.createElement("iframe"); iframe.id = "container_iframe"; iframe.style.zIndex = "1000"; iframe.style.width = "200px"; iframe.style.height = "200px"; iframe.width = "200px"; iframe.height = "200px"; iframe.style.position = "absolute"; iframe.style.display = "block"; iframe.src = "http://www.heise.de"; iframe.align="left" iframe.frameborder="100" b.appendChild(iframe);*/ //alert(iframe); // Kalender erstellen var cal = document.createElement("div"); // Header erstellen (DIV) var monat = document.createElement("div"); monat.id = "monat"; var cls = document.createElement("div"); // Tabelle erstellen var tab = document.createElement("table"); var tb = document.createElement("tbody"); var tr = document.createElement("tr"); var td1 = document.createElement("td"); var td2 = document.createElement("td"); tr.appendChild(td1); tr.appendChild(td2); tb.appendChild(tr); tab.appendChild(tb); tab.style.background = "#9F3728"; if (document.all) tab.style.width = "199px"; else tab.style.width = "200px"; tab.style.border = "0px"; tab.style.borderRight = "1px solid black"; // Tagescontainer erstellen var days = document.createElement("div"); // Content Element erstellen (DIV) var content = document.createElement("div"); content.id = "days"; // Fenster zusammenfügen und oberstes zurückgeben cal.appendChild(tab); container.appendChild(cal); td2.appendChild(cls); td1.appendChild(monat); cal.appendChild(days); cal.appendChild(content); // Erscheinungsbild definieren container.style.zIndex = "9999"; container.style.padding = "0px"; container.style.background = "#efefef"; container.style.width = "205px"; container.style.height = "195px"; container.style.top = "200px"; container.style.left = "50px"; container.style.position = "absolute"; container.style.display = "none"; container.style.borderLeft = "2px solid #f4f4f4"; container.style.borderTop = "2px solid #f4f4f4"; container.style.borderRight = "2px solid #000000"; container.style.borderBottom = "2px solid #000000"; container.style.backgroundImage = "url(images/white.gif)"; // Kalender Layout cal.style.margin = "2px"; cal.style.borderLeft = "1px solid black"; cal.style.borderTop = "1px solid black"; cal.style.borderBottom = "1px solid black"; // Monatsanzeige monat.style.textAlign = "center"; monat.style.height = "14px"; monat.style.fontSize = "12px"; monat.style.color = "white"; monat.style.background = "#9F3728"; monat.style.fontWeight = "bold"; monat.style.fontFamily = "arial,verdana,arial,sans-serif"; // Close Option cls.style.fontFamily = "arial,verdana,arial,sans-serif"; cls.style.fontSize = "12px"; cls.style.fontWeight = "bold"; cls.style.height = "14px"; cls.style.borderRight = "1px solid black"; cls.style.borderBottom = "1px solid black"; cls.style.borderLeft = "1px solid #dfdfdf"; cls.style.borderTop = "1px solid #dfdfdf"; cls.style.background = "#FF1300"; cls.innerHTML = " X "; // Wochentage days.style.background = "#F1CAA1"; days.style.borderRight = "1px solid black"; days.style.borderTop = "1px solid black"; days.style.fontSize = "12px"; days.style.width = "199px"; days.style.fontWeight = "bold"; days.style.textAlign = "center"; days.style.fontFamily = "arial,verdana,arial,sans-serif"; days.innerHTML = "MO    DI    MI    DO    FR    SA    SO"; // Inhalt layouten content.style.fontFamily = "courier new,courier,monospace"; content.style.fontSize = "12px"; content.style.textAlign = "center"; content.style.width = "199px"; content.style.borderRight = "1px solid black"; content.style.borderTop = "1px solid black"; content.style.fontWeight = "bold"; content.style.background = "#F5D7B5"; content.style.lineHeight = "2.0em"; // Kalenderobjekt in die Seite einfügen 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 // Kann mit der Variablen withmove abgeschaltet werden if (Kalender.withmove) { Kalender.eH(gE("monat"),'mousedown',Kalender.verschieben,false); Kalender.eH(document,'mousemove',Kalender.move,false); } }, // // Kalender nicht länger anzeigen // close: function() { try { gE("container_dom_cal").style.display = "none"; gE("iframe2").style.display = "none"; } catch (e) { } }, // // Nächsten Monat anzeigen // nextMon: function() { if (Kalender.curMonat == 12) { Kalender.curMonat = 1; Kalender.curJahr++; } else Kalender.curMonat++; Kalender.anzeige(); }, // // Vorheriger Monat anzeigen // prevMon: function() { if (Kalender.curMonat == 1) { Kalender.curMonat = 12; Kalender.curJahr--; } else Kalender.curMonat--; Kalender.anzeige(); }, // // Datum in das entsprechende Objekt einfügen // setzen: function(ts) { if (Kalender.destObjYM) { var d = new Date(ts); var month = d.getMonth()+1; var day = d.getDate(); if (month<10) month = "0"+month; if (day<10) day = "0"+day; // Selektiertes Datum muss nun in 2 Feldern upgedatet werden ("YYYY-MM" und "DD") //var s = day+"."+month+"."+d.getFullYear(); var sYM = d.getFullYear() + "-" + month; var z = gE(Kalender.destObjYM); z.value=sYM; if (z.onchange) { z.onchange(); } var sD = day; var zd = gE(Kalender.destObjD); zd.value=sD; if (zd.onchange) { zd.onchange(); } //alert('[setzen] sYM=' + sYM + ' sD=' + sD); } // Kalender schließen Kalender.close(); }, // // Kalender für einen bestimmten Monat anzeigen // Wenn monat / jahr nicht angegeben wird, wird das jeweils aktuelle genommen // obj ist das Objekt in welches später das gewählte Datum geschrieben wird // pdays versteht sich als Startoffset für gültige Tage ab dem aktuellen // tdays ist der Endoffset für gültige Tage ab dem aktuellen // anzeige: function(monat, jahr, objYM, objD, pdays, tdays, layout) { //alert('[anzeige] monat: ' + monat + '\njahr: ' + jahr + '\nobjYM: ' + objYM + '\nobjD: ' + objD); // Monat & Jahr sind angegeben und Monat ist zwischen 1 und 12? if ((monat == null) || (jahr == null)) { monat = Kalender.curMonat; jahr = Kalender.curJahr; } // Datumslayout zuweisen if (layout) Kalender.layout = layout; // Scrollposition auslesen if (Kalender.ismsie) { // ab MSIE 6 if (document.documentElement && document.documentElement.scrollTop) { var yFromTop = document.documentElement.scrollTop; } else { var yFromTop = document.body.scrollTop; } } else if (self.pageYOffset) { var yFromTop = self.pageYOffset; } else { var yFromTop = 0; } // Zielobjekt setzen if (objYM) { Kalender.destObjYM = objYM; if (objD) Kalender.destObjD = objD; // Container genau auf die Mausposition setzen var c = gE("container_dom_cal"); c.style.left = Kalender.lastMouseX + "px"; c.style.top = (yFromTop+Kalender.lastMouseY) + "px"; try { var c2 = gE("iframe2"); c2.style.left = Kalender.lastMouseX + "px"; c2.style.top = (yFromTop+Kalender.lastMouseY) + "px"; dump = (parseInt(c.style.width.replace(/px/, "")) + 3); c2.style.width = '' + dump.toString(10) + 'px'; dump2 = (parseInt(c.style.height.replace(/px/, "")) + 0); c2.style.height = dump2.toString(10) + "px"; } catch (e) { } } // 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 gE("monat").innerHTML = "
Vormonat"+Kalender.monate[monat-1]+", "+jahr+"Folgemonat
"; // 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; var dump = new Date('2010','0','1',0,0,1); Kalender.selectionStart = dump.getTime(); var dump = new Date('2015','11','31',0,0,1); Kalender.selectionEnd = dump.getTime(); } // Datumsobjekt initialisieren var d = new Date(jahr,monat-1,1,6,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 einfügen var o = ""; var j = 1; var l = 0; if (d.getDay() == 1) { o+= ""; var j = 1; var i = 1; } else if (d.getDay() == 2) { o+= "    "; var j = 2; var i = 2; } else if (d.getDay() == 3) { o+= "        "; var j = 3; var i = 3; } else if (d.getDay() == 4) { o+= "            "; var j = 4; var i = 4; } else if (d.getDay() == 5) { o+= "                "; var j = 5; var i = 5; } else if (d.getDay() == 6) { o+= "                    "; var j = 6; var i = 6; } else if (d.getDay() == 0) { o+= "                        "; var j = 7; var i = 0; } // for (var i = 1; i <= d.getDay(); i++) { // o+= "    "; j++; // } o += ""; var dim = Kalender.daysinmonth[monat-1]; // Schaltjahr? if (monat == 2) { if (jahr % 4 == 0) dim++; if (jahr % 100 == 0) dim--; if (jahr % 400 == 0) dim++; } for (i = 1; i <= dim; i++) { // Datum gültig ab? if ((f) && (f >= Kalender.selectionStart)) { f = 0; o += ""; l = 1; } // Datum gültig bis? if ((t>0) && (n >= t)) { t = -1; l = 0; o += ""; } // Link einfügen if (l && j == 6) { o += ""; } else if (l && j == 7) { o += ""; } else if (l) { o += ""; } // Datum setzen o += (i<10)?"0":""; o+= i+" "; j++; o += (l)?"":""; n+=Kalender.oneDay; f += (f)?Kalender.oneDay:0; if (j == 8) { j = 1; o += "
"; } else o += " "; } if (j!=1) for (i = j; i <= 7; i++) o+= "    "; else o += "
"; if (t == -1) o += "
"; // Daten anzeigen gE("days").innerHTML = o; // Kalender anzeigen gE("container_dom_cal").style.display = "block"; //gE("iframe2").style.display = "block"; }, // // 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 übergeben 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 = gE("monat"); // Kalender.obj.clickAtX = e.clientX - Kalender.findPos(t,1); // Kalender.obj.clickAtY = e.clientY - Kalender.findPos(t,0); // Mausebewegungen 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 gE("container_dom_cal").style.left = (x-o.clickAtX) + "px"; gE("container_dom_cal").style.top = (y-o.clickAtY) + "px"; gE("iframe2").style.left = (x-o.clickAtX) + "px"; gE("iframe2").style.top = (y-o.clickAtY) + "px"; o.lastMouseX = x; o.lastMouseY = y; return false; }, // // Mausbutton wurde losgelassen // stop: function(e) { // Eventhandler loeschen gE("monat").style.cursor = "auto"; Kalender.obj = null; }, // // DIV Position übergeben // 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 durchführen wenn die Seite geladen wurde // Kalender.eH(window,'load',Kalender.init,false);