//paramters to compose the list view
var module = '<div class="calendar-list list-view module" id="moduleId"></div>';
var header = '<div class="header"></div><div class="tabs" id="headerId"></div>';
var listView = '<div class="tab-content" id="ListViewDiv"></div>';
var footer = '<br><br><div class="tabs" id="footerId"></div>';
var defaultTemplate = '<div class="cal"> <b class="day">%start_date_week%</b> <b class="num">%start_date_day%</b> <b class="month">%start_date_month%</b> </div>' +
					  '<div class="image-col"><center><img alt="Artist" src="%eventimagesmall%"></center></div>' +
					  '<div class="event-col"><span class="name"><a href="%eventurl%">%eventname%</a></span><br>at %venuename% %city% , %state%<br>%start_time%<br>%eventprice%</div>' +
					  '<div class="action-col">%buylink%</div>';
var defaultTemplateArtist = '%artisturl%';
var defaultTemplateLink = '<a target="_blank" href="%linkurl%">%linkname%</a>';
var TwEventListDefaultOptions = {page:0,resultsPerPage:40,callback:"getTWEventList",styleCss:"http://www.ticketweb.com/snl/eventlist/style.css",containerId:"",imageServerBaseUrl:"http://i.ticketweb.com",showPagination:false,template_links:defaultTemplateLink,template_artist:defaultTemplateArtist,template:defaultTemplate,prev:"Prev",next:"Next",buylink:"Find Tickets"};
var linkFilterArray = null;

var widgetObj = new Object();

var TwEventList =
{
	widget:null,
	target:null,
	eventsXmlData:null,
	useDefaultTemplate:false,
	options:{},
	jQuery:function(divId){return typeof divId == "string"? document.getElementById(divId) : divId;},

	_hash_merge:function(a){var b={},c;for(c in a)for(var d in a[c])b[d]=a[c][d];if(b.theme=="context")b.includeContext=true;return b},
	create:function(target, options)
	{
		if(target)
		{
			TwEventList.widget=TwEventList.jQuery(target);
			TwEventList.target = target;
		}
		if((typeof options.template == "undefined") || (options.template == ""))
		{
			TwEventList.useDefaultTemplate = true;
		}

		if (typeof options.template_artist != "undefined" && options.template_artist != "") {
			var linkFilterDetectionReg = /%links[ ]*\'[\s\S]+\'%/ig;
			if (linkFilterDetectionReg.test(options.template_artist)) {
				var linkFilterExtractionReg = /[^,'%]+/ig;
				var linkTarget = options.template_artist.match(linkFilterDetectionReg)[0];
				if(typeof linkTarget != "undefined" && linkTarget != null) {
					linkFilterArray = linkTarget.match(linkFilterExtractionReg);
				}
				if (linkFilterArray != null && linkFilterArray instanceof Array) {
							linkFilterArray.shift();
				}
				options.template_artist = options.template_artist.replace(linkFilterDetectionReg,"%links%");
			}
		}

		TwEventList.options = TwEventList._hash_merge([TwEventListDefaultOptions,options||{}]);
		if (isNaN(TwEventList.options.resultsPerPage))
		{
			TwEventList.options.resultsPerPage = TwEventListDefaultOptions.resultsPerPage;
		}

		if (isNaN(TwEventList.options.page))
		{
			TwEventList.options.page = TwEventListDefaultOptions.page;
		}

		//load css style
		if (TwEventList.options.styleCss != "")
		{
			addCss(TwEventList.options.styleCss);
		}

		if ((typeof TwEventList.options.dataUrl == "undefined") || TwEventList.options.dataUrl == "")
		{
			showError('The dataUrl must be set for the Event Listings widget.', TwEventList);
			return;
		}

		var tempOjb = new Object();
		tempOjb.widget = TwEventList.widget;
		tempOjb.target = TwEventList.target;
		tempOjb.useDefaultTemplate = TwEventList.useDefaultTemplate;
		tempOjb.options = TwEventList.options;
		widgetObj[target] = tempOjb;

		getEventsData(target, TwEventList);

	}
}

//get events json data
function getEventsData(target, twEventList)
{
	try
	{
		jQuery.getJSON(twEventList.options.dataUrl+"&resultsPerPage="+ twEventList.options.resultsPerPage +"&page="+ twEventList.options.page + "&callback=" + twEventList.options.callback +"&target=" + target +"&jsoncallback=?");

	}catch(err)
	{
		showError('Failed loading event listings data due to:'+err, twEventList);
	}
}

//show error
function showError(errStr, twEventList)
{
	jQuery(twEventList.widget).empty();
	jQuery(module).appendTo(twEventList.widget);
	jQuery(header).appendTo('#moduleId');
	jQuery('<div><center><br>'+errStr+'</div>').appendTo('#moduleId');
	return;
}

//show event
function showEvents(jsonData)
{
	var twEventList = getTWEventListByJsonData(jsonData);

	var xmlData = twEventList.eventsXmlData;
	if (xmlData)
	{
		//get all records number
		var totalHits = (xmlData[0]).totalHits;

		//no data query
		if (totalHits == 0)
		{
			showError('No event data found.', twEventList);
			if (twEventList.options.containerId){
			jQuery('#'+twEventList.options.containerId).css('display','none');
			}
			return;
		}

		if (twEventList.options.containerId){
			jQuery('#'+twEventList.options.containerId).css('visibility','visible');
		}

		var count = 1;
		//build the event list view struction
		//jQuery(twEventList.widget).empty();

		var pagination = "";
		if (twEventList.options.showPagination)
		{
			pagination = getPagination(totalHits, twEventList);
		}

		var ul = jQuery('<ul id="LIST_VIEW"></ul>'), li;

		if (twEventList.useDefaultTemplate)
		{
			jQuery(twEventList.widget).empty();
			jQuery(module).appendTo(twEventList.widget);
			if (twEventList.options.showPagination)
			{
				jQuery(header).appendTo('#moduleId');
			}
			jQuery(listView).appendTo('#moduleId');
			if (twEventList.options.showPagination)
			{
				jQuery(footer).appendTo('#moduleId');
				jQuery(pagination).appendTo('#headerId');
				jQuery(pagination).appendTo('#footerId');
			}
		}

		//Loop the event and append to the list view
		var data = {};
		jQuery.each(jQuery(xmlData)[0].events, function(i, item){

			//list current page's event to the list view
				data.eventid = item.eventid;
				data.facebookurl = "";
				if (item.facebookeventid) {
					data.facebookurl = "http://www.facebook.com/event.php?eid=" + item.facebookeventid;
				}
				data.eventname = item.eventname;
				if (item.eventname.length > 30)
				{
					data.eventname_limit = item.eventname.substring(0, 30)+'...';
				}
				else
				{
					data.eventname_limit = item.eventname
				}

				data.eventurl = item.eventurl;
				data.description = "";
				if(typeof item.description != "undefined") {
					data.description = item.description;
				}
				data.additionallistingtext = item.additionallistingtext;
				data.status = item.status;

				//var eventdate_week,eventdate_day,eventdate_month;
				data.start_time = "";
				data.end_time = "";
				data.venuename = "";
				data.venueurl = "";
				data.venuecity = "";
				data.city = "";
				data.venuestate = "";
				data.state = "";
				data.eventprice = "";
				data.postalcode = "";
				data.country = "";
				data.address = "";
				data.venueimage_large = "";
				data.venueimage_small = "";

				// initialize doorstime
				data.doors_time = "";
				data.doors_date_year = "";
				data.doors_date_week = "";
				data.doors_date_day = "";
				data.doors_date_month = "";

				//get date time info
				var StartDate = item.dates.startdate;
				var EndDate = item.dates.enddate;
				var OnSaleDate = item.dates.onsaledate;
				var DoorsTime;
				if(typeof item.dates.doorsdate != "undefined") {
					DoorsTime = item.dates.doorsdate;
				}
				var tz = item.dates.timezone;
				var event
				if (StartDate)
				{
					var date = getDate(StartDate);

					data.start_time = date.format("h:MM TT ");
					data.timezone = tz;
					data.eventdate_year = date.format("yyyy");
					data.start_date_year = date.format("yyyy");
					data.eventdate_week = date.format("ddd");
					data.start_date_week = date.format("ddd");
					data.eventdate_day = date.format('dd');
					data.start_date_day = date.format('dd');
					data.eventdate_month = date.format('mmm');
					data.start_date_month = date.format('mmm');
					data.start_date_month_num = date.format('m');
				}

				data.end_date_append = "";

				if (EndDate)
				{
					var date = getDate(EndDate);

					data.end_time = date.format("h:MM TT ");
					data.timezone = tz;
					data.end_date_year = date.format("yyyy");
					data.end_date_week = date.format("ddd");
					data.end_date_day = date.format('dd');
					data.end_date_month = date.format('mmm');
					if (StartDate != EndDate)
					{
						data.end_date_append = " - " + data.end_date_week + ", " + data.end_date_month + " " + data.end_date_day  + ", " + data.end_date_year;
					}

				}

				if (OnSaleDate) {
					var date = getDate(OnSaleDate);

					data.onsaledate = date.format("ddd mmm dd yyyy");
					data.onsaletime = date.format("h:MM TT ");
				}
				if (DoorsTime)
				{
					var date = getDate(DoorsTime);

					data.doors_time = date.format("h:MM TT ");
					data.timezone = tz;
					data.doors_date_year = date.format("yyyy");
					data.doors_date_week = date.format("ddd");
					data.doors_date_day = date.format('dd');
					data.doors_date_month = date.format('mmm');
				}

				//get venue info
				data.venuename = item.venue.name;
				data.venueurl = item.venue.venueurl;
				data.venueid = item.venue.venueid;
				data.venuenamewithouturl = item.venue.name;

				if (data.venueurl != "")
				{
					data.venuename = '<a href="'+data.venueurl +'" target="_blank">' + data.venuename + '</a>';
				}
				data.venuecity = item.venue.city;
				data.city = item.venue.city;
				data.venuestate = item.venue.state;
				data.state = item.venue.state;
				data.postalcode = item.venue.postalcode;
				data.country = item.venue.country;
				data.address = item.venue.address;

				if(typeof item.venue.venueimages.large != "undefined")
				{
					var large = item.venue.venueimages.large;
					if(large != "")
					{
						data.venueimage_large = replaceImageBaseUrl(twEventList, large);;
					}
				}

				if(typeof item.venue.venueimages.small != "undefined")
				{
					var small = item.venue.venueimages.small;
					if(small != "")
					{
						data.venueimage_small = replaceImageBaseUrl(twEventList, small);;
					}
				}

				//get prices info
				data.pricelow = "";
				data.pricehigh = "";
				var priceLow = item.prices.pricelow;
				var priceHigh = item.prices.pricehigh;

				if (priceLow == priceHigh)
				{
					data.eventprice = priceLow;
					data.pricelow = priceLow;
					data.pricehigh = priceLow;
				}
				else
				{
					data.eventprice = priceLow + " - " + priceHigh;
					data.pricelow = priceLow;
					data.pricehigh = priceHigh;

				}

				// event video embeded
				data.videoembed = "";
				var eventVideo = item.videoembed;
				if(eventVideo)
				{
					data.videoembed = "<iframe class='eventvideo' type='text/html' src='" +
										eventVideo +
										"' frameborder='0'>" +
										"</iframe>"
				}

				//get event listings img src
				data.eventimg = twEventList.options.imageServerBaseUrl + "/snl/TicketWeb_files/images/default_artist_72x53.jpg";
				data.eventimagesmall = data.eventimg;
				if(typeof item.eventimages.small != "undefined")
				{
					var small = item.eventimages.small;
					if( small != "")
					{
						data.eventimg = replaceImageBaseUrl(twEventList, small);
						data.eventimagesmall = data.eventimg;
					}
				};

				data.eventimagelarge = twEventList.options.imageServerBaseUrl + "/snl/TicketWeb_files/images/defaultEDP_artist_305x225.jpg";
				if(typeof item.eventimages.large != "undefined")
				{
					var large = item.eventimages.large;
					if( large != "")
					{
						data.eventimagelarge = replaceImageBaseUrl(twEventList, large);
					}
				};

				// artist list
				if(typeof item.attractionList != "undefined") {
					if(item.attractionList != null) {
						var attractiondata = {};
						var artistUlList;
						var attractionLiItem = "";
						jQuery.each(item.attractionList, function(attractionIndex, attractionItem) {
							var attractionSequence = attractionItem.sequence;
							var attractionBilling = attractionItem.billing;
							var formattedAttractionBilling = parseInt(attractionBilling.replace(".",""),10);

							attractiondata.artist = "";
							if(typeof attractionItem.artist != "undefined") {
								attractiondata.artist = attractionItem.artist;
							}

							attractiondata.image = "";
							if(typeof attractionItem.image != "undefined") {
								attractiondata.image = '<img src="' + attractionItem.image + '" />';
							}

							attractiondata.genre = "";
							if(typeof attractionItem.genre != "undefined") {
								attractiondata.genre = attractionItem.genre;
							}

							attractiondata.links = "";
							var linkList = "";
							if(typeof attractionItem.links != "undefined") {
								var linkdata = {};
								linkdata.linkurl = "";
								linkdata.linkname = "";
								linkdata.linktype = "";
								if (linkFilterArray == null) {
									jQuery.each(attractionItem.links, function(linkIndex, linkItem){
										if (typeof linkItem.url != "undefined") {
											linkdata.linkurl = linkItem.url;
										}
										if (typeof linkItem.type != "undefined") {
											linkdata.linkname = linkItem.type;
											linkdata.linktype = linkItem.type;
										}

										if (typeof linkItem.label != "undefined") {
											linkdata.linkname = linkItem.label;
										}
										linkList = linkList + '<li>' +
															twEventList.options.template_links.replace(/%([a-z_\-\.]*)%/ig, function (m, l) {
																var r = linkdata[l];
																return r;
															}) + '</li>';
									});
								}else {
									jQuery.each(linkFilterArray, function(linkFilterIndex, linkFilterItem){
										jQuery.each(attractionItem.links, function(linkIndex, linkItem){
											if(typeof linkItem.type != "undefined" &&
													jQuery.trim(linkFilterItem).toLowerCase() == jQuery.trim(linkItem.type).toLowerCase()){
												if (typeof linkItem.url != "undefined") {
													linkdata.linkurl = linkItem.url;
												}
												if (typeof linkItem.type != "undefined") {
													linkdata.linkname = linkItem.type;
													linkdata.linktype = linkItem.type;
												}

												if (typeof linkItem.label != "undefined") {
													linkdata.linkname = linkItem.label;
												}
												linkList = linkList + '<li>' +
																	twEventList.options.template_links.replace(/%([a-z_\-\.]*)%/ig, function (m, l) {
																		var r = linkdata[l];
																		return r;
																	}) + '</li>';
											}
										});
									});
								}
								if (linkList != "") {
									linkList = '<ul>' + linkList + '</ul>';
								}
							}
							attractiondata.links = linkList;

							attractiondata.attractionclassname = 'sequence' + attractionSequence + ' billing' + formattedAttractionBilling;
							attractiondata.artisturl = attractiondata.artist;
							if(typeof attractionItem.artistURL != "undefined") {
								attractiondata.artisturl = '<a href="' + attractionItem.artistURL + '" target="_blank">' + attractiondata.artist + '</a>';
							}

							attractionLiItem =  attractionLiItem + '<li class="' + attractiondata.attractionclassname + '">' +
													twEventList.options.template_artist.replace(/%([a-z_\-\.]*)%/ig, function (m, l) {
														var r = attractiondata[l];
														return r;
													}) + '</li>';
						})

						artistUlList = '<ul>' + attractionLiItem + '</ul>';
						data.artist_list = artistUlList;
					}
				}


				//generate the buy link
				data.buylink = " <span class='name'><a href='"+data.eventurl +"' target='_blank'>"+twEventList.options.buylink+" <span class='arrow'>&#9658;</span></a></span>"

				//build the event record li
				li = jQuery('<li id="item_'+data.eventid+'"></li>');

				jQuery(twEventList.options.template.replace(/%([a-z_\-\.]*)%/ig, function (m, l) {
					var r = data[l];
					return r;
				})).appendTo(li);

				li.appendTo(ul);

		});//end of event each loop

		if (twEventList.useDefaultTemplate)
		{
			ul.appendTo('#ListViewDiv');
		}
		else
		{
			jQuery(twEventList.widget).empty();
			addPagination(pagination, twEventList);
			ul.appendTo(twEventList.widget);
			addPagination(pagination, twEventList);
		}
	}
}//end of showEvents()

// Define the callback function
function getTWEventList(jsonData) {
	showEvents(jsonData);
}

//get twEventList object by json data
function getTWEventListByJsonData(jsonData)
{
	var xmlData = jQuery(jsonData);
	var target = (xmlData[0]).target;
	var twEventList = getTWEventListByTarget(target);
	twEventList.eventsXmlData = xmlData;
	return twEventList;
}

//get twEventList object by target
function getTWEventListByTarget(target)
{
	return widgetObj[target];
}

function addPagination(pagination, twEventList)
{
	if (twEventList.options.showPagination)
	{
		jQuery(pagination).appendTo(twEventList.widget);
	}
}

function showEvent(page, target)
{
	var twEventList = getTWEventListByTarget(target);
	twEventList.options.page = parseInt(page);
	getEventsData(target, twEventList);//(page);
}

//define the function to load css.
function addCss(filename)
{
	var th=document.getElementsByTagName("head")[0];
	var s = document.createElement('link');
	s.setAttribute('type','text/css');
	s.setAttribute('rel','stylesheet');
	s.setAttribute('href', filename);
	th.appendChild(s);
}


function getPagination(totalHits, twEventList)
{
	if (totalHits == 0)
	{
		return "";
	}
	var page = twEventList.options.page;
	var resultsPerPage = twEventList.options.resultsPerPage;
	var from = (page)* resultsPerPage +1;
	if(from > totalHits)
	{
		from = parseInt(totalHits/resultsPerPage)*resultsPerPage +1;
	}

	var to = (page + 1) * resultsPerPage;
	if (to > totalHits)
	{
		to = totalHits;
	}
	var Prev = "";
	var Next = "";
	if (page > 0)
	{
		Prev = '<a style="font-size: 10px; font-family: Verdana,Geneva,Arial,Helvetica,SunSans-Regular;" onclick="showEvent('+(page-1)+',\''+twEventList.target+'\');">'+twEventList.options.prev+'</a>';
	}
	if (page < (totalHits/resultsPerPage - 1))
	{
		Next = '<a style="font-size: 10px; font-family: Verdana,Geneva,Arial,Helvetica,SunSans-Regular;" onclick="showEvent('+(page+1)+',\''+twEventList.target+'\');">'+twEventList.options.next+'</a>';
	}
	return '<div class="pagination"> '+ Prev + ' ' + from +' - ' + to +' of '+totalHits + ' ' + Next +' </div>';
}

function getDate(dateStr)
{
    var dt = dateStr.substr(4,2) + '/' + dateStr.substr(6,2) + '/' + dateStr.substr(0,4)
                            + ', ' + dateStr.substr(8,2) + ':' + dateStr.substr(10,2) + ':' + dateStr.substr(12,2);
    return new Date(dt);
}

function replaceImageBaseUrl(twEventList, imageUrl)
{
	return twEventList.options.imageServerBaseUrl == "" ? imageUrl : imageUrl.replace("http://i.ticketweb.com", twEventList.options.imageServerBaseUrl);
}

//******************************************************
//****please donot modify below code for date format****
/*
 * Date Format 1.2.3
 * (c) 2007-2009 Steven Levithan <stevenlevithan.com>
 * MIT license
 *
 * Includes enhancements by Scott Trenda <scott.trenda.net>
 * and Kris Kowal <cixar.com/~kris.kowal/>
 *
 * Accepts a date, a mask, or a date and a mask.
 * Returns a formatted version of the given date.
 * The date defaults to the current date/time.
 * The mask defaults to dateFormat.masks.default.
 */

var dateFormat = function () {
	var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
		timezoneClip = /[^-+\dA-Z]/g,
		pad = function (val, len) {
			val = String(val);
			len = len || 2;
			while (val.length < len) val = "0" + val;
			return val;
		};

	// Regexes and supporting functions are cached through closure
	return function (date, mask, utc) {
		var dF = dateFormat;

		// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
		if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
			mask = date;
			date = undefined;
		}

		// Passing date through Date applies Date.parse, if necessary
		date = date ? new Date(date) : new Date;
		if (isNaN(date)) throw SyntaxError("invalid date");

		mask = String(dF.masks[mask] || mask || dF.masks["default"]);

		// Allow setting the utc argument via the mask
		if (mask.slice(0, 4) == "UTC:") {
			mask = mask.slice(4);
			utc = true;
		}

		var	_ = utc ? "getUTC" : "get",
			d = date[_ + "Date"](),
			D = date[_ + "Day"](),
			m = date[_ + "Month"](),
			y = date[_ + "FullYear"](),
			H = date[_ + "Hours"](),
			M = date[_ + "Minutes"](),
			s = date[_ + "Seconds"](),
			L = date[_ + "Milliseconds"](),
			o = utc ? 0 : date.getTimezoneOffset(),
			flags = {
				d:    d,
				dd:   pad(d),
				ddd:  dF.i18n.dayNames[D],
				dddd: dF.i18n.dayNames[D + 7],
				m:    m + 1,
				mm:   pad(m + 1),
				mmm:  dF.i18n.monthNames[m],
				mmmm: dF.i18n.monthNames[m + 12],
				yy:   String(y).slice(2),
				yyyy: y,
				h:    H % 12 || 12,
				hh:   pad(H % 12 || 12),
				H:    H,
				HH:   pad(H),
				M:    M,
				MM:   pad(M),
				s:    s,
				ss:   pad(s),
				l:    pad(L, 3),
				L:    pad(L > 99 ? Math.round(L / 10) : L),
				t:    H < 12 ? "a"  : "p",
				tt:   H < 12 ? "am" : "pm",
				T:    H < 12 ? "A"  : "P",
				TT:   H < 12 ? "AM" : "PM",
				Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
				o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
				S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
			};

		return mask.replace(token, function ($0) {
			return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
		});
	};
}();

// Some common format strings
dateFormat.masks = {
	"default":      "ddd mmm dd yyyy HH:MM:ss",
	shortDate:      "m/d/yy",
	mediumDate:     "mmm d, yyyy",
	longDate:       "mmmm d, yyyy",
	fullDate:       "dddd, mmmm d, yyyy",
	shortTime:      "h:MM TT",
	mediumTime:     "h:MM:ss TT",
	longTime:       "h:MM:ss TT Z",
	isoDate:        "yyyy-mm-dd",
	isoTime:        "HH:MM:ss",
	isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
	isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};

// Internationalization strings
dateFormat.i18n = {
	dayNames: [
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
	],
	monthNames: [
		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
		"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
	]
};

// For convenience...
Date.prototype.format = function (mask, utc) {
	return dateFormat(this, mask, utc);
};

