Quelltext der Datei: http://www.michaelster.ch/jsTestFolder/wikipedia/flaggedrevs.js

Dateigrösse: 11.08 kb

[Anzeige ohne Zeilennummern]


  1 /* -- (c) Aaron Schulz, Daniel Arnold 2008 */
  2 
  3 /* Every time you change this JS please bump $wgFlaggedRevStyleVersion in FlaggedRevs.php */
  4 
  5 /* Hide rating clutter */
  6 function enable_showhide() {
  7     var toggle = document.getElementById('mw-revisiontoggle');
  8     if( !toggle ) return;
  9     toggle.style.display = 'inline';
 10     var ratings = document.getElementById('mw-revisionratings');
 11     if( !ratings ) return;
 12     ratings.style.display = 'none';
 13 }
 14 
 15 /* Toggles ratings */
 16 function toggleRevRatings() {
 17     var ratings = document.getElementById('mw-revisionratings');
 18     if( !ratings ) return;
 19     if( ratings.style.display == 'none' ) {
 20         ratings.style.display = 'inline';
 21     } else {
 22         ratings.style.display = 'none';
 23     }
 24 }
 25 
 26 /*
 27 * a) Disable submit in case of invalid input.
 28 * b) Update colors when select changes (Opera already does this).
 29 * c) Also remove comment box clutter in case of invalid input.
 30 */
 31 function updateRatingForm() {
 32     var ratingform = document.getElementById('mw-ratingselects');
 33     if( !ratingform ) return;
 34     var disabled = document.getElementById('fr-rating-controls-disabled');
 35     if( disabled ) return;
 36 
 37     var quality = true;
 38     var allzero = true;
 39     var somezero = false;
 40 
 41     for( tag in wgFlaggedRevsParams.tags ) {
 42         var controlName = "wp" + tag;
 43         var levels = document.getElementsByName(controlName);
 44         var selectedlevel = 0; // default
 45 
 46         if( levels[0].nodeName == 'SELECT' ) {
 47             selectedlevel = levels[0].selectedIndex;
 48             // Update color. Opera does this already, and doing so
 49             // seems to kill custom pretty opera skin form styling.
 50             if( navigator.appName != 'Opera') {
 51                 levels[0].className = 'fr-rating-option-' + selectedlevel;
 52             }
 53         } else if( levels[0].type == 'radio' ) {
 54             for( i = 0; i < levels.length; i++ ) {
 55                 if( levels[i].checked ) {
 56                     selectedlevel = i;
 57                     break;
 58                 }
 59             }
 60         } else if( levels[0].type == 'checkbox' ) {
 61             selectedlevel = (levels[0].checked) ? 1: 0;
 62         } else {
 63             return; // error: should not happen
 64         }
 65 
 66         // Get quality level for this tag
 67         qualityLevel = wgFlaggedRevsParams.tags[tag];
 68 
 69         if( selectedlevel < qualityLevel ) {
 70             quality = false; // not a quality review
 71         }
 72         if( selectedlevel > 0 ) {
 73             allzero = false;
 74         } else {
 75             somezero = true;
 76         }
 77     }
 78     showComment = (quality || allzero) ? true : false;
 79     // Show comment box only for quality revs or depreciated ones
 80     var commentbox = document.getElementById('mw-commentbox');
 81     if( commentbox ) {
 82         commentbox.style.display = showComment ? 'inline' : 'none';
 83     }
 84     // Show note box only for quality revs
 85     var notebox = document.getElementById('mw-notebox');
 86     if( notebox ) {
 87         notebox.style.display = quality ? 'inline' : 'none';
 88     }
 89     // If only a few levels are zero, don't show submit link
 90     var submit = document.getElementById('submitreview');
 91     submit.disabled = ( somezero && !allzero ) ? 'disabled' : '';
 92     var comment = document.getElementById('wpReason');
 93     // Clear comment box data if not shown
 94     if( comment ) {
 95         comment.disabled = ( somezero && !allzero ) ? 'disabled' : '';
 96         comment.value = showComment ? comment.value : '';
 97     }
 98     // Clear note box data if not shown
 99     var notes = document.getElementById('wpNotes');
100     if( notes ) {
101         notes.value = quality ? notes.value : '';
102     }
103 }
104 
105 /*
106 * Update colors when select changes (Opera already does this).
107 */
108 function updateFeedbackForm() {
109     var somezero = false;
110     var ratingform = document.getElementById('mw-feedbackselects');
111     if( !ratingform ) return;
112     for( tag in wgFlaggedRevsParams2.tags ) {
113         var controlName = "wp" + tag;
114         var levels = document.getElementsByName(controlName);
115         var selectedlevel = 2; // default
116         if( levels[0].nodeName == 'SELECT' ) {
117             selectedlevel = levels[0].selectedIndex;
118             // Update color. Opera does this already, and doing so
119             // seems to kill custom pretty opera skin form styling.
120             if( navigator.appName != 'Opera') {
121                 levels[0].className = 'fr-rating-option-' + (4 - selectedlevel);
122             }
123             if( selectedlevel > 4 ) {
124                 somezero = true;
125             }
126         }
127     }
128     var submit = document.getElementById('submitfeedback');
129     submit.disabled = somezero ? 'disabled' : '';
130 }
131 
132 addOnloadHook(enable_showhide);
133 addOnloadHook(updateRatingForm);
134 addOnloadHook(updateFeedbackForm);
135 
136 // dependencies:
137 // * ajax.js:
138   /*extern sajax_init_object, sajax_do_call */
139 // * wikibits.js:
140   /*extern hookEvent, jsMsg */
141 
142 // These should have been initialized in the generated js
143 if( typeof wgAjaxFeedback === "undefined" || !wgAjaxFeedback ) {
144     wgAjaxFeedback = {
145         sendingMsg: "Submitting...",
146         sentMsg: "Thank you!"
147     };
148 }
149 
150 wgAjaxFeedback.supported = true; // supported on current page and by browser
151 wgAjaxFeedback.inprogress = false; // ajax request in progress
152 wgAjaxFeedback.timeoutID = null; // see wgAjaxFeedback.ajaxCall
153 
154 wgAjaxFeedback.ajaxCall = function() {
155     if( !wgAjaxFeedback.supported ) {
156         return true;
157     } else if( wgAjaxFeedback.inprogress ) {
158         return false;
159     }
160     if( !wfSupportsAjax() ) {
161         // Lazy initialization so we don't toss up
162         // ActiveX warnings on initial page load
163         // for IE 6 users with security settings.
164         wgAjaxFeedback.supported = false;
165         return true;
166     }
167     var form = document.getElementById("mw-feedbackform");
168     var submit = document.getElementById("submitfeedback");
169     if( !form || !submit ) {
170         return false;
171     }
172     wgAjaxFeedback.inprogress = true;
173     submit.disabled = "disabled";
174     submit.value = wgAjaxFeedback.sendingMsg;
175     // Build up arguments
176     var args = [];
177     var inputs = form.getElementsByTagName("input");
178     for( var i=0; i < inputs.length; i++) {
179         // Ignore some useless items...
180         if( inputs[i].name != "title" && inputs[i].type != "submit" ) {
181             args.push( inputs[i].name + "|" + inputs[i].value );
182         }
183     }
184     var selects = form.getElementsByTagName("select");
185     for( var i=0; i < selects.length; i++) {
186         // Get the selected tag level...
187         if( selects[i].selectedIndex >= 0 ) {
188             var soption = selects[i].getElementsByTagName("option")[selects[i].selectedIndex];
189             args.push( selects[i].name + "|" + soption.value );
190         }
191         selects[i].disabled = "disabled";
192     }
193     // Send!
194     sajax_do_call( "ReaderFeedback::AjaxReview", args, wgAjaxFeedback.processResult );
195     // If the request isn't done in 10 seconds, allow user to try again
196     wgAjaxFeedback.timeoutID = window.setTimeout(
197         function() { wgAjaxFeedback.inprogress = false; wgAjaxFeedback.unlockForm() },
198         10000
199     );
200     return false;
201 };
202 
203 wgAjaxFeedback.unlockForm = function() {
204     var form = document.getElementById("mw-feedbackform");
205     var submit = document.getElementById("submitfeedback");
206     if( !form || !submit ) {
207         return false;
208     }
209     submit.disabled = "";
210     var selects = form.getElementsByTagName("select");
211     for( var i=0; i < selects.length; i++) {
212         selects[i].disabled = "";
213     }
214 };
215 
216 wgAjaxFeedback.processResult = function(request) {
217     if( !wgAjaxFeedback.supported ) {
218         return;
219     }
220     var response = request.responseText;
221     if( msg = response.substr(6) ) {
222         jsMsg( msg, 'feedback' );
223     }
224     wgAjaxFeedback.inprogress = false;
225     if( wgAjaxFeedback.timeoutID ) {
226         window.clearTimeout(wgAjaxFeedback.timeoutID);
227     }
228     var submit = document.getElementById("submitfeedback");
229     if( submit ) {
230         submit.value = wgAjaxFeedback.sentMsg;
231     }
232     window.scroll(0,0);
233 };
234 
235 wgAjaxFeedback.onLoad = function() {
236     var submit = document.getElementById("submitfeedback");
237     if( submit ) {
238         submit.onclick = wgAjaxFeedback.ajaxCall;
239     }
240 };
241 
242 hookEvent("load", wgAjaxFeedback.onLoad);
243 
244 // These should have been initialized in the generated js
245 if( typeof wgAjaxReview === "undefined" || !wgAjaxReview ) {
246     wgAjaxReview = {
247         sendingMsg: "Submitting...",
248         sentMsg: "Submitted",
249         actioncomplete: "Action complete"
250     };
251 }
252 
253 wgAjaxReview.supported = true; // supported on current page and by browser
254 wgAjaxReview.inprogress = false; // ajax request in progress
255 wgAjaxReview.timeoutID = null; // see wgAjaxFeedback.ajaxCall
256 
257 wgAjaxReview.ajaxCall = function() {
258     if( !wgAjaxReview.supported ) {
259         return true;
260     } else if( wgAjaxReview.inprogress ) {
261         return false;
262     }
263     if( !wfSupportsAjax() ) {
264         // Lazy initialization so we don't toss up
265         // ActiveX warnings on initial page load
266         // for IE 6 users with security settings.
267         wgAjaxReview.supported = false;
268         return true;
269     }
270     var form = document.getElementById("mw-reviewform");
271     var notes = document.getElementById("wpNotes");
272     var reason = document.getElementById("wpReason");
273     if( !form ) {
274         return false;
275     }
276     wgAjaxReview.inprogress = true;
277     // Build up arguments
278     var args = [];
279     var inputs = form.getElementsByTagName("input");
280     for( var i=0; i < inputs.length; i++) {
281         // Different input types may occur depending on tags...
282         if( inputs[i].name == "title" || inputs[i].name == "action" ) {
283             // No need to send these...
284         } else if( inputs[i].type == "submit" ) {
285             inputs[i].value = wgAjaxReview.sendingMsg;
286         } else if( inputs[i].type == "checkbox" ) {
287             args.push( inputs[i].name + "|" + (inputs[i].checked ? 1 : 0) );
288         } else if( inputs[i].type != "radio" || inputs[i].checked ) {
289             args.push( inputs[i].name + "|" + inputs[i].value );
290         }
291         inputs[i].disabled = "disabled";
292     }
293     if( notes ) {
294         args.push( notes.name + "|" + notes.value );
295         notes.disabled = "disabled";
296     }
297     var selects = form.getElementsByTagName("select");
298     for( var i=0; i < selects.length; i++) {
299         // Get the selected tag level...
300         if( selects[i].selectedIndex >= 0 ) {
301             var soption = selects[i].getElementsByTagName("option")[selects[i].selectedIndex];
302             args.push( selects[i].name + "|" + soption.value );
303         }
304         selects[i].disabled = "disabled";
305     }
306     // Send!
307     var old = sajax_request_type;
308     sajax_request_type = "POST";
309     sajax_do_call( "RevisionReview::AjaxReview", args, wgAjaxReview.processResult );
310     sajax_request_type = old;
311     // If the request isn't done in 30 seconds, allow user to try again
312     wgAjaxReview.timeoutID = window.setTimeout(
313         function() { wgAjaxReview.inprogress = false; wgAjaxReview.unlockForm() },
314         30000
315     );
316     return false;
317 };
318 
319 wgAjaxReview.unlockForm = function() {
320     var form = document.getElementById("mw-reviewform");
321     var submit = document.getElementById("submitreview");
322     var notes = document.getElementById("wpNotes");
323     var reason = document.getElementById("wpReason");
324     if( !form || !submit ) {
325         return false;
326     }
327     submit.disabled = "";
328     if( notes ) {
329         notes.disabled = "";
330     }
331     if( reason ) {
332         reason.disabled = "";
333     }
334     var selects = form.getElementsByTagName("select");
335     for( var i=0; i < selects.length; i++) {
336         selects[i].disabled = "";
337     }
338 };
339 
340 wgAjaxReview.processResult = function(request) {
341     if( !wgAjaxReview.supported ) {
342         return;
343     }
344     var response = request.responseText;
345     if( msg = response.substr(6) ) {
346         jsMsg( msg, 'review' );
347     }
348     wgAjaxReview.inprogress = false;
349     if( wgAjaxReview.timeoutID ) {
350         window.clearTimeout(wgAjaxReview.timeoutID);
351     }
352     var submit = document.getElementById("submitreview");
353     if( submit ) {
354         submit.value = wgAjaxReview.sentMsg;
355     }
356     window.scroll(0,0);
357     wgAjaxReview.unlockForm();
358     document.title = wgAjaxReview.actioncomplete;
359 };
360 
361 wgAjaxReview.onLoad = function() {
362     var submit = document.getElementById("submitreview");
363     if( submit ) {
364         submit.onclick = wgAjaxReview.ajaxCall;
365     }
366 };
367 
368 hookEvent("load", wgAjaxReview.onLoad);
369