/*extern UrlString */

function Details(EventID) {
  OpenWindow = window.open("Details.asp?EventID=" + EventID, "displayDetails", "resizable=1, scrollbars=1, toolbar=0, left=400, top=80, width=600, height=450");
}

function Calendar()
{
	this.today = null;
	this.curDate = null;
	this.calElem = null;
	this.specialDates = [];

	// Options
	this.showAdjacentMonthDates = false;
	this.dayOfMonthType = 1;
}

Calendar.prototype.init = function()
{
	this.today = new Date();
	if (document.getElementById("cal_cur_date") && document.getElementById("cal_cur_date").value)
	{
		this.curDate = new Date(document.getElementById("cal_cur_date").value);
	}
	else
	{
		this.curDate = new Date();
	}

	document.write('<div id="cal_container"></div>');
};

Calendar.prototype.create = function()
{
	var numRows = Date.getWeeksInMonth(this.curDate.getMonth(), this.curDate.getFullYear());

	var cal_calendar = "";
	cal_calendar += '<table id="cal_calendar" class="cal_calendar" cellpadding="0" cellspacing="0" cols="7">';
	cal_calendar += '  <thead>';
	cal_calendar += '    <tr>';
	cal_calendar += '      <td class="cal_button cal_leftArrow">';
        cal_calendar += '      </td>';
	cal_calendar += '      <td class="cal_title" colspan="5"></td>';
	cal_calendar += '      <td class="cal_button cal_rightArrow">';
        cal_calendar += '      </td>';
	cal_calendar += '    </tr>';
	cal_calendar += '    <tr>';
	cal_calendar += '      <td class="cal_dayOfWeek cal_weekend">' + Date._DS[this.dayOfMonthType][0] + '</td>';
	cal_calendar += '      <td class="cal_dayOfWeek">' + Date._DS[this.dayOfMonthType][1] + '</td>';
	cal_calendar += '      <td class="cal_dayOfWeek">' + Date._DS[this.dayOfMonthType][2] + '</td>';
	cal_calendar += '      <td class="cal_dayOfWeek">' + Date._DS[this.dayOfMonthType][3] + '</td>';
	cal_calendar += '      <td class="cal_dayOfWeek">' + Date._DS[this.dayOfMonthType][4] + '</td>';
	cal_calendar += '      <td class="cal_dayOfWeek">' + Date._DS[this.dayOfMonthType][5] + '</td>';
	cal_calendar += '      <td class="cal_dayOfWeek cal_weekend">' + Date._DS[this.dayOfMonthType][6] + '</td>';
	cal_calendar += '    </tr>';
	cal_calendar += '  </thead>';
	cal_calendar += '  <tbody>';
	for (var i = 0; i < numRows; i++)
	{
		cal_calendar += '    <tr>';
		cal_calendar += '      <td class="cal_date cal_weekend"></td>';
		cal_calendar += '      <td class="cal_date"></td>';
		cal_calendar += '      <td class="cal_date"></td>';
		cal_calendar += '      <td class="cal_date"></td>';
		cal_calendar += '      <td class="cal_date"></td>';
		cal_calendar += '      <td class="cal_date"></td>';
		cal_calendar += '      <td class="cal_date cal_weekend"></td>';
		cal_calendar += '    </tr>';
	}
	cal_calendar += '  </tbody>';
	cal_calendar += '</table>';

	document.getElementById("cal_container").innerHTML = cal_calendar;

	this.calElem = document.getElementById("cal_calendar");

	this.fill();
};

Calendar.prototype.getSrcElement = function(event)
{
	return (window.event ? window.event.srcElement : event.currentTarget);
};

Calendar.prototype.stopEvent = function(ev) {
	if (!ev)
	{
		ev = window.event;
	}
	if (Calendar.is_ie) {
		ev.cancelBubble = true;
		ev.returnValue = false;
	} else {
		ev.preventDefault();
		ev.stopPropagation();
	}
	return false;
};

Calendar.getDateFromElem = function(elem)
{
        var classes = elem.className.split(' ');
	for (var i = 0; i < classes.length; i++)
	{
		if (classes[i].indexOf("cal_date_") === 0)
		{
			return parseInt(classes[i].substring(9), 10);
		}
	}
	return 0;
};

Calendar.elemMouseOver = function(event)
{
	var elem = Calendar.prototype.getSrcElement(event);
	Calendar.addClass(elem, "cal_mouseover");
};

Calendar.elemMouseOut = function(event)
{
	var elem = Calendar.prototype.getSrcElement(event);
	Calendar.removeClass(elem, "cal_mouseover");
};

Calendar.elemMouseUp = function(event)
{
	var tBodyElem = this.calElem.tBodies[0];
	for (var i = 0; i < tBodyElem.rows.length; i++)
	{
		var rowElem = tBodyElem.rows[i];
		for (var j = 0; j < rowElem.cells.length; j++)
		{
			var cellElem = rowElem.cells[j];
			Calendar.removeClass(cellElem, "cal_selected");
		}
	}

	var elem = Calendar.prototype.getSrcElement(event);
	Calendar.addClass(elem, "cal_selected");
	return Calendar.prototype.stopEvent(event);
};

Calendar.setMouseOverEvent = function(elem)
{
	Calendar.addEvent(elem, "mouseover", Calendar.elemMouseOver);
	Calendar.addEvent(elem, "mouseout", Calendar.elemMouseOut);
};

Calendar.setMouseClickEvent = function(elem, url)
{
	if (window.top && Calendar.targetTop == true)
	{
		Calendar.addEvent(elem, "click", function() { window.top.location.href = url; });
	}
	else
	{
		Calendar.addEvent(elem, "click", function() { EventInfo(url); });
	}
};

Calendar.generateLink = function(thisDate, type)
{
	var newDate = new Date(thisDate);
	var url = new UrlString(Calendar.baseURL || null); 
	newDate.setDate(newDate.getDate());
	url.set("", newDate.eventString());
	return url;
};

Calendar.prototype.addSpecialDate = function(date)
{
	// date should be a js Date object
	this.specialDates.push(date);
};

Calendar.prototype.fill = function()
{
	var cal = this;

	this.calElem = document.getElementById("cal_calendar");
	var titleElem = this.calElem.tHead.rows[0].cells[1];
	Calendar.setText(titleElem, this.curDate.getMonthString() + " " + this.curDate.getFullYear());
	Calendar.setMouseOverEvent(titleElem);
	Calendar.setMouseClickEvent(titleElem, Calendar.generateLink(this.curDate, "calendar"));
	Calendar.addClass(titleElem, "cal_enabled");

	var prevMonthElem = this.calElem.tHead.rows[0].cells[0];
	Calendar.addEvent(prevMonthElem, "click", function() { return cal.movePrevMonth.apply(cal); });
	Calendar.setMouseOverEvent(prevMonthElem);
	Calendar.addClass(prevMonthElem, "cal_enabled");

	var nextMonthElem = this.calElem.tHead.rows[0].cells[2];
	Calendar.addEvent(nextMonthElem, "click", function() { return cal.moveNextMonth.apply(cal); });
	Calendar.setMouseOverEvent(nextMonthElem);
	Calendar.addClass(nextMonthElem, "cal_enabled");

	// Create a date for the first of the month
	var tempDate = new Date(this.curDate);
	tempDate.setDate(1);
	var daysInMonth = tempDate.getDaysInMonth();
	tempDate.setDate(1-tempDate.getDay());

	var curMonth = false;

	var tBodyElem = this.calElem.tBodies[0];
	for (var i = 0; i < tBodyElem.rows.length; i++)
	{
		var rowElem = tBodyElem.rows[i];

		for (var j = 0; j < rowElem.cells.length; j++)
		{
			var cellElem = rowElem.cells[j];

			if (tempDate.getDate() == 1)
			{
				curMonth = !curMonth;
			}

			if (curMonth || this.showAdjacentMonthDates)
			{
				Calendar.setText(cellElem, tempDate.getDate());
				if (this.specialDates.length == 0 && tempDate.getTime() >= this.today.getTime()) 
				{
					Calendar.setMouseClickEvent(cellElem, Calendar.generateLink(tempDate));
					Calendar.setMouseOverEvent(cellElem);
				}
			}
			else
			{
				Calendar.addClass(cellElem, "cal_empty");
			}

			if (curMonth)
			{
				if (this.specialDates.length == 0)
				{
					Calendar.addClass(cellElem, "cal_enabled");
				}
				Calendar.addClass(cellElem, "cal_date_" + tempDate.getDate());


				if (tempDate.getDate() == this.today.getDate() &&
				    tempDate.getMonth() == this.today.getMonth() &&
				    tempDate.getFullYear() == this.today.getFullYear())
				{
					// xxxxx Calendar.addClass(cellElem, "cal_today");
					Calendar.addClass(cellElem, "cal_enabled");
					Calendar.setMouseClickEvent(cellElem, tempDate.getFullYear().toString()+LZ(tempDate.getMonth().toString())+LZ(tempDate.getDate().toString()));
					Calendar.setMouseOverEvent(cellElem);
				}
				else if (tempDate.getTime() < this.today.getTime())
				{
					Calendar.addClass(cellElem, "cal_past");
					Calendar.removeClass(cellElem, "cal_enabled");
				}

				for (var k = 0; k < this.specialDates.length; k++)
				{
					var specialDate = this.specialDates[k];
					if (specialDate['date'].getDate() == tempDate.getDate() &&
				    	    specialDate['date'].getMonth() == tempDate.getMonth() &&
				    	    specialDate['date'].getFullYear() == tempDate.getFullYear())
					{
						Calendar.addClass(cellElem, "cal_special");
						Calendar.addClass(cellElem, "cal_enabled");
						Calendar.setMouseClickEvent(cellElem, specialDate['url']);
						Calendar.setMouseOverEvent(cellElem);
						
					}
				}
			}
			else
			{
				Calendar.addClass(cellElem, "cal_disabled");
			}
			tempDate.setDate(tempDate.getDate() + 1);
		}
	}
};

Calendar.prototype.setYear = function(y)
{
	if (this.curDate.getMonth() == Date.FEB && this.curDate.getDate() > 28)
	{
		var max = this.curDate.getDaysInMonth(this.curDate.getMonth(), y);
		this.curDate.setDate(max);
	}
	this.curDate.setYear(y);
};

Calendar.prototype.setMonth = function(m)
{
	var day = this.curDate.getDate();
	var max = this.curDate.getDaysInMonth(m);
	if (day > max)
	{
		this.curDate.setDate(max);
	}
	this.curDate.setMonth(m);

	if (document.getElementById("cal_cur_date"))
	{
		document.getElementById("cal_cur_date").value = this.curDate.toString();
	}
};

Calendar.setDay = function(d)
{
	this.curDate.setDate(d); 
};

Calendar.prototype.movePrevMonth = function()
{
	this.setMonth(this.curDate.getMonth() - 1);
	this.create();
};

Calendar.prototype.moveNextMonth = function()
{
	this.setMonth(this.curDate.getMonth() + 1);
	this.create();
};


//
// Browser detection
//

Calendar.is_ie = ( /msie/i.test(navigator.userAgent) && !(/opera/i.test(navigator.userAgent)) );
Calendar.is_ie5 = ( Calendar.is_ie && (/msie 5\.0/i.test(navigator.userAgent)) );
Calendar.is_opera = /opera/i.test(navigator.userAgent);
Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);


//
// Manipulation of Nodes in the document.
//

Calendar.removeChildren = function(elem)
{
	while (elem.firstChild)
	{
		elem.removeChild(elem.firstChild);
	}
};

Calendar.setLink = function(elem, txt, href)
{
	Calendar.removeChildren(elem);
	var link = document.createElement("a");
	link.appendChild(document.createTextNode(txt));
	link.setAttribute("href", href);
	elem.appendChild(link);
};

Calendar.setText = function(elem, txt)
{
	Calendar.removeChildren(elem);
	elem.appendChild(document.createTextNode(txt));
};

Calendar.isClass = function(elem, name)
{
	var classes = elem.className.split(' ');
	var isClass = false;
	for (var i = 0; i < classes.length && !isClass; i++)
	{
		if (classes[i] == name)
		{
			isClass = true;
		}
	}

	return isClass;
};

Calendar.addClass = function(elem, name)
{
	if (!Calendar.isClass(elem, name))
	{
		elem.className += " " + name;
	}
};

Calendar.removeClass = function(elem, name)
{
	var classes = elem.className.split(' ');
	for (var i = 0; i < classes.length; i++)
	{
		if (classes[i] == name)
		{
			classes.splice(i, 1);
		}
	}
	elem.className = classes.join(' ');
};

Calendar.getElementsByClassName = function(name, tag)
{
	if (!tag)
	{
		tag = "*";
	}

	if (typeof(name) != 'object')
	{
		name = [name];
	}

	var elems = document.getElementsByTagName(tag);
	var match = [];
	for (var j = 0; j < name.length; j++)
	{
		var regexp = new RegExp("(^|\\s)" + name[j] + "(\\s|$)");
		var elem;
		for (var i = 0; i < elems.length; i++)
		{
			elem = elems[i];
			if (regexp.test(elem.className))
			{
				match.push(elem);
			}
		}
	}
	return match;
};

Calendar.addEvent = function(elem, event, func)
{
	// IE
	if (elem.attachEvent)
	{
		elem.attachEvent("on" + event, func);
	}
	// W3C
	else if (elem.addEventListener)
	{
		elem.addEventListener(event, func, true);
	}
	// Other
	else
	{
		elem["on" + event] = func;
	}
};

Calendar.removeEvent = function(elem, event, func)
{
	// IE
	if (elem.detachEvent)
	{
		elem.detachEvent("on" + event, func);
	}
	// W3C
	else if (elem.removeEventListener)
	{
		elem.removeEventListener(event, func, true);
	}
	// Other
	else
	{
		elem["on" + event] = null;
	}
};
