/**
 * responsible for handling popup overlays for photo, video, etc.
 * @param {Cobalt.Core.Sandbox} sandbox
 */

Cobalt.Website.Common.VideoPopupModule = function(sandbox)
{
	
    var _videoData;
    var _videoItems;
	var _liquidusData;
    var _panelElement;
    var _activeCarousel;
	var _initialLoad;
    var _cobaltLiquidusPlayer;
    var _cobaltDmiPlayer;
	var _pixelData;
	var _enhancedDmiVideo;
	
    function getVideoData() { return _videoData; }
    function setVideoData(data) { _videoData = data; }
    
    function getEnhancedDmiVideo(){return _enhancedDmiVideo;}
    function setEnhancedDmiVideo(data){_enhancedDmiVideo = data;}

    function getVideoItems() { return _videoItems; }
    function setVideoItems(data) { _videoItems = data; }
    function getVideoItemsLength() { return parseInt(getVideoItems().length,10); }
	
	function getLiquidusData() { return _liquidusData; }
    function setLiquidusData(data) { _liquidusData = data; }

    function getPanelElement() { return _panelElement; }
    function setPanelElement(ele) { _panelElement = ele; }

    function getCurrentVehicleId() { return getVideoData().vehicleId; }

    function getActiveCarousel() { return _activeCarousel; }
    function setActiveCarousel(obj) { _activeCarousel = obj; }
	
	function setPixelData(data) {_pixelData = data;}
	function getPixelData() {return _pixelData;}	
	
	function getCurrentVideoDetails(i) { 
		var videoItems = getVideoItems();
		return {
			"title": videoItems.title, 
			"typeDesc": videoItems[i].videoTypeDesc, 
			"shortDesc": videoItems[i].videoShortDesc, 
			"duration": videoItems[i].videoDuration, 
			"toolTip": videoItems[i].toolTip, 
			"icon": videoItems[i].iconURL, 
			"url": videoItems[i].url, 
			"type": videoItems[i].type, 
			"pixelTag": videoItems[i].pixelTagLabel,
			"disclaimer": videoItems[i].disclaimer,
			"sourceID": videoItems[i].sourceID
		}
	}

    function getCobaltLiquidusVideoPlayer()
    {
        _cobaltLiquidusPlayer = Cobalt.Website.Media.CobaltLiquidusPlayer(sandbox);
        _cobaltLiquidusPlayer.init(getLiquidusData());
        return _cobaltLiquidusPlayer; 
    }

    function getCobaltDMIVideoPlayer()
    {
        _cobaltDmiPlayer = Cobalt.Website.Media.CobaltDmiPlayer(sandbox);
        _cobaltDmiPlayer.init(getEnhancedDmiVideo());
        return _cobaltDmiPlayer; 
    }
    
    function getCobaltProfessionalVideoPlayer(videoData)
    {
        _cobaltProPlayer = Cobalt.Website.Media.ProfessionalFlashVideoPlayer(sandbox);
        _cobaltProPlayer.init(videoData);
        return _cobaltProPlayer; 
    }
	function setInitialLoad(val){ _initialLoad = val; }
	
	function isInitialLoad(){ return _initialLoad; }

	function renderVideoData(e){
		customData = e.customData;
        setVideoData(customData.data);
        setVideoItems(customData.items);
		setLiquidusData(customData.liquidus);
		setEnhancedDmiVideo(customData.enhancedDmiVideo);
		setInitialLoad(customData.initialLoad);
		setPixelData(customData.pixelData);
		if(isInitialLoad()) firePixelTagForVideo(null);
		setPanelElement(customData.tabData.panel);
		constructVideoGallery(getPanelElement());
	}
	
    function getNumberOfThumbsToDisplay()
    {
        var visible = parseInt(getVideoData().itemsToBeDisplayedInCarousel);
		var total = getVideoItemsLength();
		if (total <= visible)  visible = total;
        return visible;
    }	
	
	function constructVideoGallery(pnlElement){
		/*Construct DOM*/
		var caroselUi = sandbox.dom("<div class='carousel widget'></div>").getDomElements();
		var caroselDisplayUi = sandbox.dom("<div class='videoWrapper'><div class='videoContainer' id='videoContainer'></div><div class='videoDisclaimerText'></div></div>").getDomElements();
		var slider = sandbox.dom("<div class='videoCarousel'></div>").getDomElements();
		var clear = sandbox.dom("<div style='clear:both'></div>").getDomElements();
		var list = sandbox.dom("<ul class='video_thumb'></ul>").getDomElements();
		sandbox.dom(slider).append(list);
		sandbox.dom(caroselUi).append(caroselDisplayUi);
		sandbox.dom(caroselUi).append(slider);
		sandbox.dom(caroselUi).append(clear);
		sandbox.dom(pnlElement).empty();
		sandbox.dom(pnlElement).append(caroselUi);
		
		/*Construct Carousel*/
		var carouselSelector = "div[id='" + sandbox.dom(pnlElement).attr("id") + "'] div.videoCarousel";	
		var visible = getNumberOfThumbsToDisplay();
		
		sandbox.dom(carouselSelector).carousel({
			scroll: visible,
			animation:"slow",
			visible: visible,
			buttonNextHTML:"<div class='next'></div>",
			buttonPrevHTML:"<div class='prev'></div>",
			initCallback: initCarouselCallback,
			itemVisibleInCallback: {onBeforeAnimation: loadThumbs},
			itemVisibleOutCallback: {onAfterAnimation: removeThumbs}
		});

	}
	
	function initCarouselCallback(carousel)
	{
		setActiveCarousel(carousel);
		var visible = getNumberOfThumbsToDisplay();
		var total = getVideoItemsLength();
		if(total === 1 || total === visible){
			sandbox.dom(carousel.buttonNext).addStyle({visibility:"hidden"});
			sandbox.dom(carousel.buttonPrev).addStyle({visibility:"hidden"});
		}
	}

	function loadThumbs(carousel, item, i)
	{
        if (!carousel || !item || i<1) { return; }
        
        var videoElementIndex = getVideoElementIndex(carousel, i); 
        if (! getVideoItems()[videoElementIndex] ) { return; }
		if (!carousel.has(i)) {
			carousel.add(i, createThumbElement(carousel, videoElementIndex, item));
		}
		//Load first video on load
		if(i===1) updateVideoAndStatus(0, item);
	}
	
	function removeThumbs(carousel, item, i)
	{
        if (!carousel || !item || i<1) { return; }
        
		carousel.remove(i);
	}
	
    function createThumbElement(carousel, i, item)
    {
		var videoItem = getCurrentVideoDetails(i);
		var thumb = "<div class='video_thumb_wrap' title='"
					+videoItem.toolTip
					+"' ><img src='"
					+videoItem.icon
					+"'/><div class='video_thumb_data'><div class='video_thumb_vehicleMakeModel'>"
					+videoItem.title
					+"</div><div class='video_thumb_videoTypeDesc'>"
					+videoItem.typeDesc
					+"</div><div class='video_thumb_videoShortDesc'>"
					+videoItem.shortDesc
					+"</div><div class='video_thumb_videoDuration'>"
					+videoItem.duration
					+"</div></div></div>";
        return sandbox.dom(thumb).click(function()
                    {
                        updateVideoAndStatus(i, item);
                    });
    }

	function updateVideoAndStatus(carouselItemIndex, item)
	{
		var videoItemIndex = parseInt(carouselItemIndex);
		var videoItem = getCurrentVideoDetails(videoItemIndex);
		var current = sandbox.dom('<span class="current">' + (videoItemIndex+1) + ' of </span>').getDomElements();
		embedSwfObject(videoItem);
		firePixelTagForVideo(videoItem.pixelTag);		
		var selectedItems = sandbox.dom(getPanelElement()).find('li[class~="jcarousel-item-selected"]');
		sandbox.dom(selectedItems).removeClass('jcarousel-item-selected');
		sandbox.dom(item).addClass('jcarousel-item-selected');
		sandbox.dom('span.current').remove();
		sandbox.dom('span.count').before(current);
	}
	
	function getVideoElementIndex(carousel, i){
		return carousel.index(i, getVideoItemsLength()) - 1;
	}
	
	function embedSwfObject(videoItem)
	{
		var disclaimer = videoItem.disclaimer;
		var type = videoItem.type;
		var url = videoItem.url;
		
		if(disclaimer) sandbox.dom("[class~='videoDisclaimerText']").html(disclaimer);
		
		if(type === "P"){
            playLiquidousVideo();
			return;
		}
		if(type === "D"){
			playDmiVideo();
			return;
		}
		if(type === "T" || type =="W"){
			
			videoItem.clientElementId = "videoContainer";
			playWheelsTVVideo(videoItem);
			return;
		}
		var videoso = new SWFObject(url, 'swfId', "500", "375" , "8", "#FFFFFF");
		videoso.addVariable("autoStart", "true"); 
		videoso.write("videoContainer");
	}
	
	function playLiquidousVideo() {
        getCobaltLiquidusVideoPlayer().play(true);
	}
	
	function playDmiVideo(){
		getCobaltDMIVideoPlayer().play(true);
	}
	function playWheelsTVVideo(videoData){
		getCobaltProfessionalVideoPlayer(videoData).play(true);
	}

	function getVehicleDataManager() 
	{
		if (!Cobalt.Website.Results.VehicleDataManager) {
			return new Error("no vehicleDataManager instance");
		}
		return Cobalt.Website.Results.VehicleDataManager;
	}

	function firePixelTagForVideo(videoPixelTag) 
	{
		var eventName = 'com.cobaltgroup.ws.view.media.video';
		var vin = getPixelData().vin;
		var pageLabel = 'VideoPopup';
		var pageLayout = getPixelData().pageLayout;
		var pageName = getPixelData().pageName;
		
		sandbox.firePixelTag({
			eventName: eventName,
			vin: vin,
			pageLabel: (videoPixelTag)? videoPixelTag:pageLabel,
			pageLayout: pageLayout,
			pageName: pageName,
			requestUri: null
		});
	}

	function destroyCarousel(e){
		if(getActiveCarousel()){
            getActiveCarousel().startAuto(0);
			//Remove video object in IE to stop Audio
			var objectTag = sandbox.dom('#videoContainer').getDomElements();
			if(_cobaltDmiPlayer){
				_cobaltDmiPlayer.destroy("videoContainer");
			}
			sandbox.dom(objectTag).remove();
			sandbox.dom(getPanelElement()).empty();
		}
	}	

    return {
        init:function()
        {
			sandbox.listen(null, Cobalt.Website.Common.Events.VideoTabClicked, renderVideoData, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.DestroyPopup, destroyCarousel, null);
        },

        destroy:function()
        {
            //TODO: handle destroy
        }
    };
};


