var LaffQ = {
	base: "http://www.laffq.com",
	insert_style_sheet: function(href) {
		var cssNode = document.createElement('link');
		cssNode.type = 'text/css';
		cssNode.rel = 'stylesheet';
		cssNode.href = href;
		cssNode.media = 'screen';
		cssNode.title = 'dynamicLoadedSheet';
		document.getElementsByTagName("head")[0].appendChild(cssNode);
	},
	insert_script: function(src) {
		var headTag = document.getElementsByTagName("head")[0];
		var scriptTag = document.createElement("script");
		scriptTag.type="text/javascript";
		scriptTag.src = src;
		headTag.insertBefore(scriptTag,headTag.firstChild);
	},
	Widget: function(info) {
		var user = info["username"];
		var scripts = document.getElementsByTagName('script');
		var script = scripts[scripts.length-1];
		var element = document.createElement('div');
		script.parentNode.insertBefore(element,script);
		var base = LaffQ.base;
		var loading_img = document.createElement('img');
		loading_img.src = base+'w/loading.gif';
		loading_img.border = '0';
		element.appendChild(loading_img);
		var f = function(jsonData) {
			var div_item;
			element.removeChild(loading_img);
			div_item = document.createElement('div');
			div_item.innerHTML = LaffQ.TO(jsonData,base);
			script.parentNode.insertBefore(element,script);
			element.appendChild(div_item);
		}
		var callback = "__laffq_populateTable";
		var scriptTag = document.createElement("script");
		var style_sheet = info["css"];
		if (style_sheet === undefined) { style_sheet = (base+'w/widget.css'); }
		if (style_sheet) { LaffQ.insert_style_sheet(style_sheet); }
		eval(callback+" = f;");
		var src = base+user+"/json/?jsonp="+callback+"&fields=map_url,show_name,cost,ticket_link,venue_name,show_link,venue_link,address,start_datetime&after=-24&limit=15";
		LaffQ.insert_script(src);
	}
};

LaffQ.TO = function(jsondata,base) {
	function parseISODate(iso_date) {
		var d = new Date(
			iso_date.substr(0,4),
			iso_date.substr(5,2)-1,
			iso_date.substr(8,2),
			iso_date.substr(11,2),
			iso_date.substr(14,2),
			iso_date.substr(17,2)
		);
		return d;
	}
	function dateAsString(d) {
		var months = ["January", "February", "March", "April", "May", "June", "July", "August",
			"September", "October", "November", "December"
		];
		return months[d.getMonth()]+" "+d.getDate()+", "+d.getFullYear();
	}
	function timeAsAMPM(d) {
		var m, h = d.getHours();
		var ampm='PM';
		if (h<12) { ampm='AM'; }
		h = ((h+11)%12)+1;
		m = d.getMinutes();
		if (m==0) { return h+" "+ampm; }
		if (m<10) { return h+":0"+m+" "+ampm; }
		return h+":"+m+" "+ampm;
	}
	function wrapInLink(s,link) {
		if (link===undefined) { return s; }
		return'<a href="'+link+'">'+s+'</a>';
	}
	var weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
	var output = '<table class="laffq_shows" cellspacing="0" cellpadding="10" border="0"><tr><th>'+
		'Date/Time</th><th>Show/Venue</th><th>Address</th><th>Price/Tickets</th></tr>';
	for (var i=0;i<jsondata.length;i++) {
		var row = jsondata[i];
		//if (row.show_name.match(/The Rejects of Standup/)) {
			row.date = parseISODate(row.start_datetime);
			if (i%2) { output += '<tr class="laffq_even">'; }
			else { output += '<tr class="laffq_odd">'; }
			output += '<td>'+wrapInLink('<div class="laffq_date">'+dateAsString(row.date)+
				'</div><div class="laffq_time">'+weekdays[row.date.getDay()]+" "+timeAsAMPM(row.date)+
				'</div>', row.show_page_link)+'</td>';
			output += '<td><div class="laffq_venue">';
			if (row.show_name!==undefined) {
				output += '<div class="laffq_show">'+wrapInLink(row.show_name,row.show_link)+"</div>";
			}
			if (row.venue_name!==undefined) {
				output += '<div class="laffq_venue">'+wrapInLink(row.venue_name,row.venue_link)+"</div>";
			}
			output += '</td>';
			var address = row.address.replace("\r\n","<br>");
			output += '<td><div class="laffq_address">'+wrapInLink(address,row.map_url)+'</div></td>';
			output += '<td>';
			if (row.cost !== undefined) { output +='<div class="laffq_cost">'+row.cost+"</div>"; }
			if (row.ticket_link !== undefined) {
				output+='<div class="laffq_ticket">'+wrapInLink('Tickets',row.ticket_link)+'</div>';
			}
			if ((row.ticket_link === undefined) && (row.cost === undefined)) { output += '&nbsp;'; }
			output += '</td>';
			output += '</tr>';
		//}
	}
	output += '<tr><td colspan="100%"><a href="http://www.laffq.com/"><img alt="LaffQ" width="82" height="34" src="'+
		base+'s/img/laffq_logo_small.gif" border="0"></a></td></tr>';
	output += '</table>';
	return output;
}

LaffQ.to = function(jsondata,base) {
	function parseISODate(iso_date) {
		var d = new Date(
			iso_date.substr(0,4),
			iso_date.substr(5,2)-1,
			iso_date.substr(8,2),
			iso_date.substr(11,2),
			iso_date.substr(14,2),
			iso_date.substr(17,2)
		);
		return d;
	}
	function dateAsString(d) {
		var months = ["January", "February", "March", "April", "May", "June", "July", "August",
			"September", "October", "November", "December"
		];
		return months[d.getMonth()]+" "+d.getDate()+", "+d.getFullYear();
	}
	function timeAsAMPM(d) {
		var m, h = d.getHours();
		var ampm='PM';
		if (h<12) { ampm='AM'; }
		h = ((h+11)%12)+1;
		m = d.getMinutes();
		if (m==0) { return h+" "+ampm; }
		if (m<10) { return h+":0"+m+" "+ampm; }
		return h+":"+m+" "+ampm;
	}
	function wrapInLink(s,link) {
		if (link===undefined) { return s; }
		return'<a href="'+link+'">'+s+'</a>';
	}
	var weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
	var output = '<table class="laffq_shows" cellspacing="0" cellpadding="10" border="0"><tr><th>'+
		'Date/Time</th><th>Show/Venue</th></tr>';
	for (var i=0;i<jsondata.length;i++) {
		var row = jsondata[i];
		//if (row.show_name.match(/The Rejects of Standup/)) {
			row.date = parseISODate(row.start_datetime);
			if (i%2) { output += '<tr class="laffq_even">'; }
			else { output += '<tr class="laffq_odd">'; }
			output += '<td>'+wrapInLink('<div class="laffq_date">'+dateAsString(row.date)+
				'</div><div class="laffq_time">'+weekdays[row.date.getDay()]+" "+timeAsAMPM(row.date)+
				'</div>', row.show_page_link)+'</td>';
			output += '<td><div class="laffq_venue">';
			if (row.show_name!==undefined) {
				output += '<div class="laffq_show">'+wrapInLink(row.show_name,row.show_link)+"</div>";
			}
			if (row.venue_name!==undefined) {
				output += '<div class="laffq_venue">'+wrapInLink(row.venue_name,row.venue_link)+"</div>";
			}
			output += '</td>';
			output += '</tr>';
		//}
	}
	output += '<tr><td colspan="100%"><a href="http://www.laffq.com/"><img alt="LaffQ" width="82" height="34" src="'+
		base+'s/img/laffq_logo_small.gif" border="0"></a></td></tr>';
	output += '</table>';
	return output;
}
