﻿// $Id: calendar.js 13 2011-11-01 19:07:06Z erik $

function jsCalendar(obj, month, year, but, xoff, yoff, floatX, floatY) {

	month = ((month > 0) && (month < 13)) ? month : '';
	year = !isNaN(year) ? year : '';

	if (month == ''){
		now = new Date();
		month = now.getMonth();
		day = now.getDate();
		year = now.getFullYear();
		first = new Date((month+1)+'/1/'+year);
		dayweek = first.getDay() - (first.getDate()%7) + 1;
	}
	else{
		if (year == ''){
			now = new Date();
			year = now.getFullYear();
		}
		now = new Date(month+'/1/'+year);
		month = now.getMonth();
		day = now.getDate();
		dayweek = now.getDay() - (now.getDate()%7) + 1;
		year = now.getFullYear();
	}

	var prev = (month == 0) ? '12,' + (year-1) : month + ',' + year;
	var nxt = (month == 11) ? '1,' + (year+1) : month+2 + ',' + year;

	var monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	var monthAbbreviations = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	var dayHeaders = new Array("S","M","T","W","T","F","S");
	var daysinmonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if (((year%4 == 0)&&(year%100 != 0)) || (year%400 == 0)) { daysinmonth[1] = 29; } //leap year

	var output
	output = '<div class="calendar">\n';
	output += '<div class="cmonth">\n';
	output += '<div class="cala"><a id="cmonp" class="hl" href="javascript:jsCalendar(\''+obj+'\','+prev+',\''+but+'\','+xoff+','+yoff+');">&laquo;</a></div>\n';
	output += '<div class="calb">'+monthNames[month]+' '+year+'</div>\n';
	output += '<div class="cala"><a id="cmonn" class="hl" href="javascript:jsCalendar(\''+obj+'\','+nxt+',\''+but+'\','+xoff+','+yoff+');">&raquo;</a></div>\n';
	output += '</div>\n';
	output += '<div class="cweekabb">\n';
	for (var i=0; i<7; i++){ output += '<div class="cdayabb">'+dayHeaders[i]+'</div>\n'; }
	output += '</div>\n';
	var curday = dayweek;
	for (var i=0; i<daysinmonth[month]; i++) {
		if ((curday == 0) || (i == 0)) { output += '<div class="cweek">\n'; }
		curday = curday + 1;
		if (i == 0) { for (var j=0; j<dayweek; j++) { output += '<div class="cday">&nbsp;</div>\n'; }}
		output += '<div id="day'+i+'" class="cday"><a id="dayval'+i+'" href="javascript:jsCalUpd(\''+obj+'\','+(i+1)+','+(month+1)+','+year+');">'+(i+1)+'</a></div>\n';
		if (((i+1) == daysinmonth[month]) && (curday != 7)) {
			var daysleft = 7 - ((daysinmonth[month]+dayweek)%7);
			for (j = 0; j<daysleft; j++) { output += '<div class="cday">&nbsp;</div>\n'; curday = curday + 1;}
		}
		if (curday == 7) { output += '</div>\n'; curday = 0; }
	}
	output += '</div>\n';

	var jscal = document.getElementById('jscal');
	jscal.innerHTML = output;

	// handle floating calendar
	fX = !isNaN(floatX) ? floatX : 0;
	fY = !isNaN(floatY) ? floatY : 0;

	if (fX > 0 || fY > 0) {
		// floating cal
		jsFloat('jscal',fX,fY).flt();
	} else {
		// standard cal
		var button = document.getElementById(but);
		var px = document.layers ? '' : 'px';
		var x = button.x > -1 ? button.x+10 : jsGetX(button)+10;
		var y = button.y > -1 ? button.y+10 : jsGetY(button)+10;
		x = !isNaN(xoff)?x-xoff:x;
		y = !isNaN(yoff)?y-yoff:y;
		jscal.style.left = x+px;
		jscal.style.top = y+px;
	}

	document.onmousedown=jsHideCalClick;
}

function jsCalUpd(obj,day,month,year){
	if (document.getElementById(obj).type == 'text') {
		document.getElementById(obj).value = month+'/'+day+'/'+year;
		document.getElementById('jscal').innerHTML = '';
	}
	else {
		document.getElementById(obj).innerHTML = month+'/'+day+'/'+year;
		document.getElementById('jscal').innerHTML = '';
	}
}

function jsHideCalClick(e){
	var target = (e && e.target) || (event && event.srcElement);
	var jscal = document.getElementById('jscal');
	var cmonp = document.getElementById('cmonp');
	var cmonn = document.getElementById('cmonn');
	var donthide = 0;
	for (i=0;i<=31;i++){
		if (target == document.getElementById('day'+i)?document.getElementById('day'+i):'') { donthide = 1 }
	}
	for (i=0;i<=31;i++){
		if (target == document.getElementById('dayval'+i)?document.getElementById('day'+i):'') { donthide = 1 }
	}
	if ((target != cmonp) && (target != cmonn) && (donthide != 1)) { jscal.innerHTML = ''; document.onmousedown=''; }
}

function jsGetX(obj) {
		x = obj.offsetLeft;
		tmpElement = obj.offsetParent;
	while (tmpElement != null) {
		x += tmpElement .offsetLeft;
		tmpElement = tmpElement .offsetParent;
	}
		return x;
}

function jsGetY(obj) {
		y = obj.offsetTop;
		tmpElement = obj.offsetParent;
	while (tmpElement != null) {
		y += tmpElement.offsetTop;
		tmpElement = tmpElement.offsetParent;
	}
		return y;
}
