Mercurial > defr > drupal > core
comparison 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 |
comparison
equal
deleted
inserted
replaced
0:5a113a1c4740 | 1:c1f4ac30525a |
---|---|
1 // $Id: progress.js,v 1.20 2008/01/04 11:53:21 goba Exp $ | |
2 | |
3 /** | |
4 * A progressbar object. Initialized with the given id. Must be inserted into | |
5 * the DOM afterwards through progressBar.element. | |
6 * | |
7 * method is the function which will perform the HTTP request to get the | |
8 * progress bar state. Either "GET" or "POST". | |
9 * | |
10 * e.g. pb = new progressBar('myProgressBar'); | |
11 * some_element.appendChild(pb.element); | |
12 */ | |
13 Drupal.progressBar = function (id, updateCallback, method, errorCallback) { | |
14 var pb = this; | |
15 this.id = id; | |
16 this.method = method || "GET"; | |
17 this.updateCallback = updateCallback; | |
18 this.errorCallback = errorCallback; | |
19 | |
20 this.element = document.createElement('div'); | |
21 this.element.id = id; | |
22 this.element.className = 'progress'; | |
23 $(this.element).html('<div class="bar"><div class="filled"></div></div>'+ | |
24 '<div class="percentage"></div>'+ | |
25 '<div class="message"> </div>'); | |
26 }; | |
27 | |
28 /** | |
29 * Set the percentage and status message for the progressbar. | |
30 */ | |
31 Drupal.progressBar.prototype.setProgress = function (percentage, message) { | |
32 if (percentage >= 0 && percentage <= 100) { | |
33 $('div.filled', this.element).css('width', percentage +'%'); | |
34 $('div.percentage', this.element).html(percentage +'%'); | |
35 } | |
36 $('div.message', this.element).html(message); | |
37 if (this.updateCallback) { | |
38 this.updateCallback(percentage, message, this); | |
39 } | |
40 }; | |
41 | |
42 /** | |
43 * Start monitoring progress via Ajax. | |
44 */ | |
45 Drupal.progressBar.prototype.startMonitoring = function (uri, delay) { | |
46 this.delay = delay; | |
47 this.uri = uri; | |
48 this.sendPing(); | |
49 }; | |
50 | |
51 /** | |
52 * Stop monitoring progress via Ajax. | |
53 */ | |
54 Drupal.progressBar.prototype.stopMonitoring = function () { | |
55 clearTimeout(this.timer); | |
56 // This allows monitoring to be stopped from within the callback | |
57 this.uri = null; | |
58 }; | |
59 | |
60 /** | |
61 * Request progress data from server. | |
62 */ | |
63 Drupal.progressBar.prototype.sendPing = function () { | |
64 if (this.timer) { | |
65 clearTimeout(this.timer); | |
66 } | |
67 if (this.uri) { | |
68 var pb = this; | |
69 // When doing a post request, you need non-null data. Otherwise a | |
70 // HTTP 411 or HTTP 406 (with Apache mod_security) error may result. | |
71 $.ajax({ | |
72 type: this.method, | |
73 url: this.uri, | |
74 data: '', | |
75 dataType: 'json', | |
76 success: function (progress) { | |
77 // Display errors | |
78 if (progress.status == 0) { | |
79 pb.displayError(progress.data); | |
80 return; | |
81 } | |
82 // Update display | |
83 pb.setProgress(progress.percentage, progress.message); | |
84 // Schedule next timer | |
85 pb.timer = setTimeout(function() { pb.sendPing(); }, pb.delay); | |
86 }, | |
87 error: function (xmlhttp) { | |
88 pb.displayError(Drupal.ahahError(xmlhttp, pb.uri)); | |
89 } | |
90 }); | |
91 } | |
92 }; | |
93 | |
94 /** | |
95 * Display errors on the page. | |
96 */ | |
97 Drupal.progressBar.prototype.displayError = function (string) { | |
98 var error = document.createElement('div'); | |
99 error.className = 'error'; | |
100 error.innerHTML = string; | |
101 | |
102 $(this.element).before(error).hide(); | |
103 | |
104 if (this.errorCallback) { | |
105 this.errorCallback(this); | |
106 } | |
107 }; |