/* XML functions */
function verify() {
	// 0 Object is not initialized
	// 1 Loading object is loading data
	// 2 Loaded object has loaded data
	// 3 Data from object can be worked with
	// 4 Object completely initialized
	if (xmlDatesDoc.readyState != 4) {
		return false;
	}
}
function stripWhitespaceDoublePass (theNode) {
//alert("stripWhitespaceDoublePass invoked. theNode="+theNode);
	// Loop through all children of theNode
	for ( var i=0; i<theNode.childNodes.length; i++) {
		// if the current node is a text node...
		if (theNode.childNodes[i].nodeType ==3) {
			// Check for any useful chars in the code
			var j=0;
			var emptyNode = true;
			for (j=0; j < theNode.childNodes[i].nodeValue.length; j++ ){
				if (theNode.childNodes[i].nodeValue.charCodeAt(j) > 32) {
					emptyNode = false;
					break;
				}
			}
			// If no useful chars are found, delete the node
			if (emptyNode) theNode.removeChild(theNode.childNodes[i]);
		}
	}
	// Now that all whitespace nodes have been removed,
	// call this function recursively on remaining children
	for (var k=0; k < theNode.childNodes.length; k++) stripWhitespaceDoublePass(theNode.childNodes[k]);
}
function loadDatesXML ( filename, whereDisplay, numElements ) {
//alert("loadProjectXML invoked. filename="+filename);
	fileLocation = '/xml/';														// Where files are stored
	var xmlToLoad = fileLocation+filename+'.xml';								// Name of xml data file
	numDates = numElements;														// Number of elements to show
	displayDatesDiv = document.getElementById(whereDisplay);							// Set the display location
	// Load the xml data
	// Assumptions: There is an XML file with the specified filename
	if (document.implementation && document.implementation.createDocument){
		// Mozilla
//alert("loadXML invoked. Browser is FF");
		xmlDatesObj = document.implementation.createDocument("", "", null);
  		xmlDatesObj.onload = function() {
			stripWhitespaceDoublePass(this);
			parseDatesXML();
		}
  		xmlDatesObj.load(xmlToLoad);
		//alert(xmlDatesObj.nodeValue);
	} else if(window.ActiveXObject) {
		// IE
//alert("loadXML invoked. Browser is FF");
		xmlDatesDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDatesDoc.async="false";
		xmlDatesDoc.onreadystatechange=verify;
		xmlDatesDoc.load(xmlToLoad);
		xmlDatesObj=xmlDatesDoc.documentElement;
		parseDatesXML();
	} else {
		// Browser unknown
//		alert("Browser unknown");
		xmlDatesDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDatesDoc.async="false";
		xmlDatesDoc.onreadystatechange=verify;
		xmlDatesDoc.load(xmlToLoad);
		xmlDatesObj=xmlDatesDoc.documentElement;
		parseDatesXML();
	}
}
function parseDatesXML () {
//alert("parseDatesXML invoked. xmlDatesObj.firstChild.tagName="+xmlDatesObj.firstChild.tagName);
	// Assumptions: displayDatesDiv exists
	function getTagText ( searchElement, tagName ) {
		var tagArray = searchElement.getElementsByTagName(tagName);
		if (tagArray.length > 0) {
			if (tagArray[0].firstChild){
				if (tagArray[0].firstChild.nodeValue.length>0){return tagArray[0].firstChild.nodeValue;}
			}
		}
		return "";
	}
	// Create prototype for event object
	function eventObj (date, time, location, description, address) {
		this.date = date;
		this.time = time;
		this.location = location;
		this.description = description;
		this.address = address;
	}
	
	// Sort a given array of eventObjs by date
	function sortEventArraysByDate ( tArray ) {
		for ( var i=0; i < tArray.length; i++ ) {
			for ( var j=1; j < tArray.length; j++ ) {
				if (new Date(tArray[i].date) > new Date(tArray[j].date)) {
					var tempEventObj = tArray[i];
					tArray[i] = tArray[j];
					tArray[j] = tempEventObj;
				} else {
					if ((i==0) && (j==(tArray.length-1))) {
						var tempEventObj = tArray[j];
						tArray[j] = tArray[i];
						tArray[i] = tempEventObj;
					}
				}
			}
		}
	}
	function displayArray ( tArray, location ) {
		// Make a reference to the display DIV
		var elementDiv = document.getElementById( location );
		// For every event in the array,
		for ( var i=0; i < tArray.length; i++ ) {
			// Display Date/Time
			var tText = "";
			var tDate = tArray[i].date;
			tText = tDate;
			var tTime = tArray[i].time;
			if (tTime.length>0) {tText += ", "+tTime;}
			
			// Create doc elements
			var dateElement = document.createElement("span");
			dateElement.className="date";
			var dateElementText = document.createTextNode(tText);
			dateElement.appendChild(dateElementText);
			
			// Display Location & Description (map link if available)
			var tLocationText = tArray[i].location;
			var tDescriptionText = tArray[i].description;
			var tAddressText = tArray[i].address;
			// Create doc elements
			var locationElement = document.createElement("span");
			locationElement.className="location";
			var tText = document.createTextNode( tLocationText );

			if (tAddressText.length > 0) {
				var aNode = document.createElement("a");
				aNode.setAttribute("href", mapString+tAddressText);
				aNode.appendChild(tText);						
				locationElement.appendChild(aNode);
				if (tDescriptionText.length>0){
					var tText2 = document.createTextNode(" "+tDescriptionText);
					locationElement.appendChild(tText2);
				}
			} else {
				//if (tDescriptionText.length > 0){tText.nodeValue+=(tDescription[0].firstChild.nodeValue);}
				if (tDescriptionText.length > 0){tText.nodeValue+=tDescriptionText}
				locationElement.appendChild(tText);
			}
			// Append event to HTML
			elementDiv.appendChild(dateElement);
			elementDiv.appendChild(locationElement);
		}
	} // endfor every event
	
	// Get today's date
	var todaysDate = new Date();
	// Convert to milliseconds from 1970/01/01
	var milli = todaysDate.getTime();
	// Subtract 1 days worth of minutes
	milli = milli - 86400000;
	// Make this today's date
	todaysDate.setTime(milli);

	// If displayDatesDiv exists
	if (displayDatesDiv) {
		// If XML contains events
		var events = xmlDatesObj.getElementsByTagName("event");
		//alert ("events.length="+events.length);
		if (events.length > 0) {
			// Create Upcoming Shows div
			var upcomingElementDiv = document.createElement("div");
			upcomingElementDiv.id = "upcomingCalendar";
			var upcomingElementTitle = document.createElement("h2");
			var upcomingElementTitleText = document.createTextNode( "Upcoming");
			upcomingElementTitle.appendChild( upcomingElementTitleText );
			upcomingElementDiv.appendChild( upcomingElementTitle );
			// Attach upcoming shows div to HTML			
			displayDatesDiv.appendChild( upcomingElementDiv );
			
			// Create TBA Shows div
			var tbaElementDiv = document.createElement("div");
			tbaElementDiv.id = "tbaCalendar";
			var tbaElementTitle = document.createElement("h2");
			var tbaElementTitleText = document.createTextNode( "TBA");
			tbaElementTitle.appendChild( tbaElementTitleText );
			tbaElementDiv.appendChild( tbaElementTitle );
			// Attach TBA shows div to HTML			
			displayDatesDiv.appendChild( tbaElementDiv );
			
			// Create Past Shows div
			var pastElementDiv = document.createElement("div");
			pastElementDiv.id = "pastCalendar";
			var pastElementTitle = document.createElement("h2");
			var pastElementTitleText = document.createTextNode( "Past");
			pastElementTitle.appendChild( pastElementTitleText );
			pastElementDiv.appendChild( pastElementTitle );
			// Attach past shows div to HTML
			displayDatesDiv.appendChild( pastElementDiv );
			
			// Create arrays for holding events
			var upcomingEvents = new Array();
			var tbaEvents = new Array();
			var pastEvents = new Array();
			
			// For every event in the XML,
			for ( var i=0; i < events.length; i++ ) {
				var tDate = getTagText( events[i], "date" );
				var tTime = getTagText( events[i], "time" );
				var tLocation = getTagText( events[i], "location" );
				var tDescription = getTagText( events[i], "description" );
				var tAddress = getTagText( events[i], "address" );
				
				// Create the eventObj for storage
				var tEvent = new eventObj (tDate, tTime, tLocation, tDescription, tAddress);
				
				// If date is TBA, append eventObj to tba array
				if (tDate.toUpperCase() == "TBA") {
					tEvent.date = tDate.toUpperCase();
					tbaEvents.push( tEvent );
				} else {
					// Create date element for event
					var eventDate = new Date( tDate );	
//alert("i="+i+", tDate="+tDate+", eventDate="+eventDate+", todaysDate="+todaysDate);
					// Based on date, append eventObj to proper array
					if ( eventDate < todaysDate) {
						pastEvents.push( tEvent );
					} else {
						upcomingEvents.push( tEvent );
					}
				}
			}
			
			// Sort the events
			sortEventArraysByDate( upcomingEvents );
			upcomingEvents.reverse();
			sortEventArraysByDate( pastEvents );
			// Eventually reverse sort the pastEvents
			
			// Display the events
			displayArray( upcomingEvents, "upcomingCalendar");
			displayArray( tbaEvents, "tbaCalendar");
			displayArray( pastEvents, "pastCalendar" );
			
		}// endif XML contains events
	}
}// end function

var xmlDatesDoc;																	// The XML file
var xmlDatesObj;  																// The resulting XML object
var displayDatesDiv;																// The display
var numDates;																// Number of dates to display
var mapString = "http://maps.google.com/maps?sa=X&oi=map&ct=title&q=";		// Address for map site