	YAHOO.namespace("ritetime.calendar");

	YAHOO.ritetime.calendar.init = function() {
		/** 
		 * Renders the selected date in an h4 tag.
		 * Renders the list of events for the day.
		 * @param date selDate A Date object representing the selected date 
		 * 						on the calendar as fetched from the date selected 
		 * 						handler in YUI.
		 */
		function renderSummary(selDate)
		{
			if( !selDate )
			{
				selDate = new Date;
			}
			//alert(selDate);
			
			var elSummary = $('quickview_summary');
				elSummary.empty();
				
			var arrEvents = getCurrentEvents(selDate);
			
			// Create the heading with the date:
			var elHeading = new Element('h4', {
				'html': dateToLocaleString(selDate, YAHOO.ritetime.calendar.cal1)
			});
			elHeading.inject(elSummary);
			
			// Loop through, formatting appropriately:
			if( arrEvents.length < 1 )
			{
				var elEntry = new Element('p', {
					'html': 'No events scheduled.'
				});
				elEntry.inject(elSummary);
			}
			
			for(var i = 0; i < arrEvents.length; i++)
			{
				// Add sorting by time? (should be taken care of in the ajax call)
				var eStart = new Date();
				eStart.setISO8601(arrEvents[i].start);
				time = (arrEvents[i].start.toString().match(new RegExp(/(\d\d\d\d-\d\d-\d\dT)/))) ? eStart.thTime() : '';
				
				//eventString += '<p>'+time+'<br /><a href="/time/event/' + arrEvents[i].eventID + '/' + arrEvents[i].effectiveStart + '/">'+arrEvents[i].title+'</a>'+( arrEvents[i].isEditable ? ' <a href="/time/schedule/' + arrEvents[i].eventID + '/">EDIT</a>' : '')+'</p>';
				var elEntry = new Element('p', {
					'html':	time + '<br />' +
							'<a href="/time/event/'+arrEvents[i].eventID+'/'+arrEvents[i].effectiveStart+'/">'+arrEvents[i].title+'</a> '
				});
				
				if( arrEvents[i].isEditable )
				{
					var elEditLink = new Element('a', {
						'href': '/time/schedule/'+arrEvents[i].eventID+'/',
						'html': 'EDIT',
						'events': {
							'click': function() {
								if( this.isRecurrence )
								{
									window._mooDialog.fetchDialog({
										'action': 'RecurrenceExceptionOneOrMultiple',
										'aid': this.eventID,
										'effectiveDate' : this.effectiveStart
									});
									return false; // Use dialog if recurring event (don't follow href)
								}
								else
								{
									return true; // Follow href attribute if discrete event
								}
							}.bind(arrEvents[i])
						}
					});
					elEditLink.inject(elEntry);
				}
				
				elEntry.inject(elSummary);
			}
		}
		
		function dateToLocaleString(dt, cal) {
			//var wStr = cal.cfg.getProperty("WEEKDAYS_LONG")[dt.getDay()];
			var dStr = dt.getDate();
			var mStr = cal.cfg.getProperty("MONTHS_LONG")[dt.getMonth()];
			var yStr = dt.getFullYear();
			return (mStr + " " + dStr  + ", " + yStr);
		}
		
		/**
		 * Finds the events for a specific day
		 * @param date dt The selected day on the calendar
		 * @param YahooCalendar cal The calendar object
		 * @return string (should be array?)
		 */
		function getCurrentEvents(dt, cal) {
			//
			// Using Moo's code to get the events
			//
			if( !dt ) {
				dt = new Date();
			}
			// Set to midnight to grab ALL events for the day:
			dt.setHours(0);
			dt.setMinutes(0);
			dt.setSeconds(0);
			//alert(dt);
			
			var _moo = window._QVMooCal; // Save typing, be explicit in scope
			
			_moo.options.newDate = dt;
			_moo.options.newDate != 0 ? _moo.calDate = new Date(_moo.options.newDate) : _moo.calDate = new Date();
			_moo.viewStartDate = dt;
			
			_endDate = new Date(); // Set end range to 11:59:59 PM
			_endDate.setTime( dt.getTime() + ((1000 * 60 * 60 * 24) - 1) );
			_moo.viewEndDate = _endDate;
			
			//alert(_moo.viewStartDate);
			//alert(_moo.viewEndDate);
			//alert(_moo.viewStartDate + ' ' + _moo.viewEndDate);
			
			// Grab the events:
			_moo.getMonthlyCalendarData();
			var _events = _moo.options.cEvents; // Save typing
			
			// Get all of today's events:.
			var _todaysEvents = [];
			for(var i = 0; i < _events.length; i++){
				var eStart = new Date();
				eStart.setISO8601(_events[i].start);
				//if(_events[i].isDST){
				//	eStart.setTime(eStart.getTime() + 60000 * 60);
					//alert('dst');
				//} else {
					//alert('no dst');
				//}
				if(eStart >= _moo.viewStartDate && eStart <= _moo.viewEndDate){
					_todaysEvents.push(_events[i]);
				}
				
				// bolds the event date, using the highlight1 class
				YAHOO.ritetime.calendar.cal1.addRenderer(eStart.getMonth()+1 + "/" + eStart.getDate()  + "/" + eStart.getFullYear(), YAHOO.ritetime.calendar.cal1.renderCellStyleHighlight1); 
			}
			
			return _todaysEvents;
		}

		/**
		 * When a paging to diff months, call the getCurrentEvents func 
		 * to retrieve, store, and highlight the month's events.
		 *
		 * IAReview: Date highlighting on Quick View is ineffiecient due to:
		 * 1) getCurrentEvents() call X3 (this, prev, next month)
		 * 2) Since dates are stored by reference, we only need to populate each month
		 *    once per cache retreival from moo.
		 */
		function changeCalHandler(type,args,obj) {
			// Just force the calendar to grab dates for this month:
			// alert(obj.cfg.getProperty('pagedate'));
			getCurrentEvents( obj.cfg.getProperty('pagedate') );
		};
		
		/**
		 * Fired on click event for a day on the calendar.
		 */
		function mySelectHandler(type,args,obj) {
			var selected = args[0];
			var selDate = this.toDate(selected[0]);
			
			renderSummary(selDate);
		};

		YAHOO.ritetime.calendar.cal1 = new YAHOO.widget.Calendar("cal1","cal1Container");
		YAHOO.ritetime.calendar.cal1.selectEvent.subscribe(mySelectHandler, YAHOO.ritetime.calendar.cal1, true);
		YAHOO.ritetime.calendar.cal1.beforeRenderEvent.subscribe(changeCalHandler, YAHOO.ritetime.calendar.cal1, true);		
		
		// Show the summary for today by default:
		renderSummary();
		
		YAHOO.ritetime.calendar.cal1.render();
	}
	
	// Add a Moo calendar for JAX stuffs:
	YAHOO.util.Event.onDOMReady( function(){
		// Initialize the moo calendar:
		window._QVMooCal = new iaMooCalendar({
			isQuickView: true
		});
		
		// Initialize the calendar element:
		YAHOO.ritetime.calendar.init();
	});