MediaWiki:Common-my.js: различия между версиями

Материал из Буквицы
Перейти к навигации Перейти к поиску
Строка 1457: Строка 1457:
 
} );
 
} );
 
};
 
};
+
 
 +
var customizeToolbar = function() {
 +
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
 +
        'sections': {
 +
                'blanks': {
 +
                        'type': 'toolbar', // Can also be 'booklet'
 +
                        'label': 'Заготовки'
 +
                        // or 'labelMsg': 'section-emoticons-label' for a localized label
 +
                }
 +
        }
 +
} );
 +
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
 +
        'section': 'blanks',
 +
        'groups': {                                                                                 
 +
          'blanks-g': {                                                                         
 +
          'tools': {               
 +
'blank-page':{
 +
  'label':'--Пустая статья--',
 +
  'type':'select',
 +
    'list':{
 +
      'blank-page-2':{
 +
        'label':'Автор и т.п.',
 +
        'action':{
 +
          'type':'callback',
 +
            execute: function(context){loadPage("MediaWiki:Common.js/Edit_tools_data/Автор");}
 +
        }
 +
      },
 +
      'blank-page-1':{
 +
        'label':'Исполнитель',
 +
        'action':{
 +
          'type':'callback',
 +
            execute: function(context){loadPage("MediaWiki:Common.js/Edit_tools_data/Исполнитель");}
 +
        }
 +
      }
 +
 
 +
    }
 +
},
 +
'blank-card':{
 +
  'label':'--Карточка--',
 +
  'type':'select',
 +
    'list':{
 +
      'blank-page-1':{
 +
        'label':'Персона',
 +
        'action':{
 +
          'type':'callback',
 +
            execute: function(context){loadPage("MediaWiki:Common.js/Edit_tools_data/Персона");}
 +
        }
 +
      },
 +
      'blank-page-2':{
 +
        'label':'Периодич. издание',
 +
        'action':{
 +
          'type':'callback',
 +
            execute: function(context){loadPage("MediaWiki:Common.js/Edit_tools_data/Периодика");}
 +
        }
 +
      }
 +
 
 +
    }
 +
},
 +
                'blank-ins': {
 +
                        label: '--Элемент статьи--', // or use labelMsg for a localized label, see above
 +
                        type: 'select',
 +
                              'list': {                                                                                   
 +
                                'blank-ins-1' : { // Вставить новую пустую категорию
 +
                                        'label': 'Категория',                             
 +
                                        'action': {                                                                 
 +
                                                'type': 'encapsulate',                                               
 +
                                                'options': {                                                         
 +
                                                  'pre': '[[Категория:',
 +
                                                  'peri': '', // <== сюда курсор (текущее выделение)
 +
                                                  'post': ']]',
 +
//                                                        'pre': '== ',                                               
 +
//                                                        'periMsg': 'wikieditor-toolbar-tool-heading-example',       
 +
//                                                        'post': ' ==',                                               
 +
//                                                        'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,                     
 +
//                                                        'regexReplace': "$1==$3==$4",                               
 +
//                                                        'ownline': true                                             
 +
                                                }                                                                   
 +
                                        }                                                                           
 +
                                },                                                                                   
 +
                                'blank-ins-2' : { // шаблон Автор статьи
 +
                                        'label': 'Подпись',                             
 +
                                        'action': {                                                                 
 +
                                                'type': 'encapsulate',                                               
 +
                                                'options': {
 +
                                                        'pre': '{{автор статьи|',
 +
                                                        'peri': 'Автор и дата',
 +
                                                        'post': '}}',
 +
                                                        'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,                     
 +
                                                        'regexReplace': "$1===$3===$4",                             
 +
//                                                        'ownline': true // новая строка
 +
                                                }                                                                   
 +
                                        }                                                                           
 +
                                }
 +
                        }
 +
                }
 +
        }
 +
}}
 +
} );
 +
 
 +
};
 +
////////////////////////////////////////
 +
 
 
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
 
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
 
         mw.loader.using( 'user.options', function () {
 
         mw.loader.using( 'user.options', function () {

Версия 10:03, 1 ноября 2013

/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */

importMW = function (name) { importScript('MediaWiki:'+name+'.js') }

importScript_ = importScript
importScript = function (page, proj){
 if (!proj) importScript_(page)
 else {
   if (proj.indexOf('.')==-1) proj += '.wikipedia.org'
   importScriptURI('//'+proj+'/w/index.php?action=raw&ctype=text/javascript&title='+mw.util.wikiUrlencode(page))
 }
}


mw.config.set( 'tableSorterCollation', {'ё':'е'} )


//Messages
var listFA = {
 fa:'Эта статья является избранной',
 fl:'Этот список или портал является избранным',
 ga:'Эта статья является хорошей'}
var textFA = ' в другом языковом разделе'

var zeroSectionTip = 'Править введение'

var NavigationBarHide = '[скрыть]'
var NavigationBarShow = '[показать]'
var NavigationBarShowDefault = 2

if( /^en$/.test(wgUserLanguage) ) importMW('Common-' + wgUserLanguage)



function LinkFA(){
 var ll, s
 $('#p-lang li').each( function(i, iw){
   ll = iw.className.split(' ')[0] + '-'
   for( var s in listFA )
     if( document.getElementById(ll + s) )
       $( iw )
        .addClass( s.toUpperCase() )
        .attr( 'title',  listFA[s] + textFA )
 })
}


function editZeroSection(){
 if( !wgArticleId ) return
 mw.util.$content.find('h2')
 .children('.mw-editsection:first')
 .clone().prependTo('#bodyContent')
 .css('float','right')
 .find('a')
 .attr('title', zeroSectionTip)
 .attr('href', wgScript + '?title='+mw.util.wikiUrlencode(wgPageName) + '&action=edit&section=0' )
} 


//Collapsiblе: [[ВП:СБ]]

var hasClass = (function (){
 var reCache = {}
 return function (element, className){
   return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className)
  }
})()

function collapsibleTables(){
 var Table, HRow,  HCell, btn, a, tblIdx = 0, colTables = []
 var allTables = document.getElementsByTagName('table')
 for (var i=0; Table = allTables[i]; i++){
   if (!hasClass(Table, 'collapsible')) continue
   if (!(HRow=Table.rows[0])) continue
   if (!(HCell=HRow.getElementsByTagName('th')[0])) continue
   Table.id = 'collapsibleTable' + tblIdx
   btn = document.createElement('span')
   btn.style.cssText = 'float:right; font-weight:normal; font-size:smaller'
   a = document.createElement('a')
   a.id = 'collapseButton' + tblIdx
   a.href = 'javascript:collapseTable(' + tblIdx + ');'
   a.style.color = HCell.style.color
   a.appendChild(document.createTextNode(NavigationBarHide))
   btn.appendChild(a)
   HCell.insertBefore(btn, HCell.childNodes[0])
   colTables[tblIdx++] = Table
 }
 for (var i=0; i < tblIdx; i++)
   if ((tblIdx > NavigationBarShowDefault && hasClass(colTables[i], 'autocollapse')) || hasClass(colTables[i], 'collapsed'))
     collapseTable(i)
}

function collapseTable (idx){
 var Table = document.getElementById('collapsibleTable' + idx)
 var btn = document.getElementById('collapseButton' + idx)
 if (!Table || !btn) return false
 var Rows = Table.rows
 var isShown = (btn.firstChild.data == NavigationBarHide)
 btn.firstChild.data = isShown ?  NavigationBarShow : NavigationBarHide
 var disp = isShown ? 'none' : Rows[0].style.display
 for (var i=1; i < Rows.length; i++)
    Rows[i].style.display = disp
}

function collapsibleDivs(){
 var navIdx = 0, colNavs = [], i, NavFrame
 var divs = document.getElementById('content').getElementsByTagName('div')
 for (i=0; NavFrame = divs[i]; i++) {
   if (!hasClass(NavFrame, 'NavFrame')) continue
   NavFrame.id = 'NavFrame' + navIdx
   var a = document.createElement('a')
   a.className = 'NavToggle'
   a.id = 'NavToggle' + navIdx
   a.href = 'javascript:collapseDiv(' + navIdx + ');'
   a.appendChild(document.createTextNode(NavigationBarHide))
   for (var j=0; j < NavFrame.childNodes.length; j++)
     if (hasClass(NavFrame.childNodes[j], 'NavHead'))
       NavFrame.childNodes[j].appendChild(a)
   colNavs[navIdx++] = NavFrame
 }
 for (i=0; i < navIdx; i++)
  if ((navIdx > NavigationBarShowDefault && !hasClass(colNavs[i], 'expanded')) || hasClass(colNavs[i], 'collapsed'))
     collapseDiv(i)
}

function collapseDiv(idx) {
 var div = document.getElementById('NavFrame' + idx)
 var btn = document.getElementById('NavToggle' + idx)
 if (!div || !btn) return false
 var isShown = (btn.firstChild.data == NavigationBarHide)
 btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide
 var disp = isShown ? 'none' : 'block'
 for (var child = div.firstChild;  child != null;  child = child.nextSibling)
   if (hasClass(child, 'NavPic') || hasClass(child, 'NavContent'))
      child.style.display = disp
}


//Execution
mw.loader.using( 'mediawiki.util', function() {


if (wgCanonicalNamespace == 'Special'){

 if (/^(Uplo|Sear|Stat|Spec|Abus|Prefe|Move|Watch|Newp|Log|Block$)/i.test(wgCanonicalSpecialPageName))
   importMW(wgCanonicalSpecialPageName)

}else switch (wgAction){

 case 'history': importMW('History'); break

 case 'delete': importMW('Deletepage'); break

 case 'edit': case 'submit': importMW('Editpage') //and continue with the default: view, purge

 default:

  $(editZeroSection)
  addOnloadHook(collapsibleDivs)
  addOnloadHook(collapsibleTables)
  mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400')
  if( document.location && document.location.protocol == 'https:' )
    importMW('Secure')
  if (navigator.platform.indexOf('Win') != -1)
    mw.util.addCSS('.IPA, .Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; }')


  
   switch( wgNamespaceNumber ){
    case 0: case 100:
      $(LinkFA)
      importMW('Osm')
      if( wgArticleId==4401 ) importMW('Mainpage')
      break
    case 6:
      importMW('Filepage')
      break
   }    

}


if( !wgUserName )  mw.util.addCSS('#mw-fr-revisiontag {display:none}')  //hide FlaggedRevs



/* Helper script for .hlist class in common.css
 * Author: [[:en:User:Edokter]]
 */
 
if ( $.client.profile().name == 'msie' ) {
  /* Add pseudo-selector class to last child list items in IE 8 */
  if ( $.client.profile().versionBase == '8' ) {
    $( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' )
      .addClass( 'hlist-last-child' );
  }
  /* Generate interpuncts and parens for IE < 8 */
  if ( $.client.profile().versionBase < '8' ) {
    $( '.hlist' ).find( 'dt + dd, dt + dt' ).prev()
      .append( '<b>:</b> ' );
    $( '.hlist' ).find( 'dd + dd, dd + dt, li + li' ).prev()
      .append( '<b>•</b> ' );
    $( '.hlist' ).find( 'dl dl, ol ol, ul ul' )
      .prepend( '( ' ).append( ') ' );
  }
}

// ВП:СО, кроме статей  В Контакте, Одноклассники и Facebook
if (wgArticleId!=639373 && wgArticleId!=932117 && wgArticleId!=1297302 && wgArticleId!=25133866)
 importMW('Wikibugs')


// iwiki sorting
 if (!wgUserName
     || (wgUserName
         && (((typeof wgLangPrefs == 'undefined') ? false : true)
             || ((typeof wgAddLangHints == 'undefined') ? false : wgAddLangHints)
             || ((typeof wgUseUserLanguage == 'undefined') ? false : wgUseUserLanguage))))
     importMW('Interwiki-links');


})     
     
     
//extra scripts

var withJS = document.URL.match(/[&?]withjs=((mediawiki:)?([^&#]+))/i)
if( withJS ) importScript_('MediaWiki:'+withJS[3])

var execJS = document.getElementById('executeJS')
if( execJS )
 $.each( execJS.className.split(' '), function(i, sc){
    sc = $.trim( sc.replace(/[^\w ]/g,'') )
    if( sc ) importMW('Script/' + sc)
  })
////////////////////////////////////////
/** Namespace constants */
var
NS_MEDIA          = -2,
NS_SPECIAL        = -1,
NS_MAIN           = 0,
NS_TALK           = 1,
NS_USER           = 2,
NS_USER_TALK      = 3,
NS_PROJECT        = 4,
NS_PROJECT_TALK   = 5,
NS_IMAGE          = 6,
NS_IMAGE_TALK     = 7,
NS_MEDIAWIKI      = 8,
NS_MEDIAWIKI_TALK = 9,
NS_TEMPLATE       = 10,
NS_TEMPLATE_TALK  = 11,
NS_HELP           = 12,
NS_HELP_TALK      = 13,
NS_CATEGORY       = 14,
NS_CATEGORY_TALK  = 15;
var
DEFAULT_USER_LANGUAGE = "ru",
FALLBACK_USER_LANGUAGE = "en";


/**
	Here users can apply display settings for navigation frames by class name.
	Examples:
		// frames with the class “user-bigbadframe” should be hidden by default
		myElementsDisplay["bigbadframe"] = false;

		// frames with the class “user-important” should be visible by default
		myElementsDisplay["important"] = true;
*/
var myElementsDisplay = {};

/**
	Replaces the scope in a function with the object’s one.
	Based on definition from the Prototype framework (http://prototype.conio.net/).
*/
Function.prototype.bind = function(object) {
	var __method = this;
	return function() {
		return __method.apply(object, arguments);
	}
}

/** Trim leading chars (or white-spaces) */
String.prototype.ltrim = function(chars) {
	var s = typeof chars == "undefined" ? "\s" : chars;
	return this.replace(new RegExp("^[" + s + "]+", "g"), "");
}

/** Trim ending chars (or white-spaces) */
String.prototype.rtrim = function(chars) {
	var s = typeof chars == "undefined" ? "\s" : chars;
	return this.replace(new RegExp("[" + s + "]+$", "g"), "");
}

/** Trim leading and ending white-spaces */
String.prototype.trim = function() {
	return this.ltrim().rtrim();
}

/** Checks if a value exists in an array */
function inArray(val, arr) {
	if ( null == arr ) {
		return false;
	}
	for (var i = 0, len = arr.length; i < len ; i++) {
		if (arr[i] === val) {
			return true;
		}
	}
	return false;
}

/** Set display mode for all elements with a given class name */
function setElementsDisplayByClassName(className, display) {
	var els = getElementsByClassName(document, "*", className);
	for (var i = 0; i < els.length; i++) {
		els[i].style.display = display;
	}
}

/** Hide all elements with a given class name */
function hideElementsByClassName(className) {
	setElementsDisplayByClassName(className, "none");
}

/** Show all elements with a given class name */
function showElementsByClassName(className) {
	setElementsDisplayByClassName(className, "");
}


/* Test if an element has a certain class **************************************
 *
 * Description: Uses regular expressions and caching for better performance.
 * Maintainers: [[:en:User:Mike Dillon]], [[:en:User:R. Koot]], [[:en:User:SG]]
 */
var hasClass = (function () {
    var reCache = {};
    return function (element, className) {
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
    };
})();

var Creator = {
	createOptgroup: function(label, data) {
		var g = document.createElement("optgroup");
		g.label = label;
		for (var i in data) {
			g.appendChild( Creator.createOption(data[i], i) );
		}
		return g;
	},

	createOption: function(val, text) {
		var o = document.createElement("option");
		o.value = val;
		o.appendChild( document.createTextNode(text) );
		return o;
	},

	createAnchor: function(url, text, title) {
		var attrs = { "href" : url, "title" : title };
		return Creator.createElement("a", attrs, text);
	},

	createHiddenField: function(name, value) {
		var attrs = { "type" : "hidden", "name" : name, "value" : value };
		return Creator.createElement("input", attrs);
	},

	createTextarea: function(id, name, value, rows, cols) {
		var attrs = { "id" : id, "name" : name || id,
			"rows" : rows || 3, "cols" :  cols || 40 };
		return Creator.createElement("textarea", attrs, value || "");
	},

	createElement: function(node, attrs, content) {
		var e = document.createElement(node);
		for (var attr in attrs) {
			e.setAttribute(attr, attrs[attr]);
		}
		if (content instanceof Array) {
			Creator.appendChildrenTo(e, content);
		} else {
			Creator.appendChildTo(e, content);
		}
		return e;
	},

	createInternUrl: function(page, action, args) {
		page = encodeURI(page.replace(/ /g, "_"));
		if ( typeof(action) == "undefined" || action === null ) {
			return wgArticlePath.replace("$1", page);
		}
		var url = wgScript + "?title="+ page +"&action="+ action;
		if ( typeof(args) == "undefined" || args === null ) {
			return url;
		}
		for (var arg in args) {
			url += "&" + arg + "=" + args[arg];
		}
		return url;
	},

	appendChildrenTo: function(parent, children) {
		for (var i = 0; i < children.length; i++) {
			parent = Creator.appendChildTo(parent, children[i]);
		}
		return parent;
	},

	appendChildTo: function(parent, child) {
		if ( typeof(child) == "string" ) {
			parent.appendChild( document.createTextNode(child) );
		} else if ( typeof(child) == "object" && child.nodeType && child.nodeType === 1 ) {
			parent.appendChild(child);
		}
		return parent;
	}
};

// from http://www.quirksmode.org/js/cookies.html
// escape(), unescape() methods added
var Cookie = {
	create: function(name, value, days) {
		var expires;
		if (days) {
			var date = new Date();
			date.setTime(date.getTime() + (days*24*60*60*1000));
			expires = "; expires=" + date.toGMTString();
		} else {
			expires = "";
		}
		document.cookie = Cookie.escape(name) + "=" + Cookie.escape(value)
			+ expires + "; path=/";
	},

	read: function(name) {
		var nameEQ = Cookie.escape(name) + "=";
		var ca = document.cookie.split(';');
		for (var i = 0; i < ca.length; i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') {
				c = c.substring(1, c.length);
			}
			if (c.indexOf(nameEQ) === 0) {
				return Cookie.unescape(c.substring(nameEQ.length, c.length));
			}
		}
		return null;
	},

	erase: function(name) {
		Cookie.create(name, "", -1);
	},

	escape: function(v) {
		return encodeURIComponent(v);
	},
	unescape: function(v) {
		return decodeURIComponent(v);
	}
};


var _lang_messages = {};
var _debug_lang = false;

function MessageLanguage() {
	this.lang = DEFAULT_USER_LANGUAGE;
	this.messages = new Object();
	this.prefix = "";

	this.addMessages = function(messages, code, prefix) {
		if ( typeof this.messages[code] == "undefined" ) {
			this.messages[code] = new Object();
		}
		var p = typeof prefix == "string" ? prefix : "";
		for (var key in messages) {
			if ( typeof key == "string" ) {
				this.messages[code][p + key] = messages[key];
			}
		}
	};

	this.setLanguage = function(langCode) {
		this.lang = langCode;
		this.importMessages( this.lang );
	};

	this.setPrefix = function(prefix) {
		this.prefix = prefix;
	};

	this.msg = function(key) {
		key = this.prefix + key;
		var msg = this.messages[this.lang] && this.messages[this.lang][key];
		if ( typeof msg == "undefined" ) {
			if ( _debug_lang ) alert(key + " го няма на "+this.lang);
			msg = this.messages[FALLBACK_USER_LANGUAGE]
				&& this.messages[FALLBACK_USER_LANGUAGE][key];
		}
		if ( typeof msg == "undefined" ) {
			return "{"+ key +"}";
		}
		for (var i = 1; i < arguments.length; i++) {
			msg = msg.replace( new RegExp("\\$"+i, "g"), arguments[i]);
		}
		return msg;
	};

	this.importMessages = function(lang) {
		importScript("MediaWiki:Messages/" + lang + ".js");
	};
}


var gLang = new MessageLanguage();

// import message files
gLang.setLanguage( wgUserLanguage );

var mainLangs = [ DEFAULT_USER_LANGUAGE, FALLBACK_USER_LANGUAGE ];
if ( ! inArray( wgUserLanguage, mainLangs ) ) {
	gLang.importMessages( FALLBACK_USER_LANGUAGE );
}

// add messages on load
addOnloadHook( function() {
	if ( typeof _lang_messages[ wgUserLanguage ] == "object" ) {
		gLang.addMessages( _lang_messages[ wgUserLanguage ], wgUserLanguage );
	}
	if ( typeof _lang_messages[ FALLBACK_USER_LANGUAGE ] == "object" ) {
		if ( ! inArray( wgUserLanguage, mainLangs ) ) {
			gLang.addMessages( _lang_messages[ FALLBACK_USER_LANGUAGE ],
				FALLBACK_USER_LANGUAGE );
		}
	}
});


/** Attach (or remove) an Event to a specific object **********
 * Cross-browser event attachment (John Resig)
 * http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
 *
 * obj  : DOM tree object to attach the event to
 * type : String, event type ("click", "mouseover", "submit", etc.)
 * fn   : Function to be called when the event is triggered (the ''this''
 *        keyword points to ''obj'' inside ''fn'' when the event is triggered)
 *
 * Local Maintainer: [[meta:User:Dschwen]]
 */

function addEvent( obj, type, fn )
{
 if (obj.addEventListener)
  obj.addEventListener( type, fn, false );
 else if (obj.attachEvent)
 {
  obj["e"+type+fn] = fn;
  obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
  obj.attachEvent( "on"+type, obj[type+fn] );
 }
}

function removeEvent( obj, type, fn )
{
 if (obj.removeEventListener)
  obj.removeEventListener( type, fn, false );
 else if (obj.detachEvent)
 {
  obj.detachEvent( "on"+type, obj[type+fn] );
  obj[type+fn] = null;
  obj["e"+type+fn] = null;
 }
}


/** JSconfig ************
 * (copied from [[meta:MediaWiki:Common.js]])
 *
 * Global configuration options to enable/disable and configure
 * specific script features from [[MediaWiki:Common.js]] and
 * [[MediaWiki:Monobook.js]]
 * This framework adds config options (saved as cookies) to [[Special:Preferences]]
 * For a more permanent change you can override the default settings in your 
 * [[Special:Mypage/monobook.js]]
 * for Example: JSconfig.keys[loadAutoInformationTemplate] = false;
 *
 *  Maintainer: [[meta:User:Dschwen]]
 */
 
var JSconfig =
{
 prefix : 'jsconfig_',
 keys : {},
 meta : {},
 
 //
 // Register a new configuration item
 //  * name          : String, internal name
 //  * default_value : String or Boolean (type determines configuration widget)
 //  * description   : String, text appearing next to the widget in the preferences
 //  * prefpage      : Integer (optional), section in the preferences to insert the widget:
 //                     0 : User profile
 //                     1 : Skin
 //                     2 : Math
 //                     3 : Files
 //                     4 : Date and time
 //                     5 : Editing
 //                     6 : Recent changes
 //                     7 : Watchlist
 //                     8 : Search
 //                     9 : Misc
 //
 // Access keys through JSconfig.keys[name]
 //
 registerKey : function( name, default_value, description, prefpage )
 {
  if( typeof(JSconfig.keys[name]) == 'undefined' ) 
   JSconfig.keys[name] = default_value;
  else {
 
   // all cookies are read as strings, 
   // convert to the type of the default value
   switch( typeof(default_value) )
   {
    case 'boolean' : JSconfig.keys[name] = ( JSconfig.keys[name] == 'true' ); break;
    case 'number'  : JSconfig.keys[name] = JSconfig.keys[name]/1; break;
   }
 
  }
 
  JSconfig.meta[name] = { 'description' : description, 'page' : prefpage || 0, 'default_value' : default_value };
 },
 
 readCookies : function()
 {
  var cookies = document.cookie.split("; ");
  var p =JSconfig.prefix.length;
  var i;
 
  for( var key in cookies )
  {
   if( cookies[key].substring(0,p) == JSconfig.prefix )
   {
    i = cookies[key].indexOf('=');
    //alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) );
    JSconfig.keys[cookies[key].substring(p,i)] = cookies[key].substring(i+1);
   }
  }
 },
 
 writeCookies : function()
 {
  for( var key in JSconfig.keys )
   document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=Thu, 2 Aug 2009 10:10:10 UTC';
 },
 
 evaluateForm : function()
 {
  var w_ctrl,wt;
  //alert('about to save JSconfig');
  for( var key in JSconfig.meta ) {
   w_ctrl = document.getElementById( JSconfig.prefix + key )
   if( w_ctrl ) 
   {
    wt = typeof( JSconfig.meta[key].default_value );
    switch( wt ) {
     case 'boolean' : JSconfig.keys[key] = w_ctrl.checked; break;
     case 'string' : JSconfig.keys[key] = w_ctrl.value; break;
    }
   }
  }
 
  JSconfig.writeCookies();
  return true;
 },
 
 setUpForm : function()
 { 
  var prefChild = document.getElementById('preferences');
  if( !prefChild ) return;
  prefChild = prefChild.childNodes;
 
  //
  // make a list of all preferences sections
  //
  var tabs = new Array;
  var len = prefChild.length;
  for( var key = 0; key < len; key++ ) {
   if( prefChild[key].tagName &&
       prefChild[key].tagName.toLowerCase() == 'fieldset' ) 
    tabs.push(prefChild[key]);
  }
 
  //
  // Create Widgets for all registered config keys
  //
  var w_div, w_label, w_ctrl, wt;
  for( var key in JSconfig.meta ) {
   w_div = document.createElement( 'DIV' );
 
   w_label = document.createElement( 'LABEL' );
   w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) )
   w_label.htmlFor = JSconfig.prefix + key;
 
   wt = typeof( JSconfig.meta[key].default_value );
 
   w_ctrl = document.createElement( 'INPUT' );
   w_ctrl.id = JSconfig.prefix + key;
 
   // before insertion into the DOM tree
   switch( wt ) {
    case 'boolean' : w_ctrl.type = 'checkbox'; break;
    case 'string'  : w_ctrl.type = 'text'; break;
   }
 
   w_div.appendChild( w_label );
   w_div.appendChild( w_ctrl );
   tabs[JSconfig.meta[key].page].appendChild( w_div );
 
   // after insertion into the DOM tree
   switch( wt ) {
    case 'boolean' : w_ctrl.defaultChecked = w_ctrl.checked = JSconfig.keys[key]; break;
    case 'string' : w_ctrl.defaultValue = w_ctrl.value = JSconfig.keys[key]; break;
   }
 
  }
  addEvent(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm );
 }
}
 
JSconfig.readCookies();
addOnloadHook(JSconfig.setUpForm);


 /** MediaWiki media player *******************************************************
   *
   *  Description: A Java player for in-browser playback of media files.
   *  Created by: [[:en:User:Gmaxwell]]
   */

mw.loader.load('//en.wikipedia.org/w/index.php?title=Mediawiki:Wikimediaplayer.js&action=raw&ctype=text/javascript');


/** Преместване на препратките [редактиране]
* Copyright 2006, Marc Mongenet. Licence GPL et GFDL.
* The function looks for <span class="editsection">, and moves them
* to the end of their parent.
* var oldEditsectionLinks=true disables the function.
*/

function setModifySectionStyle() {
	try {
		if ( typeof oldEditsectionLinks != 'undefined' && oldEditsectionLinks ) return;
		var spans = document.getElementsByTagName("span");
		for (var s = 0, len = spans.length; s < len; ++s) {
			var span = spans[s];
			if (span.className == "editsection") {
				span.style.cssFloat = span.style.styleFloat = "none";
				span.parentNode.appendChild(document.createTextNode(" "));
				span.parentNode.appendChild(span);
			}
		}
	} catch (e) { /* something went wrong */ }
}

addOnloadHook(setModifySectionStyle);


/* * * * * * * * * *   Toolbox add-ons   * * * * * * * * * */

/***** subPagesLink ********
 * Adds a link to subpages of current page
 * (copied from [[commons:MediaWiki:Common.js]] and slightly modified)
 *
 * JSconfig items: bool JSconfig.subPagesLink
 * 	(true=enabled (default), false=disabled)
 ****/
/*
var subPagesLink =
{
	wo_ns : [NS_MEDIA, NS_SPECIAL, NS_IMAGE, NS_CATEGORY],

	install: function()
	{
		// honor user configuration
		if( !JSconfig.keys['subPagesLink'] ) return;

		if ( document.getElementById("p-tb")
				&& ! inArray( wgNamespaceNumber, subPagesLink.wo_ns) )
		{
			addPortletLink( 'p-tb',
				Creator.createInternUrl('Special:Prefixindex/' + wgPageName +'/'),
				gLang.msg("tb-subpages"), 't-subpages' );
		}
	}
}
addOnloadHook( function() {
	JSconfig.registerKey('subPagesLink', true, gLang.msg("tb-subpages-settings"), 9);
	subPagesLink.install();

	if ( inArray("sysop", wgUserGroups) && wgCanonicalNamespace.indexOf("User") === 0 ) {
		addPortletLink( 'p-tb',
			Creator.createInternUrl('Специални:Потребителски права/' + wgTitle),
			"Управление на правата", 't-userrights' );
	}
});
*/

/**
* ProjectLinks
*
* by [[en:wikt:user:Pathoschild]] (idea from an older, uncredited script)
* generates a sidebar list of links to other projects
*
* (copied from [[en:wikt:MediaWiki:Monobook.js]] and modified)
*/
function Projectlinks() {
	var ptb = document.getElementById("p-tb");
	if ( ! ptb ) {
		return; // no toolbox, no place to go, asta la vista
	}

	var wrappers = getElementsByClassName(document, "*", 'interProject');
	if ( wrappers.length == 0 ) {
		return;
	}
	var elements = [];

	var projects = {
		"wiktionary" : gLang.msg("wiktionary"),
		"wikiquote" : gLang.msg("wikiquote"),
		"wikibooks" : gLang.msg("wikibooks"),
		"wikisource" : gLang.msg("wikisource"),
		"wikinews" : gLang.msg("wikinews"),
		"wikispecies" : gLang.msg("wikispecies"),
		"wikiversity" : gLang.msg("wikiversity"),
		"commons.wiki" : gLang.msg("commons")
	};

	function getProjectName(url) {
		for ( var code in projects ) {
			if ( url.indexOf( code ) != -1 ) {
				return projects[code];
			}
		}
		return "";
	};

	// get projectlinks
	for (var i = 0; i < wrappers.length; i++) {
		var url = wrappers[i].getElementsByTagName('a')[0].cloneNode(true);
		url.innerHTML = getProjectName(url.href);
		elements[i] = url;
	}

	// sort alphabetically
	function sortbylabel(a, b) {
		return (a.innerHTML < b.innerHTML) ? -1 : 1;
	}
	elements.sort(sortbylabel);

	// create list
	var pllist = document.createElement('ul');
	for (var i = 0; i < elements.length; i++) {
		var plitem = Creator.createElement('li', {}, elements[i]);
		pllist.appendChild(plitem);
	}
	// and navbox
	var plheader = Creator.createElement('h5', {}, gLang.msg("tb-inother"));
	var plbox = Creator.createElement('div', {'class' : 'pBody body'}, pllist);
	var portlet = Creator.createElement( 'div',
		{'class' : 'portlet portal persistent', 'id' : 'p-sl'}, [plheader, plbox] );
	ptb.parentNode.insertBefore(portlet, ptb.nextSibling);
}

addOnloadHook(Projectlinks);


/**
	чрез тази функция се показва поздравително съобщение на всеки НЕвлязъл потребител, ако:
		— страницата НЕ е защитена
		— страницата Е от основното именно пространство, т.е. Е статия
		— има препращач
		— препращачът НЕ съдържа wikipedia.org (например идва от Гугъл)
	взета е от [[:de:MediaWiki:Monobook.js]], с малки промени
*/
function externMessage() {
	if (
		((self.location.href + "").indexOf("/wiki/") != -1) &&  // дали потребителят вече не редактира
		(document.getElementById("pt-login")) &&  // дали потребителят НЕ е влязъл
		(document.getElementById("ca-edit")) &&   // дали страницата НЕ е защитена
		(document.getElementsByTagName("body")[0].className == "ns-0") &&   // дали страницата Е статия
		(document.referrer != "") &&             // дали ИМА препращач
		(document.referrer.search(/wikipedia\.org/) == -1) // дали препращачът НЕ съдържа wikipedia.org
		)
	{
		var externMessage = document.createElement("div");
		externMessage.setAttribute('id','externMessage');
		// Съобщението, показвано на потребителите
		externMessage.innerHTML = '<b>Добре дошли</b> в Уикипедия! Можете не само да четете тази статия, но също така и да я <b><a href="/wiki/%D0%A3%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%92%D1%8A%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5" title="Повече информация за редактирането на статии в Уикипедия">редактирате и подобрите</a></b>.';
		document.getElementById("bodyContent").insertBefore(
		externMessage, document.getElementById("contentSub")
		);
	}
}

addOnloadHook(externMessage);


var _lang_messages = {};
var _debug_lang = false;

function MessageLanguage() {
	this.lang = DEFAULT_USER_LANGUAGE;
	this.messages = new Object();
	this.prefix = "";

	this.addMessages = function(messages, code, prefix) {
		if ( typeof this.messages[code] == "undefined" ) {
			this.messages[code] = new Object();
		}
		var p = typeof prefix == "string" ? prefix : "";
		for (var key in messages) {
			if ( typeof key == "string" ) {
				this.messages[code][p + key] = messages[key];
			}
		}
	};

	this.setLanguage = function(langCode) {
		this.lang = langCode;
		this.importMessages( this.lang );
	};

	this.setPrefix = function(prefix) {
		this.prefix = prefix;
	};

	this.msg = function(key) {
		key = this.prefix + key;
		var msg = this.messages[this.lang] && this.messages[this.lang][key];
		if ( typeof msg == "undefined" ) {
			if ( _debug_lang ) alert(key + " го няма на "+this.lang);
			msg = this.messages[FALLBACK_USER_LANGUAGE]
				&& this.messages[FALLBACK_USER_LANGUAGE][key];
		}
		if ( typeof msg == "undefined" ) {
			return "{"+ key +"}";
		}
		for (var i = 1; i < arguments.length; i++) {
			msg = msg.replace( new RegExp("\\$"+i, "g"), arguments[i]);
		}
		return msg;
	};

	this.importMessages = function(lang) {
		importScript("MediaWiki:Messages/" + lang + ".js");
	};
}


var gLang = new MessageLanguage();

// import message files
gLang.setLanguage( wgUserLanguage );

var mainLangs = [ DEFAULT_USER_LANGUAGE, FALLBACK_USER_LANGUAGE ];
if ( ! inArray( wgUserLanguage, mainLangs ) ) {
	gLang.importMessages( FALLBACK_USER_LANGUAGE );
}

// add messages on load
addOnloadHook( function() {
	if ( typeof _lang_messages[ wgUserLanguage ] == "object" ) {
		gLang.addMessages( _lang_messages[ wgUserLanguage ], wgUserLanguage );
	}
	if ( typeof _lang_messages[ FALLBACK_USER_LANGUAGE ] == "object" ) {
		if ( ! inArray( wgUserLanguage, mainLangs ) ) {
			gLang.addMessages( _lang_messages[ FALLBACK_USER_LANGUAGE ],
				FALLBACK_USER_LANGUAGE );
		}
	}
});
/* * * * * * * * * *   Edit tools functions   * * * * * * * * * */

/* * *   Extra buttons for text insertion   * * */

// от тези данни ще се генерират допълнителни бутони с insertTags()
var customInsButtons = {
	// "CODE" : ["LEFT", "MIDDLE", "RIGHT", "SHOWN TEXT", "TITLE"],
//	"b1" : ["#виж ["+"[", "Страница", "]]", "вж", "+команда за пренасочване"],
//	"b2" : ["<code>", "моля, въведете програмен код", "</code>", "<tt>код</tt>", "Текст в равноширок шрифт — обикновено код"],
//	"b3" : ["<sub>", "моля, въведете индекс", "</sub>", "a<sub>x</sub>", "+долен индекс"],
//	"b4" : ["<sup>", "моля, въведете степен", "</sup>", "a<sup>x</sup>", "+горен индекс"],
//	"b5" : ["\u00a0", "", "", "nbsp", "+несекаем интервал"],
//	"b6" : ["„", "текст в кавички", "“", "„“", "+български кавички"],
//	"b7" : ["<del>", "зачертан текст", "</del>", "<del>del</del>", "Отбелязване на текст като изтрит"],
//	"b8" : ["{"+"{", "", "}}", "{"+"{}}", "+скоби за шаблон"],
//	"b9" : ["|", "", "", "&nbsp;|&nbsp;", "+отвесна черта — |"],
//	"b10" : ["—", "", "", "—", "+дълга чертица — mdash"],
//	"b11" : ["–", "", "", "&nbsp;–&nbsp;", "+средна чертица — ndash"],
//	"b12" : ["", "", "&#768;", "удар.", "+ударение за гласна буква (маркирайте една буква)"],
//	"b13" : ["<"+"!-- ", "моля, въведете коментар", " -->", "&lt;!--", "+коментар"],
//	"b14" : ["{"+"{ЗАМЕСТ:-)}}", "", "", ":-)", "+шаблон „Усмивка“"],
//	"b15" : ["{"+"{ЗАМЕСТ:D}}", "", "", ":-D", "+шаблон „Ухилено човече“"],
//	"b16" : ["[[en:", "en", "]]", "en:", "+английско междуики"],
//	"b19" : ["{"+"{Br}}\n", "", "", "br", "+шаблон Br"],
//	"b20" : ["{"+"{subst:", "", "}}", "subst:", "+заместване на шаблон"],
//	"b21" : ["<ref>", "", "</ref>", "&lt;ref>", "+източник / бележка под линия"],
//	"b22" : ["["+"[", "", "]]", "[[...]]", "+препратка без разделител"],
//	"b23" : ["["+"[|", "", "]]", "[[...|...]]", "+препратка с разделител (курсорът е отдясно)"],
//	"b24" : ["["+"[:", "", "]]", "[[:...]]", "+текстова препратка"],
//	"b25" : ["#", "", "", "...#...", "+диез"]
};

// cleanup by articles
if ( "" == wgCanonicalNamespace && "edit" == wgAction ) {
	delete customInsButtons['b14'];
	delete customInsButtons['b15'];
	hookEvent("load", function() {
		var sig = document.getElementById('mw-editbutton-signature');
		if (sig) sig.style.display = "none";
	});
}


/* * *   Extra buttons for miscelaneous functions   * * */

// името на елемента за допълнителните знаци
var charsElemId = "extraChars";

// данни за още бутони с код по желание
var customMiscButtons = {
	// "CODE" : ["CODE TO RUN", "SHOWN TEXT", "TITLE"],
	// уикификатора
//	"#" : ["obrabotka(false)", "#", "Преобразуване на някои знаци"],
//	"$" : ["obrabotka(true)", "$", "Преобразуване на числа към БДС"],
	// допълнителните знаци
//	"ch" : ["addChars(); toggleElemDisplay('"+charsElemId+"');", "Още…",
//		"Виртуална клавиатура"]
};

/* * *   Drop down menus for template insertion   * * */

/* по идея на [[:he:MediaWiki:Summary|еврейската Уикипедия]] */
var tpl1 = {
	// "SHOWN TEXT" : "TEMPLATE CONTENT",
	"Элементы статьи…" : "-",
	"==  ==" : "\n== >>|<< ==\n",
	"===  ===" : "\n=== >>|<< ===\n",
	"Таблица" : "\n{| class=\"wikitable\"\n|+ >>|Заголовок таблицы|<<\n! колонка 1\n! колонка 2\n! колонка 3\n|-\n| ряд 1, ячейка 1\n| ряд 1, ячейка 2\n| ряд 1, ячейка 3\n|-\n| ряд 2, ячейка 1\n| ряд 2, ячейка 2\n| ряд 2, ячейка 3\n|}",
	"Галерея" : "<center><gallery caption=\">>|<<\">\n Image: | \n Image: | \n Image: | \n Image: | \n</gallery></center>",
	"Источники" : "\n== Источники ==\n<references />\n>>|<<",
	"Вижте също" : "\n== Вижте също ==\n* ["+"[>>|<<]]\n",
	"Външни препратки" : "\n== Външни препратки ==\n* [>>|<<]\n",
	"Сортиране по ключ" : "{"+"{СОРТКАТ:>>|<<}}",
	"Категория" : "["+"[Категория:>>|<<]]",
	"Мъниче" : "{"+"{мъниче>>|<<}}",
	"Към пояснение" : "{"+"{към пояснение|"+ wgTitle +"|>>|<<"+ wgTitle +" (пояснение)}}"
};

var atplb = "MediaWiki:Common.js/Edit_tools_data/";
var atpl1 = {
	// "SHOWN TEXT" : "PAGE NAME",
	"Тематические шаблоны…" : "-",
	"Исполнители аудиокниг" : atplb + "Исполнитель",
//	"Книга инфо" : atplb + "Книга инфо",
//	"Писател" : atplb + "Писател",
//	"Музикален албум" : atplb + "Музикален албум",
  //      "Музикален изпълнител" : atplb + "Музикален изпълнител", 
//	"Филм" : atplb + "Филм",
//	"Актьор" : atplb + "Актьор",
//	"Футболен отбор" : atplb + "Футболен отбор",
//	"Футболист" : atplb + "Футболист",
//	"Тенисист" : atplb + "Тенисист",
//	"Таксокутия" : atplb + "Таксокутия",
	"Самолет" : atplb + "Самолет"

};

var atpl2 = {
	"Рабочие шаблоны…" : "-",
	"Шаблони за статии" : {
		"Авторски права" : atplb + "Авторски права",
		"Бързо изтриване" : atplb + "Бързо изтриване",
		"Друго значение" : atplb + "Друго значение",
		"Изтриване" : atplb + "Изтриване",
		"Източник?" : atplb + "Източник",
		"Микромъниче" : atplb + "Микромъниче",
		"Обработка" : atplb + "Обработка",
		"Пояснение" : atplb + "Пояснение",
		"Превод от" : atplb + "Превод от",
		"Редактирам" : atplb + "Редактирам",
		"Сливане" : atplb + "Сливане",
		"Сюжет" : atplb + "Сюжет",
		"Цитат" : atplb + "Цитат",
		"Цитат уеб" : atplb + "Цитат уеб",
		"Цитат книга" : atplb + "Цитат книга",
		"Уикицитат" : atplb + "Уикицитат",
		"Commons" : atplb + "Commons",
		"Commonscat" : atplb + "Commonscat",
		"IMDB Name" : atplb + "Imdb name",
		"IMDB Title" : atplb + "Imdb title"
	},
	"Шаблони за беседи" : {
		"Добре дошли" : atplb + "Добре дошли",
		"Добре дошли нерег" : atplb + "Добре дошли нерег",		
		"Неподписано" : atplb + "Неподписано",
		"Предварителен преглед" : atplb + "П-преглед",
		"Забележка-вандал" : atplb + "П-вандал1",
		"Забележка-изтриване" : atplb + "П-изтриване1",
		"Забележка-копиране" : atplb + "П-копиране1",
		"Забележка-спам" : atplb + "П-спам1",
		"Забележка-тест" : atplb + "П-тест1",
		"Забележка-шега" : atplb + "П-шега1"
	},
	"Шаблони за картинки" : {
		"Без лиценз" : atplb + "Без лиценз"
	},
	"Шаблони за категории" : {
		"Категория" : atplb + "Категория",
		"Категория инфо" : atplb + "Категория инфо"
	},
	"Шаблони за шаблони" : {
		"Навигационен шаблон" : atplb + "Навигационен шаблон",
		"Шаблон на мъниче" : atplb + "Шаблон на мъниче",
		"Includeonly" : atplb + "Includeonly",
		"Noinclude" : atplb + "Noinclude"
	}
};

var tplVarBaseName = "tpl";
var atplVarBaseName = "atpl";

var chars = [
       ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С',
	'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ь', 'Ю', 'Я', 'Ы', 'Э', 'а', 'б', 'в', 'г',
	'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х',
	'ц', 'ч', 'ш', 'щ', 'ъ', 'ь', 'ю', 'я', 'ы', 'э'],
       ['ѣ', 'ѫ', 'ѭ', 'ѧ', 'ѩ', 'Ї', 'Ҁ', 'Ѹ', 'Ѡ', 'Ѻ', 'Ъ', 'І', 'Ҍ', 'Ѩ', 'Ѭ', 'Ѯ', 'Ѵ',
	'Ѥ', 'Ѿ'],
       ['α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'σ',
	'ς', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω', 'Γ', 'Δ', 'Θ', 'Λ', 'Ξ', 'Π', 'Σ', 'Φ', 'Ψ', 'Ω'],
       ['½', '¼', '¾', '∫', '∑', '∏', '√', '−', '±', '∞', '≈', '~', '∝', '≡', '≠', '≤', '≥', '×',
	'·', '÷', '∂', '′', '″', '∇', '∮', '⊥', '‰', '∴', 'ℵ',	'ℋ', '℧', '^', '¹', '²', '³', '∈',
	'∉', '∩', '∪', '⊂', '⊃', '⊆', '⊇', '∧', '∨', 'ø', '¬',	'∃', '∀', '⇒', '⇐','⇓', '⇑',
	'⇔', '→', '←', '↓', '↑', '↔',  '⇄', '⇆', '⇋', '⇌', 'ℕ', 'ℤ', 'ℚ', 'ℝ', 'ℂ', '∅', '⋮',
	'⋯'],
       ['*', '~', '|', '[',  ']', '°', '№', '™', '©', '®', '¢', '€', '¥', '£', '¤', '¿', '¡',
	'«', '»', '§', '¶', '†', '‡', '•', '♀', '♂', '…', '¨'],
       ['Á', 'á', 'É', 'é', 'Í', 'í', 'Ó', 'ó', 'Ú', 'ú', 'À', 'à', 'È', 'è', 'Ì', 'ì', 'Ò', 'ò',
	'Ù', 'ù', 'Â', 'â', 'Ê', 'ê', 'Î', 'î',	'Ô', 'ô', 'Û', 'û', 'Ä', 'ä', 'Ë', 'ë', 'Ï', 'ï',
	'Ö', 'ö', 'Ü', 'ü', 'ß', 'Ã', 'ã', 'Ñ', 'ñ', 'Õ', 'õ', 'Ç', 'ç', 'Ģ', 'ģ', 'Ķ', 'ķ', 'Ļ',
	'ļ', 'Ņ', 'ņ', 'Ŗ', 'ŗ', 'Ş', 'ş', 'Ţ', 'ţ', 'Ć', 'ć', 'Ĺ', 'ĺ', 'Ń', 'ń', 'Ŕ', 'ŕ', 'Ś',
	'ś', 'Ý', 'ý', 'Ź', 'ź', 'Đ', 'đ', 'Ů', 'ů', 'Č', 'č', 'Ď', 'ď', 'Ľ', 'ľ', 'Ň', 'ň', 'Ř',
	'ř', 'Š', 'š', 'Ť', 'ť', 'Ž', 'ž', 'Ǎ', 'ǎ', 'Ě', 'ě', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ā',
	'ā', 'Ē', 'ē', 'Ī', 'ī', 'Ō', 'ō', 'Ū', 'ū', 'ǖ', 'ǘ', 'ǚ', 'ǜ', 'Ĉ', 'ĉ', 'Ĝ', 'ĝ', 'Ĥ',
	'ĥ', 'Ĵ', 'ĵ', 'Ŝ', 'ŝ', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ă', 'ă', 'Ğ', 'ğ', 'Ŭ', 'ŭ', 'Ċ', 'ċ', 'Ė',
	'ė', 'Ġ', 'ġ', 'İ', 'ı', 'Ż', 'ż', 'Ą', 'ą', 'Ę', 'ę', 'Į', 'į', 'Ų', 'ų', 'Ł', 'ł', 'Ő',
	'ő', 'Ű', 'ű', 'Ŀ', 'ŀ', 'Ħ', 'ħ', 'Ð', 'ð', 'Þ', 'þ', 'Œ', 'œ', 'Æ', 'æ', 'Ø', 'ø', 'Å',
	'å']
];

var showMenus = true;
var showButtons = true;

/* * *   Virtual keyboard characters   * * */

var existChars = false; // are the extra chars already added

/** generate and add extra chars in the element $charsElemId  */
function addChars() {
	// if there are extra chars already, do nothing
	if ( existChars ) { return; }
	var cont = '';
	var len = chars.length;
	for (var i in chars) {
		for (var j in chars[i]) {
			cont += "<a href=\"javascript:insertTags('"+chars[i][j]+"', '', '')\" "+
			'title="' + gLang.msg("et-addchar", chars[i][j]) +'">'+chars[i][j]+'</a> ';
		}
		if (i != len-1) { cont += '<br/>'; }
	}
	document.getElementById(charsElemId).innerHTML = cont;
	existChars = true;
}

/* * *   Extra buttons for text insertion   * * */

/** add some buttons and drop-down menus */
function setupCustomEditTools() {
	var toolbar = document.getElementById("toolbar");

	if ( !toolbar ) { 
		if ( ! document.getElementById("editform") ) {
			return;
		}
		// check for the enhanced toolbar
		if ( getElementsByClassName(document, "div", "toolbar").length ) {
			toolbar = putToolbar(true);
		} else {
			return;
		}
	}
	toolbar.className += " buttonlinks";
	if ( showMenus ) {
		// drop-down menus inserting text put direct in the javascript
		appendDropDownMenus(toolbar, tplVarBaseName, insertIntoWikiText);
		// drop-down menus inserting content from wiki pages
		appendDropDownMenus(toolbar, atplVarBaseName, loadPage);
	}
	if ( showButtons ) {
		appendCustomButtons(toolbar);
		appendExtraChars(toolbar);
	}
}

hookEvent("load", setupCustomEditTools);


function setCustomInsButton(code, left, middle, right, shownText, title) {
	customInsButtons[code] = [left, middle, right, shownText, title];
}

function setCustomMiscButton(code, codeToRun, shownText, title) {
	customMiscButtons[code] = [codeToRun, shownText, title];
}

function rmCustomInsButtons(rmButtons) {
	rmCustomButtons(customInsButtons, rmButtons);
}
function rmCustomMiscButtons(rmButtons) {
	rmCustomButtons(customMiscButtons, rmButtons);
}
function rmCustomButtons(allButtons, rmButtons) {
	for (var i = rmButtons.length - 1; i >= 0; i--) {
		delete( allButtons[ rmButtons[i] ] );
	}
}

function appendCustomButtons(parent) {
	var buts = document.createElement("div");
	buts.id = "custombuttons";
	for (var i in customInsButtons) {
		var el = customInsButtons[i];
		var title = el[4];
		if ( title.charAt(0) == "+" ) {
			title = gLang.msg("et-addpref") + title.substr(1);
		}
		appendCustomButton(buts,
			{"href": "javascript:insertTags('"+el[0] +"','"+el[2]+"','"+ el[1]+"')",
			"title": title, "innerHTML": el[3]});
	}
	for (var i in customMiscButtons) {
		var el = customMiscButtons[i];
		appendCustomButton(buts, {"href":"javascript:"+el[0], "title":el[2], "innerHTML":el[1]});
	}
	parent.appendChild(buts);
}

function appendCustomButton(box, item) {
	var b = document.createElement("a");
	for (var attr in item) { b[attr] = item[attr]; }
	box.appendChild(b);
	box.appendChild( document.createTextNode(" ") );
}

function appendExtraChars(parent) {
	if ( typeof(charsElemId) == "undefined" ) {
		return;
	}
	var chbox = document.createElement("div");
	chbox.id = charsElemId;
	chbox.style.display = "none";
	parent.appendChild(chbox);
}

function appendDropDownMenus(parent, tplVarBaseName, callback) {
	var tplVar = null;
	for ( var i = 1; tplVar = tplVarBaseName + i,
			eval("var tpl = typeof("+ tplVar +") == 'object' ? "+ tplVar +" : null"),
			tpl != null; i++ ) {
		appendDropDownMenu(parent, tpl, callback, "ddmenu_" + tplVar);
	}
}

/** generates a drop-down menu */
function appendDropDownMenu(parent, content, callback, id) {
	var box = document.createElement("select");
	box.id = id;
	box.title = gLang.msg("et-ddmenutitle");
	box.onchange = function() {
		if (this.value != "-") {
			callback(this.value);
			this.selectedIndex = 0;
		}
		return;
	};
	if ( appendOptions(box, content) > 1 ) {
		parent.appendChild(box);
	}
}


function appendOptions(box, opts) {
	var count = 0;
	for (var i in opts) {
		if (opts[i] == "") {
			continue; // skip emtpy entries
		}
		var child = typeof(opts[i]) == "object"
			? Creator.createOptgroup(i, opts[i])
			: Creator.createOption(opts[i], i);
		box.appendChild(child);
		count++;
	}
	return count;
}


/** show/hide an element */
function toggleElemDisplay(elemId) {
	var elem = document.getElementById(elemId);
	elem.style.display = elem.style.display == 'none' ? '' : 'none';
}

/**
	insert an edit toolbar before the textarea.
	useful for testing user script pages while previewing
	use it with:
		putToolbar();
	put in your script page, e.g. User:Your_Name/monobook.js
*/
function putToolbar(rightNow) {
	var toolbar = Creator.createElement("div", {"id" : "toolbar"});
	var putIt = function() {
		var editform = document.getElementById("editform");
		editform.parentNode.insertBefore(toolbar, editform);
	};
	if ( typeof rightNow != "undefined" && rightNow ) {
		putIt();
	} else {
		addOnloadHook(putIt);
	}
	return toolbar;
}


/* * * * * * * * * *   Ajax functions   * * * * * * * * * */

var prevReq;
var pageUrlTpl = wgScript + "?title=$1&action=raw&templates=expand";
var pageUrl = "";
var pageToFetch = "";

function loadPage(page) {
	prevReq = sajax_init_object();
	if ( !prevReq ) return false;
	pageToFetch = page;
	pageUrl = pageUrlTpl.replace(/\$1/, encodeURI(page));
	showLoadIndicator();
	prevReq.onreadystatechange = insertIntoWikiTextFromRequest;
	prevReq.open("GET", pageUrl, true);
	prevReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	prevReq.send(null);
	return true;
}

function insertIntoWikiTextFromRequest() {
	if ( prevReq.readyState != 4 ) {
		return;
	}
	hideLoadIndicator();
	if ( prevReq.status != 200 ) {
		window.alert(gLang.msg("et-ajaxerror", prevReq.status, prevReq.statusText,
			pageToFetch, pageUrl));
		return;
	}
	insertIntoWikiText(prevReq.responseText);
}

function insertIntoWikiText(content) {
	// delete text marked for no inclusion + <pre> and <nowiki>
	var re = /<!--noinclude-->.*<!--\/noinclude-->|<\/?pre>|<\/?nowiki>/g;
	content = content.replace(re, "");
	// replace escaped tags
	var specials = ["pre", "nowiki"];
	for (var i in specials) {
		re = new RegExp("\\[(\/?)"+ specials[i] +"\\]", "g");
		content = content.replace(re, "<$1"+ specials[i] +">");
	}

	// we can have >>|sample text|<< or >>|<< or just simple text
	var parts = null;
	var left, right, def = "";
	content = escapeNl(content);
	if ( ( parts = content.match(/(.*)>>\|(.*)\|<<(.*)/) ) ) {
		left = parts[1];
		def = parts[2];
		right = parts[3];
	} else { // no sample text: split at caret’s position
		parts = content.split(">>|<<");
		left = parts[0];
		delete(parts[0]);
		right = parts.join("");
	}
	insertTags(unescapeNl(left), unescapeNl(right), unescapeNl(def));
}

function escapeNl(s) { return s.replace(/\n/g, "\x01"); }
function unescapeNl(s) { return s.replace(/\x01/g, "\n"); }

var loadIndicator;
function showLoadIndicator() {
	if ( loadIndicator ) {
		loadIndicator.style.display = "block";
		return;
	}
	loadIndicator = document.createElement("div");
	loadIndicator.id = "loadIndicator";
	loadIndicator.appendChild( document.createTextNode(gLang.msg("et-tplloading")) );
	document.getElementsByTagName("body")[0].appendChild(loadIndicator);
}

function hideLoadIndicator() {
	if (loadIndicator) loadIndicator.style.display = "none";
}
///////////////////////////////////////////
/*WikiEditor/Викификатор*/

if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
        mw.loader.load( '//ru.wikipedia.org/w/index.php?title=MediaWiki:Wikificator.js&action=raw&ctype=text/javascript');
}

var customizeToolbar = function() {

$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
        'section': 'main',
        'group': 'format',
        'tools': {
                'wikify': {
                        label: 'Викификатор',
                        type: 'button',
                        icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
                             action: {
                                  type: 'callback',
                                       execute: function(context){
                                              Wikify();
                                       } 
                             }
                }
        }
} );
};

var customizeToolbar = function() {
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
        'sections': {
                'blanks': {
                        'type': 'toolbar', // Can also be 'booklet'
                        'label': 'Заготовки'
                        // or 'labelMsg': 'section-emoticons-label' for a localized label
                }
        }
} );
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
        'section': 'blanks',
         'groups': {                                                                                   
          'blanks-g': {                                                                          
           'tools': {                
'blank-page':{
  'label':'--Пустая статья--',
  'type':'select',
    'list':{
      'blank-page-2':{
        'label':'Автор и т.п.',
        'action':{
          'type':'callback',
            execute: function(context){loadPage("MediaWiki:Common.js/Edit_tools_data/Автор");}
        }
      },
      'blank-page-1':{
        'label':'Исполнитель',
        'action':{
          'type':'callback',
            execute: function(context){loadPage("MediaWiki:Common.js/Edit_tools_data/Исполнитель");}
        }
      }

    }
},
'blank-card':{
  'label':'--Карточка--',
  'type':'select',
    'list':{
      'blank-page-1':{
        'label':'Персона',
        'action':{
          'type':'callback',
            execute: function(context){loadPage("MediaWiki:Common.js/Edit_tools_data/Персона");}
        }
      },
      'blank-page-2':{
        'label':'Периодич. издание',
        'action':{
          'type':'callback',
            execute: function(context){loadPage("MediaWiki:Common.js/Edit_tools_data/Периодика");}
        }
      }

    }
},
                'blank-ins': {
                        label: '--Элемент статьи--', // or use labelMsg for a localized label, see above
                        type: 'select',
                              'list': {                                                                                     
                                'blank-ins-1' : { // Вставить новую пустую категорию
                                        'label': 'Категория',                              
                                        'action': {                                                                   
                                                'type': 'encapsulate',                                                
                                                'options': {                                                          
                                                  'pre': '[[Категория:',
                                                  'peri': '', // <== сюда курсор (текущее выделение)
                                                  'post': ']]',
//                                                        'pre': '== ',                                                 
//                                                        'periMsg': 'wikieditor-toolbar-tool-heading-example',         
//                                                        'post': ' ==',                                                
//                                                        'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,                       
//                                                        'regexReplace': "$1==$3==$4",                                 
//                                                        'ownline': true                                               
                                                }                                                                     
                                        }                                                                             
                                },                                                                                    
                                'blank-ins-2' : { // шаблон Автор статьи
                                        'label': 'Подпись',                              
                                        'action': {                                                                   
                                                'type': 'encapsulate',                                                
                                                'options': {
                                                        'pre': '{{автор статьи|',
                                                        'peri': 'Автор и дата',
                                                        'post': '}}',
                                                        'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,                       
                                                        'regexReplace': "$1===$3===$4",                               
//                                                        'ownline': true // новая строка
                                                }                                                                     
                                        }                                                                             
                                }
                        }
                }
        }
}}
} );

};
////////////////////////////////////////

if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
        mw.loader.using( 'user.options', function () {
                if ( mw.user.options.get('usebetatoolbar') ) {
                        mw.loader.using( 'ext.wikiEditor.toolbar', function () {
                                $(document).ready( customizeToolbar );
                        } );
                }
        } );
}