var xmlHttp;

function GetXmlHttpObject()
{ 
	var objXMLHttp=null
	if (window.XMLHttpRequest)
	{
		objXMLHttp=new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	return objXMLHttp;
} 

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function searchDropAjax(div, text, city)
{
	xmlHttp = GetXmlHttpObject();

	if (xmlHttp == null) return;
		
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			if (xmlHttp.status == 200)
			{
				if (xmlHttp.responseText)
					div.innerHTML = xmlHttp.responseText;
				else
					div.innerHTML = '<div class="push">No matches found</div>';
			}
		}
	}
	var url = 'http://www.martiniboys.com/_ajax.eventsDropBox.php?city=' + city + '&search=' + text + '&rand=' + Math.random();
	xmlHttp.open('GET', url, true);
	xmlHttp.send(null);
}

var sto; // manages timeout

function searchDrop(obj, city)
{
	var obj = obj;
	var city = city;
	
	if (sto)
		window.clearInterval(sto);
	
	sto = window.setTimeout(function() 
	{ 
		var coords = findPos(obj);
		var x = coords[0];
		var y = coords[1] + 26;
		var divid = 'searchDropBox';
		
		if (obj.value.length >= 3)
		{
			var exists = document.getElementById(divid);
			if (!exists)
			{
				var div = document.createElement('div');
				div.id = divid;
				div.className = 'calDropBox';
				div.style.top = y + 'px';
				div.style.left = x + 'px';
				searchDropAjax(div, obj.value, city);
				document.body.appendChild(div);
			}
			else
			{
				var div = exists;
				if (div.style.display == 'none')
					div.style.display = '';
				
				searchDropAjax(div, obj.value, city);
			}
		}			
	}, 500);
}

function searchDropHide()
{
	var divid = 'searchDropBox';
	var exists = document.getElementById(divid);
	
	if (exists)
	{
		window.setTimeout(function()
							{
		var div = exists;
		div.style.display = 'none';
							}, 1000);
	}
}

var c = {
	cellPrefix: 'CalCell_',
	callCount: 0,
	buildMonth: function(dir, e)
	{
		if (e) {
			// get rid of the annoying selection on the navigator
			e = (e) ? e : window.event;
			var target = (e.target) ? e.target : e.srcElement;
			
			target.onselectstart = function () { return false; } // ie
			target.onmousedown = function () { return false; } // mozilla
		}
				 
		var q = c.myLogic(dir);
		var year = map[q[0]];
		if (!year) return;
		var month = map[q[0]][q[1]];
		if (!month) return;
		
		var calendar = document.getElementById('mboCalendar');
		if (!calendar) return;
		
		var title = document.getElementById('calendarTitleDayMonth');
		if (!title) return;
		
		c.currentYear = q[0];
		c.currentMonth = q[1];
		c.currentRows = month['rows'];
		c.callCount++;
		
		title.firstChild.nodeValue = month['string'];
		c.rowManager(month['rows']);
		c.plotManager(month['days'], month['offset']);
	},
	myLogic: function(dir)
	{
		var r = new Array;
		
		if (c.currentMonth >= 12 && dir > 0)
		{
			// next year, first month
			r[0] = c.currentYear + 1;
			r[1] = 1;
		}
		else if (c.currentMonth <= 1 && dir < 0)
		{
			// last year, first month
			r[0] = c.currentYear - 1;
			r[1] = 12;
		}
		else if (dir > 0)
		{
			r[0] = c.currentYear;
			r[1] = c.currentMonth + 1;
		}
		else if (dir < 0)
		{
			r[0] = c.currentYear;
			r[1] = c.currentMonth - 1;
		}
		
		return r;
	},
	rowManager: function(rows)
	{
		if (c.currentRows == rows) return;
		
		var tbody = document.getElementById('mboCalendarBody');
		if (!tbody) return;
		
		var count = tbody.childNodes.length;
		var daysPerRow = 7;
		var cellCountStart = 35;
		
		if (c.currentRows < rows)
		{
			// create new
			var tr = document.createElement('tr');
			var cellId = cellCountStart;
			for (i = 0; i < daysPerRow; i++)
			{
				cellId = cellCountStart + i;
				var td = document.createElement('td');
				td.id = c.cellPrefix + cellId;
				var dummy = document.createTextNode('abc');
				td.appendChild(dummy);
				tr.appendChild(td);
			}
			tbody.appendChild(tr);
		}
		else if (c.currentRows > rows)
		{
			// delete row
			tbody.removeChild(tbody.childNodes[count-1]);
		}
	},
	plotManager: function(days, offset)
	{
		var maxDays = 42;
		var dayCounter = 1;
		for (var i = 0; i < maxDays; i++)
		{
			var cell = document.getElementById(c.cellPrefix + i);
			if (!cell) return;
			
			if (cell.firstChild) cell.removeChild(cell.firstChild);
			if (i < offset || i >= days + offset)
			{
				// create empty block
				var div = document.createElement('div');
				var text = document.createTextNode('\u00a0');
				div.appendChild(text);
				cell.appendChild(div);
			}
			else
			{
				// create day block
				var a = document.createElement('a');
				var ymd = c.currentYear.toString() + c.zeroFill(c.currentMonth) + c.zeroFill(dayCounter);
				a.href = c.city + '/event-finder/' + ymd + '/';
				a.onclick = function(event) { 
					var e = (event) ? event : window.event;
					var target = (e.target) ? e.target : e.srcElement;
					ev.callEvents(target.firstChild.nodeValue, c.currentMonth, c.currentYear, event); 
				}
				if (dayCounter == c.today) a.className = 'today';
				var text = document.createTextNode(dayCounter);
				a.appendChild(text);
				cell.appendChild(a);
				dayCounter++;
			}
		}
	},
	resetMonth: function(setCurMonth, setCurYear)
	{
		if (c.callCount == 0) return;
		
		c.currentMonth = setCurMonth;
		c.currentYear = setCurYear;
		c.buildMonth(1);
	},
	zeroFill: function(num)
	{
		num = num.toString();
		if (num.length == 1) return '0' + num;
		else return num;
	}
}

ev = {
	evId: 'c_resultBox',
	callEvents: function(day, month, year, e)
	{
		e = (e) ? e : window.event;
		var ymd = year + c.zeroFill(month) + c.zeroFill(day);
		xmlHttp = GetXmlHttpObject();
		
		if (xmlHttp == null) return;
		
		if (e.preventDefault) e.preventDefault();
		else e.returnValue = false;
		
		xmlHttp.onreadystatechange = ev.openEvents;
		var url = 'http://www.martiniboys.com/_ajax_findbyDate.php?date=' + ymd + '&city=' + c.city + '&rand=' + Math.random();
		xmlHttp.open('GET', url, true);
		xmlHttp.send(null);
	},
	openEvents: function()
	{
		if (xmlHttp.readyState == 4)
		{
			var exists = document.getElementById(ev.evId);
			if (exists) document.body.removeChild(exists);
			var container = document.createElement('div');
			container.id = ev.evId;
			container.innerHTML = xmlHttp.responseText;
			document.body.appendChild(container);
			ev.fadeIn(0, ev.evId);
		}
	},
	closeEvents: function(e)
	{
		e = (e) ? e : window.event;
		if (e.stopPropogation) e.stopPropogation();
		else e.cancelBubble = true;
		
		var exists = document.getElementById(ev.evId);
		if (exists) document.body.removeChild(exists);
		return false;
	},
	fadeIn: function(opacity, objname)
	{
		obj = document.getElementById(objname);
		if (obj)
		{
			if (opacity <= 100)
			{
				if (obj.style.MozOpacity != null) 
				{
					/* Mozilla's pre-CSS3 proprietary rule */
					obj.style.MozOpacity = (opacity/100)-.001;
					/* the .001 fixes a glitch in the opacity calculation which normally results in a flash when reaching 1 */
				} else if (obj.style.opacity != null) 
				{
					/* CSS3 compatible */
					obj.style.opacity = (opacity/100)-.001;
				} else if (obj.style.filter != null) 
				{
					/* IE's proprietary filter */
					obj.style.filter = "alpha(opacity="+opacity+")";
					/* worth noting: IE's opacity needs values in a range of 0-100, not 0.0 - 1.0 */ 
				}
				opacity += 10;
				window.setTimeout("ev.fadeIn("+opacity+", '"+objname+"')", 35);
			}
		}
	},
	launchURL: function(url)
	{
		var newWin = window.open(url, "EventFinder");
		newWin.focus();
	}
}

var map = new Object;
/* <?php 
	... cached ...
	# php to JS
	$map = mapYears();
	foreach ($map as $yearid => $year)
	{
		echo "map[{$yearid}] = new Array;\n";
		if (is_array($year))
		{
			foreach ($year as $monthid => $month)
			{
				echo "map[{$yearid}][{$monthid}] = new Array;\n";
				echo "map[{$yearid}][{$monthid}]['days'] = {$month['days']};\n";
				echo "map[{$yearid}][{$monthid}]['offset'] = {$month['offset']};\n";
				echo "map[{$yearid}][{$monthid}]['rows'] = {$month['rows']};\n";
				echo "map[{$yearid}][{$monthid}]['string'] = '".date('F Y', $month['start'])."';\n";				
			}
		}
	}
	?> */ 
map[2006] = new Array;
map[2006][1] = new Array;
map[2006][1]['days'] = 31;
map[2006][1]['offset'] = 0;
map[2006][1]['rows'] = 5;
map[2006][1]['string'] = 'January 2006';
map[2006][2] = new Array;
map[2006][2]['days'] = 28;
map[2006][2]['offset'] = 3;
map[2006][2]['rows'] = 5;
map[2006][2]['string'] = 'February 2006';
map[2006][3] = new Array;
map[2006][3]['days'] = 31;
map[2006][3]['offset'] = 3;
map[2006][3]['rows'] = 5;
map[2006][3]['string'] = 'March 2006';
map[2006][4] = new Array;
map[2006][4]['days'] = 30;
map[2006][4]['offset'] = 6;
map[2006][4]['rows'] = 6;
map[2006][4]['string'] = 'April 2006';
map[2006][5] = new Array;
map[2006][5]['days'] = 31;
map[2006][5]['offset'] = 1;
map[2006][5]['rows'] = 5;
map[2006][5]['string'] = 'May 2006';
map[2006][6] = new Array;
map[2006][6]['days'] = 30;
map[2006][6]['offset'] = 4;
map[2006][6]['rows'] = 5;
map[2006][6]['string'] = 'June 2006';
map[2006][7] = new Array;
map[2006][7]['days'] = 31;
map[2006][7]['offset'] = 6;
map[2006][7]['rows'] = 6;
map[2006][7]['string'] = 'July 2006';
map[2006][8] = new Array;
map[2006][8]['days'] = 31;
map[2006][8]['offset'] = 2;
map[2006][8]['rows'] = 5;
map[2006][8]['string'] = 'August 2006';
map[2006][9] = new Array;
map[2006][9]['days'] = 30;
map[2006][9]['offset'] = 5;
map[2006][9]['rows'] = 5;
map[2006][9]['string'] = 'September 2006';
map[2006][10] = new Array;
map[2006][10]['days'] = 31;
map[2006][10]['offset'] = 0;
map[2006][10]['rows'] = 5;
map[2006][10]['string'] = 'October 2006';
map[2006][11] = new Array;
map[2006][11]['days'] = 30;
map[2006][11]['offset'] = 3;
map[2006][11]['rows'] = 5;
map[2006][11]['string'] = 'November 2006';
map[2006][12] = new Array;
map[2006][12]['days'] = 31;
map[2006][12]['offset'] = 5;
map[2006][12]['rows'] = 6;
map[2006][12]['string'] = 'December 2006';
map[2007] = new Array;
map[2007][1] = new Array;
map[2007][1]['days'] = 31;
map[2007][1]['offset'] = 1;
map[2007][1]['rows'] = 5;
map[2007][1]['string'] = 'January 2007';
map[2007][2] = new Array;
map[2007][2]['days'] = 28;
map[2007][2]['offset'] = 4;
map[2007][2]['rows'] = 5;
map[2007][2]['string'] = 'February 2007';
map[2007][3] = new Array;
map[2007][3]['days'] = 31;
map[2007][3]['offset'] = 4;
map[2007][3]['rows'] = 5;
map[2007][3]['string'] = 'March 2007';
map[2007][4] = new Array;
map[2007][4]['days'] = 30;
map[2007][4]['offset'] = 0;
map[2007][4]['rows'] = 5;
map[2007][4]['string'] = 'April 2007';
map[2007][5] = new Array;
map[2007][5]['days'] = 31;
map[2007][5]['offset'] = 2;
map[2007][5]['rows'] = 5;
map[2007][5]['string'] = 'May 2007';
map[2007][6] = new Array;
map[2007][6]['days'] = 30;
map[2007][6]['offset'] = 5;
map[2007][6]['rows'] = 5;
map[2007][6]['string'] = 'June 2007';
map[2007][7] = new Array;
map[2007][7]['days'] = 31;
map[2007][7]['offset'] = 0;
map[2007][7]['rows'] = 5;
map[2007][7]['string'] = 'July 2007';
map[2007][8] = new Array;
map[2007][8]['days'] = 31;
map[2007][8]['offset'] = 3;
map[2007][8]['rows'] = 5;
map[2007][8]['string'] = 'August 2007';
map[2007][9] = new Array;
map[2007][9]['days'] = 30;
map[2007][9]['offset'] = 6;
map[2007][9]['rows'] = 6;
map[2007][9]['string'] = 'September 2007';
map[2007][10] = new Array;
map[2007][10]['days'] = 31;
map[2007][10]['offset'] = 1;
map[2007][10]['rows'] = 5;
map[2007][10]['string'] = 'October 2007';
map[2007][11] = new Array;
map[2007][11]['days'] = 30;
map[2007][11]['offset'] = 4;
map[2007][11]['rows'] = 5;
map[2007][11]['string'] = 'November 2007';
map[2007][12] = new Array;
map[2007][12]['days'] = 31;
map[2007][12]['offset'] = 6;
map[2007][12]['rows'] = 6;
map[2007][12]['string'] = 'December 2007';
map[2008] = new Array;
map[2008][1] = new Array;
map[2008][1]['days'] = 31;
map[2008][1]['offset'] = 2;
map[2008][1]['rows'] = 5;
map[2008][1]['string'] = 'January 2008';
map[2008][2] = new Array;
map[2008][2]['days'] = 29;
map[2008][2]['offset'] = 5;
map[2008][2]['rows'] = 5;
map[2008][2]['string'] = 'February 2008';
map[2008][3] = new Array;
map[2008][3]['days'] = 31;
map[2008][3]['offset'] = 6;
map[2008][3]['rows'] = 6;
map[2008][3]['string'] = 'March 2008';
map[2008][4] = new Array;
map[2008][4]['days'] = 30;
map[2008][4]['offset'] = 2;
map[2008][4]['rows'] = 5;
map[2008][4]['string'] = 'April 2008';
map[2008][5] = new Array;
map[2008][5]['days'] = 31;
map[2008][5]['offset'] = 4;
map[2008][5]['rows'] = 5;
map[2008][5]['string'] = 'May 2008';
map[2008][6] = new Array;
map[2008][6]['days'] = 30;
map[2008][6]['offset'] = 0;
map[2008][6]['rows'] = 5;
map[2008][6]['string'] = 'June 2008';
map[2008][7] = new Array;
map[2008][7]['days'] = 31;
map[2008][7]['offset'] = 2;
map[2008][7]['rows'] = 5;
map[2008][7]['string'] = 'July 2008';
map[2008][8] = new Array;
map[2008][8]['days'] = 31;
map[2008][8]['offset'] = 5;
map[2008][8]['rows'] = 6;
map[2008][8]['string'] = 'August 2008';
map[2008][9] = new Array;
map[2008][9]['days'] = 30;
map[2008][9]['offset'] = 1;
map[2008][9]['rows'] = 5;
map[2008][9]['string'] = 'September 2008';
map[2008][10] = new Array;
map[2008][10]['days'] = 31;
map[2008][10]['offset'] = 3;
map[2008][10]['rows'] = 5;
map[2008][10]['string'] = 'October 2008';
map[2008][11] = new Array;
map[2008][11]['days'] = 30;
map[2008][11]['offset'] = 6;
map[2008][11]['rows'] = 6;
map[2008][11]['string'] = 'November 2008';
map[2008][12] = new Array;
map[2008][12]['days'] = 31;
map[2008][12]['offset'] = 1;
map[2008][12]['rows'] = 5;
map[2008][12]['string'] = 'December 2008';
map[2009] = new Array;
map[2009][1] = new Array;
map[2009][1]['days'] = 31;
map[2009][1]['offset'] = 4;
map[2009][1]['rows'] = 5;
map[2009][1]['string'] = 'January 2009';
map[2009][2] = new Array;
map[2009][2]['days'] = 28;
map[2009][2]['offset'] = 0;
map[2009][2]['rows'] = 4;
map[2009][2]['string'] = 'February 2009';
map[2009][3] = new Array;
map[2009][3]['days'] = 31;
map[2009][3]['offset'] = 0;
map[2009][3]['rows'] = 5;
map[2009][3]['string'] = 'March 2009';
map[2009][4] = new Array;
map[2009][4]['days'] = 30;
map[2009][4]['offset'] = 3;
map[2009][4]['rows'] = 5;
map[2009][4]['string'] = 'April 2009';
map[2009][5] = new Array;
map[2009][5]['days'] = 31;
map[2009][5]['offset'] = 5;
map[2009][5]['rows'] = 6;
map[2009][5]['string'] = 'May 2009';
map[2009][6] = new Array;
map[2009][6]['days'] = 30;
map[2009][6]['offset'] = 1;
map[2009][6]['rows'] = 5;
map[2009][6]['string'] = 'June 2009';
map[2009][7] = new Array;
map[2009][7]['days'] = 31;
map[2009][7]['offset'] = 3;
map[2009][7]['rows'] = 5;
map[2009][7]['string'] = 'July 2009';
map[2009][8] = new Array;
map[2009][8]['days'] = 31;
map[2009][8]['offset'] = 6;
map[2009][8]['rows'] = 6;
map[2009][8]['string'] = 'August 2009';
map[2009][9] = new Array;
map[2009][9]['days'] = 30;
map[2009][9]['offset'] = 2;
map[2009][9]['rows'] = 5;
map[2009][9]['string'] = 'September 2009';
map[2009][10] = new Array;
map[2009][10]['days'] = 31;
map[2009][10]['offset'] = 4;
map[2009][10]['rows'] = 5;
map[2009][10]['string'] = 'October 2009';
map[2009][11] = new Array;
map[2009][11]['days'] = 30;
map[2009][11]['offset'] = 0;
map[2009][11]['rows'] = 5;
map[2009][11]['string'] = 'November 2009';
map[2009][12] = new Array;
map[2009][12]['days'] = 31;
map[2009][12]['offset'] = 2;
map[2009][12]['rows'] = 5;
map[2009][12]['string'] = 'December 2009';