/**

 Calendar Class 

 Version 1.0

 Autor: ATOMGAS, Luzifer Altenberg

*/

function Calendar(){

	this.toDay = new Date;

	this.lang = "en";

	this.daysLength = 2; //length of day names is days head (german 2 english 3)



	this.multiSelect = 0;

	//range dates

	this.minDate = 0;

	this.maxDate = 0;

	this.minBrowseDate = 0;

	this.maxBrowseDate = 0;

	//click

	this.handler = null;

	//instance registration

	this.__ID__ = Calendar.__GID__++;

	Calendar.__instances[this.__ID__] = this;					

}

/**

 static props day and months

*/

Calendar.days = {de:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],

					en:["Sunday","Monday","Thuesday","Wednesday","Thursday","Friday","Saturday"]};

Calendar.months = {de:["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],

					en:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]};

					

Calendar.__instances = {}

Calendar.__GID__ = 0;

/* static function to bind instance to div */

Calendar.show = function(id,y,m){

	Calendar.__instances[id].show(null,new Date(y,m))

}

Calendar.onSelectDay = function(id,e,y,m,d){

	//e.style.backgroundColor = "#FF9900";

	var handler = Calendar.__instances[id].handler;

	if(handler != null)

		typeof(handler) == "string" ? eval(handler)(new Date(y,m,d)) : handler(new Date(y,m,d));

			

}

var p = Calendar.prototype;



p.inRange = function(dateObj){

	var r = 1;

	if(this.minDate != 0)

		if(this.minDate.getTime() > dateObj.getTime())

			return 0;

	if(this.maxDate != 0)

		if(this.maxDate.getTime() < dateObj.getTime())

			return 0;

	return 1;

}

p.inBrowseRange = function(dateObj){

	var r = 1;

	if(this.minBrowseDate != 0)

		if(this.minBrowseDate.getTime() > dateObj.getTime())

			return 0;

	if(this.maxBrowseDate != 0)

		if(this.maxBrowseDate.getTime() < dateObj.getTime())

			return 0;

	return 1;

}

p.isToday = function(y,m,d){

	return this.toDay.getFullYear() == y && this.toDay.getMonth() == m && this.toDay.getDate() == d;

}

p.getHtml = function(div,dateObj){

	var isToday;

	var myDate = dateObj == null ? new Date() : dateObj;

	var month = myDate.getMonth();

	var year = myDate.getFullYear();

	

	/* start html */

	var htmlStr = '<div class="calendar">';

	htmlStr += '<table border="0" cellspacing="0">';

	/* prev year */

	htmlStr += '<tr class="calBrowseHead"><td align="center">'

	if(this.inBrowseRange(new Date(year-1,month,myDate.getDate()))){

		htmlStr += '<a href="javascript:Calendar.show('+this.__ID__+','+(year-1)+','+month+')">«</a> ';

	}else{

		htmlStr += " "

	}

	 

	//htmlStr += '</td>';	

	//htmlStr += '<td align="center">'

	//prev mothn

	if(this.inBrowseRange(new Date(year,month-1,myDate.getDate()))){

		htmlStr += '<a href="javascript:Calendar.show('+this.__ID__+','+year+','+(month-1)+')"><</a>';

	}else{

		htmlStr += " "

	}

	 /* show month and year */

	htmlStr += '</td>';

	htmlStr += '<td colspan="5" align="center">'+Calendar.months[this.lang][month]+' '+year+'</td>';

	htmlStr += '<td align="center">';

	//next month

	if(this.inBrowseRange(new Date(year,month+1,myDate.getDate()))){

		htmlStr += '<a href="javascript:Calendar.show('+this.__ID__+','+year+','+(month+1)+')">></a> ';

	}else{

		htmlStr += " "

	}	

	//htmlStr += '</td>';

	/* next year */

	//htmlStr += '<td align="center">';

	if(this.inBrowseRange(new Date(year+1,month,myDate.getDate()))){

		htmlStr += '<a href="javascript:Calendar.show('+this.__ID__+','+(year+1)+','+month+')">»</a>';

	}else{

		htmlStr += " "

	}	

	htmlStr += '</td>';	

	htmlStr += '</tr><tr>';

	/* show days header */

	var s = this.lang != "en" ? 1 : 0;

	for(var i=s;i<7+s;i++)

		htmlStr += '<td class="calDayHead"> '+Calendar.days[this.lang][i%7].substring(0,this.daysLength)+' </td>';

	htmlStr += '</tr>';

	/* cal body */

	myDate.setDate(1);

	htmlStr += '<tr>';	

	var firstDay = myDate.getDay();

	//var ff = firstDay;

	var enabled;

	var d;

	if(this.lang != "en")

		firstDay = (firstDay+6)%7

		

	for(var i=0;i< 42;i++){

		if(i%7 == 0)

			if(i != 35)

				htmlStr += '</tr><tr>'

			else

				htmlStr += '</tr>'

		if(i < firstDay )

			htmlStr += '<td>&nbsp;</td>';

		else{

			myDate.setDate(i-firstDay+1);

			if(month == myDate.getMonth() && i-firstDay < 32){

				enabled = this.inRange(myDate);

				isToday = this.isToday(year,month,i-firstDay+1);

				htmlStr += '<td align="center">'

				if(enabled){

					df = this.dayFormatter(enabled,year,month,i-firstDay+1);

					l = 'Calendar.onSelectDay('+this.__ID__+',this,'+year+','+month+','+(i-firstDay+1)+')';

					

					if(df.a){

						//htmlStr += '<a href="javascript:Calendar.onSelectDay('+this.__ID__+',this,'+year+','+month+','+(i-firstDay+1)+')">'+(i-firstDay+1)+'</a>';

						htmlStr += '<div class="'+(isToday ? "today" : df.css)+'" onMouseDown="'+l+'">'

						htmlStr += '<a href="#">'+(i-firstDay+1)+'</a>';

						//htmlStr += i-firstDay+1;

					}else{

						htmlStr += '<div class="'+(isToday ? "today" : df.css)+'">'

						htmlStr += (i-firstDay+1);

					}

					htmlStr += '</div>'				

				}else

					htmlStr += '<div class="'+(isToday ? "today" : "dayDisabled")+'">'+(i-firstDay+1)+'</div>';



				htmlStr +='</td>';

			}else

				htmlStr += '<td><div class="dayDisabled"> </div></td>';

		}

			

	}

	htmlStr += '<tr><td colspan="7" align="center"><div class="copywrite"> </div></td></tr>';

	htmlStr += '</table>';

	return htmlStr;

}

p.setMinDate = function(dateObj){

	this.minDate = dateObj;

	this.minBrowseDate = new Date(dateObj.getFullYear(),dateObj.getMonth(),1,0,0,0,0);

}

p.setMaxDate = function(dateObj){

	this.maxDate = dateObj;

	this.maxBrowseDate = new Date(dateObj.getFullYear(),dateObj.getMonth(),1,0,0,0,0);

}

p.getSelected = function(){

	return this.selected;

}

p.show = function(id,dateObj){

	if(id != null) this.div = id;

	document.getElementById(this.div).innerHTML  = this.getHtml(id,dateObj);

}

/**

	@method dayFormatter to be overwritten in instances

	if you like a special behaviour of the days

*/

p.dayFormatter = function(enabled,y,m,d){

	return {a:1,css:"dayEnabled"};

}



delete p;


