﻿// class to support the dual calendar (ticket overlay and pagination events)
var DualCalendarOverlay = Class.create({
	initialize: function(wrapper){
		this.wrapper = $(wrapper); //dualcalendar_wrap
		if(!this.wrapper){return;}
		
		this.elOverlay = this.wrapper.select('div#dualcalendar_ticketoverlay').first();
		this.lnk_close = this.elOverlay.down('a.lnk_close');
		Event.observe(this.lnk_close, 'click', this.__lnkClose_Click.bindAsEventListener(this));
		this.spinner = $('dualcalendar_spinner');
		
		var openLinks = this.wrapper.select('a.lnk_ticketoverlay');
		
		this._attachOpenEvents(openLinks);
		/*
		var pagingLinks =  this.wrapper.select('div.monthpagination a');
		var pagingEventHandle = this.__lnkPagination_Click.bindAsEventListener(this);
		for(var i=0; i < pagingLinks.length; i++){
			pagingLinks[i].observe('click', pagingEventHandle);
		}
		*/
	},
	
	_attachOpenEvents: function(aLinks){
		var handler = this.__lnkOpen_Click.bindAsEventListener(this);
		aLinks.invoke('observe', 'click', handler);
	},
	
	_removeOpenEvents: function(aLinks){ //ie memory leak protection
		aLinks.invoke('stopObserving', 'click');
	},
	
	__lnkPagination_Click: function(e){
		e.stop();
		//get the event target from the href and do the async postback
		var beforeHandle =  this.__beforeXhr.bind(this);
		var afterHandle = this.__afterXhr.bind(this);
		var lnk = Event.findElement(e, 'a');
		Page.doAsyncPostBack(e, {
			target: lnk.href.toQueryParams()["__EVENTTARGET"],
			onBeforeRequest: beforeHandle,
			onAfterResponse: afterHandle
		});
	},
	
	__lnkClose_Click: function(e){
		e.stop();
		this.close();
	},
	
	__lnkOpen_Click: function(e){
		e.stop();
		var elLnk = e.element();
		// parse data from rel attribute.
		var perfData = elLnk.readAttribute('rel').evalJSON();
		this.populateOverlay(perfData);
		this.open();
	},		
			
	open: function(){
		
		//this.elOverlay.appear({duration:0.25});
		//new Effect.Appear(this.elOverlay, {duration:0.25});
		this.elOverlay.show();
	},
	
	close: function(){
		//this.elOverlay.fade({duration:0.25});
		this.elOverlay.hide();
	},
	
	populateOverlay: function(oPerfDate){
		var dtPerf = new Date(oPerfDate.perfdate);
		this.elOverlay.down('h4').update(this.perfDateToString(dtPerf));
		var aPerfTimes  = oPerfDate.perftimes.compact(); // for ie and extra comma
		var elTimeList = this.elOverlay.down('ul.time_list').update();// get and clear out the time list
		for(var i=0; i < aPerfTimes.length; i++){
			var li = Builder.build('<li><span class="date">' + aPerfTimes[i].time + '</span><a href="reserve.aspx?performanceNumber=' + aPerfTimes[i].perfid + '"><img class="imgbutton" src="/_images/_btn/sm_btn_tickets.gif" alt="buy tickets"></a></li>');
			elTimeList.appendChild(li);
		}
	},
	
	perfDateToString: function(dt){
		//format date to desired string: dayname, monthname daynumber, 4dyear
		var weekdays = $w('Sunday Monday Tuesday Wednesday Thursday Friday Saturday');
		var months = $w('January February March April May June July August September October November December');
		var sDate = weekdays[dt.getDay()] + ', ' + months[dt.getMonth()] + ' ' + dt.getDate() + ', ' + dt.getFullYear();
		return sDate;
	},
	
	__beforeXhr: function(eventKey, requestOptions){
		//console.log('__beforeXhr fired');
		// remove event listeners
		var openLinks = this.wrapper.select('a.lnk_ticketoverlay');
		this._removeOpenEvents(openLinks);
		
		// set position and show spinner
		Element.clonePosition(this.spinner, this.wrapper);
		this.spinner.show();
		// fire off xhr
		document.fire(eventKey);
	},
	
	__afterXhr: function(){// would the callback to pass raw response.
		//console.log('__afterXhr fired');
		// attach event listeners to new day links
		var openLinks = this.wrapper.select('a.lnk_ticketoverlay');
		this._attachOpenEvents(openLinks);
		
		// attach event listeners to pagination links
		var pagingLinks =  this.wrapper.select('div.monthpagination a');
		//console.log(pagingLinks);
		var pagingEventHandle = this.__lnkPagination_Click.bindAsEventListener(this);
		for(var i=0; i < pagingLinks.length; i++){
			pagingLinks[i].observe('click', pagingEventHandle);
		}
		
		// hide spinner
		this.spinner.hide();
	}
});
/*
var calOverlay;
document.observe('dom:loaded', function(){
	calOverlay = new DualCalendarOverlay($('dualcalendar_wrap'));
});
*/
