MediaWiki:Gadget-fastbuttons.js: diferenças entre revisões

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
Fazendo alteração, segundo e-mail recebido de Helder.wiki
m corr. no botão da {{cópia}}, a pedido do Helder: http://pt.wikipedia.org/w/index.php?diff=26358835&oldid=26326175
Linha 8: Linha 8:
window.fb = {
window.fb = {
//Replace this string by 5~ before saving:
//Replace this string by 5~ before saving:
version: '03h26min de 31 de julho de 2011 (UTC)',
version: '17h08min de 6 de agosto de 2011 (UTC)',
ns: mw.config.get('wgNamespaceNumber'),
ns: mw.config.get('wgNamespaceNumber'),
title: mw.config.get('wgTitle'),
title: mw.config.get('wgTitle'),
Linha 31: Linha 31:
* @param {string} text Text for link
* @param {string} text Text for link
* @param {string} title Title for link
* @param {string} title Title for link
* @param {string=} lobs Text for prompt message (optional)
* @param {string=} promptMsg Text for prompt message (optional)
* @return {string} The HTML string of the link
* @return {string} The HTML string of the link
*/
*/
fb.link = function (func, text, title, lobs) {
fb.link = function (func, text, title, promptMsg) {
if (func.indexOf( 'ER' ) === 0) {
if (func.indexOf( 'ER' ) === 0) {
func = 'var obs=prompt(\'Se necessário, coloque uma observação.\');'
func = 'var obs=prompt(\'Se necessário, coloque uma observação.\');'
+ 'fb.run(\'' + func + '\',obs)';
+ 'fb.run(\'' + func + '\',obs)';
} else if (lobs) {
} else if (promptMsg) {
func = 'var obs=prompt(\'' + lobs + '\');fb.run(\'' + func + '\',obs)';
func = 'var obs=prompt(\'' + promptMsg + '\');fb.run(\'' + func + '\',obs)';
} else {
} else {
func = 'fb.run(\'' + func + '\')';
func = 'fb.run(\'' + func + '\')';
Linha 206: Linha 206:
fb.link("subst:cópia", "cópia",
fb.link("subst:cópia", "cópia",
"Aviso sobre artigo copiado de fonte externa/VDA",
"Aviso sobre artigo copiado de fonte externa/VDA",
"Preencha usando \\\"|2=\\\" como separador: página da Wikipédia" +
"Preencha usando \\'|2=\\' como separador: página da Wikipédia" +
"|2=url da página copiada"),
"|2=url da página copiada"),
fb.link("subst:linguagem incorreta", "linguagem",
fb.link("subst:linguagem incorreta", "linguagem",

Revisão das 17h08min de 6 de agosto de 2011

/** FastButtons
 * @author: [[es:User:Racso]] (versão original do script, na Wikipédia em Espanhol)
 * @author: [[en:User:Macy]] (versão adaptada para a Wikipedia inglesa)
 * @author: Outros editores que aparecem no histórico
 * @source: [[en:User:Macy/FastButtons.js]] (https://secure.wikimedia.org/wikipedia/en/w/index.php?oldid=230473471)
 * @source: [[es:Special:PrefixIndex/User:Racso/FB]]
 */
window.fb = {
	//Replace this string by 5~ before saving:
	version: '17h08min de 6 de agosto de 2011 (UTC)',
	ns: mw.config.get('wgNamespaceNumber'),
	title: mw.config.get('wgTitle'),
	catScanUrl: 'http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php' +
		$.param( {
			'wikilang': 'pt',
			'wikifam': '.wikipedia.org',
			'userlang': 'pt',
			'basecat': mw.config.get('wgTitle'),
			'basedeep': '1',
			'go': 'Examinar',
			'format': 'html',
			'mode': ''
		} ),
	submenu: {},
	$menu: $( '<div/>' ),
	$submenu: $( '<div/>' )
};

/* Cria os links que ativam a função fb.run()
 * @param {string} func
 * @param {string} text Text for link
 * @param {string} title Title for link
 * @param {string=} promptMsg Text for prompt message (optional)
 * @return {string} The HTML string of the link
 */
fb.link = function (func, text, title, promptMsg) {
	if (func.indexOf( 'ER' ) === 0) {
		func = 'var obs=prompt(\'Se necessário, coloque uma observação.\');'
			+ 'fb.run(\'' + func + '\',obs)';
	} else if (promptMsg) {
		func = 'var obs=prompt(\'' + promptMsg + '\');fb.run(\'' + func + '\',obs)';
	} else {
		func = 'fb.run(\'' + func + '\')';
	}
	return '<a class="fb-button fb-action-button" title="'
		+ title + '" onClick="' + func + '">' + text + '</a>';
};

fb.submenu = {
/*** Submenu [ER] ***/
ER: 'Regra: <span class="fb-button fb-disabled-button">1</span>' + [
	fb.link("ER|5", "5", "Aparecimento recorrente (se o conteúdo for igual" +
		" ao eliminado por votação)"),
	(($.inArray(fb.ns, [0, 102]) !== -1) ?
		fb.link('ER|6', '6', 'Título é spam') :
		'<span class="fb-button fb-disabled-button">6</span>'),
	fb.link("ER|7", "7", "Próprio criador reconhece que se enganou"),
	(($.inArray('sysop', mw.config.get('wgUserGroups')) > -1) ?
		fb.link("ER|8", "8", "Eliminações temporárias sem perda de histórico" +
		" para resolver problemas técnicos") :
		'<span class="fb-button fb-disabled-button">8</span>'),
	fb.link("ER|9", "9", "Eliminar redirect, página sem histórico relevante"
		+ " (mover página redirecionada para cá)"),
	((fb.ns === 0) ?
		fb.link("ER|10", "10", "Namespaces que não existem (WikipÉdia, AjUda)") :
		'<span class="fb-button fb-disabled-button">10</span>' ),
	fb.link("ER|11", "11", "Má configuração do teclado (Página," +
		" Usuário:Sicrano)"),
	(fb.ns == 6) ?
		fb.link("ER|12", "12", "Imagens, somente por quem a carregou") :
		'<span class="fb-button fb-disabled-button">12</span>',
	($.inArray(fb.ns, [0, 102]) !== -1) ?
		fb.link("ER|13", "13", "Páginas sem histórico relevante que são" +
		" violações flagrantes de direitos autorais de outras páginas" +
		" na internet.") :
		'<span class="fb-button fb-disabled-button">13</span>',
	(fb.ns == 6) ?
		fb.link("ER|14", "14", "Ficheiros (arquivos) duplicados") :
		'<span class="fb-button fb-disabled-button">14</span>',
	fb.link("ER|17", "17", "Salto de domínio"),
	(fb.ns == 1) ?
		fb.link("ER|18", "18", "Discussão cujos artigos não existem") :
		'<span class="fb-button fb-disabled-button">18</span>',
	(fb.ns == 6) ?
		fb.link("ER|19", "19", "Ficheiros (domínio Ficheiro:) que não são som," +
		" imagem ou vídeo") :
		'<span class="fb-button fb-disabled-button">19</span>',
	fb.link("ER|20", "20", "Impróprio"),
	(mw.config.get('wgPageName').indexOf("Wikipédia:Páginas_para_eliminar/") === 0) ?
		fb.link("ER|21", "21", "Página de eliminação de um artigo antes de" +
		" passados 6 meses da última votação") :
		'<span class="fb-button fb-disabled-button">21</span>',
	($.inArray(fb.ns, [0, 102]) !== -1) ?
		fb.link("ER|A1", "A1", "Páginas com o título malformatado, absurdo," +
		" com palavras que não o são, com erros devidos à má configuração" +
		" do teclado, com codificação incorreta do sistema ou que expressem" +
		" domínios que não existem.") :
		'<span class="fb-button fb-disabled-button">A1</span>',
	(fb.ns == 14) ?
		fb.link("ER|C1", "C1", "Categorias vazias, desnecessárias ou substituídas") :
		'<span class="fb-button fb-disabled-button">C1</span>',
	(fb.ns % 2 == 1) ?
		fb.link("ER|D1", "D1", "Discussões de páginas inexistentes") :
		'<span class="fb-button fb-disabled-button">D1</span>',
	(fb.ns % 2 == 1) ?
		fb.link("ER|D2", "D2", "Discussões de páginas para eliminação ou com" +
		" histórico irrelevante") :
		'<span class="fb-button fb-disabled-button">D2</span>',
	($.inArray(fb.ns, [2, 3]) !== -1) ?
		fb.link("ER|U1", "U1", "Uso impróprio da página de usuário") :
		'<span class="fb-button fb-disabled-button">U1</span>',
	(fb.ns == 2) ?
		fb.link("ER|U2", "U2", "PU criada por outro usuário") :
		'<span class="fb-button fb-disabled-button">U2</span>',
	(fb.ns == 10) ?
		fb.link("ER|P1", "P1", "Predefinições vazias, desnecessárias ou" +
		" substituídas") :
		'<span class="fb-button fb-disabled-button">P1</span>',
	fb.link("ER|R1", "R1", "Redirecionamento indevido, desnecessário, sem" +
		" afluentes, para páginas inexistente ou eliminadas"),
	(fb.ns % 2 == 1) ?
		fb.link("ER|R2", "R2", "Redirecionamento de página de discussão") :
		'<span class="fb-button fb-disabled-button">R2</span>'
	].join(' '),
/*** Submenu [ESR] ***/
ESR: fb.link("subst:ESR-banda|1=~~" + "~~", "banda", "Artigo sobre banda sem fontes e sem notoriedade")
	+ "|" + fb.link("subst:ESR-bio|1=~~" + "~~", "biografia", "Biografia sem fontes e sem notoriedade")
	+ "|" + fb.link("subst:ESR-empresa|1=~~" + "~~", "empresa", "Empresa sem fontes e sem notoriedade")
	+ "| outra: <input type=\"text\" id=\"fb-esr-input\" onKeyPress=\"fb.ok(event, 'ESR')\" size=55/>"
	+ "<input type=\"button\" onMouseDown='fb.ok(\"ok\", \"ESR\")' value=\"OK\"/>",
/*** Submenu [esboço] ***/
esb: fb.link("mínimo", "mínimo", "Artigo com apenas uma frase") +
	" " + fb.link("esboço", "esboço", "Artigo ainda pouco desenvolvido") +
	" esboço-" +
	"<input id=\"fb-esb-input\" onkeyup='fb.callAPI(\"esb\")'" +
	" onKeyPress=\"fb.ok(event, 'esb')\" size=14/>" +
	"<input type=\"button\" onMouseDown='fb.ok(\"ok\", \"esb\")' value=\"OK\"/>",
/*** Submenu [manuteção] ***/
man: [
	fb.link("subst:wkf", "wikificar", "Não está formatado de acordo com o livro" +
		" de estilo"),
	fb.link("subst:s-fontes", "sem fontes", "Página não cita nenhuma fonte ou" +
		" referência"),
	fb.link("sem cat", "sem cat", "Página não está em nenhuma categoria"),
	fb.link("subst:rec", "reciclagem", "Página precisa ser reciclada de acordo" +
		" com o livro de estilo"),
	fb.link("parcial", "parcial", "Artigo possui passagens que não respeitam o" +
		" princípio da imparcialidade"),
	fb.link("subst:ctx", "contexto", "Página carece de contexto"),
	fb.link("controverso|artigo", "controverso", "controverso devido às disputas" +
		" sobre o seu conteúdo"),
	fb.link("subst:f-referências", "formatar referências", "Artigo contém" +
		" referências que necessitam de formatação"),
	fb.link("subst:m-notas", "mais notas", "Página cita fontes fiáveis, mas não" +
		" cobre todo o texto"),
	fb.link("subst:s-notas", "sem notas", "Existem fontes no final da página," +
		" mas não são citadas no corpo do artigo"),
	fb.link("subst:s-fontes-bpv", "bpv sem fontes", "Biografia de pessoa viva" +
		" que não cita nenhuma fonte"),
	fb.link("subst:fpr", "fonte primária", "Artigo necessita de fontes" +
		" secundárias fiáveis publicadas por terceiros")
	].join(' '),
/*** Submenu [busca] ***/
search: [
	'<span class="plainlinks"><a href="http://www.google.com/search?&as_eq=wikipedia&as_epq="',
	'" class="external text">Google</a> — <a href="http://news.google.com/archivesearch?&as_src=-newswire+-wire+-presswire+-PR+-press+-release&as_epq=',
	'" class="external text">notícias</a>, <a href="http://books.google.com/books?&as_brr=0&as_epq=',
	'" class="external text">livros</a>, <a href="http://scholar.google.com/scholar?as_epq=',
	'" class="external text">acadêmico</a> — <a href="http://www.scirus.com/srsapp/search?q=',
	'&t=all&sort=0&g=s" class="external text">Scirus</a></span>'
].join( encodeURIComponent( ( fb.title.indexOf( ' ' ) > -1 ) ? '"' + fb.title + '"': fb.title ) ),

/*** Submenu [aviso] ***/
warn: [fb.link("subst:bem-vindo IP", "BV-IP",
		"Boas-vindas para usuário(a) não registrado(a)"),
	fb.link("subst:bem-vindo", "BV", "Bem-vindo(a) à Wikipédia"),
	fb.link("subst:bem-vinda", "BVª", "Bem-vinda à Wikipédia"),
	fb.link("subst:bv-av", "av-BV-IP",
		"Aviso sobre erro em artigo e boas-vindas para usuário(a) não registrado(a)",
		"Aviso sobre qual artigo?"),
	fb.link("subst:bv-av-registrado", "av-BV",
		"Aviso sobre erro em artigo e boas-vindas para usuário(a) registrado",
		"Aviso sobre qual artigo?"),
	fb.link("subst:aviso-ER", "av-ER", "Aviso sobre eliminação rápida",
		"Qual página foi proposta para eliminação?"),
	fb.link("subst:av-bv-ER", "av-BV-ER",
		"Aviso sobre eliminação rápida + boas-vindas",
		"Qual página foi proposta para eliminação?"),
	fb.link("subst:aviso-ESR", "av-ESR", "Aviso sobre eliminação semirrápida",
		"Qual página foi proposta para eliminação?"),
	fb.link("subst:aviso-PE", "av-PE", "Aviso sobre eliminação por votação",
		"Qual página foi proposta para eliminação?"),
	fb.link("subst:aviso-PE-criador", "av-PE-criador", "Aviso ao criador sobre eliminação por votação",
		"Qual página foi proposta para eliminação?"),
	fb.link("subst:bv-propaganda", "prop-BV", "Caro editor, por favor não faça" +
		" propaganda, [...] Apesar disso, bem-vindo à Wikipédia"),
	fb.link("subst:propaganda", "prop",
		"Caro editor, por favor não faça propaganda...",
		"Em que página foi feita propaganda?"),
	fb.link("subst:aviso", "av", "Aviso sobre erro em artigo",
		"Aviso sobre qual artigo?"),
	fb.link("subst:aviso2", "av2", "Aviso sobre vandalismo",
		"Qual página foi vandalizada?"),
	fb.link("subst:BSRE", "BSRE", "Aviso de biografia sem relevo enciclopédico",
		"Qual artigo?"),
	fb.link("subst:cópia", "cópia",
		"Aviso sobre artigo copiado de fonte externa/VDA",
		"Preencha usando \\'|2=\\' como separador: página da Wikipédia" +
		"|2=url da página copiada"),
	fb.link("subst:linguagem incorreta", "linguagem",
		"Não insulte nem use linguagem inadequada em artigos ou discussões"),
	fb.link("subst:ortografia", "ortografia", "Não mude a versão da língua"),
	fb.link("subst:mostrar previsão", "salvamento sucessivo",
		"Não faça salvamentos sucessivos, utilize o botão\"Mostrar previsão\"",
		"Em que artigo foram feitos salvamentos sucessivos?"),
	fb.link("subst:Av-boas vindas", "aviso-BV", "Não dê boas-vindas a usuários" +
		" que não contribuíram com pelo menos uma edição válida"),
	fb.link("subst:Av-página de usuário", "av-PU", "Considere refazer a página de usuário(a)"),
	fb.link("subst:Aviso/Página pessoal", "av-PU-outro",
		"Não edite páginas de outros usuários",
		"Qual página de outro(a) usuário(a) foi editada?"),
	fb.link("subst:não remova", "não remova",
		"Não remova marcações de eliminação das páginas",
		"Qual página em que a marcação de eliminação foi removida?"),
	fb.link("subst:autobiografia", "autobiografia", "Não crie autobiografias",
		"Qual autobiografia foi criada?")
	].join(' '),
/** Submenu [CatScan] **/
cat: 'Procurar nesta categoria: ' + [
	'<a class="fb-button" href="' + fb.catScanUrl + 'ts&templates=Sem-fontes">sem fontes</a>',
	'<a class="fb-button" href="' + fb.catScanUrl + 'ts&templates=Revis%C3%A3o&go=">revisão</a>',
	'<a class="fb-button" href="' + fb.catScanUrl + 'ts&templates=Wikifica%C3%A7%C3%A3o&go=">wikificação</a>',
	'<a class="fb-button" href="' + fb.catScanUrl + 'ss&size=1000&stubop=or&links=4&go=">menos de 1 000 bytes ou 4 links</a>',
	'<a class="fb-button" href="' + fb.catScanUrl + 'ss&size=500&stubop=or&links=2&go=">menos de 500 bytes ou 2 links</a>'
].join(' ')
};

// TODO: Consider using jQuery: $('#target').keypress()
fb.ok = function( evt, option ) {
	if (window.event && window.event.keyCode == 13) {
		evt = 'ok';
	} else if (evt && evt.which == 13) {
		evt = 'ok';
	}
	if (evt == 'ok') {
		if ( option == 'esb' ) {
			fb.run("esboço-" + document.getElementById( 'fb-esb-input' ).value);
		} else if ( option == 'ESR' ) {
			fb.run("subst:ESR", document.getElementById( 'fb-esr-input' ).value + " ~~" + "~~");
		}
	}
};


/* Função de edição
 * @param: {string} code A template name, possibly preceded by "subst:",
 *                         and optionally followed by "|" and some parameter(s)
 * @param: {(string|null)=} extraText Extra text for templates and redirects (optional)
 * @return: {boolean} Returns false if the user canceled or the page already has a template
 */
fb.run = function (code, extraText) {
	var	textBox = document.getElementById("wpTextbox1"),
		summaries = {
			'subst:VDA': 'Página marcada como [[WP:VDA|VDA]]',
			'subst:apagar': 'Página proposta para [[Wikipedia:Eliminação' +
				' por votação|eliminação por votação]]',
			'subst:s-fontes': 'Página marcada como sem fontes',
			'subst:wkf': 'Página marcada para [[WP:WKF|wikificação]]',
			'subst:rec': 'Página marcada para [[WP:RECI|reciclagem]]',
			'parcial': 'Página marcada como parcial',
			'subst:ctx': 'Página marcada como sem contexto',
			'controverso|artigo': 'Marcado como controverso',
			'subst:f-referências': 'Marcado que existem referências sem formatação',
			'subst:m-notas': 'Marcado que carece de mais fontes',
			'subst:s-notas': 'Página marcada como sem notas',
			'subst:s-fontes-bpv': 'Marcado como [[WP:BPV|biografia de pessoa' +
					' viva]] sem fontes',
			'subst:fpr': 'Página marcada como sem fontes secundárias fiáveis',
			'subst:ESR': 'Página proposta para [[WP:ESR|eliminação semirrápida]]'
		};
	if (extraText === null) {
		// Do nothing if the user canceled the prompt box
		return false;
	}
	if (mw.config.get('wgAction') == 'view') {
		var	url = mw.util.wikiGetlink( mw.config.get('wgPageName') )
			+ '?action=edit&fastb=' + encodeURIComponent(code);
		if (extraText) {
			location.href = url + '&fbtxt=' + encodeURIComponent(extraText);
		} else {
			location.href = url;
		}
	} else if (mw.config.get('wgAction') == "edit") {
		var value = textBox.value;
		var summary = " (usando [[Wikipédia:FB|FastButtons]])";
		if ( value.match(/\{\{(?:ER|ESR2|Usuário\:Salebot\/Impróprio)\|/i) ) {
			alert("Já existe uma predefinição de eliminação nesta página.");
			return false;
		}
		if (code.indexOf("ER") === 0) {
			if (extraText) {
				extraText = "|3=" + extraText + "}}\n\n";
			} else {
				extraText = "}}\n\n";
			}
			extraText = "{" + "{" + code + "|2=~~" + "~~" + extraText;
			textBox.value = extraText + value;
			if (this.salve) {
				document.editform.wpSummary.value = "Página proposta para" +
					" [[WP:ER|eliminação rápida]] (regra " +
					code.substring(3) + ")" + summary;
			}
		} else if (code == "redirect") {
			if (mw.config.get('wgNamespaceNumber') == 14) {
				if (extraText) {
					textBox.value = "{" + "{redirecionamento de categoria|" +
						extraText + "}}";
				}
				if (this.salve) {
					document.editform.wpSummary.value = "Redirecionando para" +
						" a [[categoria:" + extraText + "]]" + summary;
				}
			} else {
				if (extraText) {
					textBox.value = "#Redirecionamento [[" + extraText + "]]";
				}
			}
		} else {
			if (extraText) {
				if (code.indexOf("|") > -1) {
					extraText = "|1=" + extraText + "}}";
				} else {
					extraText = "|1=" + extraText + "}}";
				}
			} else {
				extraText = "}}";
			}
			extraText = "{{" + code + extraText;
			if (mw.config.get('wgNamespaceNumber') == 3) {
				value += "\n\n" + extraText + " ~~" + "~~";
			} else if (code == "mínimo" || code.indexOf("esboço") === 0) {
				if (value.match(/\n\n\[\[/)) {
					value = value.substring(0, value.search(/\n\n\[\[/)) + "\n\n" +
						extraText + value.substring(value.search(/\n\n\[\[/));
				} else {
					value += "\n\n" + extraText;
				}
				this.salve = (code == "mínimo") ?
					"Página marcada como [[WP:M|mínimo]]" :
					"Página marcada como [[WP:EBC|esboço]]";
			} else if ($.inArray( code, [ 'subst:VDA' , 'subst:matrad' ]) > -1) {
				value = extraText;
			} else {
				value = extraText + "\n\n" + value;
			}
			textBox.value = value;
			if (this.salve) {
				if (mw.config.get('wgNamespaceNumber') == 3) {
					this.salve = 'Adicionando aviso';
				} else {
					if ( code.indexOf( 'subst:ESR' ) === 0 ) {
						code = 'subst:ESR';
					}
					this.salve = summaries[ code ] || 'Adicionando marcação';
				}
				document.editform.wpSummary.value = this.salve + summary;
			}
		}
		if (this.salve) {
			document.editform.submit();
		}
	}
};

var	esb,
	esbText = "",
	esbText2 = "";

/* Callback function for API calls
 * @param {string} code An abreviation such as "esb", "afl", "PV",
 */
fb.callAPI = function ( code ) {
	var	user,
		that = this,
		apiParams = {
			'esb': {
				'list': 'allpages',
				'aplimit': '1',
				'apnamespace': '10'
			},
			'afl': {
				'list': 'backlinks',
				'bllimit': '1',
				'blfilterredir': 'nonredirects',
				'blnamespace': '0',
				'bltitle': mw.config.get('wgPageName')
			},
			'PV': {
				'list': 'watchlist',
				'wlprop': 'user|comment|title|sizes',
				'wlexcludeuser': mw.config.get('wgUserName')
			},
			'PN': {
				'list': 'recentchanges',
				'rctype': 'new',
				'rcnamespace': '0',
				'rcshow': '!patrolled',
				'rcprop': 'user|comment|title|sizes|ids'
			},
			'MR': {
				'list': 'recentchanges',
				'rctype': 'edit',
				'rcnamespace': '0',
				'rcshow': 'anon',
				'rcprop': 'user|comment|title|sizes'
			},
			'usu': {
				'list': 'allusers',
				'aulimit': '1',
				'auprop': 'editcount|registration',
				'aufrom': mw.config.get('wgTitle').split('/')[0]
			}
		};
	if ( 'esb' == code ) {
		esb = document.getElementById( 'fb-esb-input' );
		if ( $.inArray( esb.value, [ esbText, esbText2 ] ) !== -1 ) {
			return;
		}
		esbText = esb.value;
		if (esbText == esb.value.substr(0, (esb.value.length - 1))) {
			return;
		}
		apiParams.esb.apprefix = 'Esboço-' + esb.value;
	}
	apiParams[ code ].format = 'json';
	apiParams[ code ].action = 'query';
	$.getJSON(
		mw.util.wikiScript( 'api' ),
		apiParams[ code ], function( data ) {
			that.processAPI( code, data );
		}
	);
};

/* Callback function for API calls
 * @param {string} code An abreviation such as "esb", "afl", "PV",
 * @param {Object} data JSON content returned by API
 */
fb.processAPI = function (code, data) {
	var	i, title, length, comment, user,
		query = data && data.query,
		pages = [],
		charnum = 0,
		that = this;

	/** Processamento da resposta do API **/
	switch ( code ) {
	case 'afl':
		var backlinks,
			info = '(';
		info += (document.getElementById('Refer.C3.AAncias')
					|| document.getElementById('Notas_e_refer.C3.AAncias')) ?
					'ref' :
					'<span class="fb-missing" title="Esta página ainda não possui referências">ref</span>';
		var catLine = document.getElementById( 'mw-normal-catlinks' );
		// FIXME: Do not do screen scraping to get this info!
		if (catLine && catLine.innerHTML.indexOf( '><a href="' + mw.config.get('wgArticlePath').replace('$1', '')) > -1) {
			info += ' · cat';
		} else {
			info += ' · <span class="fb-missing" title="Esta página ainda não foi categorizada">cat</span>';
		}
		info += (document.getElementById( 'p-lang' )) ?
			' · iw' :
			' · <span class="fb-missing" title="Esta página ainda não' +
				' possui links para outros idiomas">iw</span>';

		// Afluentes
		backlinks = query && query.backlinks;
		if ( !backlinks ) {
			mw.log( 'The backlinks query returned no data.' );
		} else if ( backlinks.length ) {
			info += ' · <a href="' +
				mw.util.wikiGetlink( 'Especial:Páginas afluentes/' + mw.config.get('wgPageName') ) +
				'" title="afluentes">afl</a>)';
		} else {
			info += ' · <span class="fb-missing" title="Esta página ainda não possui afluentes">afl</span>)';
		}
		this.$submenu.html( info );
		if ( document.getElementById( 'ca-talk' ).className != 'new' ) {
			$.getJSON(
				mw.util.wikiScript( 'api' ), {
					'format': 'json',
					'action': 'query',
					'prop': 'categories',
					'indexpageids': '1',
					'titles': mw.config.get('wgFormattedNamespaces')[ mw.config.get('wgNamespaceNumber') + 1 ] +
						':' + mw.config.get('wgTitle')
				}, function( data ) {
					that.processAPI( 'qualidade', data );
				}
			);
		} else {
			var hiddenCats = document.getElementById("mw-hidden-catlinks");
			if (hiddenCats) {
				hiddenCats = hiddenCats.innerHTML;
				if (hiddenCats.indexOf("!Artigos de qualidade") > -1) {
					hiddenCats = hiddenCats.substr(hiddenCats.indexOf("!Artigos de qualidade") + 22, 1);
					if (hiddenCats == "d") {
						hiddenCats = "?";
					}
					this.$submenu.html(
						this.$submenu.html() + "<span title='Qualidade do artigo'> Q-<b>" +
						hiddenCats + "</b></span>"
					);
				}
			}
		}
		break;
	case 'qualidade':
		var cats, cat, pageids, quality;
		if ( query ) {
			cats = query.pages;
			pageids = query.pageids;
			if ( cats && pageids && pageids.length ) {
				cats = cats[ pageids[0] ].categories;
				if ( !cats ){
					mw.log( 'The categories query returned incomplete data.' );
					return false;
				}
			} else {
				mw.log( 'The categories query returned incomplete data.' );
				return false;
			}
		} else {
			mw.log( 'The categories query returned no data.' );
			return false;
		}
		// Qualidade do artigo
		for (i = 0; i < cats.length; i++) {
			cat = cats[i].title;
			if ( cat && cat.indexOf( '!Artigos de qualidade' ) > -1 ){
				// Categoria:!Artigos de qualidade 1 sobre ...
				//                                 ^
				quality = cat.substr( 32, 1 );
				if (quality == 'd') {
					quality = '?';
				}
				this.$submenu.html(
					this.$submenu.html() +
						'<span title="Qualidade do artigo"> Q-<b>' +
						quality + '</b></span>'
				);
				break;
			}
		}
		break;
	case 'esb':
		var template,
			esb = document.getElementById( 'fb-esb-input' );
		if ( query ) {
			template = query.allpages && query.allpages[0] && query.allpages[0].title;
			if ( !template ) {
				mw.log( 'The categories query returned incomplete data.' );
				return false;
			}
			template = template.replace( /^Predefinição:Esboço-/gi, '' );
		} else {
			mw.log( 'The categories query returned no data.' );
			return false;
		}
		if ((esb.setSelectionRange
				|| esb.createTextRange
				|| typeof (esb.selectionStart) != 'undefined'
				&& typeof (esb.selectionEnd) != 'undefined'
			)
			&& esb.value == template.substr(0, esb.value.length)
			) {
			// Exibe sugestões. Baseado no script do HotCat
			var start = esb.value.length;
			esb.value = template;
			esbText2 = template;
			if (esb.setSelectionRange) {
				esb.setSelectionRange(start, template.length);
			} else if (esb.createTextRange) {
				var sel = esb.createTextRange();
				sel.move( 'character', start );
				sel.moveEnd( 'character', template.length - start );
				sel.select();
			} else {
				esb.selectionStart = start;
				esb.selectionEnd = template.length;
			}
		}
		break;
	case 'PN':
	case 'MR': // Mudanças recentes
	case 'PV': // Páginas vigiadas
		var	item, j,
			listName = {
				'PV': 'watchlist',
				'MR': 'recentchanges',
				'PN': 'recentchanges'
			},
			summaryChanges = {
				'PV' : [
					[ '[[Ajuda:SEA|←]]', '' ],
					[ '/*', '→' ],
					[ '*/', ':' ]
				],
				'MR' : [
					[ '/*', '→' ],
					[ '*/', ':' ]
				],
				'PN' : [
					[ '[[Ajuda:SEA|?]] ', '' ]
				]
			},
			urlParam = {
				'PV': 'diff=last',
				'MR': 'diff=last',
				'PN': 'redirect=no&rcid='
			},
			list = query[ listName[ code ] ],
			max = ( list.length < 10 )? list.length : 10;

		for ( i = 0; i < max; i++ ) {
			item = list[ i ];
			if ( !item ){
				continue;
			}
			title = item.title;
			charnum += title.length;
			if (charnum > 180) {
				break;
			}
			length = item.newlen - item.oldlen;
			if (length > 0) {
				length = '+' + length;
			}
			comment = item.comment || '';
			for ( j=0; j < summaryChanges[ code ].length; j++ ){
				comment = comment.replace(
					summaryChanges[ code ][0],
					summaryChanges[ code ][1]
				);
			}
			if (comment) {
				comment = '(' + comment + ')';
			}
			if ( code === 'PN' ){
				urlParam[ code ] += item.rcid;
			}
			pages.push(
				'<a href="' + mw.util.wikiGetlink( title ) + '?' +
				urlParam[ code ] + '" title="(' + length + ') ' + item.user +
				' ' + comment + '">' + title + '</a>'
			);
		}
		this.$submenu.html( pages.join( ' ' ) );
		break;
	case 'usu':
		// Informações do(a) usuário(a)
		if ( !query ) {
			mw.log( 'The categories query returned no data.' );
			return false;
		}
		user = query.allusers && query.allusers[0];
		if ( user ) {
			// Ex.: YYYY-MM-DDThh:mm:ssZ
			var regDate = user.registration;
			regDate = regDate.substr(8, 2) + '/' + regDate.substr(5, 2) +
				'/' + regDate.substr(0, 4);
			var encUser = encodeURI( user.name );
			this.$submenu.html( [
					user.editcount + ' edições desde ' + regDate + '.',
					'<a class="fb-button" href="' +
						mw.util.wikiGetlink( 'Especial:Contribuições/' ) + encUser +
						'" title="Abrir a lista de contribuições deste editor" >contribuições</a>',
					'<a class="fb-button" href="' +
						mw.util.wikiGetlink( 'Especial:Registo/' ) + encUser +
						'" title="Abrir a lista de registros deste editor" >registros</a>',
					'<a class="fb-button" href="' +
						mw.util.wikiGetlink( 'Especial:Registo' ) + '?type=block&page=User%3A' + encUser +
						'" title="Abrir a lista de registros de bloqueio deste editor">registros de bloqueio</a>',
					'<span class="plainlinks"><a class="external text fb-button"' +
						'title="Abrir a contagem de edições deste editor"' +
						' href="http://toolserver.org/~river/cgi-bin/count_edits?user=' +
						encUser + '&dbname=ptwiki_p">contador de edições</a></span>'
				].join( ' ' )
			);
		} else {
			return;
		}
		break;
	}
};

/* Initialize the gadget */
fb.init = function () {
	var	inUserNS, $contentSub = $( '#contentSub' ),
		param = mw.util.getParamValue('fastb');
	fb.$menu.attr( 'id', 'fb-menu' );
	fb.$submenu.attr( 'id', 'fb-submenu' );
	if ($.inArray(mw.config.get('wgAction'), ['view', 'edit']) !== -1) {
		fb.$submenu.html( '' );
		/*** Menu Principal ***/
		if (mw.config.get('wgNamespaceNumber') > -1) {
			inUserNS = $.inArray(mw.config.get('wgNamespaceNumber'), [2, 3]) > -1
				&& mw.config.get('wgTitle').indexOf(mw.config.get('wgUserName')) === 0;
			if (inUserNS) {
				fb.$menu.html( fb.link("ER|1", "ER1", "Marcar subpágina do próprio usuário para eliminação") );
			} else {
				fb.$menu.html( '<a class="fb-button fb-menu-button" title="Exibir regras' +
				' para a eliminação rápida" onClick="fb.$submenu.html(fb.submenu.ER)">ER</a>' );
			}
		}
		if ($.inArray(mw.config.get('wgNamespaceNumber'), [0, 102]) !== -1) {
			fb.$menu.html(
				fb.$menu.html() + [
				'<a class="fb-button fb-menu-button" title="Exibir regras para a eliminação semi-rápida"' +
					' onClick="fb.$submenu.html(fb.submenu.ESR)">ESR</a>',
				fb.link( 'subst:apagar', 'PE',
					'Marcar para eliminação por votação'),
				'<a class="fb-button fb-action-button"' +
					' title="Marcar como cópia ou violação de direito autoral"' +
					' onClick="obs=prompt(\'Informe o url da página copiada\',' +
					' \'http://\');fb.run(\'subst:VDA\',obs)">VDA</a>',
				fb.link( 'subst:suspeito', 'susp',
					'Marcar como suspeito de violação de direitos autorais'),
				fb.link( 'subst:matrad', 'trad',
					'Marcar esta tradução como sendo de baixa qualidade',
					'De qual língua a página foi maltraduzida (ca, de, en, es,' +
					' fr, it, ja, nl, no, pl, ru, sv, zh)?' ),
				fb.link( 'redirect', '#R', 'Redirecionar para outro título',
					'Redirecionar para qual página?'),
				'<a class="fb-button fb-menu-button" title="Exibir predefinições para manutenção"' +
					' onClick="fb.$submenu.html(fb.submenu.man)">manutenção</a>',
				'<a class="fb-button fb-menu-button" title="Exibir predefinições para esboços"' +
					' onClick="fb.$submenu.html(fb.submenu.esb)">esboço</a>',
				'<a class="fb-button fb-menu-button" title="Exibir opções para a busca de fontes"' +
					' onClick="fb.$submenu.html(fb.submenu.search)">busca</a>'
				].join('')
			);
			if (mw.config.get('wgAction') === 'view') {
				fb.callAPI('afl');
			}
		} else {
			if ($.inArray(mw.config.get('wgNamespaceNumber'), [2, 10]) !== -1) {
				fb.$menu.html(
					fb.$menu.html() + fb.link("subst:apagar", "PE",
					"Marcar para eliminação por votação")
				);
			}
			if (mw.config.get('wgNamespaceNumber') % 2 === 0) {
				fb.$menu.html(
					fb.$menu.html() + fb.link("redirect", "#R", "Redirecionar para outro título",
					"Redirecionar para qual página?")
				);
			}
			if (mw.config.get('wgNamespaceNumber') === 14) {
				fb.$menu.html(
					fb.$menu.html() + '<a class="fb-button fb-menu-button"' +
					' title="Exibir opções do CatScan para procurar páginas nesta categoria"' +
					' onClick="fb.$submenu.html(fb.submenu.cat)">CatScan</a>'
				);
			}
		}
		if (mw.config.get('wgNamespaceNumber') === 3) {
			fb.$menu.html(
				fb.$menu.html() + '<a class="fb-button fb-menu-button"' +
				' title="Exibir lista de predefinições para avisos"' +
				' onClick="fb.$submenu.html(fb.submenu.warn)">aviso</a>'
			);
		}
		if ($.inArray(mw.config.get('wgNamespaceNumber'), [2, 3]) !== -1) {
			fb.$menu.html(
				fb.$menu.html() + '<a class="fb-button fb-menu-button" title="Exibir informações sobre esta conta"' +
				' onClick="fb.callAPI(\'usu\')">sobre a conta</a>'
			);
		}
	}
	fb.$menu.html(
		fb.$menu.html() + [
			'<a class="fb-button fb-menu-button"' +
				' title="Exibir páginas vigiadas que foram alteradas recentemente" onClick="fb.callAPI(\'PV\')">PV</a>',
			'<a class="fb-button fb-menu-button"' +
				' title="Exibir páginas novas que ainda não foram patrulhadas"' +
				' onClick="fb.callAPI(\'PN\')">PN</a>',
			'<a class="fb-button fb-menu-button"' +
				' title="Exibir mudanças recentes feitas por IPs em páginas do domínio principal"' +
				' onClick="fb.callAPI(\'MR\')">MR</a>'
			].join('')
	);
	$contentSub.append( fb.$menu ).append( fb.$submenu );
	switch (mw.config.get('wgAction')) {
	case 'edit':
		fb.salve = (param !== null);
		if (fb.salve) {
			fb.run(param, mw.util.getParamValue('fbtxt') || '');
		}
		break;
	case 'markpatrolled':
		if (param !== null) {
			location.href = mw.util.wikiGetlink( mw.config.get('wgPageName') ) +
				'?action=edit&fastb=' + param;
		}
		break;
	default:
		// Não faz nada nas demais ações
	}
	mw.loader.using( 'jquery.tipsy', function() {
		$('#fb-menu, #fb-submenu').find( 'a' ).tipsy();
	} );
};

/* Executes the gadget when document is ready */
$( fb.init );