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         :'',
        addToPlayListEventCount:0,
        allowPlay              :false,
        currentPidPlaying      :false,
        clickedToPlay          :false,
        itemInData             :false,
        prevOverlayOpened      :null,
        
        init:function() {
            CBSi.app.VideoPlayer.initTempPlayList();
            CBSi.app.VideoPlayer.setNextPid();
        },
        
        fetchContent:function(requestUrl, obj) {
            var el       = Dom.get(obj);
            var callback = {
                    success: function(o) {
                        CBSi.app.VideoPlayer.parseAsynchContent(el, o.responseText);
                    },
                    failure: function(o) {
                        el.innerHTML = '<div id="vpLoading">An error occurred. Please try again.</div>';
                    }
                },
                conn     = YAHOO.util.Connect.asyncRequest("GET", requestUrl, callback, null);
            el.innerHTML = '<div id="vpLoading">Loading, please wait...</div>';
        },
        
        // Evaluate script tags from ajax response
        parseAsynchContent:function(el, html) {
            var temp = html;
            while(true) {
                //TODO: Extend function to handle "type" attribute
                var sIndex = temp.indexOf("<script"+">"),
                    eIndex = temp.indexOf("</"+"script>", sIndex),
                    js     = temp.substring(sIndex + 8, eIndex);
                
                if (sIndex < 0) {
                    break;
                }
                eval(js);
                temp = temp.substring(eIndex + 9);
            }
            el.innerHTML = html;
        },

        // 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.fetchContent(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);
                }
            }
        },
        
        setCurrentVideoData:function() {
            var videoTitle       = Dom.get("vpVideoTitle"),
                videoDescription = Dom.get("vpVideoDescription"),
                i;
            
            for (i in CBSi.app.VideoPlayer.Data) {
                if (CBSi.app.VideoPlayer.pid == CBSi.app.VideoPlayer.Data[i].pid) {
                    videoTitle.innerHTML       = (CBSi.app.VideoPlayer.Data[i].title == undefined) ? videoTitle.innerHTML : CBSi.app.VideoPlayer.Data[i].title;
                    videoDescription.innerHTML = (CBSi.app.VideoPlayer.Data[i].description == undefined) ? videoDescription.innerHTML : CBSi.app.VideoPlayer.Data[i].description;
                    document.title             = (CBSi.app.VideoPlayer.Data[i].title == undefined) ? 'CBSSports.com Video' : CBSi.app.VideoPlayer.Data[i].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(3);
            
            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);
            if (CBSi.app.VideoPlayer.oHighlited != el) {
                Dom.addClass(el, elClass);
                CBSi.app.VideoPlayer.oHighlited = el;
            }
            else {
                Dom.removeClass(el, elClass);
                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 = [],
                descWords = description.split(/\s+/),
                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("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) {
            var vpPlayList          = Dom.get("vpPlayList"),                
                itemList            = vpPlayList.getElementsByTagName("ol")[0],
                li                  = Dom.get("vpPLItem-"+pid);
            
            //console.log("play allowPlay: ",CBSi.app.VideoPlayer.allowPlay);
            //console.log("play CBSi.app.VideoPlayer.nextPid: ",CBSi.app.VideoPlayer.nextPid);
            
            // 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) {
                if (e.type == "click") {
                    CBSi.app.VideoPlayer.clickedToPlay = true;
                    for (var i in CBSi.app.VideoPlayer.playlist) {
                        if (pid == CBSi.app.VideoPlayer.playlist[i].pid) {
                            CBSi.app.VideoPlayer.playlist.splice(i,1);
                        }
                    }
                    if (CBSi.app.VideoPlayer.playlist.length > 0) CBSi.app.VideoPlayer.nextPid = CBSi.app.VideoPlayer.playlist[0].pid;
                }
            } else {
                // No user action, continue through the playlist
                CBSi.app.VideoPlayer.setNextPid();
            }
            //CBSi.app.VideoPlayer.setNextPid();
            // Reset State of playlist item
            //console.log("before resetState pid: ", pid);
            CBSi.app.VideoPlayer.resetState(pid, e);
            
            // Remove DOM element from custom playlist
            if (li) { itemList.removeChild(li); }
            
            cbsiPlayer.playVideo(pid);
            
            CBSi.app.VideoPlayer.allowPlay = false;
            
        },
        
        resetState:function(pid, e) {
            //console.log("resetState");
            //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");
            
            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("349. itemRoot: ", itemRoot);
            //console.log("350. prevItemRoot: ", prevItemRoot);
            
            //console.log("343. currentPidPlaying: ", CBSi.app.VideoPlayer.currentPidPlaying);
            if (itemRoot == prevItemRoot) {
                //console.log("345. clickedToPlay: ",CBSi.app.VideoPlayer.clickedToPlay);
                if (CBSi.app.VideoPlayer.clickedToPlay) {
                    //console.log("347. clickedToPlay: ", CBSi.app.VideoPlayer.clickedToPlay);
                    if (itemRoot != null) {
                        Dom.addClass(itemRoot, "vpNowPlaying");
                        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("361. pid: ", CBSi.app.VideoPlayer.pid);
            //console.log("362. nextPid: ", CBSi.app.VideoPlayer.nextPid);
            //console.log("362. prevPid: ", CBSi.app.VideoPlayer.prevPid);
            //console.log("363. 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) {
                var playlist;
                
                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/$skin/$channel/'+CBSi.app.VideoPlayer.Data[i].pid+'" 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;
            }
            
        },
        
        getPid:function(el) {
            var href      = el.href,
                hrefArray = href.split("/"),
                //m         = /.*\/\/([\d\w_]+)/,
                //result    = href.match(m),
                pid       = hrefArray[hrefArray.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;
            
            if (e == undefined) {
                whichOv = CBSi.app.VideoPlayer.prevOverlayOpened;
                el = CBSi.app.VideoPlayer.oHighlited;
            } else {
                var objTarget = Event.getTarget(e),
                    whichOv = objTarget.id,
                    el = objTarget.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);                
            }
            
            CBSi.app.VideoPlayer.oHighlite(el, "selected");
            cbsiPlayer.api.activateOverlay(whichOv);
            
            if (CBSi.app.VideoPlayer.prevOverlayOpened != whichOv) {
                CBSi.app.VideoPlayer.prevOverlayOpened = whichOv;
            } else {
                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);
        
})();
