﻿//<![CDATA[

	/*
	 * FLV Embed
	 * 
	 * Insert Longtail Video JW Player into WordPress posts.
	 * Part of the FLV Embed plugin by Yaosan Yeo http://www.channel-ai.com/blog/plugins/flv-embed/
	 * JavaScript bit by Andrew Weeks http://www.poleexercise.co.uk/
	 */

	var jwPlayerHandler;
	var vidGallery;

	(function($)
	{
		jwPlayerHandler = 
		{
			// Length of player id prefix (= 'player' for 'player1')
			idPre: 6,
			minFlashVer: "7",
			normalText: "Normal quality",
			highText: "High quality",
			quality: { normal: 0, high: 1 },
			
			players: new Array(),
			properties: new Array(),

			init: function()
			{
				$(".JWPlaceholder").each(function()
				{
					var $placeholder = $(this);
					
					// Show get Flash message if embedding fails.
					$placeholder.show();
					// Uses rawurlencode at other end - don't send funny chars
					var properties = eval("(" + decodeURIComponent($placeholder.attr("flv")) + ")");
					// Store these so can attach to player when it appears.
					jwPlayerHandler.properties[properties.player.idx] = properties;
					
					if (properties.vars.highfile || vidGallery != null)
					{
						$placeholder.after("<div class=\"JWQualitySwitcherWrapper\"><a class=\"JWQualitySwitcher\" href=\"#\" rel=\"" + properties.player.idx + "\">" + jwPlayerHandler.normalText + "</a></div>");
						
						if (vidGallery != null)
						{
							vidGallery.$qualitySwitcher = $placeholder.siblings(".JWQualitySwitcherWrapper").children();
							if (vidGallery.$vidList.find("span[hiflv]").length == 0) vidGallery.$qualitySwitcher.hide();
							
							if (!properties.vars.highfile)
							{
								vidGallery.$qualitySwitcher.addClass("Disabled");
							}
						}
					}
					
					swfobject.embedSWF(properties.player.url, properties.player.placeholder, properties.vars.width, properties.vars.height, jwPlayerHandler.minFlashVer, false, properties.vars, properties.params, properties.attrs);
				});
				
				$(".JWQualitySwitcher").click(function()
				{
					if ($(this).is(".Disabled")) return false;
					
					var player = jwPlayerHandler.players[$(this).attr("rel")];

					player.seekTime = player.time;
					player.switching = true;
					
					if (player.quality == jwPlayerHandler.quality.normal)
					{
						$(this).html(jwPlayerHandler.highText);
						player.sendEvent("LOAD", player.high);
						player.quality = jwPlayerHandler.quality.high;
					}
					else
					{
						$(this).html(jwPlayerHandler.normalText);
						player.sendEvent("LOAD", player.normal);
						player.quality = jwPlayerHandler.quality.normal;
					}

					player.sendEvent("PLAY");
					return false;
				});
			},
			
			playerSeek: function(player, newState)
			{
				// Are we trying to seek, have we failed to seek so far and have we not tried too many times?
				// If the new vid doesn't load to the seek position in 5 seconds this will fail.
				// Enable streaming if you have large files / a slow server.
				if (player.time < player.seekTime - 2 && player.seekAttempts < 5 && newState == "PLAYING")
				{
					player.sendEvent("SEEK", player.seekTime);
					setTimeout(function() { jwPlayerHandler.playerSeek(player, newState); }, 1000);
					player.seekAttempts++;
				}
				else
				{
					player.switching = false;
				}
			}
		};
		
		vidGallery =
		{
			init: function()
			{
				this.$vidGallery = $(".VidGallery");
				this.$vidBox = $(".VidGallery .VidBox");
				this.$vidList = $(".VidGallery ul.VidList");
				this.$vidTitle = $(".VidGallery .VidTitle");
				
				this.$vidGallery.addClass("JQuery");
				var vidListItem = this.$vidList.children("li");
				var vidItemWidth = parseInt(vidListItem.css("width")) + parseInt(vidListItem.css("margin-right")) + parseInt(vidListItem.css("margin-left"));
				this.moveStep = Math.floor(parseInt(this.$vidBox.css("width")) / vidItemWidth) * vidItemWidth;

				this.$vidBox.width = parseInt(this.$vidBox.css("width"));
				this.$vidList.left = parseInt(this.$vidList.css("left"));
				this.$vidList.width = vidItemWidth * this.$vidList.children().length;
				this.$vidList.css("width", this.$vidList.width + "px");
				
				// Trim long thumbnail titles
				this.$vidList.find("span").after("<span id=\"titleWidth\" style=\"display: block; visiblity: hidden; margin: 0 !important; padding: 0 !important; border: none !important; height: auto; width: auto; position: absolute;\"></span");
				var $titleWidth = $("#titleWidth");
				
				this.$vidList.find("span:visible").each(function()
				{
					var $this = $(this);
					var title = $this.text();
					var width = $this.width();
					
					if ($titleWidth.text(title).width() > width)
					{
						for (var t = title.length; $titleWidth.html(title.substring(0, t) + "&hellip;").width() > width && t > 0; t--);
						$this.html($titleWidth.html());
					}
				}).click(function()
				{
					var $this = $(this);
					var player = vidGallery.player;
					var flv = $this.attr("flv");
					var hiflv = $this.attr("hiflv");
					
					vidGallery.$vidTitle.html($this.attr("title"));
					player.normal = flv;

					if (hiflv)
					{
						player.high = hiflv;
						vidGallery.$qualitySwitcher.removeClass("Disabled");
					}
					else
					{
						vidGallery.$qualitySwitcher.addClass("Disabled");
					}
					
					if (player.quality == jwPlayerHandler.quality.high && hiflv)
					{
						player.sendEvent("LOAD", hiflv);
					}
					else
					{
						player.quality = jwPlayerHandler.quality.normal;
						vidGallery.$qualitySwitcher.html(jwPlayerHandler.normalText);
						player.sendEvent("LOAD", flv);
					}
					
					player.sendEvent("PLAY");
					return false;
				});
				
				$titleWidth.remove();
				
				this.$vidGallery.find(".VidArrow#vidArrowLeft").click(function() { return vidGallery.moveList(vidGallery.moveStep); });
				this.$vidGallery.find(".VidArrow#vidArrowRight").click(function() { return vidGallery.moveList(-vidGallery.moveStep); });
			},

			moveList: function(distance)
			{
				var rightPos;
				
				with (vidGallery)
				{
					if ((distance < 0 && $vidList.left + $vidList.width <= $vidBox.width) || (distance > 0 && $vidList.left >= 0)) return false;

					// This looks overly complicated...
					distance = distance < 0 ? ((rightPos = $vidList.width + distance + $vidList.left) < $vidBox.width ? Math.max(-rightPos, distance) : distance) : Math.min(distance, -$vidList.left);
					$vidList.left += distance;
					$vidList.animate({ left: $vidList.left }, 350);
				}
				return false;
			}
		};

		$(document).ready(function()
		{
			if ($(".VidGallery").length != 0)
			{
				vidGallery.init();
			}
			else
			{
				vidGallery = null;
			}
			
			jwPlayerHandler.init();
		});
	})(jQuery);


	function timeMonitor(obj)
	{
		// Assume all player ids start with 'player'
		jwPlayerHandler.players[obj.id.substring(jwPlayerHandler.idPre)].time = obj.position;
	}
	
	function stateMonitor(obj)
	{
		// The player needs a little time to think before it will seek.
		var player = jwPlayerHandler.players[obj.id.substring(jwPlayerHandler.idPre)];
		var newState = obj.newstate;
		
		if (player.switching && newState == "PLAYING")
		{
			player.seekAttempts = 0;
			// Kudos http://www.makemineatriple.com/2007/10/passing-parameters-to-a-function-called-with-settimout/
			setTimeout(function() { jwPlayerHandler.playerSeek(player, newState); }, 500);
		}
	}
		
	function playerReady(obj)
	{
		var idx = obj.id.substring(jwPlayerHandler.idPre);
		
		player = jQuery("#" + obj.id)[0];
		properties = jwPlayerHandler.properties[idx];
		player.normal = properties.vars.file;
		
		if (properties.vars.highfile)
		{
			player.high = properties.vars.highfile;
			player.switching = false;
			player.quality = jwPlayerHandler.quality.normal;
			player.addModelListener("TIME", "timeMonitor");
			player.addModelListener("STATE", "stateMonitor");
		}
		
		jwPlayerHandler.players[idx] = player;
		
		if (vidGallery != null && jQuery(player).parents(".VidGallery").length == 1)
		{
			vidGallery.player = player;
		}
	}
//]]>