Версия для слабовидящих
MediaWiki:Common.js — различия между версиями
Материал из Ярославский педагогический университет
Wikiadmin (обсуждение | вклад) |
Wikiadmin (обсуждение | вклад) |
||
Строка 7: | Строка 7: | ||
importScript('MediaWiki:Search.js') | importScript('MediaWiki:Search.js') | ||
− | // | + | /**********************************************************************************/ |
+ | function addLoadEvent( f ) { addOnloadHook( f ); } | ||
+ | |||
+ | /** Функции импортирования ************************************************************* | ||
+ | * | ||
+ | * Описание: Включают викистраницу в сыром виде, в качестве джаваскрипта или CSS, | ||
+ | * что полезно при подключении дополнительных модулей в определённых условиях. | ||
+ | * Создал [[en:User:AzaToth]]. | ||
+ | * Под Традицию адаптировал администратор Dream | ||
+ | * Поддержку IE улучшил администратор Mithgol the Webmaster. | ||
+ | */ | ||
+ | function importScript( page ) { | ||
+ | var url = wgScriptPath + '/index.php?title=' | ||
+ | + escape( page.replace( ' ', '_' ) ) | ||
+ | + '&action=raw&ctype=text/javascript&dontcountme=s'; | ||
+ | var scriptElem = document.createElement( 'script' ); | ||
+ | scriptElem.setAttribute( 'src' , url ); | ||
+ | scriptElem.setAttribute( 'type' , 'text/javascript' ); | ||
+ | document.getElementsByTagName( 'head' )[0].appendChild( scriptElem ); | ||
+ | } | ||
+ | |||
+ | function importStylesheet( page ) { | ||
+ | var sheetPath = wgScriptPath + | ||
+ | '/index.php?title=' + | ||
+ | escape( page.replace( ' ', '_' ) ) + | ||
+ | '&action=raw&ctype=text/css'; | ||
+ | var sheetRule = '@import "' + sheetPath + '";'; | ||
+ | var styleElem = document.createElement( 'style' ); | ||
+ | styleElem.setAttribute( 'type' , 'text/css' ); | ||
+ | try { | ||
+ | var SheetTextNode = document.createTextNode( sheetRule ); | ||
+ | styleElem.appendChild( SheetTextNode ); | ||
+ | document.getElementsByTagName( 'head' )[0].appendChild( styleElem ); | ||
+ | } catch (e) { | ||
+ | try { | ||
+ | document.createStyleSheet(sheetPath); | ||
+ | } catch (ee) {} | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Простой пример импортирования: | ||
+ | // *) подключаем jQuery | ||
+ | // *) подключаем jQuery.scrollTo | ||
+ | // *) подключаем jQuery.localScroll | ||
+ | // *) когда всё подгрузится, задаём в Традиции плавную прокрутку по ссылкам из оглавлений | ||
+ | |||
+ | importScript('MediaWiki:JQuery.js'); | ||
+ | importScript('MediaWiki:ScrollTo.js'); | ||
+ | importScript('MediaWiki:LocalScroll.js'); | ||
+ | |||
+ | function jQueryLaunchTraditio(){ | ||
+ | $.localScroll({ // плавное проматывание страницы внутренними её гиперссылками | ||
+ | hash: true // указывать #... в конце гиперссылки | ||
+ | }); | ||
+ | |||
+ | toggleToc = function(){ // плавное сокрытие и открытие оглавления страницы | ||
+ | var toc = $('#toc ul:first'); | ||
+ | var toggleLink = $('#togglelink'); | ||
+ | |||
+ | if ((toc.length != 0) && (toggleLink.length != 0)) { | ||
+ | if (!( $(toc).is(':visible') )) { | ||
+ | toggleLink.text(tocHideText); | ||
+ | document.cookie = "hidetoc=0"; | ||
+ | } else { | ||
+ | toggleLink.text(tocShowText); | ||
+ | document.cookie = "hidetoc=1"; | ||
+ | }; | ||
+ | $(toc).slideToggle(1000); | ||
+ | }; | ||
+ | }; | ||
+ | } | ||
+ | addOnloadHook(jQueryLaunchTraditio); | ||
+ | |||
+ | // Сложный пример импортирования: подгрузка файла со скриптами для редактирования, | ||
+ | // только когда они действительно будут нужны. (Простому читателю, например, не нужны.) | ||
+ | |||
+ | if ((wgAction == 'edit' || wgAction == 'submit' || wgAction == 'formedit') | ||
+ | && wgCanonicalNamespace != 'Special' | ||
+ | || wgCanonicalSpecialPageName == 'AddData' | ||
+ | || wgCanonicalSpecialPageName == 'EditData'){ | ||
+ | importScript('MediaWiki:Onlyifediting.js'); | ||
+ | } | ||
+ | |||
+ | // Скрипт для редактирования с помощью форм: | ||
+ | if (wgAction == 'formedit' || wgCanonicalSpecialPageName == 'AddData' || wgCanonicalSpecialPageName == 'EditData') { | ||
+ | importScript('MediaWiki:OnlyIfFormEditing.js'); | ||
+ | } | ||
+ | |||
+ | /* Функция hasClass, заимствованная из английской Википедии через русскоязычную. | ||
+ | * | ||
+ | * Создаёт закрытый (private в объектно-ориентированном смысле) объект reCache | ||
+ | * (от англ. «regular expression cache», кэш регулярных выражений), который кэширует | ||
+ | * регулярные выражения (тоже объекты), при помощи которых можно проверять, принадлежит ли | ||
+ | * тот или иной элемент тому или иному классу (классу в HTML/CSS-смысле, а не в объектном). | ||
+ | * | ||
+ | * Такой подход позволяет функции hasClass не создавать регулярные выражения «на лету» | ||
+ | * всякий раз, когда они понадобятся, а использовать вместо этого готовые. Поэтому | ||
+ | * функция hasClass() удобна во всех случаях, когда есть необходимость проверять много | ||
+ | * элементов HTML на принадлежность одному и тому же классу. Она используется | ||
+ | * в реализации сворачивающихся таблиц и блоков (см. функции collapsibleTables | ||
+ | * и collapsibleDivs и тому подобные ниже); а может, и ещё для чего пригодится. | ||
+ | * | ||
+ | * Закрытость объекта reCache достигается механизмом JavaScript function closures: | ||
+ | * http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Working_with_Closures | ||
+ | */ | ||
+ | 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 auto_comment = 0 | ||
+ | |||
+ | /** Расширенный поиск ***************************************** | ||
+ | ** Автор: Участник:Dream | ||
+ | */ | ||
+ | function SpecialSearchEnhanced() | ||
+ | { | ||
+ | var mainNode = document.getElementsByTagName("form"); | ||
+ | if (!mainNode) return; | ||
+ | |||
+ | var searchValue = document.forms[0].search.value | ||
+ | var safeSearchValue = searchValue.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """); | ||
+ | var firstForm = mainNode[0]; | ||
+ | |||
+ | var node = document.createElement('div'); | ||
+ | |||
+ | var googleSearch = '<form action="http://www.google.com/custom" method="get" name="google" target="_blank" id="google">'; | ||
+ | googleSearch += '<input type="hidden" name="hl" value="ru" />'; | ||
+ | googleSearch += '<input type="hidden" name="domains" value="traditio.ru" />'; | ||
+ | googleSearch += '<input type="hidden" name="q" maxlength="2048" value="' + safeSearchValue + '" />' | ||
+ | googleSearch += '<input type="hidden" name="sitesearch" value="wiki.traditio.ru" />' | ||
+ | googleSearch += '<input type="button" value="Google по Традиции" onclick="document.google.q.value = document.forms[0].search.value; this.form.submit();" style="width: 12em;" />' | ||
+ | googleSearch += '</form>' | ||
+ | |||
+ | var yandexSearch = '<form action="http://www.yandex.ru/yandsearch" method="get" name="yandex" target="_blank" id="yandex">'; | ||
+ | yandexSearch += '<input type="hidden" name="text" maxlength="300" value="' + safeSearchValue + '" />'; | ||
+ | yandexSearch += '<input type="hidden" name="site" value="traditio.ru" />'; | ||
+ | yandexSearch += '<input type="hidden" name="ras" value="1" />' | ||
+ | yandexSearch += '<input type="hidden" name="site_manually" value="true" />' | ||
+ | yandexSearch += '<input type="hidden" name="server_name" value="Traditio" />' | ||
+ | yandexSearch += '<input type="button" value="Яндекс по Традиции" onclick="document.yandex.text.value = document.forms[0].search.value; this.form.submit();" style="width: 12em;" />' | ||
+ | yandexSearch += '</form>' | ||
+ | |||
+ | var ramblerSearch = '<form action="http://www.rambler.ru/srch?set=www&words" method="get" name="rambler" target="_blank" id="rambler">'; | ||
+ | ramblerSearch += '<input type="hidden" name="text" maxlength="300" value="' + safeSearchValue + '" />'; | ||
+ | ramblerSearch += '<input type="hidden" name="site" value="traditio.ru" />'; | ||
+ | ramblerSearch += '<input type="hidden" name="ras" value="1" />' | ||
+ | ramblerSearch += '<input type="hidden" name="site_manually" value="true" />' | ||
+ | ramblerSearch += '<input type="hidden" name="server_name" value="Traditio" />' | ||
+ | ramblerSearch += '<input type="button" value="Рамблер по Традиции" onclick="document.rambler.text.value = document.forms[0].search.value; this.form.submit();" style="width: 12em;" />' | ||
+ | ramblerSearch += '</form>' | ||
+ | |||
+ | node.innerHTML = node.innerHTML + '<table style="margin-left: 75%; padding-left:4px;"><tr><td>' + yandexSearch + '</td></tr><tr><td>' + googleSearch + '</td></tr><tr><td>' + ramblerSearch + '</td></tr></table>'; | ||
+ | |||
+ | firstForm.parentNode.insertBefore(node, firstForm.nextSibling); | ||
+ | } | ||
+ | |||
+ | if (wgPageName == "Служебная:Search") { addOnloadHook(SpecialSearchEnhanced); } | ||
+ | |||
+ | /*************************************************************** | ||
+ | * | ||
+ | * Далее следует код, который: | ||
+ | * | ||
+ | * *) показывает значок статуса ICQ в шаблоне {{ICQ}} | ||
+ | * | ||
+ | * *) показывает консоль для отслеживания статуса игры Quake II | ||
+ | * на странице [[Quake II Deathmatch]] | ||
+ | * | ||
+ | */ | ||
+ | |||
+ | function LinkFA() { | ||
+ | // ICQ status background | ||
+ | $('span.ICQ').each(function(i){ | ||
+ | var ICQURL = 'http://status.icq.com/online.gif?icq=' + this.id + '&img=5'; | ||
+ | $(this).css({ | ||
+ | 'padding' : '0 0 0 20px', | ||
+ | 'background-image': 'url(' + ICQURL + ')', | ||
+ | 'background-repeat': 'no-repeat' | ||
+ | }); | ||
+ | }); | ||
+ | |||
+ | // Quake II consoles | ||
+ | $('span.quake2traditio').each(function(i){ | ||
+ | // проверяем, действительно ли указано имя сервера | ||
+ | // (защита от взлома Традиции, совершаемого впрыскиванием левого кода) | ||
+ | // имя.имя.имя...имя:порт, где имя == [a-zA-Z01-9][a-zA-Z01-9-]* | ||
+ | // а порт не обязателен | ||
+ | var TheText = $(this).text(); | ||
+ | if (TheText.match(/^([a-zA-Z01-9][a-zA-Z01-9-]*\.)+([a-zA-Z01-9][a-zA-Z01-9-]*)(:[1-9][01-9]*)?$/) | ||
+ | == null) | ||
+ | { | ||
+ | // не сервер: | ||
+ | $(this).html('<b>' + TheText + ' не является сервером Quake II</b>'); | ||
+ | } else { | ||
+ | // сервер: | ||
+ | $(this).html('<embed style="width: 100%;" height=388 type="application/x-q3plug-plugin" ' + | ||
+ | 'name="' + TheText + '" color="#ffeedd" color2="#88ff88" game="Q2" ' + | ||
+ | 'pluginspage="http://members.liwest.at/mb/q3plug" />'); | ||
+ | } // конец проверки того, действительно ли указано имя сервера | ||
+ | }); | ||
+ | } | ||
+ | addOnloadHook(LinkFA); | ||
+ | |||
+ | /****************************************************************************************** | ||
+ | * | ||
+ | * Сворачивающиеся блоки для шаблонов {{Навигационная таблица}}, {{Навигационная полоса}} | ||
+ | * и для таблиц class="collapsible" (см. на [[Справка:Оформление таблиц]] пример). | ||
+ | * | ||
+ | * Код полностью переписал Mithgol the Webmaster на основе jQuery в начале августа 2009 г. | ||
+ | * | ||
+ | */ | ||
+ | |||
var autoCollapse = 2; | var autoCollapse = 2; | ||
var collapseCaption = 'скрыть'; | var collapseCaption = 'скрыть'; | ||
var expandCaption = 'показать'; | var expandCaption = 'показать'; | ||
− | + | ||
function collapsibleTables(){ | function collapsibleTables(){ | ||
var allTables = $('#content table.collapsible'); | var allTables = $('#content table.collapsible'); | ||
− | + | ||
allTables.each(function(tblIdx){ | allTables.each(function(tblIdx){ | ||
var HRow = $('tr:first', this); | var HRow = $('tr:first', this); | ||
Строка 26: | Строка 243: | ||
return true; // continue next iteration of each() | return true; // continue next iteration of each() | ||
} | } | ||
− | + | ||
var Header = $('th:last', HRow); | var Header = $('th:last', HRow); | ||
if (Header.length == 0){ | if (Header.length == 0){ | ||
Строка 32: | Строка 249: | ||
return true; // continue next iteration of each() | return true; // continue next iteration of each() | ||
} | } | ||
− | + | ||
$(this).data('collapseIndex', tblIdx); | $(this).data('collapseIndex', tblIdx); | ||
Header.prepend( | Header.prepend( | ||
Строка 39: | Строка 256: | ||
collapseCaption + '</a>]</span>'); | collapseCaption + '</a>]</span>'); | ||
}); | }); | ||
− | + | ||
var processedTables = allTables.not('.wontCollapse'); | var processedTables = allTables.not('.wontCollapse'); | ||
if (processedTables.length > autoCollapse){ | if (processedTables.length > autoCollapse){ | ||
Строка 52: | Строка 269: | ||
}); | }); | ||
} | } | ||
− | + | ||
function collapseTable(linkObject){ // accepts both raw and jQuery-wrapped objects | function collapseTable(linkObject){ // accepts both raw and jQuery-wrapped objects | ||
var TheLink = $(linkObject); | var TheLink = $(linkObject); | ||
var TableRows = TheLink.closest('tr').parent().children().filter('tr').not(':first'); | var TableRows = TheLink.closest('tr').parent().children().filter('tr').not(':first'); | ||
if (TableRows.length == 0) return; | if (TableRows.length == 0) return; | ||
− | + | ||
var isShown = (TheLink.text() == collapseCaption); | var isShown = (TheLink.text() == collapseCaption); | ||
if (isShown) { | if (isShown) { | ||
Строка 72: | Строка 289: | ||
} | } | ||
addOnloadHook(collapsibleTables); | addOnloadHook(collapsibleTables); | ||
− | + | ||
var NavigationBarHide = '[' + collapseCaption + ']'; | var NavigationBarHide = '[' + collapseCaption + ']'; | ||
var NavigationBarShow = '[' + expandCaption + ']'; | var NavigationBarShow = '[' + expandCaption + ']'; | ||
Строка 92: | Строка 309: | ||
); | ); | ||
}); | }); | ||
− | + | ||
var processedDivs = NavFrameList.not('.wontCollapse'); | var processedDivs = NavFrameList.not('.wontCollapse'); | ||
if (processedDivs.length > NavigationBarShowDefault){ | if (processedDivs.length > NavigationBarShowDefault){ | ||
Строка 105: | Строка 322: | ||
}); | }); | ||
} | } | ||
− | + | ||
function collapseDiv(toggleObject){ // accepts both raw and jQuery-wrapped objects | function collapseDiv(toggleObject){ // accepts both raw and jQuery-wrapped objects | ||
var TheToggle = $(toggleObject); | var TheToggle = $(toggleObject); | ||
var TheFrame = TheToggle.closest('div.NavFrame'); | var TheFrame = TheToggle.closest('div.NavFrame'); | ||
if (TheFrame.length == 0) return false; | if (TheFrame.length == 0) return false; | ||
− | + | ||
TheToggle.text( (TheToggle.text() == NavigationBarHide) ? NavigationBarShow : NavigationBarHide); | TheToggle.text( (TheToggle.text() == NavigationBarHide) ? NavigationBarShow : NavigationBarHide); | ||
− | + | ||
TheFrame.children().filter('.NavPic, .NavContent').each(function(i){ | TheFrame.children().filter('.NavPic, .NavContent').each(function(i){ | ||
$(this).slideToggle(1000); | $(this).slideToggle(1000); | ||
Строка 118: | Строка 335: | ||
} | } | ||
addOnloadHook(collapsibleDivs); | addOnloadHook(collapsibleDivs); | ||
+ | |||
+ | /* Замена гиперссылки на кнопке «+» (например, наверху обсуждений) на другой адрес, | ||
+ | * если на странице был поставлен шаблон {{modifynewsectionlink}}. | ||
+ | */ | ||
+ | function newSectionLink(){ | ||
+ | var customLink = $('#add-custom-section a:first'); | ||
+ | if (customLink.length == 0) return; | ||
+ | $('#ca-addsection a:first').attr('href', customLink.attr('href')); | ||
+ | } | ||
+ | addOnloadHook(newSectionLink); | ||
//</source> | //</source> |
Версия 12:19, 22 октября 2009
/* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */ //<source lang=javascript> //External search if (wgCanonicalNamespace == 'Special' && wgCanonicalSpecialPageName == 'Search') importScript('MediaWiki:Search.js') /**********************************************************************************/ function addLoadEvent( f ) { addOnloadHook( f ); } /** Функции импортирования ************************************************************* * * Описание: Включают викистраницу в сыром виде, в качестве джаваскрипта или CSS, * что полезно при подключении дополнительных модулей в определённых условиях. * Создал [[en:User:AzaToth]]. * Под Традицию адаптировал администратор Dream * Поддержку IE улучшил администратор Mithgol the Webmaster. */ function importScript( page ) { var url = wgScriptPath + '/index.php?title=' + escape( page.replace( ' ', '_' ) ) + '&action=raw&ctype=text/javascript&dontcountme=s'; var scriptElem = document.createElement( 'script' ); scriptElem.setAttribute( 'src' , url ); scriptElem.setAttribute( 'type' , 'text/javascript' ); document.getElementsByTagName( 'head' )[0].appendChild( scriptElem ); } function importStylesheet( page ) { var sheetPath = wgScriptPath + '/index.php?title=' + escape( page.replace( ' ', '_' ) ) + '&action=raw&ctype=text/css'; var sheetRule = '@import "' + sheetPath + '";'; var styleElem = document.createElement( 'style' ); styleElem.setAttribute( 'type' , 'text/css' ); try { var SheetTextNode = document.createTextNode( sheetRule ); styleElem.appendChild( SheetTextNode ); document.getElementsByTagName( 'head' )[0].appendChild( styleElem ); } catch (e) { try { document.createStyleSheet(sheetPath); } catch (ee) {} } } // Простой пример импортирования: // *) подключаем jQuery // *) подключаем jQuery.scrollTo // *) подключаем jQuery.localScroll // *) когда всё подгрузится, задаём в Традиции плавную прокрутку по ссылкам из оглавлений importScript('MediaWiki:JQuery.js'); importScript('MediaWiki:ScrollTo.js'); importScript('MediaWiki:LocalScroll.js'); function jQueryLaunchTraditio(){ $.localScroll({ // плавное проматывание страницы внутренними её гиперссылками hash: true // указывать #... в конце гиперссылки }); toggleToc = function(){ // плавное сокрытие и открытие оглавления страницы var toc = $('#toc ul:first'); var toggleLink = $('#togglelink'); if ((toc.length != 0) && (toggleLink.length != 0)) { if (!( $(toc).is(':visible') )) { toggleLink.text(tocHideText); document.cookie = "hidetoc=0"; } else { toggleLink.text(tocShowText); document.cookie = "hidetoc=1"; }; $(toc).slideToggle(1000); }; }; } addOnloadHook(jQueryLaunchTraditio); // Сложный пример импортирования: подгрузка файла со скриптами для редактирования, // только когда они действительно будут нужны. (Простому читателю, например, не нужны.) if ((wgAction == 'edit' || wgAction == 'submit' || wgAction == 'formedit') && wgCanonicalNamespace != 'Special' || wgCanonicalSpecialPageName == 'AddData' || wgCanonicalSpecialPageName == 'EditData'){ importScript('MediaWiki:Onlyifediting.js'); } // Скрипт для редактирования с помощью форм: if (wgAction == 'formedit' || wgCanonicalSpecialPageName == 'AddData' || wgCanonicalSpecialPageName == 'EditData') { importScript('MediaWiki:OnlyIfFormEditing.js'); } /* Функция hasClass, заимствованная из английской Википедии через русскоязычную. * * Создаёт закрытый (private в объектно-ориентированном смысле) объект reCache * (от англ. «regular expression cache», кэш регулярных выражений), который кэширует * регулярные выражения (тоже объекты), при помощи которых можно проверять, принадлежит ли * тот или иной элемент тому или иному классу (классу в HTML/CSS-смысле, а не в объектном). * * Такой подход позволяет функции hasClass не создавать регулярные выражения «на лету» * всякий раз, когда они понадобятся, а использовать вместо этого готовые. Поэтому * функция hasClass() удобна во всех случаях, когда есть необходимость проверять много * элементов HTML на принадлежность одному и тому же классу. Она используется * в реализации сворачивающихся таблиц и блоков (см. функции collapsibleTables * и collapsibleDivs и тому подобные ниже); а может, и ещё для чего пригодится. * * Закрытость объекта reCache достигается механизмом JavaScript function closures: * http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Working_with_Closures */ 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 auto_comment = 0 /** Расширенный поиск ***************************************** ** Автор: Участник:Dream */ function SpecialSearchEnhanced() { var mainNode = document.getElementsByTagName("form"); if (!mainNode) return; var searchValue = document.forms[0].search.value var safeSearchValue = searchValue.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """); var firstForm = mainNode[0]; var node = document.createElement('div'); var googleSearch = '<form action="http://www.google.com/custom" method="get" name="google" target="_blank" id="google">'; googleSearch += '<input type="hidden" name="hl" value="ru" />'; googleSearch += '<input type="hidden" name="domains" value="traditio.ru" />'; googleSearch += '<input type="hidden" name="q" maxlength="2048" value="' + safeSearchValue + '" />' googleSearch += '<input type="hidden" name="sitesearch" value="wiki.traditio.ru" />' googleSearch += '<input type="button" value="Google по Традиции" onclick="document.google.q.value = document.forms[0].search.value; this.form.submit();" style="width: 12em;" />' googleSearch += '</form>' var yandexSearch = '<form action="http://www.yandex.ru/yandsearch" method="get" name="yandex" target="_blank" id="yandex">'; yandexSearch += '<input type="hidden" name="text" maxlength="300" value="' + safeSearchValue + '" />'; yandexSearch += '<input type="hidden" name="site" value="traditio.ru" />'; yandexSearch += '<input type="hidden" name="ras" value="1" />' yandexSearch += '<input type="hidden" name="site_manually" value="true" />' yandexSearch += '<input type="hidden" name="server_name" value="Traditio" />' yandexSearch += '<input type="button" value="Яндекс по Традиции" onclick="document.yandex.text.value = document.forms[0].search.value; this.form.submit();" style="width: 12em;" />' yandexSearch += '</form>' var ramblerSearch = '<form action="http://www.rambler.ru/srch?set=www&words" method="get" name="rambler" target="_blank" id="rambler">'; ramblerSearch += '<input type="hidden" name="text" maxlength="300" value="' + safeSearchValue + '" />'; ramblerSearch += '<input type="hidden" name="site" value="traditio.ru" />'; ramblerSearch += '<input type="hidden" name="ras" value="1" />' ramblerSearch += '<input type="hidden" name="site_manually" value="true" />' ramblerSearch += '<input type="hidden" name="server_name" value="Traditio" />' ramblerSearch += '<input type="button" value="Рамблер по Традиции" onclick="document.rambler.text.value = document.forms[0].search.value; this.form.submit();" style="width: 12em;" />' ramblerSearch += '</form>' node.innerHTML = node.innerHTML + '<table style="margin-left: 75%; padding-left:4px;"><tr><td>' + yandexSearch + '</td></tr><tr><td>' + googleSearch + '</td></tr><tr><td>' + ramblerSearch + '</td></tr></table>'; firstForm.parentNode.insertBefore(node, firstForm.nextSibling); } if (wgPageName == "Служебная:Search") { addOnloadHook(SpecialSearchEnhanced); } /*************************************************************** * * Далее следует код, который: * * *) показывает значок статуса ICQ в шаблоне {{ICQ}} * * *) показывает консоль для отслеживания статуса игры Quake II * на странице [[Quake II Deathmatch]] * */ function LinkFA() { // ICQ status background $('span.ICQ').each(function(i){ var ICQURL = 'http://status.icq.com/online.gif?icq=' + this.id + '&img=5'; $(this).css({ 'padding' : '0 0 0 20px', 'background-image': 'url(' + ICQURL + ')', 'background-repeat': 'no-repeat' }); }); // Quake II consoles $('span.quake2traditio').each(function(i){ // проверяем, действительно ли указано имя сервера // (защита от взлома Традиции, совершаемого впрыскиванием левого кода) // имя.имя.имя...имя:порт, где имя == [a-zA-Z01-9][a-zA-Z01-9-]* // а порт не обязателен var TheText = $(this).text(); if (TheText.match(/^([a-zA-Z01-9][a-zA-Z01-9-]*\.)+([a-zA-Z01-9][a-zA-Z01-9-]*)(:[1-9][01-9]*)?$/) == null) { // не сервер: $(this).html('<b>' + TheText + ' не является сервером Quake II</b>'); } else { // сервер: $(this).html('<embed style="width: 100%;" height=388 type="application/x-q3plug-plugin" ' + 'name="' + TheText + '" color="#ffeedd" color2="#88ff88" game="Q2" ' + 'pluginspage="http://members.liwest.at/mb/q3plug" />'); } // конец проверки того, действительно ли указано имя сервера }); } addOnloadHook(LinkFA); /****************************************************************************************** * * Сворачивающиеся блоки для шаблонов {{Навигационная таблица}}, {{Навигационная полоса}} * и для таблиц class="collapsible" (см. на [[Справка:Оформление таблиц]] пример). * * Код полностью переписал Mithgol the Webmaster на основе jQuery в начале августа 2009 г. * */ var autoCollapse = 2; var collapseCaption = 'скрыть'; var expandCaption = 'показать'; function collapsibleTables(){ var allTables = $('#content table.collapsible'); allTables.each(function(tblIdx){ var HRow = $('tr:first', this); if (HRow.length == 0){ $(this).addClass('wontCollapse'); // no rows return true; // continue next iteration of each() } if (HRow.parent().children().filter('tr').not(':first').length == 0){ $(this).addClass('wontCollapse'); // no rows after the first return true; // continue next iteration of each() } var Header = $('th:last', HRow); if (Header.length == 0){ $(this).addClass('wontCollapse'); // no TH in the first row return true; // continue next iteration of each() } $(this).data('collapseIndex', tblIdx); Header.prepend( '<span style="float: right; font-weight: normal;">'+ '[<a id="collapseButton' + tblIdx + '" href="#" onClick="collapseTable(this); return false;">'+ collapseCaption + '</a>]</span>'); }); var processedTables = allTables.not('.wontCollapse'); if (processedTables.length > autoCollapse){ processedTables.filter('.autocollapse').each(function(i){ var linkIDX = $(this).data('collapseIndex'); collapseTable($('a#collapseButton' + linkIDX, this).eq(0)); }); } processedTables.filter('.collapsed').each(function(i){ var linkIDX = $(this).data('collapseIndex'); collapseTable($('a#collapseButton' + linkIDX, this).eq(0)); }); } function collapseTable(linkObject){ // accepts both raw and jQuery-wrapped objects var TheLink = $(linkObject); var TableRows = TheLink.closest('tr').parent().children().filter('tr').not(':first'); if (TableRows.length == 0) return; var isShown = (TheLink.text() == collapseCaption); if (isShown) { TheLink.text(expandCaption); TableRows.each(function(i){ $(this).fadeOut(1000); }); } else { TheLink.text(collapseCaption); TableRows.each(function(i){ $(this).fadeIn(1000); }); }; } addOnloadHook(collapsibleTables); var NavigationBarHide = '[' + collapseCaption + ']'; var NavigationBarShow = '[' + expandCaption + ']'; var NavigationBarShowDefault = autoCollapse; function collapsibleDivs(){ var NavFrameList = $('#content div.NavFrame'); NavFrameList.each(function(navIdx){ var TheNavHead = $('.NavHead:first', this); if (TheNavHead.length == 0) { $(this).addClass('wontCollapse'); // no NavHead inside! return true; // continue next iteration of each() } $(this).data('NavFrameIndex', navIdx); TheNavHead.prepend('<a class="NavToggle" '+ 'id="NavToggle' + navIdx + '" href="#" '+ 'onClick="collapseDiv(this); return false;">'+ NavigationBarHide + '</a>' ); }); var processedDivs = NavFrameList.not('.wontCollapse'); if (processedDivs.length > NavigationBarShowDefault){ processedDivs.not('.expanded').each(function(i){ var linkIDX = $(this).data('NavFrameIndex'); collapseDiv($('a#NavToggle' + linkIDX, this).eq(0)); }); } processedDivs.filter('.collapsed').each(function(i){ var linkIDX = $(this).data('NavFrameIndex'); collapseDiv($('a#NavToggle' + linkIDX, this).eq(0)); }); } function collapseDiv(toggleObject){ // accepts both raw and jQuery-wrapped objects var TheToggle = $(toggleObject); var TheFrame = TheToggle.closest('div.NavFrame'); if (TheFrame.length == 0) return false; TheToggle.text( (TheToggle.text() == NavigationBarHide) ? NavigationBarShow : NavigationBarHide); TheFrame.children().filter('.NavPic, .NavContent').each(function(i){ $(this).slideToggle(1000); }); } addOnloadHook(collapsibleDivs); /* Замена гиперссылки на кнопке «+» (например, наверху обсуждений) на другой адрес, * если на странице был поставлен шаблон {{modifynewsectionlink}}. */ function newSectionLink(){ var customLink = $('#add-custom-section a:first'); if (customLink.length == 0) return; $('#ca-addsection a:first').attr('href', customLink.attr('href')); } addOnloadHook(newSectionLink); //</source>