Mercurial > defr > drupal > core
diff misc/progress.js @ 1:c1f4ac30525a 6.0
Drupal 6.0
author | Franck Deroche <webmaster@defr.org> |
---|---|
date | Tue, 23 Dec 2008 14:28:28 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/progress.js Tue Dec 23 14:28:28 2008 +0100 @@ -0,0 +1,107 @@ +// $Id: progress.js,v 1.20 2008/01/04 11:53:21 goba Exp $ + +/** + * A progressbar object. Initialized with the given id. Must be inserted into + * the DOM afterwards through progressBar.element. + * + * method is the function which will perform the HTTP request to get the + * progress bar state. Either "GET" or "POST". + * + * e.g. pb = new progressBar('myProgressBar'); + * some_element.appendChild(pb.element); + */ +Drupal.progressBar = function (id, updateCallback, method, errorCallback) { + var pb = this; + this.id = id; + this.method = method || "GET"; + this.updateCallback = updateCallback; + this.errorCallback = errorCallback; + + this.element = document.createElement('div'); + this.element.id = id; + this.element.className = 'progress'; + $(this.element).html('<div class="bar"><div class="filled"></div></div>'+ + '<div class="percentage"></div>'+ + '<div class="message"> </div>'); +}; + +/** + * Set the percentage and status message for the progressbar. + */ +Drupal.progressBar.prototype.setProgress = function (percentage, message) { + if (percentage >= 0 && percentage <= 100) { + $('div.filled', this.element).css('width', percentage +'%'); + $('div.percentage', this.element).html(percentage +'%'); + } + $('div.message', this.element).html(message); + if (this.updateCallback) { + this.updateCallback(percentage, message, this); + } +}; + +/** + * Start monitoring progress via Ajax. + */ +Drupal.progressBar.prototype.startMonitoring = function (uri, delay) { + this.delay = delay; + this.uri = uri; + this.sendPing(); +}; + +/** + * Stop monitoring progress via Ajax. + */ +Drupal.progressBar.prototype.stopMonitoring = function () { + clearTimeout(this.timer); + // This allows monitoring to be stopped from within the callback + this.uri = null; +}; + +/** + * Request progress data from server. + */ +Drupal.progressBar.prototype.sendPing = function () { + if (this.timer) { + clearTimeout(this.timer); + } + if (this.uri) { + var pb = this; + // When doing a post request, you need non-null data. Otherwise a + // HTTP 411 or HTTP 406 (with Apache mod_security) error may result. + $.ajax({ + type: this.method, + url: this.uri, + data: '', + dataType: 'json', + success: function (progress) { + // Display errors + if (progress.status == 0) { + pb.displayError(progress.data); + return; + } + // Update display + pb.setProgress(progress.percentage, progress.message); + // Schedule next timer + pb.timer = setTimeout(function() { pb.sendPing(); }, pb.delay); + }, + error: function (xmlhttp) { + pb.displayError(Drupal.ahahError(xmlhttp, pb.uri)); + } + }); + } +}; + +/** + * Display errors on the page. + */ +Drupal.progressBar.prototype.displayError = function (string) { + var error = document.createElement('div'); + error.className = 'error'; + error.innerHTML = string; + + $(this.element).before(error).hide(); + + if (this.errorCallback) { + this.errorCallback(this); + } +};