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

нет описания правки
(Новая страница: «/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой ст…»)
 
Нет описания правки
Строка 2: Строка 2:


/** Test if an element has a certain class
/** Test if an element has a certain class
*
  * Description: Uses regular expressions and caching for better performance.
  * Description: Uses regular expressions and caching for better performance.
  * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
  * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
Строка 13: Строка 12:
})();
})();


/** Collapsible tables
 
/**
* Collapsible tables
  *
  *
  * Description: Allows tables to be collapsed, showing only the header. See
  * @version 2.0.2 (2014-03-14)
  *               http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
  * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
  *  Maintainers: [[**MAINTAINERS**]]
  * @author [[User:R. Koot]]
  * @author [[User:Krinkle]]
* @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which
* is supported in MediaWiki core.
  */
  */
/*global $, mw */
var autoCollapse = 2;
var autoCollapse = 2;
var collapseCaption = 'hide';
var collapseCaption = 'hide';
var expandCaption = 'show';
var expandCaption = 'show';


function collapseTable(tableIndex) {
(function() {
    var Button = document.getElementById('collapseButton' + tableIndex);
    function collapseTable(tableIndex) {
    var Table = document.getElementById('collapsibleTable' + tableIndex);
        var Button = document.getElementById('collapseButton' + tableIndex);
        var Table = document.getElementById('collapsibleTable' + tableIndex);


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


    var Rows = Table.rows;
        var Rows = Table.rows;
        var i;


    if (Button.firstChild.data == collapseCaption) {
        if (Button.firstChild.data === collapseCaption) {
        for (var i = 1; i < Rows.length; i++) {
            for (i = 1; i < Rows.length; i++) {
            Rows[i].style.display = 'none';
                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;
         }
         }
        Button.firstChild.data = expandCaption;
    } else {
        for (var i = 1; i < Rows.length; i++) {
            Rows[i].style.display = Rows[0].style.display;
        }
        Button.firstChild.data = collapseCaption;
     }
     }
}


function createCollapseButtons() {
    function createClickHandler(tableIndex) {
    var tableIndex = 0;
        return function(e) {
    var NavigationBoxes = new Object();
            e.preventDefault();
    var Tables = document.getElementsByTagName('table');
            collapseTable(tableIndex);
        };
    }


     for (var i = 0; i < Tables.length; i++) {
     function createCollapseButtons() {
         if (hasClass(Tables[i], 'collapsible')) { /* only add button and increment count if there is a header row to work with */
         var tableIndex = 0;
            var HeaderRow = Tables[i].getElementsByTagName('tr')[0];
        var NavigationBoxes = {};
            if (!HeaderRow) continue;
        var Tables = document.getElementsByTagName('table');
            var Header = HeaderRow.getElementsByTagName('th')[0];
        var i;
            if (!Header) continue;


             NavigationBoxes[tableIndex] = Tables[i];
        for (i = 0; i < Tables.length; i++) {
            Tables[i].setAttribute('id', 'collapsibleTable' + tableIndex);
             if ($(Tables[i]).hasClass('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;
                }


            var Button = document.createElement('span');
                NavigationBoxes[tableIndex] = Tables[i];
            var ButtonLink = document.createElement('a');
                Tables[i].setAttribute('id', 'collapsibleTable' + tableIndex);
            var ButtonText = document.createTextNode(collapseCaption);


            Button.className = 'collapseButton'; // Styles are declared in MediaWiki:Common.css  
                var Button = document.createElement('span');
                var ButtonLink = document.createElement('a');
                var ButtonText = document.createTextNode(collapseCaption);
                // TODO: Declare styles in [[MediaWiki:Gadget-collapsibleTables.css]]
                // Button.className = 'collapseButton';
                Button.style.styleFloat = 'right';
                Button.style.cssFloat = 'right';
                Button.style.fontWeight = 'normal';
                Button.style.textAlign = 'right';
                Button.style.width = '6em';


            ButtonLink.style.color = Header.style.color;
                ButtonLink.style.color = Header.style.color;
            ButtonLink.setAttribute('id', 'collapseButton' + tableIndex);
                ButtonLink.setAttribute('id', 'collapseButton' + tableIndex);
            ButtonLink.setAttribute('href', "javascript:collapseTable(" + tableIndex + ");");
                ButtonLink.setAttribute('href', '#');
            ButtonLink.appendChild(ButtonText);
                $(ButtonLink).on('click', createClickHandler(tableIndex));
                ButtonLink.appendChild(ButtonText);


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


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


    for (var i = 0; i < tableIndex; i++) {
        for (i = 0; i < tableIndex; i++) {
        if (hasClass(NavigationBoxes[i], 'collapsed') || (tableIndex >= autoCollapse && hasClass(NavigationBoxes[i], 'autocollapse'))) {
            if ($(NavigationBoxes[i]).hasClass('collapsed') ||
            collapseTable(i);
                (tableIndex >= autoCollapse && $(NavigationBoxes[i]).hasClass('autocollapse'))
            ) {
                collapseTable(i);
            }
         }
         }
     }
     }
}


addOnloadHook(createCollapseButtons);
    mw.hook('wikipage.content').add(createCollapseButtons);
}());


/** Dynamic Navigation Bars (experimental)
/**
  *
* Dynamic Navigation Bars. See [[Wikipedia:NavFrame]]
  * Description: See [[wikipedia:NavFrame|RTENOTITLE]].
  * Based on script from en.wikipedia.org, 2008-09-15.
  *  Maintainers: UNMAINTAINED
  * @source www.mediawiki.org/wiki/MediaWiki:Gadget-NavFrame.js
  * @maintainer Helder.wiki, 2012–2013
  * @maintainer Krinkle, 2013
  */
  */
// set up the words in your language
(function() {
var NavigationBarHide = '[' + collapseCaption + ']';
    // set up the words in your language
var NavigationBarShow = '[' + expandCaption + ']';
    var navigationBarHide = '[' + collapseCaption + ']';
// shows and hides content and picture (if available) of navigation bars
    var navigationBarShow = '[' + expandCaption + ']';
// Parameters:
 
// indexNavigationBar: the index of navigation bar to be toggled  
    /**
function toggleNavigationBar(indexNavigationBar) {
    * Shows and hides content and picture (if available) of navigation bars.
    var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
    * @param {number} indexNavigationBar The index of navigation bar to be toggled
    var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
    * @param {jQuery.Event} e Event object
    */
    function toggleNavigationBar(indexNavigationBar, e) {
        var navChild,
            navToggle = document.getElementById('NavToggle' + indexNavigationBar),
            navFrame = document.getElementById('NavFrame' + indexNavigationBar);
 
        // Prevent browser from jumping to href "#"
        e.preventDefault();


    if (!NavFrame || !NavToggle) {
        if (!navFrame || !navToggle) {
        return false;
            return false;
    }
        }


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


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


}
    /**
 
    * Adds show/hide-button to navigation bars.
// adds show/hide-button to navigation bars
    * @param {jQuery} $content
function createNavigationBarToggleButton() {
    */
    var indexNavigationBar = 0;
    function createNavigationBarToggleButton($content) {
    // iterate over all <div>-elements
        var i, j, navFrame, navToggle, navToggleText, navChild,
    var divs = document.getElementsByTagName("div");
            indexNavigationBar = 0,
    for (var i = 0; NavFrame = divs[i]; i++) {
            navFrames = $content.find('div.NavFrame').toArray();
        // if found a navigation bar
        if (hasClass(NavFrame, "NavFrame")) {


        // Iterate over all (new) nav frames
        for (i = 0; i < navFrames.length; i++) {
            navFrame = navFrames[i];
            // If found a navigation bar
             indexNavigationBar++;
             indexNavigationBar++;
             var NavToggle = document.createElement("a");
             navToggle = document.createElement('a');
             NavToggle.className = 'NavToggle';
             navToggle.className = 'NavToggle';
             NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
             navToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
             NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
             navToggle.setAttribute('href', '#');
            $(navToggle).on('click', $.proxy(toggleNavigationBar, null, indexNavigationBar));


             var isCollapsed = hasClass(NavFrame, "collapsed");
             navToggleText = document.createTextNode(navigationBarHide);
            /*
             for (navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling) {
            * Check if any children are already hidden.  This loop is here for backwards compatibility:
                 if ($(navChild).hasClass('NavPic') || $(navChild).hasClass('NavContent')) {
            * the old way of making NavFrames start out collapsed was to manually add style="display:none"
                     if (navChild.style.display == 'none') {
            * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
                         navToggleText = document.createTextNode(navigationBarShow);
            * the content visible without JavaScript support), the new recommended way is to add the class
                        break;
            * "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);


            navToggle.appendChild(navToggleText);
             // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
             // 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++) {
             for (j = 0; j < navFrame.childNodes.length; j++) {
                 if (hasClass(NavFrame.childNodes[j], "NavHead")) {
                 if ($(navFrame.childNodes[j]).hasClass('NavHead')) {
                     NavToggle.style.color = NavFrame.childNodes[j].style.color;
                     navFrame.childNodes[j].appendChild(navToggle);
                    NavFrame.childNodes[j].appendChild(NavToggle);
                 }
                 }
             }
             }
             NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
             navFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
         }
         }
     }
     }


}
    mw.hook('wikipage.content').add(createNavigationBarToggleButton);
 
}());
$(createNavigationBarToggleButton);


//Adding Header/Footer to these pages
//Adding Header/Footer to these pages
Строка 213: Строка 243:
     fs.type = 'text/javascript';
     fs.type = 'text/javascript';
     fs.async = true;
     fs.async = true;
     var base_url = "https://beta.familysearch.org";
     var base_url = "https://familysearch.org";
     fs.src = 'https://familysearch.org/hf/hf.js' + (base_url === "" ? "" : "?base_url=" + base_url);
     fs.src = 'https://familysearch.org/hf/hf.js' + (base_url === "" ? "" : "?base_url=" + base_url);
     var s = document.getElementsByTagName('script')[0];
     var s = document.getElementsByTagName('script')[0];