Advertisement
Paladinz2k

Rutorrent Custom Lables

Oct 1st, 2015
362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*rutorrent custom lables /var/rutorrent/rutorrent/js/webui.js
  2. /*From /* CUSTOM LABEL FUNCTIONALITY */
  3. /*to /* CUSTOM LABEL FUNCTIONALITY END*/
  4. /*
  5.  *      Main object.
  6.  *
  7.  */
  8.  
  9. var theWebUI =
  10. {
  11.         version: "3.6",
  12.     tables:
  13.     {
  14.         trt:
  15.         {
  16.             obj: new dxSTable(),
  17.             columns:
  18.             [
  19.                 { text: theUILang.Name,             width: "200px", id: "name",     type: TYPE_STRING },
  20.                     { text: theUILang.Status,       width: "100px", id: "status",       type: TYPE_STRING },
  21.                 { text: theUILang.Size,             width: "60px",  id: "size",         type: TYPE_NUMBER },
  22.                 { text: theUILang.Done,             width: "100px", id: "done",     type: TYPE_PROGRESS },
  23.                 { text: theUILang.Downloaded,       width: "100px", id: "downloaded",   type: TYPE_NUMBER },
  24.                 { text: theUILang.Uploaded,         width: "100px", id: "uploaded",     type: TYPE_NUMBER },
  25.                 { text: theUILang.Ratio,            width: "60px",  id: "ratio",        type: TYPE_NUMBER },
  26.                 { text: theUILang.DL,           width: "60px",  id: "dl",       type: TYPE_NUMBER },
  27.                 { text: theUILang.UL,           width: "60px",  id: "ul",       type: TYPE_NUMBER },
  28.                 { text: theUILang.ETA,          width: "60px",  id: "eta",      type: TYPE_NUMBER },
  29.                 { text: theUILang.Label,            width: "60px",  id: "label",        type: TYPE_STRING },
  30.                 { text: theUILang.Peers,            width: "60px",  id: "peers",        type: TYPE_NUMBER },
  31.                 { text: theUILang.Seeds,            width: "60px",  id: "seeds",        type: TYPE_NUMBER },
  32.                 { text: theUILang.Priority,         width: "80px",  id: "priority",     type: TYPE_NUMBER },
  33.                 { text: theUILang.Created_on,       width: "100px", id: "created",      type: TYPE_NUMBER },
  34.                 { text: theUILang.Remaining,        width: "90px",  id: "remaining",    type: TYPE_NUMBER }
  35.             ],
  36.             container:  "List",
  37.             format:     theFormatter.torrents,
  38.             ondelete:   function() { theWebUI.remove(); },
  39.                     onselect:   function(e,id) { theWebUI.trtSelect(e,id) },
  40.             ondblclick: function(obj) { theWebUI.showDetails(obj.id); return(false); }
  41.         },
  42.         fls:
  43.         {
  44.             obj: new dxSTable(),
  45.             columns:
  46.             [
  47.                 { text: theUILang.Name,             width: "200px", id: "name",     type: TYPE_STRING },
  48.                 { text: theUILang.Size,             width: "60px",  id: "size",     type: TYPE_NUMBER,  "align" : ALIGN_RIGHT},
  49.                 { text: theUILang.Done,             width: "100px",     id: "done",     type: TYPE_NUMBER },
  50.                 { text: "%",                width: "100px", id: "percent",      type: TYPE_PROGRESS },
  51.                 { text: theUILang.Priority,         width: "80px",  id: "priority",     type: TYPE_NUMBER }
  52.             ],
  53.             container:  "FileList",
  54.             format:     theFormatter.files,
  55.             onselect:   function(e,id) { theWebUI.flsSelect(e,id) },
  56.             ondblclick: function(obj)
  57.             {
  58.                 if(!theWebUI.settings["webui.fls.view"] && (theWebUI.dID!=""))
  59.                 {
  60.                     var lnk = this.getAttr(obj.id, "link");
  61.                             if(lnk!=null)
  62.                             {
  63.                                 theWebUI.dirs[theWebUI.dID].setDirectory(lnk);
  64.                         this.clearRows();
  65.                             theWebUI.redrawFiles(theWebUI.dID);
  66.                     }
  67.                 }
  68.                 return(false);
  69.             }
  70.         },
  71.         trk:
  72.         {
  73.             obj: new dxSTable(),
  74.             columns:
  75.             [
  76.                 { text: theUILang.Name,         width: "200px", id: "name",     type: TYPE_STRING },
  77.                 { text: theUILang.Type,         width: "60px",  id: "type",     type: TYPE_STRING,  "align" : ALIGN_RIGHT},
  78.                 { text: theUILang.Enabled,      width: "60px",  id: "enabled",      type: TYPE_STRING,  "align" : ALIGN_RIGHT},
  79.                 { text: theUILang.Group,        width: "60px",  id: "group",        type: TYPE_NUMBER },
  80.                 { text: theUILang.Seeds,        width: "60px",  id: "seeds",        type: TYPE_NUMBER },
  81.                 { text: theUILang.Peers,        width: "60px",  id: "peers",        type: TYPE_NUMBER },
  82.                 { text: theUILang.scrapeDownloaded, width: "80px",  id: "downloaded",   type: TYPE_NUMBER },
  83.                 { text: theUILang.scrapeUpdate,     width: "85px",  id: "last",     type: TYPE_NUMBER },
  84.                 { text: theUILang.trkInterval,      width: "80px",  id: "interval",     type: TYPE_NUMBER },
  85.                 { text: theUILang.trkPrivate,       width: "60px",  id: "private",      type: TYPE_STRING,  "align" : ALIGN_RIGHT}
  86.             ],
  87.  
  88.             container:  "TrackerList",
  89.             format:     theFormatter.trackers,
  90.             onselect:   function(e,id) { theWebUI.trkSelect(e,id) }
  91.         },
  92.         prs:
  93.         {
  94.             obj: new dxSTable(),
  95.             columns:
  96.             [
  97.                 { text: "IP",           width: "100px", id: "name",     type: TYPE_STRING },
  98.                 { text: theUILang.ClientVersion,        width: "120px", id: "version",      type: TYPE_STRING },
  99.                 { text: theUILang.Flags,            width: "60px",  id: "flags",        type: TYPE_STRING,  "align" : ALIGN_RIGHT},
  100.                 { text: theUILang.Done,             width: "100px",     id: "done",     type: TYPE_PROGRESS },
  101.                 { text: theUILang.Downloaded,       width: "100px", id: "downloaded",   type: TYPE_NUMBER },
  102.                 { text: theUILang.Uploaded,         width: "100px", id: "uploaded",     type: TYPE_NUMBER },
  103.                 { text: theUILang.DL,           width: "60px",  id: "dl",       type: TYPE_NUMBER },
  104.                 { text: theUILang.UL,           width: "60px",  id: "ul",       type: TYPE_NUMBER }
  105.             ],
  106.             container:  "PeerList",
  107.             format:     theFormatter.peers,
  108.             onselect:   function(e,id) { theWebUI.prsSelect(e,id) },
  109.             ondblclick: function(obj)
  110.             {
  111.                 if(obj.id && theWebUI.peers[obj.id])
  112.                     window.open(theURLs.RIPEURL + theWebUI.peers[obj.id].ip, "_blank");
  113.                 return(false);
  114.             }
  115.         },
  116.         plg:
  117.         {
  118.             obj: new dxSTable(),
  119.             columns:
  120.             [
  121.                 { text: theUILang.plgName,          width: "150px", id: "name",     type: TYPE_STRING },
  122.                 { text: theUILang.plgVersion,           width: "60px",  id: "version",      type: TYPE_NUMBER },
  123.                 { text: theUILang.plgStatus,            width: "80px",  id: "status",       type: TYPE_STRING,  "align" : ALIGN_RIGHT},
  124.                 { text: theUILang.plgLaunch,            width: "80px",  id: "launch",       type: TYPE_STRING,  "align" : ALIGN_RIGHT},
  125.                 { text: theUILang.plgAuthor,            width: "80px",  id: "author",       type: TYPE_STRING },
  126.                 { text: theUILang.plgDescr,         width: "500px", id: "descr",        type: TYPE_STRING }
  127.             ],
  128.             container:  "PluginList",
  129.             format:     theFormatter.plugins,
  130.             onselect:   function(e,id) { theWebUI.plgSelect(e,id) }
  131.         }
  132.     },
  133.     settings:
  134.     {
  135.         "webui.fls.view":       0,
  136.         "webui.show_cats":      1,
  137.         "webui.show_dets":      1,
  138.         "webui.needmessage":        1,
  139.         "webui.reqtimeout":     30000,
  140.         "webui.confirm_when_deleting":  1,
  141.         "webui.alternate_color":    0,
  142.         "webui.update_interval":    3000,
  143.         "webui.hsplit":         0.88,
  144.         "webui.vsplit":         0.5,
  145.         "webui.effects":        0,
  146.         "webui.fullrows":       0,
  147.         "webui.no_delaying_draw":   1,
  148.         "webui.search":         -1,
  149.         "webui.speedlistdl":        "100,150,200,250,300,350,400,450,500,750,1000,1250",
  150.         "webui.speedlistul":        "100,150,200,250,300,350,400,450,500,750,1000,1250",
  151.         "webui.ignore_timeouts":    0,
  152.         "webui.retry_on_error":     120,
  153.         "webui.closed_panels":      {},
  154.         "webui.timeformat":     0,
  155.         "webui.dateformat":     0,
  156.         "webui.speedintitle":       0,
  157.         "webui.log_autoswitch":     1
  158.     },
  159.     showFlags: 0,
  160.     total:
  161.     {
  162.         rateDL:     0,
  163.         rateUL:     0,
  164.         speedDL:    0,
  165.         speedUL:    0,
  166.         DL:         0,
  167.         UL:         0
  168.     },
  169.     sTimer:     null,
  170.     updTimer:   null,
  171.     configured: false,
  172.     firstLoad:  true,
  173.     interval:   -1,
  174.     torrents:   {},
  175.     files:      {},
  176.     dirs:       {},
  177.     trackers:   {},
  178.     props:      {},
  179.     peers:      {},
  180.     labels:
  181.     {
  182.         "-_-_-all-_-_-":    0,
  183.         "-_-_-dls-_-_-":    0,
  184.         "-_-_-com-_-_-":    0,
  185.         "-_-_-act-_-_-":    0,
  186.         "-_-_-iac-_-_-":    0,
  187.         "-_-_-nlb-_-_-":    0,
  188.         "-_-_-err-_-_-":    0
  189.     },
  190.     actLbl:     "-_-_-all-_-_-",
  191.     cLabels:    {},
  192.     dID:        "",
  193.     pID:        "",
  194.     speedGraph: new rSpeedGraph(),
  195.     url:        window.location.href.substr(0,window.location.href.lastIndexOf("/")+1),
  196.     timer:      new Timer(),
  197.     activeView: null,
  198.     delmode:    "remove",
  199.     tegs:       {},
  200.     lastTeg:    0,
  201.     deltaTime:  0,
  202.     serverDeltaTime:0,
  203.  
  204. //
  205. // init
  206. //
  207.  
  208.     init: function()
  209.     {
  210.             log("WebUI started.");
  211.         this.setStatusUpdate();
  212.         if(browser.isOldIE)
  213.             this.msg(theUILang.Doesnt_support);
  214.         else
  215.         {
  216.             this.catchErrors(false);
  217.             this.getPlugins();
  218.             this.getUISettings();
  219.             if(!this.configured)
  220.                 this.config({});
  221.                 this.catchErrors(true);
  222.             this.assignEvents();
  223.             this.resize();
  224.             this.update();
  225.         }
  226.         return(this.configured);
  227.     },
  228.  
  229.     assignEvents: function()
  230.     {
  231.         window.onresize = theWebUI.resize;
  232.         window.onorientationchange = theWebUI.resize;
  233.         $(document).on("dragstart",function(e) { return(false); } );
  234.         $(document).on("selectstart",function(e) { return(e.fromTextCtrl); });
  235.         $(document).on("contextmenu",function(e)
  236.         {
  237.             if(e.fromTextCtrl)
  238.                 theContextMenu.hide();
  239.             else
  240.                 return(false);
  241.         });
  242.         var keyEvent = function (e)
  243.         {
  244.             switch(e.which)
  245.             {
  246.                 case 27 :               // Esc
  247.                 {
  248.                     if(theContextMenu.hide() || theDialogManager.hideTopmost())
  249.                         return(false);
  250.                     break;
  251.                 }
  252.                 case 79 :               // ^O
  253.                 {
  254.                     if(e.metaKey && !theDialogManager.isModalState())
  255.                     {  
  256.                             theWebUI.showAdd();
  257.                         return(false);
  258.                         }
  259.                     break;
  260.                 }
  261.                 case 80 :                               // ^P
  262.                 {
  263.                     if(e.metaKey && !theDialogManager.isModalState())
  264.                     {  
  265.                             theWebUI.showSettings();   
  266.                         return(false);
  267.                         }
  268.                     break;
  269.                 }
  270.                 case 112:               // F1
  271.                 {
  272.                         if((!browser.isOpera || !e.fromTextCtrl) && !theDialogManager.isModalState())
  273.                         {
  274.                             theDialogManager.show(e.metaKey ? "dlgAbout" : "dlgHelp");
  275.                         return(false);
  276.                     }
  277.                 }
  278.                 case 115 :              // F4
  279.                 {
  280.                     if(!browser.isOpera || !e.fromTextCtrl)
  281.                     {
  282.                         theWebUI.toggleMenu();
  283.                         return(false);
  284.                     }
  285.                 }
  286.                 case 117 :                          // F6
  287.                 {
  288.                         if(!browser.isOpera || !e.fromTextCtrl)
  289.                         {
  290.                         theWebUI.toggleDetails();
  291.                         return(false);
  292.                     }
  293.                 }
  294.                 case 118 :                          // F7
  295.                 {
  296.                         if(!browser.isOpera || !e.fromTextCtrl)
  297.                         {
  298.                         theWebUI.toggleCategories();
  299.                         return(false);
  300.                     }
  301.                 }
  302.             }
  303.         };
  304.         if(browser.isOpera)
  305.             $(document).keypress(keyEvent);
  306.         else
  307.             $(document).keydown(keyEvent);
  308.     },
  309.  
  310.     updateServerTime: function()
  311.     {
  312.         $('#servertime').text(theConverter.date( (new Date().getTime()-theWebUI.serverDeltaTime)/1000, true ));
  313.     },
  314.  
  315.     getPlugins: function()
  316.     {
  317.         this.request("?action=getplugins", null, false);
  318.         if(thePlugins.isInstalled("_getdir"))
  319.         {
  320.             $('#dir_edit').after($("<input type=button>").addClass("Button").attr("id","dir_btn").focus( function() { this.blur(); } ));
  321.             var btn = new this.rDirBrowser( 'tadd', 'dir_edit', 'dir_btn' );
  322.             theDialogManager.setHandler('tadd','afterHide',function()
  323.             {
  324.                 btn.hide();
  325.             });
  326.         }
  327.         correctContent();
  328.         this.updateServerTime();
  329.         window.setInterval( this.updateServerTime, 1000 );
  330.     },
  331.  
  332.     getUISettings: function()
  333.     {
  334.         this.request("?action=getuisettings", [this.config, this], false);
  335.     },
  336.  
  337.     config: function(data)
  338.     {
  339.         this.addSettings(data);
  340.         $.each(this.tables, function(ndx,table)
  341.         {
  342.                 var width = theWebUI.settings["webui."+ndx+".colwidth"];
  343.                 var enabled = theWebUI.settings["webui."+ndx+".colenabled"];
  344.             $.each(table.columns, function(i,col)
  345.             {
  346.                 if(width && i<width.length && width[i]>4)
  347.                     col.width = width[i];
  348.                 if(enabled && i<enabled.length)
  349.                     col.enabled = enabled[i];
  350.             });
  351.             table.obj.format = table.format;
  352.             table.obj.onresize = theWebUI.save;
  353.             table.obj.onmove = theWebUI.save;
  354.             table.obj.ondblclick = table.ondblclick;
  355.             table.obj.onselect = table.onselect;
  356.             table.obj.ondelete = table.ondelete;
  357.             table.obj.colorEvenRows = theWebUI.settings["webui.alternate_color"];
  358.             table.obj.maxRows = iv(theWebUI.settings["webui.fullrows"]);
  359.             table.obj.noDelayingDraw = iv(theWebUI.settings["webui.no_delaying_draw"]);
  360.             if($type(theWebUI.settings["webui."+ndx+".sindex"]))
  361.                 table.obj.sIndex = iv(theWebUI.settings["webui."+ndx+".sindex"]);
  362.             if($type(theWebUI.settings["webui."+ndx+".rev"]))
  363.                 table.obj.reverse = iv(theWebUI.settings["webui."+ndx+".rev"]);
  364.             if($type(theWebUI.settings["webui."+ndx+".sindex2"]))
  365.                 table.obj.secIndex = iv(theWebUI.settings["webui."+ndx+".sindex2"]);
  366.             if($type(theWebUI.settings["webui."+ndx+".rev2"]))
  367.                 table.obj.secRev = iv(theWebUI.settings["webui."+ndx+".rev2"]);
  368.             if($type(theWebUI.settings["webui."+ndx+".colorder"]))
  369.                 table.obj.colOrder = theWebUI.settings["webui."+ndx+".colorder"];
  370.             table.obj.onsort = function()
  371.             {
  372.                 if( (this.sIndex != theWebUI.settings["webui."+this.prefix+".sindex"]) ||
  373.                     (this.reverse != theWebUI.settings["webui."+this.prefix+".rev"]) ||
  374.                     (this.secIndex != theWebUI.settings["webui."+this.prefix+".sindex2"]) ||
  375.                     (this.secRev != theWebUI.settings["webui."+this.prefix+".rev2"]))
  376.                         theWebUI.save();
  377.             }
  378.         });
  379.         var table = this.getTable("fls");
  380.         table.oldFilesSortAlphaNumeric = table.sortAlphaNumeric;
  381.         table.sortAlphaNumeric = function(x, y)
  382.         {
  383.             if(!theWebUI.settings["webui.fls.view"] && theWebUI.dID)
  384.             {
  385.                     var dir = theWebUI.dirs[theWebUI.dID];
  386.                     var a = dir.dirs[dir.current][x.key];
  387.                     var b = dir.dirs[dir.current][y.key];
  388.                     if((a.data.name=="..") ||
  389.                    ((a.link!=null) && (b.link==null)))
  390.                     return(this.reverse ? 1 : -1);
  391.                 if((b.data.name=="..") ||
  392.                    ((b.link!=null) && (a.link==null)))
  393.                     return(this.reverse ? -1 : 1);
  394.             }
  395.             return(this.oldFilesSortAlphaNumeric(x,y));
  396.         }
  397.         table.oldFilesSortNumeric = table.sortNumeric;
  398.         table.sortNumeric = function(x, y)
  399.         {
  400.             if(!theWebUI.settings["webui.fls.view"] && theWebUI.dID)
  401.             {
  402.                     var dir = theWebUI.dirs[theWebUI.dID];
  403.                     var a = dir.dirs[dir.current][x.key];
  404.                     var b = dir.dirs[dir.current][y.key];
  405.                     if((a.data.name=="..") ||
  406.                    ((a.link!=null) && (b.link==null)))
  407.                     return(this.reverse ? 1 : -1);
  408.                 if((b.data.name=="..") ||
  409.                    ((b.link!=null) && (a.link==null)))
  410.                     return(this.reverse ? -1 : 1);
  411.             }
  412.             return(this.oldFilesSortNumeric(x,y));
  413.         }
  414.         this.speedGraph.create($("#Speed"));
  415.         if(!this.settings["webui.show_cats"])
  416.             $("#CatList").hide();
  417.         if(!this.settings["webui.show_dets"])
  418.         {
  419.             $("#tdetails").hide();
  420.             if(!theWebUI.systemInfo.rTorrent.started)
  421.                 this.toggleDetails();
  422.         }
  423.         theDialogManager.setEffects( iv(this.settings["webui.effects"])*200 );
  424. //      this.setStatusUpdate();
  425.         $.each(this.tables, function(ndx,table)
  426.         {
  427.             table.obj.create($$(table.container), table.columns, ndx);
  428.         });
  429.         table = this.getTable("plg");
  430.         if(table)
  431.         {
  432.             $.each( thePlugins.list, function(ndx,plugin)
  433.             {
  434.                 table.addRowById(
  435.                 {
  436.                     name: plugin.name,
  437.                     version: plugin.version,
  438.                     author: plugin.author,
  439.                     descr: plugin.descr,
  440.                     status: plugin.enabled ? 1 : 0,
  441.                     launch: plugin.launched ? (plugin.canBeLaunched() ? 1 : 2) : 0
  442.                 }, "_plg_"+plugin.name);
  443.             });
  444.         }
  445.         if(!theWebUI.systemInfo.rTorrent.started)
  446.             $(theWebUI.getTable("trt").scp).text(theUILang.noTorrentList).show();
  447.         $(".catpanel").each( function()
  448.         {
  449.             theWebUI.showPanel(this,!theWebUI.settings["webui.closed_panels"][this.id]);
  450.         });
  451.         this.configured = true;
  452.     },
  453.  
  454.     setStatusUpdate: function()
  455.     {
  456.         if(this.sTimer)
  457.         {
  458.             window.clearInterval(this.sTimer);
  459.             this.sTimer = null;
  460.         }
  461.         this.sTimer = window.setInterval(this.updateStatus, 1000);
  462.     },
  463.  
  464. //
  465. // plugins
  466. //
  467.  
  468.     showPluginsMenu: function()
  469.     {
  470.         theContextMenu.clear();
  471.         for( var item in thePlugins.topMenu )
  472.             thePlugins.get(thePlugins.topMenu[item].name).createPluginMenu();
  473.             var offs = $("#plugins").offset();
  474.         theContextMenu.show(offs.left-5,offs.top+5+$("#plugins").height());
  475.     },
  476.  
  477.     plgSelect: function(e, id)
  478.     {
  479.         if($type(id) && (e.which==3))
  480.         {
  481.                 theContextMenu.clear();
  482.                 if(this.getTable("plg").selCount > 1)
  483.                 {
  484.                 theContextMenu.add([theUILang.plgShutdown, "theWebUI.plgShutdown()"]);
  485.                 theContextMenu.add([CMENU_CHILD, theUILang.plgLaunch,
  486.                     [
  487.                         [theUILang.EnableTracker, "theWebUI.plgLaunch(true)"],
  488.                         [theUILang.DisableTracker, "theWebUI.plgLaunch(false)"]
  489.                     ]]);
  490.             }
  491.             else
  492.             {
  493.                 var plugin = thePlugins.get(id.substr(5));
  494.                 theContextMenu.add([theUILang.plgShutdown, (plugin.enabled && plugin.canShutdown()) ? "theWebUI.plgShutdown()" : null]);
  495.                 theContextMenu.add([CMENU_CHILD, theUILang.plgLaunch,
  496.                     [
  497.                         [theUILang.EnableTracker, !plugin.launched && plugin.canBeLaunched() ? "theWebUI.plgLaunch(true)" : null],
  498.                         [theUILang.DisableTracker, plugin.launched && plugin.canBeLaunched() ? "theWebUI.plgLaunch(false)" : null]
  499.                     ]]);
  500.                 if(plugin.help)
  501.                 {
  502.                     theContextMenu.add([CMENU_SEP]);
  503.                     theContextMenu.add([theUILang.Help, "window.open('"+plugin.help+"', '_blank')" ]); 
  504.                 }
  505.             }
  506.             theContextMenu.show();
  507.             return(true);
  508.         }
  509.         return(false);
  510.     },
  511.  
  512.     plgShutdown : function()
  513.     {
  514.         var table = this.getTable("plg");
  515.         var sr = table.rowSel;
  516.         var str = "";
  517.         for(var k in sr)
  518.         {
  519.                 if(sr[k])
  520.                 {
  521.                     var name = k.substr(5);
  522.                     var plugin = thePlugins.get(name);
  523.                         if(plugin.enabled && plugin.canShutdown())
  524.                             str += "&hash=" + name;
  525.                 }
  526.             }
  527.         if(str.length>0)
  528.                 this.request("?action=doneplugins&s=done" + str, [this.plgRefresh, this]);
  529.         },
  530.  
  531.     plgLaunch : function(enable)
  532.     {
  533.         var table = this.getTable("plg");
  534.         var sr = table.rowSel;
  535.         var str = "";
  536.         for(var k in sr)
  537.         {
  538.                 if(sr[k])
  539.                 {
  540.                     var name = k.substr(5);
  541.                     var plugin = thePlugins.get(name);
  542.                         if( (enable ^ plugin.launched) && plugin.canBeLaunched())
  543.                             str += "&hash=" + name;
  544.                 }
  545.             }
  546.         if(str.length>0)
  547.                 this.request("?action=doneplugins&s="+(enable ? "launch" : "unlaunch") + str, [this.plgRefresh, this]);
  548.         },
  549.  
  550.         plgRefresh : function()
  551.         {
  552.             table = this.getTable("plg");
  553.         $.each( thePlugins.list, function(ndx,plugin)
  554.         {
  555.             table.setValueById( "_plg_"+plugin.name, "status", plugin.enabled ? 1 : 0 );
  556.             table.setValueById( "_plg_"+plugin.name, "launch", plugin.launched ? (plugin.canBeLaunched() ? 1 : 2) : 0 );
  557.         });
  558.         },
  559.  
  560. //
  561. // settings
  562. //
  563.  
  564.     addSettings: function(newSettings)
  565.     {
  566.         $.each(newSettings, function(i,v)
  567.         {
  568.             switch(v)
  569.             {
  570.                 case "true":
  571.                 case "auto":
  572.                 case "on":
  573.                 {
  574.                     newSettings[i] = 1;
  575.                     break;
  576.                 }
  577.                 case "false":
  578.                 {
  579.                     newSettings[i] = 0;
  580.                     break;
  581.                 }
  582.                 }
  583.         });
  584.         newSettings["webui.lang"] = GetActiveLanguage();
  585.         $.extend(this.settings,newSettings);
  586.         this.loadSettings();
  587.     },
  588.  
  589.     loadSettings: function()
  590.     {
  591.         $.each(this.settings, function(i,v)
  592.         {
  593.                 var o = $$(i);
  594.             if(o)
  595.             {
  596.                 o = $(o);
  597.                 if(o.is("input:checkbox"))
  598.                     o.prop('checked',(v!=0));
  599.                 else
  600.                 {
  601.                     switch(i)
  602.                     {
  603.                             case "max_memory_usage":
  604.                                     v /= 1024;
  605.                         case "upload_rate":
  606.                         case "download_rate":
  607.                                     v /= 1024;
  608.                                 v = Math.ceil(v);
  609.                     }
  610.                     o.val(v);
  611.                 }
  612.                 o.change();
  613.             }
  614.         });
  615.         if($type(this.settings["webui.search"]))
  616.             theSearchEngines.set(this.settings["webui.search"],true);
  617.     },
  618.  
  619.     setSettings: function()
  620.     {
  621.             var req = '';
  622.             var needSave = false;
  623.         var needResize = false;
  624.         var reply = null;
  625.         $.each(this.settings, function(i,v)
  626.         {
  627.                 var o = $$(i);
  628.             if(o)
  629.             {
  630.                 o = $(o);
  631.                 var nv = o.is("input:checkbox") ? (o.prop('checked') ? 1 : 0) : o.val();
  632.                 switch(i)
  633.                 {
  634.                         case "max_memory_usage":
  635.                         nv *= 1024;
  636.                     case "upload_rate":
  637.                     case "download_rate":
  638.                         nv *= 1024;
  639.                 }
  640.                 if(nv!=v)
  641.                 {
  642.                     if((/^webui\./).test(i))
  643.                     {
  644.                         needSave = true;
  645.                         switch(i)
  646.                         {
  647.                                 case "webui.effects":
  648.                                 {
  649.                                 theDialogManager.setEffects( iv(nv)*200 );
  650.                                 break;
  651.                             }
  652.                             case "webui.alternate_color":
  653.                             {
  654.                                 $.each(theWebUI.tables, function(ndx,table)
  655.                                 {
  656.                                     table.obj.colorEvenRows = nv;
  657.                                         table.obj.refreshSelection();
  658.                                 });
  659.                                 break;
  660.                             }
  661.                             case "webui.show_cats":
  662.                             {
  663.                                 $("#CatList").toggle();
  664.                                 needResize = true;
  665.                                 break;
  666.                             }
  667.                             case "webui.show_dets":
  668.                             {
  669.                                 $("#tdetails").toggle();
  670.                                 needResize = true;
  671.                                 break;
  672.                             }
  673.                             case "webui.lang":
  674.                             {
  675.                                 SetActiveLanguage(nv);
  676.                                 reply = theWebUI.reload;
  677.                                 break;
  678.                             }
  679.                             case "webui.fullrows":
  680.                             {
  681.                                 $.each(theWebUI.tables, function(ndx,table)
  682.                                 {
  683.                                         table.obj.maxRows = iv(nv);
  684.                                         table.obj.refreshRows();
  685.                                 });
  686.                                 break;
  687.                             }
  688.                             case "webui.no_delaying_draw":
  689.                             {
  690.                                 $.each(theWebUI.tables, function(ndx,table)
  691.                                 {
  692.                                         table.obj.noDelayingDraw = iv(nv);
  693.                                 });
  694.                                 break;
  695.                             }
  696.                             case "webui.update_interval":
  697.                             {
  698.                                 theWebUI.settings["webui.update_interval"] = nv;
  699.                                 if(theWebUI.systemInfo.rTorrent.started)
  700.                                     theWebUI.resetInterval();
  701.                                 break;
  702.                             }
  703.                         }
  704.                     }
  705.                     else
  706.                     {
  707.                         var k_type = o.is("input:checkbox") || o.is("select") || o.hasClass("num") ? "n" : "s";
  708.                         req+=("&s="+k_type+i+"&v="+nv);
  709.                     }
  710.                     theWebUI.settings[i] = nv;
  711.                 }
  712.             }
  713.         });
  714.         if(needResize)
  715.             this.resize();
  716.         if((req.length>0) && theWebUI.systemInfo.rTorrent.started)
  717.                 this.request("?action=setsettings" + req,null,true);
  718.         if(needSave)
  719.             this.save(reply);
  720.     },
  721.  
  722.     reload: function()
  723.     {
  724.         window.location.reload();
  725.     },
  726.  
  727.     showSettings: function()
  728.     {
  729.         if($("#stg").is(":visible"))
  730.             theDialogManager.hide("stg");
  731.         else
  732.         {
  733.             if(this.systemInfo.rTorrent.started)
  734.                 this.request("?action=getsettings", [this.addAndShowSettings, this], true);
  735.             else
  736.                 this.addAndShowSettings();
  737.         }
  738.     },
  739.  
  740.     addAndShowSettings: function(data)
  741.     {
  742.             if(data)
  743.             this.addSettings(data);
  744.         theDialogManager.show("stg");
  745.     },
  746.  
  747.         save: function(reply)
  748.     {
  749.             if(!theWebUI.configured)
  750.             return;
  751.             $.each(theWebUI.tables, function(ndx,table)
  752.         {
  753.             var width = [];
  754.             var enabled = [];
  755.             for(i = 0; i < table.obj.cols; i++)
  756.             {
  757.                     width.push( table.obj.getColWidth(i) );
  758.                     enabled.push( table.obj.isColumnEnabled(i) );
  759.             }
  760.             theWebUI.settings["webui."+ndx+".colwidth"] = width;
  761.             theWebUI.settings["webui."+ndx+".colenabled"] = enabled;
  762.             theWebUI.settings["webui."+ndx+".colorder"] = table.obj.colOrder;
  763.             theWebUI.settings["webui."+ndx+".sindex"] = table.obj.sIndex;
  764.             theWebUI.settings["webui."+ndx+".rev"] = table.obj.reverse;
  765.             theWebUI.settings["webui."+ndx+".sindex2"] = table.obj.secIndex;
  766.             theWebUI.settings["webui."+ndx+".rev2"] = table.obj.secRev;
  767.         });
  768.             var cookie = {};
  769.             theWebUI.settings["webui.search"] = theSearchEngines.current;
  770.             $.each(theWebUI.settings, function(i,v)
  771.         {
  772.             if((/^webui\./).test(i))
  773.                 cookie[i] = v;
  774.         });
  775.         theWebUI.request("?action=setuisettings&v=" + json_encode(cookie),reply);
  776.     },
  777.  
  778. //
  779. // peers
  780. //
  781.  
  782.     updatePeers: function()
  783.     {
  784.         if(this.activeView=='PeerList')
  785.         {
  786.             if(this.dID != "")
  787.                 this.request("?action=getpeers&hash="+this.dID,[this.addPeers, this]);
  788.             else
  789.                 this.clearPeers();
  790.         }
  791.     },
  792.  
  793.     clearPeers: function()
  794.     {
  795.         this.getTable("prs").clearRows();
  796.         for(var k in this.peers)
  797.                 delete this.peers[k];
  798.         this.peers = {};
  799.     },
  800.  
  801.     addPeers: function(data)
  802.     {
  803.         var table = this.getTable("prs");
  804.         $.extend(this.peers,data);
  805.         $.each(data,function(id,peer)
  806.         {
  807.             if(!$type(table.rowdata[id]))
  808.                 table.addRowById(peer, id, peer.icon, peer.attr);
  809.                 else
  810.             {
  811.                 for(var i in peer)
  812.                             table.setValueById(id, i, peer[i]);
  813.                 table.setIcon(id,peer.icon);
  814.                 table.setAttr(id,peer.attr);
  815.             }
  816.             peer._updated = true;
  817.         });
  818.         for(var k in this.peers)
  819.         {
  820.             if(!this.peers[k]._updated)
  821.             {
  822.                     delete this.peers[k];
  823.                     table.removeRow(k);
  824.                 }
  825.             else
  826.                 this.peers[k]._updated = false;
  827.         }
  828.         table.Sort();
  829.     },
  830.  
  831.     prsSelect: function(e, id)
  832.     {
  833.         if($type(id) && theWebUI.createPeerMenu(e, id))
  834.             theContextMenu.show();
  835.     },
  836.  
  837.     getPeerIds: function(cmd)
  838.     {
  839.         var sr = this.getTable("prs").rowSel;
  840.         var str = "";
  841.         for(var k in sr)
  842.         {
  843.             var enabled = ((cmd=='unsnub') && this.peers[k].snubbed) ||
  844.                 ((cmd=='snub') && !this.peers[k].snubbed) || ((cmd=='ban') || (cmd=='kick'));
  845.                 if((sr[k] == true) && enabled)
  846.                 str += "&f=" + k;
  847.             }
  848.         return(str);
  849.     },
  850.  
  851.     addNewPeer: function()
  852.     {
  853.         this.request("?action=addpeer&hash="+this.dID+"&f="+encodeURIComponent($("#peerIP").val()), [this.updatePeers,this]);
  854.     },
  855.  
  856.     setPeerState: function(cmd)
  857.     {
  858.         var prs = this.getPeerIds(cmd);
  859.         if(prs.length)
  860.             this.request("?action="+cmd+"&hash="+this.dID+prs, [this.updatePeers,this]);
  861.     },
  862.  
  863.     createPeerMenu : function(e, id)
  864.     {
  865.         if(e.which!=3)
  866.                 return(false);
  867.         theContextMenu.clear();
  868.         theContextMenu.add([theUILang.peerAdd,
  869.             (this.dID &&
  870.                 $type(this.torrents[this.dID]) &&
  871.                 (this.torrents[this.dID].private==0) &&
  872.                 this.isTorrentCommandEnabled('addpeer',this.dID) &&
  873.                 (theWebUI.systemInfo.rTorrent.iVersion>=0x804)) ?
  874.             "theDialogManager.show('padd')" : null]);
  875.         if(theWebUI.systemInfo.rTorrent.iVersion>=0x807)
  876.         {
  877.             theContextMenu.add([theUILang.peerBan, this.isTorrentCommandEnabled('ban',this.dID) ? "theWebUI.setPeerState('ban')" : null]);
  878.             theContextMenu.add([theUILang.peerKick, this.isTorrentCommandEnabled('kick',this.dID) ? "theWebUI.setPeerState('kick')" : null]);
  879.             if(this.getTable("prs").selCount > 1)
  880.             {
  881.                 theContextMenu.add([theUILang.peerSnub, this.isTorrentCommandEnabled('snub',this.dID) ? "theWebUI.setPeerState('snub')" : null]);
  882.                 theContextMenu.add([theUILang.peerUnsnub, this.isTorrentCommandEnabled('unsnub',this.dID) ? "theWebUI.setPeerState('unsnub')" : null]);
  883.             }
  884.             else
  885.                     {
  886.                     if(!this.peers[id].snubbed)
  887.                         theContextMenu.add([theUILang.peerSnub, this.isTorrentCommandEnabled('snub',this.dID) ? "theWebUI.setPeerState('snub')" : null]);
  888.                 else
  889.                     theContextMenu.add([theUILang.peerUnsnub, this.isTorrentCommandEnabled('unsnub',this.dID) ? "theWebUI.setPeerState('unsnub')" : null]);
  890.                 }
  891.         }
  892.                 theContextMenu.add([CMENU_SEP]);
  893.         theContextMenu.add([theUILang.peerDetails, (this.getTable("prs").selCount > 1) ? null : "theWebUI.getTable('prs').ondblclick({ id: '"+id+"'})"]);
  894.         return(true);
  895.     },
  896.  
  897. //
  898. // trackers
  899. //
  900.  
  901.     trkIsPrivate: function(url)
  902.     {
  903.         return(
  904.             (/(http|https|udp):\/\/[a-z0-9-\.]+\.[a-z]{2,4}((:(\d){2,5})|).*\/an.*\?.+=.+/i).test(url) ||
  905.             (/(http|https|udp):\/\/[a-z0-9-\.]+\.[a-z]{2,4}((:(\d){2,5})|)\/.*[0-9a-z]{8,32}\/an/i).test(url) ? 1 : 0 );
  906.     },
  907.  
  908.     trkSelect: function(e, id)
  909.     {
  910.         if($type(id))
  911.         {
  912.             var arr = id.split('_t_');
  913.             var ind = iv(arr[1]);
  914.             if(theWebUI.createTrackerMenu(e, ind))
  915.                 theContextMenu.show();
  916.         }
  917.     },
  918.  
  919.     getTrackers: function(hash)
  920.     {
  921.             this.request("?action=gettrackers&hash=" + hash, [this.addTrackers, this]);
  922.     },
  923.  
  924.     getAllTrackers: function(arr)
  925.     {
  926.         var req = "?action=getalltrackers";
  927.         for(var i=0; i<arr.length; i++)
  928.             req+=("&hash=" + arr[i]);
  929.         if(arr.length) 
  930.                 this.request(req, [this.addTrackers, this]);
  931.     },
  932.  
  933.     addTrackers: function(data)
  934.     {
  935.         var table = this.getTable("trk");
  936.         $.each(data,function(hash,trk)
  937.         {
  938.             for(var i = 0; i < trk.length; i++)        
  939.             {
  940.                 trk[i].private = theWebUI.trkIsPrivate(trk[i].name);
  941.                 if(theWebUI.dID == hash)
  942.                 {
  943.                     var sId = hash + "_t_" + i;
  944.                         if(!$type(table.rowdata[sId]) )
  945.                                 table.addRowById(trk[i], sId, trk[i].icon, trk[i].attr);
  946.                         else
  947.                         {
  948.                                 for(var j in trk[i])
  949.                                     table.setValueById(sId, j, trk[i][j]);
  950.                         table.setIcon(sId,trk[i].icon);
  951.                         table.setAttr(sId,trk[i].attr);
  952.                             }
  953.                     trk[i]._updated = true;
  954.                         $('#'+sId+" > .stable-TrackerList-col-0").css( "font-weight",
  955.                             ($type(theWebUI.torrents[hash]) && (i==theWebUI.torrents[hash].tracker_focus)) ? "bold" : "normal" );
  956.                     }
  957.             }
  958.         });
  959.         $.extend(this.trackers,data);
  960.         var rowIDs = table.rowIDs.slice(0);
  961.         for(var i in rowIDs)
  962.         {
  963.             var arr = rowIDs[i].split('_t_');
  964.             var hash = arr[0];
  965.             if(this.dID != hash)
  966.                     table.removeRow(rowIDs[i]);
  967.                 else
  968.                 {
  969.                     var no = arr[1];
  970.                 if(!$type(this.trackers[hash][no]))
  971.                         table.removeRow(rowIDs[i]);
  972.                 else
  973.                     if(!this.trackers[hash][no]._updated)
  974.                     {
  975.                         table.removeRow(rowIDs[i]);
  976.                         delete this.trackers[hash][no];
  977.                         this.trackers[hash].splice(no,1);
  978.                 }
  979.                     else
  980.                         this.trackers[hash][no]._updated = false;
  981.             }
  982.             }
  983.         table.Sort();
  984.             this.updateDetails();
  985.     },
  986.  
  987.     createTrackerMenu : function(e, ind)
  988.     {
  989.         if(e.which!=3)
  990.                 return(false);
  991.         theContextMenu.clear();
  992.         if(this.getTable("trk").selCount > 1)
  993.         {
  994.                 theContextMenu.add([theUILang.EnableTracker, this.isTorrentCommandEnabled('trkstate',this.dID) ? "theWebUI.setTrackerState('" + this.dID + "',1)" : null]);
  995.                 theContextMenu.add([theUILang.DisableTracker, this.isTorrentCommandEnabled('trkstate',this.dID) ? "theWebUI.setTrackerState('" + this.dID + "',0)" : null]);
  996.             }
  997.         else
  998.         {
  999.                 if(this.trackers[this.dID][ind].enabled == 0)
  1000.                 {
  1001.                     theContextMenu.add([theUILang.EnableTracker, this.isTorrentCommandEnabled('trkstate',this.dID) ? "theWebUI.setTrackerState('" + this.dID + "',1)" : null]);
  1002.                     theContextMenu.add([theUILang.DisableTracker]);
  1003.                 }
  1004.                 else
  1005.                 {
  1006.                     theContextMenu.add([theUILang.EnableTracker]);
  1007.                     theContextMenu.add([theUILang.DisableTracker, this.isTorrentCommandEnabled('trkstate',this.dID) ? "theWebUI.setTrackerState('" + this.dID + "',0)" : null]);
  1008.                 }
  1009.             }
  1010.         if(theWebUI.systemInfo.rTorrent.iVersion>=0x809)
  1011.         {
  1012.             theContextMenu.add([CMENU_SEP]);
  1013.             theContextMenu.add([theUILang.updateTracker, this.isTorrentCommandEnabled("updateTracker",this.dID) ? "theWebUI.updateTracker()" : null]);
  1014.         }
  1015.         return(true);
  1016.     },
  1017.  
  1018.     setTrackerState: function(id, swtch)
  1019.     {
  1020.         var trk = this.getTrackerIds(id, swtch);
  1021.         this.request("?action=settrackerstate&hash=" + id + "&p=" + swtch + trk);
  1022.     },
  1023.  
  1024.     getTrackerIds: function(id, swtch)
  1025.     {
  1026.         var table = this.getTable("trk");
  1027.         var sr = table.rowSel;
  1028.         var str = "";
  1029.         var needSort = false;
  1030.         for(var k in sr)
  1031.         {
  1032.                 if(sr[k])
  1033.                 {
  1034.                 var arr = k.split('_t_');
  1035.                     var i = iv(arr[1]);
  1036.                     if(this.trackers[id][i].enabled != swtch)
  1037.                     {
  1038.                             str += "&f=" + i;
  1039.                             this.trackers[id][i].enabled = swtch;
  1040.                             needSort = true;
  1041.                             table.setValueById(id + "_t_" + i, "enabled", swtch);
  1042.                         }
  1043.                 }
  1044.             }
  1045.             if(needSort)
  1046.             table.Sort();
  1047.         return(str);
  1048.     },
  1049.  
  1050. //
  1051. // files
  1052. //
  1053.  
  1054.     updateFiles: function(hash)
  1055.     {
  1056.             if(this.dID == hash)
  1057.             {
  1058.                 this.getFiles(hash, true);
  1059.                 this.updateDetails();
  1060.         }
  1061.     },
  1062.  
  1063.     redrawFiles: function(hash)
  1064.     {
  1065.         if(this.dID == hash)
  1066.             {
  1067.                 var table = this.getTable("fls");
  1068.                 for(var i in this.files[hash])
  1069.                 {
  1070.                     var sId = hash + "_f_" + i;
  1071.                     var file = this.files[hash][i];
  1072.                     file.percent = (file.size > 0) ? theConverter.round((file.done/file.size)*100,1): "100.0";
  1073.                     if(this.settings["webui.fls.view"])
  1074.                     {
  1075.                     if(!$type(table.rowdata[sId]))
  1076.                                 table.addRowById(file, sId, file.icon, file.attr);
  1077.                             else
  1078.                             {
  1079.                                 for(var j in file)
  1080.                                     table.setValueById(sId, j, file[j]);
  1081.                         table.setIcon(sId,file.icon);
  1082.                         table.setAttr(sId,file.attr);
  1083.                     }
  1084.                 }
  1085.                 else
  1086.                 {
  1087.                     if(!$type(this.dirs[hash]))
  1088.                         this.dirs[hash] = new rDirectory();
  1089.                     this.dirs[hash].addFile(file, i);
  1090.                 }
  1091.             }
  1092.             if(!this.settings["webui.fls.view"] && this.dirs[hash])
  1093.             {
  1094.                 var dir = this.dirs[hash].getDirectory();
  1095.                 for(var i in dir)
  1096.                 {
  1097.                     var entry = dir[i];
  1098.                     if(entry.link!=null)
  1099.                     {
  1100.                         if(!$type(table.rowdata[i]))
  1101.                                 table.addRowById(entry.data, i, entry.icon, {link : entry.link});
  1102.                         else
  1103.                                     for(var j in entry.data)
  1104.                                         table.setValueById(i, j, entry.data[j]);
  1105.                     }
  1106.                 }
  1107.                 for(var i in dir)
  1108.                 {
  1109.                     var entry = dir[i];
  1110.                     if(entry.link==null)
  1111.                     {
  1112.                         if(!$type(table.rowdata[i]))
  1113.                                 table.addRowById(entry.data, i, entry.icon, {link : null});
  1114.                         else
  1115.                                     for(var j in entry.data)
  1116.                                         table.setValueById(i, j, entry.data[j]);
  1117.                     }
  1118.                 }
  1119.             }
  1120.             table.Sort();
  1121.             }
  1122.     },
  1123.  
  1124.     getFiles: function(hash, isUpdate)
  1125.     {
  1126.         var table = this.getTable("fls");
  1127.         if(!isUpdate)
  1128.         {
  1129.                 table.dBody.scrollTop = 0;
  1130.                 $(table.tpad).height(0);
  1131.                 $(table.bpad).height(0);
  1132.                 table.clearRows();
  1133.             }
  1134.         if($type(this.files[hash]) && !isUpdate)
  1135.                 this.redrawFiles(hash);
  1136.         else
  1137.         {
  1138.                 if(!$type(this.files[hash]))
  1139.                     this.files[hash] = new Array(0);
  1140.                 this.request("?action=getfiles&hash=" + hash, [this.addFiles, this]);
  1141.             }
  1142.     },
  1143.  
  1144.     addFiles: function(data)
  1145.     {
  1146.         $.extend(this.files,data);
  1147.         for( var hash in data )
  1148.                 this.redrawFiles(hash);
  1149.     },
  1150.  
  1151.     flsSelect: function(e, id)
  1152.     {
  1153.         if($type(id))
  1154.         {
  1155.             var p = null;
  1156.             if(theWebUI.settings["webui.fls.view"])
  1157.             {
  1158.                 var arr = id.split('_f_');
  1159.                 p = theWebUI.files[theWebUI.dID][iv(arr[1])];
  1160.             }
  1161.             else
  1162.                 p = theWebUI.dirs[theWebUI.dID].getEntry(id);
  1163.             if(theWebUI.createFileMenu(e, p))
  1164.                 theContextMenu.show();
  1165.         }
  1166.     },
  1167.  
  1168.     createFileMenu: function(e, p)
  1169.     {
  1170.         if(e.which!=3)
  1171.                 return(false);
  1172.         var id = this.dID;
  1173.         theContextMenu.clear();
  1174.         var _bf = [];
  1175.         var table = this.getTable("fls");
  1176.         if(table.selCount > 1)
  1177.         {
  1178.                 _bf.push([theUILang.High_priority, "theWebUI.setPriority('" + id + "',2)"]);
  1179.             _bf.push([theUILang.Normal_priority, "theWebUI.setPriority('" + id + "',1)"]);
  1180.             _bf.push([CMENU_SEP]);
  1181.             _bf.push([theUILang.Dont_download, "theWebUI.setPriority('" + id + "',0)"]);
  1182.         }
  1183.         else
  1184.             if(p!=null)
  1185.             {
  1186.                     _bf.push([theUILang.High_priority, (p.priority == 2) ? null : "theWebUI.setPriority('" + id + "',2)"]);
  1187.                     _bf.push([theUILang.Normal_priority, (p.priority == 1) ? null : "theWebUI.setPriority('" + id + "',1)"]);
  1188.                     _bf.push([CMENU_SEP]);
  1189.                     _bf.push([theUILang.Dont_download, (p.priority == 0) ? null : "theWebUI.setPriority('" + id + "',0)"]);
  1190.                 }
  1191.             if(_bf.length && this.isTorrentCommandEnabled('setprio',this.dID) )
  1192.                 theContextMenu.add([CMENU_CHILD, theUILang.Priority, _bf]);
  1193.         else
  1194.             theContextMenu.add([theUILang.Priority]);
  1195.  
  1196.         if(theWebUI.systemInfo.rTorrent.iVersion>=0x809)
  1197.         {
  1198.             _bf = [];
  1199.             if(table.selCount > 1)
  1200.             {
  1201.                 _bf.push([theUILang.prioritizeNormal, "theWebUI.setPrioritize('" + id + "',0)"]);
  1202.                 _bf.push([CMENU_SEP]);
  1203.                     _bf.push([theUILang.prioritizeFirst, "theWebUI.setPrioritize('" + id + "',1)"]);
  1204.                 _bf.push([theUILang.prioritizeLast, "theWebUI.setPrioritize('" + id + "',2)"]);
  1205.             }
  1206.             else
  1207.                 if(p!=null)
  1208.                 {
  1209.                     _bf.push([theUILang.prioritizeNormal, !p.prioritize ? null : "theWebUI.setPrioritize('" + id + "',0)"]);
  1210.                     _bf.push([CMENU_SEP]);
  1211.                         _bf.push([theUILang.prioritizeFirst, (p.prioritize == 1) ? null : "theWebUI.setPrioritize('" + id + "',1)"]);
  1212.                     _bf.push([theUILang.prioritizeLast, (p.prioritize == 2) ? null : "theWebUI.setPrioritize('" + id + "',2)"]);
  1213.                     }
  1214.                 if(_bf.length && this.isTorrentCommandEnabled('setprioritize',this.dID) )
  1215.                     theContextMenu.add([CMENU_CHILD, theUILang.DLStrategy, _bf]);
  1216.             else
  1217.                 theContextMenu.add([theUILang.DLStrategy]);
  1218.         }
  1219.         var _bf1 = [];
  1220.         if(this.settings["webui.fls.view"])
  1221.         {
  1222.             _bf1.push([theUILang.AsList]);
  1223.             _bf1.push([theUILang.AsTree, "theWebUI.toggleFileView()"]);
  1224.         }
  1225.         else
  1226.         {
  1227.             _bf1.push([theUILang.AsList, "theWebUI.toggleFileView()"]);
  1228.             _bf1.push([theUILang.AsTree]);
  1229.         }
  1230.         theContextMenu.add([CMENU_CHILD, theUILang.View, _bf1]);
  1231.         return(true);
  1232.     },
  1233.  
  1234.     toggleFileView: function()
  1235.     {
  1236.         this.settings["webui.fls.view"] = !this.settings["webui.fls.view"];
  1237.         this.getTable("fls").clearRows();
  1238.         if(this.dID!="")
  1239.             this.redrawFiles(this.dID);
  1240.         this.save();
  1241.     },
  1242.  
  1243.     getFileIds: function(id, p, property)
  1244.     {
  1245.         var sr = this.getTable("fls").rowSel;
  1246.         var str = "";
  1247.         var needSort = false;
  1248.         for(var k in sr)
  1249.         {
  1250.                 if(sr[k] == true)
  1251.                 {
  1252.                     if(this.settings["webui.fls.view"])
  1253.                     {
  1254.                     var arr = k.split('_f_');
  1255.                         var i = iv(arr[1]);
  1256.                         if(!property || (this.files[id][i][property] != p))
  1257.                         {
  1258.                         str += "&f=" + i;
  1259.                                 needSort = true;
  1260.                             }
  1261.                     }
  1262.                     else
  1263.                     {
  1264.                         var dir = theWebUI.dirs[id];
  1265.                         var ids = new Array();
  1266.                         dir.getFilesIds(ids,dir.current,k,p);
  1267.                         for(var i in ids)
  1268.                         str += "&f=" + ids[i];
  1269.                     needSort = true;
  1270.                     }
  1271.                 }
  1272.             }
  1273.             if(needSort)
  1274.             this.getTable("fls").Sort();
  1275.         return(str);
  1276.     },
  1277.  
  1278.     setPriority: function(id, p)
  1279.     {
  1280.         var fls = this.getFileIds(id, p, "priority");
  1281.         this.request("?action=setprio&hash=" + id + "&p=" + p + fls, [this.updateFiles, this]);
  1282.     },
  1283.  
  1284.     setPrioritize: function(id, p)
  1285.     {
  1286.         var fls = this.getFileIds(id, p, null);
  1287.         this.request("?action=setprioritize&hash=" + id + "&p=" + p + fls, [this.updateFiles, this]);
  1288.     },
  1289.  
  1290. //
  1291. // torrents
  1292. //
  1293.  
  1294.     trtSelect: function(e, id)
  1295.     {
  1296.         var table = theWebUI.getTable("trt");
  1297.             var hash = table.getFirstSelected();
  1298.         if((table.selCount==1) && hash)
  1299.             theWebUI.showDetails(hash, true);
  1300.         else
  1301.         {
  1302.             theWebUI.dID = "";
  1303.             theWebUI.clearDetails();
  1304.         }
  1305.         if(e.which==3)
  1306.         {
  1307.                 theWebUI.createMenu(e, id);
  1308.             theContextMenu.show(e.clientX,e.clientY);
  1309.             }
  1310.     },
  1311.  
  1312.     createMenu: function(e, id)
  1313.     {
  1314.         var table = this.getTable("trt");
  1315.         theContextMenu.clear();
  1316.         if(table.selCount > 1)
  1317.         {
  1318.                 theContextMenu.add([theUILang.Start, "theWebUI.start()"]);
  1319.                 theContextMenu.add([theUILang.Pause, "theWebUI.pause()"]);
  1320.                 theContextMenu.add([theUILang.Stop, "theWebUI.stop()"]);
  1321.                 theContextMenu.add([theUILang.Force_recheck, "theWebUI.recheck()"]);
  1322.             theContextMenu.add([theUILang.peerAdd]);
  1323.         }
  1324.         else
  1325.         {
  1326.             theContextMenu.add([theUILang.Start, this.isTorrentCommandEnabled("start",id) ? "theWebUI.start()" : null]);
  1327.             theContextMenu.add([theUILang.Pause, (this.isTorrentCommandEnabled("pause",id) || this.isTorrentCommandEnabled("unpause",id)) ? "theWebUI.pause()" : null]);
  1328.             theContextMenu.add([theUILang.Stop, this.isTorrentCommandEnabled("stop",id) ? "theWebUI.stop()" : null]);
  1329.             theContextMenu.add([theUILang.Force_recheck, this.isTorrentCommandEnabled("recheck",id) ? "theWebUI.recheck()" : null]);
  1330.             theContextMenu.add([theUILang.peerAdd,
  1331.                 (!this.isTorrentCommandEnabled("start",id) &&
  1332.                 this.isTorrentCommandEnabled("addpeer",id) &&
  1333.                 $type(this.torrents[id]) &&
  1334.                 (this.torrents[id].private==0) && (theWebUI.systemInfo.rTorrent.iVersion>=0x804)) ?
  1335.                 "theDialogManager.show('padd')" : null]);
  1336.         }
  1337.         if(theWebUI.systemInfo.rTorrent.iVersion>=0x809)
  1338.             theContextMenu.add([theUILang.updateTracker, this.isTorrentCommandEnabled("updateTracker",id) ? "theWebUI.updateTracker()" : null]);
  1339.         theContextMenu.add([CMENU_SEP]);
  1340.         var _bf = [];
  1341.         for(var lbl in this.cLabels)
  1342.         {
  1343.                 if((table.selCount == 1) && (this.torrents[id].label == lbl))
  1344.                     _bf.push([CMENU_SEL, lbl+" "]);
  1345.                 else
  1346.                     _bf.push([lbl+" ", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes(lbl) + "')" : null]);
  1347.             }
  1348. /* CUSTOM LABEL FUNCTIONALITY */
  1349.                 if(this.cLabels["1080p"] == undefined) {
  1350.                         _bf.push(["1080p (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("1080p") + "')" : null]);
  1351.                 }
  1352.                 if(this.cLabels["DELETE"] == undefined) {
  1353.                         _bf.push(["DELETE (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("DELETE") + "')" : null]);
  1354.                 }
  1355.                 if(this.cLabels["ALERT"] == undefined) {
  1356.                         _bf.push(["ALERT (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("ALERT") + "')" : null]);
  1357.                 }
  1358.                 if(this.cLabels["KEEP"] == undefined) {
  1359.                         _bf.push(["KEEP (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("KEEP") + "')" : null]);
  1360.                 }
  1361.                 if(this.cLabels["TVCHAOS"] == undefined) {
  1362.                         _bf.push(["TVCHAOS (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("TVCHAOS") + "')" : null]);
  1363.                 }
  1364.                 if(this.cLabels["DONE"] == undefined) {
  1365.                         _bf.push(["DONE (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("DONE") + "')" : null]);
  1366.                 }
  1367.                 if(this.cLabels["DONE KEEP"] == undefined) {
  1368.                         _bf.push(["DONE KEEP (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("DONE KEEP") + "')" : null]);
  1369.                 }
  1370.                 if(this.cLabels["DONE TV"] == undefined) {
  1371.                         _bf.push(["DONE TV (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("DONE TV") + "')" : null]);
  1372.                 }
  1373.                 if(this.cLabels["DONE TUTS"] == undefined) {
  1374.                         _bf.push(["DONE TUTS (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("DONE TUTS") + "')" : null]);
  1375.                 }
  1376.                 if(this.cLabels["DONE Non Scene"] == undefined) {
  1377.                         _bf.push(["DONE SCENE (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("DONE SCENE") + "')" : null]);
  1378.                 }
  1379.                 if(this.cLabels["MOVIES-X264 Scene"] == undefined) {
  1380.                         _bf.push(["MOVIES-X264 Scene (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("MOVIES-X264 Scene") + "')" : null]);
  1381.                 }
  1382.                 if(this.cLabels["Movies-XViD Scene"] == undefined) {
  1383.                         _bf.push(["Movies-XViD Scene (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("Movies-XViD Scene") + "')" : null]);
  1384.                 }
  1385.                 if(this.cLabels["Movies-DVD-R Scene"] == undefined) {
  1386.                         _bf.push(["Movies-DVD-R Scene (sticky)", (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.setLabel('" + addslashes("Movies-DVD-R Scene") + "')" : null]);
  1387.                 }
  1388. /* CUSTOM LABEL FUNCTIONALITY END*/
  1389.             if(_bf.length>0)
  1390.             _bf.push([CMENU_SEP]);
  1391.         _bf.push([theUILang.New_label, (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.newLabel()" : null]);
  1392.         _bf.push([theUILang.Remove_label, (table.selCount > 1) || this.isTorrentCommandEnabled("setlabel",id) ? "theWebUI.removeLabel()" : null]);
  1393.         theContextMenu.add([CMENU_CHILD, theUILang.Labels, _bf]);
  1394.         theContextMenu.add([CMENU_SEP]);
  1395.         var _c0 = [];
  1396.         if(table.selCount > 1)
  1397.         {
  1398.             _c0.push([theUILang.High_priority, "theWebUI.perform('dsetprio&v=3')"]);
  1399.             _c0.push([theUILang.Normal_priority, "theWebUI.perform('dsetprio&v=2')"]);
  1400.             _c0.push([theUILang.Low_priority,  "theWebUI.perform('dsetprio&v=1')"]);
  1401.             _c0.push([theUILang.Dont_download,  "theWebUI.perform('dsetprio&v=0')"]);
  1402.         }
  1403.         else
  1404.         {
  1405.             var p = this.torrents[id].priority;
  1406.             _c0.push([theUILang.High_priority, (p==3) || !this.isTorrentCommandEnabled("dsetprio",id) ? null : "theWebUI.perform('dsetprio&v=3')"]);
  1407.             _c0.push([theUILang.Normal_priority, (p==2 || !this.isTorrentCommandEnabled("dsetprio",id)) ? null : "theWebUI.perform('dsetprio&v=2')"]);
  1408.             _c0.push([theUILang.Low_priority,  (p==1) || !this.isTorrentCommandEnabled("dsetprio",id) ? null : "theWebUI.perform('dsetprio&v=1')"]);
  1409.             _c0.push([theUILang.Dont_download, (p==0) || !this.isTorrentCommandEnabled("dsetprio",id) ? null : "theWebUI.perform('dsetprio&v=0')"]);
  1410.         }
  1411.         theContextMenu.add([CMENU_CHILD, theUILang.Priority, _c0]);
  1412.         theContextMenu.add([CMENU_SEP]);
  1413.         theContextMenu.add([theUILang.Remove, (table.selCount > 1) || this.isTorrentCommandEnabled("remove",id) ? "theWebUI.remove()" : null]);
  1414.         theContextMenu.add([CMENU_SEP]);
  1415.         theContextMenu.add([theUILang.Details, "theWebUI.showDetails('" + id + "')"]);
  1416.         if((table.selCount > 1) || !this.isTorrentCommandEnabled("setprops",id))
  1417.                 theContextMenu.add([theUILang.Properties]);
  1418.         else
  1419.                 theContextMenu.add([theUILang.Properties, "theWebUI.showProperties('" + id + "')"]);
  1420.     },
  1421.  
  1422.     perform: function(cmd)
  1423.     {
  1424.         if(cmd == "pause")
  1425.         {
  1426.             var hp = this.getHashes("unpause");
  1427.             if(hp != "")
  1428.                 this.request("?action=unpause" + hp);
  1429.         }
  1430.         var h = this.getHashes(cmd);
  1431.         if(h != "")
  1432.         {
  1433.             if((cmd.indexOf("remove")==0) && (h.indexOf(this.dID) >- 1))
  1434.             {
  1435.                 this.dID = "";
  1436.                 this.clearDetails();
  1437.             }
  1438.             this.getTorrents(cmd + h + "&list=1");
  1439.         }
  1440.     },
  1441.  
  1442.     isTorrentCommandEnabled: function(act,hash)
  1443.     {
  1444.         var ret = true;
  1445.         var status = this.torrents[hash].state;
  1446.         switch(act)
  1447.         {
  1448.             case "start" :
  1449.             {
  1450.                 ret = (!(status & dStatus.started) || (status & dStatus.paused) && !(status & dStatus.checking) && !(status & dStatus.hashing));
  1451.                 break;
  1452.             }
  1453.             case "pause" :
  1454.             {
  1455.                 ret = ((status & dStatus.started) && !(status & dStatus.paused) && !(status & dStatus.checking) && !(status & dStatus.hashing));
  1456.                 break;
  1457.             }
  1458.             case "unpause" :
  1459.             {
  1460.                 ret = ((status & dStatus.paused) && !(status & dStatus.checking) && !(status & dStatus.hashing));
  1461.                 break;
  1462.             }
  1463.             case "stop" :
  1464.             {
  1465.                 ret = ((status & dStatus.started) || (status & dStatus.hashing) || (status & dStatus.checking));
  1466.                 break;
  1467.             }
  1468.             case "recheck" :
  1469.             {
  1470.                 ret = !(status & dStatus.checking) && !(status & dStatus.hashing);
  1471.                 break;
  1472.             }
  1473.         }
  1474.         return(ret);
  1475.     },
  1476.  
  1477.     getHashes: function(act)
  1478.     {
  1479.         var h = "";
  1480.         var pos = act.indexOf('&');
  1481.         if(pos>=0)
  1482.             act = act.substring(0,pos);
  1483.         var sr = this.getTable("trt").rowSel;
  1484.         for(var k in sr)
  1485.             if((sr[k] == true) && this.isTorrentCommandEnabled(act,k))
  1486.                 h += "&hash=" + k;
  1487.         return(h);
  1488.     },
  1489.  
  1490.     start: function()
  1491.     {  
  1492.         this.perform("start");
  1493.     },
  1494.  
  1495.     pause: function()
  1496.     {  
  1497.         this.perform("pause");
  1498.     },
  1499.  
  1500.     stop: function()
  1501.     {  
  1502.         this.perform("stop");
  1503.     },
  1504.  
  1505.     updateTracker: function()
  1506.     {  
  1507.         this.perform("updateTracker");
  1508.     },
  1509.  
  1510.     remove: function()
  1511.     {
  1512.         var table = this.getTable("trt");
  1513.         if((table.selCount>1) ||
  1514.             ((table.selCount==1) && this.isTorrentCommandEnabled("remove",table.getFirstSelected())))
  1515.         {
  1516.             if(this.settings["webui.confirm_when_deleting"])
  1517.             {
  1518.                 this.delmode = "remove";
  1519.                 askYesNo( theUILang.Remove_torrents, theUILang.Rem_torrents_prompt, "theWebUI.doRemove()" );
  1520.                 }
  1521.             else
  1522.                 this.perform("remove");
  1523.         }
  1524.     },
  1525.  
  1526.     doRemove: function()
  1527.     {  
  1528.         this.perform(this.delmode);
  1529.     },
  1530.  
  1531.     recheck: function()
  1532.     {  
  1533.         this.perform("recheck");
  1534.     },
  1535.  
  1536.     getTorrents: function(qs)
  1537.     {  
  1538.         if(this.updTimer)
  1539.             window.clearTimeout(this.updTimer);
  1540.         this.timer.start();
  1541.         if(qs != "list=1")
  1542.             qs = "action=" + qs;
  1543.         this.requestWithTimeout("?" + qs + "&getmsg=1", [this.addTorrents, this],
  1544.             function()
  1545.             {    
  1546.                 theWebUI.timeout();
  1547.                 theWebUI.setInterval();
  1548.             },
  1549.             function(status,text)
  1550.             {    
  1551.                 theWebUI.systemInfo.rTorrent.started = false;
  1552.                 theWebUI.error(status,text);
  1553.                 if(theWebUI.settings["webui.retry_on_error"]!=0)
  1554.                     theWebUI.setInterval( iv(theWebUI.settings["webui.retry_on_error"])*1000 );
  1555.             });
  1556.     },
  1557.  
  1558.     fillAdditionalTorrentsCols: function(hash,cols)
  1559.     {
  1560.         return(cols);
  1561.     },
  1562.  
  1563.     updateAdditionalTorrentsCols: function(hash)
  1564.     {
  1565.     },
  1566.  
  1567.     addTorrents: function(data)
  1568.     {
  1569.         theWebUI.systemInfo.rTorrent.started = true;
  1570.         var table = this.getTable("trt");
  1571.         var tul = 0;
  1572.         var tdl = 0;
  1573.         var tArray = [];
  1574.         $.each(data.torrents,function(hash,torrent)
  1575.         {
  1576.             tdl += iv(torrent.dl);
  1577.             tul += iv(torrent.ul);
  1578.             var sInfo = theWebUI.getStatusIcon(torrent);
  1579.             torrent.status = sInfo[1];
  1580.             var lbl = theWebUI.getLabels(hash, torrent);
  1581.             if(!$type(theWebUI.torrents[hash]))
  1582.             {
  1583.                 theWebUI.labels[hash] = lbl;
  1584.                 table.addRowById(torrent, hash, sInfo[0], {label : lbl});
  1585.                 tArray.push(hash);
  1586.                 theWebUI.filterByLabel(hash);
  1587.             }
  1588.             else
  1589.             {
  1590.                 var oldTorrent = theWebUI.torrents[hash];
  1591.                 if(lbl != theWebUI.labels[hash])
  1592.                 {
  1593.                     theWebUI.labels[hash] = lbl;
  1594.                     table.setAttr(hash, { label: lbl });
  1595.                     theWebUI.filterByLabel(hash);
  1596.                 }
  1597.                 if((oldTorrent.state!=torrent.state) ||
  1598.                     (oldTorrent.size!=torrent.size) ||
  1599.                     (oldTorrent.done!=torrent.done))
  1600.                     table.setIcon(hash, sInfo[0]);
  1601. //              if((oldTorrent.seeds!=torrent.seeds) || (oldTorrent.peers!=torrent.peers))
  1602.                 {
  1603.                         if((theWebUI.dID == hash) &&
  1604.                                 (theWebUI.activeView=='TrackerList'))
  1605.                         theWebUI.getTrackers(hash);
  1606.                 }
  1607.                 if(oldTorrent.downloaded!=torrent.downloaded)
  1608.                 {
  1609.                         if((theWebUI.dID == hash) &&
  1610.                                 (theWebUI.activeView=='FileList'))
  1611.                         theWebUI.updateFiles(hash);
  1612.                     else   
  1613.                         delete theWebUI.files[hash];
  1614.                 }
  1615.                 for( var prop in torrent)
  1616.                         table.setValueById(hash, prop, torrent[prop]);
  1617.             }
  1618.             torrent._updated = true;
  1619.         });
  1620.         $.extend(this.torrents,data.torrents);
  1621.         this.setSpeedValues(tul,tdl);
  1622.         var wasRemoved = false;
  1623.         this.clearTegs();
  1624.         $.each(this.torrents,function(hash,torrent)
  1625.         {
  1626.             if(!torrent._updated)
  1627.             {
  1628.                     delete theWebUI.torrents[hash];
  1629.                 if(theWebUI.labels[hash].indexOf("-_-_-nlb-_-_-") >- 1)
  1630.                     theWebUI.labels["-_-_-nlb-_-_-"]--;
  1631.                     if(theWebUI.labels[hash].indexOf("-_-_-com-_-_-") >- 1)
  1632.                             theWebUI.labels["-_-_-com-_-_-"]--;
  1633.                     if(theWebUI.labels[hash].indexOf("-_-_-dls-_-_-") >- 1)
  1634.                             theWebUI.labels["-_-_-dls-_-_-"]--;
  1635.                     if(theWebUI.labels[hash].indexOf("-_-_-act-_-_-") >- 1)
  1636.                             theWebUI.labels["-_-_-act-_-_-"]--;
  1637.                     if(theWebUI.labels[hash].indexOf("-_-_-iac-_-_-") >- 1)
  1638.                             theWebUI.labels["-_-_-iac-_-_-"]--;
  1639.                     if(theWebUI.labels[hash].indexOf("-_-_-err-_-_-") >- 1)
  1640.                             theWebUI.labels["-_-_-err-_-_-"]--;
  1641.                     theWebUI.labels["-_-_-all-_-_-"]--;
  1642.                     delete theWebUI.labels[hash];
  1643.                     table.removeRow(hash);
  1644.                     wasRemoved = true;
  1645.             }
  1646.             else
  1647.             {
  1648.                 torrent._updated = false;
  1649.                 theWebUI.updateTegs(torrent);
  1650.             }
  1651.         });
  1652.         this.getAllTrackers(tArray);
  1653.         this.loadLabels(data.labels);
  1654.         this.updateLabels(wasRemoved);
  1655.         this.loadTorrents();
  1656.         this.getTotal();
  1657.         data = null;
  1658.     },
  1659.  
  1660.     setSpeedValues: function(tul,tdl)
  1661.     {
  1662.         this.speedGraph.addData(tul,tdl);
  1663.         this.total.speedDL = tdl;
  1664.         this.total.speedUL = tul;
  1665.     },
  1666.  
  1667.     loadTorrents: function()
  1668.     {
  1669.         var table = this.getTable("trt");
  1670.         if(this.firstLoad)
  1671.         {
  1672.             this.firstLoad = false;
  1673.             this.show();
  1674.         }
  1675.         else
  1676.         {
  1677.             if(this.actLbl != "-_-_-all-_-_-")
  1678.                 table.refreshRows();
  1679.             }
  1680.         table.Sort();
  1681.         this.setInterval();
  1682.         this.updateDetails();
  1683.     },
  1684.  
  1685.     getTotal: function()
  1686.     {
  1687.             this.request("?action=gettotal",[this.addTotal, this]);
  1688.     },
  1689.  
  1690.     addTotal: function( d )
  1691.     {
  1692.             $.extend(this.total,d);
  1693.     },
  1694.  
  1695.     getStatusIcon: function(torrent)
  1696.     {
  1697.         var state = torrent.state;
  1698.         var completed = torrent.done;
  1699.         var icon = "", status = "";
  1700.         if(state & dStatus.checking)
  1701.         {
  1702.             icon = "Status_Checking";
  1703.             status = theUILang.Checking;
  1704.         }
  1705.         else
  1706.         if(state & dStatus.hashing)
  1707.         {
  1708.             icon = "Status_Queued_Up";
  1709.             status = theUILang.Queued;
  1710.         }
  1711.         else
  1712.         {
  1713.             if(state & dStatus.started)
  1714.             {
  1715.                 if(state & dStatus.paused)
  1716.                 {          
  1717.                     icon = "Status_Paused";
  1718.                     status = theUILang.Pausing;
  1719.                 }
  1720.                 else
  1721.                 {
  1722.                     icon = (completed == 1000) ? "Status_Up" : "Status_Down";
  1723.                     status = (completed == 1000) ? theUILang.Seeding : theUILang.Downloading;
  1724.                 }
  1725.             }
  1726.         }
  1727.         if(state & dStatus.error)
  1728.         {
  1729.             if(icon=="Status_Down")
  1730.                 icon = "Status_Error_Down";
  1731.             else       
  1732.             if(icon=="Status_Up")
  1733.                 icon = "Status_Error_Up";
  1734.             else
  1735.                 icon = "Status_Error";
  1736.         }
  1737.         if((completed == 1000) && (status == ""))
  1738.         {
  1739.             if(icon=="")
  1740.                 icon = "Status_Completed";
  1741.             status = theUILang.Finished;
  1742.         }
  1743.         if((completed < 1000) && (status == ""))
  1744.         {
  1745.             if(icon=="")
  1746.                 icon = "Status_Incompleted";
  1747.             status = theUILang.Stopped;
  1748.         }
  1749.         return([icon, status]);
  1750.     },
  1751.  
  1752. //
  1753. // labels
  1754. //
  1755.  
  1756.     setTeg: function(str)
  1757.     {
  1758.         str = $.trim(str);
  1759.         if(str!="")
  1760.         {
  1761.             for( var id in this.tegs )
  1762.                 if(this.tegs[id].val==str)
  1763.                 {
  1764.                     this.switchLabel($$(id));
  1765.                     return;
  1766.                 }
  1767.             var tegIg = "teg_"+this.lastTeg;
  1768.             this.lastTeg++;
  1769.             var el = $("<LI>").attr("id",tegIg).addClass("teg").
  1770.                 html(escapeHTML(str) + "&nbsp;(<span id=\"" + tegIg + "-c\">0</span>)").attr("title",str+" (0)").
  1771.                 mouseclick(theWebUI.tegContextMenu).addClass("cat")
  1772.             $("#lblf").append( el );
  1773.             this.tegs[tegIg] = { val: str, cnt: 0 };
  1774.             this.updateTeg(tegIg);
  1775.             this.switchLabel(el[0]);
  1776.         }
  1777.     },
  1778.  
  1779.     clearTegs: function()
  1780.     {
  1781.         for( var id in this.tegs )
  1782.             this.tegs[id].cnt = 0;
  1783.     },
  1784.  
  1785.     updateTeg: function(id)
  1786.     {
  1787.         var teg = this.tegs[id];
  1788.         var str = teg.val.toLowerCase();
  1789.         $.each(this.torrents,function(hash,torrent)
  1790.         {
  1791.             if(torrent.name.toLowerCase().indexOf(str) >- 1)
  1792.                 teg.cnt++;
  1793.         });
  1794.         var counter = $("#"+id+"-c");
  1795.         if(counter.text()!=teg.cnt)
  1796.         {
  1797.             counter.text(teg.cnt);
  1798.             $("#"+id).prop("title",teg.val+" ("+teg.cnt+")");
  1799.         }
  1800.     },
  1801.  
  1802.     updateTegs: function(torrent)
  1803.     {
  1804.             var str = torrent.name.toLowerCase();
  1805.         for( var id in this.tegs )
  1806.         {
  1807.                 var teg = this.tegs[id];
  1808.             if(str.indexOf(teg.val.toLowerCase()) >- 1)
  1809.                 teg.cnt++;
  1810.         }
  1811.     },
  1812.  
  1813.     removeTeg: function(id)
  1814.     {
  1815.         delete this.tegs[id];
  1816.         $($$(id)).remove();
  1817.         this.actLbl = "";
  1818.         this.switchLabel($$("-_-_-all-_-_-"));
  1819.     },
  1820.  
  1821.     tegContextMenu: function(e)
  1822.     {
  1823.             if(e.which==3)
  1824.             {
  1825.                 var table = theWebUI.getTable("trt");
  1826.             table.clearSelection();
  1827.             theWebUI.switchLabel(this);
  1828.             table.fillSelection();
  1829.             var id = table.getFirstSelected();
  1830.             if(id)
  1831.             {
  1832.                 theWebUI.createMenu(null, id);
  1833.                 theContextMenu.add([CMENU_SEP]);
  1834.             }
  1835.             else
  1836.                 theContextMenu.clear();
  1837.             theContextMenu.add([theUILang.removeTeg, "theWebUI.removeTeg('"+e.target.id+"');"]);
  1838.             theContextMenu.show(e.clientX,e.clientY);
  1839.         }
  1840.         else
  1841.             theWebUI.switchLabel(this);
  1842.         return(false);
  1843.     },
  1844.  
  1845.     labelContextMenu: function(e)
  1846.     {
  1847.             if(e.which==3)
  1848.             {
  1849.                 var table = theWebUI.getTable("trt");
  1850.             table.clearSelection();
  1851.             theWebUI.switchLabel(this);
  1852.             table.fillSelection();
  1853.             var id = table.getFirstSelected();
  1854.             if(id)
  1855.             {
  1856.                 theWebUI.createMenu(null, id);
  1857.                 theContextMenu.show(e.clientX,e.clientY);
  1858.             }
  1859.             else
  1860.                 theContextMenu.hide();
  1861.         }
  1862.         else
  1863.             theWebUI.switchLabel(this);
  1864.         return(false);
  1865.     },
  1866.  
  1867.     loadLabels: function(d)
  1868.     {
  1869.         var p = $("#lbll");
  1870.         var temp = new Array();
  1871.         var keys = new Array();
  1872.         for(var lbl in d)
  1873.             keys.push(lbl);
  1874.         keys.sort();
  1875.  
  1876.         for(var i=0; i<keys.length; i++)
  1877.         {
  1878.             var lbl = keys[i];
  1879.             this.labels["-_-_-" + lbl + "-_-_-"] = d[lbl];
  1880.             this.cLabels[lbl] = 1;
  1881.             temp["-_-_-" + lbl + "-_-_-"] = true;
  1882.             if(!$$("-_-_-" + lbl + "-_-_-"))
  1883.             {
  1884.                 p.append( $("<LI>").
  1885.                     attr("id","-_-_-" + lbl + "-_-_-").
  1886.                     html(escapeHTML(lbl) + "&nbsp;(<span id=\"-_-_-" + lbl + "-_-_-c\">" + d[lbl] + "</span>)").
  1887.                     mouseclick(theWebUI.labelContextMenu).addClass("cat") );
  1888.             }
  1889.         }
  1890.         var actDeleted = false;
  1891.         p.children().each(function(ndx,val)
  1892.         {
  1893.                 var id = val.id;
  1894.             if(id && !$type(temp[id]))
  1895.             {
  1896.                 $(val).remove();
  1897.                 delete theWebUI.labels[id];
  1898.                 delete theWebUI.cLabels[id.substr(5, id.length - 10)];
  1899.                 if(theWebUI.actLbl == id)
  1900.                     actDeleted = true;
  1901.             }
  1902.         });
  1903.         if(actDeleted)
  1904.         {
  1905.             this.actLbl = "";
  1906.             this.switchLabel($$("-_-_-all-_-_-"));
  1907.         }
  1908.     },
  1909.  
  1910.     getLabels : function(id, torrent)
  1911.     {
  1912.         if(!$type(this.labels[id]))
  1913.             this.labels[id] = "";
  1914.         var lbl = torrent.label;
  1915.         if(lbl == "")
  1916.             {
  1917.             lbl += "-_-_-nlb-_-_-";
  1918.             if(this.labels[id].indexOf("-_-_-nlb-_-_-") ==- 1)
  1919.                 this.labels["-_-_-nlb-_-_-"]++;
  1920.         }
  1921.         else
  1922.             if(this.labels[id].indexOf("-_-_-nlb-_-_-") >- 1)
  1923.                 this.labels["-_-_-nlb-_-_-"]--;
  1924.         lbl = "-_-_-" + lbl + "-_-_-";
  1925.         if(torrent.done < 1000)
  1926.             {
  1927.             lbl += "-_-_-dls-_-_-";
  1928.             if(this.labels[id].indexOf("-_-_-dls-_-_-") ==- 1)
  1929.                 this.labels["-_-_-dls-_-_-"]++;
  1930.             if(this.labels[id].indexOf("-_-_-com-_-_-") >- 1)
  1931.                 this.labels["-_-_-com-_-_-"]--;
  1932.         }
  1933.         else
  1934.             {
  1935.             lbl += "-_-_-com-_-_-";
  1936.             if(this.labels[id].indexOf("-_-_-com-_-_-") ==- 1)
  1937.                 this.labels["-_-_-com-_-_-"]++;
  1938.             if(this.labels[id].indexOf("-_-_-dls-_-_-") >- 1)
  1939.                 this.labels["-_-_-dls-_-_-"]--;
  1940.             }
  1941.         if((torrent.dl >= 1024) || (torrent.ul >= 1024))
  1942.         {
  1943.             lbl += "-_-_-act-_-_-";
  1944.             if(this.labels[id].indexOf("-_-_-act-_-_-") ==- 1)
  1945.                 this.labels["-_-_-act-_-_-"]++;
  1946.             if(this.labels[id].indexOf("-_-_-iac-_-_-") >- 1)
  1947.                 this.labels["-_-_-iac-_-_-"]--;
  1948.         }
  1949.         else
  1950.         {
  1951.             lbl += "-_-_-iac-_-_-";
  1952.             if(this.labels[id].indexOf("-_-_-iac-_-_-") ==- 1)
  1953.                 this.labels["-_-_-iac-_-_-"]++;
  1954.             if(this.labels[id].indexOf("-_-_-act-_-_-") >- 1)
  1955.                 this.labels["-_-_-act-_-_-"]--;
  1956.         }
  1957.         if(torrent.state & dStatus.error)
  1958.         {
  1959.             lbl += "-_-_-err-_-_-";
  1960.             if(this.labels[id].indexOf("-_-_-err-_-_-") ==- 1)
  1961.                 this.labels["-_-_-err-_-_-"]++;
  1962.         }
  1963.         else
  1964.             if(this.labels[id].indexOf("-_-_-err-_-_-") >- 1)
  1965.                 this.labels["-_-_-err-_-_-"]--;
  1966.         lbl += "-_-_-all-_-_-";
  1967.         if(this.labels[id] == "")
  1968.             this.labels["-_-_-all-_-_-"]++;
  1969.         return(lbl);
  1970.     },
  1971.  
  1972.     setLabel: function(lbl)
  1973.     {
  1974.         var req = '';
  1975.         var sr = this.getTable("trt").rowSel;
  1976.         for(var k in sr)
  1977.         {
  1978.                 if(sr[k] && (this.torrents[k].label != lbl))
  1979.                     req += ("&hash=" + k + "&s=label&v=" + encodeURIComponent(lbl));
  1980.         }
  1981.         if(req.length>0)
  1982.             this.request("?action=setlabel"+req+"&list=1",[this.addTorrents, this]);
  1983.     },
  1984.  
  1985.     removeLabel: function()
  1986.     {
  1987.             this.setLabel("");
  1988.     },
  1989.  
  1990.     newLabel: function()
  1991.     {
  1992.         var table = this.getTable("trt");
  1993.         var s = theUILang.newLabel;
  1994.         if(table.selCount == 1)
  1995.             {
  1996.                     var k = table.getFirstSelected();
  1997.             var lbl = this.torrents[k].label;
  1998.             if(lbl != "")
  1999.                 s = this.torrents[k].label;
  2000.         }
  2001.         $("#txtLabel").val(s);
  2002.         theDialogManager.show("dlgLabel");
  2003.     },
  2004.  
  2005.     createLabel: function()
  2006.     {
  2007.         var lbl = $.trim($("#txtLabel").val());
  2008.         lbl = lbl.replace(/\"/g, "'");
  2009.         if(lbl != "")
  2010.         {
  2011.             var sr = this.getTable("trt").rowSel;
  2012.             var req = "";
  2013.             for(var k in sr)
  2014.             {
  2015.                     if(sr[k] && (this.torrents[k].label != lbl))
  2016.                         req+=("&hash=" + k + "&s=label&v=" + encodeURIComponent(lbl));
  2017.                 }
  2018.             if(req.length>0)
  2019.                 this.request("?action=setlabel"+req+"&list=1",[this.addTorrents, this]);
  2020.         }
  2021.     },
  2022.  
  2023.     updateLabels: function(wasRemoved)
  2024.     {
  2025.         for(var k in this.labels)
  2026.             if(k.substr(0, 5) == "-_-_-")
  2027.                 $($$(k+"c")).text(this.labels[k]);
  2028.         for( var id in this.tegs )
  2029.         {
  2030.             var counter = $("#"+id+"-c");
  2031.             var teg = this.tegs[id];
  2032.             if(counter.text()!=teg.cnt)
  2033.             {
  2034.                 counter.text(teg.cnt);
  2035.                 $("#"+id).prop("title",teg.val+" ("+teg.cnt+")");
  2036.             }
  2037.         }
  2038.     },
  2039.  
  2040.     switchLabel: function(obj)
  2041.     {
  2042.         if(obj.id != this.actLbl)
  2043.         {
  2044.             if((this.actLbl != "") && $$(this.actLbl))
  2045.                 $($$(this.actLbl)).removeClass("sel");
  2046.             $(obj).addClass("sel");
  2047.             this.actLbl = obj.id;
  2048.             var table = this.getTable("trt");
  2049.             table.scrollTo(0);
  2050.             for(var k in this.torrents)
  2051.                 this.filterByLabel(k);
  2052.             table.clearSelection();
  2053.             if(this.dID != "")
  2054.                 {
  2055.                 this.dID = "";
  2056.                 this.clearDetails();
  2057.                 }
  2058.             table.refreshRows();
  2059.         }
  2060.     },
  2061.  
  2062.     filterByLabel: function(sId)
  2063.     {
  2064.             var table = this.getTable("trt");
  2065.             if($($$(this.actLbl)).hasClass("teg"))
  2066.             {
  2067.                     var teg = this.tegs[this.actLbl];
  2068.                     if(teg)
  2069.                     {
  2070.                     if(table.getValueById(sId, "name").toLowerCase().indexOf(teg.val.toLowerCase()) >- 1)
  2071.                     table.unhideRow(sId);
  2072.                 else
  2073.                     table.hideRow(sId);
  2074.             }
  2075.             }
  2076.             else
  2077.             if(table.getAttr(sId, "label").indexOf(this.actLbl) >- 1)
  2078.                 table.unhideRow(sId);
  2079.             else
  2080.                 table.hideRow(sId);
  2081.     },
  2082.  
  2083. //
  2084. // properties
  2085. //
  2086.  
  2087.     showProperties: function(k)
  2088.     {
  2089.         this.pID = k;
  2090.         this.request("?action=getprops&hash=" + k, [this.loadProperties, this]);
  2091.     },
  2092.  
  2093.     loadProperties: function(data)
  2094.     {
  2095.         $.extend(this.props, data);
  2096.         this.updateProperties();
  2097.     },
  2098.  
  2099.     updateProperties: function()
  2100.     {
  2101.         var props = this.props[this.pID];
  2102.         $("#prop-ulslots").val( props.ulslots );
  2103.         $("#prop-peers_min").val( props.peers_min );
  2104.         $("#prop-peers_max").val( props.peers_max );
  2105.         $("#prop-tracker_numwant").val( props.tracker_numwant );
  2106.         if(props.pex ==- 1)
  2107.         {
  2108.                 $("#prop-pex").prop("checked",false).prop("disabled",true);
  2109.             $("#lbl_prop-pex").addClass("disabled");
  2110.         }
  2111.         else
  2112.         {
  2113.             $("#prop-pex").prop("checked",(props.pex==1)).prop("disabled",false).removeClass("disabled");
  2114.             $("#lbl_prop-pex").removeClass("disabled");
  2115.         }
  2116.         o = $$("prop-superseed");
  2117.         if(this.torrents[this.pID].done==1000)
  2118.         {
  2119.                 $("#prop-superseed").prop("disabled",false);
  2120.                 $("#lbl_prop-superseed").removeClass("disabled");
  2121.         }
  2122.         else
  2123.         {
  2124.                 $("#prop-superseed").prop("disabled",true);
  2125.                 $("#lbl_prop-superseed").addClass("disabled");
  2126.             }
  2127.             $("#prop-superseed").prop("checked",(props.superseed==1));
  2128.         theDialogManager.show("dlgProps");
  2129.     },
  2130.  
  2131.     setProperties: function()
  2132.     {
  2133.         theDialogManager.hide("dlgProps");
  2134.         var req = '';
  2135.         for(var k in this.props[this.pID])
  2136.         {
  2137.                 var v = this.props[this.pID][k];
  2138.             var o = $("#prop-" + k);
  2139.                 var nv = o.is("input:checkbox") ? o.is(":checked")+0 : o.val()
  2140.                 if((k == "hash") || ((k == "pex") && (v ==- 1)))
  2141.                     continue;
  2142.                 if(v != nv)
  2143.                 {
  2144.                 this.props[this.pID][k] = nv;
  2145.                     req+=("&s=" + k + "&v=" + nv);
  2146.             }
  2147.         }              
  2148.             if(req.length>0)
  2149.                 this.request("?action=setprops&hash=" + this.pID + req);
  2150.         },
  2151.  
  2152. //
  2153. // details
  2154. //
  2155.  
  2156.     showDetails: function(hash, noSwitch)
  2157.     {
  2158.         if(!noSwitch)
  2159.                 theTabs.show("gcont");
  2160.         this.dID = hash;
  2161.         this.getFiles(hash);
  2162.         this.getTrackers(hash);
  2163.         if(!noSwitch && !theWebUI.settings["webui.show_dets"])
  2164.         {
  2165.             $("#tdetails").show();
  2166.                 theWebUI.settings["webui.show_dets"] = true;
  2167.                 theWebUI.resize();
  2168.                 theWebUI.save();
  2169.             }
  2170.         this.updateDetails();
  2171.     },
  2172.  
  2173.         clearDetails: function()
  2174.     {
  2175.         $(".det").text("");
  2176.         this.getTable("fls").clearRows();
  2177.         this.getTable("trk").clearRows();
  2178.         this.clearPeers();
  2179.     },
  2180.  
  2181.     updateDetails: function()
  2182.     {
  2183.         if((this.dID != "") && this.torrents[this.dID])
  2184.         {
  2185.             var d = this.torrents[this.dID];
  2186.                         $("#dl").text(theConverter.bytes(d.downloaded,2));
  2187.             $("#ul").text(theConverter.bytes(d.uploaded,2));
  2188.             $("#ra").html( (d.ratio ==- 1) ? "&#8734;" : theConverter.round(d.ratio/1000,3));
  2189.             $("#us").text(theConverter.speed(d.ul));
  2190.             $("#ds").text(theConverter.speed(d.dl));
  2191.             $("#rm").html((d.eta ==- 1) ? "&#8734;" : theConverter.time(d.eta));
  2192.             $("#se").text(d.seeds_actual + " " + theUILang.of + " " + d.seeds_all + " " + theUILang.connected);
  2193.             $("#pe").text(d.peers_actual + " " + theUILang.of + " " + d.peers_all + " " + theUILang.connected);
  2194.             $("#et").text(theConverter.time(Math.floor((new Date().getTime()-theWebUI.deltaTime)/1000-iv(d.state_changed)),true));
  2195.             $("#wa").text(theConverter.bytes(d.skip_total,2));
  2196.                 $("#bf").text(d.base_path);
  2197.                 $("#co").text(theConverter.date(iv(d.created)+theWebUI.deltaTime/1000));
  2198.             $("#tu").text(  $type(this.trackers[this.dID]) && $type(this.trackers[this.dID][d.tracker_focus]) ? this.trackers[this.dID][d.tracker_focus].name : '');
  2199.                 $("#hs").text(this.dID.substring(0,40));
  2200.             $("#ts").text(d.msg);
  2201.             var url = $.trim(d.comment);
  2202.             if(!url.match(/<a href/i))
  2203.             {
  2204.                 var start = url.indexOf("http://");
  2205.                 if(start<0)
  2206.                     start = url.indexOf("https://");
  2207.                 if(start>=0)
  2208.                 {
  2209.                     var end = url.indexOf(" ",start);
  2210.                     if(end<0)
  2211.                         end = url.length;
  2212.                     var prefix = url.substring(0,start);
  2213.                     var postfix = url.substring(end);
  2214.                     url = url.substring(start,end);
  2215.                     url = prefix+"<a href='"+url+"' target=_blank>"+url+"</a>"+postfix;
  2216.                 }
  2217.             }
  2218.             $("#cmt").html(url);
  2219.             $("#dsk").text((d.free_diskspace=='0') ? '' : theConverter.bytes(d.free_diskspace,2));
  2220.             this.updatePeers();
  2221.         }
  2222.     },
  2223.  
  2224. //
  2225. // service
  2226. //
  2227.  
  2228.     getTable: function(prefix)
  2229.     {
  2230.         return($type(this.tables[prefix]) ? this.tables[prefix].obj : null);
  2231.     },
  2232.  
  2233.     updateStatus: function()
  2234.     {
  2235.             var self = theWebUI;
  2236.         var ul = theConverter.speed(self.total.speedUL);
  2237.         var dl = theConverter.speed(self.total.speedDL);
  2238.         var newTitle = '';
  2239.         if(theWebUI.settings["webui.speedintitle"])
  2240.         {  
  2241.             if(ul.length)
  2242.                 newTitle+=('↑'+ul+' ');
  2243.             if(dl.length)
  2244.                 newTitle+=('↓'+dl+' ');
  2245.         }
  2246.         newTitle+="ruTorrent v"+self.version;
  2247.         if(document.title!=newTitle)
  2248.             document.title = newTitle;
  2249.             $("#stup_speed").text(ul);
  2250.             $("#stup_limit").text((self.total.rateUL>0 && self.total.rateUL<100*1024*1024) ? theConverter.speed(self.total.rateUL) : theUILang.no);
  2251.             $("#stup_total").text(theConverter.bytes(self.total.UL));
  2252.             $("#stdown_speed").text(dl);
  2253.             $("#stdown_limit").text((self.total.rateDL>0 && self.total.rateDL<100*1024*1024) ? theConverter.speed(self.total.rateDL) : theUILang.no);
  2254.             $("#stdown_total").text(theConverter.bytes(self.total.DL));
  2255.     },
  2256.  
  2257.     setDLRate: function(spd)
  2258.     {
  2259.         this.request("?action=setdlrate&s="+spd,[this.getTotal, this]);
  2260.     },
  2261.  
  2262.     setULRate: function(spd)
  2263.     {
  2264.         this.request("?action=setulrate&s="+spd,[this.getTotal, this]);
  2265.     },
  2266.  
  2267.     downRateMenu: function(e)
  2268.     {
  2269.             if(e.which==3)
  2270.             {
  2271.                     theContextMenu.clear();
  2272.                     var speeds=theWebUI.settings["webui.speedlistdl"].split(",");
  2273.                     if(theWebUI.total.rateDL<=0 || theWebUI.total.rateDL>=100*1024*1024)
  2274.                         theContextMenu.add([CMENU_SEL,theUILang.unlimited,"theWebUI.setDLRate(100*1024*1024)"]);
  2275.             else                   
  2276.                         theContextMenu.add([theUILang.unlimited,"theWebUI.setDLRate(100*1024*1024)"]);
  2277.             theContextMenu.add([CMENU_SEP]);
  2278.                     for(var i=0; i<speeds.length; i++)
  2279.                     {
  2280.                         var spd = iv(speeds[i])*1024;
  2281.                         if(theWebUI.total.rateDL==spd)
  2282.                     theContextMenu.add([CMENU_SEL,theConverter.speed(spd),"theWebUI.setDLRate("+spd+")"]);
  2283.                 else
  2284.                     theContextMenu.add([theConverter.speed(spd),"theWebUI.setDLRate("+spd+")"]);
  2285.             }
  2286.             theContextMenu.show(e.clientX,e.clientY);
  2287.         }
  2288.         return(false);
  2289.     },
  2290.  
  2291.     upRateMenu: function(e)
  2292.     {
  2293.             if(e.which==3)
  2294.             {
  2295.                     theContextMenu.clear();
  2296.                     var speeds=theWebUI.settings["webui.speedlistul"].split(",");
  2297.                     if(theWebUI.total.rateUL<=0 || theWebUI.total.rateUL>=100*1024*1024)
  2298.                         theContextMenu.add([CMENU_SEL,theUILang.unlimited,"theWebUI.setULRate(100*1024*1024)"]);
  2299.             else                   
  2300.                         theContextMenu.add([theUILang.unlimited,"theWebUI.setULRate(100*1024*1024)"]);
  2301.             theContextMenu.add([CMENU_SEP]);
  2302.                     for(var i=0; i<speeds.length; i++)
  2303.                     {
  2304.                         var spd = iv(speeds[i])*1024;
  2305.                         if(theWebUI.total.rateUL==spd)
  2306.                     theContextMenu.add([CMENU_SEL,theConverter.speed(spd),"theWebUI.setULRate("+spd+")"]);
  2307.                 else
  2308.                     theContextMenu.add([theConverter.speed(spd),"theWebUI.setULRate("+spd+")"]);
  2309.             }
  2310.             theContextMenu.show(e.clientX,e.clientY);
  2311.         }
  2312.         return(false);
  2313.     },
  2314.  
  2315.     resizeLeft: function( w, h )
  2316.     {
  2317.             if(w!==null)
  2318.             {
  2319.             $("#CatList").width( w );
  2320.             $("#VDivider").width( $(window).width()-w-10 );
  2321.         }
  2322.         if(h!==null)
  2323.         {
  2324.             $("#CatList").height( h );
  2325.         }
  2326.     },
  2327.  
  2328.     resizeTop : function( w, h )
  2329.     {
  2330.         this.getTable("trt").resize(w,h);
  2331.     },
  2332.  
  2333.     resizeBottom : function( w, h )
  2334.     {
  2335.             if(w!==null)
  2336.             {
  2337.             $("#tdetails").width( w );
  2338.             w-=8;
  2339.         }
  2340.         if(h!==null)
  2341.             {
  2342.             $("#tdetails").height( h );
  2343.             h-=($("#tabbar").height());
  2344.             $("#tdcont").height( h );
  2345.             h-=2;
  2346.             }
  2347.             if(theWebUI.configured)
  2348.             {
  2349.                 this.getTable("fls").resize(w,h);
  2350.             this.getTable("trk").resize(w,h);
  2351.             this.getTable("prs").resize(w,h);
  2352.             var table = this.getTable("plg");
  2353.             if(table)
  2354.                 table.resize(w,h);
  2355.             this.speedGraph.resize(w,h);
  2356.         }
  2357.     },
  2358.  
  2359.     resize: function()
  2360.     {
  2361.         var ww = $(window).width();
  2362.         var wh = $(window).height();
  2363.             var w = Math.floor(ww * (1 - theWebUI.settings["webui.hsplit"])) - 5;
  2364.             var th = ($("#t").is(":visible") ? $("#t").height() : -1)+$("#StatusBar").height()+12;
  2365.         $("#StatusBar").width(ww);
  2366.         if(theWebUI.settings["webui.show_cats"])
  2367.         {
  2368.             theWebUI.resizeLeft( w, wh-th );
  2369.             w = ww - w;
  2370.         }
  2371.         else
  2372.         {
  2373.             $("#VDivider").width( ww-10 );
  2374.             w = ww;
  2375.         }
  2376.         w-=11;
  2377.         theWebUI.resizeTop( w, Math.floor(wh * (theWebUI.settings["webui.show_dets"] ? theWebUI.settings["webui.vsplit"] : 1))-th-7 );
  2378.         if(theWebUI.settings["webui.show_dets"])
  2379.             theWebUI.resizeBottom( w, Math.floor(wh * (1 - theWebUI.settings["webui.vsplit"])) );
  2380.         $("#HDivider").height( wh-th+2 );
  2381.     },         
  2382.  
  2383.     update: function()
  2384.     {
  2385.             if(theWebUI.systemInfo.rTorrent.started || !this.firstLoad)
  2386.             theWebUI.getTorrents("list=1");
  2387.         else
  2388.             theWebUI.show();
  2389.     },
  2390.  
  2391.     setVSplitter : function()
  2392.     {
  2393.         var r = 1 - ($("#tdetails").height() / $(window).height());
  2394.         r = Math.floor(r * Math.pow(10, 3)) / Math.pow(10, 3);
  2395.         if((theWebUI.settings["webui.vsplit"] != r) && (r>0) && (r<1))
  2396.         {
  2397.             theWebUI.settings["webui.vsplit"] = r;
  2398.             theWebUI.save();
  2399.         }
  2400.     },
  2401.  
  2402.     setHSplitter : function()
  2403.     {
  2404.         var r = 1 - ($("#CatList").width()+5)/$(window).width();
  2405.         r = Math.floor(r * Math.pow(10, 3)) / Math.pow(10, 3);
  2406.         if((theWebUI.settings["webui.hsplit"] != r) && (r>0) && (r<1))
  2407.         {
  2408.             theWebUI.settings["webui.hsplit"] = r;
  2409.             theWebUI.save();
  2410.         }
  2411.     },
  2412.  
  2413.     toggleMenu: function()
  2414.     {
  2415.         $("#t").toggle();
  2416.         theWebUI.resize();
  2417.     },
  2418.  
  2419.     toggleDetails: function()
  2420.     {
  2421.         theWebUI.settings["webui.show_dets"] = !theWebUI.settings["webui.show_dets"];
  2422.         $("#tdetails").toggle();
  2423.             theWebUI.resize();
  2424.         theWebUI.save();
  2425.     },
  2426.  
  2427.     toggleCategories: function()
  2428.     {
  2429.             theWebUI.settings["webui.show_cats"] = !theWebUI.settings["webui.show_cats"];
  2430.         $("#CatList").toggle();
  2431.             theWebUI.resize();
  2432.         theWebUI.save();
  2433.     },
  2434.  
  2435.     showPanel: function(pnl,enable)
  2436.     {
  2437.         var cont = $('#'+pnl.id+"_cont");
  2438.         cont.toggle(enable);
  2439.         theWebUI.settings["webui.closed_panels"][pnl.id] = !enable;
  2440.         pnl.style.backgroundImage="url("+this.getTable("trt").paletteURL+(enable ? "/images/pnl_open.gif)" : "/images/pnl_close.gif)");
  2441.     },
  2442.  
  2443.     togglePanel: function(pnl)
  2444.     {
  2445.         theWebUI.showPanel(pnl,!$('#'+pnl.id+"_cont").is(":visible"));
  2446.         theWebUI.save();
  2447.     },
  2448.  
  2449.     showAdd: function()
  2450.     {
  2451.         theDialogManager.toggle("tadd");
  2452.     },
  2453.    
  2454.     resetInterval: function()
  2455.     {
  2456.         this.timer.stop();
  2457.         if(this.updTimer)
  2458.             window.clearTimeout(this.updTimer);
  2459.         this.interval = iv(this.settings["webui.update_interval"]);
  2460.         this.updTimer = window.setTimeout(this.update, this.interval);
  2461.     },
  2462.  
  2463.     setInterval: function( force )
  2464.     {
  2465.         this.timer.stop();
  2466.         if(force)
  2467.             this.interval = force;
  2468.         else
  2469.         if(this.interval ==- 1)
  2470.             this.interval = iv(this.settings["webui.update_interval"]) + this.timer.interval * 4;
  2471.         else
  2472.             this.interval = iv((this.interval + iv(this.settings["webui.update_interval"]) + this.timer.interval * 4) / 2);
  2473.         this.updTimer = window.setTimeout(this.update, this.interval);
  2474.     },
  2475.  
  2476.     setActiveView: function(id)
  2477.     {
  2478.         $("#tooltip").remove();
  2479.         this.activeView=id;
  2480.     },
  2481.  
  2482.     request: function(qs, onComplite, isASync)
  2483.     {
  2484.         this.requestWithTimeout(qs, onComplite, this.timeout, this.error, isASync);
  2485.     },
  2486.  
  2487.     requestWithTimeout: function(qs, onComplite, onTimeout, onError, isASync)
  2488.     {
  2489.         Ajax(this.url + qs, isASync, onComplite, onTimeout, onError, this.settings["webui.reqtimeout"]);
  2490.     },
  2491.  
  2492.     requestWithoutTimeout: function(qs, onComplite, isASync)
  2493.     {
  2494.         Ajax(this.url + qs, isASync, onComplite, null, this.error, -1);
  2495.     },
  2496.  
  2497.     show: function()
  2498.     {
  2499.         if($("#cover").is(":visible"))
  2500.         {
  2501.             $("#cover").hide();
  2502.             theWebUI.resize();
  2503.             theTabs.show("lcont");
  2504.         }
  2505.     },
  2506.  
  2507.     msg: function(s)
  2508.     {
  2509.         $('#loadimg').hide();
  2510.             $("#msg").text(s);
  2511.     },
  2512.  
  2513.     catchErrors: function(toLog)
  2514.     {
  2515.             if(toLog)
  2516.             window.onerror = function(msg, url, line)
  2517.             {
  2518.                     theWebUI.show();
  2519.                 noty("JS error: [" + url + " : " + line + "] " + msg,"error");
  2520.                 return true;
  2521.             }
  2522.         else
  2523.             window.onerror = function(msg, url, line)
  2524.             {
  2525.                 msg = "JS error: [" + url + " : " + line + "] " + msg;
  2526.                 theWebUI.msg(msg);
  2527.                 log(msg);
  2528.                 return true;
  2529.             }
  2530.     },
  2531.  
  2532.     error: function(status,text)
  2533.     {
  2534.         theWebUI.show();
  2535.         noty("Bad response from server: ("+status+") "+(text ? text : ""),"error");
  2536.     },
  2537.  
  2538.     timeout: function()
  2539.     {
  2540.         theWebUI.show();
  2541.         if(!theWebUI.settings["webui.ignore_timeouts"])
  2542.             noty(theUILang.Request_timed_out,"alert");
  2543.     }
  2544. };
  2545.  
  2546. $(document).ready(function()
  2547. {
  2548.     makeContent();
  2549.     theContextMenu.init();
  2550.     theTabs.init();
  2551.     theWebUI.init();
  2552. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement