home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 June / Chip_2004-06_cd1.bin / opsys / wmakeup / downloads / DTPM.wmz / text.js < prev    next >
Text File  |  2004-03-26  |  40KB  |  1,510 lines

  1. //Called when the player view is first loaded
  2. function On_Load()
  3. {
  4.     SetViewState();
  5.     RefreshSources();
  6.     RefreshGenres();
  7.     RefreshArtists();
  8.     RefreshAlbums();
  9.     SetStartState();
  10.     UpdateMetadata();
  11.     allMusicInfo.value = GeneratePlaylistSummary();
  12. }
  13.  
  14. function SetViewState()
  15. {
  16.     viewMode = theme.loadPreference("viewMode");
  17.     if ((viewMode != "--") &&
  18.         (viewMode != "Main"))
  19.     {
  20.         theme.currentViewID = viewMode;
  21.     }
  22. }
  23.  
  24. //Called when the player view is closed
  25. function On_Close()
  26. {
  27.     theme.savePreference("mainWidth", Main.width);
  28.     theme.savePreference("mainHeight", Main.height);
  29. }
  30.  
  31. function SetStartState()
  32. {
  33.     SetAlbumArtPanelState();
  34.     SetLeftPaneState();
  35.     SetBrowsePaneState();
  36.     //SetTimeState must occur before SetDisplayPanelState, 
  37.     //so that Time displays are shown or hidden correctly in bar display
  38.     SetTimeState();
  39.     SetDisplayPanelState();
  40.     SetVisualStartState();
  41.     SetMainState();
  42. }
  43.  
  44. function SetMainState()
  45. {
  46.     mainWidth = theme.loadPreference("mainWidth");
  47.     mainHeight = theme.loadPreference("mainHeight");
  48.     if (mainWidth.toUpperCase() != "--")
  49.     {
  50.         Main.width = mainWidth;
  51.     }
  52.     if (mainHeight.toUpperCase() != "--")
  53.     {
  54.         Main.height = mainHeight;
  55.     }
  56. }
  57.  
  58. //Called if the state of the current media source changes
  59. //Typically called when opening new media
  60. function OnOpenStateChange(NewState)
  61. {
  62.     if (NewState == 'MediaOpen')
  63.     {
  64.         UpdateMetadata();
  65.     }
  66. }
  67.  
  68. function OnPlayStateChange(NewState)
  69. {
  70.     if ((NewState == 1)||(NewState == 2)||(NewState == 3))
  71.     {
  72.         
  73.         if (player.currentMedia.ImageSourceWidth > 0)
  74.         {
  75.             ShowVisuals ();
  76.         }
  77.         else
  78.         {
  79.             if (!effectsView.visible)
  80.             {
  81.                 HideVisuals();
  82.             }
  83.             else
  84.             {
  85.                 ShowVisuals();
  86.             }
  87.         }
  88.     }
  89. }
  90.  
  91. function SetVisualStartState()
  92. {
  93.     visualisationVisible = theme.loadPreference("visualisationVisible");
  94.     if ((visualisationVisible.toUpperCase() == "FALSE") ||
  95.         (visualisationVisible.toUpperCase() == "--"))
  96.     {
  97.         HideVisuals();
  98.     }
  99.     else
  100.     {
  101.         ShowVisuals();
  102.     }
  103. }
  104.  
  105. function ShowVisuals ()
  106. {
  107.     playlistView.visible = false;
  108.     HideVisualizations.Visible = true;
  109.     ShowVisualizations.Visible = false;
  110.     if ((player.playState != 0) &&
  111.         (player.playState != 10) &&
  112.         (player.currentMedia.ImageSourceWidth > 0))
  113.     {
  114.         videoView.visible = true;
  115.         effectsView.visible = false;
  116.     }
  117.     else
  118.     {
  119.         videoView.visible = false;
  120.         effectsView.visible = true;
  121.         theme.savePreference("visualisationVisible", true);
  122.     }
  123. }
  124.  
  125. function HideVisuals ()
  126. {
  127.     playlistView.visible = true;
  128.     HideVisualizations.Visible = false;
  129.     ShowVisualizations.Visible = true;
  130.     if ((player.playState != 0) &&
  131.         (player.playState != 10) &&
  132.         (player.currentMedia.ImageSourceWidth > 0))
  133.     {
  134.         videoView.visible = false;
  135.         effectsView.visible = false;
  136.     }
  137.     else
  138.     {
  139.         videoView.visible = false;
  140.         effectsView.visible = false;
  141.         theme.savePreference("visualisationVisible", false);
  142.     }
  143. }
  144.  
  145. //Called if the player mode (shuffle, loop, etc.) changes 
  146. function OnModeChange(NewMode, NewValue) 
  147. {
  148.     if (NewMode == "shuffle")
  149.     {
  150.         shuffleOn.visible = NewValue;
  151.         shuffleOff.visible = !NewValue; 
  152.     }
  153.     else if (NewMode == "loop")
  154.     {
  155.         repeatOn.visible = NewValue;
  156.         repeatOff.visible = !NewValue; 
  157.     }
  158. }
  159.  
  160. //Update the sources when CD Media changes
  161. function CdromMediaChange(CdromNum)
  162. {
  163.     RefreshSources();
  164. }
  165.  
  166. //Update the sources when the playlist collection changes
  167. function PlaylistCollectionChange()
  168. {
  169.     RefreshSources();
  170. }
  171.  
  172. function MediaChange(Item)
  173. {
  174.     RefreshGenres();
  175.     RefreshArtists();
  176.     RefreshAlbums();
  177. }
  178.  
  179. function PlaylistUpdated()
  180. {
  181.     allMusicInfo.value = GeneratePlaylistSummary();
  182. }
  183.  
  184. function GeneratePlaylistSummary()
  185. {
  186.     var summary = "";
  187.     var allMedia = player.newPlaylist("", "");
  188.     allMedia = playlistView.playlist;
  189.     var fileSize = new Number();
  190.     var fileTime = new Number();
  191.     
  192.     //Iterate through all media in the current playlist view
  193.     for (var i =0; i < allMedia.count; i++)
  194.     {
  195.         //Retrieve the current item's size in bytes and time in seconds
  196.         thisSize = new Number (allMedia.item(i).getItemInfo("FileSize"));
  197.         thisTime = new Number(allMedia.item(i).getItemInfo("Duration"));
  198.         //Add these to the total size and total time
  199.         fileSize += thisSize;
  200.         fileTime += thisTime;
  201.     }
  202.     //Add the song count to the summary
  203.     summary = allMedia.count + " songs, ";
  204.     
  205.     //Calculate the number of days, hours, minutes and seconds in the playlist
  206.     days = Math.floor (fileTime/86400);
  207.     daysRemainder = fileTime%86400;
  208.     hours = Math.floor (daysRemainder/3600);
  209.     hoursRemainder = daysRemainder%3600;
  210.     minutes = Math.floor (hoursRemainder/60);
  211.     seconds = Math.floor(hoursRemainder%60);
  212.  
  213.     /*The following code produces the "real" iTunes datetime format of
  214.     4.9 (time period)*/
  215.     
  216.     //If the number of days is a positive integer, calculate the remaining fraction of days and add this to the summary
  217.     if (days > 0)
  218.     {
  219.         dayFraction = Math.round((hours*10)/24);
  220.         if (dayFraction < 10)
  221.         {
  222.             summary += days + "." + dayFraction + " days, "; 
  223.         }
  224.         else
  225.         {
  226.             summary += (days + 1) + " days, "; 
  227.         }
  228.     }
  229.     //Otherwise, if the number of hours is a positive integer, calculate the remaining fraction of hours and add this to the summary
  230.     else if (hours > 0)
  231.     {
  232.         hourFraction = Math.round((minutes*10)/60);
  233.         if (hourFraction < 10)
  234.         {
  235.             summary += hours + "." + hourFraction + " hours, ";
  236.         }
  237.         else
  238.         {
  239.             summary += (hours + 1) + " hours, ";
  240.         }
  241.     }
  242.     //Otherwise, if the number of minutes is a positive integer, calculate the remaining fraction of minutes and add this to the summary
  243.     else if (minutes > 0)
  244.     {
  245.         minuteFraction = Math.round((seconds*10)/60);
  246.         if (minuteFraction < 10)
  247.         {
  248.             summary += minutes + "." + minuteFraction + " minutes, "; 
  249.         }
  250.         else
  251.         {
  252.             summary += (minutes + 1) + " minutes, "; 
  253.         }
  254.     }
  255.     //Otherwise, add the seconds to the summary
  256.     else if (seconds > 0)
  257.     {
  258.         summary += seconds + "seconds, "; 
  259.     }
  260.     
  261.     /*
  262.     
  263.     The following commented section of code produces alternate datetime format of
  264.     (dd:hh:)mm:ss
  265.     
  266.     if (days > 0)
  267.     {
  268.         summary += days + ":";
  269.     }
  270.     
  271.     if ((days > 0) &&
  272.         (hours < 10))
  273.     {
  274.         summary += "0" + hours + ":";
  275.     }
  276.     else if (((days > 0) &&
  277.         (hours >=10)) ||
  278.         ((days == 0) &&
  279.         (hours > 0)))
  280.     {
  281.         summary += hours + ":";
  282.     }
  283.     
  284.     if ((hours > 0) &&
  285.         (minutes < 10))
  286.     {
  287.         summary += "0" + minutes + ":";
  288.     }
  289.     else
  290.     {
  291.         summary += minutes + ":";
  292.     }
  293.     
  294.     if (seconds < 10)
  295.     {
  296.         summary += "0" + seconds;
  297.     }
  298.     else
  299.     {
  300.         summary += seconds;
  301.     }
  302.     summary += " total time, ";*/
  303.     
  304.     //Calculate the GigaBytes, MegaBytes, and KiloBytes used by the current playlist
  305.     var gigabytes = Math.floor(fileSize/1073741824);
  306.     var gigabytesRemainder = fileSize%1073741824;
  307.     var megabytes = Math.floor(gigabytesRemainder/1048576);
  308.     var megabytesRemainder = gigabytesRemainder%1048576;
  309.     var kilobytes = Math.floor(megabytesRemainder/1024);
  310.     
  311.     //If the number of Gb is a positive integer, add it and it's fraction to the summary
  312.     if (gigabytes > 0)
  313.     {
  314.         summary +=  gigabytes + "." + megabytes.toString().substr(0,2) + "GB";
  315.     }
  316.     //Otherwise, if the number of Mb is a positive integer, add it and it's fraction to the summary
  317.     else if (megabytes > 0)
  318.     {
  319.         summary +=  megabytes + "." + kilobytes.toString().substr(0,2) + "MB";
  320.     }
  321.     //Otherwise, if the number of Kb is a positive integer, add it and it's fraction to the summary
  322.     else
  323.     {
  324.         summary +=  kilobytes + "KB";
  325.     }
  326.     
  327.     return summary;
  328. }
  329.  
  330. function ResizeBars()
  331. {
  332.     if ((bars.width-4)/2 <= 300)
  333.     {
  334.         leftBars.width = (bars.width-4)/2; 
  335.         rightBars.width = (bars.width-4)/2; 
  336.     }
  337.     else
  338.     {
  339.         leftBars.width = 300;
  340.         rightBars.width = 300;
  341.         
  342.     }
  343.     leftBars.left = ((bars.width-4)/2) - leftBars.width;
  344.     rightBars.left = bars.width - ((bars.width-4)/2);
  345. }
  346.  
  347. //Search the entire media collection and show the results in the playlist pane.
  348. function SearchBoxChanged()
  349. {
  350.     //If the user pressed return, do the search
  351.     if (event.keycode==13)
  352.     {
  353.         playlistView.playlist = DoSearch (searchText.value);
  354.     }
  355. }
  356.  
  357. function ShowSearchHistory()
  358. {
  359.     if (searchHistory.itemCount > 0)
  360.     {
  361.         searchHistory.show();
  362.     }
  363. }
  364.  
  365. function HistorySearchMedia()
  366. {
  367.     playlistView.playlist = DoSearch (searchHistory.getItem(searchHistory.selectedItem));
  368. }
  369.  
  370. //Search the entire media collection for the input search string, and return a playlist of results
  371. function DoSearch(searchstring)
  372. {
  373.     //Retrieve all tracks
  374.     var alltracks = player.mediaCollection.getAll();
  375.     //Retrieve the atom indexes of the "Title", "WM/AlbumTitle", "Author" and "WM/AlbumArtist" atoms
  376.     //to speed up the search
  377.     var trackTitleAtom = player.mediaCollection.getMediaAtom("Title");
  378.     var albumTitleAtom = player.mediaCollection.getMediaAtom("WM/AlbumTitle");
  379.     var authorAtom = player.mediaCollection.getMediaAtom("Author");
  380.     var albumArtistAtom = player.mediaCollection.getMediaAtom("WM/AlbumArtist");
  381.     var plylst;
  382.     //Create the playlist to return
  383.     plylst = player.newPlaylist("","");
  384.     
  385.     //Iterate through all the media
  386.     for (var i = 0; i < alltracks.count; i++)
  387.     {
  388.         //Retrieve the media info for the current item
  389.         trackName = alltracks.item(i).getItemInfoByAtom(trackTitleAtom).toUpperCase();
  390.         trackAlbum = alltracks.item(i).getItemInfoByAtom(albumTitleAtom).toUpperCase();
  391.         trackAuthor = alltracks.item(i).getItemInfoByAtom(authorAtom).toUpperCase();
  392.         trackArtist = alltracks.item(i).getItemInfoByAtom(albumArtistAtom).toUpperCase();
  393.         
  394.         //If the current item's info contains the search string, add it to the playlist to return
  395.         if ((trackName.indexOf(searchstring.toUpperCase()) != -1) ||
  396.             (trackAlbum.indexOf(searchstring.toUpperCase()) != -1) ||
  397.             (trackAuthor.indexOf(searchstring.toUpperCase()) != -1) ||
  398.             (trackArtist.indexOf(searchstring.toUpperCase()) != -1))
  399.         {
  400.             plylst.appendItem( alltracks.item(i) );
  401.         }
  402.     }
  403.     
  404.     
  405.     if ((searchHistory.findItem (0, searchstring) == -1) &&
  406.         (searchHistory.itemCount > 0))
  407.     {
  408.         searchHistory.appendItem(searchstring);
  409.     }
  410.     else if (searchHistory.itemCount == 0)
  411.     {
  412.         searchHistory.appendItem(searchstring);
  413.     }
  414.     
  415.     searchText.value = "";
  416.     return plylst;
  417. }
  418.  
  419. //Refreshes the sources list in the left pane
  420. function RefreshSources()
  421. {
  422.     //Initially, clear all entries to ensure no duplication
  423.     sources.deleteAll();
  424.     //Append the 3 default entries
  425.     sources.appendItem("Now Playing");
  426.     sources.appendItem("All Music");
  427.     sources.appendItem("All Video");
  428.     //Iterate through CD/DVD drives and append their drive letter (to allow identification of drives) and media name
  429.     var cdromCollection = player.cdromCollection;
  430.  
  431.     for (var i = 0; i < cdromCollection.Count; i++)
  432.     {
  433.  
  434.         var cdPlaylists = new Array();
  435.         sources.appendItem (cdromCollection.item(i).driveSpecifier + " " + cdromCollection.item(i).Playlist.Name);
  436.     }
  437.  
  438.     //Iterate through the playlist collection and append all items here
  439.     var playlistCollection = player.playlistCollection;
  440.     var playlistArray = playlistCollection.getAll();
  441.     var playlistCount = playlistArray.count;
  442.  
  443.     for (var i = 0; i < playlistCount; i++)
  444.     {
  445.         sources.appendItem(playlistArray.item(i).getItemInfo("Title"));        
  446.     }
  447. }
  448.  
  449. function ShowGenrePlaylist()
  450. {
  451.     var newPlaylist = FilterByGenre(genres.getItem(genres.selectedItem));
  452.     playlistView.playlist = newPlaylist;
  453. }
  454.  
  455. function PlayGenrePlaylist()
  456. {    
  457.     //If the playlist isn't the currently playing playlist or the "Now Playing" item, play it
  458.     if (player.currentPlaylist.Name != genres.getItem(genres.selectedItem))
  459.     {
  460.         player.currentPlaylist = playlistView.playlist;
  461.         player.currentPlaylist.Name = genres.getItem(genres.selectedItem);
  462.         player.controls.play();
  463.     }
  464.     
  465. }
  466.  
  467. //Update the genre list in the browse pane
  468. function RefreshGenres()
  469. {
  470.     //Retrieve all genre titles
  471.     var mediaCollection = player.mediaCollection;
  472.     var allGenres = mediaCollection.getAttributeStringCollection("WM/Genre", "audio");
  473.     
  474.     //Clear the list of genres and add the "All" item
  475.     genres.deleteAll();
  476.     genres.appendItem("All (" + allGenres.count + " Genres)");
  477.     
  478.     //Iterate through the array of genres, adding them as appropriate
  479.     for (var i = 0; i < allGenres.count; i++)
  480.     {
  481.         if (allGenres.item(i) != "")
  482.         {
  483.             genres.appendItem(allGenres.item(i));
  484.         }
  485.         else
  486.         {
  487.             genres.appendItem("Unknown Genre");
  488.         }
  489.     }
  490. }
  491.  
  492. //Filter the artist and album lists by the specified genre
  493. function FilterByGenre(genreName)
  494. {
  495.     var newPlaylist;
  496.     //If the genre is not "All"
  497.     if (genreName.indexOf("All (") == -1)
  498.     {
  499.         var thisGenre;
  500.         //If the user has selected an "Unknown Genre", change the genre name accordingly
  501.         if (genreName != "Unknown Genre")
  502.         {
  503.             thisGenre = genreName;
  504.         }
  505.         else
  506.         {
  507.             thisGenre = "";
  508.         }
  509.         
  510.         //Retrieve the playlist for the selected genre
  511.         newPlaylist = player.mediaCollection.getByGenre(thisGenre);
  512.         
  513.         //Clear the artist and album lists
  514.         artists.deleteAll();
  515.         albums.deleteAll();
  516.     
  517.         //Set the variables to speed up the search
  518.         var albumTitleAtom = player.mediaCollection.getMediaAtom("Album");
  519.         var authorAtom = player.mediaCollection.getMediaAtom("Author");
  520.         
  521.         var artistCount = 0;
  522.         var albumCount = 0;
  523.         
  524.         //Iterate through the playlist to set the artists and albums
  525.         for (var i = 0; i < newPlaylist.count; i++)
  526.         {
  527.             //Retrieve the metadata for the item
  528.             var thisItem = newPlaylist.item(i);
  529.             var thisArtist = thisItem.getItemInfoByAtom(authorAtom);
  530.             var thisAlbum = thisItem.getItemInfoByAtom(albumTitleAtom);
  531.             
  532.             //Attempt to find the current artist in the artists list
  533.             var matched = false;
  534.             
  535.             for (var j = 0; j < artists.itemCount; j++)
  536.             {
  537.                 var artistToMatch = artists.getItem(j);
  538.  
  539.                 if ((thisArtist.toUpperCase() == artistToMatch.toUpperCase())||
  540.                     ((thisArtist == "") && (artistToMatch == "Unknown Artist")))
  541.                 {
  542.  
  543.                     matched = true;
  544.                 }
  545.             }
  546.             
  547.             //If the artist was not found in the list, find the point at which they should be inserted and add them
  548.             if (!matched)
  549.             {
  550.                 var artistInstertPoint = FindArtistInsertPoint(thisArtist, -1, artists.itemCount);
  551.                 if (thisArtist == "")
  552.                 {
  553.                     thisArtist = "Unknown Artist";
  554.                 }
  555.                 artists.insertItem (artistInstertPoint, thisArtist);
  556.                 artistCount = artistCount + 1;
  557.             }
  558.             
  559.             //Attempt to find the current album in the albums list        
  560.             matched = false;
  561.             for (var j = 0; j < albums.itemCount; j++)
  562.             {
  563.                 var albumToMatch = albums.getItem(j);
  564.  
  565.                 if ((thisAlbum.toUpperCase() == albumToMatch.toUpperCase()) ||
  566.                     ((thisAlbum == "") && (albumToMatch == "Unknown Album")))
  567.                 {
  568.  
  569.                     matched = true;
  570.                 }
  571.             }
  572.  
  573.             //If the album was not found in the list, find the point at which they should be inserted and add them
  574.             if (!matched)
  575.             {
  576.                 var albumInsertPoint = FindAlbumInsertPoint(thisAlbum, -1, albums.itemCount);
  577.                 if (thisAlbum == "")
  578.                 {
  579.                     thisAlbum = "Unknown Album";
  580.                 }
  581.                 albums.insertItem (albumInsertPoint, thisAlbum);
  582.                 albumCount = albumCount + 1;
  583.             }
  584.         }
  585.         
  586.         //Add the "All" entries at the beginning of the list
  587.         artists.insertItem(0, "All (" + artistCount + " Artists)");
  588.         albums.insertItem(0, "All (" + albumCount + " Albums)");
  589.     }
  590.     //If the user has selected "All" genres
  591.     else
  592.     {
  593.         //Refresh the artist list
  594.         RefreshArtists();
  595.         //Refresh the album list
  596.         RefreshAlbums();
  597.         //Set the playlist to all media in the media collection
  598.         newPlaylist = player.mediaCollection.getAll();
  599.     }
  600.     
  601.     return newPlaylist;
  602. }
  603.  
  604. //Finds the point in the artist list at which the current item should be added
  605. function FindArtistInsertPoint (artistName, lo, hi)
  606. {
  607.     var position;
  608.     //If the artistName begins with "The", it should be positioned based on the rest of the name.
  609.     //E.g. "The Verve" should be under "V" for "Verve"
  610.     var testName = artistName;
  611.     if (testName.indexOf ("The ") == 0)
  612.     {
  613.         testName = artistName.substring(4,artistName.length);
  614.     }
  615.     
  616.     //If there is less than 1 item between the top and bottom, insertion point should be 1 above the bottom
  617.     if ((hi - lo) <= 1)
  618.     {
  619.         position = lo + 1;
  620.     }
  621.     //Otherwise, divide the list by two
  622.     else
  623.     {
  624.         var mid = (lo + hi) / 2;
  625.         artistToMatch = artists.getItem(mid);
  626.         if (artistToMatch == "Unknown Artist")
  627.         {
  628.             artistToMatch = "";
  629.         }
  630.         //If the artist to find is below the half-mark in the list, find the position between the bottom and half
  631.         if (artistToMatch > artistName)
  632.         {
  633.             position = FindArtistInsertPoint (artistName, lo, mid);
  634.         }
  635.         //If the artist is above the half mark, find the position between half and the top
  636.         else if (artistToMatch < artistName)
  637.         {
  638.             position = FindArtistInsertPoint (artistName, mid, hi);
  639.         }
  640.         //Otherwise, if the middle item matches the item to find, return -1
  641.         else if (artistToMatch == testName)
  642.         {
  643.             position = -1;
  644.         }
  645.     }
  646.     return position;
  647. }
  648.  
  649. //Finds the point in the album list at which the current item should be added
  650. function FindAlbumInsertPoint (albumName, lo, hi)
  651. {
  652.     var position;
  653.     //If the album name begins with "The", it should be positioned based on the rest of the name.
  654.     //E.g. "The Best Of..." should be under "B" for "Best Of..."
  655.     var testName = albumName;
  656.     if (testName.indexOf ("The ") == 0)
  657.     {
  658.         testName = albumName.substring(4,albumName.length);
  659.     }
  660.     
  661.     //If there is less than 1 item between the top and bottom, insertion point should be 1 above the bottom
  662.     if ((hi - lo) <= 1)
  663.     {
  664.         position = lo + 1;
  665.     }
  666.     //Otherwise, divide the list by zero
  667.     else
  668.     {
  669.         var mid = (lo + hi) / 2;
  670.         albumToMatch = albums.getItem(mid);
  671.         if (albumToMatch == "Unknown Album")
  672.         {
  673.             albumToMatch = "";
  674.         }
  675.         //If the album to find is below the half-mark, find the position between the bottom and half
  676.         if (albumToMatch > albumName)
  677.         {
  678.             position = FindAlbumInsertPoint (albumName, lo, mid);
  679.         }
  680.         //If the album is above the half mark, find the position between half and the top
  681.         else if (albumToMatch < albumName)
  682.         {
  683.             position = FindAlbumInsertPoint (albumName, mid, hi);
  684.         }
  685.         //Otherwise, if the middle item matches the item to find, return -1
  686.         else if (albumToMatch == testName)
  687.         {
  688.             position = -1;
  689.         }
  690.     }
  691.     return position;
  692. }
  693.  
  694. function ShowArtistPlaylist()
  695. {
  696.     var newPlaylist = FilterByArtist(artists.getItem(artists.selectedItem));
  697.     playlistView.playlist = newPlaylist;
  698. }
  699.  
  700. function PlayArtistPlaylist()
  701. {    
  702.     //If the playlist isn't the currently playing playlist or the "Now Playing" item, play it
  703.     if (player.currentPlaylist.Name != artists.getItem(artists.selectedItem))
  704.     {
  705.         player.currentPlaylist = playlistView.playlist;
  706.         player.currentPlaylist.Name = artists.getItem(artists.selectedItem);
  707.         player.controls.play();
  708.     }
  709.     
  710. }
  711.  
  712. //Update the artist list in the browse pane
  713. function RefreshArtists()
  714. {
  715.     //Retrieve all artist names from the media collection
  716.     var mediaCollection = player.mediaCollection;
  717.     var allArtists = mediaCollection.getAttributeStringCollection("Author","audio");
  718.     
  719.     //Clear the artist list and add the all artists item
  720.     artists.deleteAll();
  721.     artists.appendItem("All (" + allArtists.count + " Artists)");
  722.     
  723.     //Iterate through the artists, adding as appropriate
  724.     for (var i = 0; i< allArtists.count; i++)
  725.     {
  726.         if (allArtists.item(i) != "")
  727.         {
  728.             artists.appendItem(allArtists.item(i));
  729.         }
  730.         else
  731.         {
  732.             if ((artists.itemCount > 1) &&
  733.                 (artists.getItem(1) != "Unknown Artist"))
  734.             {
  735.                 artists.insertItem(1, "Unknown Artist");
  736.             }
  737.             else
  738.             {
  739.                 artists.appendItem("Unknown Artist");
  740.             }
  741.         }
  742.     }
  743. }
  744.  
  745. //Filters the album list based on the input artist and returns the playlist for that artist
  746. function FilterByArtist(artistName)
  747. {
  748.     var newPlaylist 
  749.     //If the artist selected is not "All"
  750.     if (artistName.indexOf("All (") == -1)
  751.     {
  752.         var thisArtist;
  753.         //Set the artist name to "" for unknown artists
  754.         if (artistName != "Unknown Artist")
  755.         {
  756.             thisArtist = artistName;
  757.         }
  758.         else
  759.         {
  760.             thisArtist = "";
  761.         }
  762.  
  763.         //Retrieve the playlist for the artist
  764.         newPlaylist = player.mediaCollection.getByAuthor(thisArtist);
  765.         
  766.         //Clear the album list and set the initial variables
  767.         albums.deleteAll();
  768.  
  769.         var albumTitleAtom = player.mediaCollection.getMediaAtom("Album");
  770.         var genreAtom = player.mediaCollection.getMediaAtom("WM/Genre");
  771.  
  772.         //Retrieve the selected genre, or if no genre or all genres are selected, set the genre to an empty string
  773.         var currentGenre = "";
  774.         
  775.         if (genres.selectedItem != -1)
  776.         {
  777.             currentGenre = genres.getItem(genres.selectedItem);
  778.         }        
  779.         
  780.         if (currentGenre.substring(0, 5) == "All (")
  781.         {
  782.             currentGenre = "";
  783.         }
  784.  
  785.         var albumCount = 0;
  786.  
  787.         //Iterate through the items in the artist's playlist
  788.         for (var i = 0; i < newPlaylist.count; i++)
  789.         {
  790.             //Retrieve the current item's genre and album title
  791.             var thisItem = newPlaylist.item(i);
  792.             var thisGenre = thisItem.getItemInfoByAtom(genreAtom);
  793.             var thisAlbum = thisItem.getItemInfoByAtom(albumTitleAtom);
  794.  
  795.             //Attempt to find the current album in the albums list
  796.             var matched = false;
  797.             for (var j = 0; j < albums.itemCount; j++)
  798.             {
  799.                 var albumToMatch = albums.getItem(j);
  800.  
  801.                 if ((thisAlbum.toUpperCase() == albumToMatch.toUpperCase()) ||
  802.                     ((thisAlbum == "") && (albumToMatch == "Unknown Album")))
  803.                 {
  804.  
  805.                     matched = true;
  806.                 }
  807.             }
  808.             
  809.             //If the album is not in the current list and either the selected genre is "all" or the current genre matches 
  810.             //that of the current item, add the album at the appropriate position in the list
  811.             if ((!matched) &&
  812.                 ((currentGenre == "") ||
  813.                  (currentGenre.toUpperCase() == thisGenre.toUpperCase())))
  814.             {
  815.                 var albumInsertPoint = FindAlbumInsertPoint(thisAlbum, -1, albums.itemCount);
  816.                 if (thisAlbum == "")
  817.                 {
  818.                     thisAlbum = "Unknown Album";
  819.                 }
  820.                 albums.insertItem (albumInsertPoint, thisAlbum);
  821.                 albumCount = albumCount + 1;
  822.             }
  823.         }
  824.  
  825.         //Add the all albums item
  826.         albums.insertItem(0, "All (" + albumCount + " Albums)");
  827.     }
  828.     //Otherwise, refresh the artist and album panes by filtering on the selected genre
  829.     else
  830.     {
  831.         var selected = genres.selectedItem;
  832.         if (selected == -1)
  833.         {
  834.             selected = 0;
  835.         }
  836.         
  837.         //Set the playlist to all media in the media collection
  838.         newPlaylist = FilterByGenre(genres.getItem(selected));
  839.     }
  840.     
  841.     return newPlaylist;
  842. }
  843.  
  844. //Update the album list in the browse pane
  845. function RefreshAlbums()
  846. {
  847.     //Retrieve all albums titles in the media collection
  848.     var mediaCollection = player.mediaCollection;
  849.     var allAlbums = mediaCollection.getAttributeStringCollection("Album","audio");
  850.     
  851.     //Clear the album list and add the "all" item
  852.     albums.deleteAll();
  853.     albums.appendItem("All (" + allAlbums.count + " Albums)");
  854.     
  855.     //Iterate through the album titles, adding to the list as appropriate
  856.     for (var i=0; i<allAlbums.count; i++)
  857.     {
  858.         if (allAlbums.item(i) != "")
  859.         {
  860.             albums.appendItem(allAlbums.item(i));
  861.         }
  862.         else
  863.         {
  864.             if ((albums.itemCount > 1) &&
  865.                 (albums.getItem(1) != "Unknown Album"))
  866.             {
  867.                 albums.insertItem(1, "Unknown Album");
  868.             }
  869.             else
  870.             {
  871.                 albums.appendItem("Unknown Album");
  872.             }
  873.         }
  874.     }
  875. }
  876.  
  877. function ShowAlbumPlaylist()
  878. {
  879.     var newPlaylist = FilterByAlbum(albums.getItem(albums.selectedItem));
  880.     playlistView.playlist = newPlaylist;
  881. }
  882.  
  883. function PlayAlbumPlaylist()
  884. {    
  885.     //If the playlist isn't the currently playing playlist or the "Now Playing" item, play it
  886.     if (player.currentPlaylist.Name != artists.getItem(albums.selectedItem))
  887.     {
  888.         player.currentPlaylist = playlistView.playlist;
  889.         player.currentPlaylist.Name = albums.getItem(albums.selectedItem);
  890.         player.controls.play();
  891.     }
  892.     
  893. }
  894.  
  895. function FilterByAlbum(albumName)
  896. {
  897.     if (albumName.indexOf("All (") == -1)
  898.     {
  899.         if (albumName == "Unknown Album")
  900.         {
  901.             albumName = "";
  902.         }
  903.  
  904.         //Retrieve the selected artist, or if no artist or all artists are selected, set the artist to an empty string
  905.         var artistName = "";
  906.  
  907.         if (artists.selectedItem != -1)
  908.         {
  909.             artistName = artists.getItem(artists.selectedItem);
  910.         }        
  911.  
  912.         if (artistName.substring(0, 5) == "All (")
  913.         {
  914.             artistName = "";
  915.         }
  916.  
  917.         //Retrieve the selected genre, or if no genre or all genres are selected, set the genre to an empty string
  918.         var currentGenre = "";
  919.  
  920.         if (genres.selectedItem != -1)
  921.         {
  922.             currentGenre = genres.getItem(genres.selectedItem);
  923.         }        
  924.  
  925.         if (currentGenre.substring(0, 5) == "All (")
  926.         {
  927.             currentGenre = "";
  928.         }
  929.  
  930.         var artistAtom = player.mediaCollection.getMediaAtom("Author");
  931.         var genreAtom = player.mediaCollection.getMediaAtom("WM/Genre");
  932.  
  933.         var newPlaylist =  player.mediaCollection.getByAlbum(albumName);
  934.  
  935.         var tempPlaylist = player.newPlaylist("", "");
  936.         for (var i = 0; i < newPlaylist.count; i++)
  937.         {
  938.  
  939.             if (((newPlaylist.item(i).getItemInfoByAtom(artistAtom).toUpperCase() == artistName.toUpperCase()) ||
  940.                  (artistName == "")) &&
  941.                 ((newPlaylist.item(i).getItemInfoByAtom(genreAtom).toUpperCase() == currentGenre.toUpperCase()) ||
  942.                  (currentGenre == "")))
  943.             {
  944.                 tempPlaylist.appendItem (newPlaylist.item(i));
  945.             }
  946.         }
  947.     }
  948.     else
  949.     {
  950.         
  951.         var selected = artists.selectedItem;
  952.         if (selected == -1)
  953.         {
  954.             selected = 0;
  955.         }
  956.         //Set the playlist to all media for the artist
  957.         tempPlaylist = FilterByArtist(artists.getItem(selected));
  958.     }
  959.     return tempPlaylist;
  960. }
  961.  
  962. //Shows the currently selected item in the sources listbox in the playlist
  963. function ShowSourcePlaylist()
  964. {
  965.     playlistView.playlist = GetSourcePlaylist();
  966. }
  967.  
  968. //Plays the currently selected item in the sources listbox
  969. function PlaySourcePlaylist()
  970. {
  971.     //If the playlist isn't the currently playing playlist or the "Now Playing" item, play it
  972.     if ((player.currentPlaylist.Name != sources.getItem(sources.selectedItem)) &&
  973.         (sources.getItem(sources.selectedItem) != "Now Playing"))
  974.     {
  975.         playlistView.playlist = GetSourcePlaylist();
  976.         player.currentPlaylist = playlistView.playlist;
  977.         player.currentPlaylist.Name = sources.getItem(sources.selectedItem);
  978.         player.controls.play();
  979.     }
  980. }
  981.  
  982. //Retrieves the playlist for the item selected in the source pane
  983. function GetSourcePlaylist()
  984. {
  985.     var newPlaylistName = sources.getItem(sources.selectedItem);
  986.     var sourcePlaylist;
  987.     
  988.     //If the selected item is "Now Playing", retrieve the current playlist from the player
  989.     if (newPlaylistName == "Now Playing")
  990.     {
  991.         sourcePlaylist = player.currentPlaylist;
  992.     }
  993.     //If the selected item is "All Music", retrieve a playlist of all audio in the media collection
  994.     else if (newPlaylistName == "All Music")
  995.     {
  996.         sourcePlaylist = player.mediaCollection.getByAttribute("MediaType", "audio");
  997.     }
  998.     //If the selected item is "All Video", retrieve a playlist of all video in the media collection
  999.     else if (newPlaylistName == "All Video")
  1000.     {
  1001.         sourcePlaylist = player.mediaCollection.getByAttribute("MediaType", "video");
  1002.     }
  1003.     //If the selected item is a CD/DVD drive, retrieve that drive's playlist
  1004.     else if (newPlaylistName.indexOf (": ") != -1)
  1005.     {
  1006.         var driveSpecifier = newPlaylistName.substr(0, 2);
  1007.         var cdromCollection = player.cdromCollection;
  1008.             
  1009.         for (var i = 0; i < cdromCollection.Count; i++)
  1010.         {
  1011.             if (driveSpecifier == cdromCollection.item(i).driveSpecifier)
  1012.             {
  1013.                 sourcePlaylist = cdromCollection.item(i).playlist;
  1014.             }
  1015.         }
  1016.     }
  1017.     //Otherwise, the item is assumed to be a standard playlist in the playlist collection
  1018.     else
  1019.     {
  1020.         var newPlaylist = player.playlistCollection.getByName(newPlaylistName);
  1021.         if (newPlaylist.count > 0)
  1022.         {
  1023.             sourcePlaylist = newPlaylist.item(0);
  1024.         }
  1025.     }
  1026.     
  1027.     return sourcePlaylist;
  1028. }
  1029.  
  1030. //Update metadata view of the player
  1031. function UpdateMetadata()
  1032. {
  1033.     //Ensure that the metadata text only scrolls when needed
  1034.     if (metadata.textWidth <= metadata.width)
  1035.     {
  1036.         metadata.scrolling = false;
  1037.     }
  1038.     else
  1039.     {
  1040.         metadata.scrolling = true;
  1041.     }
  1042.     
  1043.     //Ensure that the time views are centered
  1044.     current.width = currentTimeLabel.textWidth + duration.textWidth;
  1045.     remaining.width = remainingTimeLabel.textWidth + duration.textWidth;
  1046.     
  1047.     //Update the album art image.
  1048.     //Because of a bug in WMP, we must first change the backgroundImage to "" before setting the new image
  1049.     
  1050.     albumArt.backgroundImage = "";
  1051.     albumArt.backgroundImage = "WMPImage_AlbumArtLarge";
  1052. }
  1053.  
  1054. function SetBrowsePaneState()
  1055. {
  1056.     browsePaneVisible = theme.loadPreference("browsePaneVisible");
  1057.     if  ((browsePaneVisible.toUpperCase() == "TRUE") ||
  1058.         (browsePaneVisible.toUpperCase() == "--"))
  1059.     {
  1060.         browsePaneHeight = theme.loadPreference("browsePaneHeight");
  1061.         if (browsePaneHeight.toUpperCase() != "--")
  1062.         {
  1063.             browsePaneSlider.value = 200 - browsePaneHeight;
  1064.         }
  1065.     }
  1066.     else
  1067.     {
  1068.         browsePaneSlider.value = 200;
  1069.     }
  1070.     ResizeBrowsePane();
  1071. }
  1072.  
  1073. //By setting the value of the left pane slider to 0 or 150 alternately, we can toggle visibility
  1074. //of the left pane, using the native value_onchange of the slider
  1075. function ToggleBrowsePane()
  1076. {
  1077.     
  1078.     if (browsePaneSlider.value >= 196)
  1079.     {
  1080.         browsePaneHeight = theme.loadPreference("browsePaneHeight");
  1081.         if (browsePaneHeight.toUpperCase() != "--")
  1082.         {
  1083.             browsePaneSlider.value = 200 - browsePaneHeight;
  1084.         }
  1085.         else
  1086.         {
  1087.             browsePaneSlider.value = 100;
  1088.         }
  1089.     }
  1090.     else
  1091.     {
  1092.         browsePaneSlider.value = 200;
  1093.     }
  1094.     ResizeBrowsePane();
  1095. }
  1096.  
  1097. //Resize the browse pane's height to match the slider's value
  1098. function ResizeBrowsePane()
  1099. {
  1100.     browsePane.height = 200- browsePaneSlider.value; 
  1101.     
  1102.     genrePane.height = browsePane.height - 4;
  1103.     artistPane.height = browsePane.height - 4;
  1104.     albumPane.height = browsePane.height - 4;
  1105.     
  1106.     genres.height = genrePane.height - 16;
  1107.     artists.height = artistPane.height - 16;
  1108.     albums.height = albumPane.height - 16;
  1109.     
  1110.     //If the browse pane is closed sufficiently, hide it's contents
  1111.     if (browsePane.height <= 4)
  1112.     {
  1113.         playlistPane.top = 0;
  1114.         playlistPane.height = contentPane.height;
  1115.         browsePaneSlider.top = 49;
  1116.         
  1117.         leftBrowsePane.visible = false;
  1118.         rightBrowsePane.visible = false;
  1119.         topBrowsePane.visible = false;
  1120.         bottomBrowsePane.visible = false;
  1121.         
  1122.         genreArtistSeperator.visible = false;
  1123.         artistAlbumSeperator.visible = false;
  1124.         
  1125.         genres.visible = false;
  1126.         artists.visible = false;
  1127.         albums.visible = false;
  1128.                 
  1129.         browse.down = false;
  1130.         theme.savePreference("browsePaneVisible", false);
  1131.     }
  1132.     //Otherwise, ensure it's contents are visible
  1133.     else
  1134.     {
  1135.         playlistPane.top = browsePane.height + 10;
  1136.         playlistPane.height = contentPane.height - browsePane.height - 10;
  1137.         browsePaneSlider.top = 60;
  1138.         
  1139.         leftBrowsePane.visible = true;
  1140.         rightBrowsePane.visible = true;
  1141.         topBrowsePane.visible = true;
  1142.         bottomBrowsePane.visible = true;
  1143.         
  1144.         //The left and right browse pane heights must be corrected since the pane is closed initially
  1145.         leftBrowsePane.Height = browsePane.Height - 4;
  1146.         rightBrowsePane.Height = browsePane.Height - 4;
  1147.         
  1148.         genreArtistSeperator.Height = browsePane.Height - 4;
  1149.         genreArtistSeperator.visible = true;
  1150.         artistAlbumSeperator.Height = browsePane.Height - 4;
  1151.         artistAlbumSeperator.visible = true;
  1152.         
  1153.         genres.visible = true;
  1154.         artists.visible = true;
  1155.         albums.visible = true;
  1156.         
  1157.         browse.down = true;
  1158.         theme.savePreference("browsePaneHeight", browsePane.height);
  1159.         theme.savePreference("browsePaneVisible", true);
  1160.     }
  1161.  
  1162. }
  1163.  
  1164. function UpdateBrowseWidths()
  1165. {
  1166.     genrePane.width = (browsePane.width - 6)/3;
  1167.     artistPane.width = (browsePane.width - 6)/3;
  1168.     albumPane.width = (browsePane.width - 6)/3;
  1169.     
  1170.     artistPane.left = genrePane.width + 3;
  1171.     albumPane.left = artistPane.left + artistPane.width + 1;
  1172.     
  1173.     genreArtistSeperator.left = genrePane.width + 2;
  1174.     artistAlbumSeperator.left = artistPane.left + artistPane.width;
  1175. }
  1176.  
  1177. function SetLeftPaneState()
  1178. {
  1179.     leftPaneVisible = theme.loadPreference("leftPaneVisible");
  1180.     if  ((leftPaneVisible.toUpperCase() == "TRUE") ||
  1181.         (leftPaneVisible.toUpperCase() == "--"))
  1182.     {
  1183.         leftPaneWidth = theme.loadPreference("leftPaneWidth");
  1184.         if (leftPaneWidth.toUpperCase() != "--")
  1185.         {
  1186.             leftPaneSlider.value = leftPaneWidth;
  1187.         }
  1188.         else
  1189.         {
  1190.             leftPaneSlider.value = 150;
  1191.         }
  1192.     }
  1193.     else
  1194.     {
  1195.         leftPaneSlider.value = 0;
  1196.     }
  1197.     ResizeLeftPane();
  1198. }
  1199.  
  1200. //By setting the value of the left pane slider to 0 or 150 alternately, we can toggle visibility
  1201. //of the left pane, using the native value_onchange of the slider
  1202. function ToggleLeftPane()
  1203. {
  1204.     if (leftPaneSlider.value <= 4)
  1205.     {
  1206.         leftPaneWidth = theme.loadPreference("leftPaneWidth");
  1207.         if (leftPaneWidth.toUpperCase() != "--")
  1208.         {
  1209.             leftPaneSlider.value = leftPaneWidth;
  1210.         }
  1211.         else
  1212.         {
  1213.             leftPaneSlider.value = 150;
  1214.         }
  1215.     }
  1216.     else
  1217.     {
  1218.         leftPaneSlider.value = 0;
  1219.     }
  1220.     ResizeLeftPane();
  1221. }
  1222.  
  1223. //Resize the left pane's width to match the slider's value, and compensate for the height change on 
  1224. //the album art
  1225. function ResizeLeftPane()
  1226. {
  1227.     leftPane.width = leftPaneSlider.value; 
  1228.     
  1229.     albumArtPane.top = centerPane.height - albumArtPane.height; 
  1230.     albumArtPane.height = albumArtPane.width + 18; 
  1231.     
  1232.     if (albumArtPane.zindex != -1)
  1233.     {
  1234.         sourcePane.height = albumArtPane.top; 
  1235.     }
  1236.     
  1237.     //If the left pane is closed sufficiently, hide it's contents
  1238.     if (leftPane.width <= 4)
  1239.     {
  1240.         contentPane.left = 0;
  1241.         contentPane.width = centerPane.width;
  1242.         leftPaneSlider.left = 1;
  1243.         
  1244.         leftSourcePane.visible = false;
  1245.         rightSourcePane.visible = false;
  1246.         topSourcePane.visible = false;
  1247.         bottomSourcePane.visible = false;
  1248.                 
  1249.         leftAlbumArtPane.visible = false;
  1250.         rightAlbumArtPane.visible = false;
  1251.         topAlbumArtPane.visible = false;
  1252.         bottomAlbumArtPane.visible = false;
  1253.                 
  1254.         AlbumArtPanelOff.enabled = false;
  1255.         AlbumArtPanelOn.enabled = false;
  1256.         
  1257.         theme.savePreference("leftPaneVisible", false);
  1258.         
  1259.         
  1260.     }
  1261.     //Otherwise, ensure it's contents are visible
  1262.     else
  1263.     {
  1264.         contentPane.left = leftPane.width + 8;
  1265.         contentPane.width = centerPane.width - leftPane.width - 8;
  1266.         leftPaneSlider.left = 9;
  1267.         
  1268.         leftSourcePane.visible = true;
  1269.         rightSourcePane.visible = true;
  1270.         topSourcePane.visible = true;
  1271.         bottomSourcePane.visible = true;
  1272.  
  1273.         leftAlbumArtPane.visible = true;
  1274.         rightAlbumArtPane.visible = true;
  1275.         topAlbumArtPane.visible = true;
  1276.         bottomAlbumArtPane.visible = true;    
  1277.             
  1278.         AlbumArtPanelOff.enabled = true;
  1279.         AlbumArtPanelOn.enabled = true;
  1280.         theme.savePreference("leftPaneWidth", leftPane.width);
  1281.         theme.savePreference("leftPaneVisible", true);
  1282.     }
  1283.  
  1284. }
  1285.  
  1286. function SetAlbumArtPanelState()
  1287. {
  1288.     albumArtPanelVisible = theme.loadPreference("albumArtVisible");
  1289.     if  ((albumArtPanelVisible.toUpperCase() == "-1") ||
  1290.         (albumArtPanelVisible.toUpperCase() == "--"))
  1291.     {
  1292.         HideAlbumArtPanel();
  1293.     }
  1294.     else
  1295.     {
  1296.         ShowAlbumArtPanel();
  1297.     }
  1298. }
  1299.  
  1300. //To show the album art, set its z-index to 1 (above the skin), and the source
  1301. //pane's height to the top of the album art, updating the buttons accordingly
  1302. function ShowAlbumArtPanel()
  1303. {
  1304.     sourcePane.height = albumArtPane.top; 
  1305.     albumArtPane.zindex = 1;
  1306.     AlbumArtPanelOff.visible = false;
  1307.     AlbumArtPanelOn.visible = true;
  1308.     theme.savePreference("albumArtVisible", albumArtPane.zindex);
  1309. }
  1310.  
  1311. //To hide the album art, we set it's z-index to -1 (below the skin itself), and set the 
  1312. //source pane to the same height as the center pane, updating the buttons accordingly
  1313. function HideAlbumArtPanel()
  1314. {
  1315.     sourcePane.Height = centerPane.Height;
  1316.     albumArtPane.zindex = -1;
  1317.     AlbumArtPanelOff.visible = true;
  1318.     AlbumArtPanelOn.visible = false;
  1319.     theme.savePreference("albumArtVisible", albumArtPane.zindex);
  1320. }
  1321.  
  1322. //Toggle the two display panels
  1323. function ToggleDisplayPanels()
  1324. {
  1325.     if (barDisplayPanel.visible)
  1326.     {
  1327.         ShowSongDisplayPanel();
  1328.     }
  1329.     else
  1330.     {
  1331.         ShowBarDisplayPanel();
  1332.     }
  1333. }
  1334.  
  1335. function SetDisplayPanelState()
  1336. {
  1337.     songDisplayVisible = theme.loadPreference("songDisplayVisible");
  1338.     if  ((songDisplayVisible.toUpperCase() == "TRUE") ||
  1339.         (songDisplayVisible.toUpperCase() == "--"))
  1340.     {
  1341.         ShowSongDisplayPanel();
  1342.     }
  1343.     else
  1344.     {
  1345.         ShowBarDisplayPanel();
  1346.     }
  1347. }
  1348.  
  1349. //Show the song display panel, hide the bar display, set the time display accordingly, and save the state
  1350. function ShowSongDisplayPanel()
  1351. {
  1352.     songDisplayPanel.visible = true;
  1353.     barDisplayPanel.visible = false;
  1354.     bars.visible = false;
  1355.     leftBarGrid.visible = false;
  1356.     rightBarGrid.visible = false;
  1357.     theme.savePreference("songDisplayVisible", songDisplayPanel.visible);
  1358.     SetTimeState();
  1359. }
  1360.  
  1361. //Show the bar display panel, hide the song display and the time displays, and save the state
  1362. function ShowBarDisplayPanel()
  1363. {
  1364.     songDisplayPanel.visible = false;
  1365.     barDisplayPanel.visible = true;
  1366.     remaining.visible = false;
  1367.     current.visible = false;
  1368.     bars.visible = true;
  1369.     leftBarGrid.visible = true;
  1370.     rightBarGrid.visible = true;
  1371.     theme.savePreference("songDisplayVisible", songDisplayPanel.visible);
  1372. }
  1373.  
  1374. //********  Time display managment ********//
  1375.  
  1376. ///Retrieve the time remaining on the current media
  1377. function GetRemainingTime()
  1378. {
  1379.     //Retrieve the number of whole seconds playback remaining on the current media
  1380.     remainingSeconds = Math.round(player.currentMedia.duration - player.controls.currentPosition);
  1381.     //Calculate hours, minutes and seconds remaining
  1382.     remainingHours = Math.round(remainingSeconds/3600);
  1383.     remainderMinutes = Math.round(remainingSeconds%3600);
  1384.     remainingMinutes = Math.round(remainderMinutes/60);
  1385.     remainderSeconds = Math.round(remainderMinutes%60);
  1386.     var remain = "";
  1387.     
  1388.     //If the number of hours remaining is not zero, and greather than 10, just display it
  1389.     if ((remainingHours != 0) &&
  1390.         (remainingHours >= 10))
  1391.     {
  1392.         remain += remainingHours + ":";
  1393.     }
  1394.     //If the number of hours remaining is not zero and less than 10, we must append a leading 0
  1395.     else if ((remainingHours != 0) &&
  1396.         (remainingHours < 10))
  1397.     {
  1398.         remain += "0" + remainingHours + ":";
  1399.     }
  1400.     //If there are zero hours remaining, we do not display hours
  1401.     
  1402.     //If the number of minutes is less than 10, we must append a leading 0
  1403.     if (remainingMinutes < 10)
  1404.     {
  1405.         remain += "0" + remainingMinutes;
  1406.     }
  1407.     //Otherwise just display the minutes
  1408.     else
  1409.     {
  1410.         remain += remainingMinutes;
  1411.     }
  1412.     remain += ":";
  1413.     
  1414.     //If the number of seconds is less than 10, append a leading 0
  1415.     if (remainderSeconds < 10)
  1416.     {
  1417.         remain += "0" + remainderSeconds;
  1418.     }
  1419.     //Otherwise just display the seconds
  1420.     else
  1421.     {
  1422.         remain += remainderSeconds;
  1423.     }
  1424.     
  1425.     return remain;
  1426. }
  1427.  
  1428. //Set the current state of the time display
  1429. function SetTimeState()
  1430. {
  1431.     //Retrieve the saved state of the time display
  1432.     elapsedTimeVisible = theme.loadPreference("elapsedTimeVisible");
  1433.     //If the elapsed time was previously visible, show it
  1434.     if ((elapsedTimeVisible.toUpperCase() == "TRUE") ||
  1435.         (elapsedTimeVisible.toUpperCase() == "--"))
  1436.     {
  1437.         ShowElapsedTime();
  1438.     }
  1439.     //Otherwise show the remaining time
  1440.     else
  1441.     {
  1442.         ShowRemainingTime();
  1443.     }
  1444. }
  1445.  
  1446. //Toggle the time display
  1447. function ToggleTimeDisplay()
  1448. {
  1449.     if (current.visible)
  1450.     {
  1451.         ShowRemainingTime();
  1452.     }
  1453.     else
  1454.     {
  1455.         ShowElapsedTime();
  1456.     }
  1457. }
  1458.  
  1459. //Show the elapsed time and store the state
  1460. function ShowElapsedTime()
  1461. {
  1462.     remaining.visible = false;
  1463.     current.visible = true;
  1464.     theme.savePreference("elapsedTimeVisible", current.visible);
  1465. }
  1466.  
  1467. //Show the remaining time and store the state
  1468. function ShowRemainingTime()
  1469. {
  1470.     remaining.visible = true;
  1471.     current.visible = false;
  1472.     theme.savePreference("elapsedTimeVisible", current.visible);
  1473. }
  1474.  
  1475. function OnOpenStateChange()
  1476. {
  1477.     if(player.OpenState == osMediaOpen)
  1478.     {
  1479.         UpdateMetadata();
  1480.     }
  1481. }
  1482.  
  1483. function UpdateMetadata()
  1484. {
  1485.     metadata.value =
  1486.         player.currentmedia.getiteminfo("author");
  1487.     var temp = player.currentmedia.name;
  1488.     if(temp != "")
  1489.     {
  1490.         if(metadata.value != "")
  1491.         {
  1492.             metadata.value +=  " -- ";
  1493.         }
  1494.         metadata.value += temp;
  1495.     }
  1496.     metadata.scrolling = metadata.textWidth>metadata.width;
  1497. }
  1498.  
  1499. function openpl() {
  1500.     if(player.currentMedia.ImageSourceWidth > 0 ) 
  1501.     {
  1502.         video.visible = false;
  1503.         vis.visible = false;
  1504.         screen.moveto(-300,19,1000);
  1505.         pl.visible = true;
  1506.         eqbase.visible = false;
  1507.         trackinfo.visible = false;
  1508.     } else { }
  1509. }
  1510.