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