/**
 * Date-Objekt Prototyping zum Klonen eines Date-Objektes
 */
function clone () {
	var objectClone = new this.constructor(this.getFullYear(),this.getMonth(),this.getDate(),
										   this.getHours(),this.getMinutes(),this.getSeconds());
	
	return objectClone;
}

function isSameDay(obj) {
	if(this.getDate() == obj.getDate() &&
	   this.getMonth()== obj.getMonth() &&
	   this.getFullYear()== obj.getFullYear())
	{
		return true;
	}
	else {
		return false;
	}
}
Date.prototype.clone = clone;
Date.prototype.isSameDay = isSameDay;

function getMousePos(e) {
	if(window.event) e = window.event;
	posx = e.pageX?e.pageX:e.clientX;
	posy = e.pageY?e.pageY:e.clientY;
}

/**@js
 *  Kalender-Modul - diese Klasse ben?tigt einen Date-Prototypen 
 *	und die Eventhandler-Funktionen von Scott Andrews
*/
function Calendar (startdate, heute) { //Konstruktor; alle weiteren Funktionen sind inline definiert
		// Inits
		var oneday  = 86400000;
		var today;
		
		if(typeof heute != "undefined")
			today= heute.clone();
		else {
			today = new Date();
		}
		var self    = this; // abgefahren, aber so ist das in JS, wird ben?tigt in privaten Methoden
		
		// Membervariablen
		var tabelle = document.createElement("TABLE");
		var chosen  = startdate.clone(); // chosen ?ndert sich durch Klick
		var start   = startdate.clone(); // start ?ndert sich nicht
		var aktdate = startdate.clone(); // aktdate ?ndert sich bei der Anzeige
		
		var rows   = 6;
		var monsel; // Monats-Auswahl
		var jahrsel; // Jahres-Auswahl
		var cls = "cal_day_inactive"; // inaktive Tage
		
		////////// Memberfunktionen ///////
		
		// Externe Event-Handler
		this.onCellClick = null;
		this.onCellOver  = null;
		
		// Interne Event-Handler; rufen bei Bedarf externe Event-Handler auf
		
		/**@js Private Funktion f?r Mouseover auf Zelle; */
		function hoverCell() {
			if(self.onCellOver) {
				self.onCellOver(chosen);
			}
		}
		
		/**@js Private Funktion f?r Klicken auf Zelle */
		function setDate(ev) {
			if(window.event) ev = window.event;
			var cell = ev.target? ev.target : ev.srcElement; //Mozilla : IE
			chosen = cell.date;
			if(self.onCellClick) {
				self.onCellClick(chosen);
			}
		}
		
		function browseLeft() {
			var mn = chosen.getMonth();
			mn--;
			chosen.setMonth(mn);
			aktdate = chosen.clone();
			aktdate.setDate(1);
			self.createHTMLObject();
		}
		
		function browseRight() {
			var mn = chosen.getMonth();
			mn++; // ?ber 11 hinaus k?mmert sich JS selbst drum...
			chosen.setMonth(mn);
			aktdate = chosen.clone();
			self.createHTMLObject();
		}
		
		function changeMonth() {
			var mn = monsel.value;
			chosen.setMonth(mn);
			aktdate = chosen.clone();
			self.createHTMLObject();
		}
		
		function changeYear() {
			var yr = jahrsel.value;
			chosen.setYear(yr);
			aktdate = chosen.clone();
			self.createHTMLObject();
		}
		
		// ?ffentliche Funktionen
		this.getChosenDate = function() {
			return chosen;
		}
		
		this.setChosenDate = function(newDate) {
			chosen = newDate.clone();
			aktdate = chosen.clone();
			self.createHTMLObject();
		}
		
		this.createHTMLObject = function() {
			tabelle.className = "cal_table";
			if(tabelle.firstChild) {
				tabelle.removeChild(tabelle.firstChild);
			}
			
			
			while(aktdate.getDate()!=1) {
				aktdate.setTime(aktdate.getTime() - oneday);
				
			}
			// Z?hle Datum zur?ck zu Montag
			while(aktdate.getDay()!=1) {
				aktdate.setTime(aktdate.getTime() - oneday);
				
			}
			
			var row = null;
			var tbody   = document.createElement("TBODY");
			tabelle.appendChild(tbody);
			
			// Zeile mit Bl?tterm?glichkeit f?r Monat und Jahr
			monsel = document.createElement("SELECT"); // Monats-Auswahlfeld
			monsel.className = "cal_sel_month";
	
			var selectedIndex; // Der ausgew?hlte Monat
			for(i=0 ; i < 12; i++) {
				var opt = document.createElement("OPTION");
				opt.value = i;
				opt.innerHTML = monate[i];
				if(i==chosen.getMonth()) {
					selectedIndex=i;
				}
				monsel.appendChild(opt);
			}
			monsel.selectedIndex = selectedIndex;
			addEvent(monsel,"change", changeMonth, false);
			
			var arrowright = document.createElement("BUTTON");
			arrowright.className = "cal_btn";
			arrowright.innerHTML = "&gt;";
			addEvent(arrowright,"click", browseRight, false);
			
			arrowleft = document.createElement("BUTTON");
			arrowleft.className = "cal_btn";
			arrowleft.innerHTML = "&lt;";
			
			// Deaktiviere Button, wenn nicht weiter zur?ckgebl?ttert werden kann
			if(start.getMonth() == selectedIndex && aktdate.getFullYear()==today.getFullYear()) {
				arrowleft.disabled=true;
			}
			else {
				addEvent(arrowleft,"click", browseLeft, false);
			}
			
			jahrsel = document.createElement("SELECT"); // Jahres-Auswahlfeld
			jahrsel.className = "cal_sel_year";
			addEvent(jahrsel,"change", changeYear, false);
			for(y=start.getFullYear(); y < chosen.getFullYear()+2; y++)
			{
				var opt = document.createElement("OPTION");
				opt.value = y;
				opt.innerHTML = opt.value;
				jahrsel.appendChild(opt);
			}
			jahrsel.value = aktdate.getFullYear(); 
			row = document.createElement("TR");
			var navicell = document.createElement("TH");
			navicell.colSpan ="7";
			
			navicell.appendChild(jahrsel);
			navicell.appendChild(arrowleft);
			navicell.appendChild(monsel);
			navicell.appendChild(arrowright);
			
			row.appendChild(navicell);
			tbody.appendChild(row);
			
			// Zeile mit Wochentagen
			row = document.createElement("TR");
			row.className = "cal_row";
			for(k=0 ; k < 7 ; k++) {
				var cell = document.createElement("TD");
				cell.className = "cal_dayname";
				cell.innerHTML =wochentage[k];
				row.appendChild(cell);
			}
			tbody.appendChild(row);
			
			var activecell =false;
			
			// Datumszeilen
			for(i=0; i < rows; i++) {
				row = document.createElement("TR");
				row.className = "cal_row";
				for(j=0 ; j < 7 ; j++) {
					var cell = document.createElement("TD");
					
					cell.date   = aktdate.clone();
					
					// Starte aktive Phase
					if(aktdate.isSameDay(start)) {
						cls = "cal_day1";
					}
					
					// alle Daten gr??er Start sind aktiv
					if(aktdate > start) {
						activecell = true;
						if(aktdate==chosen) {
							cls = "cal_sel_day";
						}
						else if(aktdate.getMonth()%2){
							cls = "cal_day1";
						}
						else {
							cls = "cal_day2";
						}
					}
					else {
						cls = "cal_day_inactive"; // inaktive Tage
						activecell = false;
					}
					
					cell.className = cls;
					
					if(aktdate.isSameDay(today)) {
						cell.className = cell.className +" cal_aktday";
					}
					
					
					aktdate.setTime(aktdate.getTime() + oneday);
					
					// Tag einblenden
					var day = cell.date.getDate();
					if(day <10) day = "0"+day;
					cell.innerHTML = day;
					if(activecell) {
						addEvent(cell,"click",    setDate,false);
						addEvent(cell,"mouseover",hoverCell,    false);
					}
					row.appendChild(cell);
				}
				tbody.appendChild(row);
			}
			return tabelle;
		}
	}
	// JS-Kalendermodul Ende
	
	
	/// Thanks to Scott Andrew at www.scottandrew.com
	function addEvent(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 {
		window.status ="Fehler beim EventHandler!";
	  }
	} 
	
	function removeEvent(obj, evType, fn, useCapture)
	{
		if (obj.removeEventListener) {
			obj.removeEventListener(evType, fn, useCapture);
			return true;
		} 
		else if (obj.detachEvent) {
			var r = obj.detachEvent("on"+evType, fn);
			return r;
		} 
		else {
			window.status ="Fehler beim EventHandler!";
		}
	}
	

