Changeset 10804


Ignore:
Timestamp:
Jun 19, 2010, 6:40:07 PM (12 years ago)
Author:
charles
Message:

(trunk web) add a more flexible speed / size formatter to the web client

Location:
trunk/web/javascript
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/web/javascript/common.js

    r10802 r10804  
    109109
    110110/*
    111  *   Converts file & folder byte size values to more
    112  *   readable values (bytes, KiB, MiB, GiB or TiB).
    113  *
    114  *   @param integer bytes
    115  *   @returns string
    116  */
    117 Math.formatBytes = function(bytes) {
    118     var size;
    119     var unit;
    120 
    121     // Terabytes (TiB).
    122     if ( bytes >= 1099511627776 ) {
    123         size = bytes / 1099511627776;
    124         unit = ' TiB';
    125 
    126     // Gigabytes (GiB).
    127     } else if ( bytes >= 1073741824 ) {
    128         size = bytes / 1073741824;
    129         unit = ' GiB';
    130 
    131     // Megabytes (MiB).
    132     } else if ( bytes >= 1048576 ) {
    133         size = bytes / 1048576;
    134         unit = ' MiB';
    135 
    136     // Kilobytes (KiB).
    137     } else if ( bytes >= 1024 ) {
    138         size = bytes / 1024;
    139         unit = ' KiB';
    140 
    141     // The file is less than one KiB
    142     } else {
    143         size = bytes;
    144         unit = ' bytes';
    145     }
    146        
    147         // Single-digit numbers have greater precision
    148         var precision = 1;
    149         if (size < 10) {
    150             precision = 2;
    151         }
    152         size = Math.roundWithPrecision(size, precision);
    153 
    154         // Add the decimal if this is an integer
    155         if ((size % 1) == 0 && unit != ' bytes') {
    156                 size = size + '.0';
    157         }
    158 
    159     return size + unit;
    160 };
    161 
    162 
    163 /*
    164  *   Converts seconds to more readable units (hours, minutes etc).
    165  *
    166  *   @param integer seconds
    167  *   @returns string
    168  */
    169 Math.formatSeconds = function(seconds)
    170 {
    171         var result;
    172         var days = Math.floor(seconds / 86400);
    173         var hours = Math.floor((seconds % 86400) / 3600);
    174         var minutes = Math.floor((seconds % 3600) / 60);
    175         var seconds = Math.floor((seconds % 3600) % 60);
    176 
    177         if (days > 0 && hours == 0)
    178                 result = days + ' days';
    179         else if (days > 0 && hours > 0)
    180                 result = days + ' days ' + hours + ' hr';
    181         else if (hours > 0 && minutes == 0)
    182                 result = hours + ' hr';
    183         else if (hours > 0 && minutes > 0)
    184                 result = hours + ' hr ' + minutes + ' min';
    185         else if (minutes > 0 && seconds == 0)
    186                 result = minutes + ' min';
    187         else if (minutes > 0 && seconds > 0)
    188                 result = minutes + ' min ' + seconds + ' seconds';
    189         else
    190                 result = seconds + ' seconds';
    191 
    192         return result;
    193 };
    194 
    195 
    196 /*
    197  *   Converts a unix timestamp to a human readable value
    198  *
    199  *   @param integer seconds
    200  *   @returns string
    201  */
    202 Math.formatTimestamp = function(seconds) {
    203         var myDate = new Date(seconds*1000);
    204         var now = new Date();
    205 
    206         var date = "";
    207         var time = "";
    208 
    209         var sameYear = now.getFullYear() == myDate.getFullYear();
    210         var sameMonth = now.getMonth() == myDate.getMonth();
    211 
    212         var dateDiff = now.getDate() - myDate.getDate();
    213         if(sameYear && sameMonth && Math.abs(dateDiff) <= 1){
    214                 if(dateDiff == 0){
    215                         date = "Today";
    216                 }
    217                 else if(dateDiff == 1){
    218                         date = "Yesterday";
    219                 }
    220                 else{
    221                         date = "Tomorrow";
    222                 }
    223         }
    224         else{
    225                 date = myDate.toDateString();
    226         }
    227 
    228         var hours = myDate.getHours();
    229         var period = "AM";
    230         if(hours > 12){
    231                 hours = hours - 12;
    232                 period = "PM";
    233         }
    234         if(hours == 0){
    235                 hours = 12;
    236         }
    237         if(hours < 10){
    238                 hours = "0" + hours;
    239         }
    240         var minutes = myDate.getMinutes();
    241         if(minutes < 10){
    242                 minutes = "0" + minutes;
    243         }
    244         var seconds = myDate.getSeconds();
    245                 if(seconds < 10){
    246                         seconds = "0" + seconds;
    247         }
    248 
    249         time = [hours, minutes, seconds].join(':');
    250 
    251         return [date, time, period].join(' ');
    252 };
    253 
    254 /*
    255111 *   Round a float to a specified number of decimal
    256112 *   places, stripping trailing zeroes
  • trunk/web/javascript/torrent.js

    r10802 r10804  
    436436        },
    437437
     438        formatUL: function() {
     439                return 'UL: ' + Transmission.fmt.speed(this._upload_speed);
     440        },
     441        formatDL: function() {
     442                return 'DL: ' + Transmission.fmt.speed(this._download_speed);
     443        },
     444
    438445        getPeerDetails: function()
    439446        {
     
    454461                        case Torrent._StatusDownloading:
    455462                                if(compact_mode){
    456                                         c = 'DL: '
    457                                         c += Math.formatBytes(this._download_speed);
    458                                         c += '/s UL: ';
    459                                         c += Math.formatBytes(this._upload_speed);
    460                                         c += '/s';
     463                                        c = this.formatDL();
     464                                        c += ' ';
     465                                        c += this.formatUL();
    461466                                } else {
    462467                                        // 'Downloading from 36 of 40 peers - DL: 60.2 KiB/s UL: 4.3 KiB/s'
     
    465470                                        c += ' of ';
    466471                                        c += this._peers_connected;
    467                                         c += ' peers - DL: ';
    468                                         c += Math.formatBytes(this._download_speed);
    469                                         c += '/s UL: ';
    470                                         c += Math.formatBytes(this._upload_speed);
    471                                         c += '/s';
     472                                        c += ' peers - ';
     473                                        c = this.formatDL();
     474                                        c += ' ';
     475                                        c += this.formatUL();
    472476                                }
    473477                                break;
     
    475479                        case Torrent._StatusSeeding:
    476480                                if(compact_mode){
    477                                         c = 'UL: '
    478                                         c += Math.formatBytes(this._upload_speed);
    479                                         c += '/s';
     481                                        c += this.formatUL();
    480482                                } else {
    481483                                        // 'Seeding to 13 of 22 peers - UL: 36.2 KiB/s'
     
    484486                                        c += ' of ';
    485487                                        c += this._peers_connected;
    486                                         c += ' peers - UL: ';
    487                                         c += Math.formatBytes(this._upload_speed);
    488                                         c += '/s';
     488                                        c += ' peers - ';
     489                                        c += this.formatUL();
    489490                                }
    490491                                break;
     
    556557                                        eta += 'remaining time unknown';
    557558                                else
    558                                         eta += Math.formatSeconds(this._eta) + ' remaining';
     559                                        eta += Transmission.fmt.timeInterval(this._eta) + ' remaining';
    559560                        }
    560561                       
    561562                        // Create the 'progress details' label
    562563                        // Eg: '101 MiB of 631 MiB (16.02%) - 2 hr remaining'
    563                         c = Math.formatBytes( this._sizeWhenDone - this._leftUntilDone );
     564                        c = Transmission.fmt.size( this._sizeWhenDone - this._leftUntilDone );
    564565                        c += ' of ';
    565                         c += Math.formatBytes( this._sizeWhenDone );
     566                        c += Transmission.fmt.size( this._sizeWhenDone );
    566567                        c += ' (';
    567568                        c += this.getPercentDoneStr();
     
    597598                                        eta += 'remaining time unknown';
    598599                                else
    599                                         eta += Math.formatSeconds(this._eta) + ' remaining';
     600                                        eta += Transmission.fmt.timeInterval(this._eta) + ' remaining';
    600601                        }
    601602
    602603                        // Create the 'progress details' label
    603604                        // Eg: '698.05 MiB, uploaded 8.59 GiB (Ratio: 12.3)'
    604                         c = Math.formatBytes( this._size );
     605                        c = Transmission.fmt.size( this._size );
    605606                        c += ', uploaded ';
    606                         c += Math.formatBytes( this._upload_total );
     607                        c += Transmission.fmt.size( this._upload_total );
    607608                        c += ' (Ratio ';
    608609                        if(this._upload_ratio > -1)
     
    958959       
    959960        refreshProgressHTML: function() {
    960                 var c = Math.formatBytes(this._done);
     961                var c = Transmission.fmt.size(this._done);
    961962                c += ' of ';
    962                 c += Math.formatBytes(this._size);
     963                c += Transmission.fmt.size(this._size);
    963964                c += ' (';
    964965                c += Math.ratio(100 * this._done, this._size);
  • trunk/web/javascript/transmission.js

    r10802 r10804  
    882882                        t = "Click to enable Temporary Speed Limits";
    883883                }
    884                 t += " (" + this._prefs[RPC._TurtleUpSpeedLimit] + " kB/s up, "
    885                           + this._prefs[RPC._TurtleDownSpeedLimit] + " kB/s down)";
     884                t += " (" + Transmission.fmt.speed(this._prefs[RPC._TurtleUpSpeedLimit]) + " up, "
     885                          + Transmission.fmt.speed(this._prefs[RPC._TurtleDownSpeedLimit]) + " down)";
    886886                w.attr( 'title', t );
    887887        },
     
    951951                if (!iPhone)
    952952                {
    953                         setInnerHTML( $('#limited_download_rate')[0], 'Limit (' + down_limit + ' KiB/s)' );
     953                        setInnerHTML( $('#limited_download_rate')[0], 'Limit (' + Transmission.fmt.speed(down_limit) + ')' );
    954954                        var key = down_limited ? '#limited_download_rate'
    955955                                               : '#unlimited_download_rate';
    956956                        $(key).deselectMenuSiblings().selectMenuItem();
    957957               
    958                         setInnerHTML( $('#limited_upload_rate')[0], 'Limit (' + up_limit + ' KiB/s)' );
     958                        setInnerHTML( $('#limited_download_rate')[0], 'Limit (' + Transmission.fmt.speed(up_limit) + ')' );
    959959                        key = up_limited ? '#limited_upload_rate'
    960960                                         : '#unlimited_upload_rate';
     
    10031003                var total = stats["cumulative-stats"];
    10041004
    1005                 setInnerHTML( $('#stats_session_uploaded')[0], Math.formatBytes(session["uploadedBytes"]) );
    1006                 setInnerHTML( $('#stats_session_downloaded')[0], Math.formatBytes(session["downloadedBytes"]) );
     1005                setInnerHTML( $('#stats_session_uploaded')[0], Transmission.fmt.size(session["uploadedBytes"]) );
     1006                setInnerHTML( $('#stats_session_downloaded')[0], Transmission.fmt.size(session["downloadedBytes"]) );
    10071007                setInnerHTML( $('#stats_session_ratio')[0], Math.ratio(session["uploadedBytes"],session["downloadedBytes"]));
    1008                 setInnerHTML( $('#stats_session_duration')[0], Math.formatSeconds(session["secondsActive"]) );
     1008                setInnerHTML( $('#stats_session_duration')[0], Transmission.fmt.timeInterval(session["secondsActive"]) );
    10091009                setInnerHTML( $('#stats_total_count')[0], total["sessionCount"] + " times" );
    1010                 setInnerHTML( $('#stats_total_uploaded')[0], Math.formatBytes(total["uploadedBytes"]) );
    1011                 setInnerHTML( $('#stats_total_downloaded')[0], Math.formatBytes(total["downloadedBytes"]) );
     1010                setInnerHTML( $('#stats_total_uploaded')[0], Transmission.fmt.size(total["uploadedBytes"]) );
     1011                setInnerHTML( $('#stats_total_downloaded')[0], Transmission.fmt.size(total["downloadedBytes"]) );
    10121012                setInnerHTML( $('#stats_total_ratio')[0], Math.ratio(total["uploadedBytes"],total["downloadedBytes"]));
    1013                 setInnerHTML( $('#stats_total_duration')[0], Math.formatSeconds(total["secondsActive"]) );
     1013                setInnerHTML( $('#stats_total_duration')[0], Transmission.fmt.timeInterval(total["secondsActive"]) );
    10141014        },
    10151015
     
    10701070                                        args[RPC._DownSpeedLimited] = false;
    10711071                                } else {
    1072                                         setInnerHTML( $('#limited_download_rate')[0], 'Limit (' + rate + ' KiB/s)' );
     1072                                        setInnerHTML( $('#limited_download_rate')[0], 'Limit (' + Transmission.fmt.speed(rate) + ')' );
    10731073                                        $('#limited_download_rate').deselectMenuSiblings().selectMenuItem();
    10741074                                        $('div.preference input#download_rate')[0].value = rate;
     
    10881088                                        args[RPC._UpSpeedLimited] = false;
    10891089                                } else {
    1090                                         setInnerHTML( $('#limited_upload_rate')[0], 'Limit (' + rate + ' KiB/s)' );
     1090                                        setInnerHTML( $('#limited_upload_rate')[0], 'Limit (' + Transmission.fmt.speed(rate) + ')' );
    10911091                                        $('#limited_upload_rate').deselectMenuSiblings().selectMenuItem();
    10921092                                        $('div.preference input#upload_rate')[0].value = rate;
     
    11541154                var download_dir = 'N/A';
    11551155                var date_created = 'N/A';
    1156                 var error = '';
     1156                var error = 'None';
    11571157                var hash = 'N/A';
    11581158                var have_public = false;
     
    12271227
    12281228                        hash = t.hash();
    1229                         pieces = t._pieceCount + ', ' + Math.formatBytes(t._pieceSize);
    1230                         date_created = Math.formatTimestamp( t._creator_date );
     1229                        pieces = t._pieceCount + ', ' + Transmission.fmt.size(t._pieceSize);
     1230                        date_created = Transmission.fmt.timestamp( t._creator_date );
    12311231                }
    12321232
     
    12601260
    12611261                setInnerHTML( tab.name, name );
    1262                 setInnerHTML( tab.size, torrents.length ? Math.formatBytes( total_size ) : na );
     1262                setInnerHTML( tab.size, torrents.length ? Transmission.fmt.size( total_size ) : na );
    12631263                setInnerHTML( tab.pieces, pieces );
    12641264                setInnerHTML( tab.hash, hash );
    12651265                setInnerHTML( tab.state, total_state );
    1266                 setInnerHTML( tab.download_speed, torrents.length ? Math.formatBytes( total_download_speed ) + '/s' : na );
    1267                 setInnerHTML( tab.upload_speed, torrents.length ? Math.formatBytes( total_upload_speed ) + '/s' : na );
    1268                 setInnerHTML( tab.uploaded, torrents.length ? Math.formatBytes( total_upload ) : na );
    1269                 setInnerHTML( tab.downloaded, torrents.length ? Math.formatBytes( total_download ) : na );
     1266                setInnerHTML( tab.download_speed, torrents.length ? Transmission.fmt.speed( total_download_speed ) : na );
     1267                setInnerHTML( tab.upload_speed, torrents.length ? Transmission.fmt.speed( total_upload_speed ) : na );
     1268                setInnerHTML( tab.uploaded, torrents.length ? Transmission.fmt.size( total_upload ) : na );
     1269                setInnerHTML( tab.downloaded, torrents.length ? Transmission.fmt.size( total_download ) : na );
    12701270                setInnerHTML( tab.availability, torrents.length ? Math.ratio( total_availability*100, sizeWhenDone ) + '%' : na );
    12711271                setInnerHTML( tab.ratio, torrents.length ? Math.ratio( total_upload, total_download ) : na );
    1272                 setInnerHTML( tab.have, torrents.length ? Math.formatBytes(total_completed) + ' (' + Math.formatBytes(total_verified) + ' verified)' : na );
     1272                setInnerHTML( tab.have, torrents.length ? Transmission.fmt.size(total_completed) + ' (' + Transmission.fmt.size(total_verified) + ' verified)' : na );
    12731273                setInnerHTML( tab.upload_to, torrents.length ? total_upload_peers : na );
    12741274                setInnerHTML( tab.download_from, torrents.length ? total_download_peers : na );
     
    13261326                                html += '<tr class="inspector_peer_entry ' + parity + '">';
    13271327                                html += '<td>' + (peer.isEncrypted ? '<img src="images/graphics/lock_icon.png" alt="Encrypted"/>' : '') + '</td>';
    1328                                 html += '<td>' + (peer.rateToPeer ? Math.formatBytes(peer.rateToPeer) + '/s' : '') + '</td>';
    1329                                 html += '<td>' + (peer.rateToClient ? Math.formatBytes(peer.rateToClient) + '/s' : '') + '</td>';
     1328                                html += '<td>' + Transmission.fmt.speed(peer.rateToPeer) + '</td>';
     1329                                html += '<td>' + Transmission.fmt.speed(peer.rateToClient) + '</td>';
    13301330                                html += '<td class="percentCol">' + Math.floor(peer.progress*100) + '%' + '</td>';
    13311331                                html += '<td>' + peer.flagStr + '</td>';
     
    13791379                var lastAnnounce = 'N/A';
    13801380                if (tracker.hasAnnounced) {
    1381                         var lastAnnounceTime = Math.formatTimestamp(tracker.lastAnnounceTime);
     1381                        var lastAnnounceTime = Transmission.fmt.timestamp(tracker.lastAnnounceTime);
    13821382                        if (tracker.lastAnnounceSucceeded) {
    13831383                                lastAnnounce = lastAnnounceTime;
     
    14041404                                        timeUntilAnnounce = 0;
    14051405                                }
    1406                                 announceState = 'Next announce in ' + Math.formatSeconds(timeUntilAnnounce);
     1406                                announceState = 'Next announce in ' + Transmission.fmt.timeInterval(timeUntilAnnounce);
    14071407                                break;
    14081408                        case Torrent._TrackerQueued:
     
    14241424                var lastScrape = 'N/A';
    14251425                if (tracker.hasScraped) {
    1426                         var lastScrapeTime = Math.formatTimestamp(tracker.lastScrapeTime);
     1426                        var lastScrapeTime = Transmission.fmt.timestamp(tracker.lastScrapeTime);
    14271427                        if (tracker.lastScrapeSucceeded) {
    14281428                                lastScrape = lastScrapeTime;
     
    16861686               
    16871687                // update the speeds
    1688                 s = Math.formatBytes( upSpeed ) + '/s';
     1688                s = Transmission.fmt.speed( upSpeed );
    16891689                if( iPhone ) s = 'UL: ' + s;
    16901690                setInnerHTML( $('#torrent_global_upload')[0], s );
    16911691               
    16921692                // download speeds
    1693                 s = Math.formatBytes( downSpeed ) + '/s';
     1693                s = Transmission.fmt.speed( downSpeed );
    16941694                if( iPhone ) s = 'DL: ' + s;
    16951695                setInnerHTML( $('#torrent_global_download')[0], s );
Note: See TracChangeset for help on using the changeset viewer.