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

Материал из свободной русской энциклопедии «Традиция»
Перейти к навигации Перейти к поиску
(удаляю код, который всё равно перекрывается ниже лежащим кодом function addLoadEvent( f ) { addOnloadHook( f ); })
(ну и зачем было определять функции, которые нигде не используются? ;-) их надобно выполнить хотя бы при загрузке страницы, и выполню)
Строка 258: Строка 258:
 
     Rows[i].style.display = disp
 
     Rows[i].style.display = disp
 
}
 
}
 +
 +
addOnloadHook(collapsibleTables);
  
 
var NavigationBarHide = '[' + collapseCaption + ']'
 
var NavigationBarHide = '[' + collapseCaption + ']'
Строка 296: Строка 298:
 
       child.style.display = disp
 
       child.style.display = disp
 
}
 
}
 +
 +
addOnloadHook(collapsibleDivs);
  
 
//Автопричины при удалении
 
//Автопричины при удалении

Версия от 13:22, 18 января 2008

/* <source lang="javascript">
Размещённый здесь код JavaScript будет загружен всем пользователям при обращении к какой-либо странице
 */
// подгрузка файла со скриптами для редактирования  *****************************************

if (document.URL.indexOf("action=edit") > 0 || document.URL.indexOf("action=submit") > 0)
 {
        if (wgCanonicalNamespace != "Special")
        {
                document.write('<script type="text/javascript" src="/index.php?title=MediaWiki:Onlyifediting.js&action=raw&ctype=text/javascript&dontcountme=s"></script>');
        }
 }

/**********************************************************************************/
 function addLoadEvent( f ) { addOnloadHook( f ); }

/*************************************************************************************************/
/*Alex Mashin, May 19, 2007. Script for expandable tables moved here from extension and HTML body.
 */
function toggleExpandable(id) {
    var heading = document.getElementById('expandable-heading-'+id);
    var content = document.getElementById('expandable-content-'+id);
    if (content.style.display == 'none') content.style.display = '';
    else content.style.display = 'none';
    this.parent.focus();
}
/*************************************************************************************************/

 /** Import module *************************************************************
  *
  *  Description: Includes a raw wiki page as javascript or CSS, 
  *               used for including user made modules.
  *  Maintainers: [[en:User:AzaToth]], фиксанул в ВикиТрадиции администратор Afinogenoff.
  */
 
 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 sheet = '@import "'
               + wgScriptPath
               + '/index.php?title='
               + escape( page.replace( ' ', '_' ) )
               + '&action=raw&ctype=text/css";'
     var styleElem = document.createElement( 'style' );
     styleElem.setAttribute( 'type' , 'text/css' );
     styleElem.appendChild( document.createTextNode( sheet ) );
     document.getElementsByTagName( 'head' )[0].appendChild( styleElem );
 }

 var auto_comment = 0



 /** Расширенный поиск *****************************************
 ** Автор: Участник:Afinogenoff
 */
 function SpecialSearchEnhanced() 
 {
    var mainNode = document.getElementsByTagName("form");
    if (!mainNode) return;
    
    var searchValue = document.forms[0].search.value
	var safeSearchValue = searchValue.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
    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="ru.wikipedia.org" />';
    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="wiki.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="wiki.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, статус Quake II ***************
  *
  *  Что делает:
  *
  *  1) Ставит звёздочки для избранных статей
  *     (не знаю, зачем оно нам надо, у нас же нет языковых разделов;
  *      но пусть уж будет)
  *
  *  2) показывает значок статуса ICQ
  *
  *  3) показывает консоль для отслеживания статуса игры Quake II
  *
  */
 
 function LinkFA() 
 {
   // iterate over all span-elements
   for(var i=0; nextSpanElement = document.getElementsByTagName("span")[i]; i++) {
      // if found a ICQ span
      if(nextSpanElement.className == "ICQ") {
            nextSpanElement.style.padding = "0 0 0 20px";
            nextSpanElement.style.backgroundImage = "url('http://status.icq.com/online.gif?icq="+a.id+"&img=5')";
            nextSpanElement.style.backgroundRepeat = "no-repeat";
      }
      // if found a Quake II span
      if(nextSpanElement.className == "quake2traditio") {
         nextSpanContent = nextSpanElement.innerHTML;
         // проверяем, действительно ли указано имя сервера
         // (защита от взлома Традиции, совершаемого впрыскиванием левого кода)
         // имя.имя.имя...имя:порт, где имя == [a-zA-Z01-9][a-zA-Z01-9-]*
         //                           а порт не обязателен
         if (nextSpanContent.match(/^([a-zA-Z01-9][a-zA-Z01-9-]*\.)+([a-zA-Z01-9][a-zA-Z01-9-]*)(:[1-9][01-9]*)?$/)
              == null) {
            // не сервер:
            nextSpanElement.innerHTML = "<b>" + nextSpanContent + " не является сервером Quake&nbsp;II<"
                                      + "/b>";
         } else {
            // сервер:
            nextSpanElement.innerHTML = '<embed style="width: 100%;" ' +
                                        'height=388 type="application/x-q3plug-plugin" ' +
                                        'name="' + nextSpanContent + '" color="#ffeedd" ' +
                                        'color2="#88ff88" game="Q2" ' +
                                        'pluginspage="http://members.liwest.at/mb/q3plug" /' +
                                        '>';
         } // конец проверки того, действительно ли указано имя сервера
      }
      // if found a FA span
      if(nextSpanElement.className == "FA") {
         // iterate over all li-elements
         for(var j=0; nextListItem = document.getElementsByTagName("li")[j]; j++) {
            // if found a FA link
            if(nextListItem.className == "interwiki-" + nextSpanElement.id) {
                nextListItem.className += " FA"
                nextListItem.title = "Эта статья является избранной в другом языковом разделе.";               
            }
         }
      }
   }
 }
 
 addOnloadHook( LinkFA );

// русификация кнопок на панели инструментов
if (wgAction == 'edit' || wgAction == 'submit') 
addOnloadHook(function(){
 if (mwEditButtons.length < 3) return;
 mwEditButtons[0].imageFile = 'http://wiki.traditio.ru/images/9/9a/Button_boldru.png';
 mwEditButtons[1].imageFile = 'http://wiki.traditio.ru/images/8/88/Button_italicru.png';
 mwEditButtons[2].imageFile = 'http://wiki.traditio.ru/images/3/3d/Button_internal_link_ru.png'
})


//{Неверный заголовок} 
function correctTitle(){
 if (window.disableRealTitle) return
 var toHide = document.getElementById('trestrictions_replace')
 if (!toHide) return
 var newTitle = document.getElementById('trestrictions_correct')
 if (!newTitle) return
 document.getElementsByTagName('h1')[0].innerHTML  = newTitle.innerHTML
 toHide.style.display = 'none'
 document.getElementById('trestrictions_replaced').style.display = 'block'
}

//[[Special:Upload]]: insert {Изображение} automatically, insert {Обоснование добросовестного использования} with click
function uploadPage(){
 var desc = document.getElementById('wpUploadDescription')
 var tmpl = document.getElementById('imageinfo')
 if (tmpl && desc && !desc.value) desc.value = tmpl.innerHTML
 var span = document.getElementById('insertlink')
 if (!span) return
 var a = document.createElement('a')
 a.href = 'javascript:addRationaleTemplate()'
 span.parentNode.insertBefore(a, span)
 a.appendChild(span)
 span.style.display = 'inline'
}
function addRationaleTemplate(){
 var desc = document.getElementById('wpUploadDescription')
 var tmpl = document.getElementById('rationale')
 if (desc && tmpl && desc.value.indexOf(tmpl.innerHTML.substring(0,8)) == -1){
   desc.value += '\n' + tmpl.innerHTML
   desc.rows = 15
 }
}

//Сворачивающиеся блоки

var autoCollapse = 2
var collapseCaption = 'скрыть'
var expandCaption = 'показать'

function collapsibleTables(){
 var Table, HRow, THs, Header, btn, a, tblIdx = 0, colTables = []
 var allTables = document.getElementsByTagName('table')
 for (var i=0; Table = allTables[i]; i++){
   if (!hasClass(Table, 'collapsible')) continue
   if (!(HRow = Table.rows[0])) continue
   THs = HRow.getElementsByTagName('th') 
   if (THs.length == 0) continue
   Header = THs[THs.length-1] //last TH, not 1st like in en.wp
   Table.id = 'collapsibleTable' + tblIdx
   btn = document.createElement('span')
   btn.style.styleFloat = btn.style.cssFloat = 'right'
   btn.style.fontWeight = 'normal'
   a = document.createElement('a')
   a.id = 'collapseButton' + tblIdx
   a.href = 'javascript:collapseTable(' + tblIdx + ');' 
   a.appendChild(document.createTextNode(collapseCaption))
   btn.appendChild(document.createTextNode('['))
   btn.appendChild(a)
   btn.appendChild(document.createTextNode(']'))
   Header.insertBefore(btn, Header.childNodes[0])
   colTables[tblIdx++] = Table
 }
 for (var i=0; i < tblIdx; i++)
   if ((tblIdx > autoCollapse && hasClass(colTables[i], 'autocollapse')) || hasClass(colTables[i], 'collapsed'))
     collapseTable(i)
}

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

addOnloadHook(collapsibleTables);

var NavigationBarHide = '[' + collapseCaption + ']'
var NavigationBarShow = '[' + expandCaption + ']'
var NavigationBarShowDefault = autoCollapse
 
function collapsibleDivs(){
 var navIdx = 0, colNavs = [], i, NavFrame
 var divs = document.getElementById('content').getElementsByTagName('div')
 for (i=0; NavFrame = divs[i]; i++) {
   if (!hasClass(NavFrame, 'NavFrame')) continue
   NavFrame.id = 'NavFrame' + navIdx
   var a = document.createElement('a')
   a.className = 'NavToggle'
   a.id = 'NavToggle' + navIdx
   a.href = 'javascript:collapseDiv(' + navIdx + ');'
   a.appendChild(document.createTextNode(NavigationBarHide))
   // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
   for (var j=0; j < NavFrame.childNodes.length; j++)
     if (hasClass(NavFrame.childNodes[j], 'NavHead'))
       NavFrame.childNodes[j].appendChild(a)
   colNavs[navIdx++] = NavFrame
 }
 for (i=0; i < navIdx; i++)
  if ((navIdx > NavigationBarShowDefault && !hasClass(colNavs[i], 'expanded')) || hasClass(colNavs[i], 'collapsed'))
     collapseDiv(i)
}

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

addOnloadHook(collapsibleDivs);

//Автопричины при удалении

importScript('User:Afinogenoff/adm/delreason2.js');

/* </source> */