(function ($) {
	// init
	$.fn.blackout = function (options) {
		opts = $.extend({}, $.fn.blackout.options, options);
		$.fn.blackout.createStage();
		return this.each(
			function (i) {
				var $blackoutList = $(this).attr({'id': opts.uniqueID + i});				
				$(opts.triggerElement, $blackoutList).bind('click', function (e) {
					$.fn.blackout.loadMedia(e, $blackoutList);
				});
			}
		);
	};
	// Set up the blackout stuff (screen, popup, etc.)
	$.fn.blackout.createStage = function () {
		$blackoutScreen = $('<div id="blackoutScreen"></div>').bind('click', $.fn.blackout.closeStage).hide();
		$blackoutPopup = $('<div id="blackoutPopup"></div>').hide();
		$blackoutMedia = $('<div id="blackoutMedia"></div>').hide();
		$blackoutCaption = $('<div id="blackoutCaption"></div>').hide();
		$blackoutNavigation = $('<div id="blackoutNavigation"></div>').hide();
		$blackoutNavigation.append($('<ul><li id="blackoutNavigationPrev">&lt; Previous</li><li id="blackoutNavigationNext">Next &gt;</li></ul>'));
		$('li', $blackoutNavigation).unbind().hide();
		$blackoutClose = $('<a href="" id="blackoutClose">' + opts.closeText + '</a>').bind('click', $.fn.blackout.closeStage).hide();
		$blackoutPopup.append($blackoutMedia, $blackoutCaption, $blackoutNavigation, $blackoutClose);
		$('body').append($blackoutScreen, $blackoutPopup);
		$.fn.blackout.centerPopup();
		/*
		$blackoutPopup.data({
			 'originalHeight': $blackoutPopup.innerHeight()
			,'originalMarginLeft': $blackoutPopup.css('marginLeft')
			,'originalMarginTop': $blackoutPopup.css('marginTop')
			,'originalTopOffset': $blackoutPopup.css('top')
			,'originalWidth': $blackoutPopup.innerWidth()
		});
		*/
	};
	// Position the popup in the center of the screen
	$.fn.blackout.centerPopup = function () {
		var viewportOffset = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
		var viewportHeight = ($.browser.msie) ? document.documentElement.offsetHeight : window.innerHeight;
		$blackoutPopup.css({
			 marginLeft: -($blackoutPopup.outerWidth() / 2) + 'px'
			,marginTop: -($blackoutPopup.outerHeight() / 2) + 'px'
			,top: viewportOffset + (viewportHeight / 2) + 'px'
		});
	};
	// Clean up the stage
	$.fn.blackout.cleanStage = function () {
		$blackoutMedia.empty().hide();
		$blackoutNavigation.hide();
		$('li', $blackoutNavigation).unbind().hide();
		$blackoutCaption.empty().hide();
	};
	// Close the stage
	$.fn.blackout.closeStage = function (e) {
		e.preventDefault();
		$blackoutPopup.fadeOut(opts.fadeSpeed, function () {
			$.fn.blackout.cleanStage();
			$blackoutScreen.fadeOut(opts.fadeSpeed);
			$blackoutPopup.css({
				 height: $blackoutPopup.data('originalHeight')
				,marginLeft: $blackoutPopup.data('originalMarginLeft')
				,marginTop: $blackoutPopup.data('originalMarginTop')
				,top: $blackoutPopup.data('originalTopOffset')
				,width: $blackoutPopup.data('originalWidth')
			});
			$.fn.blackout.centerPopup();
		});
	};
	// Load the media and set the appropriate title/caption
	$.fn.blackout.loadMedia = function (e, $parentList) {
		e.preventDefault();
		$.fn.blackout.cleanStage();
		var $trigger = $(e.currentTarget);
		var $parentListItem = $trigger.parent('li');
		var target = $trigger.attr(opts.fullsizeTargetAttr);
		var mediaTitle = $trigger.attr(opts.mediaTitleAttr);
		var mediaCaption = $('img', $trigger).attr(opts.mediaCaptionAttr);
		var streamPosition = $parentList.children().index($parentListItem);
		var thisItemOpts = ($trigger.attr('rel') && $trigger.attr('rel').indexOf('blackoutOpts') === 0) ? eval($trigger.attr('rel')) : false;
		mediaHeight = thisItemOpts.height ? thisItemOpts.height : false;
		mediaWidth = thisItemOpts.width ? thisItemOpts.width : false;
		// build navigation (if more than one item)
		if (opts.showNavigation && $parentList.children().length > 1) {
			if (streamPosition > 0) {
				$('#blackoutNavigationPrev', $blackoutNavigation)
					.bind('click', function () {$(opts.triggerElement, $parentListItem.prev('li')).click();})
					.show();
			}
			if (streamPosition < $parentList.children().length - 1) {
				$('#blackoutNavigationNext', $blackoutNavigation)
					.bind('click', function () {$(opts.triggerElement, $parentListItem.next('li')).click();})
					.show();
			}
		}
		// build caption
		if (opts.showCaption) {
			if (mediaTitle != '') {$blackoutCaption.append($('<h3></h3>').text(mediaTitle));}
			if (mediaCaption != '') {$blackoutCaption.append($('<p></p>').text(mediaCaption));}
		}
		// Load/build the media object (movie or image)
		if (thisItemOpts && thisItemOpts.type == 'movie') {
			//var blackoutVideo = renderVideoElement('blackoutVideo', opts.swfPath, 'high', mediaWidth, mediaHeight, '9', 'videoPath=' + target + '&FLVHeight=' + mediaHeight + '&FLVWidth=' + mediaWidth, 'transparent');
			var blackoutVideo = renderVideoElement('blackoutVideo', opts.swfPath, 'high', mediaWidth, mediaHeight, '9', 'videoPath=' + target, 'transparent');
			$.fn.blackout.triggerPopup($(blackoutVideo));
		}
		else {
			var image = new Image();
			$(image)
				.attr({'src': target + '?rand=' + Math.floor(Math.random() * 999999999)})
				.load(function () {
					mediaHeight = mediaHeight ? mediaHeight : image.height;
					mediaWidth = mediaWidth ? mediaWidth : image.width;
					$(image).attr({'height' : mediaHeight, 'width' : mediaWidth});
					$.fn.blackout.triggerPopup($(image));
				});
		}
	};
	// Add media to popup and start the animation
	$.fn.blackout.triggerPopup = function ($mediaItem) {
		$blackoutMedia.append($mediaItem);
		$blackoutScreen
			.css({height: $(document).height(), opacity: opts.screenOpacity, width: $(document).width()})
			.fadeIn(opts.fadeSpeed);
		$.fn.blackout.animatePopup();
	};
	// Animate the final popup (now contains media, caption, and navigation)
	$.fn.blackout.animatePopup = function () {
		$blackoutPopup
			.show()
			.animate(
				 {
					 marginLeft: '-' + (mediaWidth / 2) + 'px'
					,width: mediaWidth
				 }
				,opts.animationSpeed
				,opts.easing
				,function () {
					if (opts.showCaption && $blackoutCaption.html() != '') {
						$blackoutCaption.css({'visibility':'hidden', 'display':'block'});
						mediaHeight = parseInt(mediaHeight, 10) + $blackoutCaption.outerHeight();
						$blackoutCaption.css({'visibility':'visible', 'display':'none'});
					}
					$blackoutPopup.animate(
						{
							 height: mediaHeight
							,marginTop: '-' + (mediaHeight / 2) + 'px'
						}
						,opts.animationSpeed
						,opts.easing
						,function () {
							$blackoutMedia.show();
							if (opts.showCaption && $blackoutCaption.html() != '') {$blackoutCaption.show();}
							if (opts.showNavigation && $blackoutNavigation.html() != '') {$blackoutNavigation.show();}
							$blackoutClose.show();
						}
					);
				}
			);
	};
	// Default options
	$.fn.blackout.options = {
		 animationSpeed: 500
		,closeText: 'Close - &times;'
		,easing: 'swing'
		,fadeSpeed: 250
		,fullsizeTargetAttr: 'href'
		,mediaCaptionAttr: 'longdesc'
		,mediaTitleAttr: 'title'
		,presentation: 'default'
		,screenOpacity: '0.667'
		,showCaption: true
		,showCloseButton: true
		,showNavigation: true
		,skinPath: 'flash/SteelOverAll.swf'
		,swfPath: 'flash/container.swf'
		,triggerElement: 'a'
		,uniqueID: 'blackoutObject'
	};
})(jQuery);
