// depends on swfobject and jwplayer
// http://code.google.com/p/swfobject/
// http://www.longtailvideo.com/players/jw-flv-player/

// ready and listener need to be in the global scope
var playerReady;
var playerTimeListener;

;(function($){

	var WINDOW_SELECTOR = '#jwp';
	var CLOSE_LINK_SELECTOR = '#jwpclose';
	var PLAYER_SELECTOR = '#jwpflash';
	var TITLE_SELECTOR = '#jwptitle';

	var SCREEN_LINK_ID = 'jwpscreenlink';
	var OBJECT_EMBED_ID = 'jwplayer';

	var run = false;
	var player = null;
	var current_offsetx = null;
	var current_offsety = null;

	playerReady = function(obj)
	{
		player = $('#' + obj.id)[0];
		player.addModelListener('TIME','playerTimeListener');
	};

	function embed(settings)
	{
		$(settings.playerSelector).empty().append('<div id="'+ OBJECT_EMBED_ID +'"></div>');

		var flashvars = {file:settings.file,image:settings.image,link:(settings.screenLink?settings.screenLink:settings.link)};

		if (settings.stretching) flashvars.stretching = settings.stretching;
		if (settings.autostart) flashvars.autostart = settings.autostart;
		
		swfobject.embedSWF
		(
			settings.playerSwf
			, OBJECT_EMBED_ID
			, settings.width
			, settings.height
			, settings.version
			, false
			, flashvars
			, {wmode:'transparent',allowscriptaccess:'always',allowfullscreen:'true'}
			, {id:OBJECT_EMBED_ID,name:OBJECT_EMBED_ID}
		);

		setScreenLink(settings);
	}

	function setScreenLink(settings)
	{
		$('#' + SCREEN_LINK_ID).remove();
		
		if (settings.screenLink)
		{
			setTimeout(function()
			{
				// width and height calls need a delay
				var w = $(player).width();
				var h = $(player).height()-20; // less 20px = height of control bar

				var link = 
					$('<div></div>')
					.attr('id',SCREEN_LINK_ID)
					.css({'position':'absolute','width':w,'height':h,'backgroundColor':'transparent'})
					.insertBefore(settings.playerSelector)
					.hide()
					.click(function()
					{
						if (settings.screenLinkTarget && settings.screenLinkTarget != '_self')
						{
							player.sendEvent('PLAY','false');
							window.open(settings.screenLink,settings.screenLinkTarget);
						}
						else
						{
							location.href = settings.screenLink;
						}
					});

				playerTimeListener = function(obj)
				{
					if (obj.position >= settings.screenLinkOffset)
					{
						link.show();
						playerTimeListener = null;
					}
				};

			},500);
		}
	}

	function setTitle(settings)
	{
		$(settings.titleSelector).empty().hide();

		if (settings.title)
		{
			$(settings.titleSelector).html(settings.title).show();
		}
	}

	function position(settings)
	{
		if (current_offsetx != null)
		{
			$(settings.windowSelector).css('margin-left',current_offsetx);
		}
		
		if (settings.offsetx) 
		{
			// remember current offset position in order to set other window positions where offsex is not explicitly defined
			current_offsetx = $(settings.windowSelector).css('margin-left');
			$(settings.windowSelector).css('margin-left',settings.offsetx);
		}

		if (current_offsety != null)
		{
			$(settings.windowSelector).css('margin-top',current_offsety);
		}

		if (settings.offsety) 
		{
			// remember current offset position in order to set other window positions where offset is not explicitly defined
			current_offsety = $(settings.windowSelector).css('margin-top');
			$(settings.windowSelector).css('margin-top',settings.offsety);
		}
	}

	function show(settings)
	{
		if (settings.beforeOpen)
		{
			settings.beforeOpen.call($(settings.windowSelector));
		}

		$(settings.windowSelector).css('visibility','visible').show();

		if (settings.afterOpen) 
		{
			settings.afterOpen.call($(settings.windowSelector));
		}
	}

	$.fn.jwplayer = function(changedDefaults)
	{
		return this.each(function()
		{
			// settings are specific to each link, overwriting defaults
			var settings = $.extend({}, $.fn.jwplayer.defaults, changedDefaults);

			$(this).click(function(e)
			{
				e.preventDefault();
				
				embed(settings);

				setTitle(settings);

				position(settings);

				show(settings);
			});

			if (!run) // run once on first initialization
			{
				// include markup only if not already included
				if ( ! $(settings.windowSelector).length)
				{
					var html = '<div id="jwp"><img id="jwpclose" src="/images/close.png" alt=""/><div id="jwpcontainer"><div id="jwpflash"></div><div id="jwptitle"></div></div></div>';

					// if including markup, revert to default selectors
					settings.windowSelector = WINDOW_SELECTOR;
					settings.closeLinkSelector = CLOSE_LINK_SELECTOR;
					settings.playerSelector = PLAYER_SELECTOR;
					settings.titleSelector = TITLE_SELECTOR;
					
					if (settings.prepend) $(settings.prepend).prepend(html);
					else if (settings.append) $(settings.append).append(html);
					else $('body').prepend(html);
				}
				
				$(settings.closeLinkSelector).click(function(e)
				{
					e.preventDefault();

					$(settings.windowSelector).hide();

					if (player) player.sendEvent('STOP');

					$(settings.playerSelector).empty();
				});

				run = true;
			}
		});
	}

	$.fn.jwplayer.defaults =
	{
		prepend: null
		, append: null
		, windowSelector: WINDOW_SELECTOR
		, closeLinkSelector: CLOSE_LINK_SELECTOR
		, playerSelector: PLAYER_SELECTOR
		, titleSelector: TITLE_SELECTOR
		
		// link specific options
		, file: null
		, image: null
		, title: null
		, width: 320
		, height: 160
		, offsetx: 0
		, offsety: 0

		// requires jwplayer embedding
		, link: null
		, screenLink: null
		, screenLinkTarget: '_blank' // supports: _self and _blank
		, screenLinkOffset: 5

		// callbacks
		//, close: null // used to override the close event
		//, embed: null // used to override the embedding of jwplayer
		, beforeOpen: null // called before show
		, afterOpen: null // called after show

		, playerSwf: '/flash/player.swf'
		, version: '9.0.98'
	};

	// automatically checks for links in the following formats (with a class of "jwplink"):
	// <a class="jwplink" href="/media/vip_opening.flv" rel="{image:'/media/vip_opening.jpg',width:500,height:301}">My Video</a>
	// <a class="jwplink" href="#" rel="{file:'/media/vip_opening.flv',image:'/media/vip_opening.jpg',width:500,height:301}">My Video</a>

	$('.jwplink').each(function()
	{
		var settings = eval('(' + $(this).attr('rel') + ')');
		if (!settings.file) settings.file = $(this).attr('href');
		if (!settings.title) settings.title = $(this).attr('title');
		$(this).jwplayer(settings);
	});

})(jQuery);