发布 shawl.qiu Javascript 媒体播放器 sqMusicPlayer v1.0 Final

时间:2021-08-12 18:23:48

发布 shawl.qiu Javascript 媒体播放器 sqMusicPlayer v1.0 Final


说明:
为什么要写这个 web 播放器?
因为 web 多媒体是本人的死角! 为了摆脱这个死角, 最好的办法就是写个相关的东西出来.
这个播放器今天总算完成了预期功能, 我的初衷也得以实现了.

目录:
1. 功能介绍
2. 调用页演示
3. sqMusicPlayer v1.0 Final 核心源码

shawl.qiu
2007-05-11
shawl.qiu@gmail.com

下载:(由于体重原因, 不包含测试MP3)
http://shawl.qiu.googlepages.com/sqMusicPlayer_v1.0_Final.7z
http://files.myopera.com/btbtd/sqMusicPlayer/sqMusicPlayer_v1.0_Final.7z

内容:

1. 功能介绍
v1.0 Beta 没正式发布, 也就不说明功能了
sqMusicPlayer v1.0 Final 实现功能概述:
  • 1. 支持从本地加载播放列表, Iframe 实现.(但这个功能由于目前没应用, 因此没去完成动态加载列表功能)
  • 2. 支持 纯 js 跨域加载播放列表, 相关技术见:
  •  shawl.qiu javascript 跨域类... sqCrossDomain v1.0
  •  http://blog.csdn.net/btbtd/archive/2007/05/10/1603666.aspx
  • 3. 支持自动播放列表
  • 4. 支持以mqrquee 标签显示当前播放歌曲的标题
  • 5. 支持动态设置默认播放歌曲
  • 6. 支持动态显示播放器宽高大小
  • 7. 支持动态设置默认为 Media 或 Real 播放器
  • 8. 支持动态设置默认播放列表
  • 9. 在播放列表页显示播放状态
  • 10. 动态选择播放列表
  • 11. 动态选择播放曲目
  • 12. ... 这个播放器还有其他隐藏功能, 有兴趣的自己研究.

2. 调用页演示
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <!-- DW6 -->
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>shawl.qiu tesqPlayerlate</title>
  7. <style type="text/css">
  8. /* <![CDATA[ */
  9. #PlayerControl
  10. {
  11.  padding:5px 2px;
  12. }
  13. /* ]]> */
  14. </style>
  15. <script type='text/javascript' src='sqMusicPlayer_v1.0_Final.js'></script>
  16. <script type="text/javascript">
  17. //<![CDATA[
  18.  onload = 
  19.   function()
  20.   { 
  21.    sqPlayer.IntiName = "sqPlayer";
  22.    sqPlayer.OffsetSelect = 0;
  23.    sqPlayer.Width = "130";
  24.    sqPlayer.Height = "150";
  25.    sqPlayer.Player.ID = "PlayerId";
  26.    sqPlayer.Player.Media = true;
  27.    //sqPlayer.Player.Real = true;
  28.    sqPlayer.Player.Playlist = true;
  29.    
  30.    sqPlayer.List.DefaultList = 1;
  31.    
  32.    /* 从 iframe 加载列表 */
  33. /*
  34.    sqPlayer.List.Iframe.ID = "PlayListIfm";
  35.    sqPlayer.List.Iframe.Go();    
  36. */
  37.    
  38.    /* 从 远程 域加载列表 */
  39.    sqPlayer.Remote.Ms = 100;
  40.    sqPlayer.Remote.Limit = 10000;
  41.    
  42.    sqPlayer.Remote.AddPlayList
  43.    (
  44.     "万维网列表 1",
  45.     "http://files.myopera.com/btbtd/sqMusicPlayer/PlayList/network_playlist1_script.txt"
  46.    );
  47.    
  48.    sqPlayer.Remote.AddPlayList
  49.    (
  50.     "本地列表 1",
  51.     "/sqMusicPlayer/playlist/local_playlist1_script.txt"
  52.    );
  53.    
  54.    sqPlayer.Remote.ScriptId="SptTextId";
  55.    sqPlayer.Remote.VariableName = "ScriptText";
  56.    sqPlayer.Remote.ErrorMsg = "加载列表时超时, 操作无法进行!";
  57.    sqPlayer.Remote.Go()
  58.   } // end onload 
  59. //]]>
  60. </script>
  61. </head>
  62. <body>
  63. <!-- <iframe id="PlayListIfm" src="playlist/local_playlist1.txt" style='display:none;'></iframe> -->
  64. <div id="PlayerMain">
  65. </div>
  66. </body>
  67. </html>


3. sqMusicPlayer v1.0 Final 核心源码
  1. // shawl.qiu JavaScript Document
  2.  /*-----------------------------------------------------------------------------------*/
  3.   * shawl.qiu sqMusicPlayer class v1.0
  4.  /*-----------------------------------------------------------------------------------*/
  5.  //---------------------------------begin class sqMusicPlayer()-------------------------------//
  6.  function sqMusicPlayer()
  7.  { // shawl.qiu code
  8.   //------------------------------------begin public variable
  9.   //---------------begin about
  10.   this.auSubject = 'shawl.qiu sqMusicPlayer class';
  11.   this.auVersion = 'v1.0 Final';
  12.   this.au = 'shawl.qiu';
  13.   this.auEmail = 'shawl.qiu@gmail.com';
  14.   this.auBlog = 'http://blog.csdn.net/btbtd';
  15.   this.auCreateDate = '2007-5-7';
  16.   this.auUpdate1 = '2007-5-11 v1.0 Final';
  17.   //---------------end about
  18.   
  19.   this.Debug = false;
  20.   
  21.   this.ID = "PlayerMain";
  22.   this.IntiName = "Mp";
  23.   
  24.   this.AutoPlay = false;
  25.   this.OffsetSelect = 0;
  26.   this.Width = "300";
  27.   this.Height = "200";
  28.   
  29.   this.Player = {}
  30.   this.Player.ID = "PlayerId";
  31.   this.Player.Media = false;
  32.   this.Player.Real = false;
  33.   this.Player.Playlist = false;
  34.   
  35.   this.Player.ChangePlayer = fChangePlayer;
  36.   this.Player.ChagneMusic = fChangeMusic;
  37.   this.Player.Cmd = fPlayerCmd;
  38.   this.Player.NextOrPrev = fPlayNextOrPrev;
  39.   
  40.   this.CurrentPlay = {};
  41.   
  42.   this.CurrentPlay.Index = function()
  43.   {
  44.    return Tl.OffsetSelect;
  45.   }
  46.   this.CurrentPlay.Path = function()
  47.   {
  48.    return Tl.List.Array[Tl.OffsetSelect][1];
  49.   }
  50.   
  51.   
  52.   this.Class = {};
  53.   this.Class.Name = "PlayerMain";
  54.   
  55.   this.Control =  {};
  56.   this.Control.ID = "PlayerControl";
  57.   this.Control.ClassName = "PlayerControl";
  58.   
  59.   this.Control.PlayByRadioID = "PlayerByRadio";
  60.   
  61.   this.Title = {};
  62.   this.Title.ID = "PlayTitle";
  63.   this.Title.Marquee = function(){}
  64.   this.Title.Marquee.ID = "PlayTitleMid";
  65.   this.Title.Marquee.Delay = "200";
  66.   
  67.   this.List = {};
  68.   this.List.Viewer = fListViewer;
  69.   this.List.Array = [];
  70.   this.List.Path = [];
  71.   this.List.Add = fAddList;
  72.   this.List.DefaultList = 0;
  73.   this.List.Prefix = "zdfjfkaLkjsdfjasL";
  74.   this.List.Iframe = {};
  75.   this.List.Iframe.ID = "PlayListIfm";
  76.   this.List.Iframe.GetList = fGetListFromIfm;
  77.   this.List.Iframe.Go = fIframeGo;
  78.   
  79.   this.Popup = fWinPopup;
  80.   this.About = fAbout;
  81.   
  82.   this.Go = fGo;
  83.   
  84.   this.ListMethod = fListMethod;
  85.   this.Random = fRandom;
  86.   
  87.   this.GetState = fGetState;
  88.   
  89.   this.Remote = {};
  90.   this.Remote.Symbol = {};
  91.   this.Remote.Symbol.Item = "|";
  92.   this.Remote.Symbol.Song = "||";
  93.   this.Remote.Ms = 100;
  94.   this.Remote.Limit = 10000;
  95.   this.Remote.ScriptUrl = "";
  96.   this.Remote.ScriptId="SptTextId";
  97.   this.Remote.VariableName = "ScriptText";
  98.   this.Remote.CallBack = fRemoteCallBack;
  99.   this.Remote.ErrorMsg = "加载列表时超时, 操作无法进行!";
  100.   this.Remote.PlayList = [];
  101.   this.Remote.AddPlayList = fAddPlayList;
  102.   this.Remote.ChangeList = fRemoteChangeList;
  103.   
  104.   this.Remote.Go = fRemoteGo;
  105.   
  106.   //------------------------------------end public variable
  107.   
  108.   //------------------------------------begin private variable
  109.   var Tl = this;
  110.   var pPlayerMain = null;
  111.   var pOffsetPlay = null;
  112.   var pPlayer = null;
  113.   var pMarquee = null;
  114.   var pListPrefix = "zdfjfkaLkjsdfjasL";
  115.   //------------------------------------end private variable
  116.   
  117.   //------------------------------------begin public method

  118.   function fGetState()
  119.   {
  120.    if(Tl.Player.Real)
  121.    {
  122.     fAttachEvent(Tl.Player.ID, "OnPositionChange", fCkEnding);
  123.     fAttachEvent(Tl.Player.ID, "OnPlayStateChange", fRealPlayStateChange);
  124.    }
  125.    
  126.    if(Tl.Player.Media)
  127.    {
  128.     fAttachEvent(Tl.Player.ID, "EndOfStream", fCkEndingMedia);
  129.     fAttachEvent(Tl.Player.ID, "PlayStateChange", fMediaPlayStateChange);
  130.    }
  131.   } // end function fGetState
  132.   
  133.   function fRealPlayStateChange(iNewState)
  134.   {
  135.    if(typeof(oPopup)=="object")
  136.    {
  137.     if(oPopup.closed)return false;
  138.     var EleSpan = oPopup.document.getElementById("PlayStateId");
  139.     if(EleSpan!=null)
  140.     {
  141.      EleSpan.innerHTML = fReturnPlayStateForReal(iNewState);//fReturnPlayStateForMedia(iNew);
  142.     } // end if 1
  143.    } // end if
  144.   } // function fRealPlayStateChange
  145.   
  146.   function fMediaPlayStateChange(iOld, iNew)
  147.   { 
  148.    if(typeof(oPopup)=="object")
  149.    {
  150.     if(oPopup.closed)return false;
  151.     var Player = document.getElementById(Tl.Player.ID);
  152.     
  153.     var EleSpan = oPopup.document.getElementById("PlayStateId");
  154.     if(EleSpan!=null)
  155.     {
  156.      EleSpan.innerHTML = fReturnPlayStateForMedia(iNew);
  157.     } // end if 1
  158.     
  159. /*
  160.     var EleSpanPlayTotalTime = oPopup.document.getElementById("PlayTotalTime");
  161.     if(EleSpanPlayTotalTime!=null)
  162.     {
  163.      EleSpanPlayTotalTime.innerHTML = fSecondToTime(Player.Duration);
  164.     }
  165. */
  166.    } // end if
  167.   } // end function fMediaReadStateChange
  168.   
  169.   function fRemoteChangeList(sValue, EleSle)
  170.   {
  171.    sValue -=0;
  172.    var bChangeList = oPopup.confirm("Now loadding new playlist <"+Tl.Remote.PlayList[sValue][0]+">?");
  173.    if(!bChangeList)
  174.    {
  175.     EleSle.options[Tl.List.DefaultList].selected = true;
  176.     return;
  177.    }
  178.    
  179.    oPopup.alert("For loadding the new playlist, the window must be closing now.");
  180.    oPopup.close();
  181.    Tl.List.DefaultList = sValue;
  182.    fRemoteGo();
  183.   } // end fRemoteChangeList
  184.   
  185.   function fAddPlayList(sListName, sUrl)
  186.   {
  187.    if(!sListName||sListName=="")
  188.    {
  189.     alert("列表名出错!");
  190.     return;
  191.    }
  192.    if(!sUrl||sUrl=="")
  193.    {
  194.     alert("路径出错!");
  195.     return;
  196.    }
  197.    var iList = Tl.Remote.PlayList.length;
  198.    Tl.Remote.PlayList[iList] = [];
  199.    Tl.Remote.PlayList[iList][0] = sListName;
  200.    Tl.Remote.PlayList[iList][1] = sUrl;
  201.   }
  202.   
  203.   function fRemoteGo()
  204.   {
  205.    if(Tl.Remote.PlayList.length==0)
  206.    {
  207.     alert("列表数组为空!");
  208.     return;
  209.    }
  210.    
  211.    if(Tl.List.DefaultList>Tl.Remote.PlayList.length-1)
  212.    {
  213.     alert("选中的列表不存在, 现在切换至最末的列表!");
  214.     Tl.List.DefaultList = Tl.Remote.PlayList.length-1
  215.    }
  216.    
  217.   var Acd = new sqCrossDomain();
  218.    Acd.Interval.Ms = Tl.Remote.Ms;
  219.    Acd.Interval.Limit = Tl.Remote.Limit;
  220.    
  221.    Acd.Script.Url = Tl.Remote.PlayList[Tl.List.DefaultList][1];
  222.    Acd.Script.ID = Tl.Remote.ScriptId
  223.    
  224.    Acd.Identifier.VariableName = Tl.Remote.VariableName
  225.    Acd.CallBack = fRemoteCallBack;
  226.    
  227.    Acd.Error.Msg = Tl.Remote.ErrorMsg;
  228.    
  229.    Acd.Go();
  230.    Acd = null;
  231.   } // end function fRemoteGo
  232.   
  233.   function fRemoteCallBack(str)
  234.   {
  235. //   alert(str);
  236.    
  237.    var aItem = str.split(Tl.Remote.Symbol.Song);
  238.    if(aItem.length==0)
  239.    {
  240.     alert("加载列表出错!");
  241.     return;
  242.    }
  243.    var arReturn = [];
  244.    for(var i=0, j=aItem.length; i<j; i++)
  245.    {
  246.     var aTemp = aItem[i].split(Tl.Remote.Symbol.Item);
  247.     if(aTemp.length!=2)continue;
  248.     var iNewAr = arReturn.length;
  249.     arReturn[iNewAr] = [];
  250.     arReturn[iNewAr][0] = aTemp[0];
  251.     arReturn[iNewAr][1] = aTemp[1];
  252.    } // end for
  253.    
  254.    Tl.List.Array = arReturn;
  255.    
  256.    fGo();
  257.   }

  258.   function fGo()
  259.   {
  260.    
  261.    pPlayerMain = document.getElementById(Tl.ID);
  262.    
  263.    if(pPlayerMain==null)
  264.    {
  265.     alert("播放主域为 null!");
  266.     return;
  267.    }
  268.    
  269.    fIntiPlayerControl();
  270.    
  271.    if(Tl.List.Array.length==0)
  272.    {
  273.     alert("播放列表为空!");
  274.     return;
  275.    }
  276.    
  277.    if(Tl.List.Array[Tl.OffsetSelect]==null)
  278.    {
  279.     alert("当前播放曲目为 null!");
  280.     return;
  281.    }
  282.   
  283.    if(Tl.Player.Media)
  284.    {
  285.     pPlayerMain.innerHTML = 
  286.     fDisplayWmp
  287.     (
  288.      Tl.Width,
  289.      Tl.Height, 
  290.      Tl.List.Array[Tl.OffsetSelect][1], 
  291.      'PlayerMain', 
  292.      Tl.AutoPlay,
  293.       Tl.Player.ID
  294.     ); 
  295.    }
  296.     
  297.    if(Tl.Player.Real)
  298.    {  
  299.     pPlayerMain.innerHTML = 
  300.      fDisplayRm
  301.      (
  302.       Tl.Width,
  303.       Tl.Height, 
  304.      Tl.List.Array[Tl.OffsetSelect][1], 
  305.       'PlayerMain', 
  306.       Tl.AutoPlay
  307.      );
  308.     }
  309.    pPlayer = document.getElementById(Tl.Player.ID);
  310.    
  311.    if(Tl.Player.Media)
  312.    {
  313.     pPlayer.Volume = -1;
  314.    }
  315.    
  316.    if(Tl.Player.Playlist)
  317.    {
  318.     Tl.GetState();
  319.    } 
  320.    
  321.   } // end function fGo
  322.   
  323.   function fGetListFromIfm()
  324.   {
  325.    var sList = document.getElementById(Tl.List.Iframe.ID).contentWindow.document.body.innerHTML;
  326.    sList = sList.replace(/<pre>|<//pre>/gi, "");
  327.    var aItem = sList.split(/(/r/n|/n)/s*/1/);
  328.    if(aItem.length==0)
  329.    {
  330.     alert("加载列表出错!");
  331.     return;
  332.    }
  333.    var arReturn = [];
  334.    for(var i=0, j=aItem.length; i<j; i++)
  335.    {
  336.     var aTemp = aItem[i].split(//r/n/);
  337.     if(aTemp.length!=2)continue;
  338.     var iNewAr = arReturn.length;
  339.     arReturn[iNewAr] = [];
  340.     arReturn[iNewAr][0] = aTemp[0];
  341.     arReturn[iNewAr][1] = aTemp[1];
  342.    } // end for
  343.    
  344.    return arReturn;
  345.   }
  346.   
  347.   function fAddList(sName, sPath)
  348.   {
  349.    if(!sName||sName=="")
  350.    {
  351.     alert("列表名出错!");
  352.     return;
  353.    }
  354.    if(!sPath||sPath=="")
  355.    {
  356.     alert("列表名出错!");
  357.     return;
  358.    }
  359.    var iCur = Tl.List.Path.length;
  360.    Tl.List.Path[iCur] = [];
  361.    Tl.List.Path[iCur][0] = sName;
  362.    Tl.List.Path[iCur][1] = sPath;
  363.   } // return function fAddList
  364.   
  365.   function fIframeGo()
  366.   {
  367.    Tl.List.Array = Tl.List.Iframe.GetList();
  368.    fGo();
  369.   }
  370.   
  371.   function fCkEndingMedia(iResult)
  372.   {
  373.    var iNewPlay = Tl.OffsetSelect-0+1;
  374.    
  375.    if(iNewPlay<Tl.List.Array.length)
  376.    {
  377.     setTimeout 
  378.     (
  379.      function()
  380.      {
  381.       var Player = document.getElementById(Tl.Player.ID);
  382.       Player.Stop();
  383.       Tl.OffsetSelect = iNewPlay;
  384.       fPlayerCmd(Player.id, "play", Tl.List.Array[iNewPlay][1]);
  385.       
  386.       fAutoChangeSongSetting(iNewPlay);
  387.      }
  388.      ,
  389.      500
  390.     ) ; // end setTimeout
  391.    } // end if
  392.    
  393.    
  394.   } // end function fCkEndingMedia
  395.   
  396.   function fCkEnding(iPos, iLen)
  397.   {
  398.    if(iPos==iLen)
  399.    {
  400.     var Player = document.getElementById(Tl.Player.ID);
  401.     if(Player.GetPlayState()==0)
  402.     {
  403.      var iNewPlay = Tl.OffsetSelect-0+1;
  404.      
  405.      if(iNewPlay<Tl.List.Array.length)
  406.      {
  407.       fPlayerCmd(Player.id, "play", Tl.List.Array[iNewPlay][1]);
  408.       Tl.OffsetSelect = iNewPlay;
  409.       
  410.       fAutoChangeSongSetting(iNewPlay);

  411.      } // end if 2 
  412.     } // end if 1
  413.     
  414.     
  415.    } // end if
  416.    
  417.   } // end function fCkEnding
  418.   
  419.   function fAutoChangeSongSetting(iNewPlay)
  420.   {
  421.    if(typeof(oPopup)=="object")
  422.    {
  423.     if(!oPopup.closed)
  424.     {
  425.      var EleOl = oPopup.document.getElementById("MusicList");
  426.      if(EleOl!=null)
  427.      {
  428.       var EleLiSet = EleOl.getElementsByTagName("li");
  429.       for(var i=0, j=EleLiSet.length; i<j; i++)
  430.       {
  431.        if(i==iNewPlay)
  432.        {
  433.         EleLiSet[i].style.backgroundColor = "yellow";
  434.        }
  435.        else
  436.        {
  437.         EleLiSet[i].style.backgroundColor = "white";
  438.        }
  439.       } // end for
  440.      } // end if 3
  441.     } // end if 2
  442.    } // end if 1
  443.    
  444.    var EleMrq = document.getElementById(Tl.Title.Marquee.ID);
  445.    if(EleMrq!=null)
  446.    {
  447.     EleMrq.innerHTML = Tl.List.Array[iNewPlay][0];
  448.    }
  449.   }
  450.   
  451.   function fAttachEvent(sId, sEvtName, Func)
  452.   {// shawl.qiu script
  453.    var Obj;
  454.    if(typeof(sId)=="string")
  455.    {
  456.     Obj = document.getElementById(sId);
  457.    } else if(typeof(sId)=="object")
  458.    {
  459.     Obj = sId;
  460.    }
  461.    
  462.    if(Obj==null)
  463.    {
  464.     alert("无法对应的对象!");
  465.     return false;
  466.    } // end if 1

  467.    if(document.addEventListener)
  468.    {
  469.     Obj.addEventListener(sEvtName, Func, false);
  470.    }
  471.    else if(document.attachEvent)
  472.    {
  473.     Obj.attachEvent(sEvtName, Func);
  474.    } // end if
  475.   } // end function fAttachEvent
  476.   
  477.   function fRandom()
  478.   {
  479.    var iIndex = fRandomBy(0, Tl.List.Array.length-1);
  480.    
  481.     var EleOl = oPopup.document.getElementById("MusicList");
  482.     var EleLi = oPopup.document.getElementById("SongItem"+(iIndex));
  483.     fChangeMusic(iIndex, EleLi, EleOl);
  484.   }
  485.   
  486.   function fPlayerCmd(sPlayerId, sCmdName, sSongPath)
  487.   {
  488.    var oPlayer = document.getElementById(sPlayerId);
  489.    if(!oPlayer) 
  490.    {
  491.     alert('函数 fPlayerCmd 播放对象为 null!');
  492.     return;
  493.    }
  494.    
  495.    var sPlayer = "media";
  496.    
  497.    if(typeof(oPlayer.Source)!='undefined')
  498.    {
  499.     sPlayer='real';
  500.    }
  501.    
  502.    switch(sPlayer)
  503.    {
  504.     case 'real':
  505.      switch(sCmdName)
  506.      {
  507.       case 'stop':
  508.        oPlayer.DoStop();
  509.        break;
  510.        
  511.       case 'play':
  512.        if(oPlayer.GetPlayState()==4)
  513.        {
  514.         oPlayer.DoPlay();
  515.        }
  516.        else
  517.        {
  518.         oPlayer.Source = sSongPath;
  519.         oPlayer.DoPlay();
  520.        }
  521.        break;
  522.        
  523.       case 'pause':
  524.        if(oPlayer.GetPlayState()==4)
  525.        {
  526.         oPlayer.DoPlay();
  527.        }
  528.        else
  529.        {
  530.        oPlayer.DoPause();
  531.        }
  532.        break;
  533.        
  534.       case 'mute':
  535.        if(oPlayer.GetMute())
  536.        {
  537.         oPlayer.SetMute(false);
  538.        }
  539.        else
  540.        {
  541.         oPlayer.SetMute(true);
  542.        }
  543.        break;
  544.      } // end switch 1
  545.      break;
  546.      
  547.     default:
  548.      switch(sCmdName)
  549.      {
  550.       case 'stop':
  551.        oPlayer.stop();
  552.        break;
  553.        
  554.       case 'play':
  555.        if(oPlayer.PlayState==1)
  556.        {
  557.         oPlayer.Play();
  558.        }
  559.        else
  560.        {
  561.         oPlayer.FileName = sSongPath;
  562.         oPlayer.AutoStart = true;
  563.         oPlayer.Play();
  564.        }
  565.        break;
  566.        
  567.       case 'pause':
  568.        if(oPlayer.PlayState==1)
  569.        {
  570.         oPlayer.Play();
  571.        }
  572.        else
  573.        {
  574.          oPlayer.Pause();
  575.        }
  576.        break;
  577.        
  578.       case 'mute':
  579.        if(oPlayer.Mute)
  580.        {
  581.         oPlayer.Mute = false;
  582.        }
  583.        else
  584.        {
  585.         oPlayer.Mute = true;
  586.        }
  587.        break;
  588.      } // end switch 1
  589.      break;
  590.    } // end switch
  591.   } // end function fPlayerCmd
  592.   
  593.   function fChangeMusic(iMusicIndex, EleLi, EleOl)
  594.   {
  595.    var op = oPopup;
  596.    
  597.    var bCfm = true;
  598.    if(bCfm)
  599.    {
  600.     var PlayThis = Tl.List.Array[iMusicIndex];
  601.     if(PlayThis==null)
  602.     {
  603.      op.alert("haven't get this song!");
  604.      return;
  605.     }
  606.     Tl.OffsetSelect = iMusicIndex;
  607.     
  608.     var LiSet = EleOl.getElementsByTagName('li');
  609.     for(var i=0, j=LiSet.length; i<j; i++)
  610.     {
  611.      LiSet[i].style.backgroundColor = "white";
  612.     }
  613.      EleLi.style.backgroundColor = "yellow";
  614.     
  615.     var Player = document.getElementById(Tl.Player.ID); // PlayerTest
  616.     var PlayUrl = encodeURI(Tl.List.Array[iMusicIndex][1]);
  617.     
  618.     if(typeof(Player.Source)=='undefined')
  619.     {// media
  620.      Player.FileName = PlayUrl;
  621.      Player.AutoStart = true;
  622.      Player.Play();
  623.     }
  624.     else
  625.     { // real
  626.      Player.Source = PlayUrl
  627.      Player.DoPlay();
  628.     } // end if 1
  629.     
  630.     pMarquee.innerHTML = "Song: "+Tl.List.Array[iMusicIndex][0];
  631.     
  632.    } // end if
  633.   } // end function fChangeMusic
  634.   
  635.   function fPlayNextOrPrev(iIndex, bPrev)
  636.   {
  637.    if(!bPrev)
  638.    {
  639.     iIndex = iIndex-0;
  640.     iIndex+=1;
  641.     if(iIndex>Tl.List.Array.length-1)
  642.     {
  643.      oPopup.alert("couldn't get next song!");
  644.      return;
  645.     } // end if 1
  646.    } 
  647.    else
  648.    {
  649.     iIndex = iIndex-0;
  650.     iIndex-=1;
  651.     if(iIndex<0)
  652.     {
  653.      oPopup.alert("couldn't get previous song!");
  654.      return;
  655.     } // end if 1
  656.    } // end if
  657.    
  658.     var EleOl = oPopup.document.getElementById("MusicList");
  659.     var EleLi = oPopup.document.getElementById("SongItem"+(iIndex));
  660.     fChangeMusic(iIndex, EleLi, EleOl);
  661.   } // end function fPlayNextOrPrev
  662.   
  663.   function fListViewer()
  664.   {
  665. //   fWinPopup('about:blank', 600, 500, ",status=yes");
  666.    fWinPopup('about:blank', 600, 500);
  667.    
  668.    var Player = document.getElementById(Tl.Player.ID);
  669.    
  670.    var op = oPopup;
  671.    op.document.title = Tl.auSubject+" "+Tl.auVersion;
  672.    op.document.write
  673.    (
  674.     "<h2 style='text-align:center; color:red; font-weight:bold; margin:0px;'>",
  675.     op.document.title,
  676.     "</h2>"
  677.     );
  678.     
  679.     op.document.write
  680.     (
  681.      "<div style='text-align:center;padding: 5px 0px;' id='ListCount'>",
  682.      "<b>The play list has get <font color='red'>"+Tl.List.Array.length+"</font> Items.</b>",
  683.      "</div>"
  684.     );
  685.     
  686.     op.document.write("<div id='PlayListDivId' style='text-align:right'>");
  687.     op.document.write
  688.     (
  689.      "<span style='float:right'>",
  690. /*
  691.      " Pos:<span id='PlayCurretnPos'></span>",
  692.      " Total:<span id='PlayTotalTime'></span> ",
  693. */
  694.      "<b>PlayList</b>: "
  695.     );
  696.     op.document.write("<select onchange=/"opener."+Tl.IntiName+".Remote.ChangeList(this.value, this)/" "+
  697.      ">");
  698.     
  699.     for(var i=0, j=Tl.Remote.PlayList.length; i<j; i++)
  700.     {
  701.      if(i==Tl.List.DefaultList)
  702.      {
  703.       op.document.write
  704.       (
  705.        "<option selected value="+i+">",
  706.        Tl.Remote.PlayList[i][0],
  707.        "</option>"
  708.       );
  709.      }
  710.      else
  711.      {
  712.       op.document.write
  713.       (
  714.        "<option value="+i+">",
  715.        Tl.Remote.PlayList[i][0],
  716.        "</option>"
  717.       );
  718.      } // end if
  719.     } // end for
  720.         
  721.     op.document.write("</select>");
  722.     
  723.     op.document.write("</span>");
  724.     op.document.write("<span style='float:left'><b>State</b>: ");
  725.     
  726.     op.document.write("<span id='PlayStateId' style='color:fuchsia;'>");
  727.     
  728.     if(Tl.Player.Media)
  729.     {
  730.      op.document.write(fReturnPlayStateForMedia(Player.PlayState));
  731.     };
  732.     
  733.     if(Tl.Player.Real)
  734.     {
  735.      op.document.write(fReturnPlayStateForReal(Player.GetPlayState()));
  736.     }
  737.     
  738.     
  739.     
  740.     op.document.write("</span>");
  741.     op.document.write("</span>");
  742.     
  743.     op.document.write("</div><br clear='both' />");
  744.     
  745.     var iCount = 0;
  746.     
  747.     op.document.write
  748.     (
  749.     "<div id='PlayerBar' style='text-align:left;font-weight:bold;background-color:whitesmoke; padding:2px;'>", 
  750.     
  751.       "<span ",
  752.       "onclick=/"opener."+
  753.        Tl.IntiName+".Player.Cmd('"+
  754.        Tl.Player.ID+"', 'mute')/" title='Mute'> Mute |",
  755.        "</span>",
  756.        
  757.       "<span ",
  758.       "onclick=/"if(confirm('stopping now?')){opener."+
  759.        Tl.IntiName+".Player.Cmd('"+Tl.Player.ID+"', 'stop')}/" title='stop'> Stop |",
  760.        "</span>",
  761.       
  762.       "<span ",
  763.       "onclick=/"opener."+
  764.        Tl.IntiName+".Player.Cmd('"+
  765.        Tl.Player.ID+"', 'pause')/" title='Pause'> Pause |",
  766.        "</span>",
  767.       
  768.       "<span ",
  769.       "onclick=/"opener."+
  770.        Tl.IntiName+".Player.NextOrPrev("+
  771.         "opener."+Tl.IntiName+".CurrentPlay.Index(), true)/" title='Prev'> Prev |",
  772.        "</span>",      
  773.        
  774.       "<span ",
  775.       "onclick=/"opener."+
  776.        Tl.IntiName+".Player.NextOrPrev("+
  777.         "opener."+Tl.IntiName+".CurrentPlay.Index(), false)/" title='Next'> Next |",
  778.        "</span>",
  779.       
  780.       "<span ",
  781.       "onclick=/"opener."+
  782.        Tl.IntiName+".Random()/" title='Random'> Random | ",
  783.        "</span>",
  784.       
  785.       "<span ",
  786.       "onclick=/"opener."+
  787.        Tl.IntiName+".Player.Cmd('"+
  788.        Tl.Player.ID+"', 'play', opener."+Tl.IntiName+".CurrentPlay.Path())/" title='Play'> Play",
  789.        "</span>",
  790.     "</div>"
  791.     );
  792.     
  793.     op.document.write("<ol id='MusicList' style='margin:8px auto;'>");
  794.     for(var i=0, j=Tl.List.Array.length; i<j; i++)
  795.     {
  796.      var sBgCor = "";
  797.      if(i==Tl.OffsetSelect)
  798.      {
  799.       sBgCor = "background-color:yellow;";
  800.      }
  801.      else
  802.      {
  803.      }
  804.      
  805.      op.document.write
  806.      (
  807.       "<li ",
  808.       " style='padding:5px 2px;"+sBgCor+"'",
  809.       " id=SongItem"+i,
  810.       ">"
  811.      );
  812.      op.document.write
  813.      (
  814.       "<span style='float:right; font-weight:bold' >",
  815.       
  816.       "<span ",
  817.       "onclick=/"opener."+
  818.        Tl.IntiName+".Player.ChagneMusic('"+i+
  819.         "', this.parentNode.parentNode, document.getElementById('MusicList'))/" title='play this'>&#9654; ",
  820.        "</span>",
  821.        
  822.        "</span>",
  823.       "Song: [<font color='black' style='font-weight:bold'>",
  824.       Tl.List.Array[i][0]+"</font>]"
  825.       );
  826.      op.document.write
  827.      (
  828.       "<br/>Link: [<font color='blue'>",
  829.       Tl.List.Array[i][1],
  830.       "</font>]"
  831.      );
  832.      op.document.write("</li>");
  833.      iCount++;
  834.     } // end for
  835.     
  836.     op.document.write("</ol>");
  837.     op.document.write
  838.     ( 
  839.      "<div style='text-align:right;background-color:gainsboro;padding:2px;'>",
  840.      "<span onclick=/"if(confirm('close me now?')){opener=null;self.close();}/">",
  841.      "close me",
  842.      "</span>",
  843.      "</div>"
  844.     );
  845.     op.document.write("<style>body{overflow-x:hidden;}<//style>");    
  846.     op.document.close();
  847.   } // end function fListViewer
  848.   
  849.   function fIntiPlayerControl()
  850.   {
  851.    var TempDiv = document.getElementById(Tl.Control.ID);
  852.    if(TempDiv==null)
  853.    {
  854.    var EleDiv = document.createElement("div");
  855.     EleDiv.className = Tl.Control.ClassName;
  856.     EleDiv.id = Tl.Control.ID;
  857.     EleDiv.width = Tl.Width;
  858.     
  859.     var sMediaChecked = Tl.Player.Media?" checked":"";
  860.     var sRealChecked = Tl.Player.Real?" checked":"";
  861.     
  862.     EleDiv.innerHTML="";
  863.     EleDiv.innerHTML +=
  864.      "&nbsp;&nbsp;Player: "+
  865.      "<input type='radio' name="+Tl.Control.PlayByRadioID+" value=media"+
  866.      " onclick="+Tl.IntiName+".Player.ChangePlayer(this) "+
  867.      sMediaChecked+
  868.      " />Media&nbsp;"+
  869.      "<input type='radio' name="+Tl.Control.PlayByRadioID+" value=real"+
  870.      " onclick='"+Tl.IntiName+".Player.ChangePlayer(this)' "+
  871.      sRealChecked+
  872.      " />Real"
  873.      ;
  874.     EleDiv.innerHTML += "<br/>";
  875.     EleDiv.innerHTML += 
  876.     "&nbsp;&nbsp;<a href='#' onclick='"+Tl.IntiName
  877.      +".List.Viewer()id='sqPlayerShowPlayListLk'>Play List</a>";
  878.     EleDiv.innerHTML += 
  879.     "&nbsp;&nbsp;<a href='#' onclick='"+Tl.IntiName
  880.      +".About()'>About</a>";
  881.     
  882.     fInsertNode(pPlayerMain, EleDiv);
  883.    }
  884.     
  885.    if(Tl.List.Array.length==0)return;
  886.    
  887.    var TempDiv = document.getElementById(Tl.Title.ID);
  888.    if(TempDiv==null)
  889.    {
  890.    var EleDivTt = document.createElement("div");
  891.     EleDivTt.className = Tl.Title.ID;
  892.     EleDivTt.id = Tl.Title.ID;
  893.     EleDivTt.style.width = Tl.Width+"px";
  894.     EleDivTt.style.overflow = 'hidden';
  895.     EleDivTt.innerHTML = "<marquee id="+Tl.Title.Marquee.ID+
  896.      " SCROLLDELAY="+Tl.Title.Marquee.Delay+">Song: "+
  897.      Tl.List.Array[Tl.OffsetSelect][0]+
  898.      "</mqrquee>"
  899.     ;
  900.     fInsertNode(pPlayerMain, EleDivTt, "before");
  901.    }
  902.     pMarquee = document.getElementById(Tl.Title.Marquee.ID);
  903.   }
  904.   
  905.   function fChangePlayer(obj)
  906.   {
  907.    var EleRadioSet = document.getElementsByName(Tl.Control.PlayByRadioID);
  908.    var bChange = confirm('现在切换为 '+obj.value+' 播放器吗?');
  909.    if(!bChange)
  910.    {
  911.      if(Tl.Player.Media)
  912.      {
  913.       EleRadioSet[0].checked = true;
  914.      }
  915.      else
  916.      {
  917.       EleRadioSet[1].checked = true;
  918.      }
  919.      return false;
  920.    }
  921.    
  922.    switch(obj.value)
  923.    {
  924.     case "media":
  925.      if(Tl.Player.Media)
  926.      {
  927.       alert('您已选择 Media 播放器, 不需要重复选择!');
  928.       return;
  929.      }
  930.      Tl.Player.Real = false
  931.      Tl.Player.Media = true
  932.      break;
  933.      
  934.     default:
  935.      if(Tl.Player.Real)
  936.      {
  937.       alert('您已选择 Real 播放器, 不需要重复选择!');
  938.       return;
  939.      }
  940.      Tl.Player.Media = false;
  941.      Tl.Player.Real = true
  942.      break;
  943.    }
  944.    
  945.    var PlayUrl = Tl.List.Array[Tl.OffsetSelect][1];
  946.    Tl.AutoPlay = true;
  947.    
  948.    if(Tl.Player.Media)
  949.    {
  950.     pPlayerMain.innerHTML = 
  951.     fDisplayWmp
  952.     (
  953.      Tl.Width,
  954.      Tl.Height, 
  955.      PlayUrl, 
  956.      'PlayerMain', 
  957.      Tl.AutoPlay,
  958.       Tl.Player.ID
  959.     ); 
  960.      EleRadioSet[0].checked = true;
  961.    } // end function fChangePlayer
  962.     
  963.    if(Tl.Player.Real)
  964.    {  
  965.     pPlayerMain.innerHTML = 
  966.      fDisplayRm
  967.      (
  968.       Tl.Width,
  969.       Tl.Height, 
  970.       PlayUrl, 
  971.       'PlayerMain', 
  972.       Tl.AutoPlay,
  973.       Tl.Player.ID
  974.      );
  975.      EleRadioSet[1].checked = true;
  976.    } // end if
  977.    
  978.    pPlayer = document.getElementById(Tl.Player.ID);
  979.    if(Tl.Player.Media)
  980.    {
  981.     pPlayer.Volume = -1;
  982.    }
  983.    
  984.    if(Tl.Player.Playlist)
  985.    {
  986.     Tl.GetState();
  987.    } // end if
  988.    
  989.   } // end function fChangePlayer
  990.   
  991.   function fDisplayWmp(iWidth, iHeight, sPath, sDivCssName, bAutoPlay, sPlayerId)
  992.   {
  993.    if(!sPath) 
  994.    {
  995.     alert("wmp 路径 不能为空!");
  996.     return;
  997.    }
  998.    
  999.    sPath = encodeURI(sPath);
  1000.    sPath = sPath.replace(/^/s*|/s*$/g, "");
  1001.   
  1002.    if(!iWidth) iWidth = 500;
  1003.    if(!iHeight) iHeight = 68;
  1004.    if(!sDivCssName) sDivCssName = "Ubbwmp";
  1005.    if(!sPlayerId) sPlayerId = "PlayerId";
  1006.    
  1007.    return "<div class='"+sDivCssName+"'>"+ 
  1008.    "<object align=middle classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95"+
  1009.    " class=OBJECT id="+sPlayerId+" width="+iWidth+" height="+iHeight+" >"+
  1010.    "<param name=ShowStatusBar value=-1>"+
  1011.    "<param name=uiMode value=mini>"+
  1012.    '<param NAME="enableContextMenu" VALUE="0">'+
  1013.    "<param name=Filename value="+sPath+">"+
  1014.    "<PARAM NAME=AUTOSTART VALUE="+bAutoPlay+">"+
  1015.    "<embed type=application/x-oleobject "+
  1016.    "codebase=http://activex.microsoft.com/activex/controls/mplayer/en/"+
  1017.    "nsmp2inf.cab#Version=5,1,52,701 flename=mp id='PlayerTest' src='"+sPath+"'  width="+iWidth+" height="+iHeight+">"+
  1018.    "</embed>"+
  1019.    "</object>"+
  1020.    "</div>"
  1021.    ;
  1022.   } // end function fDisplayWmp
  1023.   
  1024.   function fDisplayRm(iWidth, iHeight, sPath, sDivCssName, bAutoPlay, sPlayerId)
  1025.   {
  1026.    if(!sPath) 
  1027.    {
  1028.     alert("rm 路径 不能为空!");
  1029.     return;
  1030.    }
  1031.    
  1032.    sPath = encodeURI(sPath);
  1033.    sPath = sPath.replace(/^/s*|/s*$/g, "");
  1034.    if(!sDivCssName) sDivCssName = "Ubbrm";
  1035.    if(!sPlayerId) sPlayerId = "PlayerId";
  1036.    
  1037.    return "<div class='"+sDivCssName+"'>"+ 
  1038.    "<OBJECT classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"+
  1039.    " class=OBJECT id="+sPlayerId+" width="+iWidth+" height="+iHeight+">"+
  1040.    "<PARAM NAME=SRC VALUE="+sPath+">"+
  1041.    "<PARAM NAME=CONSOLE VALUE=Clip1>"+
  1042.    "<PARAM NAME=CONTROLS VALUE=imagewindow>"+
  1043.    "<PARAM NAME=AUTOSTART VALUE="+bAutoPlay+">"+
  1044.    "<param name=ShowStatusBar value=-1>"+
  1045.    "<PARAM NAME=StatusBar VALUE=-1>"+
  1046.    "<PARAM NAME=InfoPanel VALUE=-1>"+
  1047.    "<PARAM NAME=StatusPanel VALUE=-1>"+
  1048.    "<PARAM NAME=StatusField VALUE='get that'>"+
  1049.    '<param NAME="enableContextMenu" VALUE="0">'+
  1050.    "</OBJECT><br>"+
  1051.    "<OBJECT classid=CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA"+
  1052.    " height="+32+" id=video2 width="+iWidth+">"+
  1053.    "<PARAM NAME=SRC VALUE="+sPath+">"+
  1054.    "<PARAM NAME=AUTOSTART VALUE="+bAutoPlay+">"+
  1055.    "<PARAM NAME=CONTROLS VALUE=controlpanel>"+
  1056.    "<PARAM NAME=NoLabels VALUE=false>"+
  1057.    "<PARAM NAME=CONSOLE VALUE=Clip1>"+
  1058.    "<PARAM NAME=StatusBar VALUE=-1>"+
  1059.    "<PARAM NAME=InfoPanel VALUE=-1>"+
  1060.    "<PARAM NAME=StatusPanel VALUE=-1>"+
  1061.    "<PARAM NAME=StatusField VALUE='get that'>"+
  1062.    "<param name=ShowStatusBar value=true>"+
  1063.    "</OBJECT>"+
  1064.    "</div>"
  1065.    ;
  1066.   } // end function fDisplayRm
  1067.   
  1068.   function fInsertNode(OldNode, NewNode, bBefore)
  1069.   {// shawl.qiu script
  1070.    var ParentNode = OldNode.parentNode;
  1071.    if(!ParentNode)return false;
  1072.    if(bBefore)
  1073.    {
  1074.     ParentNode.insertBefore(NewNode,OldNode);
  1075.     return false;
  1076.    } // end if
  1077.    ParentNode.replaceChild(NewNode, OldNode);
  1078.    ParentNode.insertBefore(OldNode, NewNode);
  1079.   } // end function fInsertNode
  1080.   
  1081.   //------------------------------------end public method
  1082.  
  1083.   //------------------------------------begin private method

  1084.   function fWinPopup(sUrl, iWidth, iHeight, sAddition){
  1085.    try{oPopup.close()}catch(e){}
  1086.    if(!sUrl)return false;
  1087.    if(!iWidth)iWidth=screen.availWidth-200;
  1088.    if(!iHeight)iHeight=screen.availHeight-150;
  1089.    if(!sAddition)sAddition='';
  1090.    var iMrgHor=(screen.availWidth-iWidth)/2;
  1091.    var iMrgVtc=(screen.availHeight-iHeight)/2;
  1092.    
  1093.    oPopup=open('about:blank','sqPopup','width='+iWidth+',height='+iHeight+',left='+iMrgHor
  1094.     +',top='+iMrgVtc+',scrollbars'+sAddition);

  1095.    oPopup.location.href=sUrl;
  1096.    oPopup.focus();
  1097.    oPopup.document.ondblclick=function(){oPopup.close();}
  1098.    oPopup.document.onkeydown=function(){ if(oPopup.event.keyCode==27)oPopup.close(); }
  1099.    return false;
  1100.   } // shawl.qiu script   
  1101.   
  1102.   function fListMtd(obj, e){
  1103.    if(!e)var e=window.event;
  1104.    try{var sur=e.srcElement||e.target;}catch(e){}
  1105.    try{w.close();}catch(e){}
  1106.     w=open('','newwin','width=500,height=500,left=300,top=100,scrollbars');
  1107.     w.document.write('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />');
  1108.     w.document.write('<style>body{width:400px;word-w.document.writeap: break-word;}</style>');
  1109.     w.focus();
  1110.     w.document.ondblclick=function(){w.close();}
  1111.     fListMtd(obj, w);
  1112.     try{w.onload=function(){ w.document.title=sur.firstChild.data;};}catch(e){}
  1113.     w.document.close();
  1114.     w.focus();
  1115.    return true;
  1116.    function fListMtd(obj, target){
  1117.     var ar=new Array();
  1118.     var j=0;
  1119.     
  1120.     for(var i in obj){
  1121.      try{
  1122.       ar[j]=i.bold()+' '+(typeof obj[i]).fontcolor('red')+
  1123.       ' '+(obj[i]+'').fontcolor('blue');
  1124.       j++;
  1125.      }catch(e){
  1126.       ar[j]=i.bold()+' '+(typeof obj[i]).fontcolor('red')+
  1127.       (' empty').fontcolor('red').bold()
  1128.       j++;
  1129.      }
  1130.     }
  1131.     ar=ar.sort();
  1132.     for(var i=0; i<ar.length; i++){
  1133.      target.document.write(i+1,'. ',ar[i],'<br/>');
  1134.     }
  1135.     return true;
  1136.    }
  1137.   } // end function fListMtd
  1138.   
  1139.   function fListMethod(obj, e)
  1140.   {
  1141.    fListMtd(obj, e);
  1142.   }
  1143.   
  1144.   function fAbout()
  1145.   {
  1146.    fWinPopup('about:blank', 600, 400);
  1147.    
  1148.    var op = oPopup;
  1149.    op.document.title = Tl.auSubject+" "+Tl.auVersion;
  1150.    op.document.write
  1151.    (
  1152.     "<h2 style='text-align:center; color:red; font-weight:bold'>",
  1153.     op.document.title,
  1154.     "</h2>"
  1155.     );
  1156.     
  1157.     op.document.write
  1158.     (
  1159.      "<div style='text-align:center;padding 5px 0px;' id='ListCount'>",
  1160.      "</div>"
  1161.     );
  1162.     
  1163.     op.document.write
  1164.     (
  1165.      "<div>",
  1166.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1167.       "Subject: &nbsp;&nbsp;",
  1168.       "</div>",
  1169.       "<div style=float:left;text-align:left;>",
  1170.       Tl.auSubject,
  1171.       "</div>",
  1172.      "</div>"
  1173.     );
  1174.     op.document.write("<br clear='both' />");
  1175.     
  1176.     op.document.write
  1177.     (
  1178.      "<div>",
  1179.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1180.       "Version: &nbsp;&nbsp;",
  1181.       "</div>",
  1182.       "<div style=float:left;text-align:left;>",
  1183.       Tl.auVersion,
  1184.       "</div>",
  1185.      "</div>"
  1186.     );
  1187.     op.document.write("<br clear='both' />");
  1188.     
  1189.     op.document.write
  1190.     (
  1191.      "<div>",
  1192.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1193.       "Author: &nbsp;&nbsp;",
  1194.       "</div>",
  1195.       "<div style=float:left;text-align:left;>",
  1196.       Tl.au,
  1197.       "</div>",
  1198.      "</div>"
  1199.     );
  1200.     op.document.write("<br clear='both' />");
  1201.     
  1202.     op.document.write
  1203.     (
  1204.      "<div>",
  1205.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1206.       "E-Mail: &nbsp;&nbsp;",
  1207.       "</div>",
  1208.       "<div style=float:left;text-align:left;>",
  1209.       Tl.auEmail.email(),
  1210.       "</div>",
  1211.      "</div>"
  1212.     );
  1213.     op.document.write("<br clear='both' />");
  1214.     
  1215.     op.document.write
  1216.     (
  1217.      "<div>",
  1218.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1219.       "Blog: &nbsp;&nbsp;",
  1220.       "</div>",
  1221.       "<div style=float:left;text-align:left;>",
  1222.       Tl.auBlog.link(),
  1223.       "</div>",
  1224.      "</div>"
  1225.     );
  1226.     op.document.write("<br clear='both' />");
  1227.     
  1228.     op.document.write
  1229.     (
  1230.      "<div>",
  1231.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1232.       "Created Date:&nbsp;&nbsp;",
  1233.       "</div>",
  1234.       "<div style=float:left;text-align:left;>",
  1235.       Tl.auCreateDate,
  1236.       "</div>",
  1237.      "</div>"
  1238.     );
  1239.     op.document.write("<br clear='both' />");
  1240.     
  1241.     op.document.write
  1242.     (
  1243.      "<div>",
  1244.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1245.       "Update 1 :&nbsp;&nbsp;",
  1246.       "</div>",
  1247.       "<div style=float:left;text-align:left;>",
  1248.       Tl.auUpdate1,
  1249.       "</div>",
  1250.      "</div>"
  1251.     );
  1252.     op.document.write("<br clear='both' />");
  1253.     
  1254.     op.document.write("<hr />");
  1255.     
  1256.     op.document.write
  1257.     (
  1258.      "<div>",
  1259.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1260.       "Download:&nbsp;&nbsp;",
  1261.       "</div>",
  1262.       "<div style=float:left;text-align:left;>",
  1263.       "</div>",
  1264.      "</div>"
  1265.     );
  1266.     op.document.write("<br clear='both' />");
  1267.     
  1268.     op.document.write
  1269.     (
  1270.      "<div>",
  1271.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1272.       "Version 1.0 Final:&nbsp;&nbsp;",
  1273.       "</div>",
  1274.       "<div style=float:left;text-align:left;>",
  1275.       ("http://files.myopera.com/btbtd/sqMusicPlayer/sqMusicPlayer_v1.0_Final.7z")
  1276.       .link("http://files.myopera.com/btbtd/sqMusicPlayer/sqMusicPlayer_v1.0_Final.7z"),
  1277.       "</div>",
  1278.      "</div>"
  1279.     );
  1280.     op.document.write("<br clear='both' />");
  1281.     
  1282.     op.document.write
  1283.     (
  1284.      "<div>",
  1285.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1286.       "Version 1.0 Beta:&nbsp;&nbsp;",
  1287.       "</div>",
  1288.       "<div style=float:left;text-align:left;>",
  1289.       ("http://files.myopera.com/btbtd/sqMusicPlayer/sqMusicPlayer_v1.0_Beta.7z")
  1290.       .link("http://files.myopera.com/btbtd/sqMusicPlayer/sqMusicPlayer_v1.0_Beta.7z"),
  1291.       "</div>",
  1292.      "</div>"
  1293.     );
  1294.     op.document.write("<br clear='both' />");
  1295.     
  1296.     op.document.write("<br/>");
  1297.     op.document.write
  1298.     (
  1299.      "<div style='margin:5px 0px; padding:2px;'>",
  1300.       "<div style=float:left;text-align:left;font-weight:bold;>",
  1301.       "Copyright: ",
  1302.       "</div>",
  1303.       "<div style=float:left;text-align:left;>",
  1304.       "&copy; 2007-2010 shawl.qiu. All rights reserved.",
  1305.       "</div>",
  1306.      "</div>"
  1307.     );
  1308.     op.document.write("<br clear='both' />");
  1309.     
  1310.     op.document.write
  1311.     ( 
  1312.      "<div style='text-align:right;background-color:yellow;padding:2px;'"+
  1313.      " onclick=/"if(confirm('现在关闭窗口吗?')){opener=null;self.close();}/">close me</div>"
  1314.     );
  1315.     op.document.close();
  1316.   }
  1317.   
  1318.   String.prototype.email=function(sAddi){
  1319.    if(!sAddi)sAddi='';
  1320.    return fStrEmail(this,sAddi);
  1321.   }
  1322.   function fStrEmail(sEmail,sAddi){
  1323.    return '<a href="mailto:'+sEmail+'"'+sAddi+'>'+sEmail+'</a>'
  1324.   } 
  1325.   
  1326.   function fRandomBy(under, over)
  1327.   {// shawl.qiu script
  1328.    switch(arguments.length)
  1329.    {
  1330.     case 1: return parseInt(Math.random()*under+1);
  1331.     case 2: return parseInt(Math.random()*(over-under+1) + under);
  1332.     defaultreturn 0;
  1333.    } // end switch
  1334.   } // end function fRandomBy
  1335.   

  1336.   
  1337.   function fReturnPlayStateForMedia(iState)
  1338.   {
  1339.    switch(iState)
  1340.    {
  1341.     case 0:
  1342.      return "playback is stopped.";
  1343.      break;
  1344.      
  1345.     case 1:
  1346.      return "Playback is paused.";
  1347.      break;
  1348.      
  1349.     case 2:
  1350.      return "stream is playing...";
  1351.      break;
  1352.      
  1353.     case 3:
  1354.      return "Waiting for stream to begin.";
  1355.      break;
  1356.      
  1357.     case 4:
  1358.      return "Stream is Scanning forward...";
  1359.      break;
  1360.      
  1361.     case 5:
  1362.      return "Stream is Scanning in reverse...";
  1363.      break;
  1364.      
  1365.     case 6:
  1366.      return "stream has not been opened.";
  1367.      break;
  1368.    }
  1369.    return "";
  1370.   } // end function fReturnPlayStateForMedia
  1371.   

  1372.   
  1373.   function fReturnPlayStateForReal(iState)
  1374.   {
  1375.    //0:停止,1:连接,2:缓冲,3:播放,4:暂停,5:寻找
  1376.    switch(iState)
  1377.    {
  1378.     case 0:
  1379.      return "停止.";
  1380.      
  1381.     case 1:
  1382.      return "连接中...";
  1383.      
  1384.     case 2:
  1385.      return "缓冲中...";
  1386.      
  1387.     case 3: 
  1388.      return "正在播放...";
  1389.     
  1390.     case 4:
  1391.      return "暂停.";
  1392.     
  1393.     case 5:
  1394.      return "寻找中";
  1395.    }
  1396.   } // end function fReturnPlayStateForReal
  1397.   
  1398.   function fSecondToTime(iIpt)
  1399.   {// shawl.qiu script
  1400.    var dt1 = new Date(0,0,0,0,0,iIpt);
  1401.    return dt1.toLocaleTimeString();
  1402.   } // end function fSecondToTime
  1403.   //------------------------------------end private method
  1404.  } // shawl.qiu code
  1405.  //---------------------------------end class sqMusicPlayer()---------------------------------//

  1406. var sqPlayer = new sqMusicPlayer();

  1407.  /*-----------------------------------------------------------------------------------*/
  1408.   * shawl.qiu sqCrossDomain class v1.0
  1409.  /*-----------------------------------------------------------------------------------*/
  1410.  //---------------------------------begin class sqCrossDomain()-------------------------------//
  1411.  function sqCrossDomain()
  1412.  { // shawl.qiu code
  1413.   //------------------------------------begin public variable
  1414.   //---------------begin about
  1415.   this.auSubject = 'shawl.qiu sqCrossDomain class';
  1416.   this.auVersion = 'v1.0';
  1417.   this.au = 'shawl.qiu';
  1418.   this.auEmail = 'shawl.qiu@gmail.com';
  1419.   this.auBlog = 'http://blog.csdn.net/btbtd';
  1420.   this.auCreateDate = '2007-5-10';
  1421.   //---------------end about
  1422.   this.Interval = {};
  1423.   this.Interval.Ms = 100;
  1424.   this.Interval.Limit = 10000;
  1425.   this.Interval.Count = 1;
  1426.   this.Interval.Temp = 0;
  1427.   this.Interval.Func = null;
  1428.   
  1429.   this.Script = {};
  1430.   this.Script.Url = "";
  1431.   this.Script.ID = "SptTextId";
  1432.   
  1433.   this.Identifier = {};
  1434.   this.Identifier.VariableName = "";
  1435.   
  1436.   this.Prefix = "SADFkljkjfaksdskkk";
  1437.   
  1438.   this.CallBack = null;
  1439.   this.Error = {};
  1440.   this.Error.Msg = "加载超时!";
  1441.   
  1442.   this.Go = fGo;
  1443.   //------------------------------------end public variable
  1444.   
  1445.   //------------------------------------begin private variable
  1446.   var Tl = this;
  1447.   //------------------------------------end private variable
  1448.   
  1449.   //------------------------------------begin public method
  1450.   function fGo()
  1451.   {
  1452.    if(!Tl.CallBack)
  1453.    {
  1454.     alert("回调函数不能为空!");
  1455.     return;
  1456.    } // end if 
  1457.    
  1458.    if(Tl.Script.Url=="")
  1459.    {
  1460.     alert("路径不能为空!");
  1461.     return;
  1462.    }
  1463.    
  1464.    var EleHeadSet = document.getElementsByTagName("head");
  1465.    if(EleHeadSet.length==0)
  1466.    {
  1467.     alert("Head 标签不存在, 操作无法进行!");
  1468.     return;
  1469.    }
  1470.    
  1471.    var EleHead = EleHeadSet[0];
  1472.    
  1473.    var EleSpt = document.createElement("script");
  1474.     EleSpt.src = Tl.Script.Url;
  1475.     EleSpt.id = Tl.Script.ID;
  1476.     
  1477.    EleHead.appendChild(EleSpt);   
  1478.    
  1479.    Tl.Interval.Func = 
  1480.     setInterval
  1481.     (
  1482.      function()
  1483.      {
  1484.      
  1485.       var sTemp = ""
  1486.       try 
  1487.       {
  1488.        sTemp = eval(Tl.Identifier.VariableName);
  1489.       }
  1490.       catch(e)
  1491.       {
  1492.        sTemp = "";
  1493.       }
  1494.      
  1495.       defaultStatus = "空值: "+(sTemp=="")+" | 尝试加载次数: "+Tl.Interval.Count++;
  1496.       Tl.Interval.Temp += Tl.Interval.Ms;
  1497.       
  1498.       if(sTemp!="")
  1499.       {
  1500.        clearInterval(Tl.Interval.Func);
  1501.        Tl.CallBack(sTemp);
  1502.        var EleSpt = document.getElementById(Tl.Script.ID);
  1503.        if(EleSpt!=null)
  1504.        {
  1505.         var TempParent = EleSpt.parentNode;
  1506.         TempParent.removeChild(EleSpt);
  1507.        } // end if 1
  1508.        
  1509.        return false;
  1510.       } // end if
  1511.       
  1512.       if(Tl.Interval.Temp>=Tl.Interval.Limit)
  1513.       {
  1514.        clearInterval(Tl.Interval.Func);
  1515.        defaultStatus = Tl.Error.Msg;
  1516.        alert(Tl.Error.Msg);
  1517.        return false;
  1518.       }
  1519.       
  1520.      }
  1521.      ,
  1522.      Tl.Interval.Ms
  1523.     );
  1524.    
  1525.   } // end function fGo
  1526.   //------------------------------------end public method
  1527.  
  1528.   //------------------------------------begin private method
  1529.   //------------------------------------end private method
  1530.  } // shawl.qiu code
  1531.  //---------------------------------end class sqCrossDomain()---------------------------------//