Участник:Track13/archiveurl.js

/* Initial copy from http://fr.wikipedia.org/w/index.php?oldid=61255481 authors — http://fr.wikipedia.org/w/index.php?title=MediaWiki:Common.js&action=history
Скрипт генерирует ссылки на копии интернет-источника в архиве.
Можно отключать формирование ссылки на архивы выставлением no_external_cache = true в своем файле js.
Для предотвращения проставления ссылки на архив можно заключать ссылку в <span class='noarchive'>, см. http://ru.wikipedia.org/w/index.php?diff=31098174
 */
var archiveLinks = {
	'https://web.archive.org/web/*/' : 'web.archive.org',
	'http://wikiwix.com/cache/?url=' : 'wikiwix.com',
	'https://www.webcitation.org/query?url=' : 'WebCite',
	'https://webcache.googleusercontent.com/search?q=cache:' : 'Google Cache',
	'https://www.exalead.com/search/web/cached/?url=' : 'Exalead.com Cache',
	'https://archive.is/' : 'Archive.is'
};

function addcache() {
	if (typeof no_external_cache !== 'undefined' && no_external_cache) {
		return;
	}
	var archLink = document.createElement('a');
	archLink.className = 'cachelinks';
	archLink.appendChild(document.createTextNode(' Архивы'));
	$('ol.references a.external').after(archLink);
	$('a.cachelinks').click(function (event) {
		var value = event.target;

		var current_link = $(value.parentNode).find('a.external');

		var url = current_link[0].href;
		if (url.indexOf('http://wikiwix.com/cache/') > -1 || url.indexOf('http://web.archive.org/web/') > -1 || url.indexOf('wikipedia.org') > -1 || url.indexOf('wikimedia.org') > -1 || url.indexOf('stable.toolserver.org') > -1) {
			return;
		}
		var element_parent = current_link[0].parentNode;

		var title = getTextContent(current_link[0]);

		var hiddenDiv = document.createElement('div');
		hiddenDiv.style.display = '';
		hiddenDiv.style.position = 'absolute';
		hiddenDiv.style.zindex = '9999';
		hiddenDiv.style.padding = '2px';
		hiddenDiv.style.background = 'none repeat scroll 0 0 #FFFFCC';
		hiddenDiv.style.borderStyle = 'solid';
		hiddenDiv.style.borderWidth = '1px 2px 2px 1px';
		hiddenDiv.style.fontSize = '90%';
		hiddenDiv.style.marginLeft = '0.5em';
		hiddenDiv.style.marginTop = '1em';
		hiddenDiv.style.overflow = 'hidden';
		for (archiveLink in archiveLinks) {
			var link = document.createElement('a');
			link.href = archiveLink + url.replace(/%/g, '%25').replace(/&/g, '%26');
			link.title = 'Архивная копия ' + title + ' на ' + archiveLinks[archiveLink];
			link.appendChild(document.createTextNode(archiveLinks[archiveLink]));
			hiddenDiv.appendChild(link);
			hiddenDiv.appendChild(document.createElement('br'));
		}

		element_parent.insertBefore(hiddenDiv, current_link[0].nextSibling);

		hiddenDiv.style.top = value.offsetTop + 2 + 'px';
		hiddenDiv.style.left = value.offsetLeft + value.offsetWidth + 2 + 'px';

		$(value).unbind('click');
		$(value).click(function (event) {
			var value = event.target;
			var hiddenDiv = value.previousSibling;
			if (hiddenDiv.style.display == 'none') {
				hiddenDiv.style.display = '';
			} else {
				hiddenDiv.style.display = 'none';
			}
		})
	});
}

// Возвращает текстовое содержание нода и дочерних нодов.
// Copyright Harmen Christophe, http://openweb.eu.org/articles/validation_avancee, CC
function getTextContent(oNode) {
	if (!oNode)
		return null;
	if (typeof(oNode.textContent) != 'undefined') {
		return oNode.textContent;
	}
	switch (oNode.nodeType) {
	case 3: // TEXT_NODE
	case 4: // CDATA_SECTION_NODE
		return oNode.nodeValue;
		break;
	case 7: // PROCESSING_INSTRUCTION_NODE
	case 8: // COMMENT_NODE
		if (getTextContent.caller != getTextContent) {
			return oNode.nodeValue;
		}
		break;
	case 9: // DOCUMENT_NODE
	case 10: // DOCUMENT_TYPE_NODE
	case 12: // NOTATION_NODE
		return null;
		break;
	}
	var _textContent = '';
	oNode = oNode.firstChild;
	while (oNode) {
		_textContent += getTextContent(oNode);
		oNode = oNode.nextSibling;
	}
	return _textContent;
}

$(document).ready(function () {
	//if (mw.config.get('wgNamespaceNumber' === 0))
	//{
	addcache();
	//}
});