Share Pastebin
Guest
Public paste!

izN

By: a guest | Aug 25th, 2010 | Syntax: JavaScript | Size: 25.74 KB | Hits: 72 | Expires: Never
Copy text to clipboard
  1.         /*
  2.  * ----------------------------------------------------------------------------
  3.  * "THE BEER-WARE LICENSE" (Revision 42):
  4.  * <darktempler@gmail.com> wrote this file. As long as you retain this notice you
  5.  * can do whatever you want with my code. If we meet some day, and you think
  6.  * this code is worth it, you can buy me a beer in return - Matt Labrum (-dt-)
  7.  * ----------------------------------------------------------------------------
  8.  */
  9.      
  10.  /*  
  11.         $LastChangedBy: dt $
  12.         $LastChangedDate: 2007-11-30 19:28:32 -0800 (Fri, 30 Nov 2007) $
  13.         $LastChangedRevision: 330 $
  14.         $HeadURL: http://version.thedt.net/scripts/plusscripts/musicNowplaying/main.js $
  15. */      
  16.  
  17. var prefs;
  18. var playersClasses = [];
  19. var plugins;
  20.  
  21. var globalPlayers = {};
  22. var WM_USER = 1024;
  23. var TB_ENABLEBUTTON = WM_USER + 1;
  24. var trans;
  25. var globalScope = this;
  26. var GETAVATAR = false;
  27. var hasInitialized = false;
  28. var fso = new ActiveXObject('Scripting.FileSystemObject');
  29. var cachedir = MsgPlus.ScriptFilesPath + "\\cache\\";
  30.  
  31. var UpdateChecker;
  32.  
  33.  
  34. //var commentreg = /\/\*[\s\S]*?\*/g
  35. var showBackupCompleted  = false;
  36.  
  37.  
  38.  
  39.  
  40.  
  41. function OnEvent_Initialize(MessengerStart){
  42.  
  43.  
  44.      
  45.         var showConfigOnLoad = false;
  46.         var showConfigFile = MsgPlus.ScriptFilesPath + "\\" + "showConfig.txt";
  47.         if(fso.FileExists(showConfigFile)){
  48.                 showConfigOnLoad = true;
  49.         }
  50.  
  51.  
  52.  
  53.  
  54.         //uninstalls the old players  
  55.         var OldFiles = [
  56.                 "iTunesClass.js",
  57.                 "WinampClass.js",
  58.                 "wmpClass.js",
  59.                 "jetAudioClass.js",
  60.                 "players\\MusicMonkey.player.js",
  61.                 "showConfig.txt"
  62.         ];
  63.        
  64.        
  65.         for(file in OldFiles){
  66.                 var name = MsgPlus.ScriptFilesPath + "\\" + OldFiles[file];
  67.                 if(fso.FileExists(name)){ fso.GetFile(name).Delete(true);}
  68.         }
  69.        
  70.        
  71.  
  72.        
  73.        
  74.        
  75.        
  76.         //load the players into the main scope.
  77.         var x;
  78.         for(var enume = new Enumerator(fso.GetFolder(MsgPlus.ScriptFilesPath + "\\players").Files);!enume.atEnd();enume.moveNext()){
  79.                 if(x = new String(enume.item()).match(/([^[\\]*?)\.player\.js$/)){
  80.                         playersClasses.push(x[1]);
  81.                         loadScriptFile(enume.item(), x[1]);
  82.                 }  
  83.         }
  84.              
  85.  
  86.         if(MsgPlus.Version >= 4.3){
  87.                 prefs = new PrefStore('NPConfig');
  88.                 pluginManager = new pluginManagerClass();
  89.                 pluginManager.loadAll();
  90.         }
  91.  
  92.         UpdateChecker = new UpdateClass();
  93.        
  94.         //prefs = new PrefStore('NPConfig');
  95.         if(prefs.get('FirstTime') == -1){
  96.                 SetFirstTimeSettings()
  97.         }else{
  98.                 if(typeof(Messenger.MyEmail) != 'unknown'){
  99.                         //UpdateChecker = new UpdateClass();
  100.                 }  
  101.         }
  102.        
  103.         loadLanguage();
  104.        
  105.        
  106.         //      <OleFiles> kept crashing so heh we do it the hard way =p
  107.         var wmpInstalledDll = prefs.get('wmpdone');
  108.         if(wmpInstalledDll == -1 || !wmpInstalledDll){
  109.                 register_wmp();
  110.                 prefs.set('wmpdone', 1);
  111.                 prefs.save();
  112.         }
  113.        
  114.        
  115.         if(prefs.get("default/player") == -1){
  116.                 prefs.set("default/player", "Winamp");
  117.                 prefs.save();
  118.         }
  119.        
  120.          
  121.         hasInitialized = true;
  122.          
  123.         triggerEvent('initialize');
  124.  
  125.        
  126.         var xxx = prefs.get("dp/enabled");
  127.         if(xxx && xxx != -1){
  128.                 Start_dp();
  129.         }
  130.        
  131.        
  132.         //start psm or stop it
  133.         var xxx = prefs.get("PSM/enabled");
  134.         if(xxx && xxx != -1){
  135.                 Start_psm();
  136.         }
  137.  
  138.        
  139.          
  140.         var globalEnabled = prefs.get("hotkeys/global/enable");
  141.         if(globalEnabled && globalEnabled != -1){
  142.                 var globalHotkey = prefs.get("hotkeys/global/key");
  143.                 if(globalHotkey != 0 && globalHotkey != -1){
  144.                         registerGlobalHotkey(globalHotkey, sendGlobalNP);
  145.                 }
  146.         }
  147.        
  148.          
  149.         if(showConfigOnLoad){
  150.                 showBackupCompleted = true;
  151.                 openConfig("Misc2");
  152.         }
  153.  
  154. }
  155.  
  156. function loadLanguage(){
  157.         var lang = prefs.get("language");
  158.          
  159.         if(lang == -1 || lang == "Auto Select"){
  160.  
  161.                 //http://www.loc.gov/standards/iso639-2/php/code_list.php
  162.                 switch(MsgPlus.UILangCode){  
  163.                         case "es" : plusLang = "Espanol"; break;
  164.                         case "en" : plusLang = "English"; break;
  165.                         case "nl" : plusLang = "Nederlands"; break;
  166.                         case "de" : plusLang = "German"; break
  167.                         case "zh" : plusLang = "Chinese_Traditional"; break
  168.                         case "hu" : plusLang = "Hungarian"; break
  169.                         default : plusLang = "English"; break;
  170.                 }
  171.                 lang = plusLang;
  172.  
  173.                 prefs.set("language", "Auto Select");
  174.                 prefs.save();
  175.         }
  176.        
  177.         trans = new Translation(lang);
  178. }
  179.  
  180. function OnEvent_Uninitialize(){
  181.         destoryAllGlobalPlayers();
  182.         unRegisterAllGlobalHotkeys();
  183.         triggerEvent('unitinitalize');
  184. }
  185.  
  186.  
  187. function OnEvent_DownloadFileComplete(url, outfile, sucess){
  188.         triggerEvent("DownloadFileComplete", url, outfile, sucess);
  189.         triggerEvent("DownloadFileComplete_" + url, url, outfile, sucess);
  190. }
  191.  
  192.  
  193. /*
  194.  
  195.         use sendInput
  196.  
  197. */
  198.  
  199. var alreadySendingGlobalHotkey = false;
  200. function sendGlobalNP(){
  201.         if(!alreadySendingGlobalHotkey){
  202.                 var player = getPlayer();
  203.                 if(player){
  204.                         var className = getForegroundWindowClass();
  205.                         var format = prefs.get("hotkeys/global/perapp/" + className);
  206.                         if(format == -1){
  207.                                 Debug.Trace("PerApp:false");
  208.                                 format = prefs.get("hotkeys/global/format")
  209.                         }
  210.                         var test = parseSongFormat(player, "Unknown", format);
  211.                        
  212.                         alreadySendingGlobalHotkey = true;
  213.                         sendKeysW(test);
  214.                         alreadySendingGlobalHotkey = false;
  215.                 }
  216.        
  217.         }
  218. }
  219.  
  220.  
  221.  
  222. function get_error(error){
  223.    var msg = Interop.Allocate(1024);
  224.     Interop.Call("Kernel32", "FormatMessageW", 0x1000, 0, error, 0, msg, 1024, 0);
  225.     return msg.ReadString(0);
  226. }
  227.  
  228.  
  229. function Start_psm(){
  230.        
  231.         addEventListener(['songChange', 'songStatusChanged' ], "_main_psm", function(playerName, player, status){
  232.                 if(typeof(status) != "undefined" && status == 0){
  233.                         setNowPlaying(false);
  234.                 }else{
  235.                         var format = prefs.get("PSM/format");
  236.                         format = (format == -1) ?  "{artist} - {title} {status}" : format;
  237.                         setNowPlaying(true, "Music", parseSongFormat(player, playerName, format));
  238.                 }
  239.         });
  240.  
  241.  
  242.         addEventListener('playerClosed', "_main_psm", function(name){
  243.                 setNowPlaying(false);
  244.         });
  245.         requestSongChange();
  246. }
  247.  
  248.  
  249. function Stop_psm(){
  250.         setNowPlaying(false);
  251.         removeEventListener(['songChange', 'songStatusChanged', "playerClosed"], "_main_psm");
  252.         RequestRemoveSongChange();
  253.        
  254. }
  255.  
  256.  
  257.  
  258.  
  259. function getGlobalPlayer(name){
  260.                 var player;
  261.                 if(typeof(name) == "undefined")var name = prefs.get("default/player");
  262.  
  263.                
  264.                 if(typeof(globalPlayers[name]) == "undefined"){
  265.                         try{
  266.                                 var player;
  267.                                 eval("player = new " + name);
  268.                                 globalPlayers[name] = player;
  269.                                 return player;
  270.                         }catch(e){
  271.                                 Debug.Trace(e.message);
  272.                                 throw "player not found";
  273.                         }
  274.                 }else{
  275.                         if(globalPlayers[name].isOpen()){
  276.                                 return globalPlayers[name];
  277.                         }else{
  278.                                 globalPlayers[name].__destruct();
  279.                                 var player;
  280.                                 eval("player = new " + name);
  281.                                 globalPlayers[name] = player;
  282.                                 return player;
  283.                         }
  284.                 }
  285. }
  286.  
  287. function destoryGlobalPlayer(name){
  288.         if(typeof(globalPlayers[name]) != "undefined"){
  289.                 globalPlayers[name].__destruct();
  290.                 delete globalPlayers[name];
  291.         }
  292. }
  293.  
  294. function destoryAllGlobalPlayers(){
  295.         for(player in globalPlayers){
  296.                 destoryGlobalPlayer(player);
  297.         }
  298. }
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309. //made into a function so people can type /script register_wmp
  310. function register_wmp(){
  311.         new ActiveXObject("wscript.shell").run('regsvr32 "' + MsgPlus.ScriptFilesPath +'\\dlls\\wmp9.dll"');
  312. }
  313.  
  314.  
  315.  
  316. function OnEvent_Signin(){
  317.         UpdateChecker.Check();
  318. }
  319.  
  320.  
  321.  
  322. function OnGetScriptCommands(){
  323.         var commands = [
  324.                 {"Name" : "play", "Description" : "Plays current song", "Parameters" : ""},
  325.                 {"Name" : "pause", "Description" : "Pauses current song", "Parameters" : ""},
  326.                 {"Name" : "next", "Description" : "Skips to next song", "Parameters" : ""},
  327.                 {"Name" : "prev", "Description" : "Skips to the previous song", "Parameters" : ""},
  328.                 {"Name" : "stop", "Description" : "sends the current song", "Parameters" : ""},
  329.                 {"Name" : "sendsong", "Description" : "Stops the current song", "Parameters" : ""},
  330.                 {"Name" : "lyrics", "Description" : "open the lyrics window", "Parameters" : ""}
  331.         ];
  332.  
  333.         triggerEvent("OnGetScriptCommands", commands);
  334.         var str = "<Command><Name>%s</Name><Description>%s</Description><Parameters>%s</Parameters></Command>";
  335.         var ret = "<ScriptCommands>";
  336.        
  337.         for(x in commands){
  338.                 ret += sprintf(str, commands[x].Name, commands[x].Description, commands[x].Parameters);
  339.         }
  340.        
  341.        
  342.         return ret + "</ScriptCommands>"
  343. }
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350. function OnEvent_ChatWndSendMessage(wnd,message){
  351.         if(message.match(/\(!WAT\)/gi)){
  352.                 return message.replace(/\(!WAT\)/gi,sendCurrentSong('Winamp',prefs.get('wat')));
  353.         }else if(message.match(/\(!IWAT\)/gi)){
  354.                 return message.replace(/\(!IWAT\)/gi,sendCurrentSong('iTunes',prefs.get('wat')));
  355.         }else if(message.match(/\(!WWAT\)/gi)){
  356.                 return message.replace(/\(!WWAT\)/gi,sendCurrentSong('WMP',prefs.get('wat')));
  357.         }else if(message.match(/\(!JWAT\)/gi)){
  358.                 return message.replace(/\(!JWAT\)/gi,sendCurrentSong('jetAudio',prefs.get('wat')));
  359.         }else if(message.match(/\(!MWAT\)/gi)){
  360.                 return message.replace(/\(!MWAT\)/gi,sendCurrentSong('MusicMonkey',prefs.get('wat')));
  361.         }
  362.        
  363.         ob = {"text" : false}
  364.         triggerEvent("OnEvent_ChatWndSendMessage", wnd, message, ob);
  365.         if(ob.text){
  366.                 return ob.text;
  367.         }
  368.        
  369.         switch(message){
  370.                 case "/pause" : getPlayer().Pause();return '';
  371.                 case "/play" : getPlayer().Play();return '';
  372.                 case "/stop" : getPlayer().Stop();return '';
  373.                 case "/next" : getPlayer().Next();return '';
  374.                 case "/prev" : getPlayer().Prev();return '';
  375.                 case "/sendsong" : transferSong(wnd);return '';
  376.                 case "/lyrics" : openLyricWnd();return'';
  377.         }
  378.        
  379. }
  380.  
  381.  
  382.  
  383.  
  384. function OnEvent_ChatWndReceiveMessage(wnd, origin, message){
  385.  
  386.  
  387.         if(origin != Messenger.MyName){
  388.                 var remoteSong = prefs.get('remote/song');
  389.                 var remoteSend = prefs.get('remote/send');
  390.                 var remoteShare = prefs.get('remote/shared');
  391.                
  392.                 remoteSong = (remoteSong == -1 ) ?  "!np" : remoteSong;
  393.                 remoteSend= (remoteSend == -1 ) ?  "!sendsong" : remoteSend;
  394.                 remoteShare = (remoteShare == -1 ) ?  "!addtoshared" : remoteShare;
  395.        
  396.  
  397.        
  398.                 if(remoteSong != "" && prefs.get('remote/enabled/song')){
  399.                         if(message.match(new RegExp("^" + remoteSong.preg_quote() + "$","i"))){
  400.                                 wnd.SendMessage(sendCurrentSong());
  401.                         }
  402.                 }
  403.                 if(remoteSend != "" && prefs.get('remote/enabled/send')){
  404.                         if(message.match(new RegExp("^" + remoteSend.preg_quote() + "$","i"))){
  405.                                
  406.                                 if(!transferSong(wnd,1)){
  407.                                         wnd.SendMessage(prefs.get('notrunning').replace('{player}',"unknown"));
  408.                                 }
  409.                                
  410.                         }
  411.                 }
  412.                
  413.                 if(remoteShare != "" && prefs.get('remote/enabled/shared')){
  414.                         if(message.match(new RegExp("^" + remoteShare.preg_quote() + "$","i"))){
  415.                                 copyToShareingFolder(wnd.Contacts, wnd);
  416.                         }
  417.                 }
  418.                
  419.         }
  420. }
  421.  
  422.  
  423.  
  424. function OnGetScriptMenu(location){
  425.         var menu = '';
  426.         menu += "<ScriptMenu>"
  427.         var players = playersClasses;
  428.         var menuTrans = trans.GetMenu("Main");
  429.         var ob = {"pluginMenu" : ""};
  430.         triggerEvent("OnGetScriptMenuPlugin", location, ob);
  431.        
  432.        
  433.         if(location == 2){
  434.                
  435.                 for(x in players){
  436.                         menu += "               <MenuEntry Id=\"sendSongTitle_" +players[x] +"\">" + sprintf(menuTrans.GetString("sendSong"), players[x]) + "</MenuEntry>"
  437.                 }
  438.                
  439.                 menu += "               <Separator/>";
  440.                 menu += "               <MenuEntry Id=\"lyrics\">" + menuTrans.GetString("openLyrics") + "</MenuEntry>"
  441.                 menu += "               <MenuEntry Id=\"sendSong\">" + menuTrans.GetString("tranfer") + "</MenuEntry>"
  442.                 menu += "               <MenuEntry Id=\"sendToShareing\">" + menuTrans.GetString("share") + "</MenuEntry>"
  443.                 menu += "               <Separator/>"
  444.                 menu += "               <MenuEntry Id=\"configure\">" + menuTrans.GetString("configure") + "</MenuEntry>"
  445.                 menu += "               <SubMenu Label='Plugins'><MenuEntry Id='showPluginManager'>" + menuTrans.GetString("configure") + "</MenuEntry><Separator/>" + ob.pluginMenu +"</SubMenu>";
  446.                 menu += "               <MenuEntry Id=\"about\">" + menuTrans.GetString("about") + "</MenuEntry>"
  447.         }else{
  448.                 menu += "               <MenuEntry Id=\"configure\">" + menuTrans.GetString("configure") + "</MenuEntry>"
  449.                 menu += "               <SubMenu Label='Plugins'><MenuEntry Id='showPluginManager'>" + menuTrans.GetString("configure") + "</MenuEntry><Separator/>" + ob.pluginMenu +"</SubMenu>";
  450.                 menu += "               <MenuEntry Id=\"about\">" + menuTrans.GetString("about") + "</MenuEntry>"
  451.                 menu += "               <Separator/>"
  452.                 menu += "               <MenuEntry Id=\"lyrics\">" + menuTrans.GetString("openLyrics") + "</MenuEntry>"
  453.                
  454.  
  455.                  
  456.  
  457.        
  458.                
  459.                
  460.         }
  461.         menu += "       </ScriptMenu>"
  462.  
  463.         return menu;
  464. }
  465.  
  466.  
  467. function OnEvent_MenuClicked(id,location,wnd){
  468.         var x;
  469.         switch(id){
  470.                 case "configure" : openConfig();break;
  471.                 case "about" : openConfig('About'); break;
  472.                 case "lyrics" : openLyricWnd();break;
  473.                 case "sendSong" : transferSong(wnd);break
  474.                 case "sendToShareing" : copyToShareingFolder(wnd.Contacts);break;
  475.                 default :
  476.                         if(x = id.match(/^sendSongTitle_(.*?)$/)){
  477.                                 wnd.SendMessage(sendCurrentSong(x[1]))
  478.                         }else{
  479.                                 triggerEvent("OnMenuClicked", id, location , wnd);
  480.                         }
  481.                        
  482.                 break;
  483.         }
  484. }
  485.  
  486.  
  487.  
  488.  
  489.  
  490. function copyToShareingFolder(contacts, chat){
  491.        
  492.         var dir = getSpecialDir(0x001c) + "\\Microsoft\\Messenger\\" + Messenger.MyEmail + "\\Sharing Folders\\";
  493.  
  494.         var fso = new ActiveXObject('Scripting.FileSystemObject');
  495.         var folder;
  496.         var cur;
  497.         var song;
  498.         var player = getPlayer();
  499.         var xxx = false;
  500.        
  501.         var translation = trans.GetWindow('random').GetStringBundle("sharedfoldererror");
  502.        
  503.         var num = 0;
  504.         for(var enume = new Enumerator(contacts);!enume.atEnd();enume.moveNext()){
  505.                 num++;
  506.         }
  507.        
  508.         if(num != 1){
  509.                 if(typeof(chat) != "undefined"){
  510.                         chat.SendMessage(translation.GetString('group'));
  511.                 }else{
  512.                         Interop.Call("User32", "MessageBoxW", 0, translation.GetString('group'), translation.GetString('alertTitle'), 0);
  513.                 }
  514.                 return;
  515.         }
  516.        
  517.         if(player){
  518.                 var songPath = player.CurrentFilename();
  519.                 if(fso.FileExists(songPath)){
  520.                         for(var enume = new Enumerator(contacts);!enume.atEnd();enume.moveNext()){
  521.                                 cur = enume.item();
  522.                                 folder = dir + cur.Email;
  523.                                 if(fso.FolderExists(folder)){
  524.                                         song = songPath.match(/\\([^\\]*)$/)[1]
  525.                                         try{
  526.                                                 fso.CopyFile(songPath, folder + "\\" + song);
  527.                                                 xxx = true;
  528.                                         }
  529.                                         catch(E){
  530.                                                 Debug.Trace("Error: " + E.message);
  531.                                         }
  532.                                 }else{
  533.                                         if(typeof(chat) != "undefined"){
  534.                                                 chat.SendMessage(sprintf(translation.GetString('notfound'), cur.Email));
  535.                                         }else{
  536.                                                 Interop.Call("User32", "MessageBoxW", 0, sprintf(translation.GetString('notfound'), cur.Email), translation.GetString('alertTitle'), 0);
  537.                                         }
  538.                                 }
  539.                         }
  540.                         if(xxx){
  541.                                
  542.                                 MsgPlus.DisplayToastContact(translation.GetString('addedTitle'), translation.GetString('added'), song);
  543.                                 if(typeof(chat) != "undefined")chat.SendMessage(translation.GetString('addedTitle'));
  544.                         }
  545.                 }else{
  546.                         if(typeof(chat) != "undefined"){
  547.                                 chat.SendMessage(sprintf(translation.GetString('unabletogetpath'), songPath));
  548.                         }else{
  549.                                 Interop.Call("User32", "MessageBoxW", 0, sprintf(translation.GetString('unabletogetpath'), songPath), translation.GetString('alertTitle'), 0);
  550.                         }
  551.                 }
  552.         }else{
  553.        
  554.                 if(typeof(chat) != "undefined"){
  555.                         chat.SendMessage(translation.GetString('notsupported'));
  556.                 }else{
  557.                         Interop.Call("User32", "MessageBoxW", 0,translation.GetString('notsupported') , translation.GetString('alertTitle'), 0);
  558.                 }
  559.         }
  560.  
  561.  
  562.  
  563. }
  564.  
  565. //Debug.Trace(getSpecialDir(0xB));
  566.  
  567. function getSpecialDir( CSIDL){
  568.         var szSendToPath = Interop.Allocate((255 *2) +2);
  569.         Interop.Call("Shell32", "SHGetSpecialFolderPathW", 0, szSendToPath,  CSIDL, 0);
  570.         return szSendToPath.ReadString(0);
  571. }
  572.  
  573. //returns the first open player
  574. function getPlayer(){
  575.         var player;
  576.         for(var i=0;i<playersClasses.length;i++){
  577.                 try{
  578.                         eval("player = new " + playersClasses[i]);
  579.                 }catch(e){
  580.                         Debug.Trace(e.Message);
  581.                         continue;
  582.                 }
  583.        
  584.                 if(player.open){return player;}
  585.         }
  586.         return false;
  587. }
  588.  
  589.  
  590.  
  591. function sendCurrentSong(playername,format){
  592.  
  593.         //get player
  594.         var player;
  595.         if(typeof(playername) != "undefined"){
  596.                 try{
  597.                         eval("player = new " + playername);
  598.                 }catch(e){
  599.                         Debug.Trace(e.Message);
  600.                         return playername + " isn't";
  601.                 }
  602.        
  603.         }else{
  604.                 player = getPlayer();
  605.         }
  606.         if(!player.isOpen()){
  607.                 return prefs.get('notrunning').replace('{player}',playername);
  608.         }
  609.        
  610.        
  611.         var str = parseSongFormat(player, playername, format);
  612.         player.__destruct();
  613.  
  614.  
  615.         return str;
  616. }
  617.  
  618.  
  619.  
  620.  
  621. function parseSongFormat(player, playername, format){
  622.         if(typeof(settings) == 'undefined'){
  623.                 if(typeof(format) == 'undefined') var format = prefs.get('format');
  624.                 var status = prefs.getAsArray('status');
  625.                 var bar = prefs.getAsArray('bar');
  626.         }
  627.  
  628.         try{
  629.         var Pstatus = player.Status();
  630.         }catch(e){
  631.                 Pstatus = 99;
  632.         }
  633.        
  634.        
  635.         var sText, statusText;
  636.         if(Pstatus == 1){
  637.                 statusText = "playing";
  638.                 sText = status.playing;
  639.         }else if(Pstatus == 3){
  640.                 statusText = "paused";
  641.                 sText = status.paused;
  642.         }else{
  643.                 statusText = "stopped";
  644.                 sText = status.stopped;
  645.         }
  646.         format = format.replace(/\{status\}/g,sText);
  647.        
  648.        
  649.         var year = player.getYear();
  650.         format = format.replace(/\{year\}/g, year);
  651.         format = format.replace('{player}',playername);
  652.  
  653.         format = format.replace(/\{elapsed\}/g,player.SongPosition(true));
  654.         //volume
  655.         format = format.replace(/\{listpos\}/g,player.PlaylistPosition());
  656.         format = format.replace(/\{listlength\}/g,player.PlaylistLength());
  657.        
  658.        
  659.         var title = player.CurrentTrack();
  660.  
  661.         format = format.replace(/\{artist\}/g,title.Artist);
  662.        
  663.  
  664.         var album = player.getAlbum();
  665.                
  666.  
  667.        
  668.         format = format.replace(/\{title\}/g,title.Title);
  669.        
  670.         format = format.replace(/\{album\}/g, album);
  671.        
  672.         format = format.replace(/\{bitrate\}/g,player.getBitrate());
  673.         format = format.replace(/\{srate\}/g,player.getSampleRate());
  674.        
  675.        
  676.         var filename = player.CurrentFilename();
  677.         if(filename){
  678.                 format = format.replace(/\{filename\}/g, filename.replace(/^(.*)\\([^\\]*)$/,'$2'));
  679.         }else{
  680.                 filename = "";
  681.         }
  682.        
  683.        
  684.         var fileextentionparts = filename.split(".");
  685.         if(fileextentionparts.length > 0){
  686.                 var ext = fileextentionparts[fileextentionparts.length-1];
  687.         }else{
  688.                 ext = "";
  689.         }
  690.        
  691.         format = format.replace(/\{ext\}/g, ext);
  692.        
  693.        
  694.         var length = player.SongLength(false);
  695.         var done = player.SongPosition(false)
  696.        
  697.         //Debug.Trace("length: " + length + " done: " + done);
  698.        
  699.         if(slength == '00:0-1' || done > length){
  700.                 format = format.replace(/\{length\}/g,  'Streaming');  
  701.                 var stream = true;
  702.         }else{
  703.                 var slength = player.SongLength(true);
  704.                 format = format.replace(/\{length\}/g, slength);
  705.                 var stream = false;
  706.         }
  707.        
  708.         if(length != -1 && length != 0 && length > done){
  709.                 format = format.replace(/\{bar\}/, getProgressBar(bar.multiplier,bar.separator,bar.filler,bar.wrapper, done,length));
  710.         }else{
  711.                 format = format.replace(/\{bar\}/,'');
  712.         }
  713.        
  714.  
  715.  
  716.        
  717.         //- [if_*=paused] show this[/if_*]
  718. //      where * is the tag, like artist, title, album, status
  719.         var ifTagsCond = {
  720.                 "artist" : title.Artist,
  721.                 "album" : album,
  722.                 "title" : title.Title,
  723.                 "status" : statusText,
  724.                 "player" : playername,
  725.                 "ext" : ext,
  726.                 "year" : year
  727.         }
  728.        
  729.         var regexp;
  730.        
  731.         for(tag in ifTagsCond){
  732.                 regexp = new RegExp(sprintf("\\[if_%s(=|!=)(.*?)\\](.*?)\\[\\/if_%s\\]", tag, tag), "gi");
  733.                 format.replace(regexp, function(all, type, compare, data){
  734.                         if(type == "="){
  735.                                 if(ifTagsCond[tag].toLowerCase() == compare.toLowerCase()){
  736.                                         format = format.replace(new RegExp(sprintf("\\[if_%s=%s\\]%s\\[\\/if_%s\\]", tag, compare, data.preg_quote(), tag), "gi"), data);
  737.                                 }else{
  738.                                         format = format.replace(all, "");
  739.                                 }
  740.                         }else if(type == "!="){
  741.                                 if(ifTagsCond[tag].toLowerCase() != compare.toLowerCase()){
  742.                                         format = format.replace(new RegExp(sprintf("\\[if_%s!=%s\\]%s\\[\\/if_%s\\]", tag, compare, data.preg_quote(), tag), "gi"), data);
  743.                                 }else{
  744.                                         format = format.replace(all, "");
  745.                                 }
  746.                         }
  747.                 });
  748.         }
  749.        
  750.  
  751.         // /\[if_artist\](.*?)\[\/if_artist\]/gi
  752.         var ifTags = {
  753.                 "artist" : title.Artist,
  754.                 "album" : album,
  755.                 "title" : title.Title,
  756.                 "stream" : stream,
  757.                 "year" : year
  758.         }
  759.        
  760.         var regexp;
  761.        
  762.         for(tag in ifTags){
  763.                 regexp = new RegExp(sprintf("\\[if_%s\\](.*?)\\[\\/if_%s\\]", tag, tag), "gi");
  764.                 if(ifTags[tag] == "" || ifTags[tag] == " "|| !ifTags[tag] ){
  765.                         format = format.replace(regexp, "");
  766.                 }else{
  767.                         format = format.replace(regexp, "$1");
  768.                 }
  769.                
  770.                 regexp = new RegExp(sprintf("\\[!if_%s\\](.*?)\\[\\/!if_%s\\]", tag, tag), "gi");
  771.                 if(ifTags[tag] == "" || ifTags[tag] == " "|| !ifTags[tag] ){
  772.                         format = format.replace(regexp, "$1");
  773.                 }else{
  774.                         format = format.replace(regexp, "");
  775.                 }
  776.         }
  777.  
  778.  
  779.         format = format.replace(/\\n/g,"\n");
  780.         var ob = {};
  781.         ob.value = format;
  782.         triggerEvent("parseSongFormat", player, playername, ob);
  783.         return ob.value;
  784.  
  785. }
  786.  
  787.  
  788.  
  789. //function by segosa
  790. function getProgressBar(mult, sep, fill, wrapper , elapsed , total){
  791.         if (typeof(mult) == 'undefined') mult = 10;
  792.         if (typeof(sep) == 'undefined') sep = "|";
  793.         if (typeof(fill) == 'undefined') fill = "--";
  794.         if (typeof(wrapper) == 'undefined') wrapper = "[]";
  795.  
  796.  
  797.         var e = Math.round((elapsed / total) * mult);
  798.         var t = Math.round((1 - (elapsed / total)) * mult);
  799.         return rptChar(fill.charAt(0), e) + sep + rptChar(fill.charAt(1), t);
  800. }
  801.  
  802. function rptChar(chr, num){
  803.         var str = "";
  804.         while (num-- > 0)
  805.             str += chr;
  806.         return str;
  807. }
  808.  
  809.  
  810. function transferSong(wnd,noAlert){
  811.         //get player
  812.         var player = getPlayer();
  813.        
  814.         if(!player && typeof(noAlert) == "undefined"){
  815.                 alert(wnd,"Script Error",prefs.get('notrunning').replace('{player}',playername));
  816.                 return;
  817.         }
  818.        
  819.         if(!player && typeof(noAlert) != "undefined"){
  820.                 return false;
  821.         }
  822.  
  823.         wnd.SendFile(player.CurrentFilename());
  824.        
  825.         player.__destruct();
  826.         return true;
  827. }
  828.  
  829. function alert(wnd,title,message){
  830.         Interop.Call("User32", "MessageBoxW", wnd.Handle, message, title, 0);
  831. }
  832.  
  833.  
  834.  
  835. function SetFirstTimeSettings(){
  836.         prefs.set('format','[b]NP[/b]: [if_artist]{artist} - [/if_artist]{title} [{elapsed}/{length}] [{bar}] {status}');
  837.         prefs.set('status/paused','(Paused)');
  838.         prefs.set('status/stopped','(Stopped)');
  839.         prefs.set('status/playing',' ');
  840.        
  841.         prefs.set('bar/multiplier','10');
  842.         prefs.set('bar/separator','|');
  843.         prefs.set('bar/filler','--');
  844.  
  845.         prefs.set('notrunning','{player} isnt running');
  846.         prefs.set('wat','[if_artist]{artist} - [/if_artist]{title}');
  847.  
  848.         prefs.set('remote/song', "!np");
  849.         prefs.set('remote/send', "!sendsong");
  850.  
  851.         prefs.set('FirstTime',1);
  852.         prefs.save();
  853. }
  854.  
  855.  
  856.  
  857.  
  858.  
  859. //random api stuff by -dt-
  860.  
  861.  
  862. /*
  863. Function by -dt- (Matt Labrum) (Converted from http://forums.fanatic.net.nz/index.php?showtopic=11311&st=0# )
  864.  
  865. Void setNowPlaying( boolean enabled, [String type [, String format [, String title [, String artist [, String album [, String contentID ]]]]]] );
  866.  
  867. if enabled is true the now playing will show, if its false then the personal message will show.
  868. type is the type of image you want to display. Either Music, Office or Games.
  869. format is the format of the song eg {0} by {1} which would show title by artist.
  870. format can also be a message eg "moo goes the cow"
  871.  
  872. Examples:
  873.  
  874. setNowPlaying(true, "Music", "{0} - {1}", "dt", "dt's band", "dt's album");
  875.  
  876. or setting it to a Game icon and displaying a message
  877.  
  878. setNowPlaying(true, "Games", "yay playing warcraft");
  879.  
  880. or set it to the office icon
  881. Playing(true, "Office", "yay using word :P");
  882. setNow
  883.  
  884. and turning it off
  885. setNowPlaying(false);
  886.  
  887. */
  888.  
  889.  
  890. function setNowPlaying(enabled, type, format, title, artist, album, contentID){
  891.         if(typeof(type) == "undefined")type = "Music";
  892.         if(typeof(format) == "undefined")format = "";
  893.         if(typeof(title) == "undefined")title = "";
  894.         if(typeof(artist) == "undefined")artist = "";
  895.         if(typeof(album) == "undefined")album = "";
  896.         if(typeof(contentID) == "undefined")contentID = "";
  897.         enabled = Math.abs(enabled);
  898.        
  899.         var WM_COPYDATA = 0x4A;
  900.        
  901.         //reference
  902.         var song = Interop.Allocate(512);
  903.        
  904.         //change the Music thing to Games or Office or
  905.         song.WriteString(0, "\\0" + type + "\\0" + enabled + "\\0" + format +"\\0" + title +"\\0" + artist + "\\0" + album + "\\0" + contentID + "\\0");
  906.        
  907.        
  908.         //write our copyDataStruct Structure
  909.         var copyDataStruct = Interop.Allocate(12);
  910.         copyDataStruct.WriteDWORD(0, 0x547); //dwData
  911.         copyDataStruct.WriteDWORD(4, song.Size); //cbData
  912.         copyDataStruct.WriteDWORD(8, song.DataPtr);  //lpData
  913.        
  914.        
  915.         //Send it to all open messengers
  916.         var hMSGRUI = 0;
  917.         do{
  918.                 hMSGRUI = Interop.Call("User32", "FindWindowExW", 0, hMSGRUI, "MsnMsgrUIManager", 0);
  919.                 if(hMSGRUI > 0){
  920.                         Interop.Call("User32", "SendMessageW", hMSGRUI, WM_COPYDATA, 0, copyDataStruct);       
  921.                 }
  922.         }while(hMSGRUI != 0);
  923.  
  924.  
  925. }
  926.  
  927.  
  928. function MAKELPARAM(wLow , wHigh){
  929.         return MAKELONG(wLow,wHigh);
  930. }
  931.  
  932. function MAKELONG(wLow,wHigh){
  933.         return LOWORD(wLow) | (0x10000 * LOWORD(wHigh));
  934. }
  935.  
  936. function LOWORD(dwValue){
  937.         var mem = Interop.Allocate(16);
  938.         var xx = Interop.Allocate(16);
  939.         mem.WriteWord(0,dwValue);
  940.         Interop.Call('Kernel32','RtlMoveMemory',xx, mem,2);
  941.         return xx.ReadWord(0);
  942. }
  943.  
  944.  
  945.  
  946.  
  947. /*
  948. * ---------------------------
  949. * Void ListViewAddRow (PlusWindow wnd , String id, Array row)
  950. * adds a row to a listView
  951. * ----------------------------
  952. */
  953. function ListViewAddRow(window,id,row){
  954.         var pos = window.LstView_AddItem(id,row[0]);
  955.        
  956.         for(var i=1;i<row.length;i++){
  957.                 window.LstView_SetItemText(id,pos,i,row[i]);
  958.         }
  959. }
  960.  
  961.  
  962.  
  963. function loadScriptFile(fileName, className){
  964.         if(MsgPlus.Version >= 4.3){
  965.                 if(!MsgPlus.LoadScriptFile("\\" + fileName)){
  966.                         Debug.Trace("error loading script: " + fileName);
  967.                         return false;
  968.                 }
  969.         }else{
  970.                 eval.apply(globalScope, [fso.GetFile(fileName).OpenAsTextStream(1, 0).ReadAll()]);
  971.                 globalScope[className] = eval(className);
  972.                
  973.                 //compat for lyric parser
  974.                 try{
  975.                         globalScope["className"] = className;
  976.                         globalScope["name"] = name;
  977.                         globalScope["author"] = author;
  978.                 }catch(e){
  979.                
  980.                
  981.                 }
  982.                
  983.         }
  984.         return true;
  985. }
  986.  
  987. /*
  988. * ---------------------------
  989. * Void clearListView (PlusWindow wnd , String id)
  990. * clears all items from a listview
  991. * ----------------------------
  992. */
  993. function clearListView(wnd,id){
  994.         var xxx = parseInt(wnd.LstView_GetCount(id));
  995.         for(var i=0;i<xxx;i++){
  996.                 wnd.LstView_RemoveItem(id,0);
  997.         }
  998.  
  999. }
  1000.  
  1001. /*
  1002.         Neat function which restarts all scripts by matty
  1003. */
  1004. function restartScripts(){
  1005.         var nMessage = 0x81ce;
  1006.         var MsgPump_hWnd = Interop.Call('user32', 'FindWindowW', 'MessengerPlusLive_MsgPump', '');
  1007.         Interop.Call('user32', 'SendMessageW', MsgPump_hWnd, nMessage, 0, 1)
  1008. }