// Hyde Park Picture House
// Global Javascript functions
// Powered by Prego

var siteURL = "";
var defaultTicketURL = "";

var trailers = null;

var whatsOn = {
	"films" : null, 
	"dates" : null,
	"filmSelected" : false,
	"dateSelected" : false
};

$(function()
{

	$("#film-search label").each(function()
	{
		var $label = $(this);
		
		$("select", this).click(function()
		{
			var selectedValue = $(this.options[this.selectedIndex]).text();
			$(".value", $label).html(selectedValue);
		});
	});

/*
// DISABLED: Didn't work well with sIFR
	$("#text-size a").click(function()
	{
		var parts = $(this).attr("href").split("=");
		var size = parts[1];
		
		var url = "textsize.php?size="+size+"&mode=ajax";
		$.getJSON(url);
		
		$("body")
			.removeClass("small")
			.removeClass("medium")
			.removeClass("large")
			.addClass(size);
		
		return false;
	});
*/

	$("#film-search").submit(function()
	{
		var day = $("#search-day-input").attr("value");
		var film = $("#search-film-input").attr("value");
		
		if(day || film)
			return true;
		
		alert("Please select a film or a day or both");
		return false;
	});
	
	$("#search-day-input").change(function()
	{	
		if(whatsOn.filmSelected)
			return true;
		
		var date = $(this).attr("value");
		whatsOn.dateSelected = date;
		
		$("#search-film-input")
			.html("")
			.append("<option value=\"\">Select film</option>");
		
		if(date)
		{
			for(var i = 0, f; f = whatsOn.dates[date].films[i]; i++)
				$("#search-film-input").append("<option value=\""+f.id+"\">"+f.title+"</option>");
		}
		else
		{
			for(fID in whatsOn.films)
				$("#search-film-input").append("<option value=\""+fID+"\">"+whatsOn.films[fID].title+"</option>");
		}			
		$("#search-film-input").get(0).selectedIndex = 0;
		$("#search-film-input").trigger("click");
	});
	
	$("#search-film-input").change(function()
	{	
		if(whatsOn.dateSelected)
			return true;
		
		var film = $(this).attr("value");
		whatsOn.filmSelected = film;
		
		$("#search-day-input")
			.html("")
			.append("<option value=\"\">Select day</option>");
		
		if(film)
		{
			for(var i = 0, d; d = whatsOn.films[film].dates[i]; i++)
				$("#search-day-input").append("<option value=\""+d.iso+"\">"+d.title+"</option>");
		}
		else
		{
			for(dISO in whatsOn.dates)
				$("#search-day-input").append("<option value=\""+dISO+"\">"+whatsOn.dates[dISO].title+"</option>");
		}
		$("#search-day-input").get(0).selectedIndex = 0;
		$("#search-day-input").trigger("click");
	});
	
	calendarInitLinks("ul.icons li.calendar a");
	
	if(trailers && swfobject.getFlashPlayerVersion() && swfobject.getFlashPlayerVersion().major >= 8)
	{	
		var $trailersList = $("<ul></ul>").addClass("trailer-list");
		
		for(fID in trailers.films)
		{
			var f = trailers.films[fID];
			
			//var certStr = "Certificate " + (f.cert == "TBC" ? "to be confirmed" : f.cert);
			//var $fCertAbbr = $("<abbr title=\""+certStr+"\">"+f.cert+"</abbr>");
			
			var dir = f.dir;
			if(dir.length > 20)
				dir = dir.substring(0, 17)+"&hellip;";
			
			var $filmDetails = $("<dl></dl>");
			addDefnListItem($filmDetails, "title", "Title", "<h4>"+f.title+"</h4>");
			addDefnListItem($filmDetails, "dir", "Director", dir);
			//addDefnListItem($filmDetails, "cert", "Certificate", $fCertAbbr);
			//addDefnListItem($filmDetails, "year", "Year", f.year);
			
			var $playButton = $("<a></a>")
				.addClass("play-pause-button")
				.attr("title", "Play trailer")
				.attr("id", "play-pause-"+fID)
				.append("Play trailer")
				.click(function()
				{
					trailerPlay(  this.id.match(/^play-pause-([0-9]+)$/)[1]  );
				});
			
			var $listItem =	$("<li></li>")
				.attr("id", "trailer-"+fID)
				.append($filmDetails)
				.append($playButton);
			
			$listItem
				.mouseover(function() {  $(this).addClass("hover");  })
				.mouseout(function() {  $(this).removeClass("hover");  })
				.click(function() {  $("a", this).trigger("click");  });
			
			$trailersList.append($listItem);
		}
		
		var $trailersOptions = 
			$("<ul></ul>").addClass("options");
			
		if(trailers.next || trailers.prev)
		{
			if(trailers.next)
				$trailersOptions.append("<li class=\"next\"><a href=\""+trailers.next.href+"\">"+trailers.next.title+"</a></li>");
			if(trailers.prev)
				$trailersOptions.append("<li class=\"prev\"><a href=\""+trailers.prev.href+"\">"+trailers.prev.title+"</a></li>");
		}
		else
		{
			$trailersOptions.append(
				$("<li></li>").addClass("next").append($("<a>Next trailer</a>").click(trailerNext)),
				$("<li></li>").addClass("prev").append($("<a>Previous trailer</a>").click(trailerPrev))
			)
		}
		
		var $trailersHeading = 
			$("<div></div>")
				.addClass("heading")
				.append("<h2><span class=\"use-sifr\">"+trailers.title+"</span></h2>");
				
		var $innerContent =
			$("<div></div>")
				.addClass("trailer-content")
				.append($trailersList)
				.append("<div class=\"video\"><div id=\"trailer-video\"></div></div>")
		
		if(trailers.details)
			$innerContent
				.append($("<div></div>").addClass("trailer-details"));
				
		var $trailersContent = 
			$("<div></div>")
				.addClass("content")
				.append($innerContent)
				.append($trailersOptions);
				
		var $trailersFooter = 
			$("<div></div>")
				.addClass("footer");
		
		var $trailersContainer = 
			$("<div></div>")
				.addClass("section")
				.addClass("with-options")
				.attr("id", "trailers")
				.append($trailersHeading)
				.append($trailersContent)
				.append($trailersFooter);
				
		$("#content").prepend($trailersContainer);
		
		$("#trailers a.play-pause-button:first").trigger("click");
	}
	
	$("li.text-field input")
		.focus(function()
		{
			this.select();
		})
		.mouseup(function()
		{
			$(this).trigger("focus");
			return false;
		});
		
	if(typeof(sIFR) == "function")
	{
		sIFR.setup();
		sIFR.replaceElement(named({sSelector:"h2 span.use-sifr", sFlashSrc:"sifr/avantgarde_stdbold.swf", sCase:"upper", sColor:"#ffffff", sLinkColor:"#ffffff", sBgColor:"#cccccc", sHoverColor:"#ffffff", nPaddingTop:0, nPaddingBottom:0, sFlashVars:"textalign=left&offsetTop=0", sWmode:"transparent"}));
	}
});



function calendarInitLinks(selector)
{
	$(selector)
		.click(function(e)
		{
			var $menu = calendarMenu( $(this).attr("href") );
			if(!$menu)
				return true; // If the calendar menu creation fails, allow the link click to continue
			
			$menu
				.css("top", (e.pageY-30)+"px")
				.css("left", (e.pageX-30)+"px")
				.show();
				
			if(typeof(this.blur) == "function")
				this.blur();
				
			return false;
		});
}

function calendarMenu(technoratiURL)
{	
	// Make sure we have a menu
	var $menu = $("#cal-menu");
	if($menu.length == 0)
	{
		$menu = $("<div></div>")
			.append("<h5>Add to...</h5>")
			.append($("<ul></ul>")
				.append("<li class=\"ical\"><a>iCal</a></li>")
				.append("<li class=\"outlook\"><a>Outlook</a></li>")
				.append("<li class=\"google\"><a>Google calendar</a></li>")
				.append("<li class=\"yahoo\"><a>Yahoo! calendar</a></li>")
				.append("<li class=\"thirtyboxes\"><a>30 boxes</a></li>")
				.append("<li class=\"ics\"><a>Download .ICS file</a></li>")
			)
			.attr("id", "cal-menu")
			.mouseover(function(e)
			{
				$(this).show();
			})
			.mouseout(function(e)
			{
				$(this).hide();
			});
		$("body").append($menu);
	}
	
	// Get variations on the technorati parser URL
	var eventFragmentURL = technoratiURL.replace(/^http:\/\/technorati.com\/events\//, "");
	var webcalURL = technoratiURL.replace(/^http:\/\//, "webcal://");
	
	// Get the event container ID
	var parts = eventFragmentURL.split("#");
	var elementID = parts[1];
	
	// Set URLs that don't need specific event details
	$("#cal-menu li.ical a").attr("href", technoratiURL);
	$("#cal-menu li.outlook a").attr("href", technoratiURL);
	$("#cal-menu li.thirtyboxes a").attr("href", "http://30boxes.com/add.php?ics="+technoratiURL);
	$("#cal-menu li.ics a").attr("href", technoratiURL);
	
	// Extract event using sumo
	var events = HCalendar.discover(document.getElementById(elementID));
	if(events.length > 0)
	{
		var evt = events[0];
	
		var dtend;
		if(typeof(evt.dtend) != "undefined")
			dtend = evt.dtend;
		else if(!dtend && evt.duration)
		{
			var durationParts = evt.duration.match(/^PT(\d+)M$/);
			if(durationParts)
			{
				var durationMinutes = durationParts[1];
				dtend = new Date();
				dtend.setTime(evt.dtstart.getTime() + durationMinutes * 60000);
			}
		}
		else
			dtend = evt.dtstart;
	
		var urlStartDate = URLISODate(evt.dtstart);
		var urlEndDate = URLISODate(dtend);
	
		var mDur = (dtend.getTime() - evt.dtstart.getTime()) / 60000;
		var hDur = 0;
		if(mDur >= 60)
		{
			hDur = Math.floor(mDur / 60);
			mDur -= hDur * 60;
		}
		var urlDuration = (hDur < 10 ? "0"+hDur : hDur) + (mDur < 10 ? "0"+mDur : mDur);
	
		$("#cal-menu li.google, #cal-menu li.yahoo").show();
	
		$("#cal-menu h5").html("Add "+evt.summary+" to...");
		$("#cal-menu li.google a").attr("href", "http://www.google.com/calendar/event?action=TEMPLATE&text="+evt.summary+"&dates="+urlStartDate+"/"+urlEndDate+"&location=Hyde+Park+Picture+House&sprop=website:"+siteURL);
		$("#cal-menu li.yahoo a").attr("href", "http://calendar.yahoo.com/?v=60&TITLE="+evt.summary+"&ST="+urlStartDate+"&DUR="+urlDuration+"&in_loc=Hyde+Park+Picture+House&URL="+eventFragmentURL);
	}
	else
	{
		$("#cal-menu h5").html("Add to...");
		$("#cal-menu li.google, #cal-menu li.yahoo").hide();
	}
	
	return $menu;
}

function URLISODate(date)
{
	var d = {};
	d.y = ""+date.getFullYear();
	d.m = ""+(date.getMonth() + 1);
	d.d = ""+date.getDate();
	d.th = ""+date.getHours();
	d.tm = ""+date.getMinutes();
	d.ts = ""+date.getSeconds();
	for(i in d)
	{
		if(d[i].length < 2)
		 	d[i] = "0"+d[i];
	}
	
	return d.y+d.m+d.d+"T"+d.th+d.tm+d.ts;
}


function trailerPlay(fID)
{
	var film = trailers.films[fID];
	
	if(trailers.playing != fID)
	{
		trailers.playing = fID;
		
		if(trailers.details)
			trailerFilmDetails(fID);
		
		$("#trailers .trailer-list li.selected").removeClass("selected");
		$("#trailers a.play-pause-button").show();
		
		$("#trailer-"+fID).addClass("selected");
		$("#trailer-"+fID+" a.play-pause-button").hide();
		
		var autostart = (window.location.hash && !window.location.hash.match(/^#trailers?$/)) ? "false" : "true";
		
		var flashVars = {
			"width":"400",
			"height":"224",
			"shownavigation":"false",
			"displayheight":"224",
			"type":"flv",
			"file":film.trailer,
			"frontcolor":"0x000000",
			"backcolor":"0xffffff",
			"lightcolor":"0x000000",
			"autostart":autostart,
			"repeat":"false",
			"screencolor":"0x000000",
			"volume":"80",
			"bwfile":"http://uk.player.playnetworks.net/v2.0/pic/128k.jpg",
			"bwstreams":"128,256,512,1024",
			"enablejs":"true",
			"javascriptid":"flvID"
			};
		
		var params = {
				allowfullscreen:"true",
				wmode:"transparent"
			};
	
		swfobject.embedSWF(
			"http://uk.player.playnetworks.net/v2.0/flvplayer.swf", 
			"trailer-video", 
			"400", 
			"224", 
			"8.0.0", 
			false, 
			flashVars,
			params
		);
	}
}

function trailerNext()
{
	var found = false;
	for(fID in trailers.films)
	{
		if(found)
		{
			$("#trailer-"+fID+" a.play-pause-button").trigger("click");
			return;
		}	
		
		if(fID == trailers.playing)
			found = true;
	}
	
	$("#trailers a.play-pause-button:first").trigger("click");
}

function trailerPrev()
{
	var prevFID = null;
	for(fID in trailers.films)
	{
		if(fID == trailers.playing && prevFID)
		{
			$("#trailer-"+prevFID+" a.play-pause-button").trigger("click");
			return;
		}
		
		prevFID = fID;
	}
	
	$("#trailers a.play-pause-button:last").trigger("click");
}

function trailerFilmDetails(fID)
{		
	var f = trailers.films[fID];
	
	var certStr = "Certificate "+(f.cert == "TBC" ? "to be confirmed" : f.cert);
	var $certIcon = $("<li></li>")
		.addClass("cert-" + f.cert.toLowerCase())
		.attr("title", certStr)
		.append("<span>"+certStr+"</span>");
	
	var $icons = $("<ul></ul>")
		.addClass("icons")
		.append($certIcon);
		
	if(f.st)
		$icons.append("<li class=\"st\" title=\"Subtitled (foreign audio, English subtitles)\"><span>Subtitled (foreign audio, English subtitles)</span></li>");
	
	if(f.steng)
		$icons.append("<li class=\"st-eng\" title=\"Subtitled (English audio and subtitles)\"><span>Subtitled (English audio and subtitles)</span></li>");
		
	if(f.ad)
		$icons.append("<li class=\"ad\" title=\"Audio Described\"><span>Audio Described</span></li>")
		
	if(f.baby)
		$icons.append("<li class=\"baby\" title=\"Babies welcome\"><span>Babies welcome</span></li>")
		
	var $filmDetails = $("<dl></dl>").addClass("film-details");
	
	addDefnListItem($filmDetails, "dir", "Director", "<abbr title=\"Directed by "+f.dir+"\">"+f.dir+"</abbr>");
	addDefnListItem($filmDetails, "year", "Year", f.year);
	addDefnListItem($filmDetails, "time", "Time", "<span>"+
		"<abbr class=\"dtstart\" title=\""+f.nshow.iso+"\"></abbr>"+
		"<span class=\"date-type\">On</span> "+
		f.nshow.str+
		"<abbr class=\"duration\" title=\"PT"+f.dur+"M\"></abbr>"+
		" ("+f.dur+"<abbr title=\"minutes\">mins</abbr>)"+
		"</span>");
	addDefnListItem($filmDetails, "showings", "Other showings", "<span class=\"date-type\">From</span> "+f.fshow+" - "+f.lshow);
	if(f.summary)
		addDefnListItem($filmDetails, "synopsis", "Summary:", "<p>"+f.summary+"</p>");
	
	var $calIcon = $("<li></li>")
		.addClass("calendar")
		.append(
			$("<a></a>")
				.attr("href", "http://technorati.com/events/" + siteURL + "index.php?showing="+f.offset+"#now-showing")
				.attr("title", "Add to calendar")
				.append("Add to calendar")
		);
		
	var $ticketIcon = $	("<li></li>")
			.addClass("tickets")
			.append(
				$("<a></a>")
					.attr("href", f.tickets ? "http://"+f.tickets : defaultTicketURL)
					.attr("title", "Buy tickets")
					.append("Buy tickets")
			);
	
	var $actionIcons = $("<ul></ul>")
		.addClass("icons")
		.append($calIcon, $ticketIcon);
	
	$("#trailers .trailer-details")
		.html("")
		.append($("<h3></h3>").append(f.title).addClass("summary"))
		.append($icons)
		.append($filmDetails)
		.append($actionIcons)
		.addClass("vevent");
		
	calendarInitLinks("#trailers .trailer-details li.calendar a");
}

function addDefnListItem($dl, cls, title, content)
{
	$dl.append(
		$("<dt></dt>")
			.addClass(cls)
			.append(title),
		$("<dd></dd>")
			.addClass(cls)
			.append(content),
		" "
	);
}