Jump to content

User:LinguistAtLarge/afdlog.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// ############################### SAVE TO AFD LOG ##############################
importScript('User:LinguistAtLarge/jquery132.js');
var afdlogdebug = false;
var afdlog = function()
{
	if (!wgPageName || wgPageName.indexOf('Wikipedia:Articles_for_deletion') == -1)
	{
		return -1; // not on afd at all
	}

	if (afdlogdebug) { alert('On AfD. wgPageName: ' + wgPageName); }

	var skiplist = [
		{'matchtype':'start', 'text':'Wikipedia:Articles_for_deletion/Log/'},
		{'matchtype':'exact', 'text':'Wikipedia:Articles_for_deletion'},
		{'matchtype':'exact', 'text':'Wikipedia:Articles_for_deletion/Old'},
		{'matchtype':'exact', 'text':'Wikipedia:Articles_for_deletion/Policy_consensus'},
		{'matchtype':'exact', 'text':'Wikipedia:Articles_for_deletion/Common_outcomes'},
	];

	var i;
	for (i in skiplist)
	{
		if (skiplist[i] && skiplist[i].matchtype && skiplist[i].text)
		{
			if (skiplist[i].matchtype == 'start')
			{
				if (wgPageName.indexOf(skiplist[i].text) == 0)
				{
					if (afdlogdebug) { alert('Skiplist match (Start). wgPageName: ' + wgPageName); }
					return -2;
				}
			}
			else if (skiplist[i].matchtype == 'exact')
			{
				if (wgPageName == skiplist[i].text)
				{
					if (afdlogdebug) { alert('Skiplist match (Exact). wgPageName: ' + wgPageName); }
					return -3;
				}
			}
		}
	}

	if (afdlog_config.autolog)
	{
		if (afdlogdebug) { alert('Autolog (Yes)'); }

		if (document.referrer.indexOf('title=' + wgPageName + '&action=edit') == -1 && document.referrer.indexOf('title=' + wgPageName + '&action=submit') == -1)
		{
			if (afdlogdebug) { alert('Autolog (Yes). Page has not "just been saved"'); }
			return -4; // page has not just been saved
		}

		if (document.location.href.indexOf('&action=submit') != -1)
		{
			if (afdlogdebug) { alert('Autolog (Yes). Page is being previewed'); }
			return -8; // page is being previewed
		}

		// see if the user has participated in this afd
		var has_participated_in_afd = function()
		{
			var anchors = document.getElementById('bodyContent').getElementsByTagName('a');
			var i;
			for (i = 0; i < anchors.length; ++i)
			{
				if (	
					anchors[i].href &&
					anchors[i].href.indexOf('User:' + wgUserName) != -1 &&
					anchors[i].parentNode &&
					anchors[i].parentNode.nodeName.toUpperCase() != 'SMALL' &&
					anchors[i].parentNode.parentNode &&
					anchors[i].parentNode.parentNode.nodeName.toUpperCase() != 'SMALL'
				)
				{
					if (afdlogdebug) { alert('has_participated_in_afd() returning true'); }
					return true;
				}
			}
			if (afdlogdebug) { alert('has_participated_in_afd() returning false'); }
			return false;
		};
		if (has_participated_in_afd())
		{
			afdlogexec();
		}
		else
		{
			return -5;
		}
	}
	else
	{
		// not autolog
		if (afdlogdebug) { alert('Not autolog. Adding portlet link'); }
		mw.util.addPortletLink('p-cactions', 'javascript:afdlogexec();', 'Log AfD', 'ca-logafdlink', 'Log this discussion to your AfD log.');
		if (afdlogdebug) { alert('Not autolog. Portlet link added'); }
	}
};

var afdlogexec = function()
{
	if (afdlogdebug) { alert('Start afdlogexec()'); }

	// helper function to create a link
	var construct_wikilink = function(articlename, linktext)
	{
		if (typeof(linktext) == 'undefined' || !linktext)
		{
			linktext = articlename;
		}
		return '<a href="/wiki/' + encodeURI(articlename) + '" title="' + linktext + '">' + linktext + '</a>';
	};
	
	if (typeof(afdlog_config) == 'undefined' || typeof(afdlog_config.afdlog_page) == 'undefined')
	{
		jsMsg('You just participated in this deletion discussion, but you need to set up your AfD log page before you can log the discussions.');
		return -7;
	}
	var logpage = 'User:' + wgUserName + '/' + afdlog_config.afdlog_page;

	if (typeof(wfSupportsAjax) == 'function' && !wfSupportsAjax())
	{
		jsMsg('You just participated in this deletion discussion, but your browser does not support AJAX, so it cannot be saved to your ' + construct_wikilink(logpage, 'AfD log'));
		return -6;
	}

	jsMsg('Your participation in this deletion discussion will now be written to your ' + construct_wikilink(logpage, 'AfD log') + '.');

	if (afdlogdebug) { alert('afdlogexec() Starting AJAX.'); }

	// save it
	var edit_page = new LaL_SimplePageEditor();
	var afdpagename = wgPageName.replace(/_/g, ' ');
	var afdpagenamenice = afdpagename.substr(32); // remove "Wikipedia:Articles for deletion/" (32 chars long)
	edit_page.prepend(logpage, "\n*[[" + afdpagename + '|' + afdpagenamenice + ']] <small>&mdash; \~\~\~\~\~</small>', 'Logging participation in AfD: [[' + afdpagename + "]]");

	// done
};

function LaL_SimplePageEditor()
{
	var that = this;

	// wrappers to append, prepend or overwrite a page
	this.append = function(pagename, pagetext, editsummary)
	{
		this.edit_page_start('appendtext', pagename, pagetext, editsummary);
	};
	this.prepend = function(pagename, pagetext, editsummary)
	{
		this.edit_page_start('prependtext', pagename, pagetext, editsummary);
	};
	this.overwrite = function(pagename, pagetext, editsummary)
	{
		this.edit_page_start('text', pagename, pagetext, editsummary);
	};

	// start editing the page (get token)
	this.edit_page_start = function(edittype, pagename, pagetext, editsummary)
	{
		this.edittype		= edittype;
		this.pagename		= pagename;
		this.pagetext		= pagetext;
		this.editsummary	= editsummary;
		//this.callback		= callback;

		jsMsgAppend('Fetching edit token...');

		// get the edit token
		var url = wgServer + '/w/api.php?format=json&action=query&prop=info&intoken=edit&indexpageids=1&titles=' + encodeURIComponent(this.pagename);
		$.get(url, function(d, t){that.edit_page_continue(d, t);}, 'json');
	};

	// second stage of editing the page
	this.edit_page_continue = function(data, textstatus)
	{
		var response = eval('(' + data + ')');
		this.token = response['query']['pages'][response['query']['pageids'][0]]['edittoken'];

		if (this.token)
		{
			jsMsgAppend('Success.');

			// edit the page  this.edittype encodeURIComponent
			jsMsgAppend('Writing to log...');
			var postdata = {
				'action'	: 'edit',
				'format'	: 'json',
				'title'		: this.pagename,
				'summary'	: this.editsummary,
				'token'		: this.token,
				'minor'		: '1',
				'watch'		: '1',
			};
			postdata[this.edittype] = this.pagetext;
			$.ajax({
				'url' : wgServer + '/w/api.php',
				'type' : 'POST',
				'data' : postdata,
				'dataType' : 'json',
				'success' : function(data, textstatus)
				{
					jsMsgAppend(data['edit']['result'] + '. <b>Done.</b>');
				},
				'complete' : function(){/*alert('COMPLETE');*/},
				'error' : function(data, textstatus)
				{
					jsMsgAppend(data['edit']['result'] + '. <b>Done.</b>');
				},
			});

			// function(d, t){that.callback(d, t);}
			// this.callback();		
		}
		else
		{
			jsMsgAppend('Error, aborting.');
		}
	};	
}

// utility function to append to the jsMsg output
function jsMsgAppend(text)
{
	var currenttext = '';
	var el = document.getElementById('mw-js-message');
	if (el)
	{
		currenttext = el.innerHTML;
	}
	jsMsg(currenttext + ' ' + text);
}

$(afdlog);