home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 February / PCWorld_2001-02_cd.bin / Software / Topware / winmedpl / mpbonus_full.exe / wmpskin.cab / DigitalDJ.wmz / dj.js < prev    next >
Encoding:
JavaScript  |  2000-10-05  |  44.5 KB  |  1,397 lines

  1. //<script>
  2. //****************************************************************
  3. // ⌐2000 Microsoft Corporation. All rights reserved.
  4. //****************************************************************
  5.  
  6.  
  7. var kSetupString    = "Type a name for your new\rplaylist above.\r\rForm your playlist\rby including the attributes\ryou would like in\ryour query.\r\rThen press the\rbuild playlist button."
  8.  
  9.  
  10. var DJQuery         = null;
  11.  
  12. var LB_genre        = null;
  13. var LB_artist       = null;
  14. var LB_album        = null;
  15. var LB_playlists    = null;
  16.  
  17. var ED_playlist     = null;
  18. var ED_value        = null;
  19.  
  20. var CB_allow_playlists  = null;
  21. var CB_allow_urls       = null;
  22. var CB_allow_blank      = null;
  23. var CB_bias             = null;
  24. var CB_playcount        = null;
  25. var CB_playlength       = null;
  26.  
  27. var g_nFocusTab     = 0;
  28.  
  29. var search_name_array       = new Array(
  30.                                 "Name",
  31.                                 "Genre",
  32.                                 "Artist",
  33.                                 "Author",
  34.                                 "Album",
  35.                                 "MediaType",
  36.                                 "MediaAttribute",
  37.                                 "FileType",
  38.                                 "Bitrate",
  39.                                 "DigitallySecure",
  40.                                 "SourceURL",
  41.                                 "Copyright",
  42.                                 "CreationDate" );
  43.  
  44. var g_nSearchIndex      = 0;
  45. var g_fSearchChanged    = false;
  46.  
  47. var g_nLastCount        = 0;
  48. var g_fReturnResults    = false;
  49.  
  50.  
  51. //****************************************************************
  52.  
  53. function initDJ()
  54. {
  55.     DJQuery     = new query( query_progress, onCompleteQuery );
  56.     SearchQuery = new query( search_progress, onCompleteSearch );
  57.  
  58.     LB_genre    = new listbox(  genre_lb_sv, genre_lb_text, genre_lb_clip_text, genre_lb_clip_sv, genre_lb_focus_button,
  59.                                 genre_lb_scrollup_button, genre_lb_scrolldown_button, genre_lb_scroll_button, genre_lb_scrollbacking_button,
  60.                                 onGenreSelectionChange );
  61.     LB_artist   = new listbox(  artist_lb_sv, artist_lb_text, artist_lb_clip_text, artist_lb_clip_sv, artist_lb_focus_button,
  62.                                 artist_lb_scrollup_button, artist_lb_scrolldown_button, artist_lb_scroll_button, artist_lb_scrollbacking_button,
  63.                                 onArtistSelectionChange );
  64.     LB_album   = new listbox(   album_lb_sv, album_lb_text, album_lb_clip_text, album_lb_clip_sv, album_lb_focus_button,
  65.                                 album_lb_scrollup_button, album_lb_scrolldown_button, album_lb_scroll_button, album_lb_scrollbacking_button,
  66.                                 onAlbumSelectionChange );
  67.     LB_playlists = new listbox( playlists_lb_sv, playlists_lb_text, playlists_lb_clip_text, playlists_lb_clip_sv, playlists_lb_focus_button,
  68.                                 playlists_lb_scrollup_button, playlists_lb_scrolldown_button, playlists_lb_scroll_button, playlists_lb_scrollbacking_button,
  69.                                 onPlaylistSelectionChange );
  70.  
  71.     ED_playlist = new editbox(  playlist_edit_sv, playlist_edit_text, playlist_ibar_text, playlist_focus_button,
  72.                                 onPlaylistTextChange, null );
  73.     ED_value    = new editbox(  value_edit_sv, value_edit_text, value_ibar_text, value_focus_button,
  74.                                 onSearchValueTextChange, onSearchExecute );
  75.  
  76.     CB_allow_playlists  = new checkbox( playlist_check, playlist_check_text, resynchOptions, false );
  77.     CB_allow_urls       = new checkbox( url_check, url_check_text, resynchOptions, false );
  78.     CB_allow_blank      = new checkbox( blank_check, blank_check_text, resynchOptions, false );
  79.     CB_bias             = new checkbox( bias_check, bias_check_text, resynchOptions, false );
  80.     CB_playcount        = new checkbox( playcount_check, playcount_check_text, resynchOptions, false );
  81.     CB_playlength       = new checkbox( playlength_check, playlength_check_text, resynchOptions, false );
  82.     
  83.     loadDJ();
  84. }
  85.  
  86. //****************************************************************
  87.  
  88. function loadDJ()
  89. {
  90.     var acc_rights = theme.loadPreference( 'ACC' );
  91.     var fLoad = (acc_rights != '--');
  92.  
  93.     reset_button.enabled            = fLoad;
  94.     build_button.enabled            = fLoad;
  95.     playLength_slider.enabled       = fLoad;
  96.     playlist_focus_button.enabled   = fLoad;
  97.     seek_slider.enabled             = fLoad;
  98.     bgToggle.enabled                = fLoad;
  99.     bgTransport.enabled             = fLoad;
  100.     mute_button.enabled             = fLoad;
  101.     volume_slider.enabled           = fLoad;
  102.     bgFull.enabled                  = fLoad;
  103.     genre_include_button.enabled    = fLoad;
  104.     genre_exclude_button.enabled    = fLoad;
  105.     artist_include_button.enabled   = fLoad;
  106.     artist_exclude_button.enabled   = fLoad;
  107.     album_include_button.enabled    = fLoad;
  108.     album_exclude_button.enabled    = fLoad;
  109.     search_include_button.enabled   = fLoad;
  110.     search_exclude_button.enabled   = fLoad;
  111.     playlists_include_button.enabled= fLoad;
  112.     playlists_exclude_button.enabled= fLoad;
  113.     
  114.     if (!fLoad)
  115.     {
  116.         enableTab(0, false);
  117.         enableTab(1, false);
  118.         enableTab(2, false);
  119.         attributes_focus_button.enabled = false;
  120.         playlists_focus_button.enabled  = false;
  121.         advanced_focus_button.enabled   = false;
  122.        
  123.         intro_sv.visible                = true;
  124.         intro_txt_sv.backgroundImage    = "AutoDj_splashwcopy.jpg";
  125.         intro_txt_sv.visible            = true;
  126.     }
  127.     else
  128.     {
  129.         full_access = (acc_rights == 'W');
  130.     
  131.         search_name_array.count = 13;
  132.  
  133.         LB_genre.setupLB( DJQuery.getGenreListQ(), DJQuery.getGenreCountQ() );
  134.         LB_artist.setupLB( DJQuery.getArtistListQ(), DJQuery.getArtistCountQ() );
  135.         LB_album.setupLB( DJQuery.getAlbumListQ(), DJQuery.getAlbumCountQ() );
  136.         LB_playlists.setupLB( DJQuery.getPlaylistListQ(), DJQuery.getPlaylistCountQ() );
  137.  
  138.         instructions_text.visible   = true;
  139.         instructions_text.value     = kSetupString;
  140.     
  141.         results_length_text.moveTo( results_length_text.left, 114, 0 );
  142.     
  143.         transitionAway( 1, 0 );
  144.         transitionAway( 2, 0 );
  145.  
  146.         onWidthChange();
  147.         onHeightChange();
  148.     
  149.         loadState();
  150.         reset_text.foregroundcolor  = '#E7651A';
  151.         fixupIncludeExclude( 0, DJQuery.search_include_array_txt, DJQuery.search_exclude_array_txt, "blue", search_include_button, search_exclude_button );
  152.  
  153.         intro_sv.moveTo( -intro_sv.width, -intro_sv.height, 1000 );
  154.     }
  155. }
  156.  
  157.  
  158.  
  159. //****************************************************************
  160. // Generic Operations
  161. //****************************************************************
  162.  
  163. function doInformation()
  164. {
  165.     theme.savePreference( 'ACC', '--' );
  166.     theme.currentViewID = 'DigitalDJ';
  167. }
  168.  
  169. function setAccess( nAccess )
  170. {
  171.     switch (nAccess)
  172.     {
  173.     case 0:
  174.         // We need to view flip over to the other skin    
  175.         theme.savePreference( 'ACC', '--' );
  176.         theme.currentViewID = 'DigitalDJMid';
  177.         return;
  178.         
  179.     case 1:
  180.         theme.savePreference( 'ACC', 'R' );
  181.         break;
  182.         
  183.     case 2:
  184.         theme.savePreference( 'ACC', 'W' );
  185.         break;
  186.     }
  187.  
  188.     loadDJ();    
  189. }
  190.  
  191. //****************************************************************
  192.  
  193. function onIntroEndMove()
  194. {
  195.     intro_sv.visible = false;
  196.     intro_txt_sv.visible = false;
  197. }
  198.  
  199. //****************************************************************
  200.  
  201. function makeQueryDirty()
  202. {
  203.     build_text.foregroundcolor  = 'black';
  204.     reset_text.foregroundcolor  = 'black';
  205.     query_text.value            = DJQuery.getQueryDescriptionQ();
  206. }
  207.  
  208. //****************************************************************
  209.  
  210. function loadState()
  211. {
  212.     var pref;
  213.     
  214.     pref = theme.loadPreference( 'PID' );
  215.     if (pref != '--')
  216.     {
  217.         switchToTab( (new Number(pref)).valueOf(), 0 );
  218.     }
  219.     
  220.     CB_allow_playlists.setCheckedCB( theme.loadPreference( 'AllowP' ) == '1' );
  221.     CB_allow_urls.setCheckedCB( theme.loadPreference( 'AllowU' ) == '1' );
  222.     CB_allow_blank.setCheckedCB( theme.loadPreference( 'AllowB' ) == '1' );
  223.     CB_bias.setCheckedCB( theme.loadPreference( 'Favor' ) == '1' );
  224.     CB_playcount.setCheckedCB( theme.loadPreference( 'PlayCnt' ) == '1' );
  225.     CB_playlength.setCheckedCB( theme.loadPreference( 'PlayLen' ) == '1' );
  226.  
  227.     pref = theme.loadPreference( 'PCComp' );
  228.     if (pref != '--')
  229.     {
  230.         DJQuery.playcount_filter_comparison = (new Number(pref)).valueOf();
  231.     }
  232.     pref = theme.loadPreference( 'PCCount' );
  233.     if (pref != '--')
  234.     {
  235.         DJQuery.playcount_filter_count = (new Number(pref)).valueOf();
  236.     }
  237.  
  238.     pref = theme.loadPreference( 'PFComp' );
  239.     if (pref != '--')
  240.     {
  241.         DJQuery.playcount_favoring_comparison = (new Number(pref)).valueOf();
  242.     }
  243.  
  244.     pref = theme.loadPreference( 'PLComp' );
  245.     if (pref != '--')
  246.     {
  247.         DJQuery.playlength_filter_comparison = (new Number(pref)).valueOf();
  248.     }
  249.     pref = theme.loadPreference( 'PLLen' );
  250.     if (pref != '--')
  251.     {
  252.         DJQuery.playlength_filter_length = (new Number(pref)).valueOf();
  253.     }
  254.  
  255.     resynchOptions();
  256.     
  257.     pref = theme.loadPreference( 'SName' );
  258.     if (pref != '--')
  259.     {
  260.         g_nSearchIndex = (new Number(pref)).valueOf();
  261.     }
  262.     pref = theme.loadPreference( 'SComp' );
  263.     if (pref != '--')
  264.     {
  265.         SearchQuery.generic_search_comparison = (new Number(pref)).valueOf();
  266.     }
  267.     pref = theme.loadPreference( 'SVal' );
  268.     if (pref != '--')
  269.     {
  270.         ED_value.setTextED( pref );
  271.     }
  272.     
  273.     resynchSearchOptions();
  274.  
  275.     pref = theme.loadPreference( 'PTime' );
  276.     if (pref != '--')
  277.     {
  278.         playLength_slider.value = pref;
  279.     }    
  280.  
  281.     onPlayLengthChange();
  282.  
  283.     // Now synch up the genre / artist / album
  284.     
  285.     readStringCollection( 'G', DJQuery.genre_collection, false );
  286.     readStringCollection( 'A', DJQuery.artist_collection, false );
  287.     readStringCollection( 'B', DJQuery.album_collection, false );
  288.     readStringCollection( 'P', DJQuery.playlist_collection, true );
  289.     
  290.     onGenreSelectionChange();
  291.     onArtistSelectionChange();
  292.     onAlbumSelectionChange();
  293.     onPlaylistSelectionChange();
  294.     
  295.     makeQueryDirty();
  296. }
  297.  
  298. //****************************************************************
  299.  
  300. function saveState()
  301. {
  302.     theme.savePreference( 'PID', g_nFocusTab );
  303.     
  304.     theme.savePreference( 'AllowP', CB_allow_playlists.fChecked ? '1' : '0' );
  305.     theme.savePreference( 'AllowU', CB_allow_urls.fChecked ? '1' : '0' );
  306.     theme.savePreference( 'AllowB', CB_allow_blank.fChecked ? '1' : '0' );
  307.     theme.savePreference( 'Favor', CB_bias.fChecked ? '1' : '0' );
  308.     theme.savePreference( 'PlayCnt', CB_playcount.fChecked ? '1' : '0' );
  309.     theme.savePreference( 'PlayLen', CB_playlength.fChecked ? '1' : '0' );
  310.  
  311.     theme.savePreference( 'PCComp', DJQuery.playcount_filter_comparison );
  312.     theme.savePreference( 'PCCount', DJQuery.playcount_filter_count );
  313.     theme.savePreference( 'PFComp', DJQuery.playcount_favoring_comparison );
  314.     theme.savePreference( 'PLComp', DJQuery.playlength_filter_comparison );
  315.     theme.savePreference( 'PLLen', DJQuery.playlength_filter_length );
  316.  
  317.     theme.savePreference( 'SName', g_nSearchIndex );
  318.     theme.savePreference( 'SComp', SearchQuery.generic_search_comparison );
  319.     theme.savePreference( 'SVal', value_edit_text.value );
  320.     
  321.     theme.savePreference( 'PTime', Math.round(playLength_slider.value) );
  322.  
  323.     writeStringCollection( 'G', DJQuery.genre_collection, DJQuery.genre_include_array, DJQuery.genre_exclude_array, false );
  324.     writeStringCollection( 'A', DJQuery.artist_collection, DJQuery.artist_include_array, DJQuery.artist_exclude_array, false );
  325.     writeStringCollection( 'B', DJQuery.album_collection, DJQuery.album_include_array, DJQuery.album_exclude_array, false );
  326.     writeStringCollection( 'P', DJQuery.playlist_collection, DJQuery.playlist_include_array, DJQuery.playlist_exclude_array, true );
  327.  
  328.     // loaded inline to prevent a "jumping" effect
  329.     theme.savePreference( 'WD', view.width );
  330.     theme.savePreference( 'HT', view.height );
  331. }
  332.  
  333. //****************************************************************
  334.  
  335. function getPositionInStringCollection( value, collection, playlist )
  336. {
  337.     for (var nIndex = 0; nIndex < collection.count; nIndex++)
  338.     {
  339.         if (value == (playlist ? collection.item(nIndex).name : collection.item( nIndex )))
  340.         {
  341.             return nIndex;
  342.         }
  343.     }
  344.     return -1;
  345. }
  346.  
  347. //****************************************************************
  348.  
  349. function writeStringCollection( keyname, collection, include_array, exclude_array, playlist )
  350. {
  351.     var nIndex = 0;
  352.     while (nIndex < include_array.length)
  353.     {
  354.         theme.savePreference( keyname + 'I' + nIndex, playlist ? collection.item( include_array[nIndex] ).name : collection.item( include_array[nIndex] ) );
  355.         nIndex++;
  356.     }
  357.     theme.savePreference( keyname + 'I' + nIndex, '--' );
  358.     nIndex = 0;
  359.     while (nIndex < exclude_array.length)
  360.     {
  361.         theme.savePreference( keyname + 'E' + nIndex, playlist ? collection.item( exclude_array[nIndex] ).name : collection.item( exclude_array[nIndex] ) );
  362.         nIndex++;
  363.     }
  364.     theme.savePreference( keyname + 'E' + nIndex, '--' );
  365. }
  366.  
  367. //****************************************************************
  368.  
  369. function readStringCollection( keyname, collection, playlist )
  370. {    
  371.     var nIndex = 0;
  372.     while (1)
  373.     {
  374.         pref = theme.loadPreference( keyname + 'I' + nIndex );
  375.         if (pref == '--')
  376.         {
  377.             break;
  378.         }    
  379.  
  380.         var nPos = getPositionInStringCollection( pref, collection, playlist );
  381.         if (nPos >= 0)
  382.         {
  383.             if (keyname == 'G')
  384.             {
  385.                 DJQuery.addGenreIncludeQ( nPos );
  386.             }
  387.             else if (keyname == 'A')
  388.             {
  389.                 DJQuery.addArtistIncludeQ( nPos );
  390.             }
  391.             else if (keyname == 'B')
  392.             {
  393.                 DJQuery.addAlbumIncludeQ( nPos );
  394.             }
  395.             else
  396.             {
  397.                 DJQuery.addPlaylistIncludeQ( nPos );
  398.             }
  399.         }
  400.         nIndex++;
  401.     }
  402.     
  403.     nIndex = 0;
  404.     while (1)
  405.     {
  406.         pref = theme.loadPreference( keyname + 'E' + nIndex );
  407.         if (pref == '--')
  408.         {
  409.             break;
  410.         }    
  411.  
  412.         var nPos = getPositionInStringCollection( pref, collection, playlist );
  413.         if (nPos >= 0)
  414.         {
  415.             if (keyname == 'G')
  416.             {
  417.                 DJQuery.addGenreExcludeQ( nPos );
  418.             }
  419.             else if (keyname == 'A')
  420.             {
  421.                 DJQuery.addArtistExcludeQ( nPos );
  422.             }
  423.             else if (keyname == 'B')
  424.             {
  425.                 DJQuery.addAlbumExcludeQ( nPos );
  426.             }
  427.             else
  428.             {
  429.                 DJQuery.addPlaylistExcludeQ( nPos );            
  430.             }
  431.         }
  432.         nIndex++;
  433.     }
  434. }
  435.  
  436.  
  437.  
  438.  
  439.  
  440. //****************************************************************
  441. // Operations affecting the Query Pane
  442. //****************************************************************
  443.  
  444. function resetQuery()
  445. {
  446.     DJQuery     = new query( query_progress, onCompleteQuery );
  447.     
  448.     CB_allow_playlists.setCheckedCB( false );
  449.     CB_allow_urls.setCheckedCB( false );
  450.     CB_allow_blank.setCheckedCB( false );
  451.     CB_bias.setCheckedCB( false );
  452.     CB_playcount.setCheckedCB( false );
  453.     CB_playlength.setCheckedCB( false );
  454.  
  455.     LB_genre.setupLB( DJQuery.getGenreListQ(), DJQuery.getGenreCountQ() );
  456.     LB_artist.setupLB( DJQuery.getArtistListQ(), DJQuery.getArtistCountQ() );
  457.     LB_album.setupLB( DJQuery.getAlbumListQ(), DJQuery.getAlbumCountQ() );
  458.     LB_playlists.setupLB( DJQuery.getPlaylistListQ(), DJQuery.getPlaylistCountQ() );
  459.  
  460.     playLength_slider.value     = 5;
  461.  
  462.     onPlayLengthChange();
  463.     resynchOptions();
  464.     resynchSearchOptions();
  465.     
  466.     results_label_text.value    = 'Instructions:';
  467.     instructions_text.visible   = true;
  468.     instructions_text.value     = kSetupString;
  469.     query_progress.visible      = false;
  470.     pl.visible                  = false;
  471.     
  472.     results_length_text.moveTo( results_length_text.left, 114, 1000 );
  473.     
  474.     onGenreSelectionChange();
  475.     onArtistSelectionChange();
  476.     onAlbumSelectionChange();
  477.     onPlaylistSelectionChange();
  478.     onSearchChanged();
  479.     onPlayLengthChange();
  480.  
  481.     reset_text.foregroundcolor  = '#E7651A';
  482. }
  483.  
  484. //****************************************************************
  485.  
  486. function onPlayLengthChange()
  487. {
  488.     DJQuery.playlength_limit = true;
  489.     
  490.     var value   = Math.round(playLength_slider.value);
  491.     var string  = "";
  492.  
  493.     if (value == 0)
  494.     {
  495.         string = "20 min";
  496.         DJQuery.playlength_limit_length = 20 * 60;
  497.     }
  498.     else if (value == 1)
  499.     {
  500.         string = "40 min";
  501.         DJQuery.playlength_limit_length = 40 * 60;
  502.     }
  503.     else if (value < 14)
  504.     {
  505.         string = (value - 1) + " hr";
  506.         DJQuery.playlength_limit_length = (value - 1) * 60 * 60;
  507.     }
  508.     else
  509.     {
  510.         string = "No Limit"
  511.         DJQuery.playlength_limit = false;
  512.     }
  513.         
  514.     playLength_string.value = string;
  515.     makeQueryDirty();
  516. }
  517.  
  518. //****************************************************************
  519.  
  520. function onPlaylistTextChange()
  521. {
  522.     if (pl.visible)
  523.     {
  524.         // for library playlists, there is a penalty to pay for
  525.         // changing the name, so we do this on a delayed event to
  526.         // let the user type the name as they might want.  If it
  527.         // is a query playlist, then we just change it now.
  528.     
  529.         if (full_access)
  530.         {
  531.             playlist_focus_button.moveTo( playlist_focus_button.left, playlist_focus_button.top, 500 );
  532.         }
  533.         else
  534.         {
  535.             // However, base playlists don't like having an empty
  536.             // name, so we account for this.
  537.             
  538.             if (playlist_edit_text.value == '')
  539.             {
  540.                 pl.playlist.name = 'Untitled';
  541.             }
  542.             else
  543.             {
  544.                 pl.playlist.name = playlist_edit_text.value;
  545.             }
  546.         }
  547.     }
  548. }
  549.  
  550. //****************************************************************
  551.  
  552. function onRefreshPlaylistName()
  553. {
  554.     if (pl.visible)
  555.     {
  556.         // We can only reassign the name provided if it is not
  557.         // already a playlist name... if it is, then the library
  558.         // will barf on us.
  559.         
  560.         if (null == getLibraryPlaylist( playlist_edit_text.value ))
  561.         {
  562.             pl.playlist.name = playlist_edit_text.value;
  563.  
  564.             // Refresh the playlists listbox
  565.  
  566.             LB_playlists.setupLB( DJQuery.getPlaylistListQ(), DJQuery.getPlaylistCountQ() );
  567.         
  568.             // We don't have to mark the query as dirty, but we do
  569.             // have to update the query text and make sure the
  570.             // include / exclude bars are pointing in the right
  571.             // direction
  572.             
  573.             query_text.value            = DJQuery.getQueryDescriptionQ();
  574.             onPlaylistSelectionChange();
  575.         }
  576.     }
  577. }
  578.  
  579. //****************************************************************
  580.  
  581. function fixPreviewColumns()
  582. {
  583.     if (pl.visible)
  584.     {
  585.         var colCount = 0;
  586.         var cols;
  587.  
  588.         if (pl.width < 275)
  589.         {
  590.             cols = "name;duration;";
  591.             colCount = 2;
  592.         }
  593.         else if (pl.width < 375)
  594.         {
  595.             cols = "name;artist;duration;";
  596.             colCount = 3;
  597.         }
  598.         else if (pl.width < 475)
  599.         {
  600.             cols = "name;artist;album;duration;";
  601.             colCount = 4;
  602.         }
  603.         else if (pl.width < 575)
  604.         {
  605.             cols = "name;artist;album;genre;duration;"
  606.             colCount = 5;
  607.         }
  608.         else
  609.         {
  610.             cols = "name;artist;album;genre;bitrate;duration;"
  611.             colCount = 6;
  612.         }
  613.  
  614.         if (pl.columns != cols)
  615.         {
  616.             pl.columns = cols;
  617.             pl.setColumnResizeMode( 0, "Stretches" );
  618.             for (var nIndex = 1; nIndex < colCount; nIndex++)
  619.             {
  620.                 pl.setColumnResizeMode( nIndex, "AutoSizeData" );
  621.             }
  622.         }
  623.     }
  624. }
  625.  
  626. //****************************************************************
  627.  
  628. function checkPlaylistCount()
  629. {
  630.     if (pl.visible && g_nLastCount != pl.playlist.count)
  631.     {
  632.         g_fReturnResults = true;
  633.         results_length_text.moveTo( results_length_text.left, 114, 300 );
  634.     }
  635. }
  636.  
  637. //****************************************************************
  638.  
  639. function onResultsEndMove()
  640. {
  641.     if (g_fReturnResults)
  642.     {
  643.         g_fReturnResults = false;
  644.         results_length_text.value   = '(' + pl.playlist.count + ' items - ' + formatSecondsString( getPlaylistLength( pl.playlist ) ) + ')';
  645.         results_length_text.moveTo( results_length_text.left, 96, 300 );
  646.         g_nLastCount = pl.playlist.count;
  647.     }
  648. }
  649.  
  650. //****************************************************************
  651.  
  652. function doQuery()
  653. {
  654.     build_button.enabled        = false;
  655.     reset_button.enabled        = false;
  656.     build_text.foregroundcolor  = '#E7651A';
  657.     instructions_text.visible   = true;
  658.     instructions_text.value     = "Building Playlist"    
  659.     query_progress.visible      = true;
  660.     pl.visible                  = false;
  661.     results_length_text.moveTo( results_length_text.left, 114, 1000 );
  662.     
  663.     DJQuery.shuffle_playlist    = (!event.shiftKey);
  664.  
  665.     DJQuery.performQueryQ( full_access ? playlist_edit_text.value : '' );
  666. }
  667.  
  668. //****************************************************************
  669.  
  670. function onCompleteQuery()
  671. {
  672.     // Refresh the playlists listbox
  673.  
  674.     LB_playlists.setupLB( DJQuery.getPlaylistListQ(), DJQuery.getPlaylistCountQ() );
  675.  
  676.     // And update the rest of theUI
  677.  
  678.     build_button.enabled        = true;
  679.     reset_button.enabled        = true;
  680.     query_progress.visible      = false;
  681.     
  682.     results_label_text.value    = 'Results:';
  683.  
  684.     var plResult                = full_access ? DJQuery.plLibraryResult : DJQuery.plQueryResult;
  685.     
  686.     if (!full_access || player.playState == 0 || player.playState == 1 || player.playState == 10)
  687.     {
  688.         // So, if the user isn't playing anything, or if they're only
  689.         // getting query playlists, then we go ahead and put our playlist on core.
  690.         
  691.         player.settings.autoStart   = true;
  692.         player.currentPlaylist      = plResult;
  693.     }
  694.  
  695.     if (plResult.count == 0)
  696.     {
  697.         instructions_text.value = 'No matching tracks found';
  698.     }
  699.     else
  700.     {    
  701.         instructions_text.visible   = false;
  702.         pl.playlist                 = plResult;
  703.         pl.visible                  = true;
  704.         if (!full_access)
  705.         {
  706.             pl.playlist.name        = playlist_edit_text.value;
  707.         }
  708.         g_nLastCount = pl.playlist.count;
  709.         results_length_text.moveTo( results_length_text.left, 96, 1000 );
  710.         results_length_text.value   = '(' + pl.playlist.count + ' items - ' + formatSecondsString(DJQuery.nCurrentLength) + ')';
  711.     }
  712. }
  713.  
  714.  
  715.  
  716.  
  717. //****************************************************************
  718. // Utility
  719. //****************************************************************
  720.  
  721. function fixupIncludeExclude( item, include_array, exclude_array, basecolor, include_button, exclude_button )
  722. {
  723.     if (inArray( item, include_array ))
  724.     {
  725.         include_button.image        = "AutoDj_maxmid_" + basecolor + "left_up.bmp";
  726.         include_button.downImage    = "AutoDj_maxmid_" + basecolor + "left_down.bmp";
  727.         include_button.hoverImage   = "AutoDj_maxmid_" + basecolor + "left_over.bmp";
  728.  
  729.         exclude_button.image        = "AutoDj_maxmid_" + basecolor + "right_up.bmp";
  730.         exclude_button.downImage    = "AutoDj_maxmid_" + basecolor + "right_down.bmp";
  731.         exclude_button.hoverImage   = "AutoDj_maxmid_" + basecolor + "right_over.bmp";
  732.     }
  733.     else if (inArray( item, exclude_array ))
  734.     {
  735.         include_button.image        = "AutoDj_maxmid_" + basecolor + "right_up.bmp";
  736.         include_button.downImage    = "AutoDj_maxmid_" + basecolor + "right_down.bmp";
  737.         include_button.hoverImage   = "AutoDj_maxmid_" + basecolor + "right_over.bmp";
  738.  
  739.         exclude_button.image        = "AutoDj_maxmid_" + basecolor + "left_up.bmp";
  740.         exclude_button.downImage    = "AutoDj_maxmid_" + basecolor + "left_down.bmp";
  741.         exclude_button.hoverImage   = "AutoDj_maxmid_" + basecolor + "left_over.bmp";
  742.     }
  743.     else
  744.     {
  745.         include_button.image        = "AutoDj_maxmid_" + basecolor + "right_up.bmp";
  746.         include_button.downImage    = "AutoDj_maxmid_" + basecolor + "right_down.bmp";
  747.         include_button.hoverImage   = "AutoDj_maxmid_" + basecolor + "right_over.bmp";
  748.  
  749.         exclude_button.image        = "AutoDj_maxmid_" + basecolor + "right_up.bmp";
  750.         exclude_button.downImage    = "AutoDj_maxmid_" + basecolor + "right_down.bmp";
  751.         exclude_button.hoverImage   = "AutoDj_maxmid_" + basecolor + "right_over.bmp";
  752.     }
  753. }
  754.  
  755.  
  756.  
  757. //****************************************************************
  758. // Operations affecting the Genre Pane
  759. //****************************************************************
  760.  
  761. function onGenreSelectionChange()
  762. {
  763.     fixupIncludeExclude( LB_genre.nSelectedIndex, DJQuery.genre_include_array, DJQuery.genre_exclude_array, "green", genre_include_button, genre_exclude_button );
  764. }
  765.  
  766. //****************************************************************
  767.  
  768. function includeGenre()
  769. {
  770.     DJQuery.addGenreIncludeQ( LB_genre.nSelectedIndex );
  771.     onGenreSelectionChange();
  772.     makeQueryDirty();
  773. }
  774.  
  775. //****************************************************************
  776.  
  777. function excludeGenre()
  778. {
  779.     DJQuery.addGenreExcludeQ( LB_genre.nSelectedIndex );
  780.     onGenreSelectionChange();
  781.     makeQueryDirty();
  782. }
  783.  
  784.  
  785.  
  786. //****************************************************************
  787. // Operations affecting the Artist Pane
  788. //****************************************************************
  789.  
  790. function onArtistSelectionChange()
  791. {
  792.     fixupIncludeExclude( LB_artist.nSelectedIndex, DJQuery.artist_include_array, DJQuery.artist_exclude_array, "green", artist_include_button, artist_exclude_button );
  793. }
  794.  
  795. //****************************************************************
  796.  
  797. function includeArtist()
  798. {
  799.     DJQuery.addArtistIncludeQ( LB_artist.nSelectedIndex );
  800.     onArtistSelectionChange();
  801.     makeQueryDirty();
  802. }
  803.  
  804. //****************************************************************
  805.  
  806. function excludeArtist()
  807. {
  808.     DJQuery.addArtistExcludeQ( LB_artist.nSelectedIndex );
  809.     onArtistSelectionChange();
  810.     makeQueryDirty();
  811. }
  812.  
  813.  
  814.  
  815. //****************************************************************
  816. // Operations affecting the Album Pane
  817. //****************************************************************
  818.  
  819. function onAlbumSelectionChange()
  820. {
  821.     fixupIncludeExclude( LB_album.nSelectedIndex, DJQuery.album_include_array, DJQuery.album_exclude_array, "green", album_include_button, album_exclude_button );
  822. }
  823.  
  824. //****************************************************************
  825.  
  826. function includeAlbum()
  827. {
  828.     DJQuery.addAlbumIncludeQ( LB_album.nSelectedIndex );
  829.     onAlbumSelectionChange();
  830.     makeQueryDirty();
  831. }
  832.  
  833. //****************************************************************
  834.  
  835. function excludeAlbum()
  836. {
  837.     DJQuery.addAlbumExcludeQ( LB_album.nSelectedIndex );
  838.     onAlbumSelectionChange();
  839.     makeQueryDirty();
  840. }
  841.  
  842.  
  843.  
  844.  
  845. //****************************************************************
  846. // Operations affecting the Playlists Pane
  847. //****************************************************************
  848.  
  849. function onPlaylistSelectionChange()
  850. {
  851.     fixupIncludeExclude( LB_playlists.nSelectedIndex, DJQuery.playlist_include_array, DJQuery.playlist_exclude_array, "red", playlists_include_button, playlists_exclude_button );
  852.     
  853.     preview_playlist.playlist = DJQuery.playlist_collection.item( LB_playlists.nSelectedIndex );
  854. }
  855.  
  856. //****************************************************************
  857.  
  858. function includePlaylist()
  859. {
  860.     DJQuery.addPlaylistIncludeQ( LB_playlists.nSelectedIndex );
  861.     onPlaylistSelectionChange();
  862.     makeQueryDirty();
  863. }
  864.  
  865. //****************************************************************
  866.  
  867. function excludePlaylist()
  868. {
  869.     DJQuery.addPlaylistExcludeQ( LB_playlists.nSelectedIndex );
  870.     onPlaylistSelectionChange();
  871.     makeQueryDirty();
  872. }
  873.  
  874.  
  875.  
  876.  
  877. //****************************************************************
  878. // Operations affecting the Advanced Pane
  879. //****************************************************************
  880.  
  881. function resynchOptions()
  882. {
  883.     DJQuery.allow_playlists             = CB_allow_playlists.fChecked;
  884.     DJQuery.allow_urls                  = CB_allow_urls.fChecked;
  885.     DJQuery.allow_blank                 = CB_allow_blank.fChecked;
  886.     
  887.     DJQuery.playcount_favoring          = CB_bias.fChecked;
  888.     bias_comparison_text.value          = DJQuery.getPlaycountFavoringComparisonStringQ();
  889.     
  890.     DJQuery.playcount_filter            = CB_playcount.fChecked;
  891.     playcount_comparison_text.value     = DJQuery.getPlaycountFilterComparisonStringQ();
  892.     playcount_count_text.value          = DJQuery.playcount_filter_count;
  893.     
  894.     DJQuery.playlength_filter           = CB_playlength.fChecked;
  895.     playlength_comparison_text.value    = DJQuery.getPlaylengthFilterComparisonStringQ();
  896.     playlength_count_text.value         = formatSecondsString( DJQuery.playlength_filter_length );
  897.  
  898.     makeQueryDirty();
  899. }
  900.  
  901. //****************************************************************
  902.  
  903. function changeBiasComparison()
  904. {
  905.     DJQuery.playcount_favoring_comparison++;
  906.     if (DJQuery.playcount_favoring_comparison > 1)
  907.     {
  908.         DJQuery.playcount_favoring_comparison = 0;
  909.     }
  910.     resynchOptions();
  911. }
  912.  
  913. //****************************************************************
  914.  
  915. function changePlaycountComparison()
  916. {
  917.     DJQuery.playcount_filter_comparison++;
  918.     if (DJQuery.playcount_filter_comparison > 2)
  919.     {
  920.         DJQuery.playcount_filter_comparison = 0;
  921.     }
  922.     resynchOptions();
  923. }
  924.  
  925. //****************************************************************
  926.  
  927. function changePlaycount( nDirection )
  928. {
  929.     var nMove = nDirection * (event.shiftKey ? 5 : 1);
  930.         
  931.     DJQuery.playcount_filter_count += nMove;
  932.     if (DJQuery.playcount_filter_count < 0)
  933.     {
  934.         DJQuery.playcount_filter_count = 0;
  935.     }
  936.     resynchOptions();
  937. }
  938.  
  939. //****************************************************************
  940.  
  941. function changePlaylengthComparison()
  942. {
  943.     DJQuery.playlength_filter_comparison++;
  944.     if (DJQuery.playlength_filter_comparison > 1)
  945.     {
  946.         DJQuery.playlength_filter_comparison = 0;
  947.     }
  948.     resynchOptions();
  949. }
  950.  
  951. //****************************************************************
  952.  
  953. function changePlaylength( nDirection )
  954. {
  955.     var nMove = nDirection * (event.shiftKey ? 1 : 30);
  956.         
  957.     DJQuery.playlength_filter_length += nMove;
  958.     if (DJQuery.playlength_filter_length < 0)
  959.     {
  960.         DJQuery.playlength_filter_length = 0;
  961.     }
  962.     resynchOptions();
  963. }
  964.  
  965. //****************************************************************
  966.  
  967. function resynchSearchOptions()
  968. {
  969.     SearchQuery.generic_search_name     = search_name_array[g_nSearchIndex];
  970.     search_name_text.value              = search_name_array[g_nSearchIndex];
  971.     
  972.     search_comparison_text.value        = SearchQuery.getGenericSearchComparisonStringQ();
  973.     
  974.     SearchQuery.generic_search_value    = value_edit_text.value;
  975. }
  976.  
  977. //****************************************************************
  978.  
  979. function onCompleteSearch()
  980. {
  981.     if (SearchQuery.query_aborted)
  982.     {
  983.         onSearchExecute();
  984.     }
  985.     else
  986.     {
  987.         search_progress.visible             = false;
  988.  
  989.         var fFound = (SearchQuery.plQueryResult.count != 0);
  990.         
  991.         if (fFound)
  992.         {
  993.             search_playlist.playlist            = SearchQuery.plQueryResult;
  994.             search_instructions_text.visible    = false;
  995.             search_playlist.visible             = true;
  996.         }
  997.         else
  998.         {            
  999.             search_instructions_text.value      = 'No Matches Found';
  1000.         }
  1001.  
  1002.         enableSearchButtons( fFound );
  1003.     }
  1004. }
  1005.  
  1006. //****************************************************************
  1007.  
  1008. function enableSearchButtons( fEnabled )
  1009. {
  1010.     search_include_button.enabled           = fEnabled;
  1011.     search_include_button.cursor            = fEnabled ? "hand" : "system";
  1012.     search_include_text.cursor              = search_include_button.cursor;
  1013.     search_exclude_button.enabled           = fEnabled;
  1014.     search_exclude_button.cursor            = fEnabled ? "hand" : "system";
  1015.     search_exclude_text.cursor              = search_exclude_button.cursor;              
  1016. }
  1017.  
  1018. //****************************************************************
  1019.  
  1020. function onSearchValueTextChange()
  1021. {
  1022.     g_fSearchChanged = true;
  1023.  
  1024.     resynchSearchOptions();
  1025.     onSearchChanged();
  1026. }
  1027.  
  1028. //****************************************************************
  1029.  
  1030. function onSearchChanged()
  1031. {
  1032.     var str = search_name_text.value + ' ' + search_comparison_text.value + ' ' + value_edit_text.value;
  1033.     fixupIncludeExclude( str, DJQuery.search_include_array_txt, DJQuery.search_exclude_array_txt, "blue", search_include_button, search_exclude_button );
  1034.     
  1035.     if (g_fSearchChanged)
  1036.     {
  1037.         search_instructions_text.moveTo( search_instructions_text.left, search_instructions_text.top, 800 );
  1038.     }
  1039. }
  1040.  
  1041. //****************************************************************
  1042.  
  1043. function onSearchExecute()
  1044. {
  1045.     if (!SearchQuery.performing_query)
  1046.     {
  1047.         search_playlist.visible             = false;
  1048.         search_instructions_text.visible    = true;
  1049.         search_instructions_text.value      = 'Performing Search';
  1050.         search_progress.visible             = true;
  1051.         enableSearchButtons( false );
  1052.         SearchQuery.generic_search          = true;
  1053.         SearchQuery.performQueryQ( '' );
  1054.     }
  1055.     else
  1056.     {
  1057.         SearchQuery.query_aborted           = true;    
  1058.     }
  1059. }
  1060.  
  1061. //****************************************************************
  1062.  
  1063. function changeSearchName()
  1064. {
  1065.     var nMove = (event.shiftKey ? -1 : 1);
  1066.         
  1067.     g_nSearchIndex += nMove;
  1068.     if (g_nSearchIndex < 0)
  1069.     {
  1070.         g_nSearchIndex = search_name_array.count - 1;
  1071.     }        
  1072.     else if (g_nSearchIndex >= search_name_array.count)
  1073.     {
  1074.         g_nSearchIndex = 0;
  1075.     }
  1076.     resynchSearchOptions();
  1077.     onSearchChanged();
  1078. }
  1079.  
  1080. //****************************************************************
  1081.  
  1082. function changeSearchComparison()
  1083. {
  1084.     var nMove = (event.shiftKey ? -1 : 1);
  1085.         
  1086.     SearchQuery.generic_search_comparison++;
  1087.     if (SearchQuery.generic_search_comparison < 0)
  1088.     {
  1089.         SearchQuery.generic_search_comparison = 3;
  1090.     }
  1091.     else if (SearchQuery.generic_search_comparison > 3)
  1092.     {
  1093.         SearchQuery.generic_search_comparison = 0;
  1094.     }
  1095.     resynchSearchOptions();
  1096.     onSearchChanged();
  1097. }
  1098.  
  1099. //****************************************************************
  1100.  
  1101. function includeSearch()
  1102. {
  1103.     var str = search_name_text.value + ' ' + search_comparison_text.value + ' ' + value_edit_text.value;
  1104.  
  1105.     DJQuery.addSearchPlaylistIncludeQ( str, search_playlist.playlist );
  1106.     fixupIncludeExclude( str, DJQuery.search_include_array_txt, DJQuery.search_exclude_array_txt, "blue", search_include_button, search_exclude_button );
  1107.     makeQueryDirty();
  1108. }
  1109.  
  1110. //****************************************************************
  1111.  
  1112. function excludeSearch()
  1113. {
  1114.     var str = search_name_text.value + ' ' + search_comparison_text.value + ' ' + value_edit_text.value;
  1115.  
  1116.     DJQuery.addSearchPlaylistExcludeQ( str, search_playlist.playlist );
  1117.     fixupIncludeExclude( str, DJQuery.search_include_array_txt, DJQuery.search_exclude_array_txt, "blue", search_include_button, search_exclude_button );
  1118.     makeQueryDirty();
  1119. }
  1120.  
  1121. //****************************************************************
  1122.  
  1123. function fixSearchPlaylistColumns()
  1124. {
  1125.     if (search_playlist.visible)
  1126.     {
  1127.         var colCount = 0;
  1128.         var cols;
  1129.  
  1130.         if ((pl.width < 325) || (g_nSearchIndex == 0))
  1131.         {
  1132.             cols = "name";
  1133.             colCount = 1;
  1134.         }
  1135.         else
  1136.         {
  1137.             cols = "name;" + search_name_array[g_nSearchIndex];
  1138.             colCount = 2;
  1139.         }
  1140.  
  1141.         if (search_playlist.columns != cols)
  1142.         {
  1143.             search_playlist.columns = cols;
  1144.             search_playlist.setColumnResizeMode( 0, "Stretches" );
  1145.             for (var nIndex = 1; nIndex < colCount; nIndex++)
  1146.             {
  1147.                 search_playlist.setColumnResizeMode( nIndex, "AutoSizeData" );
  1148.             }
  1149.         }
  1150.     }
  1151. }
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157. //****************************************************************
  1158. // Tab Transitions
  1159. //****************************************************************
  1160.  
  1161. function switchToTab( nIndex, nSpeed )
  1162. {
  1163.     if (nIndex != g_nFocusTab)
  1164.     {
  1165.         transitionAway( g_nFocusTab, nSpeed );
  1166.         g_nFocusTab = nIndex;
  1167.         transitionTo( g_nFocusTab, nSpeed );
  1168.     }
  1169.     else
  1170.     {
  1171.         enableTab( g_nFocusTab, true );    
  1172.     }
  1173. }
  1174.  
  1175. //****************************************************************
  1176.  
  1177. function transitionAway( nIndex, nTime )
  1178. {
  1179.     switch (nIndex)
  1180.     {
  1181.     case 0:
  1182.         genre_sv.moveTo( -genre_sv.width, view.height - genre_sv.height, nTime );
  1183.         artist_sv.moveTo( -artist_sv.width, artist_sv.top, nTime );
  1184.         album_sv.moveTo( -album_sv.width, 32, nTime );
  1185.         break;
  1186.         
  1187.     case 1:
  1188.         playlists_sv.moveTo( playlists_sv.width, 32 - playlists_sv.height, nTime );
  1189.         preview_playlist.visible    = false;
  1190.         break;
  1191.  
  1192.     case 2:
  1193.         advanced_sv.moveTo( advanced_sv.width, view.height, nTime );
  1194.         break;
  1195.     }
  1196.  
  1197.     enableTab( nIndex, false );
  1198. }
  1199.  
  1200. //****************************************************************
  1201.  
  1202. function transitionTo( nIndex, nTime )
  1203. {
  1204.     switch (nIndex)
  1205.     {
  1206.     case 0:
  1207.         genre_sv.moveTo( 0, 32, nTime );
  1208.         artist_sv.moveTo( 0, 32 + genre_sv.height, nTime );
  1209.         album_sv.moveTo( 0, view.height - album_sv.height, nTime );
  1210.         break;
  1211.         
  1212.     case 1:
  1213.         playlists_sv.moveTo( 0, 32, nTime );
  1214.         break;
  1215.         
  1216.     case 2:
  1217.         search_playlist.enabled = true;
  1218.         advanced_sv.moveTo( 0, 32, nTime );
  1219.         break;
  1220.     }
  1221.  
  1222.     enableTab( nIndex, true );
  1223. }
  1224.  
  1225. //****************************************************************
  1226.  
  1227. function enableTab( nIndex, fEnabled )
  1228. {
  1229.     switch (nIndex)
  1230.     {
  1231.     case 0:
  1232.         genre_include_text.enabled          = fEnabled;
  1233.         genre_exclude_text.enabled          = fEnabled;
  1234.         artist_include_text.enabled         = fEnabled;
  1235.         artist_exclude_text.enabled         = fEnabled;
  1236.         album_include_text.enabled          = fEnabled;
  1237.         album_exclude_text.enabled          = fEnabled;
  1238.         attributes_tab_text.enabled         = !fEnabled;
  1239.         attributes_focus_button.enabled     = !fEnabled;
  1240.         attributes_focus_button.cursor      = fEnabled ? "system" : "hand";
  1241.         genre_lb_focus_button.enabled       = fEnabled;
  1242.         artist_lb_focus_button.enabled      = fEnabled;
  1243.         album_lb_focus_button.enabled       = fEnabled;
  1244.         break;
  1245.     
  1246.     case 1:
  1247.         playlists_include_text.enabled      = fEnabled;
  1248.         playlists_exclude_text.enabled      = fEnabled;
  1249.         playlists_tab_text.enabled          = !fEnabled;
  1250.         playlists_focus_button.enabled      = !fEnabled;
  1251.         playlists_focus_button.cursor       = fEnabled ? "system" : "hand";
  1252.         playlists_lb_focus_button.enabled   = fEnabled;
  1253.         break;
  1254.  
  1255.     case 2:
  1256.         playlist_check_text.enabled         = fEnabled;
  1257.         url_check_text.enabled              = fEnabled;
  1258.         blank_check_text.enabled            = fEnabled;
  1259.         bias_check_text.enabled             = fEnabled;
  1260.         bias_comparison_text.enabled        = fEnabled;
  1261.         playcount_check_text.enabled        = fEnabled;
  1262.         playcount_comparison_text.enabled   = fEnabled;
  1263.         playcount_reduce_text.enabled       = fEnabled;
  1264.         playcount_increase_text.enabled     = fEnabled;
  1265.         playlength_check_text.enabled       = fEnabled;
  1266.         playlength_comparison_text.enabled  = fEnabled;
  1267.         playlength_reduce_text.enabled      = fEnabled;
  1268.         playlength_increase_text.enabled    = fEnabled;
  1269.         search_name_text.enabled            = fEnabled;
  1270.         search_comparison_text.enabled      = fEnabled;
  1271.         value_focus_button.enabled          = fEnabled;
  1272.         search_include_text.tabstop         = fEnabled;
  1273.         search_exclude_text.tabstop         = fEnabled;
  1274.         advanced_tab_text.enabled           = !fEnabled;
  1275.         advanced_focus_button.enabled       = !fEnabled;
  1276.         advanced_focus_button.cursor        = fEnabled ? "system" : "hand";
  1277.         break;    
  1278.     }
  1279. }
  1280.  
  1281. //****************************************************************
  1282.  
  1283. function onPlaylistsTabEndMove()
  1284. {
  1285.     if (g_nFocusTab == 1)
  1286.     {
  1287.         preview_playlist.visible = true;
  1288.         preview_playlist.setColumnResizeMode( 0, "Stretches" );
  1289.         preview_playlist.setColumnResizeMode( 1, "AutoSizeData" );
  1290.     }
  1291. }
  1292.  
  1293. //****************************************************************
  1294.  
  1295. function onAdvancedTabEndMove()
  1296. {
  1297.     if (g_nFocusTab != 2)
  1298.     {
  1299.         search_playlist.enabled = false;
  1300.     }
  1301. }
  1302.  
  1303.  
  1304. //****************************************************************
  1305. // Resizing
  1306. //****************************************************************
  1307.  
  1308. function onHeightChange()
  1309. {
  1310.     var vh              = view.height;
  1311.     var nExtra          = vh - 458;
  1312.  
  1313.     genre_sv.height     = 140 + Math.floor(nExtra / 3);
  1314.     artist_sv.height    = genre_sv.height;
  1315.     album_sv.height     = 146 + Math.floor(nExtra / 3) + (nExtra % 3);
  1316.  
  1317.     switch (g_nFocusTab)
  1318.     {
  1319.     case 0:
  1320.         artist_sv.top   = 32 + genre_sv.height;
  1321.         album_sv.top    = vh - album_sv.height;
  1322.         playlists_sv.moveTo( playlists_sv.left, -playlists_sv.height, 0 );
  1323.         advanced_sv.moveTo( advanced_sv.left, vh, 0 );
  1324.         break;
  1325.         
  1326.     case 1:
  1327.         advanced_sv.moveTo( advanced_sv.left, vh, 0 );
  1328.         break;
  1329.     
  1330.     case 2:
  1331.         playlists_sv.moveTo( playlists_sv.left, -playlists_sv.height, 0 );
  1332.         break;
  1333.     }
  1334. }
  1335.  
  1336. //****************************************************************
  1337.  
  1338. function onWidthChange()
  1339. {
  1340.     var vw              = view.width;
  1341.     var nExtra          = vw - 640;
  1342.     var nLeftWidth      = 255 + Math.floor(nExtra / 3);
  1343.     
  1344.     genre_sv.width      = nLeftWidth;
  1345.     artist_sv.width     = nLeftWidth;
  1346.     album_sv.width      = nLeftWidth;
  1347.     playlists_sv.width  = nLeftWidth;
  1348.     advanced_sv.width   = nLeftWidth;
  1349.  
  1350.     switch (g_nFocusTab)
  1351.     {
  1352.     case 0:
  1353.         playlists_sv.left   = nLeftWidth;
  1354.         advanced_sv.left    = nLeftWidth;
  1355.         break;
  1356.  
  1357.     case 1:
  1358.         advanced_sv.left    = nLeftWidth;
  1359.         genre_sv.left       = -genre_sv.width;
  1360.         artist_sv.left      = -artist_sv.width;
  1361.         album_sv.left       = -album_sv.width;
  1362.         break;
  1363.  
  1364.     case 2:
  1365.         playlists_sv.left   = nLeftWidth;
  1366.         genre_sv.left       = -genre_sv.width;
  1367.         artist_sv.left      = -artist_sv.width;
  1368.         album_sv.left       = -album_sv.width;
  1369.         break;
  1370.     }
  1371.     
  1372.     query_sv.left           = nLeftWidth;
  1373.     query_sv.width          = vw - nLeftWidth;
  1374.     transport_sv.left       = nLeftWidth;
  1375.     transport_sv.width      = vw - nLeftWidth;
  1376.     
  1377.     nLeftExtra              = nLeftWidth - 255;
  1378.     var nLeftDiv3           = Math.floor( nLeftExtra / 3);
  1379.  
  1380.     attributes_tab_sv.width = 89 + nLeftDiv3;
  1381.     green_edging.left       = attributes_tab_sv.width - 5;
  1382.  
  1383.     playlists_tab_sv.left   = attributes_tab_sv.width;
  1384.     playlists_tab_sv.width  = 84 + nLeftDiv3;
  1385.     red_edging.left         = playlists_tab_sv.left + playlists_tab_sv.width - 5;
  1386.     
  1387.     advanced_tab_sv.left    = playlists_tab_sv.left + playlists_tab_sv.width;
  1388.     advanced_tab_sv.width   = 82 + nLeftDiv3 + (nLeftExtra % 3);
  1389.  
  1390.     // Transport re-sizing
  1391.     
  1392.     var oneThirdWidth   =   (transport_sv.width - bgFull.width - bgToggle.width - 32) / 3;
  1393.     bgTransport.left    =   bgToggle.left + bgToggle.width + oneThirdWidth - (bgTransport.width / 2);
  1394.     sVolume.left        =   bgToggle.left + bgToggle.width + (2.5 * oneThirdWidth) - (sVolume.width / 2);
  1395. }
  1396.  
  1397.