CBSi.namespace("app.VideoPlayer");

(function() {
    var Dom     = YAHOO.util.Dom,
        Event   = YAHOO.util.Event,
        Connect = YAHOO.util.Connect;

    CBSi.app.VideoPlayer = {
        playlist               :[],
        tempPlayList           :[],
        leftoverPlayList       :[],
        highlited              :null,
        pid                    :null,
        prevPid                :null,
        topPid                 :null,
        prevPlayParent         :null,
        nextPid                :null,
        currentVideoData       :null,
        userPlayListStart      :false,
        skin                   :'',
        currentChannel         :'videos',
        addToPlayListEventCount:0,
        allowPlay              :false,
        currentPidPlaying      :null,
        clickedToPlay          :false,
        itemInData             :false,
        prevOverlayOpened      :null,
        errorTimeout           :null,
        errorCode              :null,
        
        _cache:{},
        
        init:function() {
            if (CBSi.app.VideoPlayer.alwaysAllowPlay) {
                CBSi.app.VideoPlayer.allowPlay = true;
            } else {
                CBSi.app.VideoPlayer.allowPlay = false;
            }

            CBSi.app.VideoPlayer.initTempPlayList();
            CBSi.app.VideoPlayer.setNextPid();
            
            CBSi.app.VideoPlayer._cache.Data = {};
            CBSi.app.VideoPlayer._cache.Data[CBSi.app.VideoPlayer.currentChannel] = CBSi.app.VideoPlayer.Data;
        },
        
        /**
         * Gets html data based on the url provided
         * @private
         * @param {String} requestUrl Request URL used to retrieve data.
         * @param {String} obj Object reference to the DOM element where returned html data should be insterted
         */
        _fetch: function(requestUrl, obj) {
            //this.log({functionName:"fetch"});
            
            $('#' + obj).fadeOut('fast', function() {
                $('#' + obj).html('<div id="vpLoading">Loading, please wait...</div>').fadeIn('fast', function() {
                    $.ajax({
                        url: requestUrl,
                        dataType: 'html',
                        success: function(data) {
                            $('#' + obj).fadeOut('fast', function() {
                                $('#' + obj).html(data).fadeIn('fast');
                            });
                        },
                        error: function(data) {
                            $('#' + obj).html('<div id="vpLoading">An error occurred. Please try again.</div>');
                        }
                    });
                });
            });
        },

        // Manage clicks that retrieve data through an asynchronous call.        
        dataFetchClickHandler:function(e, obj) {
            var objTarget = Event.getTarget(e);
            
            while (objTarget.id != this.id) {
                if (objTarget.nodeName.toLowerCase() == "a") {
                    //TODO: use more generic name like "vpAllowDefault" instead of "vpCustomize"
                    if (!Dom.hasClass(objTarget, "vpCustomize")) {
                        Event.preventDefault(e);
                        CBSi.app.VideoPlayer._fetch(objTarget.href, obj);
                    }
                break;
                } else {
                    objTarget = objTarget.parentNode;
                }
            }
        },

        getChannelData:function(e, obj) {
            //console.log("getChannelData: ", e);
            var el = Event.getTarget(e),
                channelList      = Dom.get("channelList"),
                channelListItems = channelList.getElementsByTagName("a");
            
            if (el.nodeName.toLowerCase() == "a" && e.originalTarget != channelList) {

                Event.preventDefault(e);
                CBSi.app.VideoPlayer.toggle(el);
                
                // do only if it is an anchor that requests data
                if (!Dom.hasClass(el, "vpChannelToggle")) {
                    // check if it has the "selected" class to avoid an extra request when the list is collapsed
                    if (!Dom.hasClass(el, "selected")) {
                        CBSi.app.VideoPlayer.dataFetchClickHandler(e, obj);
                    }
                    
                    // This timeout BS is added to delay the removal/addition of css classes
                    // to avoid a child element from appearing overlayed outside of its parent
                    // node relative location of the channel list. Bug #15903
                    setTimeout(function(){
                        for (var i = 0, l = channelListItems.length; i < l; i++) {
                            // clear class only on elements that have it
                            if (Dom.hasClass(channelListItems[i], "selected")) {
                                Dom.removeClass(channelListItems[i], "selected");    
                                break;   
                            }
                        }
                        // hilite current element
                        CBSi.app.VideoPlayer.highlite(el, "selected");
                    }, 1);
                }
            }
        },
        
        getCurrentChannel:function() {
            
            return CBSi.app.VideoPlayer.currentChannel;
        },
        
        setCurrentVideoData:function() {
            var videoTitle       = ($('#vpVideoTitle').length) ? $('#vpVideoTitle') : $('h1.pageTitle'),
                videoDescription = $('#vpVideoDescription'),
                channel, i;
                
            for (channel in CBSi.app.VideoPlayer._cache.Data) {
                for (i in CBSi.app.VideoPlayer._cache.Data[channel]) {
                    if (CBSi.app.VideoPlayer.pid == CBSi.app.VideoPlayer._cache.Data[channel][i].pid) {
                        CBSi.app.VideoPlayer.currentVideoData = CBSi.app.VideoPlayer._cache.Data[channel][i];
                        
                        videoTitle.html((CBSi.app.VideoPlayer.currentVideoData.title == undefined) ? videoTitle.innerHTML : CBSi.app.VideoPlayer.currentVideoData.title);
                        videoDescription.html((CBSi.app.VideoPlayer.currentVideoData.description == undefined) ? videoDescription.innerHTML : CBSi.app.VideoPlayer.currentVideoData.description);
                        document.title = (CBSi.app.VideoPlayer.currentVideoData.title == undefined) ? 'CBSSports.com Video' : CBSi.app.VideoPlayer.currentVideoData.title+' - CBSSports.com Video';
                        CBSi.app.VideoPlayer.currentVideoDataOnPage = true;
                        break;
                    }
                }
                
            }
            
            // if data is not on the page, make an api call
            if (!CBSi.app.VideoPlayer.currentVideoDataOnPage) {
                var videoData = cbsiPlayer.api.getContentData();
            
                videoTitle.innerHTML       = (videoData.showTitle == undefined) ? videoTitle.innerHTML : videoData.showTitle;
                videoDescription.innerHTML = (videoData.showDescription == undefined) ? videoDescription.innerHTML : videoData.showDescription;
                document.title             = (videoData.showTitle == undefined) ? 'CBSSports.com Video' : videoData.showTitle+' - CBSSports.com Video';
                
                CBSi.app.VideoPlayer.currentVideoDataOnPage = false;
            }

        },
        
        getTeamChannels:function(e, obj) {
            var activeIndex = CBSi.app.VideoPlayer.tabView.get("activeIndex"),
                activeTab   = CBSi.app.VideoPlayer.tabView.getTab(activeIndex),
                currentTab  = CBSi.app.VideoPlayer.tabView.getTab(2);
            
            if (!currentTab) {
                return;
            }
            
            activeTab.set("active", false);
            currentTab.set("active", true);
            CBSi.app.VideoPlayer.dataFetchClickHandler(e, obj);
        },
        
        getPartnerChannel:function(e, obj) {
            var activeIndex = CBSi.app.VideoPlayer.tabView.get("activeIndex"),
                activeTab   = CBSi.app.VideoPlayer.tabView.getTab(activeIndex),
                currentTab  = CBSi.app.VideoPlayer.tabView.getTab(0);

            if (!currentTab) {
                return;
            }
    
            activeTab.set("active", false);
            currentTab.set("active", true);
            CBSi.app.VideoPlayer.dataFetchClickHandler(e, obj);
        },
        
        highlite:function(el, elClass) {
            Dom.removeClass(CBSi.app.VideoPlayer.highlited, elClass);
            Dom.addClass(el, elClass);
            CBSi.app.VideoPlayer.highlited = el;
        },
        
        oHighlite:function(el, elClass) {
            Dom.removeClass(CBSi.app.VideoPlayer.oHighlited, elClass);
            Dom.removeClass(Dom.getNextSibling(CBSi.app.VideoPlayer.oHighlited), "afterActive");
            if (CBSi.app.VideoPlayer.oHighlited != el) {
                Dom.addClass(el, elClass);
                Dom.addClass(Dom.getNextSibling(el), "afterActive");
                CBSi.app.VideoPlayer.oHighlited = el;
            }
            else {
                Dom.removeClass(el, elClass);
                Dom.removeClass(Dom.getNextSibling(el), "afterActive");
                CBSi.app.VideoPlayer.oHighlited = null;
            }
        },
        
        toggle:function(el) {
            var childEl  = el.parentNode.getElementsByTagName("ul")[0],
                toggleEl = Dom.getElementsByClassName("vpChannelToggle", "a", el.parentNode)[0];
            
            // set only the class of the decoration a tag (toggleEl) rather than element being clicked on
            if (Dom.getStyle(childEl, "display") != "block") {
                Dom.setStyle(childEl, "display", "block");
                Dom.replaceClass(toggleEl, "vpChannelClosed", "vpChannelOpened");
            } else {
                Dom.setStyle(childEl, "display", "none");
                Dom.replaceClass(toggleEl, "vpChannelOpened", "vpChannelClosed");
            }
        },
        
        limitWords:function (description, limit) {
            var tempWords = [];
            if (!description) { return; }
            var descWords = description.split(/\s+/);
            var phrase;
            
            for (i = 0, l = descWords.length; i < l; i++) {
                if (i < limit) {
                    tempWords.push(descWords[i]);
                } else {
                    break;
                }
            }
            phrase = tempWords.join(' ') + '...';
            
            return phrase;
        },
        
        // Handles all clicks that manage or play video
        playClickHandler:function(e) {
            
            var objTarget = Event.getTarget(e),
                pid;
                
            while (objTarget.id != this.id) {
                
                if (objTarget.nodeName.toLowerCase() == "a") {
                    if (Dom.hasClass(objTarget, "vpAddToPlayList")) {
                        pid = CBSi.app.VideoPlayer.getPid(objTarget);
                        Event.preventDefault(e);
                        CBSi.app.VideoPlayer.addToPlayList(pid, e);
                    
                    } else if (Dom.hasClass(objTarget, "vpRemoveFromPlayList")) {
                        pid = CBSi.app.VideoPlayer.getPid(objTarget);
                        Event.preventDefault(e);
                        CBSi.app.VideoPlayer.removeFromPlayList(pid);
                    
                    } else if (Dom.hasClass(objTarget, "vpPlayVideo")) {
                        pid = CBSi.app.VideoPlayer.getPid(objTarget);
                        Event.preventDefault(e);
                        CBSi.app.VideoPlayer.play(pid, e);
                    
                    } else if (Dom.hasClass(objTarget, "showHideOverlay")) {
                        Event.preventDefault(e);
                        CBSi.app.VideoPlayer.showHideOverlay(e);
                    }
                    
                    break;
                } else {
                    objTarget = objTarget.parentNode;
                }
            }
        },
        
        // initialize temporary playlist with current channel data
        // called only on initial page request
        initTempPlayList:function() {
            //console.log("initTempPlayList: CBSi.app.VideoPlayer.pid:", CBSi.app.VideoPlayer.pid);
            
            // if nothing saved on playlist
            if (!CBSi.app.VideoPlayer.pid) {
                CBSi.app.VideoPlayer.pid = CBSi.app.VideoPlayer.Data[0].pid;
            }
            
            if (CBSi.app.VideoPlayer.playlist.length == 0) {
                
                // create new temporary playlist
                CBSi.app.VideoPlayer.tempPlayList = CBSi.app.VideoPlayer.Data.slice();
                
                //remove pid from page request to avoid playing clip twice
                CBSi.app.VideoPlayer.removeFromTempPlayList(CBSi.app.VideoPlayer.pid);
            }
            
            //console.log("playlist: ", CBSi.app.VideoPlayer.playlist);
            //console.log("3. tempPlayList: ", CBSi.app.VideoPlayer.tempPlayList);
        },
        
        removeFromTempPlayList:function(pid) {
            var currentPidItem, tempPlayList;
            
            for (var i in CBSi.app.VideoPlayer.tempPlayList) {
                if (pid == CBSi.app.VideoPlayer.tempPlayList[i].pid) {
                    currentPidItem = CBSi.app.VideoPlayer.tempPlayList.splice(i,1);
                    tempPlayList = currentPidItem.concat(CBSi.app.VideoPlayer.tempPlayList);
                    CBSi.app.VideoPlayer.itemInData = true;
                }
            }
            
            CBSi.app.VideoPlayer.tempPlayList = (tempPlayList == undefined) ? CBSi.app.VideoPlayer.tempPlayList : tempPlayList;
            CBSi.app.VideoPlayer.playlist = CBSi.app.VideoPlayer.tempPlayList;
        },
        
        play:function(pid, e) {
            //console.log("play pid: ", pid);
            
            var li = Dom.get("vpPLItem-"+pid),
                vpPlayList, itemList;
            
            if (Dom.get("vpPlayList")) {
                vpPlayList = Dom.get("vpPlayList");
                itemList = vpPlayList.getElementsByTagName("ol")[0];
            }
            
            //console.log("play allowPlay: ", CBSi.app.VideoPlayer.allowPlay);
            //console.log("play CBSi.app.VideoPlayer.nextPid: ", CBSi.app.VideoPlayer.nextPid);
            //console.log("CBSi.app.VideoPlayer.currentPidPlaying: ", CBSi.app.VideoPlayer.currentPidPlaying);

            if (CBSi.app.VideoPlayer.alwaysAllowPlay) { CBSi.app.VideoPlayer.allowPlay = true; }
            
            // do not allow play if video is already playing
            if (pid == CBSi.app.VideoPlayer.currentPidPlaying) { return; } // || CBSi.app.VideoPlayer.currentPidPlaying
            
            // do no atempt to play a video if ad info has not loaded
            // if no preroll, this will reset onContentStart
            if (!CBSi.app.VideoPlayer.allowPlay) { return; }
            
            // set selected pid as current global pid
            CBSi.app.VideoPlayer.pid = pid;
            
            //remove item from playlist if user clicked to play
            if (e && e.type == "click") {
                CBSi.app.VideoPlayer.clickedToPlay = true;
                
                if (CBSi.app.VideoPlayer.errorCode) {
                    clearTimeout(CBSi.app.VideoPlayer.errorTimeout);
                    cbsiPlayer.api.activateOverlay('error' + CBSi.app.VideoPlayer.errorCode, 'off');
                }
                
                if (CBSi.app.VideoPlayer.currentChannel != CBSi.app.VideoPlayer.channel) {
                    CBSi.app.VideoPlayer.currentChannel = CBSi.app.VideoPlayer.channel;
                    if (CBSi.app.VideoPlayer._cache.Data[CBSi.app.VideoPlayer.currentChannel]) {
                        CBSi.app.VideoPlayer.playlist = CBSi.app.VideoPlayer._cache.Data[CBSi.app.VideoPlayer.currentChannel].slice();
                    }
                }
            }
            
            CBSi.app.VideoPlayer.setNextPid();
            
            // Reset State of playlist item
            CBSi.app.VideoPlayer.resetState(pid, e);
            
            // Remove DOM element from custom playlist
            if (li && itemList) { itemList.removeChild(li); }
            
            cbsiPlayer.playVideo(pid);

            if (CBSi.app.VideoPlayer.alwaysAllowPlay) { CBSi.app.VideoPlayer.allowPlay = true; }
            else { CBSi.app.VideoPlayer.allowPlay = false; }
        },
        
        resetState:function(pid, e) {
            //console.log("resetState");
            //console.log("pid: ", pid);
            //console.log("resetState prevPid: ", CBSi.app.VideoPlayer.prevPid);

            var itemRoot            = Dom.get(pid),
                prevItemRoot        = Dom.get(CBSi.app.VideoPlayer.prevPid),
                vpNowPlaying        = Dom.getElementsByClassName("vpNowPlaying", "span", itemRoot),
                vpAddToPlayList     = Dom.getElementsByClassName("vpAddToPlayList", "a", itemRoot),
                vpInPlayList        = Dom.getElementsByClassName("vpInPlayList", "span", itemRoot),
                vpPlayVideo         = Dom.getElementsByClassName("vpPlayVideo",     "a", itemRoot),
                vpPrevNowPlaying    = Dom.getElementsByClassName("vpNowPlaying", "span", prevItemRoot),
                vpPrevAddToPlayList = Dom.getElementsByClassName("vpAddToPlayList", "a", prevItemRoot),
                vpPrevInPlayList    = Dom.getElementsByClassName("vpInPlayList", "span", prevItemRoot),
                vpPrevPlayVideo     = Dom.getElementsByClassName("vpPlayVideo",     "a", prevItemRoot);
            
            Dom.removeClass(CBSi.app.VideoPlayer.prevPlayParent, "vpNowPlaying");
            
            //console.log("itemRoot: ", itemRoot );
            //console.log("prevItemRoot: ", prevItemRoot);
            
            if (itemRoot != null) {
                Dom.addClass(itemRoot, "vpNowPlaying");
                // select current video to play (or playing)
                Dom.setStyle(vpInPlayList, "display", "none");
                Dom.setStyle(vpAddToPlayList, "display", "none");
                Dom.setStyle(vpNowPlaying, "display", "block");
                // hide element with class playVideo only if it a button (inside class vpButton), not a thumbnail.
                if (Dom.hasClass(vpPlayVideo[0].parentNode, "vpButton")) Dom.setStyle(vpPlayVideo, "display", "none");                
            }
            
            if (prevItemRoot != null || (prevItemRoot != null && pid == CBSi.app.VideoPlayer.prevPid)) {
                // reset previously selected video
                Dom.removeClass(prevItemRoot, "vpNowPlaying");
                Dom.setStyle(vpPrevNowPlaying, "display", "none");
                Dom.setStyle(vpPrevAddToPlayList, "display", "block");
                Dom.setStyle(vpPrevInPlayList, "display", "none");
                // hide element with class playVideo only if it a button (inside class vpButton), not a thumbnail.
                if (Dom.hasClass(vpPrevPlayVideo[0].parentNode, "vpButton")) Dom.setStyle(vpPrevPlayVideo, "display", "block");
            }
            
            //console.log("currentPidPlaying: ", CBSi.app.VideoPlayer.currentPidPlaying);
            if (pid == CBSi.app.VideoPlayer.prevPid && itemRoot == prevItemRoot) {
                //console.log("clickedToPlay: ",CBSi.app.VideoPlayer.clickedToPlay);
                if (CBSi.app.VideoPlayer.clickedToPlay) {
                    if (itemRoot != null) {
                        Dom.addClass(itemRoot, "vpNowPlaying");
                        Dom.setStyle(vpPlayVideo, "display", "none");
                        Dom.setStyle(vpNowPlaying, "display", "block");
                        Dom.setStyle(vpPrevAddToPlayList, "display", "none");
                        Dom.setStyle(vpPrevInPlayList, "display", "none");
                    }
                } else {
                    if (prevItemRoot != null) {
                        Dom.removeClass(prevItemRoot, "vpNowPlaying");
                        Dom.setStyle(vpNowPlaying, "display", "none");
                        Dom.setStyle(vpPrevAddToPlayList, "display", "block");
                        Dom.setStyle(vpPrevInPlayList, "display", "none");
                    }
                }
                
                //resets
                CBSi.app.VideoPlayer.allowPlay = true;
                CBSi.app.VideoPlayer.clickedToPlay = false;
                CBSi.app.VideoPlayer.nextPid = null;
            }
            
            //reset previous element
            CBSi.app.VideoPlayer.prevPlayParent = itemRoot;
            CBSi.app.VideoPlayer.prevPid = pid;
            
            //console.log("pid: ", CBSi.app.VideoPlayer.pid);
            //console.log("nextPid: ", CBSi.app.VideoPlayer.nextPid);
            //console.log("prevPid: ", CBSi.app.VideoPlayer.prevPid);
            //console.log("allowPlay: ", CBSi.app.VideoPlayer.allowPlay);
            
            //console.log(itemRoot, prevItemRoot, CBSi.app.VideoPlayer.prevPlayParent);
            
        },
        
        playNext:function(e) {
            var playlist;
            
            if (CBSi.app.VideoPlayer.nextPid == null) {
                CBSi.app.VideoPlayer.resetState(CBSi.app.VideoPlayer.pid, e);
            } else {
                CBSi.app.VideoPlayer.play(CBSi.app.VideoPlayer.nextPid, e);
            }
            
            // if playlist has only 1 video left to play
            // add the left over clips saved before user interaction
            
            if (CBSi.app.VideoPlayer.playlist.length == 1) {

                if (CBSi.app.VideoPlayer.userPlayListStart == false) {
                    // infinite loop
                    playlist = CBSi.app.VideoPlayer.playlist;
                    CBSi.app.VideoPlayer.playlist = playlist.concat(CBSi.app.VideoPlayer.Data.slice());
                } else {
                    // resets to populate playlist based on user action
                    CBSi.app.VideoPlayer.userPlayListStart = false;
                    
                    playlist = CBSi.app.VideoPlayer.playlist.slice();
                    CBSi.app.VideoPlayer.playlist = playlist.concat(CBSi.app.VideoPlayer.leftoverPlayList);
                    //removing the last clip form the new playlist
                    
                    if (CBSi.app.VideoPlayer.addToPlayListEventCount == 1) {
                        CBSi.app.VideoPlayer.playlist.splice(0,1);
                    }
                    
                    CBSi.app.VideoPlayer.addToPlayListEventCount = 0;
                }
                
                //console.log("4. -- PL: ", CBSi.app.VideoPlayer.playlist);
                CBSi.app.VideoPlayer.nextPid = CBSi.app.VideoPlayer.playlist[0].pid;
                
            }
            
            //console.log("playlist length: ", CBSi.app.VideoPlayer.playlist.length);
            //console.log("6. tempPlayList", CBSi.app.VideoPlayer.tempPlayList);
            
            //console.log("7. playlist: ", CBSi.app.VideoPlayer.playlist);
            
            //console.log("8. nextPid : ", CBSi.app.VideoPlayer.nextPid);
        },
        
        setNextPid:function(pid) {
            
            CBSi.app.VideoPlayer.isItemInData(pid);
            
            if (!pid || pid == undefined || pid == null) {
                
                if (CBSi.app.VideoPlayer.playlist.length > 1) {
                    CBSi.app.VideoPlayer.playlist.splice(0,1);
                    CBSi.app.VideoPlayer.nextPid = CBSi.app.VideoPlayer.playlist[0].pid;
                }
            } else {
                CBSi.app.VideoPlayer.nextPid = pid;
            }
        },
        
        addToPlayList:function(pid, e){
            var playlistContainer = Dom.get("vpPlayList"),
                playlistEl        = playlistContainer.getElementsByTagName("ol")[0],
                li                = document.createElement("li"),
                itemRoot          = Dom.get(pid),
                vpNowPlaying      = Dom.getElementsByClassName("vpNowPlaying", "span", itemRoot),
                vpAddToPlayList   = Dom.getElementsByClassName("vpAddToPlayList", "a", itemRoot),
                vpInPlayList      = Dom.getElementsByClassName("vpInPlayList", "span", itemRoot),
                descPreview, tempItem, thumbnail, micro_thumb, small_thumb;
            
            //console.log(e);
            if (e) {
                if (e.type == "click") {
                    for (var i in CBSi.app.VideoPlayer.tempPlayList) {
                        if (pid == CBSi.app.VideoPlayer.tempPlayList[i].pid) {
                            //console.log("pid: ", pid);
                            //console.log("CBSi.app.VideoPlayer.tempPlayList["+i+"].pid", CBSi.app.VideoPlayer.tempPlayList[i].pid);
                            CBSi.app.VideoPlayer.tempPlayList.splice(i,1);
                        }
                    }
                }
            }
            //console.log("$$$$$$$$$ tempPlayList: ", CBSi.app.VideoPlayer.tempPlayList);
            
            //
            if (CBSi.app.VideoPlayer.tempPlayList.length > 0) {
                CBSi.app.VideoPlayer.leftoverPlayList = CBSi.app.VideoPlayer.tempPlayList.slice();
                CBSi.app.VideoPlayer.userPlayListStart = true;
                //CBSi.app.VideoPlayer.tempPlayList = [];
                
                //console.log("####### event count: ", CBSi.app.VideoPlayer.addToPlayListEventCount);
                if (CBSi.app.VideoPlayer.addToPlayListEventCount == 0 ) {
                    CBSi.app.VideoPlayer.playlist = [];
                }
                //console.log("####### length: ", CBSi.app.VideoPlayer.playlist.length);
            }
            
            //console.log("-- leftoverPlayList: ", CBSi.app.VideoPlayer.leftoverPlayList);
            
            if (e) {
                if (e.type == "click") {
                    //console.log("event type: ", e.type);
                    for (var i in CBSi.app.VideoPlayer.playlist) {
                        if (pid == CBSi.app.VideoPlayer.playlist[i].pid) {
                            CBSi.app.VideoPlayer.playlist.splice(i,1);
                        }
                    }
                    CBSi.app.VideoPlayer.addToPlayListEventCount ++;
                }
            } else {
                CBSi.app.VideoPlayer.setNextPid();
            }
            
            for (var i in CBSi.app.VideoPlayer.Data) {
                if (pid == CBSi.app.VideoPlayer.Data[i].pid) {
                    CBSi.app.VideoPlayer.playlist.push(CBSi.app.VideoPlayer.Data[i]);
                    
                    descPreview = CBSi.app.VideoPlayer.limitWords(CBSi.app.VideoPlayer.Data[i].description, 6);
                    micro_thumb = CBSi.app.VideoPlayer.Data[i].micro_thumbnail;
                    small_thumb = CBSi.app.VideoPlayer.Data[i].small_thumbnail;
                    
                    thumbnail = (micro_thumb == null) ? small_thumb : micro_thumb;

                    // render html in playlist
                    tempItem  = '<a href="/video/player/'+CBSi.app.VideoPlayer.skin+'/'+CBSi.app.VideoPlayer.currentChannel+'/'+CBSi.app.VideoPlayer.Data[i].pid+'" class="vpPlayVideo">';
                    tempItem += '<img src="'+thumbnail+'" alt="'+CBSi.app.VideoPlayer.Data[i].title+'">';
                    tempItem += '<span class="vpPlayImage"></span></a>';
                    tempItem += '<span class="vpPLDescPreview">'+descPreview+' <strong>('+CBSi.app.VideoPlayer.Data[i].duration+')</strong></span>';
                    tempItem += '<a href="/video/player/' + CBSi.app.VideoPlayer.skin +'/'+ CBSi.app.VideoPlayer.currentChannel +'/'+ CBSi.app.VideoPlayer.Data[i].pid +'/'+ CBSi.app.VideoPlayer.Data[i].seoname + '" class="vpRemoveFromPlayList">remove</a>';
                    
                    li.innerHTML = tempItem;
                    li.setAttribute("id", "vpPLItem-"+pid);
                    playlistEl.appendChild(li);
                    
                    Dom.setStyle(vpInPlayList, "display", "block");
                    Dom.setStyle(vpAddToPlayList, "display", "none");
                    Dom.setStyle(vpNowPlaying, "display", "none");
                    
                    break;
                }
            }
            
            CBSi.app.VideoPlayer.nextPid = CBSi.app.VideoPlayer.playlist[0].pid;
            
            //console.log("playlist.length: ", CBSi.app.VideoPlayer.playlist.length);
            
            //console.log("leftover playlist:   ", CBSi.app.VideoPlayer.leftoverPlayList);
            //console.log("playlist - added:   ", CBSi.app.VideoPlayer.playlist, "next pid: ", CBSi.app.VideoPlayer.nextPid);
            
        },
        
        removeFromPlayList:function(pid) {
            var parentEl          = Dom.get("vpPlayList"),
                itemList          = parentEl.getElementsByTagName("ol")[0],
                itemRoot          = Dom.get(pid),
                vpNowPlaying      = Dom.getElementsByClassName("vpNowPlaying", "span", itemRoot),
                vpAddToPlayList   = Dom.getElementsByClassName("vpAddToPlayList", "a", itemRoot),
                vpInPlayList      = Dom.getElementsByClassName("vpInPlayList", "span", itemRoot),
                li;
            
            for (var i in CBSi.app.VideoPlayer.playlist) {
                if (pid == CBSi.app.VideoPlayer.playlist[i].pid) {

                    CBSi.app.VideoPlayer.playlist.splice(i,1);
                    
                    li = Dom.get("vpPLItem-"+pid);
                    itemList.removeChild(li);
                    
                    if (itemRoot != null) {
                        Dom.setStyle(vpInPlayList, "display", "none");
                        Dom.setStyle(vpAddToPlayList, "display", "block");
                        Dom.setStyle(vpNowPlaying, "display", "none");
                    }
                    
                    break;
                }
            }
            
            if (CBSi.app.VideoPlayer.playlist.length == 0) {
                CBSi.app.VideoPlayer.nextPid = CBSi.app.VideoPlayer.leftoverPlayList[0].pid;
            } else {
                CBSi.app.VideoPlayer.nextPid = CBSi.app.VideoPlayer.playlist[0].pid;
            }
            
        },
        
        /**
         * Returns pid for a specific video
         * @public
         * @param {Object} el Dom element that contains either an attribute 'pid' or an href with a pid in it.
         */
        getPid: function(el) {
            //this.log({functionName:"getPid"});
            
            // Use attribute 'data-pid' first if it contains a value.
            var pid = $(el).attr('data-pid');
            if (pid) {return pid;}
            
            // Otherwise continue on to strip the pid out of the href
            var href = $(el).attr('href'),
                arr  = href.split("/"),
                pid  = arr[arr.length - 2];
                
            return pid;
        },
        
        isItemInData:function(pid) {
            for (var i in CBSi.app.VideoPlayer.Data) {
                if (pid == CBSi.app.VideoPlayer.Data[i].pid) {
                    CBSi.app.VideoPlayer.itemInData = true;
                    break;
                } else {
                    CBSi.app.VideoPlayer.itemInData = false;
                }
            }
        },
        
        showHide:function(e) {
            var objTarget = Event.getTarget(e);
            
            while (objTarget.id != this.id) {
                
                if (objTarget.nodeName.toLowerCase() == "a") {
                    Event.preventDefault(e);
                    
                    var parent    = objTarget.parentNode,
                        popup     = Dom.getElementsByClassName("popUpBoxi", "div", parent);
                    
                    if (e.type == "mouseover") {
                        Dom.setStyle(popup, "display", "block");
                    } else if (e.type == "mouseout") {
                        Dom.setStyle(popup, "display", "none");
                    }
                    break;
                
                } else {
                    objTarget = objTarget.parentNode;
                }
                
            }
            
        },
        
        showHideOverlay:function(e) {
            
            var whichOv = null; 
            var el = null;
            var target = null;
            
            if (e == undefined) {
                
                if (!CBSi.app.VideoPlayer.prevOverlayOpened) {
                    return;
                }
                
                whichOv = CBSi.app.VideoPlayer.prevOverlayOpened;
                el = CBSi.app.VideoPlayer.oHighlited;
            } else {
                var objTarget = Event.getTarget(e);
                
                if (objTarget.tagName != "A") {
                    target = objTarget.parentNode;
                } else {
                    target = objTarget;
                }
    
                var whichOv = target.id;
                var el = target.parentNode;
            }
            
            // do this if there's an overlay opened and
            // if overlay to open is not the currently opened one
            if (CBSi.app.VideoPlayer.prevOverlayOpened != null && CBSi.app.VideoPlayer.prevOverlayOpened != whichOv) {
                //hide opened overlay
                cbsiPlayer.api.activateOverlay(CBSi.app.VideoPlayer.prevOverlayOpened, null, 0.5);                
            }
            
            CBSi.app.VideoPlayer.oHighlite(el, "selected");
            
            cbsiPlayer.api.activateOverlay(whichOv, null, 0.5);
            
            if (CBSi.app.VideoPlayer.prevOverlayOpened != whichOv) {
                CBSi.app.VideoPlayer.prevOverlayOpened = whichOv;
            } else {
                CBSi.app.VideoPlayer.prevOverlayOpened = null;
            }
        },
        
        resetOverlayMenu:function() {
            var els = Dom.get("overlayMenu").getElementsByTagName('li');
            
            Dom.removeClass(els, "selected");
            Dom.removeClass(els, "afterActive");
            
            CBSi.app.VideoPlayer.prevOverlayOpened = null;
        },
        
        checkImage:function(img) {
            if (!img.complete) {
                return false;
            }
            
            if (typeof img.naturalWidth != "undefined" && img.naturalWidth == 0) {
                return false;
            }
        
            // No other way of checking: assume it's ok.
            return true;
        },
        
        checkImages:function() {
            var carousel = Dom.get('carousel'),
                imgs     = carousel.getElementsByTagName("img");
            
            for (i = 0, imglen = imgs.length; i < imglen; i++) {
                //console.log("images["+i+"]: ", imgs[i]);
                
                if (!CBSi.app.VideoPlayer.checkImage(imgs[i])) {
                    imgs[i].setAttribute("src", "http://images.cbssports.com/images/spacer.gif");
                    //console.log("broken Img images["+i+"]: ", imgs[i]);
                }
                
            }
            
        }

    };
    
    // Event Tracking
    //Start Up Events
    Event.onDOMReady(CBSi.app.VideoPlayer.init);
    
    // Click Events
    Event.on("vpTabsGroup", "click", CBSi.app.VideoPlayer.dataFetchClickHandler, "vpTabContent");
    // Handles every play event on both content area and playlist
    Event.on(document, "click", CBSi.app.VideoPlayer.playClickHandler);
    // TODO: Use single function for both team and partner video
    Event.on("teamVideos", "click", CBSi.app.VideoPlayer.getTeamChannels, "vpTabContent");
    Event.on("partnerVideos", "click", CBSi.app.VideoPlayer.getPartnerChannel, "vpTabContent");
    
    // Mouse Events
    Event.on("teamVideos", "mouseover", CBSi.app.VideoPlayer.showHide);
    Event.on("teamVideos", "mouseout", CBSi.app.VideoPlayer.showHide);
        
})();

