(function($){  
	
	$.fn.videoOverlay = function(options){
		var defaults = {
			//css selectors
			videoPlayer:		'.videoOverlay .vid',
			carousel:			'.videoOverlay .carousel',
			revolverBelt:		'.videoOverlay .revolverBelt',
			
			autoOpen:			false,
			startIndex:			0,
			videoXML:			'/1/PA_ES_Content_Mgmt/content/hsbc_expat/tools/media_player/videos.xml',
			group:				true,
			currentGroup:		null
		}
		
		var opts = $.extend(defaults, options);
		var $obj = $(this);
		var $carousel = null,
			videos = null,
			group = null,
			$xmlData = null,
			flashObj = null,
			closeButton = null;
			
		//load xml
		$.ajax({
			url: opts.videoXML,
			type: 'GET',
			dataType: 'xml',
			success: function(videoData){
				$xmlData =  $(videoData);
				queryString = $.address.value().split('/');

				//set initial group
				if (opts.group){
					if (queryString.length > 1 && queryString[1] === 'overlay' &&  $xmlData.find('video#'+queryString[2])){
						var group = $xmlData.find('video#'+queryString[2]).closest('group');
					}else{
						var group = $xmlData.find('group').eq(0);
					}
					opts.currentGroup = group.attr('id');
					videos = group.find('video');
				}else{
					videos = $xmlData.find('video');
				}
				//build and load revolver
				$carousel = buildRevolver(videos);

				//set first video
				if (queryString.length > 1 && queryString[1] === 'overlay' &&  $xmlData.find('video#'+queryString[2])){
					var startVideo = queryString[2];
					opts.startIndex = $xmlData.find('video#'+queryString[2]).index();
					opts.autoOpen = true;
				}else{
					var startVideo = $obj.find('.revolverItem').eq(opts.startIndex).attr('id');	
				}
				
				$carousel.trigger('changeselectedrevolver', opts.startIndex);

				//load flash object
				$fla = loadFlash(opts.videoXML, startVideo, $xmlData.find('video#'+startVideo));
				//bind click events to change video
				
				$('.revolverItem div a').live('click', function(e){
					e.preventDefault();
					changeVideo($(this).closest('.revolverItem'), $xmlData.find('video#'+$(this).closest('.revolverItem').attr('id')));
				});
				
				$('.loadVid').live('click', function(e){				
					var href = $(this).attr('href').split('/');
					if (href[1] === 'overlay'){
						var videoId = href[2];
					}else if (href.length === 1){
						videoId = 'v1';
					}else{
						var href = $(this).attr('href');
						var videoId = href.substring(href.indexOf('overlay')+8, href.length);
					}
					$videoData = $xmlData.find('video#'+videoId);
					if (videoId){
						if (opts.group){
							var group = $xmlData.find('video#'+videoId).closest('group').attr('id');
							if (group != opts.currentGroup){
								changeRevolver($xmlData.find('group#'+group+' video'));
								opts.currentGroup = group;
							}
						}
						$('.triggerModalDetails').trigger('click');
						var indexPos = $xmlData.find('video#'+videoId).index();
						opts.startIndex = indexPos;
						loadFlash(opts.videoXML, videoId, $videoData);
						$carousel.trigger('changeselectedrevolver', indexPos);
						
						$(opts.revolverBelt).show();
						$(opts.revolverBelt).closest('.revolverWindow').css('height', $(opts.revolverBelt).height());
					}
				});
				
				//auto open if required
				if (opts.autoOpen){
					$('.triggerModalDetails').trigger('click');
					
				}
			}
		});
		
		/**
		 *	Change revolver to a specified set of elements
		 *	@Param: $elements (Array of XML elements): Array of elements to build revolver from
		 *	@Return: Void 
		 */
		function changeRevolver(elements){
			items = new Array();
			$(elements).each(function(){
				var $video = $(this);
				items.push($('<div class="revolverItem" id="'+$video.attr('id')+'">'+
					'<div><a href="#" class="revolverSelect">'+
					'<img src="'+$video.find('thumb_url').text()+'" alt="'+$video.find('title').text()+'" />'+
					'</a><p>'+$video.find('summary').text()+'</p></div></div>'));
			});
			$carousel.trigger('changeitemsrevolver', [items, 0]);
		}
		/**
		 *	Build revolver from specified elements
		 *	@Param: $elements (Array of XML elements): Array of elements to build revolver from
		 *	@Return: $carousel: Carousel object
		 */
		function buildRevolver (elements){
			var $revolver = $(opts.revolverBelt).empty();
			$(elements).each(function(){
				var $video = $(this);
				$revolver.append('<div class="revolverItem" id="'+$video.attr('id')+'">'+
					'<div><a href="#" class="revolverSelect">'+
					'<img src="'+$video.find('thumb_url').text()+'" alt="'+$video.find('title').text()+'" />'+
					//'</a><p>'+$video.find('summary').text()+'</p></div></div>');
					'</a><p><strong>'+$video.find('title').text()+'</strong></p><p>'+$video.find('summary').text()+'</p></div></div>');
			});
			//load carousel
			$overlayWrapper = $('#lightviewDetails');
			$overlayWrapper.show();
			
			$carousel = $('.carousel').show().carousel({
				infinite: true,
				selected: 1,
				interval: 0
			});
			$overlayWrapper.hide();
			
			return $carousel;
			
		}
		/**
		*	Change currently selected, and playing, video
		*	@Param: element (jQuery object): Target element id that represents the new video
		*	@param:	$xmlData (jQuery'd XML data): Data for the video that is being changed to
		*	@Return: Void
		*/
		function changeVideo($element, $xmlData){
			var $fla = $obj.find('.vid embed, .vid object')[0];
			$fla.setVideo($element.attr('id'));		
			
			$obj.find('.title').empty().html($xmlData.find('title').text());
			$obj.find('a.transcript').attr('href', $xmlData.find('transcript_url').text());
			$obj.find('.summary').empty().html($xmlData.find('synopsis').text());
			
			$('.triggerModalDetails').trigger('click');
			$carousel.trigger('changerevolver', $element.attr('aria-posinset')-1);
		}
		/**
		*	Loads Flash
		*	@param:	xml (string): path to xml file
		*	@param: startVideo (string): id of start video
		*	@param: $xmlData (jQuery'd xml data):
		*	@Return: jQuery element containing flash
		*/
		
		function loadFlash(xml, startVideo, $xmlData){
			$(opts.videoPlayer).empty().flash(
			{
				//src: '../flash/video_player.swf?xmlPath='+xml+'&videoID='+startVideo,
				src: '/1/PA_ES_Content_Mgmt/content/hsbc_expat/tools/media_player/video_player.swf?xmlPath='+xml+'&videoID='+startVideo,
				width: 700,
				height: 393,
				version: 9
			},{
				allowFullScreen:'true',
				id:'flashVidPlayer'
			});
			$obj.flashObj = window['flashVidPlayer'] || document['flashVidPlayer'];
			$obj.closeButton = $('.close'); // $('#closeModalDetails');
			$($obj.closeButton).click(stopPlaying);

			$obj.find('.title').empty().html($xmlData.find('title').text());
			$obj.find('a.transcript').attr('href', $xmlData.find('transcript_url').text());
			$obj.find('.summary').empty().html($xmlData.find('synopsis').text());
			
			$carousel.trigger('changerevolver', opts.startIndex);
			return $obj.find('.vid embed, .vid object')[0];	
		}
		/**
		*	Stops flash video playing
		*	@Return: void
		*/
		function stopPlaying(){
			$obj.flashObj.stopPlaying();
		}
	}
})(jQuery);
