Версия для слабовидящих
MediaWiki:Common.js — различия между версиями
Материал из Ярославский педагогический университет
Wikiadmin (обсуждение | вклад) |
Wikiadmin (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | /* Размещённый здесь | + | /* <source lang="javascript"> |
| + | // Размещённый здесь код JavaScript будет загружен всем читателям | ||
| + | // (не обязательно участникам проекта) при обращении к какой-либо странице. | ||
| + | */ | ||
| − | // | + | /**********************************************************************************/ |
| + | function addLoadEvent( f ) { addOnloadHook( f ); } | ||
| + | |||
| + | /** Функции импортирования ************************************************************* | ||
| + | * | ||
| + | * Описание: Включают викистраницу в сыром виде, в качестве джаваскрипта или CSS, | ||
| + | * что полезно при подключении дополнительных модулей в определённых условиях. | ||
| + | */ | ||
| + | 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({ // плавное проматывание страницы внутренними её гиперссылками | |
| − | var | + | hash: true // указывать #... в конце гиперссылки |
| − | var | + | }); |
| − | + | ||
| + | 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 hasClass = (function (){ | ||
| − | + | var reCache = {}; | |
| − | + | return function (element, className){ | |
| − | + | return (reCache[className] ? reCache[className] : | |
| − | + | (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)")) | |
| − | })() | + | ).test(element.className); |
| − | + | }; | |
| − | function | + | })(); |
| − | var | + | |
| − | + | /*************************************************************************************************/ | |
| − | + | ||
| − | + | 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 ( | + | if (wgPageName == "Служебная:Search") { addOnloadHook(SpecialSearchEnhanced); } |
| − | + | ||
| + | |||
| + | /****************************************************************************************** | ||
| + | * | ||
| + | * Сворачивающиеся блоки для шаблонов {{Навигационная таблица}}, {{Навигационная полоса}} | ||
| + | * и для таблиц class="collapsible" (см. на [[Справка:Оформление таблиц]] пример). | ||
| + | * | ||
| + | * | ||
| + | */ | ||
| + | |||
| + | 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 ( | + | 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(){ | 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( | + | 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); | |
| − | var | + | |
| − | + | 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> */ |
Версия 11:39, 27 октября 2009
/* <source lang="javascript"> // Размещённый здесь код JavaScript будет загружен всем читателям // (не обязательно участникам проекта) при обращении к какой-либо странице. */ /**********************************************************************************/ function addLoadEvent( f ) { addOnloadHook( f ); } /** Функции импортирования ************************************************************* * * Описание: Включают викистраницу в сыром виде, в качестве джаваскрипта или CSS, * что полезно при подключении дополнительных модулей в определённых условиях. */ 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); } /****************************************************************************************** * * Сворачивающиеся блоки для шаблонов {{Навигационная таблица}}, {{Навигационная полоса}} * и для таблиц class="collapsible" (см. на [[Справка:Оформление таблиц]] пример). * * */ 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> */




