123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- // 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(/^<w#>/) ) {
- wgAjaxWatch.watching = true;
- wgAjaxWatch.setLinkText(wgAjaxWatch.unwatchMsg);
- wgAjaxWatch.setLinkID("ca-unwatch");
- wgAjaxWatch.setHref( 'unwatch' );
- } else if( response.match(/^<u#>/) ) {
- wgAjaxWatch.watching = false;
- wgAjaxWatch.setLinkText(wgAjaxWatch.watchMsg);
- wgAjaxWatch.setLinkID("ca-watch");
- wgAjaxWatch.setHref( 'watch' );
- } else {
- // Either we got a <err#> 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(/^<w#>/) ? "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);
|