<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[12083] branches/2.8/wp-includes/js/swfupload/plugins/swfupload.speed.js:
  Set eol-style</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.wordpress.org/changeset/12083">12083</a></dd>
<dt>Author</dt> <dd>ryan</dd>
<dt>Date</dt> <dd>2009-10-21 15:17:57 +0000 (Wed, 21 Oct 2009)</dd>
</dl>

<h3>Log Message</h3>
<pre>Set eol-style</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branches28wpincludesjsswfuploadpluginsswfuploadspeedjs">branches/2.8/wp-includes/js/swfupload/plugins/swfupload.speed.js</a></li>
</ul>

<h3>Property Changed</h3>
<ul>
<li><a href="#branches28wpincludesjsswfuploadpluginsswfuploadspeedjs">branches/2.8/wp-includes/js/swfupload/plugins/swfupload.speed.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branches28wpincludesjsswfuploadpluginsswfuploadspeedjs"></a>
<div class="modfile"><h4>Modified: branches/2.8/wp-includes/js/swfupload/plugins/swfupload.speed.js (12082 => 12083)</h4>
<pre class="diff"><span>
<span class="info">--- branches/2.8/wp-includes/js/swfupload/plugins/swfupload.speed.js        2009-10-21 14:30:51 UTC (rev 12082)
+++ branches/2.8/wp-includes/js/swfupload/plugins/swfupload.speed.js        2009-10-21 15:17:57 UTC (rev 12083)
</span><span class="lines">@@ -1,342 +1,342 @@
</span><del>-/*
-        Speed Plug-in
-        
-        Features:
-                *Adds several properties to the 'file' object indicated upload speed, time left, upload time, etc.
-                        - currentSpeed -- String indicating the upload speed, bytes per second
-                        - averageSpeed -- Overall average upload speed, bytes per second
-                        - movingAverageSpeed -- Speed over averaged over the last several measurements, bytes per second
-                        - timeRemaining -- Estimated remaining upload time in seconds
-                        - timeElapsed -- Number of seconds passed for this upload
-                        - percentUploaded -- Percentage of the file uploaded (0 to 100)
-                        - sizeUploaded -- Formatted size uploaded so far, bytes
-                
-                *Adds setting 'moving_average_history_size' for defining the window size used to calculate the moving average speed.
-                
-                *Adds several Formatting functions for formatting that values provided on the file object.
-                        - SWFUpload.speed.formatBPS(bps) -- outputs string formatted in the best units (Gbps, Mbps, Kbps, bps)
-                        - SWFUpload.speed.formatTime(seconds) -- outputs string formatted in the best units (x Hr y M z S)
-                        - SWFUpload.speed.formatSize(bytes) -- outputs string formatted in the best units (w GB x MB y KB z B )
-                        - SWFUpload.speed.formatPercent(percent) -- outputs string formatted with a percent sign (x.xx %)
-                        - SWFUpload.speed.formatUnits(baseNumber, divisionArray, unitLabelArray, fractionalBoolean)
-                                - Formats a number using the division array to determine how to apply the labels in the Label Array
-                                - factionalBoolean indicates whether the number should be returned as a single fractional number with a unit (speed)
-                                    or as several numbers labeled with units (time)
-        */
-
-var SWFUpload;
-if (typeof(SWFUpload) === &quot;function&quot;) {
-        SWFUpload.speed = {};
-        
-        SWFUpload.prototype.initSettings = (function (oldInitSettings) {
-                return function () {
-                        if (typeof(oldInitSettings) === &quot;function&quot;) {
-                                oldInitSettings.call(this);
-                        }
-                        
-                        this.ensureDefault = function (settingName, defaultValue) {
-                                this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
-                        };
-
-                        // List used to keep the speed stats for the files we are tracking
-                        this.fileSpeedStats = {};
-                        this.speedSettings = {};
-
-                        this.ensureDefault(&quot;moving_average_history_size&quot;, &quot;10&quot;);
-                        
-                        this.speedSettings.user_file_queued_handler = this.settings.file_queued_handler;
-                        this.speedSettings.user_file_queue_error_handler = this.settings.file_queue_error_handler;
-                        this.speedSettings.user_upload_start_handler = this.settings.upload_start_handler;
-                        this.speedSettings.user_upload_error_handler = this.settings.upload_error_handler;
-                        this.speedSettings.user_upload_progress_handler = this.settings.upload_progress_handler;
-                        this.speedSettings.user_upload_success_handler = this.settings.upload_success_handler;
-                        this.speedSettings.user_upload_complete_handler = this.settings.upload_complete_handler;
-                        
-                        this.settings.file_queued_handler = SWFUpload.speed.fileQueuedHandler;
-                        this.settings.file_queue_error_handler = SWFUpload.speed.fileQueueErrorHandler;
-                        this.settings.upload_start_handler = SWFUpload.speed.uploadStartHandler;
-                        this.settings.upload_error_handler = SWFUpload.speed.uploadErrorHandler;
-                        this.settings.upload_progress_handler = SWFUpload.speed.uploadProgressHandler;
-                        this.settings.upload_success_handler = SWFUpload.speed.uploadSuccessHandler;
-                        this.settings.upload_complete_handler = SWFUpload.speed.uploadCompleteHandler;
-                        
-                        delete this.ensureDefault;
-                };
-        })(SWFUpload.prototype.initSettings);
-
-        
-        SWFUpload.speed.fileQueuedHandler = function (file) {
-                if (typeof this.speedSettings.user_file_queued_handler === &quot;function&quot;) {
-                        file = SWFUpload.speed.extendFile(file);
-                        
-                        return this.speedSettings.user_file_queued_handler.call(this, file);
-                }
-        };
-        
-        SWFUpload.speed.fileQueueErrorHandler = function (file, errorCode, message) {
-                if (typeof this.speedSettings.user_file_queue_error_handler === &quot;function&quot;) {
-                        file = SWFUpload.speed.extendFile(file);
-                        
-                        return this.speedSettings.user_file_queue_error_handler.call(this, file, errorCode, message);
-                }
-        };
-
-        SWFUpload.speed.uploadStartHandler = function (file) {
-                if (typeof this.speedSettings.user_upload_start_handler === &quot;function&quot;) {
-                        file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
-                        return this.speedSettings.user_upload_start_handler.call(this, file);
-                }
-        };
-        
-        SWFUpload.speed.uploadErrorHandler = function (file, errorCode, message) {
-                file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
-                SWFUpload.speed.removeTracking(file, this.fileSpeedStats);
-
-                if (typeof this.speedSettings.user_upload_error_handler === &quot;function&quot;) {
-                        return this.speedSettings.user_upload_error_handler.call(this, file, errorCode, message);
-                }
-        };
-        SWFUpload.speed.uploadProgressHandler = function (file, bytesComplete, bytesTotal) {
-                this.updateTracking(file, bytesComplete);
-                file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
-
-                if (typeof this.speedSettings.user_upload_progress_handler === &quot;function&quot;) {
-                        return this.speedSettings.user_upload_progress_handler.call(this, file, bytesComplete, bytesTotal);
-                }
-        };
-        
-        SWFUpload.speed.uploadSuccessHandler = function (file, serverData) {
-                if (typeof this.speedSettings.user_upload_success_handler === &quot;function&quot;) {
-                        file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
-                        return this.speedSettings.user_upload_success_handler.call(this, file, serverData);
-                }
-        };
-        SWFUpload.speed.uploadCompleteHandler = function (file) {
-                file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
-                SWFUpload.speed.removeTracking(file, this.fileSpeedStats);
-
-                if (typeof this.speedSettings.user_upload_complete_handler === &quot;function&quot;) {
-                        return this.speedSettings.user_upload_complete_handler.call(this, file);
-                }
-        };
-        
-        // Private: extends the file object with the speed plugin values
-        SWFUpload.speed.extendFile = function (file, trackingList) {
-                var tracking;
-                
-                if (trackingList) {
-                        tracking = trackingList[file.id];
-                }
-                
-                if (tracking) {
-                        file.currentSpeed = tracking.currentSpeed;
-                        file.averageSpeed = tracking.averageSpeed;
-                        file.movingAverageSpeed = tracking.movingAverageSpeed;
-                        file.timeRemaining = tracking.timeRemaining;
-                        file.timeElapsed = tracking.timeElapsed;
-                        file.percentUploaded = tracking.percentUploaded;
-                        file.sizeUploaded = tracking.bytesUploaded;
-
-                } else {
-                        file.currentSpeed = 0;
-                        file.averageSpeed = 0;
-                        file.movingAverageSpeed = 0;
-                        file.timeRemaining = 0;
-                        file.timeElapsed = 0;
-                        file.percentUploaded = 0;
-                        file.sizeUploaded = 0;
-                }
-                
-                return file;
-        };
-        
-        // Private: Updates the speed tracking object, or creates it if necessary
-        SWFUpload.prototype.updateTracking = function (file, bytesUploaded) {
-                var tracking = this.fileSpeedStats[file.id];
-                if (!tracking) {
-                        this.fileSpeedStats[file.id] = tracking = {};
-                }
-                
-                // Sanity check inputs
-                bytesUploaded = bytesUploaded || tracking.bytesUploaded || 0;
-                if (bytesUploaded &lt; 0) {
-                        bytesUploaded = 0;
-                }
-                if (bytesUploaded &gt; file.size) {
-                        bytesUploaded = file.size;
-                }
-                
-                var tickTime = (new Date()).getTime();
-                if (!tracking.startTime) {
-                        tracking.startTime = (new Date()).getTime();
-                        tracking.lastTime = tracking.startTime;
-                        tracking.currentSpeed = 0;
-                        tracking.averageSpeed = 0;
-                        tracking.movingAverageSpeed = 0;
-                        tracking.movingAverageHistory = [];
-                        tracking.timeRemaining = 0;
-                        tracking.timeElapsed = 0;
-                        tracking.percentUploaded = bytesUploaded / file.size;
-                        tracking.bytesUploaded = bytesUploaded;
-                } else if (tracking.startTime &gt; tickTime) {
-                        this.debug(&quot;When backwards in time&quot;);
-                } else {
-                        // Get time and deltas
-                        var now = (new Date()).getTime();
-                        var lastTime = tracking.lastTime;
-                        var deltaTime = now - lastTime;
-                        var deltaBytes = bytesUploaded - tracking.bytesUploaded;
-                        
-                        if (deltaBytes === 0 || deltaTime === 0) {
-                                return tracking;
-                        }
-                        
-                        // Update tracking object
-                        tracking.lastTime = now;
-                        tracking.bytesUploaded = bytesUploaded;
-                        
-                        // Calculate speeds
-                        tracking.currentSpeed = (deltaBytes * 8 ) / (deltaTime / 1000);
-                        tracking.averageSpeed = (tracking.bytesUploaded * 8) / ((now - tracking.startTime) / 1000);
-
-                        // Calculate moving average
-                        tracking.movingAverageHistory.push(tracking.currentSpeed);
-                        if (tracking.movingAverageHistory.length &gt; this.settings.moving_average_history_size) {
-                                tracking.movingAverageHistory.shift();
-                        }
-                        
-                        tracking.movingAverageSpeed = SWFUpload.speed.calculateMovingAverage(tracking.movingAverageHistory);
-                        
-                        // Update times
-                        tracking.timeRemaining = (file.size - tracking.bytesUploaded) * 8 / tracking.movingAverageSpeed;
-                        tracking.timeElapsed = (now - tracking.startTime) / 1000;
-                        
-                        // Update percent
-                        tracking.percentUploaded = (tracking.bytesUploaded / file.size * 100);
-                }
-                
-                return tracking;
-        };
-        SWFUpload.speed.removeTracking = function (file, trackingList) {
-                try {
-                        trackingList[file.id] = null;
-                        delete trackingList[file.id];
-                } catch (ex) {
-                }
-        };
-        
-        SWFUpload.speed.formatUnits = function (baseNumber, unitDivisors, unitLabels, singleFractional) {
-                var i, unit, unitDivisor, unitLabel;
-
-                if (baseNumber === 0) {
-                        return &quot;0 &quot; + unitLabels[unitLabels.length - 1];
-                }
-                
-                if (singleFractional) {
-                        unit = baseNumber;
-                        unitLabel = unitLabels.length &gt;= unitDivisors.length ? unitLabels[unitDivisors.length - 1] : &quot;&quot;;
-                        for (i = 0; i &lt; unitDivisors.length; i++) {
-                                if (baseNumber &gt;= unitDivisors[i]) {
-                                        unit = (baseNumber / unitDivisors[i]).toFixed(2);
-                                        unitLabel = unitLabels.length &gt;= i ? &quot; &quot; + unitLabels[i] : &quot;&quot;;
-                                        break;
-                                }
-                        }
-                        
-                        return unit + unitLabel;
-                } else {
-                        var formattedStrings = [];
-                        var remainder = baseNumber;
-                        
-                        for (i = 0; i &lt; unitDivisors.length; i++) {
-                                unitDivisor = unitDivisors[i];
-                                unitLabel = unitLabels.length &gt; i ? &quot; &quot; + unitLabels[i] : &quot;&quot;;
-                                
-                                unit = remainder / unitDivisor;
-                                if (i &lt; unitDivisors.length -1) {
-                                        unit = Math.floor(unit);
-                                } else {
-                                        unit = unit.toFixed(2);
-                                }
-                                if (unit &gt; 0) {
-                                        remainder = remainder % unitDivisor;
-                                        
-                                        formattedStrings.push(unit + unitLabel);
-                                }
-                        }
-                        
-                        return formattedStrings.join(&quot; &quot;);
-                }
-        };
-        
-        SWFUpload.speed.formatBPS = function (baseNumber) {
-                var bpsUnits = [1073741824, 1048576, 1024, 1], bpsUnitLabels = [&quot;Gbps&quot;, &quot;Mbps&quot;, &quot;Kbps&quot;, &quot;bps&quot;];
-                return SWFUpload.speed.formatUnits(baseNumber, bpsUnits, bpsUnitLabels, true);
-        
-        };
-        SWFUpload.speed.formatTime = function (baseNumber) {
-                var timeUnits = [86400, 3600, 60, 1], timeUnitLabels = [&quot;d&quot;, &quot;h&quot;, &quot;m&quot;, &quot;s&quot;];
-                return SWFUpload.speed.formatUnits(baseNumber, timeUnits, timeUnitLabels, false);
-        
-        };
-        SWFUpload.speed.formatBytes = function (baseNumber) {
-                var sizeUnits = [1073741824, 1048576, 1024, 1], sizeUnitLabels = [&quot;GB&quot;, &quot;MB&quot;, &quot;KB&quot;, &quot;bytes&quot;];
-                return SWFUpload.speed.formatUnits(baseNumber, sizeUnits, sizeUnitLabels, true);
-        
-        };
-        SWFUpload.speed.formatPercent = function (baseNumber) {
-                return baseNumber.toFixed(2) + &quot; %&quot;;
-        };
-        
-        SWFUpload.speed.calculateMovingAverage = function (history) {
-                var vals = [], size, sum = 0.0, mean = 0.0, varianceTemp = 0.0, variance = 0.0, standardDev = 0.0;
-                var i;
-                var mSum = 0, mCount = 0;
-                
-                size = history.length;
-                
-                // Check for sufficient data
-                if (size &gt;= 8) {
-                        // Clone the array and Calculate sum of the values 
-                        for (i = 0; i &lt; size; i++) {
-                                vals[i] = history[i];
-                                sum += vals[i];
-                        }
-
-                        mean = sum / size;
-
-                        // Calculate variance for the set
-                        for (i = 0; i &lt; size; i++) {
-                                varianceTemp += Math.pow((vals[i] - mean), 2);
-                        }
-
-                        variance = varianceTemp / size;
-                        standardDev = Math.sqrt(variance);
-                        
-                        //Standardize the Data
-                        for (i = 0; i &lt; size; i++) {
-                                vals[i] = (vals[i] - mean) / standardDev;
-                        }
-
-                        // Calculate the average excluding outliers
-                        var deviationRange = 2.0;
-                        for (i = 0; i &lt; size; i++) {
-                                
-                                if (vals[i] &lt;= deviationRange &amp;&amp; vals[i] &gt;= -deviationRange) {
-                                        mCount++;
-                                        mSum += history[i];
-                                }
-                        }
-                        
-                } else {
-                        // Calculate the average (not enough data points to remove outliers)
-                        mCount = size;
-                        for (i = 0; i &lt; size; i++) {
-                                mSum += history[i];
-                        }
-                }
-
-                return mSum / mCount;
-        };
-        
</del><ins>+/*
+        Speed Plug-in
+        
+        Features:
+                *Adds several properties to the 'file' object indicated upload speed, time left, upload time, etc.
+                        - currentSpeed -- String indicating the upload speed, bytes per second
+                        - averageSpeed -- Overall average upload speed, bytes per second
+                        - movingAverageSpeed -- Speed over averaged over the last several measurements, bytes per second
+                        - timeRemaining -- Estimated remaining upload time in seconds
+                        - timeElapsed -- Number of seconds passed for this upload
+                        - percentUploaded -- Percentage of the file uploaded (0 to 100)
+                        - sizeUploaded -- Formatted size uploaded so far, bytes
+                
+                *Adds setting 'moving_average_history_size' for defining the window size used to calculate the moving average speed.
+                
+                *Adds several Formatting functions for formatting that values provided on the file object.
+                        - SWFUpload.speed.formatBPS(bps) -- outputs string formatted in the best units (Gbps, Mbps, Kbps, bps)
+                        - SWFUpload.speed.formatTime(seconds) -- outputs string formatted in the best units (x Hr y M z S)
+                        - SWFUpload.speed.formatSize(bytes) -- outputs string formatted in the best units (w GB x MB y KB z B )
+                        - SWFUpload.speed.formatPercent(percent) -- outputs string formatted with a percent sign (x.xx %)
+                        - SWFUpload.speed.formatUnits(baseNumber, divisionArray, unitLabelArray, fractionalBoolean)
+                                - Formats a number using the division array to determine how to apply the labels in the Label Array
+                                - factionalBoolean indicates whether the number should be returned as a single fractional number with a unit (speed)
+                                    or as several numbers labeled with units (time)
+        */
+
+var SWFUpload;
+if (typeof(SWFUpload) === &quot;function&quot;) {
+        SWFUpload.speed = {};
+        
+        SWFUpload.prototype.initSettings = (function (oldInitSettings) {
+                return function () {
+                        if (typeof(oldInitSettings) === &quot;function&quot;) {
+                                oldInitSettings.call(this);
+                        }
+                        
+                        this.ensureDefault = function (settingName, defaultValue) {
+                                this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
+                        };
+
+                        // List used to keep the speed stats for the files we are tracking
+                        this.fileSpeedStats = {};
+                        this.speedSettings = {};
+
+                        this.ensureDefault(&quot;moving_average_history_size&quot;, &quot;10&quot;);
+                        
+                        this.speedSettings.user_file_queued_handler = this.settings.file_queued_handler;
+                        this.speedSettings.user_file_queue_error_handler = this.settings.file_queue_error_handler;
+                        this.speedSettings.user_upload_start_handler = this.settings.upload_start_handler;
+                        this.speedSettings.user_upload_error_handler = this.settings.upload_error_handler;
+                        this.speedSettings.user_upload_progress_handler = this.settings.upload_progress_handler;
+                        this.speedSettings.user_upload_success_handler = this.settings.upload_success_handler;
+                        this.speedSettings.user_upload_complete_handler = this.settings.upload_complete_handler;
+                        
+                        this.settings.file_queued_handler = SWFUpload.speed.fileQueuedHandler;
+                        this.settings.file_queue_error_handler = SWFUpload.speed.fileQueueErrorHandler;
+                        this.settings.upload_start_handler = SWFUpload.speed.uploadStartHandler;
+                        this.settings.upload_error_handler = SWFUpload.speed.uploadErrorHandler;
+                        this.settings.upload_progress_handler = SWFUpload.speed.uploadProgressHandler;
+                        this.settings.upload_success_handler = SWFUpload.speed.uploadSuccessHandler;
+                        this.settings.upload_complete_handler = SWFUpload.speed.uploadCompleteHandler;
+                        
+                        delete this.ensureDefault;
+                };
+        })(SWFUpload.prototype.initSettings);
+
+        
+        SWFUpload.speed.fileQueuedHandler = function (file) {
+                if (typeof this.speedSettings.user_file_queued_handler === &quot;function&quot;) {
+                        file = SWFUpload.speed.extendFile(file);
+                        
+                        return this.speedSettings.user_file_queued_handler.call(this, file);
+                }
+        };
+        
+        SWFUpload.speed.fileQueueErrorHandler = function (file, errorCode, message) {
+                if (typeof this.speedSettings.user_file_queue_error_handler === &quot;function&quot;) {
+                        file = SWFUpload.speed.extendFile(file);
+                        
+                        return this.speedSettings.user_file_queue_error_handler.call(this, file, errorCode, message);
+                }
+        };
+
+        SWFUpload.speed.uploadStartHandler = function (file) {
+                if (typeof this.speedSettings.user_upload_start_handler === &quot;function&quot;) {
+                        file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
+                        return this.speedSettings.user_upload_start_handler.call(this, file);
+                }
+        };
+        
+        SWFUpload.speed.uploadErrorHandler = function (file, errorCode, message) {
+                file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
+                SWFUpload.speed.removeTracking(file, this.fileSpeedStats);
+
+                if (typeof this.speedSettings.user_upload_error_handler === &quot;function&quot;) {
+                        return this.speedSettings.user_upload_error_handler.call(this, file, errorCode, message);
+                }
+        };
+        SWFUpload.speed.uploadProgressHandler = function (file, bytesComplete, bytesTotal) {
+                this.updateTracking(file, bytesComplete);
+                file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
+
+                if (typeof this.speedSettings.user_upload_progress_handler === &quot;function&quot;) {
+                        return this.speedSettings.user_upload_progress_handler.call(this, file, bytesComplete, bytesTotal);
+                }
+        };
+        
+        SWFUpload.speed.uploadSuccessHandler = function (file, serverData) {
+                if (typeof this.speedSettings.user_upload_success_handler === &quot;function&quot;) {
+                        file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
+                        return this.speedSettings.user_upload_success_handler.call(this, file, serverData);
+                }
+        };
+        SWFUpload.speed.uploadCompleteHandler = function (file) {
+                file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
+                SWFUpload.speed.removeTracking(file, this.fileSpeedStats);
+
+                if (typeof this.speedSettings.user_upload_complete_handler === &quot;function&quot;) {
+                        return this.speedSettings.user_upload_complete_handler.call(this, file);
+                }
+        };
+        
+        // Private: extends the file object with the speed plugin values
+        SWFUpload.speed.extendFile = function (file, trackingList) {
+                var tracking;
+                
+                if (trackingList) {
+                        tracking = trackingList[file.id];
+                }
+                
+                if (tracking) {
+                        file.currentSpeed = tracking.currentSpeed;
+                        file.averageSpeed = tracking.averageSpeed;
+                        file.movingAverageSpeed = tracking.movingAverageSpeed;
+                        file.timeRemaining = tracking.timeRemaining;
+                        file.timeElapsed = tracking.timeElapsed;
+                        file.percentUploaded = tracking.percentUploaded;
+                        file.sizeUploaded = tracking.bytesUploaded;
+
+                } else {
+                        file.currentSpeed = 0;
+                        file.averageSpeed = 0;
+                        file.movingAverageSpeed = 0;
+                        file.timeRemaining = 0;
+                        file.timeElapsed = 0;
+                        file.percentUploaded = 0;
+                        file.sizeUploaded = 0;
+                }
+                
+                return file;
+        };
+        
+        // Private: Updates the speed tracking object, or creates it if necessary
+        SWFUpload.prototype.updateTracking = function (file, bytesUploaded) {
+                var tracking = this.fileSpeedStats[file.id];
+                if (!tracking) {
+                        this.fileSpeedStats[file.id] = tracking = {};
+                }
+                
+                // Sanity check inputs
+                bytesUploaded = bytesUploaded || tracking.bytesUploaded || 0;
+                if (bytesUploaded &lt; 0) {
+                        bytesUploaded = 0;
+                }
+                if (bytesUploaded &gt; file.size) {
+                        bytesUploaded = file.size;
+                }
+                
+                var tickTime = (new Date()).getTime();
+                if (!tracking.startTime) {
+                        tracking.startTime = (new Date()).getTime();
+                        tracking.lastTime = tracking.startTime;
+                        tracking.currentSpeed = 0;
+                        tracking.averageSpeed = 0;
+                        tracking.movingAverageSpeed = 0;
+                        tracking.movingAverageHistory = [];
+                        tracking.timeRemaining = 0;
+                        tracking.timeElapsed = 0;
+                        tracking.percentUploaded = bytesUploaded / file.size;
+                        tracking.bytesUploaded = bytesUploaded;
+                } else if (tracking.startTime &gt; tickTime) {
+                        this.debug(&quot;When backwards in time&quot;);
+                } else {
+                        // Get time and deltas
+                        var now = (new Date()).getTime();
+                        var lastTime = tracking.lastTime;
+                        var deltaTime = now - lastTime;
+                        var deltaBytes = bytesUploaded - tracking.bytesUploaded;
+                        
+                        if (deltaBytes === 0 || deltaTime === 0) {
+                                return tracking;
+                        }
+                        
+                        // Update tracking object
+                        tracking.lastTime = now;
+                        tracking.bytesUploaded = bytesUploaded;
+                        
+                        // Calculate speeds
+                        tracking.currentSpeed = (deltaBytes * 8 ) / (deltaTime / 1000);
+                        tracking.averageSpeed = (tracking.bytesUploaded * 8) / ((now - tracking.startTime) / 1000);
+
+                        // Calculate moving average
+                        tracking.movingAverageHistory.push(tracking.currentSpeed);
+                        if (tracking.movingAverageHistory.length &gt; this.settings.moving_average_history_size) {
+                                tracking.movingAverageHistory.shift();
+                        }
+                        
+                        tracking.movingAverageSpeed = SWFUpload.speed.calculateMovingAverage(tracking.movingAverageHistory);
+                        
+                        // Update times
+                        tracking.timeRemaining = (file.size - tracking.bytesUploaded) * 8 / tracking.movingAverageSpeed;
+                        tracking.timeElapsed = (now - tracking.startTime) / 1000;
+                        
+                        // Update percent
+                        tracking.percentUploaded = (tracking.bytesUploaded / file.size * 100);
+                }
+                
+                return tracking;
+        };
+        SWFUpload.speed.removeTracking = function (file, trackingList) {
+                try {
+                        trackingList[file.id] = null;
+                        delete trackingList[file.id];
+                } catch (ex) {
+                }
+        };
+        
+        SWFUpload.speed.formatUnits = function (baseNumber, unitDivisors, unitLabels, singleFractional) {
+                var i, unit, unitDivisor, unitLabel;
+
+                if (baseNumber === 0) {
+                        return &quot;0 &quot; + unitLabels[unitLabels.length - 1];
+                }
+                
+                if (singleFractional) {
+                        unit = baseNumber;
+                        unitLabel = unitLabels.length &gt;= unitDivisors.length ? unitLabels[unitDivisors.length - 1] : &quot;&quot;;
+                        for (i = 0; i &lt; unitDivisors.length; i++) {
+                                if (baseNumber &gt;= unitDivisors[i]) {
+                                        unit = (baseNumber / unitDivisors[i]).toFixed(2);
+                                        unitLabel = unitLabels.length &gt;= i ? &quot; &quot; + unitLabels[i] : &quot;&quot;;
+                                        break;
+                                }
+                        }
+                        
+                        return unit + unitLabel;
+                } else {
+                        var formattedStrings = [];
+                        var remainder = baseNumber;
+                        
+                        for (i = 0; i &lt; unitDivisors.length; i++) {
+                                unitDivisor = unitDivisors[i];
+                                unitLabel = unitLabels.length &gt; i ? &quot; &quot; + unitLabels[i] : &quot;&quot;;
+                                
+                                unit = remainder / unitDivisor;
+                                if (i &lt; unitDivisors.length -1) {
+                                        unit = Math.floor(unit);
+                                } else {
+                                        unit = unit.toFixed(2);
+                                }
+                                if (unit &gt; 0) {
+                                        remainder = remainder % unitDivisor;
+                                        
+                                        formattedStrings.push(unit + unitLabel);
+                                }
+                        }
+                        
+                        return formattedStrings.join(&quot; &quot;);
+                }
+        };
+        
+        SWFUpload.speed.formatBPS = function (baseNumber) {
+                var bpsUnits = [1073741824, 1048576, 1024, 1], bpsUnitLabels = [&quot;Gbps&quot;, &quot;Mbps&quot;, &quot;Kbps&quot;, &quot;bps&quot;];
+                return SWFUpload.speed.formatUnits(baseNumber, bpsUnits, bpsUnitLabels, true);
+        
+        };
+        SWFUpload.speed.formatTime = function (baseNumber) {
+                var timeUnits = [86400, 3600, 60, 1], timeUnitLabels = [&quot;d&quot;, &quot;h&quot;, &quot;m&quot;, &quot;s&quot;];
+                return SWFUpload.speed.formatUnits(baseNumber, timeUnits, timeUnitLabels, false);
+        
+        };
+        SWFUpload.speed.formatBytes = function (baseNumber) {
+                var sizeUnits = [1073741824, 1048576, 1024, 1], sizeUnitLabels = [&quot;GB&quot;, &quot;MB&quot;, &quot;KB&quot;, &quot;bytes&quot;];
+                return SWFUpload.speed.formatUnits(baseNumber, sizeUnits, sizeUnitLabels, true);
+        
+        };
+        SWFUpload.speed.formatPercent = function (baseNumber) {
+                return baseNumber.toFixed(2) + &quot; %&quot;;
+        };
+        
+        SWFUpload.speed.calculateMovingAverage = function (history) {
+                var vals = [], size, sum = 0.0, mean = 0.0, varianceTemp = 0.0, variance = 0.0, standardDev = 0.0;
+                var i;
+                var mSum = 0, mCount = 0;
+                
+                size = history.length;
+                
+                // Check for sufficient data
+                if (size &gt;= 8) {
+                        // Clone the array and Calculate sum of the values 
+                        for (i = 0; i &lt; size; i++) {
+                                vals[i] = history[i];
+                                sum += vals[i];
+                        }
+
+                        mean = sum / size;
+
+                        // Calculate variance for the set
+                        for (i = 0; i &lt; size; i++) {
+                                varianceTemp += Math.pow((vals[i] - mean), 2);
+                        }
+
+                        variance = varianceTemp / size;
+                        standardDev = Math.sqrt(variance);
+                        
+                        //Standardize the Data
+                        for (i = 0; i &lt; size; i++) {
+                                vals[i] = (vals[i] - mean) / standardDev;
+                        }
+
+                        // Calculate the average excluding outliers
+                        var deviationRange = 2.0;
+                        for (i = 0; i &lt; size; i++) {
+                                
+                                if (vals[i] &lt;= deviationRange &amp;&amp; vals[i] &gt;= -deviationRange) {
+                                        mCount++;
+                                        mSum += history[i];
+                                }
+                        }
+                        
+                } else {
+                        // Calculate the average (not enough data points to remove outliers)
+                        mCount = size;
+                        for (i = 0; i &lt; size; i++) {
+                                mSum += history[i];
+                        }
+                }
+
+                return mSum / mCount;
+        };
+        
</ins><span class="cx"> }
</span><span class="cx">\ No newline at end of file
</span><span class="cx">Property changes on: branches/2.8/wp-includes/js/swfupload/plugins/swfupload.speed.js
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:eol-style
</span><span class="cx">   + native
</span></span></pre>
</div>
</div>

</body>
</html>