Changeset 12829


Ignore:
Timestamp:
Sep 2, 2011, 7:29:41 PM (10 years ago)
Author:
jordan
Message:

(trunk web) refactor the inspector into its own class; make most of the methods private.

Location:
trunk/web
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/web/index.html

    r12822 r12829  
    2828                <script type="text/javascript" src="./javascript/jquery/json2.min.js"></script>
    2929                <script type="text/javascript" src="./javascript/common.js"></script>
     30                <script type="text/javascript" src="./javascript/inspector.js"></script>
    3031                <script type="text/javascript" src="./javascript/remote.js"></script>
    3132                <script type="text/javascript" src="./javascript/transmission.js"></script>
  • trunk/web/javascript/Makefile.am

    r12823 r12829  
    66  file-row.js \
    77  formatter.js \
     8  inspector.js \
    89  menu.js \
    910  remote.js \
  • trunk/web/javascript/transmission.js

    r12826 r12829  
    2424                // Initialize the helper classes
    2525                this.remote = new TransmissionRemote(this);
     26                this.inspector = new Inspector(this, this.remote);
    2627
    2728                // Initialize the implementation fields
     
    4849                $('#block_update_button').click(function() { tr.remote.updateBlocklist(); return false; });
    4950                $('#stats_close_button').click(function() { tr.hideStatsDialog(); return false; });
    50                 $('.inspector_tab').click(function(e) { tr.inspectorTabClicked(e, this); });
    51                 $('#files_select_all').live('click', function(e) { tr.filesSelectAllClicked(e, this); });
    52                 $('#files_deselect_all').live('click', function(e) { tr.filesDeselectAllClicked(e, this); });
    5351                $('#open_link').click(function(e) { tr.openTorrentClicked(e); });
    5452                $('#upload_confirm_button').click(function(e) { tr.confirmUploadClicked(e); return false;});
     
    8583
    8684                this._torrent_list             = $('#torrent_list')[0];
    87                 this._inspector_file_list      = $('#inspector_file_list')[0];
    88                 this._inspector_peers_list     = $('#inspector_peers_list')[0];
    89                 this._inspector_trackers_list  = $('#inspector_trackers_list')[0];
    9085                this._toolbar_buttons          = $('#toolbar ul li');
    9186                this._toolbar_pause_button     = $('#toolbar #pause_selected')[0];
     
    10196                this._context_move_down        = $('li#context_move_down')[0];
    10297                this._context_move_bottom      = $('li#context_move_bottom')[0];
    103 
    104                 var ti = '#torrent_inspector_';
    105                 this._inspector = { };
    106                 this._inspector._info_tab = { };
    107                 this._inspector._info_tab.availability = $(ti+'availability')[0];
    108                 this._inspector._info_tab.comment = $(ti+'comment')[0];
    109                 this._inspector._info_tab.creator_date = $(ti+'creator_date')[0];
    110                 this._inspector._info_tab.creator = $(ti+'creator')[0];
    111                 this._inspector._info_tab.download_dir = $(ti+'download_dir')[0];
    112                 this._inspector._info_tab.downloaded = $(ti+'downloaded')[0];
    113                 this._inspector._info_tab.download_from = $(ti+'download_from')[0];
    114                 this._inspector._info_tab.download_speed = $(ti+'download_speed')[0];
    115                 this._inspector._info_tab.error = $(ti+'error')[0];
    116                 this._inspector._info_tab.hash = $(ti+'hash')[0];
    117                 this._inspector._info_tab.have = $(ti+'have')[0];
    118                 this._inspector._info_tab.name = $(ti+'name')[0];
    119                 this._inspector._info_tab.progress = $(ti+'progress')[0];
    120                 this._inspector._info_tab.ratio = $(ti+'ratio')[0];
    121                 this._inspector._info_tab.secure = $(ti+'secure')[0];
    122                 this._inspector._info_tab.size = $(ti+'size')[0];
    123                 this._inspector._info_tab.state = $(ti+'state')[0];
    124                 this._inspector._info_tab.pieces = $(ti+'pieces')[0];
    125                 this._inspector._info_tab.uploaded = $(ti+'uploaded')[0];
    126                 this._inspector._info_tab.upload_speed = $(ti+'upload_speed')[0];
    127                 this._inspector._info_tab.upload_to = $(ti+'upload_to')[0];
    12898
    12999                // Setup the prefs gui
     
    447417        {
    448418                this.updateButtonStates();
    449                 this.inspectorSelectionChanged();
     419
     420                this.inspector.setTorrents(this.inspectorIsVisible() ? this.getSelectedTorrents() : []);
    450421
    451422                clearTimeout(this.selectionChangedTimer);
     
    10371008                if (needinfo.length) {
    10381009                        // whee, new torrents! get their initial information.
    1039                         var fields = ['id'].concat(Torrent.Fields.Metadata, Torrent.Fields.Stats);
    1040                         this.remote.updateTorrents(needinfo, fields, this.updateFromTorrentGet, this);
     1010                        this.updateTorrents(needinfo, ['id'].concat(Torrent.Fields.Metadata, Torrent.Fields.Stats));
    10411011                        this.refilterSoon();
    10421012                }
     
    10481018        },
    10491019
     1020        updateTorrents: function(ids, fields)
     1021        {
     1022                this.remote.updateTorrents(ids, fields, this.updateFromTorrentGet, this);
     1023        },
     1024
    10501025        refreshTorrents: function()
    10511026        {
    10521027                // send a request right now
    1053                 this.remote.updateTorrents('recently-active',
    1054                                            ['id'].concat(Torrent.Fields.Stats),
    1055                                            this.updateFromTorrentGet,
    1056                                            this);
     1028                this.updateTorrents('recently-active', ['id'].concat(Torrent.Fields.Stats));
    10571029
    10581030                // schedule the next request
     
    10631035        initializeTorrents: function()
    10641036        {
    1065                 var fields = ['id'].concat(Torrent.Fields.Metadata,
    1066                                            Torrent.Fields.Stats);
    1067                 this.remote.updateTorrents(null, fields,
    1068                                            this.updateFromTorrentGet, this);
    1069         },
    1070 
    1071         needsExtraInfo: function(ids)
    1072         {
    1073                 var i, id, tor;
    1074 
    1075                 for (i=0; id=ids[i]; ++i)
    1076                         if ((tor = this._torrents[id]))
    1077                                 if (!tor.hasExtraInfo())
    1078                                         return true;
    1079 
    1080                 return false;
    1081         },
    1082 
    1083         // Load the torrent fields which are only used by the inspector
    1084         refreshInspectorTorrents: function(full)
    1085         {
    1086                 var fields, ids=null;
    1087 
    1088                 if (this.inspectorIsVisible())
    1089                         ids = this.getSelectedTorrentIds();
    1090 
    1091                 if (ids && ids.length) {
    1092                         fields = ['id'].concat(Torrent.Fields.StatsExtra);
    1093                         if (this.needsExtraInfo(ids))
    1094                                 $.merge(fields, Torrent.Fields.InfoExtra);
    1095                         this.remote.updateTorrents(
    1096                                 ids, fields, this.updateFromTorrentGet, this);
    1097                 }
     1037                this.updateTorrents(null, ['id'].concat(Torrent.Fields.Metadata, Torrent.Fields.Stats));
    10981038        },
    10991039
     
    14181358        ****/
    14191359
    1420         inspectorIsVisible: function() {
     1360        inspectorIsVisible: function()
     1361        {
    14211362                return $('#torrent_inspector').is(':visible');
    14221363        },
    1423 
    1424         filesSelectAllClicked: function() {
    1425                 var t = this._file_torrent;
    1426                 if (t)
    1427                         this.toggleFilesWantedDisplay(t, true);
    1428         },
    1429         filesDeselectAllClicked: function() {
    1430                 var t = this._file_torrent;
    1431                 if (t)
    1432                         this.toggleFilesWantedDisplay(t, false);
    1433         },
    1434         toggleFilesWantedDisplay: function(torrent, wanted) {
    1435                 var rows = [ ];
    1436                 for (var i=0, row; row=this._file_rows[i]; ++i)
    1437                         if (row.isEditable() && (torrent.getFile(i).wanted !== wanted))
    1438                                 rows.push(row);
    1439                 if (rows.length > 0) {
    1440                         var command = wanted ? 'files-wanted' : 'files-unwanted';
    1441                         this.changeFileCommand(command, rows);
    1442                 }
    1443         },
    1444 
    1445         inspectorTabClicked: function(ev, tab)
    1446         {
    1447                 if (isMobileDevice) ev.stopPropagation();
    1448 
    1449                 // select this tab and deselect the others
    1450                 $(tab).addClass('selected').siblings().removeClass('selected');
    1451 
    1452                 // show this tab and hide the others
    1453                 $('#'+tab.id+'_container').show().siblings('.inspector_container').hide();
    1454 
    1455                 this.hideMobileAddressbar();
    1456                 this.updatePeersLists();
    1457                 this.updateTrackersLists();
    1458                 this.updateFileList();
    1459         },
    1460         /*
    1461          * Update the inspector with the latest data for the selected torrents
    1462          */
    1463         updateInspector: function()
    1464         {
    1465                 if (!this.inspectorIsVisible())
    1466                         return;
    1467 
    1468                 var torrents = this.getSelectedTorrents();
    1469                 if (!torrents.length && isMobileDevice) {
    1470                         this.setInspectorVisible(false);
    1471                         return;
    1472                 }
    1473 
    1474                 var creator = 'N/A',
    1475                     comment = 'N/A',
    1476                     download_dir = 'N/A',
    1477                     date_created = 'N/A',
    1478                     error = 'None',
    1479                     hash = 'N/A',
    1480                     have_public = false,
    1481                     have_private = false,
    1482                     name,
    1483                     sizeWhenDone = 0,
    1484                     sizeDone = 0,
    1485                     total_completed = 0,
    1486                     total_download = 0,
    1487                     total_download_peers = 0,
    1488                     total_download_speed = 0,
    1489                     total_availability = 0,
    1490                     total_size = 0,
    1491                     total_state = [ ],
    1492                     pieces = 'N/A',
    1493                     total_upload = 0,
    1494                     total_upload_peers = 0,
    1495                     total_upload_speed = 0,
    1496                     total_verified = 0,
    1497                     na = 'N/A',
    1498                     tab = this._inspector._info_tab,
    1499                     fmt = Transmission.fmt;
    1500 
    1501                 $("#torrent_inspector_size, .inspector_row div").css('color', '#222');
    1502 
    1503                 if (torrents.length == 0)
    1504                 {
    1505                         setInnerHTML(tab.name, 'No Selection');
    1506                         setInnerHTML(tab.size, na);
    1507                         setInnerHTML(tab.pieces, na);
    1508                         setInnerHTML(tab.hash, na);
    1509                         setInnerHTML(tab.state, na);
    1510                         setInnerHTML(tab.download_speed, na);
    1511                         setInnerHTML(tab.upload_speed, na);
    1512                         setInnerHTML(tab.uploaded, na);
    1513                         setInnerHTML(tab.downloaded, na);
    1514                         setInnerHTML(tab.availability, na);
    1515                         setInnerHTML(tab.ratio, na);
    1516                         setInnerHTML(tab.have, na);
    1517                         setInnerHTML(tab.upload_to, na);
    1518                         setInnerHTML(tab.download_from, na);
    1519                         setInnerHTML(tab.secure, na);
    1520                         setInnerHTML(tab.creator_date, na);
    1521                         setInnerHTML(tab.progress, na);
    1522                         setInnerHTML(tab.comment, na);
    1523                         setInnerHTML(tab.creator, na);
    1524                         setInnerHTML(tab.download_dir, na);
    1525                         setInnerHTML(tab.error, na);
    1526                         this.updateFileList();
    1527                         this.updatePeersLists();
    1528                         this.updateTrackersLists();
    1529                         $("#torrent_inspector_size, .inspector_row > div:contains('N/A')").css('color', '#666');
    1530                         return;
    1531                 }
    1532 
    1533                 name = torrents.length == 1
    1534                         ? torrents[0].getName()
    1535                         : torrents.length+' Transfers Selected';
    1536 
    1537                 if (torrents.length == 1)
    1538                 {
    1539                         var text;
    1540                         var t = torrents[0];
    1541                         var err = t.getErrorMessage();
    1542                         if (err)
    1543                                 error = err;
    1544                         if ((text = t.getComment()))
    1545                                 comment = text;
    1546                         if ((text = t.getCreator()))
    1547                                 creator = text;
    1548                         if ((text = t.getDownloadDir()))
    1549                                 download_dir = text;
    1550 
    1551                         hash = t.getHashString();
    1552                         pieces = [ t.getPieceCount(), 'pieces @', fmt.mem(t.getPieceSize()) ].join(' ');
    1553                         date_created = fmt.timestamp(t.getDateCreated());
    1554                 }
    1555 
    1556                 for (var i=0, t; t=torrents[i]; ++i) {
    1557                         var l = t.getLeftUntilDone();
    1558                         var d = t.getSizeWhenDone();
    1559                         sizeWhenDone         += d;
    1560                         sizeDone             += d - l;
    1561                         total_completed      += t.getHave();
    1562                         total_verified       += t.getHaveValid();
    1563                         total_size           += t.getTotalSize();
    1564                         total_upload         += t.getUploadedEver();
    1565                         total_download       += t.getDownloadedEver();
    1566                         total_upload_speed   += t.getUploadSpeed();
    1567                         total_download_speed += t.getDownloadSpeed();
    1568                         total_upload_peers   += t.getPeersGettingFromUs();
    1569                         total_download_peers += t.getPeersSendingToUs();
    1570                         total_availability   += sizeWhenDone - l + t.getDesiredAvailable();
    1571 
    1572                         var s = t.getStateString();
    1573                         if (total_state.indexOf(s) == -1)
    1574                                 total_state.push(s);
    1575 
    1576                         if (t.getPrivateFlag())
    1577                                 have_private = true;
    1578                         else
    1579                                 have_public = true;
    1580                 }
    1581 
    1582                 var private_string = '';
    1583                 if (have_private && have_public) private_string = 'Mixed';
    1584                 else if (have_private) private_string = 'Private Torrent';
    1585                 else if (have_public) private_string = 'Public Torrent';
    1586 
    1587                 setInnerHTML(tab.name, name);
    1588                 setInnerHTML(tab.size, torrents.length ? fmt.size(total_size) : na);
    1589                 setInnerHTML(tab.pieces, pieces);
    1590                 setInnerHTML(tab.hash, hash);
    1591                 setInnerHTML(tab.state, total_state.join('/'));
    1592                 setInnerHTML(tab.download_speed, torrents.length ? fmt.speedBps(total_download_speed) : na);
    1593                 setInnerHTML(tab.upload_speed, torrents.length ? fmt.speedBps(total_upload_speed) : na);
    1594                 setInnerHTML(tab.uploaded, torrents.length ? fmt.size(total_upload) : na);
    1595                 setInnerHTML(tab.downloaded, torrents.length ? fmt.size(total_download) : na);
    1596                 setInnerHTML(tab.availability, torrents.length ? fmt.percentString(Math.ratio(total_availability*100, sizeWhenDone)) + '%' : na);
    1597                 setInnerHTML(tab.ratio, torrents.length ? fmt.ratioString(Math.ratio(total_upload, total_download)) : na);
    1598                 setInnerHTML(tab.have, torrents.length ? fmt.size(total_completed) + ' (' + fmt.size(total_verified) + ' verified)' : na);
    1599                 setInnerHTML(tab.upload_to, torrents.length ? total_upload_peers : na);
    1600                 setInnerHTML(tab.download_from, torrents.length ? total_download_peers : na);
    1601                 setInnerHTML(tab.secure, private_string);
    1602                 setInnerHTML(tab.creator_date, date_created);
    1603                 setInnerHTML(tab.progress, torrents.length ? fmt.percentString(Math.ratio(sizeDone*100, sizeWhenDone)) + '%' : na);
    1604                 setInnerHTML(tab.comment, comment);
    1605                 setInnerHTML(tab.creator, creator);
    1606                 setInnerHTML(tab.download_dir, download_dir);
    1607                 setInnerHTML(tab.error, error);
    1608 
    1609                 this.updatePeersLists();
    1610                 this.updateTrackersLists();
    1611                 $(".inspector_row > div:contains('N/A')").css('color', '#666');
    1612                 this.updateFileList();
    1613         },
    1614 
    1615         onFileWantedToggled: function(row, want) {
    1616                 var command = want ? 'files-wanted' : 'files-unwanted';
    1617                 this.changeFileCommand(command, [ row ]);
    1618         },
    1619         onFilePriorityToggled: function(row, priority) {
    1620                 var command;
    1621                 switch(priority) {
    1622                         case -1: command = 'priority-low'; break;
    1623                         case  1: command = 'priority-high'; break;
    1624                         default: command = 'priority-normal'; break;
    1625                 }
    1626                 this.changeFileCommand(command, [ row ]);
    1627         },
    1628         clearFileList: function()
    1629         {
    1630                 $(this._inspector_file_list).empty();
    1631                 delete this._file_torrent;
    1632                 delete this._file_rows;
    1633         },
    1634         updateFileList: function()
    1635         {
    1636                 var i, n, tr, sel, row, torrent, fragment;
    1637 
    1638                 if (!$(this._inspector_file_list).is(':visible'))
    1639                         return;
    1640 
    1641                 sel = this.getSelectedTorrents();
    1642                 if (sel.length !== 1) {
    1643                         this.clearFileList();
    1644                         return;
    1645                 }
    1646 
    1647                 // build the file list
    1648                 torrent = sel[0];
    1649                 this.clearFileList();
    1650                 this._file_torrent = torrent;
    1651                 n = torrent.getFileCount();
    1652                 this._file_rows = [];
    1653                 fragment = document.createDocumentFragment();
    1654                 tr = this;
    1655                 for (i=0; i<n; ++i) {
    1656                         row = this._file_rows[i] = new FileRow(torrent, i);
    1657                         fragment.appendChild(row.getElement());
    1658                         $(row).bind('wantedToggled',function(e,row,want) {tr.onFileWantedToggled(row,want);});
    1659                         $(row).bind('priorityToggled',function(e,row,priority) {tr.onFilePriorityToggled(row,priority);});
    1660                 }
    1661                 this._inspector_file_list.appendChild(fragment);
    1662         },
    1663 
    1664         updatePeersLists: function()
    1665         {
    1666                 if (!$(this._inspector_peers_list).is(':visible'))
    1667                         return;
    1668 
    1669                 var html = [ ];
    1670                 var fmt = Transmission.fmt;
    1671                 var torrents = this.getSelectedTorrents();
    1672 
    1673                 for (var k=0, torrent; torrent=torrents[k]; ++k) {
    1674                         var peers = torrent.getPeers();
    1675                         html.push('<div class="inspector_group">');
    1676                         if (torrents.length > 1) {
    1677                                 html.push('<div class="inspector_torrent_label">', torrent.getName(), '</div>');
    1678                         }
    1679                         if (!peers || !peers.length) {
    1680                                 html.push('<br></div>'); // firefox won't paint the top border if the div is empty
    1681                                 continue;
    1682                         }
    1683                         html.push('<table class="peer_list">',
    1684                                    '<tr class="inspector_peer_entry even">',
    1685                                    '<th class="encryptedCol"></th>',
    1686                                    '<th class="upCol">Up</th>',
    1687                                    '<th class="downCol">Down</th>',
    1688                                    '<th class="percentCol">%</th>',
    1689                                    '<th class="statusCol">Status</th>',
    1690                                    '<th class="addressCol">Address</th>',
    1691                                    '<th class="clientCol">Client</th>',
    1692                                    '</tr>');
    1693                         for (var i=0, peer; peer=peers[i]; ++i) {
    1694                                 var parity = ((i+1) % 2 == 0 ? 'even' : 'odd');
    1695                                 html.push('<tr class="inspector_peer_entry ', parity, '">',
    1696                                            '<td>', (peer.isEncrypted ? '<img src="images/graphics/lock_icon.png" alt="Encrypted"/>' : ''), '</td>',
    1697                                            '<td>', (peer.rateToPeer ? fmt.speedBps(peer.rateToPeer) : ''), '</td>',
    1698                                            '<td>', (peer.rateToClient ? fmt.speedBps(peer.rateToClient) : ''), '</td>',
    1699                                            '<td class="percentCol">', Math.floor(peer.progress*100), '%', '</td>',
    1700                                            '<td>', fmt.peerStatus(peer.flagStr), '</td>',
    1701                                            '<td>', peer.address, '</td>',
    1702                                            '<td class="clientCol">', peer.clientName, '</td>',
    1703                                            '</tr>');
    1704                         }
    1705                         html.push('</table></div>');
    1706                 }
    1707 
    1708                 setInnerHTML(this._inspector_peers_list, html.join(''));
    1709         },
    1710 
    1711         updateTrackersLists: function() {
    1712                 if (!$(this._inspector_trackers_list).is(':visible'))
    1713                         return;
    1714 
    1715                 var html = [ ];
    1716                 var na = 'N/A';
    1717                 var torrents = this.getSelectedTorrents();
    1718 
    1719                 // By building up the HTML as as string, then have the browser
    1720                 // turn this into a DOM tree, this is a fast operation.
    1721                 for (var i=0, torrent; torrent=torrents[i]; ++i)
    1722                 {
    1723                         html.push ('<div class="inspector_group">');
    1724 
    1725                         if (torrents.length > 1)
    1726                                 html.push('<div class="inspector_torrent_label">', torrent.getName(), '</div>');
    1727 
    1728                         var tier = -1;
    1729                         var trackers = torrent.getTrackers();
    1730                         for (var j=0, tracker; tracker=trackers[j]; ++j)
    1731                         {
    1732                                 if (tier != tracker.tier)
    1733                                 {
    1734                                         if (tier !== -1) // close previous tier
    1735                                                 html.push('</ul></div>');
    1736        
    1737                                         tier = tracker.tier;
    1738 
    1739                                         html.push('<div class="inspector_group_label">',
    1740                                                   'Tier ', tier, '</div>',
    1741                                                   '<ul class="tier_list">');
    1742                                 }
    1743 
    1744                                 var lastAnnounceStatusHash = this.lastAnnounceStatus(tracker);
    1745                                 var announceState = this.announceState(tracker);
    1746                                 var lastScrapeStatusHash = this.lastScrapeStatus(tracker);
    1747 
    1748                                 // Display construction
    1749                                 var parity = ((j+1) % 2 == 0 ? 'even' : 'odd');
    1750                                 html.push('<li class="inspector_tracker_entry ', parity, '"><div class="tracker_host" title="', tracker.announce, '">',
    1751                                           tracker.host, '</div>',
    1752                                           '<div class="tracker_activity">',
    1753                                           '<div>', lastAnnounceStatusHash['label'], ': ', lastAnnounceStatusHash['value'], '</div>',
    1754                                           '<div>', announceState, '</div>',
    1755                                           '<div>', lastScrapeStatusHash['label'], ': ', lastScrapeStatusHash['value'], '</div>',
    1756                                           '</div><table class="tracker_stats">',
    1757                                           '<tr><th>Seeders:</th><td>', (tracker.seederCount > -1 ? tracker.seederCount : na), '</td></tr>',
    1758                                           '<tr><th>Leechers:</th><td>', (tracker.leecherCount > -1 ? tracker.leecherCount : na), '</td></tr>',
    1759                                           '<tr><th>Downloads:</th><td>', (tracker.downloadCount > -1 ? tracker.downloadCount : na), '</td></tr>',
    1760                                           '</table></li>');
    1761                         }
    1762                         if (tier !== -1) // close last tier
    1763                                         html.push('</ul></div>');
    1764 
    1765                         html.push('</div>'); // inspector_group
    1766                 }
    1767 
    1768                 setInnerHTML(this._inspector_trackers_list, html.join(''));
    1769         },
    1770 
    1771         lastAnnounceStatus: function(tracker) {
    1772                 var lastAnnounceLabel = 'Last Announce';
    1773                 var lastAnnounce = [ 'N/A' ];
    1774                 if (tracker.hasAnnounced) {
    1775                         var lastAnnounceTime = Transmission.fmt.timestamp(tracker.lastAnnounceTime);
    1776                         if (tracker.lastAnnounceSucceeded) {
    1777                                 lastAnnounce = [ lastAnnounceTime, ' (got ',  Transmission.fmt.plural(tracker.lastAnnouncePeerCount, 'peer'), ')' ];
    1778                         } else {
    1779                                 lastAnnounceLabel = 'Announce error';
    1780                                 lastAnnounce = [ (tracker.lastAnnounceResult ? (tracker.lastAnnounceResult + ' - ') : ''), lastAnnounceTime ];
    1781                         }
    1782                 }
    1783                 return { 'label':lastAnnounceLabel, 'value':lastAnnounce.join('') };
    1784         },
    1785 
    1786         announceState: function(tracker) {
    1787                 var announceState = '';
    1788                 switch (tracker.announceState) {
    1789                         case Torrent._TrackerActive:
    1790                                 announceState = 'Announce in progress';
    1791                                 break;
    1792                         case Torrent._TrackerWaiting:
    1793                                 var timeUntilAnnounce = tracker.nextAnnounceTime - ((new Date()).getTime() / 1000);
    1794                                 if (timeUntilAnnounce < 0) {
    1795                                         timeUntilAnnounce = 0;
    1796                                 }
    1797                                 announceState = 'Next announce in ' + Transmission.fmt.timeInterval(timeUntilAnnounce);
    1798                                 break;
    1799                         case Torrent._TrackerQueued:
    1800                                 announceState = 'Announce is queued';
    1801                                 break;
    1802                         case Torrent._TrackerInactive:
    1803                                 announceState = tracker.isBackup ?
    1804                                         'Tracker will be used as a backup' :
    1805                                         'Announce not scheduled';
    1806                                 break;
    1807                         default:
    1808                                 announceState = 'unknown announce state: ' + tracker.announceState;
    1809                 }
    1810                 return announceState;
    1811         },
    1812 
    1813         lastScrapeStatus: function(tracker) {
    1814                 var lastScrapeLabel = 'Last Scrape';
    1815                 var lastScrape = 'N/A';
    1816                 if (tracker.hasScraped) {
    1817                         var lastScrapeTime = Transmission.fmt.timestamp(tracker.lastScrapeTime);
    1818                         if (tracker.lastScrapeSucceeded) {
    1819                                 lastScrape = lastScrapeTime;
    1820                         } else {
    1821                                 lastScrapeLabel = 'Scrape error';
    1822                                 lastScrape = (tracker.lastScrapeResult ? tracker.lastScrapeResult + ' - ' : '') + lastScrapeTime;
    1823                         }
    1824                 }
    1825                 return {'label':lastScrapeLabel, 'value':lastScrape};
    1826         },
    1827 
    1828         inspectorSelectionChanged: function()
    1829         {
    1830                 var i;
    1831 
    1832                 // if the inspector's hidden, don't create new ones
    1833                 if (this.inspectorIsVisible())
    1834                 {
    1835                         // update the inspector when a selected torrent's data changes.
    1836                         $(this.getAllTorrents()).unbind('dataChanged.inspector');
    1837                         $(this.getSelectedTorrents()).bind('dataChanged.inspector', $.proxy(this.updateInspector,this));
    1838 
    1839                         // periodically ask for updates to the inspector's torrents
    1840                         i = this._inspector;
    1841                         clearInterval(i.refreshInterval);
    1842                         i.refreshInterval = setInterval($.proxy(this.refreshInspectorTorrents,this), 2000);
    1843                         this.refreshInspectorTorrents();
    1844 
    1845                         // refresh the inspector's UI
    1846                         this.updateInspector();
    1847                 }
    1848         },
    1849 
    18501364        toggleInspector: function()
    18511365        {
     
    18661380                setInnerHTML($('ul li#context_toggle_inspector')[0], (visible?'Hide':'Show')+' Inspector');
    18671381
    1868                 this.inspectorSelectionChanged();
     1382                if (visible)
     1383                        this.inspector.setTorrents(this.getSelectedTorrents());
    18691384        },
    18701385
Note: See TracChangeset for help on using the changeset viewer.