MediaWiki:Common.js

Матеріал з Вікіцитат

Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.

  • Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
  • Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
  • Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
  • Opera: натисніть Ctrl-F5
/* Any JavaScript here will be loaded for all users on every page load. */
// <nowiki>


/**
 * WikiMiniAtlas is a popup click and drag world map.
 * See [[meta:WikiMiniAtlas]] for more information.
 * Maintainers: [[w:User:Dschwen]]
 */
mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript' );

/* Load fixes for Windows font rendering */
if( navigator.platform.indexOf( "Win" ) != -1 ) {

    mw.loader.load( '/w/index.php?title=MediaWiki:Common.css/WinFixes.css&action=raw&ctype=text/css', 'text/css' );
}

 /* Test if an element has a certain class **************************************
  *
  * Description: Uses regular expressions and caching for better performance.
  * Maintainers: [[:en:User:Mike Dillon]], [[:en:User:R. Koot]], [[:en:User:SG]]
  */

 var hasClass = (function () {
     var reCache = {};
     return function (element, className) {
         return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
     };
 })();

 /** Interwiki links to featured articles ***************************************
  *
  *  Description: Highlights interwiki links to featured articles (or
  *               equivalents) by changing the bullet before the interwiki link
  *               into a star.
  *  Maintainers: [[:en:User:R. Koot]]
  */
 
 function LinkFA() 
 {
     if ( document.getElementById( "p-lang" ) ) {
         var InterwikiLinks = document.getElementById( "p-lang" ).getElementsByTagName( "li" );
 
         for ( var i = 0; i < InterwikiLinks.length; i++ ) {
             if ( document.getElementById( InterwikiLinks[i].className + "-fa" ) ) {
                 InterwikiLinks[i].className += " FA";
                 InterwikiLinks[i].title = "Ця стаття є вибраною в іншомовному розділі";
             }
             if ( document.getElementById( InterwikiLinks[i].className + "-ga" ) ) {
                 InterwikiLinks[i].className += " GA";
                 InterwikiLinks[i].title = "Ця стаття є доброю в іншомовному розділі";
             }
         }
     }
 }
 
 $( LinkFA );

 /** Collapsible tables *********************************************************
  *
  *  Description: Allows tables to be collapsed, showing only the header. See
  *               [[:en:wikiquote:NavFrame]].
  *  Maintainers: [[:en:User:R. Koot]]
  */
 
 var autoCollapse = 2;
 var collapseCaption = "сховати";
 var expandCaption = "показати";
 
function collapseTable( tableIndex, e ){
    var Button = document.getElementById( "collapseButton" + tableIndex );
    var Table = document.getElementById( "collapsibleTable" + tableIndex );

    if ( !Table || !Button ) {
        return false;
    }

    var Rows = Table.rows;

	var i;
    if ( Button.firstChild.data == collapseCaption ) {
        for (i = 1; i < Rows.length; i++ ) {
            Rows[i].style.display = "none";
        }
        Button.firstChild.data = expandCaption;
    } else {
        for (i = 1; i < Rows.length; i++ ) {
            Rows[i].style.display = Rows[0].style.display;
        }
        Button.firstChild.data = collapseCaption;
    }
    
    e.preventDefault();
}

function createCollapseButtons(){
    var tableIndex = 0;
    var NavigationBoxes = {};
    var Tables = document.getElementsByTagName( "table" );

    for ( var i = 0; i < Tables.length; i++ ) {
        if ( hasClass( Tables[i], "collapsible" ) ) {

            /* only add button and increment count if there is a header row to work with */
            var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];
            if (!HeaderRow) continue;
            var Header = HeaderRow.getElementsByTagName( "th" )[0];
            if (!Header) continue;

            NavigationBoxes[ tableIndex ] = Tables[i];
            Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );

            var Button     = document.createElement( "span" );
            var ButtonLink = document.createElement( "a" );
            var ButtonText = document.createTextNode( collapseCaption );

            Button.className = "collapseButton";  //Styles are declared in Common.css

            ButtonLink.style.color = Header.style.color;
            ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
            ButtonLink.setAttribute( "href", "#" );
            //addHandler( ButtonLink,  "click", new Function( "evt", "collapseTable(" + tableIndex + " ); return false;") );
            $( ButtonLink ).on( 'click', $.proxy( collapseTable, ButtonLink, tableIndex ) );
            ButtonLink.appendChild( ButtonText );

            Button.appendChild( document.createTextNode( "[" ) );
            Button.appendChild( ButtonLink );
            Button.appendChild( document.createTextNode( "]" ) );

            Header.insertBefore( Button, Header.childNodes[0] );
            tableIndex++;
        }
    }

    for ( i = 0;  i < tableIndex; i++ ) {
        if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
            collapseTable( i );
        } 
        else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) {
            var element = NavigationBoxes[i];
            while (element = element.parentNode) {
                if ( hasClass( element, "outercollapse" ) ) {
                    collapseTable ( i );
                    break;
                }
            }
        }
    }
}

$( createCollapseButtons );


/** Dynamic Navigation Bars (experimental) *************************************
 *
 *  Description: See [[wikiquote:NavFrame]].
 *  Maintainers: UNMAINTAINED
 */

// set up the words in your language
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';

// set up max count of Navigation Bars on page,
// if there are more, all will be hidden
// NavigationBarShowDefault = 0; // all bars will be hidden
// NavigationBarShowDefault = 1; // on pages with more than 1 bar all bars will be hidden
var NavigationBarShowDefault = autoCollapse;

// shows and hides content and picture (if available) of navigation bars
// Parameters:
//     indexNavigationBar: the index of navigation bar to be toggled
function toggleNavigationBar(indexNavigationBar){
    var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
    var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);

    if (!NavFrame || !NavToggle) {
        return false;
    }
	
	var NavChild;
    // if shown now
    if (NavToggle.firstChild.data == NavigationBarHide) {
        for (NavChild = NavFrame.firstChild; NavChild !== null; NavChild = NavChild.nextSibling) {
            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
                NavChild.style.display = 'none';
            }
        }
    NavToggle.firstChild.data = NavigationBarShow;

    // if hidden now
    } else if (NavToggle.firstChild.data == NavigationBarShow) {
        for (NavChild = NavFrame.firstChild; NavChild !== null; NavChild = NavChild.nextSibling) {
            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
                NavChild.style.display = 'block';
            }
        }
        NavToggle.firstChild.data = NavigationBarHide;
    }
}

// adds show/hide-button to navigation bars
function createNavigationBarToggleButton(){
    var indexNavigationBar = 0;
    // iterate over all < div >-elements 
    var divs = document.getElementsByTagName("div");
    for (var i = 0; NavFrame = divs[i]; i++) {
        // if found a navigation bar
        if (hasClass(NavFrame, "NavFrame")) {

            indexNavigationBar++;
            var NavToggle = document.createElement("a");
            NavToggle.className = 'NavToggle';
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');

            var isCollapsed = hasClass( NavFrame, "collapsed" );
            /*
             * Check if any children are already hidden.  This loop is here for backwards compatibility:
             * the old way of making NavFrames start out collapsed was to manually add style="display:none"
             * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
             * the content visible without JavaScript support), the new recommended way is to add the class
             * "collapsed" to the NavFrame itself, just like with collapsible tables.
             */
            for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
                if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
                    if ( NavChild.style.display == 'none' ) {
                        isCollapsed = true;
                    }
                }
            }
            if (isCollapsed) {
                for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
                    if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
                        NavChild.style.display = 'none';
                    }
                }
            }
            var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
            NavToggle.appendChild(NavToggleText);

            // 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")) {
                    NavToggle.style.color = NavFrame.childNodes[j].style.color;
                    NavFrame.childNodes[j].appendChild(NavToggle);
                }
            }
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
        }
    }

    // if more Navigation Bars found than Default: hide all
    if (NavigationBarShowDefault < indexNavigationBar) {
        for(var i=1; i<=indexNavigationBar; ++i) {
            toggleNavigationBar(i);
        }
    }
}

$( createNavigationBarToggleButton );


  /*
   * Функція, що на головній сторінці в кінці списку інтервікі ставить посилання на повний список всіх Вікіцитат
   */
  function mainPageAppendCompleteListLink() {
    try {
        var node = document.getElementById( "p-lang" )
                           .getElementsByTagName('div')[0]
                           .getElementsByTagName('ul')[0];
        var aNode = document.createElement( 'a' );
        var liNode = document.createElement( 'li' );
        aNode.appendChild( document.createTextNode( 'Повний список' ) );
        aNode.setAttribute( 'href' , '//meta.wikimedia.org/wiki/Wikiquote#List_of_Wikiquotes' );
        liNode.appendChild( aNode );
        liNode.className = 'interwiki-completelist';
        node.appendChild( liNode );
     } catch(e) {
       // lets just ignore what's happened
       return;
    }
  }

  if (mw.config.get('wgTitle') == 'Головна сторінка' && mw.config.get('wgNamespaceNumber') == 0 && mw.config.get('wgUserLanguage')=="uk" ) {
       $( mainPageAppendCompleteListLink );
  }

$(function(){
  var plus = document.getElementById('ca-addsection');
  if (!plus) return;
  var custom = document.getElementById('add-custom-section');
  if (!custom) return;
  plus.getElementsByTagName('A')[0].setAttribute('href', custom.getElementsByTagName('A')[0].href);
})

 /** Import module *************************************************************
  *
  *  Предложен [[Участник:Alex_Smotrov]], на основе аналогичной английской функции
  *
  *  Description: Includes a raw wiki page as javascript or CSS, 
  *               used for including user made modules.
  */

 function importScript(page, lang) {
     var url = mw.config.get('wgScriptPath') + '/index.php?title='
                            + encodeURIComponent(page.replace(' ','_'))
                            + '&action=raw&ctype=text/javascript';
     if (lang) {
          url = '//' + lang + '.wikiquote.org' + url;
     }else{
          url = '//uk.wikiquote.org' + url;
     }
     mw.loader.load(url);
 }

/* При загрузке [[Special:Upload]] вставляет в поле описания [[Шаблон:Изображение]]
    Автор - [[User:Alex Smotrov]]
 */
function uploadPage(){
 //автоматически вставить {Изображение}
 var desc = document.getElementById('wpUploadDescription')
 var temp = document.getElementById('imageinfo')
 if (temp && desc && !desc.value) desc.value = temp.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 temp = document.getElementById('rationale')
 if(!desc || !temp) return
 if (desc.value.indexOf(temp.innerHTML.substring(0,8)) == -1){
   desc.value += '\n' + temp.innerHTML
   desc.rows = 15
 }
}
 
if (mw.config.get('wgCanonicalNamespace') == 'Special' && mw.config.get('wgCanonicalSpecialPageName') == 'Upload')
 $(uploadPage);
 
if (document.URL.indexOf("action=edit") > 0 || document.URL.indexOf("action=submit") > 0)
{
        if (mw.config.get('wgCanonicalNamespace') != "Special")
        {
              mw.loader.load('//uk.wikiquote.org/w/index.php?title=MediaWiki:Onlyifediting.js&action=raw&ctype=text/javascript'); 
        }
}

// Розширений пошук
// Автор: ru:User:Не А

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="uk" />';
    googleSearch += '<input type="hidden" name="domains" value="uk.wikiquote.org" />';
    googleSearch += '<input type="hidden" name="q" maxlength="2048" value="' + safeSearchValue + '" />'
    googleSearch += '<input type="hidden" name="sitesearch" value="uk.wikiquote.org" />'
    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.ua/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="uk.wikiquote.org" />';
    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="Вікіцитати" />'
    yandexSearch += '<input type="button" value="Яндекс по Вікіцитатах"  onclick="document.yandex.text.value = document.forms[0].search.value; this.form.submit();" style="width: 12em;" />'
    yandexSearch += '</form>'

    node.innerHTML = node.innerHTML + '<table style="margin-left: 75%;  padding-left:4px;"><tr><td>' + yandexSearch + '</td></tr><tr><td>' + googleSearch + '</td></tr></table>';
        
    firstForm.parentNode.insertBefore(node, firstForm.nextSibling);
}

// Можливість редагування "нульового" розділу
// Теоретично це мало б бути у додатках...
importScript('MediaWiki:Gadget-edittop.js');

var auto_comment = 0

 /** 
 * Для шаблону Шаблон:Scroll Gallery‎  
 */
 $(function() {
  if (document.URL.match(/printable/g)) return;
 
  function toggleImageFunction(group,  remindex, shwindex) {
    return function() {
      document.getElementById("ImageGroupsGr" + group + "Im" + remindex).style.display = "none";
      document.getElementById("ImageGroupsGr" + group + "Im" + shwindex).style.display = "block";
      return false;
    };
  }
 
  var divs = document.getElementsByTagName("div");
  var i = 0, j = 0;
  var units, search;
  var currentimage;
  var UnitNode, rightlink, commentText;
  for (i = 0; i < divs.length; i++) {
    if (divs[i].className !== "ImageGroup") { continue; }
    UnitNode = undefined;
    search = divs[i].getElementsByTagName("div");
    for (j = 0; j < search.length; j++) {
      if (search[j].className !== "ImageGroupUnits") { continue; }
      UnitNode=search[j];
      break;
    }
    if (UnitNode === undefined) { continue; }
    units = [];
    for (j = 0 ; j < UnitNode.childNodes.length ; j++ ) {
      var temp = UnitNode.childNodes[j];
      if (['center', 'mw-halign-center'].some(function(className) { return temp.classList.contains(className);})) { 
      	units.push(temp);
      }
    }
    var wrap;
    for (j = 0; j < units.length; j++) {
      currentimage = units[j];
      wrap = document.createElement('div');
      wrap.id = "ImageGroupsGr" + i + "Im" + j;
      currentimage.parentNode.insertBefore(wrap, currentimage);
      wrap.appendChild(currentimage);
      var leftlink = document.createElement("a");
      if (commentText !== undefined) {
        leftlink.setAttribute("title", commentText);
      }
      var comment;
      if (typeof(currentimage.getAttribute("title")) !== "string") {
        commentText = (j+1) + "/" + units.length;
        comment = document.createElement("tt").appendChild(document.createTextNode("("+ commentText + ")"));
      }
      else {
        commentText = currentimage.getAttribute("title");
        comment = document.createElement("span").appendChild(document.createTextNode(commentText));
        currentimage.removeAttribute("title");
      }
      if(rightlink !== undefined) {
        rightlink.setAttribute("title", commentText);
      }
      var imghead = document.createElement("div");
      rightlink = document.createElement("a");
      if (j !== 0) {
        leftlink.href = "#";
        leftlink.onclick = toggleImageFunction(i, j, j-1);
        leftlink.appendChild(document.createTextNode("◀"));
      }
      if (j != units.length - 1) {
        rightlink.href = "#";
        rightlink.onclick = toggleImageFunction(i, j, j+1);
        rightlink.appendChild(document.createTextNode("▶"));
      }
      imghead.style.fontSize = "110%";
      imghead.style.fontweight = "bold";
      imghead.appendChild(leftlink);
      imghead.appendChild(document.createTextNode("\xA0"));
      imghead.appendChild(comment);
      imghead.appendChild(document.createTextNode("\xA0"));
      imghead.appendChild(rightlink);
      if (units.length > 1) {
        wrap.insertBefore(imghead,wrap.childNodes[0]);
      }
      if (j !== 0) {
        wrap.style.display = "none";
      }
    }
  }
 });
 //Кінець блоку для шаблону Scroll Gallery

/* скрипт, який додає деякі шаблони до панелі інструментів */
mw.loader.load('//uk.wikiquote.org/w/index.php?title=MediaWiki:EditToolsExt.js&action=raw&ctype=text/javascript');


/*прикол до 1 квітня*/
if (mw.config.get( 'wgIsMainPage' ))
	if (new Date().getMonth() == 3 && new Date().getDate() == 1) 
	{
            mw.loader.using( ['mediawiki.util'], function () {
		mw.util.addCSS('#mw-panel, #bodyContent, #siteNotice, #p-personal, .vectorTabs li, .menu li, #p-cactions-label { -moz-transform: scaleX(-1); -webkit-transform: scaleX(-1); transform: scaleX(-1); }');
		mw.util.addCSS('#p-personal ul { padding-left: 0; }');
		mw.util.addCSS('.vectorTabs li span, div#mw-head div.vectorMenu h3 { background-position: 0% 0%; }');
            } );
	}
// </nowiki>