
YAHOO.namespace("example.calendar");
var selected_dates = new Array() ;
var doing_deselect = false ;
var event_calendar_state_filter;
var event_calendar_sort_filter = "start_time";
function init()
{
	// create the calendar object
//	YAHOO.example.calendar.cal1 = new YAHOO.widget.Calendar("cal1","cal1Container", { MULTI_SELECT: true, selected: "12/10/2006" });
	YAHOO.example.calendar.cal1 = new YAHOO.widget.Calendar("cal1","cal1Container", { MULTI_SELECT: true });



	///
	/// define event handler functions
	///

	var mySelectHandler = function(type,args,obj)
	{
//		alert("Selected: " + this._toDate(args[0][0]));		// note the double array

		// if they fired the select event, that means it was previously unselected, so we need to repopulate the calendar
		var dates = (selected_dates.length) ? this._parseDates( selected_dates.join(',')) : '' ;
		this.cfg.setProperty("selected", dates, true) ;
		this.render() ;
	};



	var myBeforeDeselectHandler = function(type,args,obj)
	{
		doing_deselect = true ;
	}

	var myDeselectHandler = function(type,args,obj)
	{
//		alert("Deselected: " + this._toDate(args[0]));
		
		// if they are deselecting something, that means it was already selected and we need to keep it selected
		if (selected_dates.length)
		{
			// if we have some dates, then select them and re-render
			this.cfg.setProperty("selected", this._parseDates( selected_dates.join(',')), true) ;
			this.render() ;
		}


		// we now need to contact the server to get event info for this day
		var handleSuccess = function(o)
		{
//alert(o.responseText);
//document.getElementById("output").innerHTML = o.responseText ;
			if(o.responseXML !== undefined)
			{
				// get the events for this day, then display the details
				var events =  process_event_xml( o.responseXML) ;
				update_event_detail_div( events) ;
			}
		} ;


		var handleFailure = function(o) { /* don't do anything on failure - note that .statusText is handy */ } ;
		var callback = { success:handleSuccess, failure:handleFailure };

		var sUrl = '/page/event/search_results' ;
		var postData = '' ;
		if (doing_deselect)
		{
			// pull events for this day
			postData = "date_start="+ args[0][0] + '-' + args[0][1] + '-' + args[0][2] + "&date_end="+ args[0][0] + '-' + args[0][1] + '-' + (parseInt(args[0][2])+1) + "&orderby="+event_calendar_sort_filter+"&mime=text/xml&format=commons_rss&wrap=no"+((event_calendar_state_filter) ? "&state=" +event_calendar_state_filter : "");
		}
		else
		{

			// pull upcomingest events
			postData = "orderby="+event_calendar_sort_filter+"&mime=text/xml&format=commons_rss&wrap=no&limit=3&get_count=1"+((event_calendar_state_filter) ? "&state="+event_calendar_state_filter : "");
		}
		doing_deselect = false ;
		var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
	};



	var myChangePageEventHandler = function( type, args, obj)
	{
		var self = this ;

		var handleSuccess = function(o)
		{
//alert(o.responseText);
			if(o.responseXML !== undefined)
			{
				// get the dates for this month
				selected_dates.length = 0 ; 
				selected_dates =  process_dates_xml( o.responseXML) ;
				if (selected_dates.length)
				{
					// if we have some dates, then select them and re-render
					self.cfg.setProperty("selected", self._parseDates( selected_dates.join(',')), true) ;
					self.render() ;
				}
			}
		} ;


		var handleFailure = function(o) { /* don't do anything on failure - note that .statusText is handy */ } ;
		var callback = { success:handleSuccess, failure:handleFailure };

		var sUrl = "/modules/event2/event_calendar_widget.ajax.php";
		var postData = "mode=active_days&month=" + this.cfg.getProperty("pagedate").getMonth() + "&year=" + this.cfg.getProperty("pagedate").getFullYear() + ((event_calendar_state_filter) ? "&state="+event_calendar_state_filter : "");
		var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
	}


	// assign event handlers
	YAHOO.example.calendar.cal1.selectEvent.subscribe(mySelectHandler, YAHOO.example.calendar.cal1, true);
	YAHOO.example.calendar.cal1.deselectEvent.subscribe(myDeselectHandler, YAHOO.example.calendar.cal1, true);
	YAHOO.example.calendar.cal1.beforeDeselectEvent.subscribe(myBeforeDeselectHandler, YAHOO.example.calendar.cal1, true);
	YAHOO.example.calendar.cal1.changePageEvent.subscribe(myChangePageEventHandler, YAHOO.example.calendar.cal1, true);

	// fire the deselect event so we can update the event detail areas with the "upcomingest" events
	YAHOO.example.calendar.cal1.deselectEvent.fire( myDeselectHandler, YAHOO.example.calendar.cal1);


	// fire the change page event so that we can get fresh data when loading
	YAHOO.example.calendar.cal1.changePageEvent.fire( myChangePageEventHandler, YAHOO.example.calendar.cal1);
}





// init the calendar after the page has loaded
YAHOO.util.Event.addListener(window, "load", init);




function update_event_detail_div( events)
{
	// build the output
	var event_string = '' ;
	for (var i=0; i<events.length; i++)
	{
//		if (events[i].type == 'total_event_count' && events[i].city == 'total_event_count')
		if (events[i].type == 'total_event_count')
		{
			event_string += '<p><a href="/page/event/search_simple">See all ' + parseInt(events[i].date_time) + ' upcoming events &raquo;</a></p>' ;
		}
		else
		{
			event_string += '<p><strong>' + events[i].date_time + '</strong> <a href="' + events[i].link + '">' + events[i].title + '</a> (' + events[i].type + ') ' + events[i].city + ', ' + events[i].state + '</p>' ;
		}
	}

	// update the display
	document.getElementById("event_details_container").innerHTML = event_string ;
}



// process the XML nodes to get our data into a digestable format
function process_dates_xml( xmlstr)
{
	var dates_array = new Array() ;


	// assign the head element
	try
	{
		var event = xmlstr.documentElement.getElementsByTagName('event') ;
	}
	// there will be an error if there were no matches, so catch it
	catch(error)
	{
		return dates_array ;
	}

	for(var i=0; i<event.length; i++)
	{

		dates_array[dates_array.length] = event[i].getAttribute('date');
	}

	return dates_array ;
}


// process the XML nodes to get our data into a digestable format
function process_event_xml( xmlstr)
{
	var event_array = new Array() ;


	// assign the head element
	try
	{
		var item = xmlstr.documentElement.getElementsByTagName('item') ;
	}
	// there will be an error if there were no matches, so catch it
	catch(error)
	{
		return event_array ;
	}

	// pull the data
	for(i=0; i<item.length; i++)
	{
		title = get_node_data( item[i], 'title') ;
		link = get_node_data( item[i], 'guid') ;
		type = (get_node_data( item[i], 'eventType') == '') ? get_node_data( item[i], 'db:eventType') : get_node_data( item[i], 'eventType') ;
		date_time = (get_node_data( item[i], 'dateTime') == '') ? get_node_data( item[i], 'db:dateTime') : get_node_data( item[i], 'dateTime') ;
		city = (get_node_data( item[i], 'city') == '') ? get_node_data( item[i], 'db:city') : get_node_data( item[i], 'city') ;
		state = (get_node_data( item[i], 'state') == '') ? get_node_data( item[i], 'db:state') : get_node_data( item[i], 'state') ;

		event_array[event_array.length] = {title: title, link: link, type: type, date_time: date_time, city: city, state: state} ;
	}


	// see if the total number of events was included
	try
	{
		total_count = xmlstr.getElementsByTagName('total_count')[0].firstChild.nodeValue ;
		event_array[event_array.length] = {title: '', link: '', type: 'total_event_count', date_time: total_count, city: '', state: ''} ;
	}
	catch(error)
	{
		// do nothing
	}

	return event_array ;
}


// the purpose of this function is to handle errors from getElementsByTagName; it appears that
//   if the tag has no data, then somehow the element disappears??
function get_node_data(cons, element_name)
{
	var value ;
	try
	{
		value = cons.getElementsByTagName(element_name)[0].firstChild.nodeValue ;
	}
	catch(error)
	{
		value = '' ;
	}
	return value ;
}
