Nota: Després de desar, heu de netejar la memòria cau del navegador per veure els canvis. En la majoria de navegadors amb Windows o Linux, premeu Ctrl+F5 o bé premeu Shift i cliqueu el botó "Actualitza" (Ctrl i "Actualitza" amb Internet Explorer). Vegeu més informació i instruccions per a cada navegador a Viquipèdia:Neteja de la memòria cau.

(function () {

function HTTPRequest() {
    if (typeof XMLHttpRequest != 'undefined') {
        return new XMLHttpRequest();
    }
    try {
        return new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            return new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {}
    }
    return false;
}
 
/* Page class. Only the title argument is needed. */
var Page = function(title, lang, fam) {
  r = HTTPRequest();
 
  if (typeof(title) == 'undefined') {
    alert("Error: Undefined title of page");
  }
  lang = typeof(lang) != 'undefined' ? lang : wgContentLanguage;
  fam = typeof(fam) != 'undefined' ? fam : 'wikipedia';
 
  /* Returns de title of the page. */
  this.getTitle = function () { return title; }
 
  /* Returns de language of the page. */
  this.getLanguage = function () { return lang; }
 
  /* Returns de family of the page. */
  this.getFamily = function () { return family; }
 
  this.getBaseURL = function () {
    return "http://"+lang+"."+fam+".org";
  }
 
  /* Gets the edit token for editing the page. */
  this.getEditToken = function () {
    var url = this.getBaseURL() + '/w/api.php?format=json&action=query&prop=info&indexpageids=1&intoken=edit&titles='+title;
    r.open('GET', url, false);
    r.send(null);
    var resp = eval('(' + r.responseText + ')');
    return resp['query']['pages'][resp['query']['pageids'][0]]['edittoken'];
  }
 
  /* Gets the move token for moving the page. */
  this.getMoveToken = function () {
    var url = this.getBaseURL() + '/w/api.php?format=json&action=query&prop=info&indexpageids=1&intoken=move&titles='+title;
    r.open('GET', url, false);
    r.send(null);
    var resp = eval('(' + r.responseText + ')');
    return resp['query']['pages'][resp['query']['pageids'][0]]['movetoken'];
  }
 
  /* Returns de wiki content of the page. */
  this.get = function () {
    r = HTTPRequest();
    r.open("GET", this.getBaseURL()+"/w/index.php?title="+title+"&action=raw", false);
    r.send(null);
    return r.responseText;
  }
 
  /* Returns de rendered html content of the page. */
  this.getHTML = function () {
    r.open("GET", this.getBaseURL()+"/w/index.php?title="+title+"&action=render", false);
    r.send(null);
    return r.responseText;
  }
 
  /* Posts content to a page. */
  this.put = function (text, summary) {
       var sum = summary || "";
       var pars = 'action=edit&format=json&title='+encodeURIComponent(title)+'&summary='+encodeURIComponent(sum)+'&text='+encodeURIComponent(text)+'&token=' + encodeURIComponent(this.getEditToken());
       r.open('POST', this.getBaseURL()+"/w/api.php", false);
       r.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
       r.setRequestHeader('Connection', 'keep-alive');
       r.setRequestHeader('Content-length', pars.length);
       r.send(pars);
       e = eval('('+r.responseText+')');
       if (typeof(e["edit"]) != 'undefined') { if (e["edit"]["result"] == "Success") { return true; } }
       else { return e["error"]["code"]; }
  }
 
  /* Moves a page to another one. */
  this.move = function (newtitle) {
       var pars = 'action=move&format=json&from='+title+'&to='+newtitle+'&token=' + encodeURIComponent(this.getMoveToken());
       r.open('POST', this.getBaseURL()+"/w/api.php", false);
       r.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
       r.setRequestHeader('Connection', 'keep-alive');
       r.setRequestHeader('Content-length', pars.length);
       r.send(pars);
       alert(r.responseText);
       e = eval('('+r.responseText+')');
       if (typeof(e["edit"]) != 'undefined') { if (e["edit"]["result"] == "Success") { return true; } }
       else { return e["error"]["code"]; }
  }
}

/* ------------------------------------*/

var topdiv, div, idx = 0, len = 0, table, current;

function getCategory() {
	return $(".CategoryTreeLabelCategory")[idx].innerHTML;
}

function buildTable(all) {
	table = $('<table></table>');
	table.css({
		width: "70%",
		margin: "0 auto",
		borderSpacing: "0px 5px"
	});
	for (var i=0; i<all.length; i++) {
		var title = all[i].title;
		table.append($('<tr><td style="text-align:center;"><a href="/wiki/'+title+'">'+title+'</a></td><td style="text-align:center;"><input type="text"></td><td style="text-align:center;"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Yes_check.svg/20px-Yes_check.svg.png" style="cursor:pointer;width:20px;"></td>'));
	}
	table.find("td").css({
		borderTop: "1px solid steelblue",
		borderBottom: "1px solid steelblue",
		background: "rgba(176, 196, 222, 0.6)",
		padding: "3px"
	});
	table.find("img").click(function () {
		$(this).attr("src", "http://upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif");
		
		var tr = $(this).parent().parent();		
		
		var p = new Page(tr.find("a").text());
		var t = p.get();

		var regexp = new RegExp("\\[\\[categor(ia|y)."+current+"\\|?.*?\\]\\]","i");
		var nt = t.replace(regexp, "[[Categoria:"+current+"|"+tr.find("input").val()+"]]");

		p.put(nt, "Indexant");

		$(this).attr("src", "http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Cornflower_blue_check.svg/20px-Cornflower_blue_check.svg.png");
		//
	});
}

function buildAccions() {
	var accions = $('<div></div>');
	accions.css({
		border: "1px solid steelblue",
		background: "rgba(176, 196, 222, 0.6)",
		width: "70%",
		margin: "0 auto",
		padding: "5px"
	});
	accions.html('<h3>Accions</h3><p><label><input name="i-accio" type="radio" value="agafa_n" id="agafa_n" checked> Agafa la paraula</label> <input type="text" id="paraula_n" value="2" style="width:3em;">.</p><p><label><input name="i-accio" type="radio" value="prefix_n" id="prefix_n" checked> Treu el prefix</label></p><p><label><input name="i-accio" type="radio" value="javascript" id="i-javascript"> Utilitza el següent JavaScript:</label><textarea style="width:80%;height:100px;" id="i-javascript-ta">// La variable "title" conté el títol de la categoria corresponent\nreturn title;</textarea></p>');

	return accions;
}

function fillTitles() {
	var func;
	if ($("#agafa_n").is(":checked")) {
		func = (function () {
			var n = parseInt($("#paraula_n").val())-1;
			return function (title) {
				var tmp = title.split(" ")[n];
				if (!tmp) {
					tmp = title;
				}
				return tmp.toUpperCase()[0]+tmp.toLowerCase().substr(1);
			};
		})();
	} else if ($("#prefix_n").is(":checked")) {
		func = function (title) {
			return title.split(":").slice(1).join(":");
		};
	} else {
		var code = $("#i-javascript-ta").val();
		func = new Function('title', code);
	}
	table.find("tr").each(function () {
		var tr = $(this);
		tr.find("input").val(func(tr.find("a").text()));
	});
}

function bindAccions() {
	$("#paraula_n, input[name=i-accio], #i-javascript-ta").change(fillTitles);
}

function loadCategory(name) {
	current = name;
	div.html("<h2>"+name+"</h2>");

	var cont = $('<div>Carregant...</div>');
	div.append(cont);

	$.ajax({
		url: mw.util.wikiScript( 'api' ),
		data: {
			format: 'json',
			action: 'query',
			list: 'categorymembers',
			cmtitle: 'Category:' + name,
			cmtype: 'page',
			cmlimit: 500
		},
		dataType: 'json',
		type: 'GET',
		success: function( data ) {
			if ( data && data.query && data.query.categorymembers ) {
				buildTable(data.query.categorymembers);
				cont.html("");
				var accions = buildAccions();
				cont.append(accions);
				cont.append(table);

				bindAccions();
				fillTitles();
			}
		}
	});
}

$(document).ready(function () {
	if (mw.config.get("wgTitle") == "Categories per indexar") {
		topdiv = $('<div><div><table style="width:100%;"><tr><td><button class="i-b i-anterior" disabled>Anterior</button></td><td style="text-align:right;"><button class="i-b i-seguent">Següent</button></td></tr></table></div></div>');
		topdiv.insertBefore("#mw-content-text");

		topdiv.css({
			border: "1px solid steelblue",
			background: "rgba(176, 196, 222, 0.5)"
		});

		div = $('<div></div>');
		div.css({
			padding: "5px"
		});
		topdiv.prepend(div);

		$(".i-b").css({
			fontSize: "130%",
		});

		$(".i-anterior").click(function () {
			idx--;
			if (idx == 0) {
				$(this).attr("disabled","disabled");
			} else {
				$(this).prop("disabled", false);
				$(".i-seguent").prop("disabled", false);
			}
			loadCategory(getCategory(idx));
		});
		$(".i-seguent").css({
			
		}).click(function () {
			idx++;
			if (idx == len-1) {
				$(this).attr("disabled","disabled");
			} else {
				$(this).prop("disabled", false);
				$(".i-anterior").prop("disabled", false);
			}
			loadCategory(getCategory(idx));
		});

		var first = getCategory();
		len = $(".CategoryTreeLabelCategory").length;

		loadCategory(first);
	}
});

})();