/**
	CalendarComponent
	v1.2
	author: Dale Lum
	last edited: 6 Aug 2008; 2:30 pm
	
	
	CONSTRUCTOR: CalendarComponent(calId, month, year)
	
		usage: returns a CalendarComponent object you'll need for use in
			the public methods
		
		parameters:
			- calId: HTML id of an element into which the calendar will be inserted
			- month: numerical month to initially display (1=January, 12=December)
			- year: 4-digit year to initially display
			
	PUBLIC METHODS:
	
		init(obj)
		description: (REQUIRED) initializes calendar object 
		parameters: 
			- obj: object returned by constructor
		
			
		highlightDate(dayNum)
		description: marks a particular date as selected
		parameters: 
			- dayNum: numerical date to highlight
			
		highlightDates(startDayNum,endDayNum)
		description: marks a date range as selected
		parameters: 
			- startDayNum: numerical date to highlight
			- endDayNum: numerical date to highlight
	
			
		prevMon(obj)
		description: navigates to previous month
		parameters:
			- obj: object returned by constructor

			
		nextMon(obj)
		description: navigates to next month
		parameters:
			- obj: object returned by constructor

		setSearchBoxIds(advSearchId,sDateBoxId,eDateBoxId,toggleId)			
		description: if using advanced form search box, inits ids
			- advSearchId: id of div that contains adv search box
			- sDateBoxId: id of start date box
			- eDateBoxId: id of send date box
			- toggleId: id of 'more options' link
		
	PRIVATE METHOD YOU'LL WANT TO EDIT:
		viewDate(e, obj)
		description: returns the date, month, and year when
			the user clicks on a particular date
		
	EXAMPLE:

		var o = new CalendarComponent('calwrapper',1,2008);
		o.init(o);
		o.nextMon(o);			
		o.highlightDate(12);	
		
*/
	
function CalendarComponent(calId,month,year,url) {
	this.calId = calId;
	this.currM = month;
	this.currY = year;
	this.url = url;
	this.prevBut;
	this.nextBut;

	this.advSearch;
	this.startDateBox;
	this.endDateBox;			
	this.toggleId;
	// advanced search box state - is open?;
	this.advSearchOn = false;

	this.fieldName = "";	
	
	var MONTHS = {
		names: ["January","February","March","April","May","June","July","August","September","October","November","December"],
		numDays: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
	};
	
	/* ---- PUBLIC METHODS  ---- */
	this.init = function(obj) {
		writeCalendar(this.currY, this.currM);	

		this.prevBut = document.getElementById(calId+"-prevMonth");
		this.nextBut = document.getElementById(calId+"-nextMonth");
		
		var tds = document.getElementById(calId).getElementsByTagName("td");
		var as = document.getElementById(calId).getElementsByTagName("a");

		for (var i=0; i < tds.length; i++) {
			// checks if cell is empty
			if (Math.round(tds[i].innerHTML) !==0) {
				addEvent(tds[i], "mouseover", hoverOn, false);	
				addEvent(tds[i], "mouseout", hoverOff, false);
				addEvent(tds[i], "focus", hoverOn, false);	
				addEvent(tds[i], "blur", hoverOff, false);				
				if (as[i]) {
					addEvent(as[i], "mouseover", hoverOn, false);	
					addEvent(as[i], "mouseout", hoverOff, false);
					addEvent(as[i], "focus", hoverOn, false);	
					addEvent(as[i], "blur", hoverOff, false);					
				}
				//addEvent(tds[i], "click", setDate, false);
				addEvent(tds[i], "click", function(e) {viewDate(e, obj);}, false);				
			}
		}
		addEvent(obj.prevBut, "click", function() {obj.prevMon(obj);}, false);
		addEvent(obj.nextBut, "click", function() {obj.nextMon(obj);}, false);
	};

	this.prevMon = function(obj) {
		if (obj.currM == 1) {
			obj.currM = 12;
			obj.currY--;
		} else {
			obj.currM--;
		}
		obj.init(obj);
	};

	this.nextMon = function(obj) {
		if (obj.currM == 12) {
			obj.currM = 1;
			obj.currY++;
		} else {
			obj.currM++;
		}
		this.init(obj);
	};
	
	this.highlightDate = function (dayNum) {
		this.highlightDates(dayNum, dayNum);
	}

	this.highlightDates = function (startDayNum, endDayNum) {	
		clearDates();

		var as = document.getElementById(calId).getElementsByTagName("A");			

		for (var i = 0; i < as.length; i++) {
			if (Number(as[i].innerHTML) >= Number(startDayNum) && Number(as[i].innerHTML) <= Number(endDayNum)) {
				as[i].parentNode.className="active";
			}
		}
	};
	
	this.setCurrentDate = function (dayNum) {
		var as = document.getElementById(calId).getElementsByTagName("A");			

		for (var i = 0; i < as.length; i++) {
			if (as[i].lastChild.data == dayNum) {
				as[i].className="current";
			}
		}
	}

	this.toggleAdvSearch = function () {
		var adv = document.getElementById(this.advSearch);
		var tog = document.getElementById(this.toggleId);

		this.resetAdvSearch();
			
		if (adv.style.display == "block") {
			adv.style.display = "none";
			tog.innerHTML = "more options";
			this.advSearchOn = false;
		} else {
			adv.style.display = "block";
			tog.innerHTML = "fewer options";
			this.advSearchOn = true;			
		}
	}
	
	this.resetAdvSearch = function () {
		var sel = document.getElementById(this.advSearch).getElementsByTagName("SELECT");
		var inp = document.getElementById(this.advSearch).getElementsByTagName("INPUT");	
		
		for (var i = 0; i < sel.length; i++) {
			sel[i].selectedIndex = 0;
		}

		for (var i = 0; i < inp.length; i++) {
			if (inp[i].type.toLowerCase() === "text") {
				inp[i].value = "";
			}

			if (inp[i].type.toLowerCase() === "checkbox") {
				inp[i].checked = false;
			}
		}

	}
	
	this.setSearchBoxIds = function (advSearchId,sDateBoxId,eDateBoxId,toggleId) {
		this.advSearch = advSearchId;
		this.startDateBox = sDateBoxId;
		this.endDateBox = eDateBoxId;		
		this.toggleId = toggleId;		
	}
	
	
	/* ---- PRIVATE METHODS  ---- */

	function writeCalendar(year, monthNum) {
		var out = "";
		
		if (year > 1582 && year <= 25000) {
			out += '<table class="calendar" cellspacing="0" summary="Buffalo.com events calendar. Click on a date to see events for that date."><thead><tr>';
			out += '<th class="month"><a href="#" id="'+calId+'-prevMonth'+'" onclick=\"return false\" tabindex="0">&laquo;<\/a><\/th><th colspan="5" id="'+calId+'-title'+'" class="month">' + MONTHS.names[monthNum-1] + ' ' + year + '<\/th><th class="month"><a href="#" id="'+calId+'-nextMonth'+'" onclick=\"return false\" tabindex="0">&raquo;<\/a><\/th><\/tr>';
			out += '<tr class="days"><th><abbr title="Sunday">S<\/abbr><\/th><th><abbr title="Monday">M<\/abbr><\/th><th><abbr title="Tuesday">T<\/abbr><\/th><th><abbr title="Wednesday">W<\/abbr><\/th>';
			out += '<th><abbr title="Thursday">T<\/abbr><\/th><th><abbr title="Friday">F<\/abbr><\/th><th><abbr title="Saturday">S<\/abbr><\/th><\/tr><\/thead>';
			out += "<tbody><tr>";
			
			if (isLeap(year) === true) {
				MONTHS.numDays[1] = 29;
			} else {	
				MONTHS.numDays[1] = 28;
			}
				
			var jday = julianDay(1, monthNum, year);
                var fday = dayOfWeek(year, jday);

			for (var idx = 1; idx < fday; idx++) {
				out += "<td><\/td>";
			}			 

			out += "<td><a href=\"#\" onclick=\"return false\" tabindex=\"0\">1<\/a><\/td>";

                for (var j = 2; j <= MONTHS.numDays[monthNum-1]; j++) {
				if (dayOfWeek(year, julianDay(j-1, monthNum, year)) == 7) {
					out += "<\/tr><tr>";
				}
				out += "<td><a href=\"#\" onclick=\"return false\">"+ j + "<\/a><\/td>";
                }	

			for (var k = dayOfWeek(year,julianDay(MONTHS.numDays[monthNum-1], monthNum, year)); k < 7; k++) {
				out += "<td><\/td>";
			}
		
			out += "<\/tr><\/tbody><\/table>";
		}

		document.getElementById(calId).innerHTML = out;
	}

	function viewDate(e, obj) {
		var d;
		var dest;
		
		if (getSrcEle(e).nodeName == "TD") {
			d = getSrcEle(e).lastChild.innerHTML;
		} else if (getSrcEle(e).nodeName == "A") {
			d = getSrcEle(e).innerHTML;	
		}
	
		var m = obj.currM;
		var y = obj.currY;

/*		if (typeof(obj.advSearch) != 'undefined' && document.getElementById(obj.advSearch).style.display == "block") {
			document.getElementById(obj.startDateBox).value = y+"-"+m+"-"+d;
			document.getElementById(obj.endDateBox).value = y+"-"+m+"-"+MONTHS.numDays[m-1];
			obj.highlightDates(d,MONTHS.numDays[m-1])
		} else {*/
			obj.highlightDate(d);
/*		}*/

		if (m.toString().length === 1) {
			m = "0" + m;	
		}

		if (d.toString().length === 1) {
			d = "0" + d;	
		}

		if (obj.fieldName !== "") {
			document.getElementById(obj.fieldName).value = y + "-" + m + "-" + d;		
			document.getElementById(obj.calId).style.display = "none";
		} else {
			dest = obj.url.replace(/%Y/g, y).replace(/%M/g, m).replace(/%D/g, d);
//			if (obj.advSearchOn === false) {
				window.location.href = dest;
//			}
		}
	}

		
	function hoverOn(e) {
		var obj;
		
		if (getSrcEle(e).nodeName == "TD") {
			obj = getSrcEle(e);	
		} else if (getSrcEle(e).nodeName == "A") {
			obj = getSrcEle(e).parentNode;	
		}

		if (obj.className === "")	{
			obj.className = "hover";
		}
	}

	function hoverOff(e) {
		var obj;
		
		if (getSrcEle(e).nodeName == "TD") {
			obj = getSrcEle(e);	
		} else if (getSrcEle(e).nodeName == "A") {
			obj = getSrcEle(e).parentNode;	
		}

		if (obj.className == "hover")	{
			obj.className = "";
		}
	}
	
	function setDate(e) {
//		clearDates();
//		var obj = getSrcEle(e).parentNode;
//		obj.className = "active";
	}

	function clearDates() {
		var tds = document.getElementById(calId).getElementsByTagName("td");		
		for (var i=0; i < tds.length; i++) {
			tds[i].className = "";
		}
	}
	
	// Next three methods loosely based on code from:
	// www.chaoszone.org/misc/gregorian.html 
	function isLeap(year) {
		if ((year % 100 !== 0) && (year % 4 === 0) || (year % 400 === 0)) {
			return true;
		} else {
			return false;
		}
	}
	
	function julianDay(startDate, monthNum, year) {
		var j = startDate;
		
		for(var i = 1; i < monthNum; i++)	{
			j += MONTHS.numDays[i-1];
		}
		return j;	
	}
	
	function dayOfWeek(year, julian) {
		var code = (year - (-julian) + Math.floor( (year-1)/4 ) - Math.floor( (year-1)/100 ) + 
			Math.floor( (year-1)/400 )) % 7;
		if (code === 0) {
			return 7;
		}
		return code;	
	}
	
	// returns element that fired an event
	function getSrcEle(obj) {
		if (obj.srcElement) {
			return obj.srcElement;
		} else if (obj.target) {
			return obj.target;
		}
	}

	// utility method for registering event listeners
	function addEvent( obj, type, fn ) {
		if ( obj.attachEvent ) {
			obj['e'+type+fn] = fn;
			obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
			obj.attachEvent( 'on'+type, obj[type+fn] );
		} else {
			obj.addEventListener( type, fn, false );
		}
	}

	// utility method for deregistering event listeners
	function removeEvent( obj, type, fn ) {
		if ( obj.detachEvent ) {
			obj.detachEvent( 'on'+type, obj[type+fn] );
			obj[type+fn] = null;
		} else {
			obj.removeEventListener( type, fn, false );
		}
	}	
	
}	

function submitForm() {
	if (document.getElementById('id_q1').value === 'search by event') {
		document.getElementById('id_q1').value = '';
	}

	return true;
}

function toggleCat(id) {
	var o = document.getElementById(id);
	if (o.style.display === "block") {
		o.style.display = "none";
	} else {
		o.style.display = "block";	
	}
}