Jump to content

User:LinguistAtLarge/afdlog.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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);