function utilParameterExists(name) {
	var param = utilGetUrlParameter(name);

	return (param != null && param != undefined && param.length > 0);
}

function utilGetUrlParameter(name) {
	var regexS = "[\\?&]"+name+"=([^&#]*)";
	var regex = new RegExp( regexS );
	var tmpURL = window.location.href;
	var results = regex.exec( tmpURL );
	if( results == null )
		return "";
	else
		return results[1];
}

function utilBuildDateRange(calMonth, calYear) {
	var lastDateOfMonth = new Date(calYear, parseInt(calMonth)+1, 0);
	var m = parseInt(calMonth) + 1;

	if (m < 10)
		m = "0" + m;
	
	return "?startDate=" + calYear + "-" + m + "-01&endDate=" + calYear + "-" + m + "-" + lastDateOfMonth.getDate();
}

function utilEventClick() {
	//here in case we want to add an action on click of the event
}

function utilSubmitForm(direction) {
	var calForm = document.getElementById("calendarForm");
	var hiddenMonth = document.getElementById("month");
	var hiddenYear = document.getElementById("year");
	var m = parseInt(calMonth);
	var y = parseInt(calYear);

	if (direction == -1) {	// previous month
		if (calMonth == 0) {
			hiddenMonth.value = "11";
			hiddenYear.value = (y - 1);
		}
		else {
			hiddenMonth.value = (m - 1);
			hiddenYear.value = y;
		}
	}
	else {					// next month
		if (calMonth == 11) {
			hiddenMonth.value = "0";
			hiddenYear.value = (y + 1);
		}
		else {
			hiddenMonth.value = (m + 1);
			hiddenYear.value = y;
		}
	}
	
	calForm.submit();
}

function utilShowHoverDiv(hoverItem, containerDivId) {
	var tokens = hoverItem.id.split("_");
	var hoverDiv = document.getElementById("eventHoverDiv_" + tokens[1] + "_" + tokens[2]);

	// Set position of hover-over popup
	hoverDiv.style.left = utilFindPosX(hoverItem) + 18;
	hoverDiv.style.top = utilFindPosY(hoverItem) + 20;
	hoverDiv.style.visibility = "Visible";
}


function utilHideHoverDiv(hoverItem) {
	var tokens = hoverItem.id.split("_");
	var hoverDiv = document.getElementById("eventHoverDiv_" + tokens[1] + "_" + tokens[2]);

	hoverDiv.style.visibility = "Hidden";
}

function utilFindPosX(obj) {
    var curleft = 0;
    if(obj.offsetParent) {
        while(1) {
          curleft += obj.offsetLeft;
		  //alert(obj.id + " " + obj.offsetLeft);
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
	}
    else if(obj.x)
        curleft += obj.x;
	//alert(curleft);
    return curleft;
  }

function utilFindPosY(obj){
    var curtop = 0;
    if(obj.offsetParent)
        while(1){
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
  }

function callServerForXml(calendars, calWriter, parameters) {
	var http = getHTTPObject();
	try {
		http.open("GET", "http://www.nhillscoc.org/calendar/php/getCalendarData.php" + parameters, true);
	} catch (e) {
		//alert("Error: " + e.message);
		// handle error nicely
		return;
	}
	http.onreadystatechange = function() {
		if (http.readyState == 4 && http.status == 200) {
			//var xmlResponse = http.responseXML.documentElement;
			//alert(xmlResponse);
			//gCalObj.parseXml(xmlResponse);
			var responseText = http.responseText;
			//alert(responseText);
			
			var events;
			if (window.ActiveXObject) {
				var doc=new ActiveXObject("Microsoft.XMLDOM");
				doc.async="false";
				doc.loadXML(responseText);
				events = utilStartParsingXml(doc.documentElement);
			}
			// code for Mozilla, Firefox, Opera, etc.
			else {
				var parser=new DOMParser();
				var doc=parser.parseFromString(responseText, "text/xml");
				events = utilStartParsingXml(doc);
			}

			calWriter.writeEvents(calendars, events);
			calWriter.writeListViewEvents(calendars, events);
		}
	}
	http.send(null);
}

function utilGetUpcomingEventXml() {
	var startDate = new Date();
	var endDate = new Date();
	endDate.setDate(endDate.getDate() + 6);
	var parameters = "?startDate=" + startDate.getFullYear() + "-" + (startDate.getMonth() + 1) + "-" + startDate.getDate();
	parameters += "&endDate=" + endDate.getFullYear() + "-" + (endDate.getMonth() + 1) + "-" + endDate.getDate();
	parameters += "&r=" + Math.random();
	//alert(parameters);

	var http = getHTTPObject();
	try {
		http.open("GET", "http://www.nhillscoc.org/calendar/php/getCalendarData.php" + parameters, true);
	} catch (e) {
		alert("Error: " + e.message);
		// handle error nicely
		return;
	}
	http.onreadystatechange = function() {
		if (http.readyState == 4 && http.status == 200) {
			//var xmlResponse = http.responseXML.documentElement;
			//alert(xmlResponse);
			//gCalObj.parseXml(xmlResponse);
			var responseText = http.responseText;
			//alert(responseText);
			
			var events;
			if (window.ActiveXObject) {
				var doc=new ActiveXObject("Microsoft.XMLDOM");
				doc.async="false";
				doc.loadXML(responseText);
				events = utilStartParsingXml(doc.documentElement);
			}
			// code for Mozilla, Firefox, Opera, etc.
			else {
				var parser=new DOMParser();
				var doc=parser.parseFromString(responseText, "text/xml");
				events = utilStartParsingXml(doc);
			}
			writeUpcomingEvents(events, startDate, endDate);
		}
	}
	http.send(null);
}

function utilStartParsingXml(xml) {
	var events;

	if (xml) {
		var eventElements = xml.getElementsByTagName("event");
		events = new Array(eventElements.length);
		if (eventElements) {
			for (var i=0; i<eventElements.length; i++) {
				events[i] = new gCalEvent(eventElements[i]);
			}
		}
	}

	return events;
}

function writeUpcomingEvents(events, startDate, endDate) {
	var eventsDiv = document.getElementById("upcomingEvents");

	if (eventsDiv) {
		// Remove the 'Searching...' text
		var found = false;
		for (var i=0; i<eventsDiv.childNodes.length && !found; i++) {
			if (eventsDiv.childNodes[i].nodeType == 3 && eventsDiv.childNodes[i].nodeValue.indexOf("Searching for upcoming events...") >= 0) {
				eventsDiv.removeChild(eventsDiv.childNodes[i]);
				found = true;
			}
		}

		// Add the date range
		var dateTextDiv = document.createElement("div");
		dateTextDiv.className = "smallH4";
		var dateText = document.createTextNode("(" + getShortDate(startDate, false) + " - " + getShortDate(endDate, false) + ")");
		dateTextDiv.appendChild(dateText);
		eventsDiv.appendChild(dateTextDiv);

		// Add a seperator
		var seperatortDiv = document.createElement("div");
		seperatortDiv.className = "separator";
		eventsDiv.appendChild(seperatortDiv);

		// Print text if no events exist
		if (events.length == 0) {
			var noEventsText = document.createTextNode("No events found");
			eventsDiv.appendChild(noEventsText);
		}

		// Add each event
		for (var i=0; i<events.length; i++) {
			events[i].writeUpcomingEvent(eventsDiv);
		}
	}
}

function getHTTPObject() {
	var xmlhttp;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}

	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) {
			xmlhttp = false;
		}
	}

	return xmlhttp;
}