﻿// JScript File
var addLoadEvent = function(func)
    {
	    if (window.addEventListener) 
	    {  
		    window.addEventListener('load', func, false);
	    } else 
	    { 
		    window.attachEvent('onload', func);
	    }
    }


var FlashStyle = "";       

function rootPath()
    {
       if ((location.href.indexOf("http://localhost:") == 0) && (location.href.indexOf("/TrackTesting.WebUI/") > 0))
         return "/TrackTesting.WebUI/";
       else
         return "/"; // ../   
    }
    
function ImagePath()
{
  if (FlashStyle != "")
    return rootPath() + "images/skin_white3/" + FlashStyle + "/";    
  else
    return rootPath() + "images/skin_white3/";    
}


function Test()
{
  alert("loaded");
}

var state_none = 0;
var state_loadingjobinfo = 1;
var state_loadingtrackinfo = 2;
var state_loading = 2;
var state_playing = 3;
var state_stopped = 4;
var state_paused = 5;
var state_ratecompleted = 6;
var pmNone = 0;
var pmPlaylistCriteriaSet = 1;
var pmPlaylistStatic = 2;
var pmPlaylistChannel = 3;
var pmVoting = 4;

var play_variant_soundbite = 0;
var play_variant_fulltrack = 1;
var play_variant_soundbitenormalized = 2;
var play_variant_fulltracknormalized = 3;

function stateString( state)
    {
      switch (state)
      {
          case state_loadingjobinfo: return "loading job info"; break;
          case state_loadingtrackinfo: return "loading track info"; break;
          case state_loading: return "loading"; break;
          case state_playing: return "playing"; break;
          case state_stopped: return "stopped"; break;
          case state_paused: return "paused"; break;
          case state_ratecompleted: return "rate completed"; break;
          default: return "none"; break;
      }
    }



function flashMovie(playerId)
{
    var player = getPlayer(playerId);    
    var name = "ttPlayer" + playerId;
    
    player.displayDebugInfo("find flashMovie \"" + name + "\"");  

    if(navigator.appName.indexOf("Microsoft") != -1)
    {	
	    player.displayDebugInfo("Is Microsoft browser, checks document.getElementById(name)");  
    
        var e = document.getElementById(name);
        if (e != undefined)
        {
           player.displayDebugInfo("document.getElementById(name)");  
           return e;
        }
        else
        {
            player.displayDebugInfo("Is Microsoft browser, checks window[name]");  

            if (window[name] != undefined)	    
                return window[name];
            else
            {
                player.displayDebugInfo("Return document[name]");  

                return document[name];
            }
        }
    }
    else
    {
        player.displayDebugInfo("Is not Microsoft browser");  

        return document[name];
    }
}


function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}


var players = [];
var selectedPlayer = null;
var selectedPlayerId = null;

function getPlayer(playerId)
{
   for (var i=0;i<players.length;i++)
    {
       if (players[i].id == playerId)      
           return players[i];
    }        
    return null;  
}

function getFlashPlayer(player)
{
  return flashMovie(player); 
}

        
function MakeVotingPlayer(outDiv, Id, TestHistoryId, TrackTesterId, TTURL, DebugString, SiteCulture, FlashPlayer)
{   
  return MakePlayerEx(outDiv, Id, null, null, "Default", "Voting", null, TTURL, DebugString, SiteCulture, FlashPlayer, "&TrackTesterId=" + TrackTesterId + "&TestHistoryId=" + TestHistoryId, 400, 400, "#FFFFFF");  
}

function MakePlayerEx(outDiv, Id, CustomerId, SecurityToken, MusicSource, PlayMode, Tracks, TTURL, DebugString, SiteCulture, FlashPlayer, ExtraParams, Width, Height, BgColor)
{
   var player = new Player(Id, outDiv);             
   
   GlobalDebugInfo("Creating player: " + Id);
   
   player.MusicSource = MusicSource;
   player.Tracks = Tracks;
   player.TTURL = TTURL;
   player.DebugString = DebugString;
   player.SiteCulture = SiteCulture;
   player.FlashPlayer = FlashPlayer;
   player.ExtraParams = ExtraParams;
   player.Width = Width;
   player.Height = Height;
   player.BgColor = BgColor;       
   player.PlayMode = PlayMode;
   player.CustomerId = CustomerId;
   player.SecurityToken = SecurityToken;
   switch (PlayMode)
   {
     case "Voting": player.PlayModeType = pmVoting; break;
     case "CriteriaSet": player.PlayModeType = pmPlaylistCriteriaSet; break;
     case "Static": player.PlayModeType = pmPlaylistStatic; break;
     case "Channel": player.PlayModeType = pmPlaylistChannel; break;     
     default: player.PlayModeType = pmPlaylistStatic;
   }                            
   player.build();                                 
}
            
function MakeSmallPlayer(outDiv, tracks, TTURL, DebugString, SiteCulture)
{               
   return MakePlayerEx(outDiv, null, null, tracks, TTURL, DebugString, SiteCulture, "ttPlayerV10.swf", "", 520, 450, "#FFFFFF");
}

var debugMode = false;


function Player(id,outDiv)
{
   this.id = id;
   this.outDiv = outDiv;

    players.push(this);
    GlobalDebugInfo("Building player: " + id);
   
    var debugInfo = "";

    this.displayDebugInfo = function displayDebugInfo( message)
    {              
       if (this.debugDiv != null)
       { 
         if (this.debugInfo != "")
         {
           this.debugDiv.appendChild(document.createTextNode(new Date() + " " +  this.debugInfo));
           this.debugDiv.appendChild(document.createElement('br'));     
           this.debugInfo = "";
         }
         this.debugDiv.appendChild(document.createTextNode(new Date() + " " +  message));
         this.debugDiv.appendChild(document.createElement('br'));     
       } else
       {
          this.debugInfo += message + " / ";
          //alert(message);
       }
       //document.write(message);
    }

    this.displayStateInfo = function displayStateInfo( message)
    {    
          
       if (this.stateDiv != null)
       { 
         this.stateDiv.innerHTML = message;
       }   
    }

    // callback from flash when debug info from flash player should be displayed
    this.displayFlashDebugInfo = function displayFlashDebugInfo( message)
    {
      
       if (this.flashDebugDiv != null)
       {
          this.flashDebugDiv.appendChild(document.createTextNode(message));
          this.flashDebugDiv.appendChild(document.createElement('br'));      
       }
    }

    this.displayFlashStateInfo = function displayFlashStateInfo( message)
    {    
       if (this.flashStateDiv != null)
       {
          this.flashStateDiv.innerHTML = message;      
       }
    }

    this.MakeDebugDiv = function MakeDebugDiv(divNo)
    {
        var top = 550 + (400 * divNo);
        var top2 = top + 200;        
  
        return "<div id=\"stateDiv" + this.id + "\" style=\"text-align:left;position:absolute;z-index:10000;top:" + top + "px;left:0px;width:200px;height:200px;overflow:scroll;background-color:#ebebeb\" ><b>debug info for " + this.id + ":</b><br /></div>" +
                               "<div id=\"debugDiv" + this.id + "\" style=\"text-align:left;position:absolute;z-index:10000;top:" + top + "px;left:200px;height:200px;overflow:scroll;background-color:#ebebeb\" ><b>debug info for " + this.id + ":</b><br /></div>" +
                               "<div id=\"flashStateDiv" + this.id + "\" style=\"text-align:left;position:absolute;z-index:10000;top:" + top2 + "px;width:200px;left:0px;height:200px;overflow:scroll;background-color:#bbbbbb\" ><b>flash debug info:</b><br /> </div>" +
                               "<div id=\"flashDebugDiv" + this.id + "\" style=\"text-align:left;position:absolute;z-index:10000;top:" + top2 +  "px;left:200px;height:200px;overflow:scroll;background-color:#bebebe\" ><b>flash debug info:</b><br /> </div>";
    }

    if (debugMode)
    {
        GlobalDebugInfo("Creating debug div #" + players.length);
   
        //this.outDiv.innerHTML = this.MakeDebugDiv(players.length);        
        var div = document.createElement('div');
        div.innerHTML = this.MakeDebugDiv(players.length);                       
        document.childNodes[document.childNodes.length-1].appendChild(div);
        
        this.rebuildDebugDivs = function RebuildDebugDivs()
        {
            this.debugDiv = document.getElementById("debugDiv" + this.id);
            this.flashDebugDiv = document.getElementById("flashDebugDiv" + this.id);
            this.flashStateDiv = document.getElementById("flashStateDiv" + this.id);
            this.stateDiv = document.getElementById("stateDiv" + this.id);
        }

        this.rebuildDebugDivs();  
    } else
        this.outDiv.innerHTML = "";                   
           
    
    this.updateState = function updateState()
    {
        
        //this.displayDebugInfo("updateState()");    
       //this.displayDebugInfo("updateState() " + this.selectedElemId );    
       
        //var img = document.getElementById("img_tr" + selectedTrack);
    
        if (this.selectedElemId != null)
        {
            
            this.displayDebugInfo("Finding image button: img_" + this.selectedElemId + " for state=" + this.selectedTrackState); 
            
            var img = document.getElementById("img_" + this.selectedElemId);
            if (img == null)
            {
               //img = document.getElementById("ctl00_ContentPlaceHolder1_imgPlayPause");
               this.displayDebugInfo("Image not found, finding static image button"); 
               //img = document.getElementById("ctl00_m_contentBody_imgPlayPause");
               img = document.getElementById("imgPlayPause");
            }
            if (img != null)     
            {      
              
              var image = "";
              switch (this.selectedTrackState)
              {
                case state_loadingjobinfo: image = "player_loading.gif"; break;
                case state_loadingtrackinfo: image = "player_loading.gif"; break;
                case state_loading: image = "player_loading.gif"; break;
                case state_playing: image = "player_pause.gif"; break;
                case state_paused: image = "player_play.gif"; break;
                case state_stopped: image = "player_play.gif"; break;        
                default: image = "player_play.gif"; break;
              }      
              if (image != "")
              {
                if (playButtonPicture != image)
                {            
                    this.displayDebugInfo("Updating PlayButton " + this.selectedElemId + " to: " + ImagePath() + image + " - was: " + playButtonPicture + " state=" + this.selectedTrackState );      
                    playButtonPicture = image;
                    img.src = ImagePath() + image;
                }
              }      
            } //else
             // displayDebugInfo("updateState: image not found");          
                        
        }            
        this.displayStateInfo("state=" + stateString(this.selectedTrackState) + "<br>" + this.trackTime + "<br>track=" + this.selectedTrack);      
        
    }

    
    //function MakePlayerEx(outDiv, Id, MusicSource, TestHistoryId, TrackTesterId, Tracks, TTURL, DebugString, SiteCulture, FlashPlayer, ExtraParams, Width, Height, BgColor)
    this.build = function Build()
    {     
             
       this.displayDebugInfo("player.Build()");    
       
       var paramStr = "";
       var UseCheckPlayer = false;
       var UseSWFObject = false;
       var noCache = false;
       
       if (UseSWFObject || UseCheckPlayer)
       {
         if ((Height==0) && (Width==0))
         {
           Width=1;
           Height=1;
         }
       }
       
       this.displayDebugInfo("MakePlayerEx begin");    
       this.updateState();
          
      // object version
       //var flashpath = "../flash/";            
       var flashpath = "";
       
       var playerStr = "<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0\" width=\"" + this.Width + "\" height=\"" + this.Height + "\" id=\"ttPlayer" + this.id + "\" align=\"middle\">" +
                "<param name=\"allowScriptAccess\" value=\"always\" />" +
                //"<param name=\"allowScriptAccess\" value=\"sameDomain\" />" +
                //"<param name=\"movie\" value=\"" + flashplayer + "?TestHistoryId=" + TestHistory.Id.ToString() + "&TrackTesterId=" + TestHistory.TrackTester.Id.ToString() + "\" /><param name=\"quality\" value=\"high\" /><param name=\"bgcolor\" value=\"#000000\" /><embed src=\"" + flashplayer + "?TestHistoryId=" + TestHistory.Id.ToString() + "&TrackTesterId=" + TestHistory.TrackTester.Id.ToString() + "\" quality=\"high\" bgcolor=\"#000000\" width=\"400\" height=\"450\" name=\"ttPlayer\" align=\"middle\" allowScriptAccess=\"sameDomain\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" />" +
                "<param name=\"movie\" value=\"" + flashpath + this.FlashPlayer + "?";
       
       paramStr += "PlayerId=" + this.id;
       paramStr += 
              "&TTURL=" + this.TTURL;
       paramStr += 
              "&MusicSource=" + this.MusicSource;
       paramStr += 
              "&PlayMode=" + this.PlayMode;       
       paramStr += 
              "&CustomerId=" + this.CustomerId;
       paramStr += 
              "&SecurityToken=" + this.SecurityToken;
                     
       
       if (noCache)
          paramStr += "&guid=" + Math.random()*99999999;
                   
       if ((this.PlayModeType == pmPlaylistStatic) && (this.Tracks != null))
       {      
          paramStr += "&TrackPlayList1=" + this.Tracks;            
          paramStr += "&TrackPlayListCount=1";                      
                    /*
          var i = 0;
          var p = 0;
          while (t.length > 500)          
          {
             p++;             
             i = t.indexOf( ",", 450);
             paramStr += "&TrackPlayList" + p + "=" + t.substring(0,i); 
             t = t.substring(i+1);                         
             break;
          } 
                                      
          //p++;             
          //paramStr += "&TrackPlayList" + p + "=" + t; 
          paramStr += "&TrackPlayListCount=" + p;                    
          */

          
          /*paramStr += "&AutoSkip=1";
          paramStr += "&AutoPlay=1";
          paramStr += "&PlayFullTrack=1";*/
          this.setPlaylistTracks(this.Tracks);          
       }
       
       if (this.SiteCulture != null)
          paramStr += "&SiteCulture=" + this.SiteCulture; 
             
       paramStr += 
                this.DebugString + 
                this.ExtraParams;
          
       playerStr += "&" + paramStr + 
                "\" />" + 
                "<param name=\"quality\" value=\"high\" />" + 
                "<param name=\"bgcolor\" value=\"" + this.BgColor + "\" />";             
       // embedded version
       playerStr += "<embed src=\"" + flashpath + this.FlashPlayer;
              
       playerStr += "?"  + paramStr + 
                "\" quality=\"high\" bgcolor=\"" + this.BgColor+ "\" width=\"" + this.Width + "\" height=\"" + this.Height + "\" name=\"ttPlayer" + this.id + "\" align=\"middle\" allowScriptAccess=\"always\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" />" +
                
                "</object>";   
       
        if (UseSWFObject)
        {
       
          // SWFObject version   
          var flashvars = false;
          var params = {  flashvars: paramStr};
          var attributes = {  id: "ttPlayer" + this.id,  name: "ttPlayer" + this.id};      
          FlashPlayer+= "?guid=" + Math.random()*99999999;
          swfobject.embedSWF(flashpath + this.FlashPlayer, this.outDiv.id, this.Width, this.Height, "1.0.0", flashpath + "expressInstall.swf", flashvars, params, attributes);
          this.displayDebugInfo("SWFObject params: player=" + flashpath + this.FlashPlayer + " div=" + this.outDiv.id + "  params=" + paramStr);      
          
          //window.ttPlayer = document.getElementById("ttPlayer");

          //SWFFormFix("ttPlayer");
        } else               
        if (UseCheckPlayer)
        {
           this.displayDebugInfo("Using CheckPlayer");    

          // CheckPlayer version   
          this.displayDebugInfo("CheckPlayer params: player=" + flashpath + this.FlashPlayer + " div=" + this.outDiv.id + "  params=" + paramStr);            
    //      var check = new flensed.checkplayer("8.0.0",checkCB,true,updateCB);
          
          //window.ttPlayer = document.getElementById("ttPlayer");
        } else               
        {
           this.displayDebugInfo("Using default player (" + this.id + ")");    
       
           if (this.outDiv == null)
              this.displayDebugInfo("outDiv is null");    
           this.outDiv.innerHTML += playerStr;
           if (debugMode)
              this.rebuildDebugDivs();
           try
           {                      
             //this.flashPlayer = document.getElementById("ttPlayer" + this.id);       
             this.flashPlayer = getFlashPlayer(this.id);
             window.ttPlayer = this.flashPlayer;
             this.displayDebugInfo("Newly inserted flash player object: " + this.flashPlayer);                    
                                      
           } catch(err)
           {
           
             this.displayDebugInfo("error in getting player: " + err.message);    
           
             //alert(err.description)
             this.outDiv.innerHTML += playerStr;
             
             this.flashPlayer = getFlashPlayer(this.id);
             //this.flashPlayer = document.getElementById("ttPlayer" + this.id);       
             
             window.ttPlayer = this.flashPlayer;
             
           }
           this.displayDebugInfo(playerStr);
        }
        this.displayDebugInfo("MakePlayerEx end");    
        
        return 0;
        //return playerStr;    
    }

    /*
            function checkCB(checkObj) {
                if (checkObj.checkPassed) {
	                var flashvars = {};
	                var params = {allowScriptAccess:"always", menu:"false", scale:"noscale"; flashvars: paramStr };
	                var attributes = { id:"ttPlayer", name:"ttPlayer" };
	                var swfoptions = { swfCB:DoSWFCB, swfEICheck:"SetMyName" };
          
	                checkObj.DoSWF(flashpath + FlashPlayer, outDiv.id, Width, Height, flashvars, params, attributes, swfoptions);
                }
            }

            function updateCB(checkObj) {
                if (checkObj.updateStatus == flensed.checkplayer.UPDATE_CANCELED) {
	                flensed.getObjectById("ttPlayer").style.visibility = "visible";
	                alert("Update canceled.");
                }
                else if (checkObj.updateStatus == flensed.checkplayer.UPDATE_FAILED) {
	                flensed.getObjectById("ttPlayer").style.visibility = "visible";
	                alert("Update failed. Current version detected:"+checkObj.playerVersionDetected);
                }
            }

            function DoSWFCB(loadStatus) {
                if (loadStatus.status == flensed.checkplayer.SWF_LOADING) {
	                loadStatus.srcElem.style.visibility = "visible";
                }
                else if (loadStatus.status == flensed.checkplayer.SWF_LOADED) {
	                alert("SWF:"+loadStatus.srcId+" Loaded Successfully!");
                }
                else if (loadStatus.status == flensed.checkplayer.SWF_EI_READY) {
	                loadStatus.srcElem.SetMyName("Guest");
                }
            }
    */

    



    




    // playlist functions

    this.selectedTrack = null;
    this.selectedTrackState = state_none;
    this.trackTime = "Time not updated";
    this.selectedElemId = null;
    this.playlistTracks = new Array();
    this.flashPlayer = null;
    this.doHighlight = false;
    this.doHighlightSelected = false;

    // set playlist to list of track id's
    this.setPlaylistTracks = function setPlaylistTracks(tracks)
    {
        this.displayDebugInfo("Loading playlist: " + tracks);            
        //flashPlayer = getFlashPlayer();
        this.playlistTracks = tracks;      
        
        // set playlist in flash for navigation
        //flashPlayer.setPlaylistTracks(tracks); 
    }
     

    this.setSelectedTrackState = function setSelectedTrackState(state)
    {
        
        //this.displayDebugInfo("setSelectedTrackState: " + state);      
        
        this.selectedTrackState = state;    
        this.updateState();      
    }


    this.PlayModeType = pmNone;
    this.PlayMode = "";
        
    // callback from flash when intro has been loaded 
    this.introLoaded = function introLoaded()
    {
        this.displayDebugInfo("Intro was loaded in flash");            
    }

    // callback from flash when message should be displayed
    this.displayBrowserMessage = function displayBrowserMessage( message)
    {
       alert(message);
    }
    
    // callback from flash when track rating has completed
    this.soundbiteCompletedRating = function soundbiteCompletedRating(track)
    {
        displayDebugInfo("Soundbite completed rating inside flash");      
        
        // set checkmark by track    
        this.selectTrack('', null, track, false, state_ratecompleted);    
        
        //setSelectedTrackState( state_ratecompleted);    
        
    }

    this.trackCompletedRating = function trackCompletedRating(track)
    {
        this.displayDebugInfo("Track completed rating inside flash");      
        
        // set checkmark by track    
        this.selectTrack('', null, track, false, state_ratecompleted);    
        
        //setSelectedTrackState( state_ratecompleted);    
        
    }

    // callback from flash when test has completed
    this.testjobCompleted = function testjobCompleted(testhistory)
    {
        this.displayDebugInfo("Test completed inside flash");  
        // load next track    
        
    }

    // callback from flash when test has completed
    this.testgroupCompleted = function testgroupCompleted()
    {
        displayDebugInfo("Test group completed inside flash");     
        this.setSelectedTrackState( state_paused);    
    }



    // callback from flash when playlist is done    
    this.playlistCompleted = function playlistCompleted()
    {
        this.displayDebugInfo("Playlist completed inside flash");  
    }



    // callback from flash when track has finished playing
    this.trackStopped = function trackStopped(track)
    {
        this.displayDebugInfo("Track stopped inside flash: " + track);  
        this.setSelectedTrackState( state_stopped);    
        //clearSelectedTrack();
    }

    // callback from flash when track has paused playing
    this.trackPaused = function trackPaused(track)
    {
        this.displayDebugInfo("Track paused inside flash: " + track);  
        this.setSelectedTrackState( state_paused);    
        
    }

    // callback from flash when track has resumed playing
    this.trackResumed = function trackResumed(track)
    {
        this.displayDebugInfo("Track resumed inside flash: " + track);  
        this.setSelectedTrackState( state_playing);
    }



    this.trackCheckingInfo = function trackCheckingInfo(track)
    {
        this.displayDebugInfo("Checking if track has been rated inside flash: " + track);      
        if (track == undefined)
        {
           this.displayDebugInfo("trackCheckingInfo: track is undefined");       
           return;
        }    

        this.selectTrack('', null, track, false, state_loadingtrackinfo);        
    }

    this.trackLoadingInfo = function trackLoadingInfo(track)
    {
        this.displayDebugInfo("Track info loading inside flash: " + track);      
        if (track == undefined)
        {
           this.displayDebugInfo("trackLoadingInfo: track is undefined");       
           return;
        }    

        this.selectTrack('', null, track, false, state_loadingtrackinfo);    
    }


    // callback from flash when track has started playing
    this.trackLoading = function trackLoading(track)
    {
        this.displayDebugInfo("Track loading inside flash: " + track);      
        if (track == undefined)
        {
           this.displayDebugInfo("trackLoading: track is undefined");       
           return;
        }    
           
        this.selectTrack('', null, track, false, state_loading);    
    }

    this.trackLoadedInfo = function trackLoadedInfo(track, artist, intro, countryid, genre )
    {        
        this.displayDebugInfo("Track info loaded inside flash: track=" + track + " artist=" + artist + " intro=" + intro + " countryid=" + countryid );      
        if (artist == undefined)
        {
           this.displayDebugInfo("trackLoadedInfo: artist is undefined");       
           return;
        }    
        if (genre == undefined)
        {
           this.displayDebugInfo("trackLoadedInfo: genre is undefined");       
           return;
        }    
        if (genre == countryid)
        {
           this.displayDebugInfo("trackLoadedInfo: countryid is undefined");       
           return;
        }  
        var img = document.getElementById("imgProfilePicture");
        if (img != null)
          img.src = rootPath() + "ArtistPicture.aspx?id=" + artist + "&image=ProfilePicture.jpg";        
        img = document.getElementById("imgFlag");
        if (img != null)    
            img.src = rootPath() + "images/flags/" + countryid + ".png";        
        var span = document.getElementById("divGenre");
        if (span != null)
          span.innerHTML = "Genre: " + genre;    
        
        span = document.getElementById("divCountryName");
        if (span != null)
          span.innerHTML = "Country: " + countryid;    
        var span = document.getElementById("divGenreCountry");
        if (span != null)
          span.innerHTML = genre + " from " + countryid;    
              
        span = document.getElementById("divIntro");
        if (span != null)    
        {
          if (intro != "null")
            span.innerHTML = intro;
          else
            span.innerHTML = "No introduction";
         }
         
    }

    this.testjobLoadingInfo = function testjobLoadingInfo(playerId,testhistory)
    {
        this.displayDebugInfo("TestJob info loading inside flash: " + testhistory);      
        this.selectTrack('', null, null, false, state_loadingjobinfo);    
    }

    // callback from flash when track has started playing
    this.trackPlaying = function trackPlaying(track)
    {
        this.displayDebugInfo("Track started playing inside flash: " + track);  
        if (track == "undefined")
        {
           this.displayDebugInfo("trackPlaying: track is undefined (string)");       
           return;
        }    

        this.selectTrack('', null, track, false, state_playing);    
    }


    // callback from flash when time is updated (every second)
    this.trackTimeUpdated = function trackTimeUpdated(timetext)
    {
       this.trackTime = timetext;
      
        //displayDebugInfo("Time updated from flash: " + timetext);      
       var elem = document.getElementById("divTime");
       if (elem != null)
       {   
         if ((timetext != null) && (timetext != "null"))
            elem.innerHTML = timetext;      
         else
         {
           //elem.innerHTML = "";                   
           this.displayFlashDebugInfo("timeText was null");
         }
       }
       //this.updateState();
    }

    // callback from flash when volume is adjusted
    this.volumeControlAdjusted = function volumeControlAdjusted(volumeLevel)
    {
        this.displayDebugInfo("Volume adjusted inside flash");      
    }

    this.setVolume = function setVolume(volumeLevel)
    {
        this.flashPlayer.setVolume(volumeLevel); 
    }

    this.getVolume = function getVolume()
    {
        return this.flashPlayer.getVolume(); 
    }
    
    
    this.playPause = function playPause()
    {
      this.displayDebugInfo("playPause: current selected track=" + this.selectedTrack);  
      if (this.selectedTrack == null)
      {
        if (this.playlistTracks != null)
        {
            this.tracklist = this.playlistTracks.split(","); 
            this.displayDebugInfo("playPause: playing track: " + this.tracklist[0]);  
            this.selectTrack(this.id, null, this.tracklist[0], true, state_playing);           
        }
      } else
      { 
        if (this.selectedTrackState == state_playing) 
            this.selectTrack(this.id, null, this.selectedTrack, true, state_paused);
        else
            this.selectTrack(this.id, null, this.selectedTrack, true, state_playing);
       }
    }
    this.stopPlayer = function stopPlayer()
    {
      this.displayDebugInfo("stopPlayer: current selected track=" + this.selectedTrack);  
      if (this.selectedTrack != null)
      { 
         this.selectTrack(this.id, null, this.selectedTrack, false, state_stopped);
      }
    }

    this.skipVote = function skipVote()
    {
        this.displayDebugInfo("skipVote: current selected track=" + this.selectedTrack);  
        this.flashPlayer.skipVote();      
    }
    
    
    this.clearSelectedTrack = function clearSelectedTrack()
    {
    
        if (this.selectedTrack!=null)
        {
    
            //displayDebugInfo("clearSelectedTrack: selectedElemId=" + selectedElemId);  
        
            // remove highlight of previously selected track        
            if (this.doHighlightSelected)
                if (this.selectedElemId != null)
                    document.getElementById(this.selectedElemId).style.backgroundColor = "#ffffff";
            //alert(selectedTrack);
            //if (document.getElementById("img_tr" + selectedTrack) == null)
    //          alert("img_tr" + selectedTrack + " is null");
            var img = document.getElementById("img_" + this.selectedElemId);
            if (img == null)
                img = document.getElementById("ctl00_ContentPlaceHolder1_imgPlayPause");
            if (img != null)
                img.src = ImagePath() + "player_play.gif";
    
            var trackRow;
            if (this.selectedTrack != null)
            {
                trackRow = document.getElementById("trackRow" + this.selectedTrack);
                if (trackRow != null)
                {            
                    if (trackRow.className != "listentrackrated")
                        trackRow.className = "listentrack";                
                    this.displayDebugInfo("new className: " + trackRow.className);                    
                }
            }                
    
            this.displayDebugInfo("clearSelectedTrack: Cleared selected track: " + this.selectedTrack);  
            this.selectedTrack = null;
            this.setSelectedTrackState( state_none);
            this.selectedElemId = null;               
        }   
            else     
                this.displayDebugInfo("clearSelectedTrack: selectedTrack is null");  
        
        }

    this.playAll = function playAll()
    {    
        this.displayDebugInfo("playAll (" + this.id + ")");      
        if ((selectedPlayerId != null) && (selectedPlayer != this) && (this.selectedTrackState == state_playing))
        {                
		   displayDebugInfo("selectTrack: Stopping other player: " + selectedPlayer + " (" + selectedPlayer.id + ")");      
           flashPlayer = getFlashPlayer(selectedPlayerId);
           if (flashPlayer != null)
               flashPlayer.pauseTrack(selectedTrack);	       	         
        }  
        
        this.clearSelectedTrack();

        selectedPlayer = this;
        selectedPlayerId = this.id;

        var flashPlayer = getFlashPlayer(this.id);
        if (flashPlayer != null)
        {
            flashPlayer.playAll();        
        } 

    }


    var playButtonPicture = "";

    
    this.selectTrack = function selectTrack(player, elemId, track, startPlay, state)
    {
	    this.displayDebugInfo("selectTrack (" + this.id + ")");      
        
        //if (elemId == undefined)
    //      displayDebugInfo("selectTrack: elemId is undefined");       

        var oldTrackState = this.selectedTrackState;
        var oldTrack = this.selectedTrack;
        var flashPlayer = null;
        
        if (this.PlayModeType == pmPlaylistStatic)
        {   
        
            var doStopOther = false;
                
            if ((selectedPlayer != null) && (selectedPlayerId != player))
            {
               if (oldTrackState == state_playing)
                 doStopOther = true;
                 
               // click event
               if ((elemId != null) && (oldTrackState == state_loading))
                 doStopOther = true;                                  
            }
              
            if (doStopOther)
            {
                this.displayDebugInfo("selectTrack: stopping other player");      
                flashPlayer = getFlashPlayer(selectedPlayerId);
                if (flashPlayer != null)
                {
                    this.displayDebugInfo("calling stopTrack()");      
                
                    flashPlayer.stopTrack(oldTrack);
                    this.displayDebugInfo("called stopTrack()");      
                
                }
                else
                    this.displayDebugInfo( "selectTrack: Music player " + selectedPlayerId + " not found");
                this.displayDebugInfo("clearing");      
                
                this.clearSelectedTrack();
                oldTrackState = null;
                oldTrack = null;
            } else
            if (track != this.selectedTrack)
            {
                this.displayDebugInfo("clearing current playing track");      
                this.flashPlayer.stopTrack();
                this.clearSelectedTrack();                               
            }
            
            
        }
        
        if ((elemId == null) && (this.selectedElemId == null) && (this.selectedTrack != null))
        {
           elemId = "tr" + this.selectedTrack;
        }
        
        this.displayDebugInfo("selectTrack: Track selected in playlist: " + track + " elemid=" + elemId + " startPlay=" + startPlay + " state=" + stateString(state) + " player: " + player);      
        this.displayDebugInfo("selectTrack: Old track selected in playlist: " + oldTrack + " Old state=" + stateString(oldTrackState) + " old player=" + selectedPlayerId);      
            
        this.selectedTrack=track;   
        if (elemId != null)
            this.selectedElemId = elemId;
        
	    this.setSelectedTrackState( state);	        
    
        // todo: stop all other players
        for (var i=0;i<players.length;i++)
        {
           this.displayDebugInfo( "selectTrack: other player state: " + players[i].id + "=" + players[i].selectedTrackState);
           
           if (players[i] != this)      
              if (players[i].selectedTrackState == state_playing)
              { 
                 this.displayDebugInfo( "selectTrack: stopping other player: " + players[i].id );
                 players[i].flashPlayer.stopTrack();
              }        
        }
    	   	
            
        // pause track
        var doPauseThis = false;
        
        if (player==selectedPlayerId)
        {
          if (oldTrack == track)
          {
               if (oldTrackState == state_playing)
                 doPauseThis = true;
                 
               if (elemId != null)
                 if (oldTrackState == state_loading)
                   doPauseThis = true;
          }            
        }
        if (doPauseThis)
        {

            this.displayDebugInfo( "selectTrack: same track, pausing");
            if (state == state_stopped)
            {
                flashPlayer = getFlashPlayer(selectedPlayerId);
                if (flashPlayer != null)
	                flashPlayer.stopTrack(track);
	            else
	                this.displayDebugInfo( "selectTrack: Music player " + selectedPlayerId+ " not found");
            
            } else
                            
            if (startPlay)
            {
                /*
                var img = document.getElementById("img_tr" + track);
                 if (img != null)
                {
                    displayDebugInfo("selectTrack: changing image: " + "img_tr" + track);          
                    img.src = ImagePath() + "player_play.gif";        
                }
                else
                {
                    var img = document.getElementById("ctl00_ContentPlaceHolder1_imgPlayPause");
                    if (img != null)
                    {
                        displayDebugInfo("selectTrack: changing image: " + "imgPlayPause");          
                        img.src = ImagePath() + "player_play.gif";        
                    } else            
                        displayDebugInfo("selectTrack: image not found: " + "img_tr" + track);          
                }
                */
                this.displayDebugInfo("selectTrack: Pausing track in flash");          
                
                
                flashPlayer = getFlashPlayer(player);
                if (flashPlayer != null)
	                flashPlayer.pauseTrack(track);
	            else
	                this.displayDebugInfo( "selectTrack: Music player " + player + " not found");
            
            }
        }
        else    
        {
            
            // play or resume track
            var doResume = false;
            if ((oldTrack == track) && (oldTrackState == state_paused))
              doResume = true;        
            this.displayDebugInfo("selectTrack (" + player + "): Setting state to playing (startPlay=" + startPlay + ", doResume=" + doResume + ", oldTrack=" + oldTrack + ", track=" + track + ")");          
            
            //clearSelectedTrack();
            /*
            var img = document.getElementById("img_tr" + track);
            if (img == null)
               img = document.getElementById("ctl00_ContentPlaceHolder1_imgPlayPause");
            if (img != null)     
            {
                displayDebugInfo("selectTrack: found image");          
            
              if (state == state_loading)        
                img.src = ImagePath() + "player_loading.jpg";
              else
                img.src = ImagePath() + "player_pause.gif";
            } else
              displayDebugInfo("selectTrack: image not found");          
            */
            
            this.displayDebugInfo("1");                     
	        
			if (player != "")
				if ((selectedPlayerId != null) && (selectedPlayerId != player) && (oldTrackState == state_playing))
            {
                                  
			   this.displayDebugInfo("selectTrack: Stopping other player: " + selectedPlayer + " (" + selectedPlayer.id + ")" + " new player: " + player);      
               flashPlayer = getFlashPlayer(selectedPlayerId);
               if (flashPlayer != null)
	               flashPlayer.pauseTrack(track);	       	         
            }  
            this.displayDebugInfo("2");                     
	           
            // plays the track        
            if (startPlay)
            {                        
                this.displayDebugInfo("finding player: " + player);                     
	        
                flashPlayer = getFlashPlayer(player);
                this.displayDebugInfo("4");                     
	        if (flashPlayer != null)
                {
                this.displayDebugInfo("5");                     
	        
                    if (doResume)
                    {
                        this.displayDebugInfo("selectTrack: Resuming track in flash");                     
	                    flashPlayer.resumeTrack(track);
	                    
	                }
	                else
	                {
	                    this.displayDebugInfo("selectTrack: Playing track in flash");                     
	                    flashPlayer.playTrack(track);	                    
	                }
    	            
	            } else
	                this.displayDebugInfo( "selectTrack: Music player " + player + " not found");
	                
	        }
	        
	        if (this.doHighlightSelected)
	        {
                document.getElementById(elemId).style.backgroundColor = "#ebebeb";	
            }
	    }
    	selectedPlayer = this;
    	
    	selectedPlayerId = this.id;
    	this.displayDebugInfo("new selectedPlayer: " + selectedPlayerId);
            
	    //if ((player != null) && (player != ''))
//	      selectedPlayer = player;
    	
	    var trackRow = document.getElementById("trackRow" + oldTrack);
        if ((trackRow != null) && (oldTrack != track))
        {
            var trackSpanCompleted = document.getElementById("spanTrackCompleted" + oldTrack);
            if (trackSpanCompleted != null)
                 trackSpanCompleted.innerHTML = "<img src='" + ImagePath() + "checkmark.gif' />";
            trackRow.className = "listentrackrated";         
            displayDebugInfo("new className for old track " + oldTrack + " : " + trackRow.className);
                    
            var anchorTrack = document.getElementById("anchorTrack" + oldTrack);
            var nPos = 0;
            if (anchorTrack != null)
               nPos = anchorTrack.offsetParent.offsetTop;                    
            var divTrackList = document.getElementById("divTrackList");
            if (divTrackList != null)
               divTrackList.scrollTop = nPos;               
        }
        
	    trackRow = document.getElementById("trackRow" + this.selectedTrack);
        if (trackRow != null)
        {
           
           if (state == state_ratecompleted)
           {
             var trackSpanCompleted = document.getElementById("spanTrackCompleted" + this.selectedTrack);
             if (trackSpanCompleted != null)
               trackSpanCompleted.innerHTML = "<img src='" + ImagePath() + "checkmark.gif' />";
             trackRow.className = "listentrackrated";         
           }
           else
           {
             trackRow.className = "listentrackselected";
             if (OnTrackSelected)
                OnTrackSelected(this);    	                   
           }
           this.displayDebugInfo("new className for current track " + this.selectedTrack + " : " + trackRow.className);
    	   
    	   
        } 
        	
    	
	    this.displayDebugInfo("selectTrack: new selectedTrack=" + this.selectedTrack)    
	    //displayDebugInfo("selectTrack: new elemId=" + elemId  + " new selectedTrack=" + selectedTrack)    
            
    	
        
    }
}

    /* external callback functions from flash */

    // callback from flash when player has loaded
    function flashLoaded(playerId, buildNo)
    {
        displayDebugInfo(playerId, "Flash callback successful from player " + playerId + ": Build " + buildNo);                
        /*
        try
        {
            displayDebugInfo(playerId, "testing flash JavaScript...");                    
            if (getPlayer(playerId).initializePlayer())
               displayDebugInfo(playerId, "initializePlayer succeded");                    
            else
               displayDebugInfo(playerId, "initializePlayer failed - DOM may not be finished with loading");                                                 
        }
        catch(err)
        {
            displayDebugInfo(playerId, "initializePlayer failed: " + err.message);    
        }*/

    }

    // callback from flash when intro has been loaded 
    function introLoaded(playerId)
    {
        getPlayer(playerId).introLoaded();       
    }

    // callback from flash when message should be displayed
    function displayBrowserMessage( playerId,message)
    {
       getPlayer(playerId).displayBrowserMessage(message);              
    }
    
    // callback from flash when track rating has completed
    function soundbiteCompletedRating(playerId,track)
    {
       getPlayer(playerId).soundbiteCompletedRating(track);
    }

    function trackCompletedRating(playerId,track)
    {
        getPlayer(playerId).trackCompletedRating(track);               
    }

    // callback from flash when test has completed
    function testjobCompleted(playerId,testhistory)
    {
        getPlayer(playerId).testjobCompleted(testhistory);       
    }

    // callback from flash when test has completed
    function testgroupCompleted(playerId)
    {
        getPlayer(playerId).testgroupCompleted();
    }

    // callback from flash when playlist is done    
    function playlistCompleted(playerId)
    {
        getPlayer(playerId).playlistCompleted();
    }

    // callback from flash when track has finished playing
    function trackStopped(playerId,track)
    {
        getPlayer(playerId).trackStopped(track);       
    }

    // callback from flash when track has paused playing
    function trackPaused(playerId,track)
    {
        getPlayer(playerId).trackPaused(track);              
    }

    // callback from flash when track has resumed playing
    function trackResumed(playerId,track)
    {
        getPlayer(playerId).trackResumed(track);       
    }

    function trackCheckingInfo(playerId,track)
    {
        getPlayer(playerId).trackCheckingInfo(track);
    }

    function trackLoadingInfo(playerId,track)
    {
        getPlayer(playerId).trackLoadingInfo(track);
    }

    // callback from flash when track has started playing
    function trackLoading(playerId,track)
    {
        getPlayer(playerId).trackLoading(track);
    }

    function trackLoadedInfo(playerId,track, artist, intro, countryid, genre )
    {
        getPlayer(playerId).trackLoadedInfo(track, artist, intro, countryid, genre);       
    }

    function testjobLoadingInfo(playerId,testhistory)
    {
        getPlayer(playerId).testjobLoadingInfo(testhistory);
    }

    // callback from flash when track has started playing
    function trackPlaying(playerId,track)
    {
        getPlayer(playerId).trackPlaying(track);       
    }

    // callback from flash when time is updated (every second)
    function trackTimeUpdated(playerId,timetext)
    {
        getPlayer(playerId).trackTimeUpdated(timetext);
    }

    // callback from flash when volume is adjusted
    function volumeControlAdjusted(playerId,volumeLevel)
    {
        getPlayer(playerId).volumeControlAdjusted(volumeLevel);       
    }
        
    function displayFlashDebugInfo( playerId, message)
    {
//        alert(playerId + "," + message);
        getPlayer(playerId).displayFlashDebugInfo(message);
    }

    function displayDebugInfo( playerId, message)
    {
//        alert(playerId + "," + message);
        getPlayer(playerId).displayDebugInfo(message);
    }


    /* global functions */
    function selectTrack(playerId, elemId, track, startPlay, state)
    {               
        getPlayer(playerId).selectTrack(playerId, elemId, track, startPlay, state);
    }
      
    function playAll(playerId)
    {    
        getPlayer(playerId).playAll();        
    }
  
    function playPause(playerId)
    {    
        getPlayer(playerId).playPause();        
    }

    function skipVote(playerId)
    {    
        getPlayer(playerId).skipVote();        
    }


    function mouseOverTrack(elemId, track)
    {
        //displayDebugInfo("Track mouseover: " + track);  
        if (selectedTrack==track)
	    {
	        // just ignore if already selected
	    } else	
	    {
            // highlight item in html
            if (doHighlight)    
	            document.getElementById(elemId).style.backgroundColor = "#ebebeb";
	        //displayDebugInfo("mouseover");
	    }	
    }



    function mouseOutTrack(elemId, track)
    {
       // displayDebugInfo("Track mouseout: " + track);  
	    if (selectedTrack==track)
	    {
	        // just ignore if already selected 	    	    
	    }
	    else
	    {
	        // highlight track in flash player (if other tracks are displayed inside flash player)
	        // flashMovie('ttPlayer').highlightTrack(param);
    	    
	        // highlight item in html
	        if (doHighlight)    
	           document.getElementById(elemId).style.backgroundColor = "#ffffff";
	        //displayDebugInfo("mouseout");
        }	
    }

    
    function GlobalDebugInfo( message)
    {  
    /*
       var debugDiv = document.getElementById("debugDiv");
       if (debugDiv == null)
         return;
       if (debugDiv == undefined)
         return;
             
       debugDiv.appendChild(document.createTextNode(new Date() + " " +  message));
       debugDiv.appendChild(document.createElement('br'));     
      */        
    }
