Разлика между версии на „МедияУики:Common.js“

От БГ-Фантастика
Направо към: навигация, търсене
м (+Шаблон:Превод/празен в tplPages)
(целия код тук)
 
(Не са показани 41 междинни версии от трима потребители)
Ред 1: Ред 1:
/*
+
/** Namespace constants */
Чрез редактиране на този файл можете да промените някои неща на Джаваскрипт за облика Монобук
+
var
<pre>
+
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;
  
/* tooltips and access keys */
+
var
var ta = {
+
DEFAULT_USER_LANGUAGE = "bg",
'pt-userpage' : ['.','Вашата потребителска страница'],
+
FALLBACK_USER_LANGUAGE = "en";
'pt-anonuserpage' : ['.','Потребителската страница за адреса, от който редактирате'],
+
 
'pt-mytalk' : ['n','Вашата дискусионна страница'],
+
/** Checks if a value exists in an array */
'pt-anontalk' : ['n','Дискусия относно редакциите от този адрес'],
+
function inArray(val, arr) {
'pt-preferences' : ['','Вашите настройки'],
+
var len = arr.length;
'pt-watchlist' : ['l','Списък на страници, чиито промени сте избрали да наблюдавате'],
+
for (var i = 0 ; i < len ; i++) {
'pt-mycontris' : ['y','Списък на Вашите приноси'],
+
if (arr[i] === val) {
'pt-login' : ['o','В момента не сте влезли. Насърчаваме Ви да влезете, въпреки че не е задължително.'],
+
return true;
'pt-anonlogin' : ['o','Насърчаваме Ви да влезете, въпреки че не е задължително.'],
+
}
'pt-logout' : ['o','Излизане от {{SITENAME}}'],
+
}
'ca-talk' : ['t','Беседа относно страницата'],
+
return false;
'ca-edit' : ['e','Можете да редактирате страницата. Моля, използвайте бутона за предварителен преглед преди да съхраните.'],
+
}
'ca-addsection' : ['+','Добавяне на коментар към страницата'],
+
 
'ca-viewsource' : ['e','Страницата е защитена. Може да разгледате изходния й код.'],
+
 
'ca-history' : ['h','Предишни версии на страницата'],
+
function importScript(page) {
'ca-protect' : ['=','Защитаване на страницата'],
+
var uri = wgScript + '?title=' +
'ca-delete' : ['d','Изтриване на страницата'],
+
encodeURIComponent(page.replace(/ /g,'_')).replace(/%2F/ig,'/').replace(/%3A/ig,':') +
'ca-undelete' : ['d','Възстановяване на изтрити редакции на страницата'],
+
'&action=raw&ctype=text/javascript';
'ca-move' : ['m','Преместване на страницата'],
+
return importScriptURI(uri);
'ca-nomove' : ['','Нямате разрешение за преместване на страницата'],
+
}
'ca-watch' : ['w','Добавяне на страницата към списъка Ви за наблюдение'],
+
 
'ca-unwatch' : ['w','Премахване на страницата от списъка Ви за наблюдение'],
+
var loadedScripts = {}; // included-scripts tracker
'search' : ['f','Претърсване на {{SITENAME}}'],
+
function importScriptURI(url) {
'p-logo' : ['','Началната страница'],
+
if (loadedScripts[url]) {
'n-mainpage' : ['z','Началната страница'],
+
return null;
'n-portal' : ['','Информация за проекта'],
+
}
'n-currentevents' : ['','Списък на основните категории в {{SITENAME}}'],
+
loadedScripts[url] = true;
'n-recentchanges' : ['r','Списък на последните промени в цялото уики'],
+
var s = document.createElement('script');
'n-randompage' : ['x','Случайна страница'],
+
s.setAttribute('src',url);
'n-help' : ['','Помощната страница'],
+
s.setAttribute('type','text/javascript');
'n-sitesupport' : ['','Подкрепете {{SITENAME}}'],
+
document.getElementsByTagName('head')[0].appendChild(s);
't-whatlinkshere' : ['j','Списък на всички страници, сочещи насам'],
+
return s;
't-recentchangeslinked' : ['k','Последните промени на страници, сочещи към тази страница'],
+
}
'feed-rss' : ['','RSS feed за страницата'],
+
// from http://www.quirksmode.org/js/cookies.html
'feed-atom' : ['','Atom feed за страницата'],
+
// escape(), unescape() methods added
't-contributions' : ['','Показване на приносите на потребителя'],
+
var Cookie = {
't-emailuser' : ['','Изпращане на писмо на потребителя'],
+
create: function(name, value, days) {
't-upload' : ['u','Качване на файлове'],
+
var expires;
't-specialpages' : ['q','Списък на всички специални страници'],
+
if (days) {
'ca-nstab-main' : ['c','Преглед на основната страница'],
+
var date = new Date();
'ca-nstab-user' : ['c','Преглед на потребителската страница'],
+
date.setTime(date.getTime() + (days*24*60*60*1000));
'ca-nstab-media' : ['c','Преглед на медийната страница'],
+
expires = "; expires=" + date.toGMTString();
'ca-nstab-special' : ['','Това е специална страница, която не може да се редактира.'],
+
} else {
'ca-nstab-wp' : ['c','Преглед на проектната страница'],
+
expires = "";
'ca-nstab-image' : ['c','Преглед на страницата на картинката'],
+
}
'ca-nstab-mediawiki' : ['c','Преглед на системното съобщение'],
+
document.cookie = Cookie.escape(name) + "=" + Cookie.escape(value)
'ca-nstab-template' : ['c','Преглед на шаблона'],
+
+ expires + "; path=/";
'ca-nstab-help' : ['c','Преглед на помощната страница'],
+
},
'ca-nstab-category' : ['c','Преглед на категорийната страница']
+
 
 +
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 );
 +
}
 +
}
 +
});
  
  
Ред 62: Ред 180:
 
// ТЕКСТ_ОТЛЯВО  ТЕКСТ_ОТДЯСНО  ТЕКСТ_ПО_СРЕДАТА  ЗАГЛАВИЕ  ПОКАЗАН_ТЕКСТ
 
// ТЕКСТ_ОТЛЯВО  ТЕКСТ_ОТДЯСНО  ТЕКСТ_ПО_СРЕДАТА  ЗАГЛАВИЕ  ПОКАЗАН_ТЕКСТ
 
["#виж ["+"[", "]]", "Страница", "+команда за пренасочване", "вж"],
 
["#виж ["+"[", "]]", "Страница", "+команда за пренасочване", "вж"],
 +
["„", "“", "текст в кавички", "+български кавички", "„“"],
 +
        ["&#768;", "", "", "+ударение за буква (изберете една буква)", "à"],
 
["<code>", "</code>", "моля, въведете програмен код", "Текст с фиксирана ширина на буквите — обикновено код", "<tt>код</tt>"],
 
["<code>", "</code>", "моля, въведете програмен код", "Текст с фиксирана ширина на буквите — обикновено код", "<tt>код</tt>"],
 
["<sub>", "</sub>", "моля, въведете индекс", "+долен индекс", "a<sub>x</sub>"],
 
["<sub>", "</sub>", "моля, въведете индекс", "+долен индекс", "a<sub>x</sub>"],
Ред 71: Ред 191:
 
["–", "", "", "+средна чертица — ndash", "&nbsp;–&nbsp;"],
 
["–", "", "", "+средна чертица — ndash", "&nbsp;–&nbsp;"],
 
["<"+"!-- ", " -->", "моля, въведете коментар", "+коментар", "&lt;!--"],
 
["<"+"!-- ", " -->", "моля, въведете коментар", "+коментар", "&lt;!--"],
["{"+"{ЗАМЕСТ:-)}}", "", "", "+шаблон „Усмивка“", ":-)"],
+
["{"+"{ЗАМЕСТ:)}}", "", "", "+шаблон „Усмивка“", ":-)"],
 
["{"+"{ЗАМЕСТ:D}}", "", "", "+шаблон „Ухилено човече“", ":-D"],
 
["{"+"{ЗАМЕСТ:D}}", "", "", "+шаблон „Ухилено човече“", ":-D"],
 
["<ref>", "</ref>", "", "Бележка под линия", "<small><sup>[1]</sup></small>"]
 
["<ref>", "</ref>", "", "Бележка под линия", "<small><sup>[1]</sup></small>"]
Ред 80: Ред 200:
 
];
 
];
  
var charsElemId = "extraChars";
+
 
 +
// тук посочвайте какви шаблони да се вмъкват чрез падащото меню „Инфокутия…“
 +
var tpl1 = {
 +
// "ПОКАЗВАН ТЕКСТ" : "ИМЕ НА СТРАНИЦАТА",
 +
"Инфокутия…" : "-",
 +
"Личност" : "Шаблон:Инфокутия личност/празен",
 +
"Произведение" : "Шаблон:Инфокутия произведение/празен",
 +
"Статия" : "Шаблон:Инфокутия статия/празен",
 +
"Рецензия" : "Шаблон:Инфокутия рецензия/празен",
 +
"Интервю" : "Шаблон:Инфокутия интервю/празен",
 +
"Книга" : "Шаблон:Инфокутия книга/празен",
 +
"Филм" : "Шаблон:Инфокутия филм/празен",
 +
        "Герой" : "Шаблон:Инфокутия герой/празен",
 +
"Издателство" : "Шаблон:Инфокутия издателство/празен",
 +
"Клуб" : "Шаблон:Инфокутия клуб/празен",
 +
"Списание брой" : "Шаблон:Инфокутия списание брой/празен",
 +
"Вложка писател" : "Шаблон:Инфокутия вложка писател/празен",
 +
"Вложка преводач" : "Шаблон:Инфокутия вложка преводач/празен",
 +
"Вложка критик" : "Шаблон:Инфокутия вложка критик/празен",
 +
"Вложка журналист" : "Шаблон:Инфокутия вложка журналист/празен",
 +
"Вложка рецензент" : "Шаблон:Инфокутия вложка рецензент/празен",
 +
"Вложка фен" : "Шаблон:Инфокутия вложка фен/празен",
 +
"Вложка издател" : "Шаблон:Инфокутия вложка издател/празен",
 +
"Вложка художник" : "Шаблон:Инфокутия вложка художник/празен",
 +
"Вложка музикант" : "Шаблон:Инфокутия вложка музикант/празен"
 +
};
 +
 
 +
// тук посочвайте какви шаблони да се вмъкват чрез падащото меню „Образец…“
 +
var tpl2 = {
 +
// "ПОКАЗВАН ТЕКСТ" : "ИМЕ НА СТРАНИЦАТА",
 +
"Образец статия…" : "-",
 +
"Писател" : "БГ-Фантастика:Образец за статия за писател",
 +
"Художник" : "БГ-Фантастика:Образец за статия за художник",
 +
"Музикант" : "БГ-Фантастика:Образец за статия за музикант",
 +
"Преводач" : "БГ-Фантастика:Образец за статия за преводач",
 +
"Режисьор" : "БГ-Фантастика:Образец за статия за режисьор",
 +
"Актьор" : "БГ-Фантастика:Образец за статия за актьор",
 +
"Издател" : "БГ-Фантастика:Образец за статия за издател",
 +
"Редактор" : "БГ-Фантастика:Образец за статия за редактор",
 +
"Фен" : "БГ-Фантастика:Образец за статия за фен",
 +
"Произведение" : "БГ-Фантастика:Образец за статия за литературно произведение",
 +
"Книга" : "БГ-Фантастика:Образец за статия за книга",
 +
"Вестник" : "БГ-Фантастика:Образец за статия за вестник",
 +
"Списание" : "БГ-Фантастика:Образец за статия за списание",
 +
"Поредица" : "БГ-Фантастика:Образец за статия за поредица",
 +
"Вестник брой" : "БГ-Фантастика:Образец за статия за брой на вестник",
 +
"Списание брой" : "БГ-Фантастика:Образец за статия за брой на списание",
 +
"Герой" : "БГ-Фантастика:Образец за статия за герой на произведение",
 +
"Второст. герои" : "БГ-Фантастика:Образец за статия за второстепенни герои в произведение",
 +
"Място" : "БГ-Фантастика:Образец за статия за място в произведение",
 +
"Понятие" : "БГ-Фантастика:Образец за статия за понятие от произведение",
 +
"Издателство" : "БГ-Фантастика:Образец за статия за издателство",
 +
"Фен-клуб" : "БГ-Фантастика:Образец за статия за фен-клуб",
 +
"Събитие" : "БГ-Фантастика:Образец за статия за събитие"
 +
};
 +
 
 +
// тук посочвайте какви шаблони да се вмъкват чрез падащото меню „Шаблон…“
 +
var tpl3 = {
 +
// "ПОКАЗВАН ТЕКСТ" : "ИМЕ НА СТРАНИЦАТА",
 +
"Шаблон…" : "-",
 +
"Превод" : "Шаблон:Превод/празен",
 +
"Пояснение" : "Шаблон:Пояснение/празен"
 +
};
 +
 
 +
// описания на падащите менюта
 +
var tplDescriptions = {
 +
1: "празна инфокутия",
 +
2: "образец за нова статия",
 +
3: "празен шаблон"
 +
};
 +
 
 +
var tplVarBaseName = "tpl";
  
 
// добавя нови бутони и други играчки
 
// добавя нови бутони и други играчки
Ред 104: Ред 295:
 
addCustomButton(tools, {"href":"javascript:"+el[0], "title":el[1], "innerHTML":el[2]});
 
addCustomButton(tools, {"href":"javascript:"+el[0], "title":el[1], "innerHTML":el[2]});
 
}
 
}
// падащото меню с шаблони
+
addDropDownMenus(toolbar); // падащите менюта
toolbar.appendChild( makeTemplateSelectBox() );
 
 
toolbar.appendChild(tools);
 
toolbar.appendChild(tools);
// елемент за допълнителните знаци
 
/*var chbox = document.createElement("div");
 
chbox.id = charsElemId;
 
chbox.style.display = "none";
 
toolbar.appendChild(chbox);*/
 
 
}
 
}
 +
 +
hookEvent("load", setupCustomEditTools);
  
 
function addCustomButton(box, item) {
 
function addCustomButton(box, item) {
Ред 121: Ред 308:
 
}
 
}
  
 +
function addDropDownMenus(parent) {
 +
var tplVar = null;
 +
for ( var i = 1; tplVar = tplVarBaseName + i,
 +
eval("var tpl = typeof("+ tplVar +") == 'object' ? "+ tplVar +" : null"),
 +
tpl != null; i++ ) {
 +
addDropDownMenu(parent, tpl, tplDescriptions[i]);
 +
}
 +
}
  
// тук посочвайте какви шаблони да се вмъкват чрез падащото меню
+
/** генерира падащо меню */
var tplPages = {
+
function addDropDownMenu(parent, content, title) {
// завършвайте всеки ред (с изключение на последния) със запетая
 
// иначе НЯМА ДА РАБОТИ
 
 
 
// "ИМЕ НА СТРАНИЦАТА" : "ПОКАЗВАН ТЕКСТ",
 
 
 
"Шаблон:Инфокутия личност/празен": "Инфокутия личност",
 
"Шаблон:Инфокутия книга/празен": "Инфокутия книга",
 
"Шаблон:Превод/празен": "Превод"
 
};
 
 
 
 
 
// този масив ще се попълва от всеки потребител на личната му js страница
 
var myTplPages = new Array();
 
 
 
// генерира падащото меню с шаблоните
 
function makeTemplateSelectBox() {
 
 
var box = document.createElement("select");
 
var box = document.createElement("select");
box.title = "Оттук можете да вмъкнете празен шаблон";
+
box.title = "Оттук можете да вмъкнете " + title;
 
box.onchange = function() {
 
box.onchange = function() {
if (this.value != "") {
+
if (this.value != "-") {
loadTemplate(this.value);
+
loadPage(this.value);
this.selectedIndex=0;
+
this.selectedIndex = 0;
 
}
 
}
return false;
+
return;
 
};
 
};
box.appendChild( newOption("", "Шаблон...") );
+
if ( appendOptions(box, content) > 1 ) {
for (var i in tplPages) {
+
parent.appendChild(box);
box.appendChild( newOption(i, tplPages[i]) );
 
 
}
 
}
for (var i in myTplPages) {
+
}
box.appendChild( newOption(i, myTplPages[i]) );
+
 
 +
 
 +
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"
 +
? newOptgroup(i, opts[i])
 +
: newOption(opts[i], i);
 +
box.appendChild(child);
 +
count++;
 
}
 
}
return box;
+
return count;
 +
}
 +
 
 +
function newOptgroup(label, data) {
 +
var g = document.createElement("optgroup");
 +
g.label = label;
 +
for (var i in data) {
 +
g.appendChild( newOption(data[i], i) );
 +
}
 +
return g;
 
}
 
}
  
Ред 173: Ред 372:
 
}
 
}
  
 +
 +
/* * * * * * * * * *  Ajax functions  * * * * * * * * * */
  
 
var prevReq;
 
var prevReq;
var tplUrl = "{{fullurl:TEMPLATE|action=raw}}";
+
if ( typeof(wgScript) == "undefined" ) {
var tplPageToFetch = "";
+
var wgScript = "/index.php";
 +
}
 +
var pageUrl = wgScript + "?title=$1&action=raw";
 +
var pageToFetch = "";
  
function loadTemplate(tplPage) {
+
function loadPage(page) {
prevReq = new XMLHttpRequest();
+
prevReq = sajax_init_object();
 
if( !prevReq ) return false;
 
if( !prevReq ) return false;
tplPageToFetch = tplPage;
+
pageToFetch = page;
var getUrl = tplUrl.replace(/TEMPLATE/, encodeURI(tplPage));
+
var getUrl = pageUrl.replace(/\$1/, encodeURI(page));
//alert("Страница: "+tplPage+"\nАдрес: "+getUrl);
+
showLoadIndicator();
 
prevReq.onreadystatechange = insertIntoWikiText;
 
prevReq.onreadystatechange = insertIntoWikiText;
 
prevReq.open("GET", getUrl, true);
 
prevReq.open("GET", getUrl, true);
 
prevReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 
prevReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
prevReq.send("");
+
prevReq.send(null);
 
return true;
 
return true;
 
}
 
}
Ред 195: Ред 399:
 
return;
 
return;
 
}
 
}
if( prevReq.status != 200 ) {
+
hideLoadIndicator();
 +
if ( prevReq.status != 200 ) {
 
window.alert("Неуспешна връзка: " + prevReq.status +
 
window.alert("Неуспешна връзка: " + prevReq.status +
" “" + prevReq.statusText + "”\nСтраница: "+ tplPageToFetch);
+
" “" + prevReq.statusText + "”\nСтраница: "+ pageToFetch);
 
return;
 
return;
 
}
 
}
insertTags(prevReq.responseText, "", "");
+
// изтриване на текст, отбелязан за невмъкване + <pre> и <nowiki>
 +
var re = /<!--noinclude-->.*<!--\/noinclude-->|<\/?pre>|<\/?nowiki>/g;
 +
var content = prevReq.responseText.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] +">");
 +
}
 +
// split at caret’s position
 +
var parts = content.split(">>|<<");
 +
var left = parts[0];
 +
delete(parts[0]);
 +
var right = parts.join("");
 +
insertTags(left, right, "");
 
}
 
}
  
// function copied from {{SERVER}}/skins/common/preview.js
+
var loadIndicator;
function openXMLHttpRequest() {
+
function showLoadIndicator() {
if( window.XMLHttpRequest ) {
+
if ( typeof(loadIndicator) != "undefined" ) {
return new XMLHttpRequest();
+
loadIndicator.style.display = "block";
} else if( window.ActiveXObject && navigator.platform != 'MacPPC' ) {
+
return;
// IE/Mac has an ActiveXObject but it doesn't work.
+
}
return new ActiveXObject("Microsoft.XMLHTTP");
+
var content = document.getElementById("content");
} else {
+
if ( !content ) { // no "content" element
return null;
+
return;
 
}
 
}
 +
loadIndicator = document.createElement("div");
 +
loadIndicator.id = "loadIndicator";
 +
loadIndicator.appendChild( document.createTextNode("Шаблонът се зарежда…") );
 +
content.appendChild(loadIndicator);
 
}
 
}
  
 
+
function hideLoadIndicator() {
hookEvent("load", setupCustomEditTools);
+
loadIndicator.style.display = "none";
 
+
}
/*</pre>*/
 

Текуща версия към 13:07, 25 февруари 2012

/** 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 = "bg",
FALLBACK_USER_LANGUAGE = "en";

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


function importScript(page) {
	var uri = wgScript + '?title=' +
		encodeURIComponent(page.replace(/ /g,'_')).replace(/%2F/ig,'/').replace(/%3A/ig,':') +
		'&action=raw&ctype=text/javascript';
	return importScriptURI(uri);
}

var loadedScripts = {}; // included-scripts tracker
function importScriptURI(url) {
	if (loadedScripts[url]) {
		return null;
	}
	loadedScripts[url] = true;
	var s = document.createElement('script');
	s.setAttribute('src',url);
	s.setAttribute('type','text/javascript');
	document.getElementsByTagName('head')[0].appendChild(s);
	return s;
}
// 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 );
		}
	}
});


// от тези данни ще се генерират допълнителни бутони с insertTags()
var customInsButtons = [
	// ТЕКСТ_ОТЛЯВО  ТЕКСТ_ОТДЯСНО  ТЕКСТ_ПО_СРЕДАТА  ЗАГЛАВИЕ  ПОКАЗАН_ТЕКСТ
	["#виж ["+"[", "]]", "Страница", "+команда за пренасочване", "вж"],
	["„", "“", "текст в кавички", "+български кавички", "„“"],
        ["&#768;", "", "", "+ударение за буква (изберете една буква)", "à"],
	["<code>", "</code>", "моля, въведете програмен код", "Текст с фиксирана ширина на буквите — обикновено код", "<tt>код</tt>"],
	["<sub>", "</sub>", "моля, въведете индекс", "+долен индекс", "a<sub>x</sub>"],
	["<sup>", "</sup>", "моля, въведете степен", "+горен индекс", "a<sup>x</sup>"],
	["&nbsp;", "", "", "+несекаем интервал", "nbsp"],
	["<del>", "</del>", "зачертан текст", "Отбелязване на текст като изтрит", "<del>del</del>"],
	["{"+"{", "}}", "", "+скоби за шаблон", "{{}}"],
	["—", "", "", "+дълга чертица — mdash", "—"],
	["–", "", "", "+средна чертица — ndash", "&nbsp;–&nbsp;"],
	["<"+"!-- ", " -->", "моля, въведете коментар", "+коментар", "&lt;!--"],
	["{"+"{ЗАМЕСТ:)}}", "", "", "+шаблон „Усмивка“", ":-)"],
	["{"+"{ЗАМЕСТ:D}}", "", "", "+шаблон „Ухилено човече“", ":-D"],
	["<ref>", "</ref>", "", "Бележка под линия", "<small><sup>[1]</sup></small>"]
];
// данни за още бутони с код по желание
var customMiscButtons = [
	// КОД_ЗА_ИЗПЪЛНЕНИЕ	ЗАГЛАВИЕ	ПОКАЗАН_ТЕКСТ
];


// тук посочвайте какви шаблони да се вмъкват чрез падащото меню „Инфокутия…“
var tpl1 = {
	// "ПОКАЗВАН ТЕКСТ" : "ИМЕ НА СТРАНИЦАТА",
	"Инфокутия…" : "-",
	"Личност" : "Шаблон:Инфокутия личност/празен",
	"Произведение" : "Шаблон:Инфокутия произведение/празен",
	"Статия" : "Шаблон:Инфокутия статия/празен",
	"Рецензия" : "Шаблон:Инфокутия рецензия/празен",
	"Интервю" : "Шаблон:Инфокутия интервю/празен",
	"Книга" : "Шаблон:Инфокутия книга/празен",
	"Филм" : "Шаблон:Инфокутия филм/празен",
        "Герой" : "Шаблон:Инфокутия герой/празен",
	"Издателство" : "Шаблон:Инфокутия издателство/празен",
	"Клуб" : "Шаблон:Инфокутия клуб/празен",
	"Списание брой" : "Шаблон:Инфокутия списание брой/празен",
	"Вложка писател" : "Шаблон:Инфокутия вложка писател/празен",
	"Вложка преводач" : "Шаблон:Инфокутия вложка преводач/празен",
	"Вложка критик" : "Шаблон:Инфокутия вложка критик/празен",
	"Вложка журналист" : "Шаблон:Инфокутия вложка журналист/празен",
	"Вложка рецензент" : "Шаблон:Инфокутия вложка рецензент/празен",
	"Вложка фен" : "Шаблон:Инфокутия вложка фен/празен",
	"Вложка издател" : "Шаблон:Инфокутия вложка издател/празен",
	"Вложка художник" : "Шаблон:Инфокутия вложка художник/празен",
	"Вложка музикант" : "Шаблон:Инфокутия вложка музикант/празен"
};

// тук посочвайте какви шаблони да се вмъкват чрез падащото меню „Образец…“
var tpl2 = {
	// "ПОКАЗВАН ТЕКСТ" : "ИМЕ НА СТРАНИЦАТА",
	"Образец статия…" : "-",
	"Писател" : "БГ-Фантастика:Образец за статия за писател",
	"Художник" : "БГ-Фантастика:Образец за статия за художник",
	"Музикант" : "БГ-Фантастика:Образец за статия за музикант",
	"Преводач" : "БГ-Фантастика:Образец за статия за преводач",
	"Режисьор" : "БГ-Фантастика:Образец за статия за режисьор",
	"Актьор" : "БГ-Фантастика:Образец за статия за актьор",
	"Издател" : "БГ-Фантастика:Образец за статия за издател",
	"Редактор" : "БГ-Фантастика:Образец за статия за редактор",
	"Фен" : "БГ-Фантастика:Образец за статия за фен",
	"Произведение" : "БГ-Фантастика:Образец за статия за литературно произведение",
	"Книга" : "БГ-Фантастика:Образец за статия за книга",
	"Вестник" : "БГ-Фантастика:Образец за статия за вестник",
	"Списание" : "БГ-Фантастика:Образец за статия за списание",
	"Поредица" : "БГ-Фантастика:Образец за статия за поредица",
	"Вестник брой" : "БГ-Фантастика:Образец за статия за брой на вестник",
	"Списание брой" : "БГ-Фантастика:Образец за статия за брой на списание",
	"Герой" : "БГ-Фантастика:Образец за статия за герой на произведение",
	"Второст. герои" : "БГ-Фантастика:Образец за статия за второстепенни герои в произведение",
	"Място" : "БГ-Фантастика:Образец за статия за място в произведение",
	"Понятие" : "БГ-Фантастика:Образец за статия за понятие от произведение",
	"Издателство" : "БГ-Фантастика:Образец за статия за издателство",
	"Фен-клуб" : "БГ-Фантастика:Образец за статия за фен-клуб",
	"Събитие" : "БГ-Фантастика:Образец за статия за събитие"
};

// тук посочвайте какви шаблони да се вмъкват чрез падащото меню „Шаблон…“
var tpl3 = {
	// "ПОКАЗВАН ТЕКСТ" : "ИМЕ НА СТРАНИЦАТА",
	"Шаблон…" : "-",
	"Превод" : "Шаблон:Превод/празен",
	"Пояснение" : "Шаблон:Пояснение/празен"
};

// описания на падащите менюта
var tplDescriptions = {
	1: "празна инфокутия",
	2: "образец за нова статия",
	3: "празен шаблон"
};

var tplVarBaseName = "tpl";

// добавя нови бутони и други играчки
function setupCustomEditTools() {
	var toolbar = document.getElementById("toolbar");
	// ако няма съществуващи бутони, няма да добавяме и тези
	if ( !toolbar ) { return; }
	toolbar.className += " buttonlinks";
	var tools = document.createElement("div");
	tools.id = "custombuttons";
	for (var i in customInsButtons) {
		var el = customInsButtons[i];
		var title = el[3];
		if ( title.charAt(0) == "+" ) {
			title = "Вмъкване на " + title.substr(1);
		}
		addCustomButton(tools,
			{"href": "javascript:insertTags('"+el[0] +"','"+el[1]+"','"+ el[2]+"')",
			"title": title, "innerHTML": el[4]});
	}
	for (var i in customMiscButtons) {
		var el = customMiscButtons[i];
		addCustomButton(tools, {"href":"javascript:"+el[0], "title":el[1], "innerHTML":el[2]});
	}
	addDropDownMenus(toolbar); // падащите менюта
	toolbar.appendChild(tools);
}

hookEvent("load", setupCustomEditTools);

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

function addDropDownMenus(parent) {
	var tplVar = null;
	for ( var i = 1; tplVar = tplVarBaseName + i,
			eval("var tpl = typeof("+ tplVar +") == 'object' ? "+ tplVar +" : null"),
			tpl != null; i++ ) {
		addDropDownMenu(parent, tpl, tplDescriptions[i]);
	}
}

/** генерира падащо меню */
function addDropDownMenu(parent, content, title) {
	var box = document.createElement("select");
	box.title = "Оттук можете да вмъкнете " + title;
	box.onchange = function() {
		if (this.value != "-") {
			loadPage(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"
			? newOptgroup(i, opts[i])
			: newOption(opts[i], i);
		box.appendChild(child);
		count++;
	}
	return count;
}

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

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


/* скрива/показва елемент */
function toggleElemDisplay(elemId) {
	var elem = document.getElementById(elemId);
	elem.style.display = elem.style.display == 'none' ? '' : 'none';
}


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

var prevReq;
if ( typeof(wgScript) == "undefined" ) {
	var wgScript = "/index.php";
}
var pageUrl = wgScript + "?title=$1&action=raw";
var pageToFetch = "";

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

function insertIntoWikiText() {
	if( prevReq.readyState != 4 ) {
		return;
	}
	hideLoadIndicator();
	if ( prevReq.status != 200 ) {
		window.alert("Неуспешна връзка: " + prevReq.status +
			" “" + prevReq.statusText + "”\nСтраница: "+ pageToFetch);
		return;
	}
	// изтриване на текст, отбелязан за невмъкване + <pre> и <nowiki>
	var re = /<!--noinclude-->.*<!--\/noinclude-->|<\/?pre>|<\/?nowiki>/g;
	var content = prevReq.responseText.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] +">");
	}
	// split at caret’s position
	var parts = content.split(">>|<<");
	var left = parts[0];
	delete(parts[0]);
	var right = parts.join("");
	insertTags(left, right, "");
}

var loadIndicator;
function showLoadIndicator() {
	if ( typeof(loadIndicator) != "undefined" ) {
		loadIndicator.style.display = "block";
		return;
	}
	var content = document.getElementById("content");
	if ( !content ) { // no "content" element
		return;
	}
	loadIndicator = document.createElement("div");
	loadIndicator.id = "loadIndicator";
	loadIndicator.appendChild( document.createTextNode("Шаблонът се зарежда…") );
	content.appendChild(loadIndicator);
}

function hideLoadIndicator() {
	loadIndicator.style.display = "none";
}