/****************************************************
 * Calendar Gadget                                  *
 * copyright Garth Engwall 2009                     *
 *                                                  *
 * You may freely use this code and bastardize it   *
 * any which way you please. Just don't come crying *
 * to me when it doesn't work. No support is        *
 * offered or should be assumed related to this     *
 * gadget                                           *
 ****************************************************/

/***** This script builds the calendar divs *****/

td = new Date();

//Get date parms
m = td.getMonth();
var glb_m = m;
var glb_td_m = m;
d = td.getDate();
var glb_td_d = d;
dy = td.getDay();
y = td.getFullYear();
var glb_y = y;
var glb_td_y = y;
mos = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
dys = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
dys_short = new Array("Su","Mn","Tu","Wd","Th","Fr","St");
title = mos[m] + " " + y;
td_txt = dys[dy] + " " + mos[m] + " " + d + ", " + y;
td_1st = td;
td_1st.setDate(1);
mo_str_dy = td_1st.getDay();
td_1st = new Date(y,m+1,0);
mo_dys = td_1st.getDate();
td_1st = new Date(y,m,0);
prev_mo_dys = td_1st.getDate();

//build shell top
var cal_txt = ''
cal_txt = cal_txt + 
	'<div id="CalendarContainer">' + '\f\n' +
	'<div id="calContBorder">' + '\f\n' + 
	'<div id="calCont" class="calBorder' + (cal_cont_border?'On':'Off') + '">' + '\f\n' +
	'\t' + '<div id="calNav" style="text-align:center">' + '\f\n' +
	'\t\t' + '<div style="float:left;width:22%;text-align:left;margin-top:1px">' + '\f\n' +
	'\t\t' + '<span>&nbsp;&nbsp;<a id="dn_yr" href="" style="font-weight:bold" onclick="changeMonth(this.id);return false"><<</a>&nbsp;</span>' + '\f\n' +
	'\t\t' + '<span><a id="dn_mo" href="" style="font-weight:bold" onclick="changeMonth(this.id);return false"><</a>&nbsp;&nbsp;&nbsp;&nbsp;</span>' + '\f\n' +
	'\t\t' + '</div>' + '\f\n' +
	'\t\t' + '<div style="float:left;width:56%;text-align:center">' + '\f\n' +
	'\t\t' + '<span id="title" class="currmo">' + title + '</span>' + '\f\n' +
	'\t\t' + '</div>' + '\f\n' +
	'\t\t' + '<div style="float:right;width:22%;text-align:right;margin-top:1px">' + '\f\n' +
	'\t\t' + '<span>&nbsp;&nbsp;&nbsp;&nbsp;<a id="up_mo" href="" style="font-weight:bold" onclick="changeMonth(this.id);return false">></a></span>' + '\f\n' +
	'\t\t' + '<span>&nbsp;<a id="up_yr" href="" style="font-weight:bold" onclick="changeMonth(this.id);return false">>></a>&nbsp;&nbsp;</span>' + '\f\n' +
	'\t\t' + '</div>' + '\f\n' +
	'\t' + '</div>' + '\f\n' +
	'\t' + '<div id="calBorder">' + '\f\n' +
	'\t' + '<div id="cal" class="border' + (cal_border?'On':'Off') + '">' + '\f\n' +
	'' + '\f\n'

//build header
cal_txt = cal_txt +
	'\t\t' + '<div id="calHeader" class="calRow">' + '\f\n' +
	'\t\t\t' + '<div id="0|0" class="headerWkCell">' + '\f\n' +
	'\t\t\t' + 'Wk#' + '\f\n' +
	'\t\t\t' + '</div>' + '\f\n'

//week day names
var dn = wk_str_dy;
for (l=1;l<=7;l++) {
	cal_txt = cal_txt +
	'\t\t\t' + '<div id="0|' + l + '" class="headerDyCell' + (Math.ceil(l/2)-Math.floor(l/2)==0?'Alt':'') + '">' + '\f\n' +
	'\t\t\t' + dys_short[dn] + '\f\n' +
	'\t\t\t' + '</div>' + '\f\n'
	dn = (dn==6?0:dn+1);
}

cal_txt = cal_txt +
	'\t\t' + '</div>' + '\f\n' +
	'' + '\f\n'

//build calendar
//set calendar starting date (either prev mo or this mo)
dy_ctr = mo_str_dy - wk_str_dy;
dy_ctr = (dy_ctr>=0?dy_ctr:7+dy_ctr);
dy_ctr = prev_mo_dys - dy_ctr + 1;
off_mo = -1;
we_dy_1 = 7-wk_str_dy;
we_dy_2 = (we_dy_1==7?1:we_dy_1+1);
onejan = new Date(y,0,1);
wk_num = Math.ceil((((td - onejan) / 86400000) + onejan.getDay()+1)/7);
//alert(Math.ceil((((td - onejan) / 86400000) + onejan.getDay() + 1)/7))
//build rows
for (r=1;r<=6;r++) {
	cal_txt = cal_txt +
	'\t\t' + '<div id="calDates' + r + '" class="calRow">' + '\f\n'

	//build wknum
	cal_txt = cal_txt +
	'\t\t\t' + '<div id="' + r + '|0" class="WkCell">' + '\f\n' +
	'\t\t\t' + wk_num + '\f\n' +
	'\t\t\t' + '</div>' + '\f\n'
	wk_num = wk_num + 1;

	//build week
	wk_txt = '';
	for (c=1;c<=7;c++) {
		if ( dy_ctr > prev_mo_dys ) {
			dy_ctr = 1;
			prev_mo_dys = mo_dys;
			off_mo = -1 - off_mo;
		}
		wk_txt = wk_txt +
		'\t\t\t' + '<div id="' + r + '|' + c + '" title="" class="DyCell' + (Math.ceil(c/2)-Math.floor(c/2)==0?'Alt':'') + (off_mo?' OffMo':'') + ((c==we_dy_1||c==we_dy_2)&&!off_mo?' Weekend':'') + (dy_ctr==d&&!off_mo?' CurrDt':'') + '" onmouseover="mvHL(this)" onmouseout="mtHL()">' + '\f\n' +
		'\t\t\t' + '<span' + (!off_mo?' id="dt'+ dy_ctr + '"':'') + '>' + dy_ctr + '</span>' + '\f\n' +
		'\t\t\t' + '</div>' + '\f\n'
		dy_ctr = dy_ctr + 1;
	}

	cal_txt = cal_txt + wk_txt +
	'\t\t' + '</div>' + '\f\n'
}

arr_holidays = getHolidays(y,m+1,holiday_types).split('|');
for (hlp=0;hlp<arr_holidays.length;hlp++) {
	holiday_els = arr_holidays[hlp].split('!');
	re = new RegExp('(<div id=".\\|.".title=")(.*)(".class=")(DyCell(?!.*OffMo).*)(" onmouseover="\\S*" onmouseout="\\S*">\\s*<span.*>' + holiday_els[0] + '<\\/span>\\s*<\\/div>)');
	arr_d_match = cal_txt.match(re);
	class_txt = arr_d_match[4] + ' Holiday';
	//Holidays take precedence over weekends
	re2 = /Weekend/
	class_txt = class_txt.replace(re2,'');
	//Add or appened title
	ttl_txt = arr_d_match[2];
	ttl_txt = ttl_txt + (ttl_txt!=''?'\r':'') + holiday_els[1];
	cal_txt = cal_txt.replace(re,"$1" + ttl_txt + "$3" + class_txt + "$5");
}

cal_txt = cal_txt +
	'' + '\f\n'



//build shell bottom
cal_txt = cal_txt +
	'\t' + '</div>' + '\f\n' +
	'\t' + '</div>' + '\f\n' +
	'\t' + '<div id="Footer">' + '\f\n' +
	'\t\t' + td_txt + '\f\n' +
	'\t' + '</div>' + '\f\n' +
	'</div>' + '\f\n' +
	'</div>' + '\f\n' +
	'</div>'

function changeMonth(parms) {

p_els = parms.split("_");
dir = p_els[0];
per = p_els[1];
d = new Date(glb_y,glb_m,1)
td = new Date();
switch (dir) {
	case 'up':
		dir_val = 2;
		break;
	case 'dn':
		dir_val = 0;
		break;
}
switch (per) {
	case 'mo':
		d.setDate(16*dir_val);
		break;
	case 'yr':
		d.setYear(d.getYear()+(dir_val-1));
		break;
}
glb_y = d.getFullYear();
glb_m = d.getMonth();

//set title
document.getElementById('title').innerHTML = mos[d.getMonth()] + " " + d.getFullYear();

//there are 6 rows x (1 + 7) columns that need to change
d.setDate(1)
td_1st = d;
td_1st.setDate(1);
mo_str_dy = td_1st.getDay();
td_1st = new Date(glb_y,glb_m+1,0);
mo_dys = td_1st.getDate();
td_1st = new Date(glb_y,glb_m,0);
prev_mo_dys = td_1st.getDate();
dy_ctr = mo_str_dy - wk_str_dy;
dy_ctr = (dy_ctr>=0?dy_ctr:7+dy_ctr);
dy_ctr = prev_mo_dys - dy_ctr + 1;
off_mo = -1;
we_dy_1 = 7-wk_str_dy;
we_dy_2 = (we_dy_1==7?1:we_dy_1+1);
onejan = new Date(glb_y,0,1);
wk_num = Math.ceil((((d - onejan) / 86400000) + onejan.getDay() + 1)/7);

for (r=1;r<=6;r++) {
	document.getElementById(r +'|0').innerHTML = wk_num
	for (c=1;c<=7;c++) {
		if ( dy_ctr > prev_mo_dys ) {
			dy_ctr = 1;
			prev_mo_dys = mo_dys;
			off_mo = -1 - off_mo;
		}
		with (document.getElementById(r + '|' + c)) {
			className = 'DyCell' + (Math.ceil(c/2)-Math.floor(c/2)==0?'Alt':'') + (off_mo?' OffMo':'') + ((c==we_dy_1||c==we_dy_2)&&!off_mo?' Weekend':'') + ((glb_m==glb_td_m&&glb_y==glb_td_y&&dy_ctr==glb_td_d&&!off_mo)?' CurrDt':'');
			cell_txt = '<span';
			if ( !off_mo ) { 
				cell_txt = cell_txt + ' id="dt' + dy_ctr + '"';
			}
			cell_txt = cell_txt + '>'+ dy_ctr + '</span>';
			innerHTML = cell_txt;
			title = '';
		}
		dy_ctr = dy_ctr + 1;
	}
	wk_num = wk_num + 1;
}

//holidays
arr_holidays = getHolidays(glb_y,glb_m+1,holiday_types).split('|');
re2 = /Weekend/
for (hlp=0;hlp<arr_holidays.length;hlp++) {
	holiday_els = arr_holidays[hlp].split('!');
	date_cell = document.getElementById('dt' + holiday_els[0]);
	class_txt = date_cell.parentNode.className;
	class_txt = class_txt + " Holiday";
	//Holidays take precedence over weekends
	class_txt = class_txt.replace(re2,'');
	date_cell.parentNode.className = class_txt;
	date_cell.parentNode.title = date_cell.parentNode.title + (date_cell.parentNode.title>''?'\r':'') + holiday_els[1]
}

}

function mvHL(el) {
	hlw=el.id.substr(0,1);
	hld=el.id.substr(2,1);
	//highlight rows
	for (hllp=1;hllp<=7;hllp++) {
		with (document.getElementById(hlw + '|' + hllp)) {
			if (className.indexOf('CurrDt') < 0 ) {
				className = className + " DyCellHover";
			}
		}
		if (hllp < 7 ) {
			with (document.getElementById(hllp + '|' + hld)) {
				if (className.indexOf('CurrDt') < 0 && className.indexOf('DyCellHover') < 0) {
					className = className + " DyCellHover";
				}
			}
		}
	}
}
function mtHL () {
	for (hlr=1;hlr<=6;hlr++) {
		for (hlc=1;hlc<=7;hlc++) {
			with (document.getElementById(hlr + '|' + hlc)) {
				className = className.replace(/DyCellHover/g,'');
			}
		}
	}
}