/*****************************************
/* 	XML Date Display
/*	November 11, 2010
/* 	Ver 1.2
/* 		Added multiple date sorting
/*		Added unescape / HTML to description
/*		Added target=_blank for Google Maps link
/*		Added Chrome and Safari compaitibility
/*		
/* 	Written by Samuel J. Lovetro, III
/* 	Site: lovetro.com
/*
/*	Function:
/*		Will read a specified XML file with the following format:
/*		<document>
/*			<event>
/*				<image>fileName</image>									// No folder or extention, those are defined below
/*				<startDate>11/8/2006</startDate>						// Start date of the event (##/##/####) 
/*				<startTime>6pm</startTime>								// Optional value: Start time of the event
/*				<endDate>11/9/2006</endDate>							// Optional value: End date of the event (##/##/####) 
/*				<endTime>8pm</endTime>									// Optional value: End time of the event
/*				<name>Autumn Fall Festival</name>						// Optional value: Name of the event
/*				<venue>The Flipside Bar and Grill</venue>				// Name of the venue
/*				<address>2001 E. Main St 14609</address>				// Optional value: Address of venue for Google Maps link
/*				<description>Classical Happy Hour!</description>		// Optional value: Description of Event
/*			</event>
/*		</document>
/*
/*		Will output the following HTML code:
/*		<div class="event">
/*			<div class="image"><img src="images/fileName.jpg" alt="[name_value]" width="150" height="150"/></div>
/*			<div class="text">
/*				<div class="dayDateTime">Wednesday, November 8, 2006, 6pm - Thursday, November 9, 2006, 8pm</div>
/*				<div class="name">Autumn Fall Festival</div>
/*				<div class="venue"><a href="[mapLink + address_value]" target="_blank">The Flipside Bar and Grill</div>
/*				<div class="description">Classical Happy Hour!</div>
/*			</div>
/*			<div class="clear" /></div> 								// Needed for IE floats
/*		</div>
*/

var xmlEventsObj;
var xmlloaded = false;

function addLoadEvent (func) {
//alert ("addLoadEvent: func="+func);
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function () {
			oldonload();
			func();
		}
	}
}
/* 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 (xmlEventsDoc.readyState != 4) {
		return false;
	}
}
function stripWhitespaceDoublePass (theNode) {
//alert("stripWhitespaceDoublePass invoked. theNode.childNodes.length="+theNode.childNodes.length);
	// 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 loadEventsXML ( filename, whereDisplay, numElements ) {
	// Assumptions: There is an XML file with the specified filename
//alert("loadEventsXML invoked. filename="+filename);
	var xmlToLoad = xmlFolder + filename + '.xml';										// Name of xml data file
	numDates = numElements;																// Number of elements to show
	eventsDisplayDiv = document.getElementById( whereDisplay );							// Set the display location
	importXML( xmlToLoad );
}
function importXML( xmlfile )
{
	try
	{
		var xmlhttp = new XMLHttpRequest();
		xmlhttp.open( "GET", xmlfile, false);
	}
	catch (Exception)
	{
		var ie = ( typeof window.ActiveXObject != 'undefined' );

		if( ie )
		{
			xmlEventsObj = new ActiveXObject( "Microsoft.XMLDOM" );
			xmlEventsObj.async = false;
			while( xmlEventsObj.readyState != 4 ) {};
			xmlEventsObj.load( xmlfile );
			parseEventsXML();
			xmlloaded = true;
		}
		else
		{
			xmlEventsObj = document.implementation.createDocument( "", "", null );
			xmlEventsObj.onload = parseEventsXML;
			xmlEventsObj.load( xmlfile );
			xmlloaded = true;
		}
	};
	if (!xmlloaded)
	{
		xmlhttp.setRequestHeader( 'Content-Type', 'text/xml' );
		xmlhttp.send("");
		xmlEventsObj = xmlhttp.responseXML;
		parseEventsXML();
		xmlloaded = true;
	};
};
function parseEventsXML () {
//alert("parseEventsXML invoked. xmlEventsObj.firstChild.tagName="+xmlEventsObj.firstChild.tagName);
	// Assumptions: eventsDisplayDiv 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 null;
	}
	// Create prototype for event object
	function eventObj (image, startDate, startTime, endDate, endTime, name, venue, address, description) {
		this.image = image;
		this.name = name;
		this.venue = venue;
		this.address = address;
		if (description != null) {
			this.description = unescape( description );
		} else {
			this.description = null;
		}

		// If there's a start time, add it to startDate object << NOT DONE
		if ( startDate.toUpperCase() != 'TBA' ) {
			var tMonth;
			if ( startTime != null ) {
				this.startTime = startTime;
				//this.startDate = new Date( startDate + ' ' + startTime ); << NOT THAT EASY
				this.startDate = new Date( startDate );
			} else {
				this.startTime = null;
				this.startDate = new Date( startDate );
			}
			// If there's an endTime, add it to endDate object << NOT DONE
			if ( endDate != null ) {
				// If there's a endTime, add it to endDate object << NOT THAT EASY
				if ( endTime != null ) {
					this.endTime = startTime;
					//this.endDate = new Date( endDate + endTime );
					this.endDate = new Date( endDate );
				} else {
					this.endTime = null;
					this.endDate = new Date( endDate );
				}
			} else {
				this.endDate = null;
			}
			// Create dayDateTime text
			var weekday=new Array(7);
			weekday[0]="Sunday";
			weekday[1]="Monday";
			weekday[2]="Tuesday";
			weekday[3]="Wednesday";
			weekday[4]="Thursday";
			weekday[5]="Friday";
			weekday[6]="Saturday";
				
			var month=new Array(12);
			month[0]="January";
			month[1]="February";
			month[2]="March";
			month[3]="April";
			month[4]="May";
			month[5]="June";
			month[6]="July";
			month[7]="August";
			month[8]="September";
			month[9]="October";
			month[10]="November";
			month[11]="December";
			
			var startDay = weekday[ this.startDate.getDay() ];
			var startMonth = month[ this.startDate.getMonth() ];		
			var startDateNumber = this.startDate.getDate();
			var startYear = this.startDate.getFullYear();
			var startDayDate = startDay + ', ' + startMonth + ' ' + startDateNumber + ', ' + startYear;
			if ( startTime != null ) startDayDate += ', ' + startTime;
			var dayDateTime = startDayDate;
			
			if ( endDate != null ) {
				var endDay = weekday[ this.endDate.getDay() ];
				var endMonth = month[ this.endDate.getMonth() ];
				var endDateNumber = this.endDate.getDate();
				var endYear = this.endDate.getFullYear();
				var endDayDate = endDay + ', ' + endMonth + ' ' + endDateNumber + ', ' + endYear;
				if ( endTime != null ) endDayDate += ', ' + endTime;
				dayDateTime += ' - ' + endDayDate;
			} else {
				if ( endTime != null ) dayDateTime += ' - ' + endTime;
			}
			this.dayDateTime = dayDateTime;

		} else {
			this.startDate = 'TBA';
			this.startTime = null;
			this.endDate = null;
			this.endTime = null;
			this.dayDateTime = 'TBA';
		}
	}
	// Sort a given array of eventObjs by date
	function sortEventArraysByDate ( tArray ) {
//var test ="";
//alert( "tArray.length="+tArray.length);
		for ( var i=0; i<tArray.length; i++ ) {
			for( var j=tArray.length-1; j > i; j-- ) {
				if ( tArray[ j-1 ].startDate > tArray[ j ].startDate ) {
					var tempEventObj = tArray[ j-1 ];
					tArray[ j-1 ] = tArray[ j ];
					tArray[ j ] = tempEventObj;
				}
			}
//for ( var w=0; w<tArray.length; w++ ) test+=tArray[w].startDate+"     "; alert(test); test="";*/
		}
	}
	function displayArray ( events, location ) {
		// Make a reference to the display DIV
		var elementDiv = document.getElementById( location );

		// For every events in the array,
		for ( var i=0; i < events.length; i++ ) {
			// Create the events container
			var eventDiv = document.createElement( 'div' );
			eventDiv.className = 'event';
			// If an image is defined, add it to the container
			if ( events[i].image != null ){
				var imageDiv = document.createElement( 'div' );
				imageDiv.className = 'image';
				var tImg = document.createElement( 'img' );
				tImg.src = imagesFolder + events[i].image + imageType;
				tImg.alt = events[i].image;
				imageDiv.appendChild( tImg );
				eventDiv.appendChild( imageDiv );
			}
			// Create the container for text
			var textDiv = document.createElement( 'div' );
			textDiv.className = 'text';
			eventDiv.appendChild( textDiv );
			var dayDateTimeDiv = document.createElement( 'div' );
			dayDateTimeDiv.className = 'dayDateTime';
			if ( events[ i ].endDate == null ) {
				dayDateTimeDiv.appendChild( document.createTextNode( events[ i ].dayDateTime ));
			} else {
				dayDateTimeDiv.appendChild( document.createTextNode( events[ i ].dayDateTime.slice( 0, events[ i ].dayDateTime.indexOf(' - ')+3)));
				dayDateTimeDiv.appendChild( document.createElement( 'br' ));
				dayDateTimeDiv.appendChild( document.createTextNode( events[ i ].dayDateTime.slice( events[ i ].dayDateTime.indexOf(' - ')+3, events[ i ].dayDateTime.length )));
			}
			textDiv.appendChild( dayDateTimeDiv );
			// Display Name
			if ( events[ i ].name != null ){
				var nameDiv = document.createElement( 'div' );
				nameDiv.className = 'name';
				nameDiv.appendChild( document.createTextNode( events[ i ].name ));
				textDiv.appendChild( nameDiv );
			}
			// Display Venue & Description (map link if available)
			var venueDiv = document.createElement( 'div' );
			venueDiv.className = 'venue';
			if ( events[ i ].address != null ) {
				var aNode = document.createElement( 'a' );
				aNode.setAttribute( 'href', mapString + events[ i ].address );
				aNode.setAttribute( 'title', 'Get directions from Google Maps' );
				aNode.setAttribute( 'target', '_blank' );
				aNode.appendChild( document.createTextNode( events[ i ].venue ));
				venueDiv.appendChild( aNode );
				textDiv.appendChild( venueDiv );

				var addressDiv = document.createElement( 'div' );
				addressDiv.className = 'address';
				addressDiv.appendChild( document.createTextNode( events[ i ].address ));
				textDiv.appendChild( addressDiv );				
			} else {
				venueDiv.appendChild( document.createTextNode( events[i].venue ));
				textDiv.appendChild( venueDiv );
			}
			// Display Description
			if ( events[ i ].description != null ){
				var descriptionDiv = document.createElement( 'div' );
				descriptionDiv.className = 'description';
				if ( useDescriptionHTML ) {
					descriptionDiv.innerHTML = unescape( events[ i ].description );
				} else {
					descriptionDiv.appendChild( document.createTextNode( events[ i ].description ));
				}
				textDiv.appendChild( descriptionDiv );
			}
			// Add a clear div for IE floats
			var clearDiv = document.createElement( 'div' );
			clearDiv.className = 'clear';
			eventDiv.appendChild( clearDiv );
			elementDiv.appendChild( eventDiv );
		}// endfor every event
	} // end displayArray
	
	// Get today's date minus one day for display purposes
	var todaysDate = new Date() - 1;

	if ( eventsDisplayDiv ) {
		// If XML contains events
		var events = xmlEventsObj.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( titleElement );
			var upcomingElementTitleText = document.createTextNode( 'Upcoming Events' );
			upcomingElementTitle.appendChild( upcomingElementTitleText );
			upcomingElementDiv.appendChild( upcomingElementTitle );
			
			// Create TBA Shows div
			var tbaElementDiv = document.createElement( 'div' );
			tbaElementDiv.id = 'tbaCalendar';
			var tbaElementTitle = document.createElement( titleElement );
			var tbaElementTitleText = document.createTextNode( 'TBA Events' );
			tbaElementTitle.appendChild( tbaElementTitleText );
			tbaElementDiv.appendChild( tbaElementTitle );			
			
			// Create Past Shows div
			var pastElementDiv = document.createElement( 'div' );
			pastElementDiv.id = 'pastCalendar';
			var pastElementTitle = document.createElement( titleElement );
			var pastElementTitleText = document.createTextNode( 'Past Events' );
			pastElementTitle.appendChild( pastElementTitleText );
			pastElementDiv.appendChild( pastElementTitle );
			
			// 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 tImage = getTagText( events[ i ], 'image' );
				var tStartDate = getTagText( events[ i ], 'startDate' );
				var tStartTime = getTagText( events[ i ], 'startTime' );
				var tEndDate = getTagText( events[ i ], 'endDate' );
				var tEndTime = getTagText( events[ i ], 'endTime' );
				var tName = getTagText( events[ i ], 'name' );
				var tVenue = getTagText( events[ i ], 'venue' );
				var tAddress = getTagText( events[ i ], 'address' );
				var tDescription = getTagText( events[ i ], 'description' );
				
				// Create the eventObj for storage
				var tEvent = new eventObj( tImage, tStartDate, tStartTime, tEndDate, tEndTime, tName, tVenue, tAddress, tDescription );
	
				// If date is TBA, append eventObj to tba array
				if (tStartDate.toUpperCase() == 'TBA' ) {
					tEvent.startDate = tStartDate.toUpperCase();
					tbaEvents.push( tEvent );
				} else {
					// Based on date, append eventObj to proper array
					if ( tEvent.startDate < todaysDate) {
						if ( tEvent.endDate ) {
							if ( tEvent.endDate < todaysDate ) {
								pastEvents.push( tEvent );
							} else {
								upcomingEvents.push( tEvent );
							}
						} else {
							pastEvents.push( tEvent );
						}
					} else {
						upcomingEvents.push( tEvent );
					}
				}
			}
			
			// Sort the events --> Not sorting. Appear in order.
			sortEventArraysByDate( upcomingEvents );
			//upcomingEvents.reverse();
			sortEventArraysByDate( pastEvents );
			//pastEvents.reverse();
			
			// Display the events
			if ( upcomingEvents.length >0 ) {
				// Attach upcoming shows div to HTML			
				eventsDisplayDiv.appendChild( upcomingElementDiv );
				displayArray( upcomingEvents, 'upcomingCalendar');
			}
			if ( tbaEvents.length >0 ) {
				// Attach upcoming shows div to HTML			
				eventsDisplayDiv.appendChild( tbaElementDiv );
				displayArray( tbaEvents, 'tbaCalendar' );
			}
			if ( pastEvents.length >0 ) {
				// Attach upcoming shows div to HTML			
				eventsDisplayDiv.appendChild( pastElementDiv );
				displayArray( pastEvents, 'pastCalendar' );
			}
		}// endif XML contains events
	}
}// end function
