--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/includes/clientside/static/upload.js Sat Aug 21 23:31:36 2010 -0400
@@ -0,0 +1,202 @@
+window.AjaxUpload = function(formid)
+{
+ load_component(['jquery', 'jquery-ui', 'l10n']);
+
+ var theform = document.getElementById(formid);
+ theform.AjaxUpload = this;
+ this.form = theform;
+
+ $(this.form).submit(function()
+ {
+ return this.AjaxUpload.presubmit();
+ });
+};
+
+window.zeropad = function(i, ndig)
+{
+ var s = String(i);
+ while ( s.length < ndig )
+ s = '0' + s;
+ return s;
+}
+
+window.humanize_time = function(secs)
+{
+ var seconds = secs % 60;
+ var minutes = (secs - seconds) / 60;
+ if ( minutes >= 60 )
+ {
+ var hours = (minutes - (minutes % 60)) / 60;
+ minutes = minutes % 60;
+ return zeropad(hours, 2) + ':' + zeropad(minutes, 2) + ':' + zeropad(seconds, 2);
+ }
+ return zeropad(minutes, 2) + ':' + zeropad(seconds, 2);
+}
+
+AjaxUpload.prototype.cancelbit = false;
+
+AjaxUpload.prototype.status = function(state)
+ {
+ if ( state.done )
+ {
+ $('div.wait-box', this.statusbox).text($lang.get('upload_msg_processing'));
+ $('div.progress', this.statusbox).progressbar('value', 100);
+ }
+ else if ( state.cancel_upload )
+ {
+ if ( window.stop )
+ window.stop();
+ else if ( document.execCommand )
+ document.execCommand('Stop');
+ $('div.wait-box', this.statusbox).addClass('error-box').removeClass('wait-box').text($lang.get('upload_msg_cancelled'));
+
+ $('div.progress', this.statusbox).progressbar('value', 100).addClass('ui-progressbar-failure');
+ }
+ else
+ {
+ var rawpct = state.bytes_processed / state.content_length;
+ var pct = (Math.round((rawpct) * 1000)) / 10;
+ var elapsed = state.current_time - state.start_time;
+ var rawbps = state.bytes_processed / elapsed;
+ var kbps = Math.round((rawbps) / 1024);
+ var remain_bytes = state.content_length - state.bytes_processed;
+ var remain_time = Math.round(remain_bytes / rawbps);
+ if ( pct > 0 )
+ $('div.wait-box', this.statusbox).text($lang.get('upload_msg_uploading', {
+ percent: pct,
+ elapsed: humanize_time(elapsed),
+ speed: kbps,
+ remain: humanize_time(remain_time)
+ }))
+ .append('<br /><a href="#" class="cancel"></a>');
+ else
+ $('div.wait-box', this.statusbox).text($lang.get('upload_msg_starting'))
+ .append('<br /><a href="#" class="cancel"></a>');
+
+ var au = this;
+ $('a.cancel', this.statusbox).text($lang.get('upload_btn_cancel')).click(function()
+ {
+ au.cancel();
+ return false;
+ });
+
+ $('div.progress', this.statusbox).progressbar('value', pct);
+ }
+ };
+
+AjaxUpload.prototype.cancel = function()
+ {
+ this.cancelbit = true;
+ };
+
+AjaxUpload.prototype.refresh_status = function(au)
+ {
+ try
+ {
+ var cancelbit = au.cancelbit ? '&cancel=true' : '';
+ au.cancelbit = false;
+ ajaxGet(makeUrlNS('Special', 'AjaxUpload', 'form=' + au.form.id + '&uploadstatus=' + au.key + cancelbit), au._incoming_status);
+ }
+ catch (e)
+ {
+ alert(e);
+ }
+ };
+
+AjaxUpload.prototype._incoming_status = function(ajax)
+ {
+ if ( ajax.readyState == 4 )
+ {
+ var state = parseJSON(ajax.responseText);
+ if ( state )
+ {
+ var au = document.getElementById(state.form).AjaxUpload;
+ au.status(state);
+
+ if ( !state.done && !state.cancel_upload )
+ setTimeout(function()
+ {
+ au.refresh_status(au)
+ }, 250);
+ }
+ }
+ };
+
+AjaxUpload.prototype.presubmit = function()
+ {
+ try
+ {
+ // create status container and target iframe
+ this.statusbox = document.createElement('div');
+ this.iframe = document.createElement('iframe');
+ this.iframe.AjaxUpload = this;
+ $(this.iframe)
+ .attr('src', 'about:blank')
+ .attr('width', '1')
+ .attr('height', '1')
+ .attr('frameborder', '0')
+ .css('visibility', 'hidden')
+ .attr('name', this.form.id + '_frame')
+ .load(this._frame_onload);
+
+ this.form.parentNode.insertBefore(this.statusbox, this.form);
+ this.form.parentNode.insertBefore(this.iframe, this.form);
+ this.form.target = this.form.id + '_frame';
+
+ this.upload_start();
+
+ var have_progress_support = this.form.progress_support.value == 'true';
+ if ( have_progress_support )
+ {
+ this.key = this.form[this.form.upload_progress_name.value].value;
+ this.refresh_status(this);
+ }
+ }
+ catch ( e )
+ {
+ console.debug(e);
+ return false;
+ }
+
+ return true;
+ };
+
+AjaxUpload.prototype._frame_onload = function()
+ {
+ var childbody = window[this.AjaxUpload.form.id + '_frame'].document.getElementsByTagName('body')[0];
+ window[this.AjaxUpload.form.id + '_frame'].document.close();
+ this.AjaxUpload.upload_success(childbody);
+ };
+
+AjaxUpload.prototype.upload_start = function()
+ {
+ $(this.statusbox).html('<div class="wait-box">' + $lang.get('upload_msg_starting') + '</div><div class="progress" style="margin-top: 10px;"></div>');
+ $('div.progress', this.statusbox).progressbar({ value: 0 });
+ $(this.form).hide();
+ };
+
+AjaxUpload.prototype.upload_success = function(childbody)
+ {
+ $(this.statusbox).html('<div class="info-box">Upload complete! Result from server:' + childbody.innerHTML + '</div>');
+ $('div.info-box', this.statusbox).append('<a href="#">Reset!</a>');
+ var form_id = this.form.id;
+ $('div.info-box a', this.statusbox).click(function()
+ {
+ try
+ {
+ var au = document.getElementById(form_id).AjaxUpload;
+ au.reset();
+ }
+ catch(e) {};
+ return false;
+ });
+ };
+
+AjaxUpload.prototype.reset = function()
+ {
+ this.iframe.parentNode.removeChild(this.iframe);
+ this.statusbox.parentNode.removeChild(this.statusbox);
+ delete(window[this.form.id + '_frame']);
+ $('form#' + this.form.id).show();
+ return false;
+ };