/*****************************************************************************
*  File: Calendar.js                                                         *
*  Author: Victor Andales                                                    *
*  Copyright: Copyright 2005 Victor Andales, vandalesm@gmail.com			 *
*  Licence: Free for personal and commercial use as long as copyright notice *
*           remains in place. Distribution prohibited without the express    *
*           permission of the owner (vandalesm@gmail.com)			         *
******************************************************************************/

var Global_Calendar_Collection = new Array();

function Calendar(name, month, year) {
	this.day_names = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
	this.month_names = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	this.name=name;
	this.date=new Date(year, month, 1);
	this.month=month;
	this.year=year;
	this.month_name=this.month_names[month];
	this.days=numberOfDays(this);
	this.cell_width=30;
	this.cell_height=25;
	this.div=null;
	this.popup=null;
	this.table=CreateCalendar(this);
	
	this.show=function() { showCalendar(this); }
	this.index=registerCalendar(this);
}

function showCalendar(obj)
	{

	var vDiv=obj.div;
	obj.date=new Date(obj.year, obj.month, 1);
	obj.month_name=obj.month_names[obj.month];
	obj.days=numberOfDays(obj);
	var tbl=CreateCalendar(obj);
	vDiv.innerHTML=tbl;
}

function CreateCalendar(obj) {
	var today=new Date();
	var month_today=today.getMonth();
	var date_today=today.getDate();
	var year_today=today.getYear();
	var date = obj.date;
	var arr_days=obj.day_names;
	var mn=obj.month_names;
	var numdays=obj.days;
	var firstday=date.getDay();
	var rows=Math.ceil((numdays+firstday)/7);
	var day=1;
	var started=false;
	var table="";
	table +="<table style='table-layout:fixed' border='0' cellpadding='0' cellspacing='2'>";
	table +=" <tr>";
	table +="  <td colspan='7' width='"+(obj.cell_width+2)*7+"'>";
	table +="   <table cellpadding='0' cellspacing='2' width='"+(obj.cell_width+4)*7+"' class='calendarToolBar'>";
	table +="    <tr><td align='left'>";
	table +="	 <table border='0' cellpadding='0' cellspacing='2'><tr>";
	table +="     <td onClick=\"changeMonth('"+obj.index+"','"+obj.name+"_MONTH_FIELD','dec')\" align='center' width='10' class='calendarUp' onMouseDown=\"this.className='calendarDown'\" onMouseUp=\"this.className='calendarUp'\" onMouseOut=\"this.className='calendarUp'\"><b><</b></td>";
	table +="	  <td><select onChange=\"changeMonth('"+obj.index+"','"+obj.name+"_MONTH_FIELD','select')\" name='"+obj.name+"_MONTH_FIELD' id='"+obj.name+"_MONTH_FIELD' style=\"width:100px; background-color:#DDDDDD; color:#00416B; border-color:#666666;\">";
	for(x=0; x<mn.length; x++) {
		if(obj.month==x) {
			table +="<option value='"+x+"' selected>"+mn[x]+"</option>";
		}
		else {
			table +="<option value='"+x+"'>"+mn[x]+"</option>";
		}
	}
	table +="    </select></td>";
	table +="     <td onClick=\"changeMonth('"+obj.index+"','"+obj.name+"_MONTH_FIELD','inc')\" align='center' width='10' class='calendarUp' onMouseDown=\"this.className='calendarDown'\" onMouseUp=\"this.className='calendarUp'\" onMouseOut=\"this.className='calendarUp'\"><b>></b></td>";
	table +="	 </tr></table>";
	table +="   </td>";
	table +="   <td align='right' style='padding-right:3px;'>";
	table +="	 <table border='0' cellpadding='0' cellspacing='2'><tr>";
	table +="     <td onClick=\"changeYear('"+obj.index+"','"+obj.name+"_YEAR_FIELD','dec')\" align='center' width='10' class='calendarUp' onMouseDown=\"this.className='calendarDown'\" onMouseUp=\"this.className='calendarUp'\" onMouseOut=\"this.className='calendarUp'\"><b><</b></td>";
	table +="     <td><input type='text' onChange=\"changeYear('"+obj.index+"','"+obj.name+"_YEAR_FIELD','select')\" name='"+obj.name+"_YEAR_FIELD' id='"+obj.name+"_YEAR_FIELD' style='background-color:#DDDDDD; color:#00416B; border-style:solid; border-width:1px; border-color:#666666;' value='"+obj.year+"' size='3'></td>";
	table +="     <td onClick=\"changeYear('"+obj.index+"','"+obj.name+"_YEAR_FIELD','inc')\" align='center' width='10' class='calendarUp' onMouseDown=\"this.className='calendarDown'\" onMouseUp=\"this.className='calendarUp'\" onMouseOut=\"this.className='calendarUp'\"><b>></b></td>";
	table +="	 </tr></table>";
	table +="   </td>";
	table +="  </tr>";
	table +=" </table>";
	table +="</td></tr>";
	table += "<tr>";
	for(y=0; y<7; y++) {
		table += "<td align='center' class='calendarLabel' width='"+obj.cell_width+"' height='"+(obj.cell_height-5)+"'>"+arr_days[y]+"</td>";
	}
	table += "</tr>";
	for(x=0; x<rows; x++) {
		table += "<tr>";
		for(y=0; y<7; y++) {
			if(started & day<=numdays) {
				if((month_today==obj.month) & (date_today==day) & (year_today==obj.year))
					table += "<td class='calendarUpCurrentDate' align='center' onClick=\"processCalendarData('"+day+"','"+obj.name+"')\" onMouseDown=\"this.className='calendarDown'\" onMouseUp=\"this.className='calendarUpCurrentDate'\" onMouseOut=\"this.className='calendarUpCurrentDate'\" onMouseOver=\"this.className='calendarOver'\" width='"+obj.cell_width+"' height='"+obj.cell_height+"'>"+day+"</td>";
				else
					table += "<td class='calendarUp' align='center' onClick=\"processCalendarData('"+day+"','"+obj.name+"')\" onMouseDown=\"this.className='calendarDown'\" onMouseUp=\"this.className='calendarUp'\" onMouseOut=\"this.className='calendarUp'\" onMouseOver=\"this.className='calendarOver'\" width='"+obj.cell_width+"' height='"+obj.cell_height+"'>"+day+"</td>";
				day++;
			}
			else if(y==firstday & day<=numdays) {
				if((month_today==obj.month) & (date_today==day) & (year_today==obj.year))
					table += "<td class='calendarUpCurrentDate' align='center' onClick=\"processCalendarData('"+day+"','"+obj.name+"')\" onMouseDown=\"this.className='calendarDown'\" onMouseUp=\"this.className='calendarUpCurrentDate'\" onMouseOut=\"this.className='calendarUpCurrentDate'\" onMouseOver=\"this.className='calendarOver'\" width='"+obj.cell_width+"' height='"+obj.cell_height+"'>"+day+"</td>";
				else
					table += "<td class='calendarUp' align='center' onClick=\"processCalendarData('"+day+"','"+obj.name+"')\" onMouseDown=\"this.className='calendarDown'\" onMouseUp=\"this.className='calendarUp'\" onMouseOut=\"this.className='calendarUp'\" onMouseOver=\"this.className='calendarOver'\" width='"+obj.cell_width+"' height='"+obj.cell_height+"'>"+day+"</td>";
				started=true;
				day++;
			}
			else {
				table += "<td class='calendarBorder' align='center' width='"+obj.cell_width+"' height='"+obj.cell_height+"'>&nbsp;</td>";
			}
		}
		table += "</tr>";
	}
	table += "</table>";
	return table
}

function changeYear(index,id,method) {
	var obj=Global_Calendar_Collection[index];
	var objYear=eval("document.getElementById('"+id+"')");
	if(method=="inc") {
		objYear.value++;
		obj.year=objYear.value;
	}
	else if(method=="dec") {
		objYear.value--;
		obj.year=objYear.value;
	}
	else if(method=="select") {
		obj.year=objYear.value;
	}
	obj.show();
	if(obj.popup)
		setPopupTitle(obj.popup,obj.month_name+' '+obj.year);
	return true;
}

function changeMonth(index,id,method) {
	var obj=Global_Calendar_Collection[index];
	var objMonthSel=eval("document.getElementById('"+id+"')");
	var mon_val=objMonthSel.value;
	if(method=="inc") {
		if(mon_val==11) {
			mon_val=0;
			obj.month=mon_val;
			obj.year++;
		}
		else {
			mon_val++;
			obj.month=mon_val;
		}
		objMonthSel.options[mon_val].selected=true;
	}
	else if(method=="dec") {
		if(mon_val==0) {
			mon_val=11;
			obj.month=mon_val;
			obj.year--;
		}
		else {
			mon_val--;
			obj.month=mon_val;
		}
		objMonthSel.options[mon_val].selected=true;
	}
	else if(method=="select") {
		obj.month=mon_val;
	}
	obj.show();
	if(obj.popup)
		setPopupTitle(obj.popup,obj.month_name+' '+obj.year);
	return true;
}

function numberOfDays(obj) {
	var month=obj.month;
	var year=obj.year;
    var DSTAdjust = 0;
    // constants used for our calculations below
    var oneMinute = 1000 * 60;
    var oneDay = oneMinute * 60 * 24;
	var date1 = new Date(year, month, 1);
	var date2 = new Date(year, date1.getMonth()+1, 1);
    // take care of spans across Daylight Saving Time changes
    if (date2 > date1) {
        DSTAdjust = (date2.getTimezoneOffset( ) - date1.getTimezoneOffset( )) * oneMinute;
    } else {
        DSTAdjust = (date1.getTimezoneOffset( ) - date2.getTimezoneOffset( )) * oneMinute;    
    }
    var diff = Math.abs(date2.getTime( ) - date1.getTime( )) - DSTAdjust;
    return Math.ceil(diff/oneDay);
}

function registerCalendar(obj) {
	var len=Global_Calendar_Collection.length;
	Global_Calendar_Collection[len]=obj;
	return len;
}