/**********************************************************************
*          Calendar JavaScript [DOM] v3.09 by Michael Loesler          *
************************************************************************
* Copyright (C) 2005-08 by Michael Loesler, http//derletztekick.com    *
*                                                                      *
*                                                                      *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or    *
* (at your option) any later version.                                  *
*                                                                      *
* This program is distributed in the hope that it will be useful,      *
* but WITHOUT ANY WARRANTY; without even the implied warranty of       *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
* GNU General Public License for more details.                         *
*                                                                      *
* You should have received a copy of the GNU General Public License    *
* along with this program; if not, see <http://www.gnu.org/licenses/>  *
* or write to the                                                      *
* Free Software Foundation, Inc.,                                      *
* 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.            *
*                                                                      *
 **********************************************************************/

function CalendarJS() {
	this.now = new Date();
	this.dayname = ["Mo","Di","Mi","Do","Fr","Sa","So"];
	this.monthname = ["January","February","March","April","May","June","July","August","September","Oktober","November","December"];	
	this.tooltip = ["previous month","next month","today"];
	this.monthCell = document.createElement("th");
	this.tableHead = null;
	this.parEl = null;
	
	this.init = function( id ) {
		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.show();
		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 ) {
		for (var i=0; i<Obj.childNodes.length; i++)
			Obj.removeChild(Obj.childNodes[i]);
		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');
		if (firstday == 0) {
			for (var i=0; i<this.dayname.length; i++) {
				var prevMonth = (this.mm == 0)?11:this.mm-1;
				tr.appendChild( this.getCell( "td", dayspermonth[prevMonth]-6+i, "last_month" ) );
			}
			tbody.appendChild( tr );
			tr = document.createElement('tr');
		}
		
		for (var i=0; i<firstday; i++, sevendaysaweek++) {
			var prevMonth = (this.mm == 0)?11:this.mm-1;
			tr.appendChild( this.getCell( "td", dayspermonth[prevMonth]-firstday+i+1, "last_month" ) );
			
		}

		for (var i=1; i<=dayspermonth[this.mm]; i++, sevendaysaweek++){
			if (this.dayname.length == sevendaysaweek){
				tbody.appendChild( tr );
				tr = document.createElement('tr');
				sevendaysaweek = 0;
			}
			if (i==this.date && this.mm==this.month && this.yy==this.year && (sevendaysaweek == 5 || sevendaysaweek == 6))
				tr.appendChild( this.getCell( "td", i, "today weekend" ) );
			else if (i==this.date && this.mm==this.month && this.yy==this.year)
				tr.appendChild( this.getCell( "td", i, "today" ) );
			else if (sevendaysaweek == 5)
				tr.appendChild( this.getCell( "td", i, "saturday weekend" ) );
			else if (sevendaysaweek == 6)
				tr.appendChild( this.getCell( "td", i, "sunday weekend" ) );
			else
				tr.appendChild( this.getCell( "td", i, null ) );
		}

		var daysNextMonth = 1;
		for (var i=sevendaysaweek; i<this.dayname.length; i++) 
			tr.appendChild( this.getCell( "td", daysNextMonth++, "next_month"  ) );
			
		tbody.appendChild( tr );
		
		while (tbody.getElementsByTagName("tr").length<6) {
			tr = document.createElement('tr');
			for (var i=0; i<this.dayname.length; i++) 
				tr.appendChild( this.getCell( "td", daysNextMonth++, "next_month"  ) );
			tbody.appendChild( tr );
		}
	
		
		return tbody;
		
	},
	
	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();
		}
	};
}

addContentLoadListener( function() { 
		new CalendarJS().init("calendar");
} );
