// dependencies: // * ajax.js: /*extern sajax_init_object, sajax_do_call */ // * wikibits.js: /*extern changeText, akeytt, hookEvent, jsMsg */ // These should have been initialized in the generated js /*extern wgAjaxWatch, wgPageName */ if(typeof wgAjaxWatch === "undefined" || !wgAjaxWatch) { var wgAjaxWatch = { watchMsg: "Watch", unwatchMsg: "Unwatch", watchingMsg: "Watching...", unwatchingMsg: "Unwatching..." }; } wgAjaxWatch.supported = true; // supported on current page and by browser wgAjaxWatch.watching = false; // currently watching page wgAjaxWatch.inprogress = false; // ajax request in progress wgAjaxWatch.timeoutID = null; // see wgAjaxWatch.ajaxCall wgAjaxWatch.watchLinks = []; // "watch"/"unwatch" links wgAjaxWatch.setLinkText = function(newText) { for (i = 0; i < wgAjaxWatch.watchLinks.length; i++) { changeText(wgAjaxWatch.watchLinks[i], newText); } }; wgAjaxWatch.setLinkID = function(newId) { // We can only set the first one wgAjaxWatch.watchLinks[0].setAttribute( 'id', newId ); akeytt(newId); // update tooltips for Monobook }; wgAjaxWatch.setHref = function( string ) { for( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) { if( string == 'watch' ) { wgAjaxWatch.watchLinks[i].href = wgAjaxWatch.watchLinks[i].href .replace( /&action=unwatch/, '&action=watch' ); } else if( string == 'unwatch' ) { wgAjaxWatch.watchLinks[i].href = wgAjaxWatch.watchLinks[i].href .replace( /&action=watch/, '&action=unwatch' ); } } } wgAjaxWatch.ajaxCall = function() { if(!wgAjaxWatch.supported) { return true; } else if (wgAjaxWatch.inprogress) { return false; } if(!wfSupportsAjax()) { // Lazy initialization so we don't toss up // ActiveX warnings on initial page load // for IE 6 users with security settings. wgAjaxWatch.supported = false; return true; } wgAjaxWatch.inprogress = true; wgAjaxWatch.setLinkText( wgAjaxWatch.watching ? wgAjaxWatch.unwatchingMsg : wgAjaxWatch.watchingMsg); sajax_do_call( "wfAjaxWatch", [wgPageName, (wgAjaxWatch.watching ? "u" : "w")], wgAjaxWatch.processResult ); // if the request isn't done in 10 seconds, allow user to try again wgAjaxWatch.timeoutID = window.setTimeout( function() { wgAjaxWatch.inprogress = false; }, 10000 ); return false; }; wgAjaxWatch.processResult = function(request) { if(!wgAjaxWatch.supported) { return; } var response = request.responseText; if( response.match(/^/) ) { wgAjaxWatch.watching = true; wgAjaxWatch.setLinkText(wgAjaxWatch.unwatchMsg); wgAjaxWatch.setLinkID("ca-unwatch"); wgAjaxWatch.setHref( 'unwatch' ); } else if( response.match(/^/) ) { wgAjaxWatch.watching = false; wgAjaxWatch.setLinkText(wgAjaxWatch.watchMsg); wgAjaxWatch.setLinkID("ca-watch"); wgAjaxWatch.setHref( 'watch' ); } else { // Either we got a error code or it just plain broke. window.location.href = wgAjaxWatch.watchLinks[0].href; return; } jsMsg( response.substr(4), 'watch' ); wgAjaxWatch.inprogress = false; if(wgAjaxWatch.timeoutID) { window.clearTimeout(wgAjaxWatch.timeoutID); } // Bug 12395 - avoid some watch link confusion on edit var watchthis = document.getElementById("wpWatchthis"); if( watchthis && response.match(/^<[uw]#>/) ) { watchthis.checked = response.match(/^/) ? "checked" : ""; } return; }; wgAjaxWatch.onLoad = function() { // This document structure hardcoding sucks. We should make a class and // toss all this out the window. var el1 = document.getElementById("ca-unwatch"); var el2 = null; if (!el1) { el1 = document.getElementById("mw-unwatch-link1"); el2 = document.getElementById("mw-unwatch-link2"); } if(el1) { wgAjaxWatch.watching = true; } else { wgAjaxWatch.watching = false; el1 = document.getElementById("ca-watch"); if (!el1) { el1 = document.getElementById("mw-watch-link1"); el2 = document.getElementById("mw-watch-link2"); } if(!el1) { wgAjaxWatch.supported = false; return; } } // The id can be either for the parent (Monobook-based) or the element // itself (non-Monobook) wgAjaxWatch.watchLinks.push( el1.tagName.toLowerCase() == "a" ? el1 : el1.firstChild ); if( el2 ) { wgAjaxWatch.watchLinks.push( el2 ); } // I couldn't get for (watchLink in wgAjaxWatch.watchLinks) to work, if // you can be my guest. for( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) { wgAjaxWatch.watchLinks[i].onclick = wgAjaxWatch.ajaxCall; } return; }; hookEvent("load", wgAjaxWatch.onLoad);