Версия для слабовидящих
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> */