Dateigrösse: 11.08 kb
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