﻿var nbaMedia={};
var nbaMediaParserHtml=""//'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" style="width:0; height: 0;" id="NbaAsxFlashParser" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"> <param name="movie" value="'+nbaMediaRootUrl+'asxparser.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#869ca7" /><param name="width" value="0" /><param name="height" value="0" /><param name="play" value="true" /><param name="allowScriptAccess" value="sameDomain" /><embed src="'+nbaMediaRootUrl+'asxparser.swf" quality="high" bgcolor="#869ca7" width="0" height="0" name="NbaAsxFlashParser" align="middle" play="true" loop="false" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer"></embed></object>';
document.write('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" style="width:0; height: 0;" id="NbaAsxFlashParser" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"> <param name="movie" value="'+nbaMediaRootUrl+'asxparser.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#869ca7" /><param name="width" value="0" /><param name="height" value="0" /><param name="play" value="true" /><param name="allowScriptAccess" value="sameDomain" /><embed src="'+nbaMediaRootUrl+'asxparser.swf" quality="high" bgcolor="#869ca7" width="0" height="0" name="NbaAsxFlashParser" align="middle" play="true" loop="false" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer"></embed></object>');
var nbaMediaSLHtml="<div><object id='NBAPlayerWindowObject' type='application/x-silverlight'><param name='windowless' value='true'/><div></object>";
$get("slPlayer").innerHTML=nbaMediaParserHtml+nbaMediaSLHtml;
// Initialize player, via Media.js
Sys.Application.initialize(); 
Sys.Application.add_load(
    function() {
        var xaml=nbaMediaRootUrl+"NBAPlayerSkin.xaml";
        var c=nbaMediaConfig;
        if(c.size!=null && typeof(c.size)!="undefined"){
            switch(c.size){
                case 400:
                    xaml=nbaMediaRootUrl+"NBAPlayerSkin.xaml";
                break;
                case 300:
                    xaml=nbaMediaRootUrl+"NBAPlayerSkin300.xaml";
                break;
                case 150:
                    xaml=nbaMediaRootUrl+"NBAPlayerSkin150.xaml";
                break;
                default:
                    xaml=nbaMediaRootUrl+"NBAPlayerSkin.xaml";
                break;
            }
        }
        $create(Sys.Preview.UI.Xaml.Media.Player,
            {
                "mediaUrl":"", // Video url, as given on page.
                "autoPlay":true, // This autoPlay tells video component to start playing when assigning a url to is.
                                //It's not related to autoPlay property in configuration file.
                "xamlSource":xaml // XAML skin url.
            },
            null, 
            null, 
            $get("NBAPlayerWindowObject") // ID of OBJECT tag.
        );
        //alert("watch the error in firefox in few second\nyou may need to refresh few times to see the error")
    }
);
Sys.Application.add_load(function(){
    return;
    var mo=document.getElementById("slPlayer");
    //if(slo!=null && mo!=null) mo.appendChild(slo); // moves SL component to <div id="nbaMedia">
    mo.style.overflow="hidden";
    //slo.style.display="block";
    mo.style.display="block";
});

// --------------------------------

// Useful elements on XAML objects tree
nbaMedia.SLObj=null;
nbaMedia.PlayerObj=null;
nbaMedia.MediaElement=null;
nbaMedia.CurrentMedia=null;
nbaMedia.UIElement=null;
nbaMedia.initTimeout=null;
// --------------------------------

function nbaMediaInit(sender, args){ // Executed when XAML loaded.
    if(document.getElementById("NbaAsxFlashParser")!=null){
        clearTimeout(nbaMedia.initTimeout);
        nbaMedia.initTimeout=null;
        nbaMediaLoaded(sender, args);
    }else{
        nbaMedia.initTimeout=setTimeout(function(){nbaMediaInit(sender, args)},200);
    }
}

function nbaMediaLoaded(sender, args){
    nbaMedia.PlayerObj=sender;
    nbaMedia.MediaElement=sender.findName("VideoWindow");
    nbaMedia.AdMediaElement=sender.findName("AdVideoWindow");
    nbaMedia.PlayerObj.findName("Buffering_Spin").Begin();
    nbaMedia.SLObj=$get('NBAPlayerWindowObject');
    nbaMedia.UIElement=sender.findName('UIWrap');
    nbaMedia.PlaylistWrap=sender.findName('PlaylistWrap');
    nbaMedia.PlaylistItems=sender.findName('PlaylistItems');
    nbaMedia.PlaylistItemsContainer=sender.findName('PlaylistItemsContainer');
    nbaMedia.PlayButton=sender.findName('PlayButtonLarge');
    nbaMedia.Params.PlaceholderImage=sender.findName('PlaceholderImage');
    
    nbaMedia.PlayButton.addEventListener("MouseLeftButtonUp",function(){
        nbaMedia.Actions.ShowHidePlay(false);
        if(nbaMedia.Params.CurrentMediaState=="Paused") nbaMedia.MediaElement.Play()
        else nbaMedia.playing.selectVideo(nbaMedia.playing.currentVideoNum);
    });
    
    
    nbaMedia.Params.TimeBufferProgressBar=sender.findName("TimeBufferProgressBar");
    nbaMedia.Params.TimeUnbufferedBar=sender.findName("TimeUnbufferedBar");
    nbaMedia.Params.TimePlayedBar=sender.findName("TimePlayedBar");
    nbaMedia.Params.TimeSlider=sender.findName("TimeSlider");
    nbaMedia.Params.TimeThumb=sender.findName("TimeThumb");
    nbaMedia.Params.ControlsElement=sender.findName("VideoControls");
    nbaMedia.Params.AdTimeBar=sender.findName("AdTimeBar");
    
    RegisterEvents(sender, args);
    
    nbaMedia.Actions.DisableEnableControls(true); // On load, controls are disabled.
    
    if(nbaMedia.getConfig()) nbaMedia.playing.init(); //Player doesn't load when there is no playlist or user configuration is missing.
}

// Parameters and some XAML objects reference.
nbaMedia.Params={
    Reset:function(){ // Resets parameters when loading new video.
        this.StopModeEntered=false;
        this.CurrentMediaState="";
        this.TitleSet=false;
    },
    TimeSlider:null, // XAML element.
    TimeBufferProgressBar:null, // XAML element: buffering progress.
    TimeUnbufferedBar:null, // XAML element: helper element.
    TimePlayedBar:null, // XAML element: playing progress.
    TimeThumb:false, // XAML element.
    AdTimeBar:false, // XAML element.
    ControlsElement:null, // XAML element: used to enable/disable controld when loading.
    CurrentMediaState:"", // Last fired by media element. For future use.
    Debug:true, // For temporary debug function.
    PlayedSliderAdjustInterval:null, // Interval object. Updates the playbar skin while playing.
    BufferingShowing:false, // True when buffering animation is displayed, to prevent the play symbol to show up.
    LargePlayShowing:false, // True when the central play symbol is visible.
    StopModeEntered:false, // True when the video stopped for any reason.
    TitleSet:false, // Indicates whether the metadata title was already set.
    MouseOverSL:false, // True when mouse is hovering Silverlight application.
    MouseIsDragging:false, // True when mouse is dragged over the application.
    IsBuffering:false,
    thumbXamlTemplate:  '<Canvas Name="{NAME}{I}" Width="{WIDTH}" Height="59" Canvas.Left="{LEFT}" Cursor="Hand">'+
                        '<Image Width="70" Height="53" Canvas.Left="3" Canvas.Top="3" Stretch="UniformToFill" Source="{URL}" />'+
                        '</Canvas>',
    thumbXamlWidth: 76,
    thumbXamlNameTemplate: "PlaylistItem",
    adMode:false,
    timeBarWidth: 88,
    timeBarDelta: -26,
    sliderJumpDelta: 50, // Pixels to scroll when clicking on playlist pagers.
    PlaceholderImage: null
}
// --------------------------------
// Changes to different video.
nbaMedia.SetMedia=function(url){
    nbaMedia.Actions.ShowHideBuffer(true);
    debug("now playing: "+url);
    nbaMedia.Actions.EnterLeaveStopMode(false);
    nbaMedia.MediaElement.source="";
    //setTimeout(function(){if(!url)return; nbaMedia.MediaElement.source=url;},500);
    setTimeout(function(){if(!url)return; nbaMedia.MediaElement["Source"]=url;},500);
    nbaMedia.Actions.AdjustPlayedSrubber();
}
// --------------------------------

nbaMedia.getConfig=function(){ // Analyzes user configuration and sets defaults if something is wrong.
    var n=nbaMedia.playing;
    var c=nbaMediaConfig;
    var p=nbaMediaPlaylist;
    if(c==null || typeof(c)=="undefined" || p==null || typeof(p)=="undefined") 
        return false; // Player won't load if playlist or configuration are missing.
    
    if(!isNaN(parseInt(c.adFrequency)) && c.adFrequency>0) 
        n.adFrequency=parseInt(c.adFrequency); // Sets ad frequency only when it's a positive number
    
    if(p.length<=1) c.showPlaylist=false // Hides playlist when there is only one video.
    else if(c.showPlaylist!=null && typeof(c)!="undefined") n.showPlaylist=c.showPlaylist;
    
    //if(c.autoPlay) n.autoPlay=true; 
    if(c.autoPlay!=null && typeof(c.autoPlay)!="undefined")  n.autoPlay=c.autoPlay; 
    
    if(!c.showPlaylist) {n.autoAdvance=true;} // When playlist is hidde, autoPlay and autoAdvance are true.
    else n.autoAdvance=c.playlistAutoAdvance;
    
    if(c.placeholder!=null && typeof(c.placeholder)!="undefined"){
        n.placeholder=c.placeholder;
    }
    
    if(c.size!=null && typeof(c.size)!="undefined"){
        switch(c.size){
            case 400:
                nbaMedia.SLObj.style.width="400px";
                nbaMedia.SLObj.style.height="375px";
                nbaMedia.Params.timeBarWidth=214;
                nbaMedia.Params.timeBarDelta=-33;
                var sl=document.getElementById("slPlayer");
                if(nbaMediaConfig.showPlaylist) sl.style.height="375px"
                else sl.style.height="300px";
            break;
            case 300:
                nbaMedia.SLObj.style.width="300px";
                nbaMedia.SLObj.style.height="275px";
                nbaMedia.Params.timeBarWidth=130;
                nbaMedia.Params.timeBarDelta=-26;
                var sl=document.getElementById("slPlayer");
                if(nbaMediaConfig.showPlaylist) sl.style.height="275px"
                else sl.style.height="225";
            break;
            case 150:
                nbaMedia.SLObj.style.width="150px";
                nbaMedia.SLObj.style.height="112px";
                nbaMedia.Params.timeBarWidth=214;
                nbaMedia.Params.timeBarDelta=-33;
                var sl=document.getElementById("slPlayer");
                sl.style.height="275"
                c.showPlaylist=false;
            break;
            default:
                nbaMedia.SLObj.style.width="400px";
                nbaMedia.SLObj.style.height="375px";
                nbaMedia.Params.timeBarWidth=214;
                nbaMedia.Params.timeBarDelta=-33;
                var sl=document.getElementById("slPlayer");
                if(nbaMediaConfig.showPlaylist) sl.style.height="375px"
                else sl.style.height="350px";
                c.size=400
            break;
        }
        n.size=c.size;
    }
    
    return true;
}

nbaMedia.playing={
    autoAdvance: false,
    autoPlay: false,
    showPlaylist:true,
    showAds: true,
    preroll: true,
    adFrequency: 2,
    size: 400,
    placeholder: nbaMediaRootUrl+"img/placeholder.jpg",
    playlistEnded: false, // For future use. True when playlist reached the last item.
    currentVideoNum: 0, // Current video playing in playlist array.
    currentItemNum: -1, // Current item playing in sub-playlist of a video.
    fullPlaylist: [], // Array of all videos and ads allthogether
    injectAdCallback:null, // Function to call when an ad is retrieved from parser.
    injectAdLocation:null, // Video number for which the parser is retrieving right now an ad for.
    injectAdTimeout:null,
    init: function(){
        var n=nbaMedia.playing;
        var pl=nbaMediaPlaylist;
        
        nbaMedia.Params.PlaceholderImage["Source"]=n.placeholder;
        
        for(var i=0; i<pl.length; i++){
            n.fullPlaylist.push( // Takes the defined playlist on page and makes a new playlist to use later with ads.
                {items:[ // Each video is actually a sub-playlist.
                    {
                        url:pl[i].url,
                        type:"nba", // Differenates NBA videos from ads and GIF items.
                        allowSkip:true, // False when it's an ad items.
                        title:pl[i].title
                    }],
                    number:(i+1), // Video number in playlist.
                    adInjected:false, // Whether an ad was already injected for this video or not.
                    thumbUrl:pl[i].thumb, // Thumbail URL. For now - defined on page.
                    thumb:null
                }
            );
        }
        n.initThumbs(); // Create playlist with thumbnails.
        n.setPlayCookie(0); // Resets play-count.
        if(n.preroll && nbaMediaConfig.showAds) { // Injects an ad into first video if a pre-roll is defined.
            n.setPlayCookie(n.adFrequency);
        }
        if(n.autoPlay) n.selectVideo(0); // Starts auto-play if defined.
        else {
            nbaMedia.Actions.ShowHidePlay(true);
            nbaMedia.Actions.ShowHideVideoControls(true);
            nbaMedia.Actions.ShowHideInformationBar(true);
        }
    },
    initThumbs:function(){ // Create playlist with thumbails.
        var n=nbaMedia.playing;
        if(!n.showPlaylist) return; // Returns if playlist isn't showing.
        var pl=n.fullPlaylist;
        var p=nbaMedia.Params;
        var host=nbaMedia.PlayerObj.getHost();
        for(var i=0; i<pl.length; i++){
            var newXaml=p.thumbXamlTemplate;
            var w=p.thumbXamlWidth;
            var l=w*i;
            var name=p.thumbXamlNameTemplate;
            var url=pl[i].thumbUrl;
            newXaml=newXaml.replace("{WIDTH}",w).replace("{LEFT}",l).replace("{URL}",url).replace("{NAME}",name).replace("{I}",i);
            pl[i].thumb=host.content.createFromXaml(newXaml,true);
            // Attach events:
            pl[i].thumb.addEventListener("MouseEnter",nbaMedia.ControlEvent.PlaylistItem.MouseEnter);
            pl[i].thumb.addEventListener("MouseMove",nbaMedia.ControlEvent.PlaylistItem.MouseMove);
            pl[i].thumb.addEventListener("MouseLeave",nbaMedia.ControlEvent.PlaylistItem.MouseLeave);
            pl[i].thumb.addEventListener("MouseLeftButtonDown",nbaMedia.ControlEvent.PlaylistItem.MouseDown);
            pl[i].thumb.addEventListener("MouseLeftButtonUp",nbaMedia.ControlEvent.PlaylistItem.MouseUp);
            pl[i].thumbEnabled=true;
            // Define new size for playlist container. Useful for scrolling:
            nbaMedia.PlaylistItems["Width"]=l+w;
            // Attach thumbnail to playlist XAML element:
            nbaMedia.PlaylistItems.children.add(pl[i].thumb);
        }
    },
    injectAd:function(loc,callback){ // Pull an ad from parser.
        nbaMedia.Actions.EnterLeaveAdMode(true);
        var n=nbaMedia.playing;
        if(n.fullPlaylist[loc].adInjected) {
            //nbaMedia.Actions.EnterLeaveAdMode(false);
            //return; // Returns if there is already an ad here.
            n.removeAd(n.fullPlaylist[loc]);
        }
        //var adurl="http://nba-boss.streamos.com/wmedia/nba/nbacom/aotn/aotn_080121.asx?pre1=http://ad.doubleclick.net/pfadx/nbavideo.dart/%3Btype=pre1%3Bcontentpath=nbacom/test"+(Math.round(Math.random()*1000000));
        //var adurl="DoubleClick.asx";
        //var adurl="http://ad.doubleclick.net/pfadx/nbavideo.dart/;type=pre1;contentpath=nbacom/test";
        var adurl="http://ad.doubleclick.net/pfadx/nbavideo.dart/;type=pre1;sz=728x90;nbasite=silverlight";
        nbaMedia.Actions.ShowHideBuffer(true); // Show buffer icon while this proccess is running.
        n.injectAdLocation=loc;
        n.injectAdCallback=callback; // To be executed after the ad is pulled.
        document["NbaAsxFlashParser"].getAd(adurl);
        n.injectAdTimeout=setTimeout(function(){
            n.getAddCallback("{'Entries':{'Items':[],'Length':0},'Params':{'Items':[]},Title:''}");
        },2000);
    },
    getAddCallback:function(json){ // Parser calls this when retrieving an ad.
        if(nbaMedia.playing.injectAdTimeout==null) return;
        window.clearTimeout(nbaMedia.playing.injectAdTimeout);
        
        nbaMedia.playing.injectAdTimeout=null;
        var n=nbaMedia.playing;
        var asxObj=eval('(' + json + ')');
        window.asx=asxObj;
        adList=window.asx.Entries.Items;
        if(adList==null) return; // Do nothing when there is no ad.
        for(var j=0; j<adList.length; j++){
            n.fullPlaylist[n.injectAdLocation].items.splice(0,0,
                { // Insert ad items into video's sub-playlist.
                    url:adList[j].Ref.URL,
                    type:adList[j].Ref.Type, // This will be used to "play" GIF.
                    allowSkip:false // Scrubber is disabled when an ad item is playing.
                }
            );
        }
        n.fullPlaylist[n.injectAdLocation].adInjected=true;
        n.setPlayCookie(0); // Reset play-counter.
        nbaMedia.Actions.EnterLeaveAdMode(false);
        nbaMedia.PlaylistItems["IsHitTestVisible"]="True";
        nbaMedia.playing.injectAdCallback();
    },
    removeAd:function(loc){ // Remove ad items from video's sub-playlist
        var n=nbaMedia.playing;
        //var items=n.fullPlaylist[n.injectAdLocation].items;
        var items=n.fullPlaylist[loc].items;
        var tmp=[];
        for(var j=0; j<items.length; j++){
            if(items[j].type=="nba")
                tmp.push(items[j]);
        }
        //n.fullPlaylist[n.injectAdLocation].items=tmp;
        n.fullPlaylist[loc].items=tmp;
        //n.fullPlaylist[n.injectAdLocation].adInjected=false;
        n.fullPlaylist[loc].adInjected=false;
    },
    selectVideo:function(num){ // Called when a user selects a thumbnail from playlist.
        var m=nbaMedia.MediaElement;
        var n=nbaMedia.playing;
        var pl=n.fullPlaylist;
        n.currentVideoNum=num;
        
        n.markSelectedVideo(num); // Visually mark selected item.
        
        nbaMedia.Actions.ResetTitle();
        if(typeof(nbaMediaPlaylist[num].title)!="undefined" && nbaMediaPlaylist[num].title!=null && nbaMediaPlaylist[num].title!="") {
            nbaMedia.Actions.SetTitle(nbaMediaPlaylist[num].title);
        }
        
        if(n.fullPlaylist[n.currentVideoNum].adInjected)
            n.removeAd(n.currentVideoNum); // If there is an ad attached to this video, remove it.
        if(nbaMediaConfig.showAds && n.getPlayCookie()>=n.adFrequency){ // Inject new ad if ad-rule is matching.
            try{
                n.injectAd(n.currentVideoNum,n.playVideo); // Inject an ad and execute n.playVideo when finished (injectAdCallback).
                n.setPlayCookie(0);
            }catch(e){
                n.playVideo();
            }
            return;
        }else{
            n.playVideo();
        }
    },
    markSelectedVideo:function(num){ // Visually mark selected playlist item.
        var n=nbaMedia.playing;
        var pl=n.fullPlaylist;
        if(n.showPlaylist){
            for(var i=0; i<pl.length; i++){
                pl[i].thumb["Background"]="Transparent";
                //pl[i].thumb["IsHitTestVisible"]="True";
                pl[i].thumbEnabled=true;
                pl[i].thumb["Cursor"]="Hand";
            }
            if(num>-1){
                pl[num].thumb["Background"]="Red";
                //pl[num].thumb["IsHitTestVisible"]="False";
                pl[num].thumbEnabled=false;
                pl[num].thumb["Cursor"]="Default";
            }
        }
    },
    nextVideo:function(){ // For auto advance.
        var m=nbaMedia.MediaElement;
        var n=nbaMedia.playing;
        n.currentVideoNum++;
        if(n.currentVideoNum>=n.fullPlaylist.length){ // Finish playlist when reached end.
            n.finishPlaylist();
            return;
        }
        if(!n.autoAdvance) {
            m.Source="";
            nbaMedia.Actions.ShowHidePlay(true);
            n.currentVideoNum--;
            return;
        }
        n.selectVideo(n.currentVideoNum);
    },
    playVideo:function(){
        var n=nbaMedia.playing;
        n.setPlayCookie(n.getPlayCookie()+1); // Increase play-count.
        n.currentItemNum=-1;
        if(n.currentVideoNum>=n.fullPlaylist.length) { // Finish playlist when reached end.
            n.finishPlaylist();
            return;
        }else{
            nbaMedia.Actions.ShowHidePlay(false);
            n.nextItem(); 
        }
    },
    nextItem:function(){ // Play next item in video's sub-playlist.
        var n=nbaMedia.playing;
        n.currentItemNum++;
        
        if(n.currentItemNum>=n.fullPlaylist[n.currentVideoNum].items.length) {
            n.nextVideo(); // Go to next video when sub-playlist finished.
            return;
        }
        
        var item=n.fullPlaylist[n.currentVideoNum].items[n.currentItemNum];
        
        if(!item.allowSkip) nbaMedia.Actions.EnterLeaveAdMode(true) // Disable scrubber when item is an ad.
        else nbaMedia.Actions.EnterLeaveAdMode(false);
        
        if(item.type==".gif") {
            n.playGifBeacon(); // Create GIF.
            n.nextItem();
            return;
        }
        
        nbaMedia.SetMedia(item.url);
    },
    finishPlaylist:function(){
        var n=nbaMedia.playing;
        n.playlistEnded=true;
        nbaMedia.Actions.EnterLeaveAdMode(false);
        nbaMedia.MediaElement.Source="";
        n.currentVideoNum=0;
        n.markSelectedVideo(-1); // Unmark all thumbnail in playlist.
        nbaMedia.Actions.ShowHidePlay(true);
    },
    playGifBeacon:function(url){ // Create GIF beacon.
        var img=document.createElement("IMG");
        img.src=url;
        img.width=0;
        img.height=0;
        document.body.appendChild(img);
    },
    setPlayCookie:function(num){
        var n=nbaMedia.playing;
        document.cookie="nbaMediaPlayerCounter="+num;
    },
    getPlayCookie:function(){
        var c=document.cookie.replace("nbaMediaPlayerCounter=","");
        var n=parseInt(c);
        if(!isNaN(n)) return n
        else return 0;
    }
}



nbaMedia.Actions={
    ShowHideVideoControls:function(show){ // Controls control bar visibility.
        if(show || nbaMedia.Params.LargePlayShowing){
            nbaMedia.PlayerObj.findName("VideoControls_Show").Begin();
        }else{
            nbaMedia.PlayerObj.findName("VideoControls_Hide").Begin();
        }
    },
    DisableEnableControls:function(disable){
        // Disables controls while opening media.
        // When opening video, the media components queues all control commands (play, stop...).
        // When it processes the queue, the video might go crazy.
        if(disable){
            nbaMedia.Params.ControlsElement["IsHitTestVisible"]="False";
        }else{
            nbaMedia.Params.ControlsElement["IsHitTestVisible"]="true";
        }
    },
    EnterLeaveStopMode:function(enterStop){ // For future use.
        nbaMedia.Params.StopModeEntered=enterStop;
    },
    EnterLeaveAdMode:function(enterAd){ // Disables/enables scrubber and clicking on playlist
        debug("SetAdMode: "+enterAd);
        nbaMedia.Params.adMode=enterAd;
        var pl=nbaMedia.playing.fullPlaylist;
        if(enterAd){
            nbaMedia.Params.adMode=true;
            nbaMedia.Params.TimeThumb["Visibility"]="Collapsed";
            nbaMedia.Params.TimeSlider["IsHitTestVisible"]="False";
            nbaMedia.Params.AdTimeBar["Visibility"]="Visible";
            //nbaMedia.PlaylistItems["IsHitTestVisible"]="False";
            if(nbaMedia.playing.showPlaylist){
                for(var i=0; i<pl.length; i++){
                    pl[i].thumb["Cursor"]="Default";
                }
            }
        }else{
            nbaMedia.Params.adMode=false;
            nbaMedia.Params.TimeThumb["Visibility"]="Visible";
            nbaMedia.Params.TimeSlider["IsHitTestVisible"]="True";
            nbaMedia.Params.AdTimeBar["Visibility"]="Collapsed";
            //nbaMedia.PlaylistItems["IsHitTestVisible"]="True";
            if(nbaMedia.playing.showPlaylist){
                for(var i=0; i<pl.length; i++){
                    if(pl[i].thumbEnabled) pl[i].thumb["Cursor"]="Hand";
                }
            }
        }
    },
    AdjustPlayedSrubber:function(){ 
        // Playbar's appearance is different on both sides of the scrubber.
        // This function adjusts skin to reflect scrubber position.
        if(nbaMedia.MediaElement.source==""){ nbaMedia.Params.TimePlayedBar["Width"]="0"; return;}
        var dur=Math.round(nbaMedia.MediaElement.NaturalDuration.Seconds);
        var pos=Math.round(nbaMedia.MediaElement.Position.Seconds);
        var w=nbaMedia.Params.timeBarWidth;
        var delta=nbaMedia.Params.timeBarDelta;
        try{
            if(!nbaMedia.Params.adMode) {
                nbaMedia.Params.TimePlayedBar["Width"]=Math.round(w/dur*pos);
                nbaMedia.Params.TimePlayedBar["Canvas.Left"]=-(nbaMedia.Params.TimeThumb["Canvas.Left"]+delta);
                /*nbaMedia.Params.TimePlayedBar["Width"]=Math.round(parseInt(nbaMedia.Params.TimeThumb["Canvas.Left"],10)+delta+8);
                nbaMedia.Params.TimePlayedBar["Canvas.Left"]=Math.round(-parseInt(nbaMedia.Params.TimeThumb["Canvas.Left"],10)-delta);*/
            } else nbaMedia.Params.AdTimeBar["Width"]=Math.round(w/dur*pos);
        }catch(e){}
    },
    AdjustPlayedSliderConstantly:function(start){ 
        // Sets inrerval to AdjustPlayedSrubber() when playing.
        if(start){
            nbaMedia.Params.PlayedSliderAdjustInterval=setInterval(nbaMedia.Actions.AdjustPlayedSrubber,100);
        }else{
            clearInterval(nbaMedia.Params.PlayedSliderAdjustInterval);
            nbaMedia.Params.PlayedSliderAdjustInterval=null;
        }
    },
    ShowHideBuffer:function(show){
        if(show){
            if(nbaMedia.Params.IsBuffering) return;
            nbaMedia.PlayerObj.findName("Buffering_Show").Begin();
            nbaMedia.Params.IsBuffering=true;
            nbaMedia.Actions.ShowHidePlay(false);
        }else{
            if(!nbaMedia.Params.IsBuffering) return;
            nbaMedia.PlayerObj.findName("Buffering_Hide").Begin();
            nbaMedia.Params.IsBuffering=false;
        }
    },
    ShowHidePlay:function(show){
        if(show && !nbaMedia.Params.IsBuffering){
            nbaMedia.PlayerObj.findName("PlayButtonLarge_Show").Begin();
            nbaMedia.Params.LargePlayShowing=true;
        }else{
            nbaMedia.PlayerObj.findName("PlayButtonLarge_Hide").Begin();
            nbaMedia.Params.LargePlayShowing=false;
        }
    },
    ShowHideInformationBar:function(show){ // Controls title bar visibility.
        if(show || nbaMedia.Params.LargePlayShowing){
            nbaMedia.PlayerObj.findName("InformationBar").Visibility="Visible";
            nbaMedia.PlayerObj.findName("InformationBar_Show").Begin();
        }else{
            nbaMedia.PlayerObj.findName("InformationBar_Hide").Begin();
        }
    },
    SetTitle:function(title){ // Writes metadata to title.
        nbaMedia.PlayerObj.findName("InformationBarTextTitle").Text=title;
        nbaMedia.Params.TitleSet=true;
        if(nbaMedia.Params.MouseOverSL){ 
            // Until title is set, bar is invisible, even when mouse is hovering application.
            nbaMedia.Actions.ShowHideInformationBar(true);
        }
    },
    ResetTitle:function(){ // Removes title text when changing video.
        nbaMedia.PlayerObj.findName("InformationBarTextTitle").Text="";
        nbaMedia.Params.TitleSet=false;
        nbaMedia.Actions.ShowHideInformationBar(false);
    },
    SetLogo:function(url){ // Downloads logo image. URL is retrieved from page.
        var logoEl=NBAVideoPlayer.PlayerObj.findName("InformationBarLogo");
        logoEl.addEventListener("DownloadProgressChanged",
            function(sender,args){
                if(sender.downloadProgress == 1.0){
                    window.setTimeout(function(){
                        // Using timeout looks weird, but it's the only solution.
                        // More info: http://silverlight.net/forums/t/3935.aspx
                        // http://www.firstfloorsoftware.com/BlogPost.aspx?id=12097
                        nbaMedia.PlayerObj.findName("InformationBar")["Height"]=parseInt(sender["Height"])+5;
                        nbaMedia.PlayerObj.findName("InformationBarBg")["Height"]=parseInt(sender["Height"])+5;
                        nbaMedia.PlayerObj.findName("InformationBarLogo")["Canvas.Left"]=400-sender["Width"]-7;
                        nbaMedia.PlayerObj.findName("InformationBarLogo")["Canvas.Top"]=2;
                        nbaMedia.PlayerObj.findName("InformationBarLogo_Show").Begin();
                    },1000);
                }
            }
        );
        logoEl.Source=url;
    },
    GoFullscreen:function(){
        if(nbaMedia.PlayerObj.getHost().content.FullScreen) {
            nbaMedia.PlayerObj.getHost().content.FullScreen=false;
        }else{
            nbaMedia.PlayerObj.getHost().content.FullScreen=true;
        }
    }
}


nbaMedia.MediaEvent={ // Events fired by MediaElement related to current video.
    MediaOpened:function(sender,args){
        debug("MediaOpened");
        nbaMedia.Params.Reset();
        nbaMedia.CurrentMedia=sender;
        nbaMedia.Actions.AdjustPlayedSrubber();
        nbaMedia.Actions.DisableEnableControls(false);
    },
    MediaStateChanged:function(sender, args){ 
        // Event that the media component fires as the video goes.
        var sE=nbaMedia.MediaEvent;
        switch(sender.CurrentState){
            case "Buffering":sE.Buffering(sender, args);break;
            case "Closed":sE.Closed(sender, args);break;
            case "Error":sE.Error(sender, args);break;
            case "Opening":sE.Opening(sender, args);break;
            case "Paused":sE.Paused(sender, args);break;
            case "Playing":sE.Playing(sender, args);break;
            case "Stopped":sE.Stopped(sender, args);break;
        }
        nbaMedia.Actions.AdjustPlayedSrubber();
    },
    Buffering:function(sender, args){
        nbaMedia.Actions.ShowHideBuffer(true);
        nbaMedia.Params.CurrentMediaState="Buffering";
        nbaMedia.Actions.AdjustPlayedSliderConstantly(true);
        nbaMedia.Actions.ShowHidePlay(false);
    },
    Closed:function(sender, args){
        nbaMedia.Actions.ShowHideBuffer(false);
        nbaMedia.ParamsCurrentMediaState="Closed";
        nbaMedia.Actions.AdjustPlayedSrubber();
        nbaMedia.Actions.AdjustPlayedSliderConstantly(false);
        nbaMedia.Actions.ShowHidePlay(false);
    },
    Error:function(sender, args){
        nbaMedia.Actions.ShowHideBuffer(false);
        nbaMedia.Params.CurrentMediaState="Error";
        nbaMedia.Actions.AdjustPlayedSliderConstantly(false);
        //alert("error");
        nbaMedia.playing.nextItem();
    },
    Opening:function(sender, args){
        nbaMedia.Actions.ShowHideBuffer(true);
        nbaMedia.Actions.DisableEnableControls(true);
        nbaMedia.Params.CurrentMediaState="Opening";
        nbaMedia.Actions.AdjustPlayedSrubber();
        nbaMedia.Actions.ShowHidePlay(false);
    },
    Paused:function(sender, args){
        nbaMedia.Params.CurrentMediaState="Paused";
        nbaMedia.Actions.ShowHidePlay(true);
        nbaMedia.Actions.AdjustPlayedSliderConstantly(false);
    },
    Playing:function(sender, args){
        nbaMedia.Actions.DisableEnableControls(false);
        if(nbaMedia.Params.StopModeEntered) {
            return;
        }
        nbaMedia.Params.CurrentMediaState="Playing";
        nbaMedia.Actions.AdjustPlayedSliderConstantly(true);
        nbaMedia.Actions.ShowHideBuffer(false);
        nbaMedia.Actions.ShowHidePlay(false);
    },
    Stopped:function(sender, args){
        nbaMedia.Params.CurrentMediaState="Stopped";
        nbaMedia.Actions.AdjustPlayedSliderConstantly(false);
        nbaMedia.Actions.ShowHideBuffer(false);
    },
    BufferingProgressChanged:function(sender, args){
        nbaMedia.Params.CurrentMediaState="BufferingProgressChanged";
        nbaMedia.Actions.AdjustPlayedSrubber();
    },
    DownloadProgressChanged:function(sender, args){
        // Controls the appearance of the download progress indicator:
        nbaMedia.Params.TimeBufferProgressBar.Width=
            sender.DownloadProgress*nbaMedia.Params.timeBarWidth;
        nbaMedia.Params.TimeUnbufferedBar.Width=
            nbaMedia.Params.timeBarWidth-nbaMedia.Params.TimeBufferProgressBar.Width;
        nbaMedia.Params.TimeUnbufferedBar["Canvas.Left"]=nbaMedia.Params.TimeBufferProgressBar.Width;
        nbaMedia.Params.CurrentMediaState="DownloadProgressChanged";
        nbaMedia.Actions.AdjustPlayedSrubber();
    },
    MediaEnded:function(sender, args){
        debug("MediaEnded");
        nbaMedia.Actions.AdjustPlayedSrubber();
        nbaMedia.Params.CurrentMediaState="MediaEnded";
        nbaMedia.Actions.AdjustPlayedSliderConstantly(false);
        nbaMedia.playing.nextItem();
    },
    MediaFailed:function(sender, args){
        debug("MediaFailed");
        nbaMedia.Actions.AdjustPlayedSrubber();
        nbaMedia.Params.CurrentMediaState="MediaFailed";
        nbaMedia.Actions.AdjustPlayedSliderConstantly(false);
        nbaMedia.playing.nextItem();
    }
}


// Silverlight object events handlers.
nbaMedia.SLEvent={ 
    MouseEnter:function(sender, args){ // Shows controls and title bar on hover.
        nbaMedia.Params.MouseOverSL=true;
        nbaMedia.Actions.ShowHideVideoControls(true);
        //if(nbaMedia.Params.TitleSet){
            nbaMedia.Actions.ShowHideInformationBar(true);
        //}
        nbaMedia.Actions.AdjustPlayedSrubber();
    },
    MouseLeave:function(sender, args){
        nbaMedia.Params.MouseOverSL=false;
        nbaMedia.Actions.ShowHideVideoControls(false);
        nbaMedia.Actions.ShowHideInformationBar(false);
        if(nbaMedia.Params.MouseIsDragging) {
            nbaMedia.Params.MouseIsDragging=false;
            debug("leave sl");
        }
        nbaMedia.Actions.AdjustPlayedSrubber();
    },
    MouseDown:function(sender, args){
        nbaMedia.Actions.AdjustPlayedSrubber(); // Incase user clicks the timebar.
    },
    MouseUp:function(sender, args){
        nbaMedia.Actions.AdjustPlayedSrubber();
    },
    MouseMove:function(sender, args){
        if(nbaMedia.Params.MouseIsDragging) {
            nbaMedia.Actions.AdjustPlayedSrubber(); // Incase user clicks the timebar and drags.
        }
    }
}

// Controls events handlers.
nbaMedia.ControlEvent={
    PlayPause:{
        MouseEnter:function(sender, args){sender["Cursor"]="Hand"},
        MouseLeave:function(sender, args){},
        MouseDown:function(sender, args){
            var n=nbaMedia.playing;
            var m=nbaMedia.MediaElement;
            nbaMedia.Actions.EnterLeaveStopMode(false);
            //if(m.Source=="" && !n.autoAdvance){
            if(m.Source==""){
                n.selectVideo(n.currentVideoNum);
                return;
            }
        },
        MouseUp:function(sender, args){},
        MouseMove:function(sender, args){}
    },
    Stop:{
        MouseEnter:function(sender, args){},
        MouseLeave:function(sender, args){},
        MouseDown:function(sender, args){
            nbaMedia.Actions.EnterLeaveStopMode(true);
        },
        MouseUp:function(sender, args){},
        MouseMove:function(sender, args){}
    },
    Fullscreen:{
        MouseEnter:function(sender, args){
            nbaMedia.PlayerObj.findName("FullscreenButton_MouseEnter").Begin();
        },
        MouseLeave:function(sender, args){
            nbaMedia.PlayerObj.findName("FullscreenButton_MouseLeave").Begin();
        },
        MouseDown:function(sender, args){
            nbaMedia.PlayerObj.findName("FullscreenButton_MouseDown").Begin();
        },
        MouseUp:function(sender, args){
            nbaMedia.PlayerObj.findName("FullscreenButton_MouseUp").Begin();
            nbaMedia.Actions.GoFullscreen();
        },
        MouseMove:function(sender, args){
            
        }
    },
    TimeSlider:{
        MouseEnter:function(sender, args){},
        MouseLeave:function(sender, args){},
        MouseDown:function(sender, args){
            nbaMedia.Params.MouseIsDragging=true;
            nbaMedia.Actions.AdjustPlayedSrubber();
        },
        MouseUp:function(sender, args){
            mouseUp=false;
            nbaMedia.Actions.AdjustPlayedSrubber();
        },
        MouseMove:function(sender, args){}
    },
    TimeThumb:{
        MouseEnter:function(sender, args){},
        MouseLeave:function(sender, args){},
        MouseDown:function(sender, args){
            nbaMedia.Params.MouseIsDragging=true;
            nbaMedia.Actions.AdjustPlayedSrubber();
        },
        MouseUp:function(sender, args){
            nbaMedia.Params.MouseIsDragging=false;
            nbaMedia.Actions.AdjustPlayedSrubber();
        },
        MouseMove:function(sender, args){}
    },
    TimeBufferProgressBar:{
        MouseEnter:function(sender, args){},
        MouseLeave:function(sender, args){},
        MouseDown:function(sender, args){
            nbaMedia.Params.MouseIsDragging=true;
            nbaMedia.Actions.AdjustPlayedSrubber();
        },
        MouseUp:function(sender, args){
            nbaMedia.Params.MouseIsDragging=false;
            nbaMedia.Actions.AdjustPlayedSrubber();
        },
        MouseMove:function(sender, args){}
    },
    Mute:{
        MouseEnter:function(sender, args){},
        MouseLeave:function(sender, args){},
        MouseDown:function(sender, args){},
        MouseUp:function(sender, args){},
        MouseMove:function(sender, args){}
    },
    VolumeThumb:{
        MouseEnter:function(sender, args){},
        MouseLeave:function(sender, args){},
        MouseDown:function(sender, args){},
        MouseUp:function(sender, args){},
        MouseMove:function(sender, args){}
    },
    VolumeSlider:{
        MouseEnter:function(sender, args){},
        MouseLeave:function(sender, args){},
        MouseDown:function(sender, args){},
        MouseUp:function(sender, args){},
        MouseMove:function(sender, args){}
    },
    PlayButtonLarge:{
        MouseEnter:function(sender, args){},
        MouseLeave:function(sender, args){},
        MouseDown:function(sender, args){
            nbaMedia.Actions.EnterLeaveStopMode(false);
        },
        MouseUp:function(sender, args){
        },
        MouseMove:function(sender, args){},
        ShowCompleted:function(sender,args){
            // When symbol show animation is complete, make the symbol clickable.
            nbaMedia.PlayerObj.findName("PlayButtonLarge").IsHitTestVisible="True";
        },
        HideCompleted:function(sender,args){
            // When symbol hide animation is complete, make the symbol clickable.
            // To prevent clicking it when it's opacity set to zero.
            nbaMedia.PlayerObj.findName("PlayButtonLarge").IsHitTestVisible="False";
        }
    },
    InformationBar:{
        ShowCompleted:function(sender,args){},
        HideCompleted:function(sender,args){}
    },
    PlaylistItem:{
        MouseEnter:function(sender, args){
            var n=nbaMedia.playing;
            var pl=n.fullPlaylist;
            var p=nbaMedia.Params;
            var num=parseInt(sender.name.replace(p.thumbXamlNameTemplate,""));
            if(typeof(nbaMediaPlaylist[num].title)=="undefined" || nbaMediaPlaylist[num].title==null || nbaMediaPlaylist[num].title=="") return;
            nbaMedia.PlayerObj.findName("PlaylistTooltipText")["Text"]=nbaMediaPlaylist[num].title;
            nbaMedia.PlayerObj.findName("PlaylistTooltip_Show").Begin();
        },
        MouseLeave:function(sender, args){
            nbaMedia.PlayerObj.findName("PlaylistTooltip_Hide").Begin();
        },
        MouseUp:function(sender,args){
            var n=nbaMedia.playing;
            var pl=n.fullPlaylist;
            var p=nbaMedia.Params;
            var num=parseInt(sender.name.replace(p.thumbXamlNameTemplate,""));
            if(pl[num].thumbEnabled && !nbaMedia.Params.adMode) n.selectVideo(num);
        },
        MouseDown:function(sender, args){},
        MouseMove:function(sender, args){}
    },
    PagerLeft:{
        MouseEnter:function(sender, args){
            nbaMedia.PlayerObj.findName("PlaylistPagerLeft_MouseEnter").Begin();
        },
        MouseLeave:function(sender, args){
            nbaMedia.PlayerObj.findName("PlaylistPagerLeft_MouseLeave").Begin();
        },
        MouseUp:function(sender, args){
            nbaMedia.PlayerObj.findName("PlaylistPagerLeft_MouseUp").Begin();
        },
        MouseDown:function(sender, args){
            nbaMedia.PlayerObj.findName("PlaylistPagerLeft_MouseDown").Begin();
            var pli=nbaMedia.PlaylistItems;
            var plc=nbaMedia.PlaylistItemsContainer;
            if(pli["Width"]<=plc["Width"]) return;
            var newLeft=pli["Canvas.Left"]+nbaMedia.Params.sliderJumpDelta;
            if(newLeft>=0) newLeft=0;
            
            var sb=nbaMedia.PlayerObj.findName("Playlist_Slide");
            var sba=nbaMedia.PlayerObj.findName("Playlist_SlideAnim");
            sba.To=newLeft
            sb.Begin();
        },
        MouseMove:function(sender, args){}
    },
    PagerRight:{
        MouseEnter:function(sender, args){
            nbaMedia.PlayerObj.findName("PlaylistPagerRight_MouseEnter").Begin();
        },
        MouseLeave:function(sender, args){
            nbaMedia.PlayerObj.findName("PlaylistPagerRight_MouseLeave").Begin();
        },
        MouseUp:function(sender, args){
            nbaMedia.PlayerObj.findName("PlaylistPagerRight_MouseUp").Begin();
        },
        MouseDown:function(sender, args){
            nbaMedia.PlayerObj.findName("PlaylistPagerRight_MouseDown").Begin();
            var pli=nbaMedia.PlaylistItems;
            var plc=nbaMedia.PlaylistItemsContainer;
            if(pli["Width"]<=plc["Width"]) return;
            var newLeft=pli["Canvas.Left"]-nbaMedia.Params.sliderJumpDelta;
            if(newLeft<=-(pli["Width"]-plc["Width"])) newLeft=-(pli["Width"]-plc["Width"]);
            
            var sb=nbaMedia.PlayerObj.findName("Playlist_Slide");
            var sba=nbaMedia.PlayerObj.findName("Playlist_SlideAnim");
            sba.To=newLeft
            sb.Begin();
        },
        MouseMove:function(sender, args){}
    }
}


function RegisterEvents(sender, args){
    // Media component and controls events registration.
    // Some of them are for future use.
    
    nbaMedia.UIElement.AddEventListener("MouseEnter",nbaMedia.SLEvent.MouseEnter);
    nbaMedia.UIElement.AddEventListener("MouseLeave",nbaMedia.SLEvent.MouseLeave);
    nbaMedia.UIElement.AddEventListener("MouseLeftButtonDown",nbaMedia.SLEvent.MouseDown);
    nbaMedia.UIElement.AddEventListener("MouseLeftButtonUp",nbaMedia.SLEvent.MouseUp);
    nbaMedia.UIElement.AddEventListener("MouseMove",nbaMedia.SLEvent.MouseMove);
    
    sender.findName("PlayButtonLarge_Show").AddEventListener("Completed",nbaMedia.ControlEvent.PlayButtonLarge.ShowCompleted);
    sender.findName("PlayButtonLarge_Hide").AddEventListener("Completed",nbaMedia.ControlEvent.PlayButtonLarge.HideCompleted);
    sender.findName("InformationBar_Show").AddEventListener("Completed",nbaMedia.ControlEvent.InformationBar.ShowCompleted);
    sender.findName("InformationBar_Hide").AddEventListener("Completed",nbaMedia.ControlEvent.InformationBar.HideCompleted);
    
    //nbaMedia.PlayerObj.getHost().onFullScreenChange=nbaMedia.SLEvent.Fullscreen;
    
    cEl=nbaMedia.MediaElement; cAct=nbaMedia.MediaEvent;
    cEl.AddEventListener("MediaOpened",cAct.MediaOpened);
    cEl.AddEventListener("CurrentStateChanged", cAct.MediaStateChanged);
    cEl.AddEventListener("BufferingProgressChanged", cAct.BufferingProgressChanged);
    cEl.AddEventListener("DownloadProgressChanged", cAct.DownloadProgressChanged);
    cEl.AddEventListener("MediaEnded", cAct.MediaEnded);
    cEl.AddEventListener("MediaFailed", cAct.MediaFailed);
    cEl=sender.findName("PlayPauseButton"); cAct=nbaMedia.ControlEvent.PlayPause;
    cEl.addEventListener("MouseEnter",cAct.MouseEnter);
    cEl.addEventListener("MouseLeave",cAct.MouseLeave);
    cEl.addEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.addEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.addEventListener("MouseMove",cAct.MouseMove);
    cEl=sender.findName("StopButton");cAct=nbaMedia.ControlEvent.Stop;
    cEl.addEventListener("MouseEnter",cAct.MouseEnter);
    cEl.addEventListener("MouseLeave",cAct.MouseLeave);
    cEl.addEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.addEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.addEventListener("MouseMove",cAct.MouseMove);
    
    cEl=sender.findName("FullscreenButton");cAct=nbaMedia.ControlEvent.Fullscreen;
    cEl.addEventListener("MouseEnter",cAct.MouseEnter);
    cEl.addEventListener("MouseLeave",cAct.MouseLeave);
    cEl.addEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.addEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.addEventListener("MouseMove",cAct.MouseMove);
    
    cEl=sender.findName("MuteButton");cAct=nbaMedia.ControlEvent.Mute;
    cEl.addEventListener("MouseEnter",cAct.MouseEnter);
    cEl.addEventListener("MouseLeave",cAct.MouseLeave);
    cEl.addEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.addEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.addEventListener("MouseMove",cAct.MouseMove);
    cEl=sender.findName("VolumeSlider");cAct=nbaMedia.ControlEvent.VolumeSlider;
    cEl.addEventListener("MouseEnter",cAct.MouseEnter);
    cEl.addEventListener("MouseLeave",cAct.MouseLeave);
    cEl.addEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.addEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.addEventListener("MouseMove",cAct.MouseMove);
    cEl=sender.findName("VolumeThumb");cAct=nbaMedia.ControlEvent.VolumeThumb;
    cEl.addEventListener("MouseEnter",cAct.MouseEnter);
    cEl.addEventListener("MouseLeave",cAct.MouseLeave);
    cEl.addEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.addEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.addEventListener("MouseMove",cAct.MouseMove);
    /*cEl=sender.findName("PlayButtonLarge");cAct=nbaMedia.ControlEvent.PlayButtonLarge;
    cEl.addEventListener("MouseEnter",cAct.MouseEnter);
    cEl.addEventListener("MouseLeave",cAct.MouseLeave);
    cEl.addEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.addEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.addEventListener("MouseMove",cAct.MouseMove);*/
    cEl=sender.findName("TimeSlider");cAct=nbaMedia.ControlEvent.TimeSlider;
    cEl.addEventListener("MouseEnter",cAct.MouseEnter);
    cEl.addEventListener("MouseLeave",cAct.MouseLeave);
    cEl.addEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.addEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.addEventListener("MouseMove",cAct.MouseMove);
    cEl=sender.findName("TimeThumb");cAct=nbaMedia.ControlEvent.TimeThumb;
    cEl.addEventListener("MouseEnter",cAct.MouseEnter);
    cEl.addEventListener("MouseLeave",cAct.MouseLeave);
    cEl.addEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.addEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.addEventListener("MouseMove",cAct.MouseMove);
    cEl=nbaMedia.Params.TimeBufferProgressBar;cAct=nbaMedia.ControlEvent.TimeBufferProgressBar;
    cEl.AddEventListener("MouseEnter",cAct.MouseEnter);
    cEl.AddEventListener("MouseLeave",cAct.MouseLeave);
    cEl.AddEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.AddEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.AddEventListener("MouseEnter",cAct.MouseMove);
    
    cEl=sender.findName("PlaylistPagerLeft");cAct=nbaMedia.ControlEvent.PagerLeft;
    cEl.AddEventListener("MouseEnter",cAct.MouseEnter);
    cEl.AddEventListener("MouseLeave",cAct.MouseLeave);
    cEl.AddEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.AddEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.AddEventListener("MouseEnter",cAct.MouseMove);
    cEl=sender.findName("PlaylistPagerRight");cAct=nbaMedia.ControlEvent.PagerRight;
    cEl.AddEventListener("MouseEnter",cAct.MouseEnter);
    cEl.AddEventListener("MouseLeave",cAct.MouseLeave);
    cEl.AddEventListener("MouseLeftButtonDown",cAct.MouseDown);
    cEl.AddEventListener("MouseLeftButtonUp",cAct.MouseUp);
    cEl.AddEventListener("MouseEnter",cAct.MouseMove);
    cEl=null;
}

// temporary debug function
function debug(str){
    return;
}
// --------------------------------