function doNext(el, e){ 
    if (!(e.keyCode==16 || (e.keyCode==9) || (e.keyCode==37) || (e.keyCode==38) || (e.keyCode==39) || (e.keyCode==40)))  // to capture tab key press
    { 
        if (el.value.length < el.getAttribute('maxlength')) return;        
        setFocusNext(el);
    }
}

function setFocusNext(el){
    var f = el.form;
    var els = f.elements;    
    var x, nextEl;
    
    for (var i=0, len=els.length; i<len; i++){
        x = els[i];
        if (el == x && (nextEl = els[i+1])){
        	if (nextEl.focus) nextEl.focus();
        }
    }
}

//new CalendarJS().init("calendar", new Date(2009, 1, 15));
function CalendarJS(fieldTT, fieldMM, fieldYY, add) {
	this.now = new Date();
	this.dayname = ["Mo","Di","Mi","Do","Fr","Sa","So"];
	this.monthname = ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"];	
	this.tooltip = ["vorheriger Monat","nächster Monat","aktuelles Datum"];
	this.monthCell = document.createElement("th");
	this.tableHead = null;
	this.parEl = null;
	
	
	this.init = function( id, initDate ) {
		this.now = initDate?initDate:new Date();
		this.date = this.now.getDate();
		this.month = this.mm = this.now.getMonth();
		this.year = this.yy = this.now.getFullYear();
		this.monthCell.colSpan = 5;
		this.monthCell.appendChild(document.createTextNode( this.monthname[this.mm]+" "+this.yy ));
		this.tableHead = this.createTableHead();
		this.parEl = document.getElementById( id );
		this.divid =  id ;			

		this.show();
		if (!initDate) this.checkDate();
	},
	
	
	this.checkDate = function() {
		var self = this;
		var today = new Date();
		if (this.date != today.getDate()) {
			this.date  = today.getDate();
			if (this.mm == this.month && this.yy == this.year)
				this.switchMonth("current");
			this.month = today.getMonth();
			if (this.mm == this.month && this.yy == this.year)
				this.switchMonth("current");
			this.year  = today.getFullYear();
			if (this.mm == this.month && this.yy == this.year)
				this.switchMonth("current");

		}
		window.setTimeout(function() { self.checkDate(); }, Math.abs(new Date(this.year, this.month, this.date, 24, 0, 0)-this.now));
	},
	
	this.removeElements = function( Obj ) {
		while( Obj.childNodes.length > 0)
			Obj.removeChild(Obj.childNodes[Obj.childNodes.length-1]);
		return Obj;
	},
		
	this.show = function() {
		this.parEl = this.removeElements( this.parEl );
		this.monthCell.firstChild.replaceData(0, this.monthCell.firstChild.nodeValue.length, this.monthname[this.mm]+" "+this.yy);
		var table = document.createElement("table");
		table.appendChild( this.createTableBody() );
		table.appendChild( this.tableHead );
		this.parEl.appendChild( table );
	},
			
	this.createTableHead = function() {
		var thead = document.createElement("thead");
		var tr = document.createElement("tr");
		var th = this.getCell( "th", "\u00AB", "last_month" )
		th.Instanz = this;
		th.onclick = function() { this.Instanz.switchMonth("prev"); };
		th.title = this.tooltip[0];
		try { th.style.cursor = "pointer"; } catch(e){ th.style.cursor = "hand"; }
		tr.appendChild( th );
		this.monthCell.Instanz = this;
		this.monthCell.onclick = function() { this.Instanz.switchMonth("current"); };
		this.monthCell.title = this.tooltip[2];
		try { this.monthCell.style.cursor = "pointer"; } catch(e){ this.monthCell.style.cursor = "hand"; }
		tr.appendChild( this.monthCell );			
		th = this.getCell( "th", "\u00BB", "next_month" )
		th.Instanz = this;
		th.onclick = function() { this.Instanz.switchMonth("next"); };
		th.title = this.tooltip[1];
		try { th.style.cursor = "pointer"; } catch(e){ th.style.cursor = "hand"; }
		tr.appendChild( th );
		thead.appendChild( tr );
		tr = document.createElement('tr');
		for (var i=0; i<this.dayname.length; i++)
			tr.appendChild( this.getCell("th", this.dayname[i], "weekday" ) );
		thead.appendChild( tr );
		return thead;
	},
	
	this.createTableBody = function() {
		var dayspermonth = [31,28,31,30,31,30,31,31,30,31,30,31];
		var sevendaysaweek = 0;
		var begin = new Date(this.yy, this.mm, 1);
		var firstday = begin.getDay()-1;
		if (firstday < 0)
			firstday = 6;
		if ((this.yy%4==0) && ((this.yy%100!=0) || (this.yy%400==0)))
			dayspermonth[1] = 29;
		var tbody = document.createElement("tbody");
		var tr = document.createElement('tr');
		
		var td = null;
		if (firstday == 0) {
			for (var i=0; i<this.dayname.length; i++) {
				var prevMonth = (this.mm == 0)?11:this.mm-1;
				z = dayspermonth[prevMonth]-6+i;
				td = this.getCell( "td", z, "last_month" )				
				td.setDate = this.setDate;
				td.dd = z;
				if(this.mm == 1) td.mm = 11; else td.mm=this.mm-1;
				if(this.mm == 1) td.yy = this.yy-1; else td.yy=this.yy;
				td.divid = this.divid;					
				td.onclick = function(e) {
					var currentDate = new Date(this.yy, this.mm, this.dd);
					this.setDate( currentDate );
					document.getElementById(this.divid).style.display='none';						
				};					
				tr.appendChild( td );
			}
			tbody.appendChild( tr );
			tr = document.createElement('tr');
		}
		
		var td = null;
		for (var i=0; i<firstday; i++, sevendaysaweek++) {
			var prevMonth = (this.mm == 0)?11:this.mm-1;
			z = dayspermonth[prevMonth]-firstday+i+1;
			td = this.getCell( "td", z, "last_month" );					
			td.setDate = this.setDate;
			td.dd = z;
			if(this.mm == 1) td.mm = 11; else td.mm=this.mm-1;
			if(this.mm == 1) td.yy = this.yy-1; else td.yy=this.yy;
			td.divid = this.divid;				
			td.onclick = function(e) {
				var currentDate = new Date(this.yy, this.mm, this.dd);
				this.setDate( currentDate );
				document.getElementById(this.divid).style.display='none';					
			};
			
			tr.appendChild( td );
			
		}
		
		for (var i=1; i<=dayspermonth[this.mm]; i++, sevendaysaweek++){
			if (this.dayname.length == sevendaysaweek){
				tbody.appendChild( tr );
				tr = document.createElement('tr');
				sevendaysaweek = 0;
			}
			
			var td = null;
			if (i==this.date && this.mm==this.month && this.yy==this.year && (sevendaysaweek == 5 || sevendaysaweek == 6))
				td = this.getCell( "td", i, "today weekend" );
			else if (i==this.date && this.mm==this.month && this.yy==this.year)
				td = this.getCell( "td", i, "today" );
			else if (sevendaysaweek == 5 || sevendaysaweek == 6)
				td = this.getCell( "td", i, "weekend" );
			else
				td = this.getCell( "td", i, null ); 
				
			td.setDate = this.setDate;
			td.dd = i;
			td.mm = this.mm;
			td.yy = this.yy;
			td.divid = this.divid;
			td.onclick = function(e) {
				var currentDate = new Date(this.yy, this.mm, this.dd);
				this.setDate( currentDate );
				document.getElementById(this.divid).style.display='none';
			};
			tr.appendChild( td );
		}

		var daysNextMonth = 1; var td = null;
		for (var i=sevendaysaweek; i<this.dayname.length; i++){				
			td = this.getCell( "td", daysNextMonth, "next_month" )					
			td.setDate = this.setDate;
			td.dd = daysNextMonth;
			if(this.mm == 11) td.mm = 0; else td.mm=this.mm+1;
			if(this.mm == 11) td.yy = this.yy+1; else td.yy=this.yy;				
			td.divid = this.divid;				
			td.onclick = function(e) {
				var currentDate = new Date(this.yy, this.mm, this.dd);
				this.setDate( currentDate );
				document.getElementById(this.divid).style.display='none';					
			};
			daysNextMonth++;
			tr.appendChild( td );
			};
			
		tbody.appendChild( tr );
		
		while (tbody.getElementsByTagName("tr").length<6) {
			tr = document.createElement('tr');
			for (var i=0; i<this.dayname.length; i++){				
			td = this.getCell( "td", daysNextMonth, "next_month" )					
			td.setDate = this.setDate;
			td.dd = daysNextMonth;
			if(this.mm == 11) td.mm = 0; else td.mm=this.mm+1;
			if(this.mm == 11) td.yy = this.yy+1; else td.yy=this.yy;
			td.divid = this.divid;		
			td.onclick = function(e) {
				var currentDate = new Date(this.yy, this.mm, this.dd);
				this.setDate( currentDate );
				document.getElementById(this.divid).style.display='none';
			};
			daysNextMonth++;
			tr.appendChild( td );
			};
		
		tbody.appendChild( tr );
		}

		return tbody;
		
	},

	this.setDate = function(date) {
		// Weiterverarbeitung des geklickten Datums
	var dd = date.getDate()<10?"0"+date.getDate():date.getDate();
	var mm = date.getMonth()+1<10?"0"+(date.getMonth()+1):(date.getMonth()+1);
	var yy = (date.getFullYear() + '').substring(2,4);

	// Datum zu den vorhandenen Daten hinzufügen
	if(add == 1 && fieldTT)
		{
		document.getElementById(fieldTT).value = document.getElementById(fieldTT).value + dd+'.'+mm+'.'+yy+';';	
		}
	// Volles Datum ausgeben			
	else if(fieldTT && !fieldMM && !fieldYY) {
		document.getElementById(fieldTT).value = dd+'.'+mm+'.'+date.getFullYear();			
		}
	// Datum hinzufügen			
	else if(fieldTT && fieldMM && fieldYY) {
		document.getElementById(fieldTT).value = dd;			
		document.getElementById(fieldMM).value = mm;			
		document.getElementById(fieldYY).value = yy;						
		}
	}
	
	this.getCell = function(tag, str, cssClass) {
		var El = document.createElement( tag );
		El.appendChild(document.createTextNode( str ));
		if (cssClass != null)
			El.className = cssClass;
		return El;
	},
	
	this.switchMonth = function( s ){
		switch (s) {
			case "prev": 
				this.yy = (this.mm == 0)?this.yy-1:this.yy;
				this.mm = (this.mm == 0)?11:this.mm-1;
			break;
			
			case "next":
				this.yy = (this.mm == 11)?this.yy+1:this.yy;
				this.mm = (this.mm == 11)?0:this.mm+1;
			break;
			
			case "current":
				this.yy = this.year;
				this.mm = this.month;
			break;
		}
		this.show();
	}
}

var DOMContentLoaded = false;
function addContentLoadListener (func) {
	if (document.addEventListener) {
		var DOMContentLoadFunction = function () {
			window.DOMContentLoaded = true;
			func();
		};
		document.addEventListener("DOMContentLoaded", DOMContentLoadFunction, false);
	}
	var oldfunc = (window.onload || new Function());
	window.onload = function () {
		if (!window.DOMContentLoaded) {
			oldfunc();
			func();
		}
	};
}