<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ifigenia.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js%2FEdit_tools.js</id>
	<title>MediaWiki:Common.js/Edit tools.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://ifigenia.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js%2FEdit_tools.js"/>
	<link rel="alternate" type="text/html" href="https://ifigenia.org/index.php?title=MediaWiki:Common.js/Edit_tools.js&amp;action=history"/>
	<updated>2026-04-18T11:44:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://ifigenia.org/index.php?title=MediaWiki:Common.js/Edit_tools.js&amp;diff=18&amp;oldid=prev</id>
		<title>Ifigenia Administrator: New page: /* * *   Virtual keyboard characters   * * */ // Copied from BG Wikipedia   var existChars = false; // are the extra chars already added   /** generate and add extra chars in the element $...</title>
		<link rel="alternate" type="text/html" href="https://ifigenia.org/index.php?title=MediaWiki:Common.js/Edit_tools.js&amp;diff=18&amp;oldid=prev"/>
		<updated>2008-10-07T23:11:17Z</updated>

		<summary type="html">&lt;p&gt;New page: &lt;span class=&quot;autocomment&quot;&gt;* *   Virtual keyboard characters   * *: &lt;/span&gt; // Copied from BG Wikipedia   var existChars = false; // are the extra chars already added   /** generate and add extra chars in the element $...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* * *   Virtual keyboard characters   * * */&lt;br /&gt;
// Copied from BG Wikipedia&lt;br /&gt;
 &lt;br /&gt;
var existChars = false; // are the extra chars already added&lt;br /&gt;
 &lt;br /&gt;
/** generate and add extra chars in the element $charsElemId  */&lt;br /&gt;
function addChars() {&lt;br /&gt;
	// if there are extra chars already, do nothing&lt;br /&gt;
	if ( existChars ) { return; }&lt;br /&gt;
	var cont = &amp;#039;&amp;#039;;&lt;br /&gt;
	var len = chars.length;&lt;br /&gt;
	for (var i in chars) {&lt;br /&gt;
		for (var j in chars[i]) {&lt;br /&gt;
			cont += &amp;quot;&amp;lt;a href=\&amp;quot;javascript:insertTags(&amp;#039;&amp;quot;+chars[i][j]+&amp;quot;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;)\&amp;quot; &amp;quot;+&lt;br /&gt;
			&amp;#039;title=&amp;quot;&amp;#039; + gLang.msg(&amp;quot;et-addchar&amp;quot;, chars[i][j]) +&amp;#039;&amp;quot;&amp;gt;&amp;#039;+chars[i][j]+&amp;#039;&amp;lt;/a&amp;gt; &amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (i != len-1) { cont += &amp;#039;&amp;lt;br/&amp;gt;&amp;#039;; }&lt;br /&gt;
	}&lt;br /&gt;
	document.getElementById(charsElemId).innerHTML = cont;&lt;br /&gt;
	existChars = true;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* * *   Extra buttons for text insertion   * * */&lt;br /&gt;
 &lt;br /&gt;
/** add some buttons and drop-down menus */&lt;br /&gt;
function setupCustomEditTools() {&lt;br /&gt;
	var toolbar = document.getElementById(&amp;quot;toolbar&amp;quot;);&lt;br /&gt;
	// do nothing if no toolbar&lt;br /&gt;
	if ( !toolbar ) { return; }&lt;br /&gt;
	toolbar.className += &amp;quot; buttonlinks&amp;quot;;&lt;br /&gt;
	if ( showMenus ) {&lt;br /&gt;
		// drop-down menus inserting text put direct in the javascript&lt;br /&gt;
		appendDropDownMenus(toolbar, tplVarBaseName, insertIntoWikiText);&lt;br /&gt;
		// drop-down menus inserting content from wiki pages&lt;br /&gt;
		appendDropDownMenus(toolbar, atplVarBaseName, loadPage);&lt;br /&gt;
	}&lt;br /&gt;
	if ( showButtons ) {&lt;br /&gt;
		appendCustomButtons(toolbar);&lt;br /&gt;
		appendExtraChars(toolbar);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
hookEvent(&amp;quot;load&amp;quot;, setupCustomEditTools);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function setCustomInsButton(code, left, middle, right, shownText, title) {&lt;br /&gt;
	customInsButtons[code] = [left, middle, right, shownText, title];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setCustomMiscButton(code, codeToRun, shownText, title) {&lt;br /&gt;
	customMiscButtons[code] = [codeToRun, shownText, title];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function rmCustomInsButtons(rmButtons) {&lt;br /&gt;
	rmCustomButtons(customInsButtons, rmButtons);&lt;br /&gt;
}&lt;br /&gt;
function rmCustomMiscButtons(rmButtons) {&lt;br /&gt;
	rmCustomButtons(customMiscButtons, rmButtons);&lt;br /&gt;
}&lt;br /&gt;
function rmCustomButtons(allButtons, rmButtons) {&lt;br /&gt;
	for (var i = rmButtons.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
		delete( allButtons[ rmButtons[i] ] );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function appendCustomButtons(parent) {&lt;br /&gt;
	var buts = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	buts.id = &amp;quot;custombuttons&amp;quot;;&lt;br /&gt;
	for (var i in customInsButtons) {&lt;br /&gt;
		var el = customInsButtons[i];&lt;br /&gt;
		var title = el[4];&lt;br /&gt;
		if ( title.charAt(0) == &amp;quot;+&amp;quot; ) {&lt;br /&gt;
			title = gLang.msg(&amp;quot;et-addpref&amp;quot;) + title.substr(1);&lt;br /&gt;
		}&lt;br /&gt;
		appendCustomButton(buts,&lt;br /&gt;
			{&amp;quot;href&amp;quot;: &amp;quot;javascript:insertTags(&amp;#039;&amp;quot;+el[0] +&amp;quot;&amp;#039;,&amp;#039;&amp;quot;+el[2]+&amp;quot;&amp;#039;,&amp;#039;&amp;quot;+ el[1]+&amp;quot;&amp;#039;)&amp;quot;,&lt;br /&gt;
			&amp;quot;title&amp;quot;: title, &amp;quot;innerHTML&amp;quot;: el[3]});&lt;br /&gt;
	}&lt;br /&gt;
	for (var i in customMiscButtons) {&lt;br /&gt;
		var el = customMiscButtons[i];&lt;br /&gt;
		appendCustomButton(buts, {&amp;quot;href&amp;quot;:&amp;quot;javascript:&amp;quot;+el[0], &amp;quot;title&amp;quot;:el[2], &amp;quot;innerHTML&amp;quot;:el[1]});&lt;br /&gt;
	}&lt;br /&gt;
	parent.appendChild(buts);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function appendCustomButton(box, item) {&lt;br /&gt;
	var b = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
	for (var attr in item) { b[attr] = item[attr]; }&lt;br /&gt;
	box.appendChild(b);&lt;br /&gt;
	box.appendChild( document.createTextNode(&amp;quot; &amp;quot;) );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function appendExtraChars(parent) {&lt;br /&gt;
	if ( typeof(charsElemId) == &amp;quot;undefined&amp;quot; ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	var chbox = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	chbox.id = charsElemId;&lt;br /&gt;
	chbox.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
	parent.appendChild(chbox);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function appendDropDownMenus(parent, tplVarBaseName, callback) {&lt;br /&gt;
	var tplVar = null;&lt;br /&gt;
	for ( var i = 1; tplVar = tplVarBaseName + i,&lt;br /&gt;
			eval(&amp;quot;var tpl = typeof(&amp;quot;+ tplVar +&amp;quot;) == &amp;#039;object&amp;#039; ? &amp;quot;+ tplVar +&amp;quot; : null&amp;quot;),&lt;br /&gt;
			tpl != null; i++ ) {&lt;br /&gt;
		appendDropDownMenu(parent, tpl, callback, &amp;quot;ddmenu_&amp;quot; + tplVar);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/** generates a drop-down menu */&lt;br /&gt;
function appendDropDownMenu(parent, content, callback, id) {&lt;br /&gt;
	var box = document.createElement(&amp;quot;select&amp;quot;);&lt;br /&gt;
	box.id = id;&lt;br /&gt;
	box.title = gLang.msg(&amp;quot;et-ddmenutitle&amp;quot;);&lt;br /&gt;
	box.onchange = function() {&lt;br /&gt;
		if (this.value != &amp;quot;-&amp;quot;) {&lt;br /&gt;
			callback(this.value);&lt;br /&gt;
			this.selectedIndex = 0;&lt;br /&gt;
		}&lt;br /&gt;
		return;&lt;br /&gt;
	};&lt;br /&gt;
	if ( appendOptions(box, content) &amp;gt; 1 ) {&lt;br /&gt;
		parent.appendChild(box);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function appendOptions(box, opts) {&lt;br /&gt;
	var count = 0;&lt;br /&gt;
	for (var i in opts) {&lt;br /&gt;
		if (opts[i] == &amp;quot;&amp;quot;) {&lt;br /&gt;
			continue; // skip emtpy entries&lt;br /&gt;
		}&lt;br /&gt;
		var child = typeof(opts[i]) == &amp;quot;object&amp;quot;&lt;br /&gt;
			? Creator.createOptgroup(i, opts[i])&lt;br /&gt;
			: Creator.createOption(opts[i], i);&lt;br /&gt;
		box.appendChild(child);&lt;br /&gt;
		count++;&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/** show/hide an element */&lt;br /&gt;
function toggleElemDisplay(elemId) {&lt;br /&gt;
	var elem = document.getElementById(elemId);&lt;br /&gt;
	elem.style.display = elem.style.display == &amp;#039;none&amp;#039; ? &amp;#039;&amp;#039; : &amp;#039;none&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
	insert an edit toolbar before the textarea.&lt;br /&gt;
	useful for testing user script pages while previewing&lt;br /&gt;
	use it with:&lt;br /&gt;
		putToolbar();&lt;br /&gt;
	put in your script page, e.g. User:Your_Name/monobook.js&lt;br /&gt;
*/&lt;br /&gt;
function putToolbar() {&lt;br /&gt;
	addOnloadHook(function() {&lt;br /&gt;
		var toolbar = Creator.createElement(&amp;quot;div&amp;quot;, {&amp;quot;id&amp;quot; : &amp;quot;toolbar&amp;quot;});&lt;br /&gt;
		var editform = document.getElementById(&amp;quot;editform&amp;quot;);&lt;br /&gt;
		editform.parentNode.insertBefore(toolbar, editform);&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/* * * * * * * * * *   Ajax functions   * * * * * * * * * */&lt;br /&gt;
 &lt;br /&gt;
var prevReq;&lt;br /&gt;
var pageUrlTpl = wgScript + &amp;quot;?title=$1&amp;amp;action=raw&amp;amp;templates=expand&amp;quot;;&lt;br /&gt;
var pageUrl = &amp;quot;&amp;quot;;&lt;br /&gt;
var pageToFetch = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
function loadPage(page) {&lt;br /&gt;
	prevReq = sajax_init_object();&lt;br /&gt;
	if ( !prevReq ) return false;&lt;br /&gt;
	pageToFetch = page;&lt;br /&gt;
	pageUrl = pageUrlTpl.replace(/\$1/, encodeURI(page));&lt;br /&gt;
	showLoadIndicator();&lt;br /&gt;
	prevReq.onreadystatechange = insertIntoWikiTextFromRequest;&lt;br /&gt;
	prevReq.open(&amp;quot;GET&amp;quot;, pageUrl, true);&lt;br /&gt;
	prevReq.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
	prevReq.send(null);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function insertIntoWikiTextFromRequest() {&lt;br /&gt;
	if ( prevReq.readyState != 4 ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	hideLoadIndicator();&lt;br /&gt;
	if ( prevReq.status != 200 ) {&lt;br /&gt;
		window.alert(gLang.msg(&amp;quot;et-ajaxerror&amp;quot;, prevReq.status, prevReq.statusText,&lt;br /&gt;
			pageToFetch, pageUrl));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	insertIntoWikiText(prevReq.responseText);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function insertIntoWikiText(content) {&lt;br /&gt;
	// delete text marked for no inclusion + &amp;lt;pre&amp;gt; and &amp;lt;nowiki&amp;gt;&lt;br /&gt;
	var re = /&amp;lt;!--noinclude--&amp;gt;.*&amp;lt;!--\/noinclude--&amp;gt;|&amp;lt;\/?pre&amp;gt;|&amp;lt;\/?nowiki&amp;gt;/g;&lt;br /&gt;
	content = content.replace(re, &amp;quot;&amp;quot;);&lt;br /&gt;
	// replace escaped tags&lt;br /&gt;
	var specials = [&amp;quot;pre&amp;quot;, &amp;quot;nowiki&amp;quot;];&lt;br /&gt;
	for (var i in specials) {&lt;br /&gt;
		re = new RegExp(&amp;quot;\\[(\/?)&amp;quot;+ specials[i] +&amp;quot;\\]&amp;quot;, &amp;quot;g&amp;quot;);&lt;br /&gt;
		content = content.replace(re, &amp;quot;&amp;lt;$1&amp;quot;+ specials[i] +&amp;quot;&amp;gt;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// we can have &amp;gt;&amp;gt;|sample text|&amp;lt;&amp;lt; or &amp;gt;&amp;gt;|&amp;lt;&amp;lt; or just simple text&lt;br /&gt;
	var parts = null;&lt;br /&gt;
	var left, right, def = &amp;quot;&amp;quot;;&lt;br /&gt;
	content = escapeNl(content);&lt;br /&gt;
	if ( ( parts = content.match(/(.*)&amp;gt;&amp;gt;\|(.*)\|&amp;lt;&amp;lt;(.*)/) ) ) {&lt;br /&gt;
		left = parts[1];&lt;br /&gt;
		def = parts[2];&lt;br /&gt;
		right = parts[3];&lt;br /&gt;
	} else { // no sample text: split at caret’s position&lt;br /&gt;
		parts = content.split(&amp;quot;&amp;gt;&amp;gt;|&amp;lt;&amp;lt;&amp;quot;);&lt;br /&gt;
		left = parts[0];&lt;br /&gt;
		delete(parts[0]);&lt;br /&gt;
		right = parts.join(&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	insertTags(unescapeNl(left), unescapeNl(right), unescapeNl(def));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function escapeNl(s) { return s.replace(/\n/g, &amp;quot;\x01&amp;quot;); }&lt;br /&gt;
function unescapeNl(s) { return s.replace(/\x01/g, &amp;quot;\n&amp;quot;); }&lt;br /&gt;
 &lt;br /&gt;
var loadIndicator;&lt;br /&gt;
function showLoadIndicator() {&lt;br /&gt;
	if ( loadIndicator ) {&lt;br /&gt;
		loadIndicator.style.display = &amp;quot;block&amp;quot;;&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	loadIndicator = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	loadIndicator.id = &amp;quot;loadIndicator&amp;quot;;&lt;br /&gt;
	loadIndicator.appendChild( document.createTextNode(gLang.msg(&amp;quot;et-tplloading&amp;quot;)) );&lt;br /&gt;
	document.getElementsByTagName(&amp;quot;body&amp;quot;)[0].appendChild(loadIndicator);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function hideLoadIndicator() {&lt;br /&gt;
	if (loadIndicator) loadIndicator.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Ifigenia Administrator</name></author>
	</entry>
</feed>