MediaWiki:Common.js: Difference between revisions

From OniGalore
Jump to navigation Jump to search
m (making my comments *not* destroy the page width)
(bringing over search box-focusing code from https://en.wikipedia.org/wiki/MediaWiki:Gadget-searchFocus.js)
 
(86 intermediate revisions by the same user not shown)
Line 1: Line 1:
/* <pre><nowiki> */
/** extract a URL parameter from the current URL **********
 
* From [[en:User:Lupin/autoedit.js]]
//<source lang="javascript">
*
 
* paramName  : the name of the parameter to extract
/* Import more specific scripts if necessary */
*/
 
function getURLParamValue(paramName, url)  
if (wgAction == "edit" || wgAction == "submit" || wgPageName == "Special:Upload") //scripts specific to editing pages
{
{
     importScript("MediaWiki:Common.js/edit.js")
     if (typeof (url) == 'undefined' || url === null)
        url = document.location.href;
    var cmdRe = RegExp('[&?]' + paramName + '=([^&#]*)'); // Stop at hash
    var m = cmdRe.exec(url);
    if (m && m.length > 1)
        return decodeURIComponent(m[1]);
    return null;
}
}
else if (wgPageName == "Special:Watchlist") //watchlist scripts
 
/** &withJS= URL parameter *******
* Allow to try custom scripts from MediaWiki space
* without editing [[Special:Mypage/monobook.js]]
*/
var extraJS = getURLParamValue("withJS");
if (extraJS && extraJS.match("^MediaWiki:[^&<>=%]*\.js$"))
{
{
     importScript("MediaWiki:Common.js/watchlist.js")
     mw.loader.load('/w/index.php?title=' + extraJS + '&action=raw&ctype=text/javascript');
}
}
else if (wgPageName == "Special:Search") //scripts specific to Special:Search
 
 
/* Focus us on the Search box if we're on the Main Page, so we can immediately start typing */
if (mw.config.get('wgIsMainPage'))
{
{
     importScript("MediaWiki:Common.js/search.js")
     $(function()
    {
        $('#searchInput').focus();
    });
}
}




/** Sysop Javascript *******************************************************
/* If we're on the Search page, load the script that augments that page */
  *
if (mw.config.get('wgPageName') === 'Special:Search')
  *  Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]].
{
  */
     mw.loader.load('/w/index.php?title=MediaWiki:Common.js/search.js&action=raw&ctype=text/javascript');
/*function sysopFunctions() {
}
    if ( wgUserGroups && !window.disableSysopJS ) {
        for ( var g = 0; g < wgUserGroups.length; ++g ) {
            if ( wgUserGroups[g] == "sysop" ) {
                importScript("MediaWiki:Sysop.js");
                break;
            }
        }
     }
}*/
 
/*On The Above Code
This attempt to import the Sysop.js code is currently not working for an unknown reason, although the code from the Sysop.js
file can successfully be directly inserted here in place of the importScript command; it is currently my hypothesis that
placing Sysop.js in the wrong namespace at first somehow threw off the server, and that, now that it's in the right place,
it is still (for some reason) invisible to the software. In any case, WP's version of Sysop.js adds little value for us OG
sysops anyway, so I have not inserted its code here. -- [[User_talk:Iritscen]]*/
 
// addOnloadHook( sysopFunctions ); // be sure to uncomment this if restoring above code




/* Scripts specific to Internet Explorer */
/* Scripts specific to Internet Explorer */
 
if (navigator.appName == 'Microsoft Internet Explorer')
if (navigator.appName == "Microsoft Internet Explorer")
{
{
     /** Internet Explorer bug fix **************************************************
     /** Internet Explorer bug fix **************************************************
Line 57: Line 55:
     var docEl = document.documentElement;
     var docEl = document.documentElement;
      
      
     function fixIEScroll()
     var fixIEScroll = function()
     {
     {
         if (!oldWidth || docEl.clientWidth > oldWidth)
         if (!oldWidth || docEl.clientWidth > oldWidth)
        {
             doFixIEScroll();
             doFixIEScroll();
        }
         else
         else
        {
             setTimeout(doFixIEScroll, 1);
             setTimeout(doFixIEScroll, 1);
        }
          
          
         oldWidth = docEl.clientWidth;
         oldWidth = docEl.clientWidth;
     }
     };
      
      
     function doFixIEScroll() {
     var doFixIEScroll = function()
    {
         docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
         docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
     }
     };
      
      
     document.attachEvent("onreadystatechange", fixIEScroll);
     document.attachEvent("onreadystatechange", fixIEScroll);
     document.attachEvent("onresize", fixIEScroll);
     document.attachEvent("onresize", fixIEScroll);
      
      
      
     // In print IE (7?) does not like line-height
     /**
    appendCSS('@media print {sup, sub, p, .documentDescription {line-height: normal;}}');
    * Remove need for CSS hacks regarding MSIE and IPA.
 
    */
    // IE overflow bug
      
    appendCSS('div.overflowbugx {overflow-x: scroll !important; overflow-y: hidden !important;} div.overflowbugy {overflow-y: scroll !important; overflow-x: hidden !important;}');
     if (document.createStyleSheet) {
 
         document.createStyleSheet().addRule('.IPA', 'font-family: "Doulos SIL", "Charis SIL", Gentium, "DejaVu Sans", Code2000, "TITUS Cyberbit Basic", "Arial Unicode MS", "Lucida Sans Unicode", "Chrysanthi Unicode";');
    // IE zoomfix
    // Use to fix right floating div/table inside tables
     appendCSS('.iezoomfix div, .iezoomfix table {zoom: 1;}');
}
 
 
/** Hover tables *********************************************************
*
*  Description: Allows tables to use mouse-over to provide explanation of
*               the pointed-to content.
*  Maintainers: [[User:Iritscen]]
*/
function showDescrip(typeID, show_or_not)
{
    var DescripPanel = document.getElementsByClassName("hovertable_descrip")[0]; /* only get 1st one on page to keep things simple */
     var Descrips = DescripPanel.getElementsByTagName("span");
 
     if (!DescripPanel || !Descrips)
        return false;
 
    for (var i = 0; i < Descrips.length; i++)
    {
         if (Descrips[i].id == typeID)
        {
            if (show_or_not)
                Descrips[i].style.display = "block";
            else
                Descrips[i].style.display = "none";
        }
     }
     }
   
}
   
 
     //Import scripts specific to Internet Explorer 6
function initHoverTables()
     if (navigator.appVersion.substr(22, 1) == "6")
{
     var Tables = document.getElementsByClassName("hovertable");
     if (!Tables)
        return false;
 
    for (var i = 0; i < Tables.length; i++)
     {
     {
         importScript("MediaWiki:Common.js/IE60Fixes.js")
         var Cells = Tables[i].getElementsByTagName("td");
        if (!Cells) continue;
 
        for (var j = 0; j < Cells.length; j++)
        {
            if ($(Cells[j]).hasClass("hovercell"))
            {
                $(Cells[j]).mouseover(new Function("evt", "showDescrip(this.id, true);"));
                $(Cells[j]).mouseout(new Function("evt", "showDescrip(this.id, false);"));
            }
        }
     }
     }
}
}


$(initHoverTables);


/* Test if an element has a certain class **************************************
/** Hover GIFs *********************************************************
  *
  *
  * Description: Uses regular expressions and caching for better performance.
  * Description: Allows GIFs to only animate upon mouse-over.
  * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
  *
Maintainers: [[User:Iritscen]]
  */
  */
function swapImage(gifID, show_gif)
{
    var gif_span = document.getElementById(gifID);
    var gif_image = gif_span.getElementsByClassName("image")[0];
    var gif_img = gif_image.getElementsByTagName("img")[0];
    var gif_src = gif_img.src;
    if (!gif_img)
        return false;


var hasClass = (function () {
    if (show_gif)
     var reCache = {};
        gif_img.src = gif_src.replace('.jpg', '.gif');
     return function (element, className) {
    else
         return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
        gif_img.src = gif_src.replace('.gif', '.jpg');
     };
}
})();
 
function initHoverGIFs()
{
     var gifs = document.getElementsByClassName("hovergif");
 
     if (!gifs)
        return false;
 
    for (var i = 0; i < gifs.length; i++)
    {
         $(gifs[i]).mouseover(swapImage(this.id, true));
        $(gifs[i]).mouseout(swapImage(this.id, false));
     }
}
 
$(initHoverGIFs);




Line 117: Line 189:
var expandCaption = "show";
var expandCaption = "show";


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


     if ( !Table || !Button ) {
     if (!Table || !Button)
    {
         return false;
         return false;
     }
     }
Line 128: Line 201:
     var Rows = Table.rows;
     var Rows = Table.rows;


     if ( Button.firstChild.data == collapseCaption ) {
     if (Button.firstChild.data == collapseCaption)
         for ( var i = 1; i < Rows.length; i++ ) {
    {
         for (var i = 1; i < Rows.length; i++)
        {
             Rows[i].style.display = "none";
             Rows[i].style.display = "none";
         }
         }
         Button.firstChild.data = expandCaption;
         Button.firstChild.data = expandCaption;
     } else {
     }
         for ( var i = 1; i < Rows.length; i++ ) {
    else
    {
         for (var i = 1; i < Rows.length; i++)
        {
             Rows[i].style.display = Rows[0].style.display;
             Rows[i].style.display = Rows[0].style.display;
         }
         }
Line 145: Line 223:
     var tableIndex = 0;
     var tableIndex = 0;
     var NavigationBoxes = new Object();
     var NavigationBoxes = new Object();
     var Tables = document.getElementsByTagName( "table" );
     var Tables = document.getElementsByTagName("table");
 
    for ( var i = 0; i < Tables.length; i++ ) {
        if ( hasClass( Tables[i], "collapsible" ) ) {


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


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


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


             Button.style.styleFloat = "right";
             Button.className = "collapseButton"; // styles are declared in Common.css
            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).click(new Function("evt", "collapseTable(" + tableIndex + " ); return killEvt(evt);"));
             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.childNodes[0]);
             tableIndex++;
             tableIndex++;
         }
         }
     }
     }


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


addOnloadHook( createCollapseButtons );
$(createCollapseButtons);




Line 220: Line 301:
     var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
     var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);


     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) {
    {
             if ( hasClass( NavChild, 'NavPic' ) ) {
         for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling)
                NavChild.style.display = 'none';
        {
            }
             if ($(NavChild).hasClass("NavContent") || $(NavChild).hasClass("NavPic"))
            if ( hasClass( NavChild, 'NavContent') ) {
            {
                 NavChild.style.display = 'none';
                 NavChild.style.display = 'none';
             }
             }
Line 237: Line 317:


     // if hidden now
     // if hidden now
     } else if (NavToggle.firstChild.data == NavigationBarShow) {
     }
         for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
    else if (NavToggle.firstChild.data == NavigationBarShow)
             if (hasClass(NavChild, 'NavPic')) {
    {
                NavChild.style.display = 'block';
         for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling)
            }
        {
            if (hasClass(NavChild, 'NavContent')) {
             if ($(NavChild).hasClass("NavContent") || $(NavChild).hasClass("NavPic"))
            {
                 NavChild.style.display = 'block';
                 NavChild.style.display = 'block';
             }
             }
Line 256: Line 337:
     // iterate over all < div >-elements  
     // iterate over all < div >-elements  
     var divs = document.getElementsByTagName("div");
     var divs = document.getElementsByTagName("div");
     for (var i = 0; NavFrame = divs[i]; i++) {
     for (var i = 0; NavFrame = divs[i]; i++)
    {
         // if found a navigation bar
         // if found a navigation bar
         if (hasClass(NavFrame, "NavFrame")) {
         if ($(NavFrame).hasClass("NavFrame"))
        {
             indexNavigationBar++;
             indexNavigationBar++;
             var NavToggle = document.createElement("a");
             var NavToggle = document.createElement("a");
Line 265: Line 347:
             NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
             NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
             NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
             NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
 
             var NavToggleText = document.createTextNode(NavigationBarHide);
             var isCollapsed = $(NavFrame).hasClass("collapsed");
             for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
            /*
                 if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
            * Check if any children are already hidden.  This loop is here for backwards compatibility:
                     if (NavChild.style.display == 'none') {
            * the old way of making NavFrames start out collapsed was to manually add style="display:none"
                         NavToggleText = document.createTextNode(NavigationBarShow);
            * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
                         break;
            * 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 ($(NavChild).hasClass("NavPic") || $(NavChild).hasClass("NavContent"))
                {
                     if (NavChild.style.display == 'none')
                    {
                         isCollapsed = true;
                    }
                }
            }
            if (isCollapsed)
            {
                for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling)
                {
                    if ($(NavChild).hasClass("NavPic") || $(NavChild).hasClass("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 (var 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);
                 }
                 }
Line 288: Line 393:
}
}


addOnloadHook( createNavigationBarToggleButton );
$(createNavigationBarToggleButton);
 
 
/** Main Page layout fixes *********************************************************
*
*  Description: Insert fixes for OG's main page here
*
*/
 


/*if ((wgTitle == 'Main Page' && wgNamespaceNumber == 0) || (wgTitle == 'Wikipedia' && wgNamespaceNumber == 100)) {
    addOnloadHook(mainPageAppendCompleteListLink);
    addOnloadHook(dshuf);
}*/


 
// Allows sidebar's "navigation", "toolbox" and "languages" sections to be customized
 
function ModifySidebar(action, section, name, link)
/** "Technical restrictions" title fix *****************************************
*
*  Description: For pages that have something like Template:Wrongtitle, replace
*              the title, but only if it is cut-and-pasteable as a valid
*              wikilink. For instance, "NZR WB class" can be changed to
*              "NZR W<sup>B</sup> class", but [[C#]] is not an equivalent wikilink,
*              so [[C Sharp]] doesn't have its main title changed.
*
*              The function looks for a banner like this:
*              <div id="RealTitleBanner"> ... <span id="RealTitle">title</span> ... </div>
*              An element with id=DisableRealTitle disables the function.
*  Maintainers: Remember_the_dot
*/
 
if (wgIsArticle) //prevents the "Editing " prefix from disappearing during preview
{
{
     addOnloadHook(function()
     try
     {
     {
         var realTitle = document.getElementById("RealTitle")
         switch (section)
          
        {
         if (realTitle)
          case "languages":
            var target = "p-lang";
            break;
          case "toolbox":
            var target = "p-tb";
            break;
          case "navigation":
            var target = "p-navigation";
            break;
          default:
            var target = "p-" + section;
            break;
        }
        if (action == "add")
        {
            var node = document.getElementById(target)
                              .getElementsByTagName('div')[0]
                              .getElementsByTagName('ul')[0];
            var aNode = document.createElement('a');
            var liNode = document.createElement('li');
            aNode.appendChild(document.createTextNode(name));
            aNode.setAttribute('href', link);
            liNode.appendChild(aNode);
            liNode.className='plainlinks';
            node.appendChild(liNode);
        }
 
        if (action == "sep")
        {
            var node = document.getElementById(target)
                              .getElementsByTagName('div')[0]
                              .getElementsByTagName('ul')[0];
            var liNode = document.createElement('li');
            liNode.style.listStyleImage="url('http://wiki.oni2.net/w/images/1/10/Separator.png')";
            liNode.style.listStylePosition='inside';
            node.appendChild(liNode);
         }
         if (action == "remove")
         {
         {
             //normalizes a title or a namespace name (but not both)
             var list = document.getElementById(target)
            //trims leading and trailing underscores and converts (possibly multiple) spaces and underscores to single underscores
                              .getElementsByTagName('div')[0]
            function normalizeTitle(title)
                              .getElementsByTagName('ul')[0];
            {
                return title.replace(/^_+/, "").replace(/_+$/, "").replace(/[\s_]+/g, "_")
             var listelements = list.getElementsByTagName('li');
            }
              
             for (var i = 0; i < listelements.length; i++)
            if (realTitle.textContent) //everyone but IE
             {
                var realTitleText = realTitle.textContent
            }
            else //IE
             {
             {
                 var realTitleText = realTitle.innerText
                 if (listelements[i].getElementsByTagName('a')[0].innerHTML == name ||
            }
                    listelements[i].getElementsByTagName('a')[0].href == link)
           
            var normalizedRealTitle
            var normalizedPageTitle
            var indexOfColon = realTitleText.indexOf(":")
            var normalizedNamespaceName = normalizeTitle(realTitleText.substring(0, indexOfColon)).toLowerCase()
           
            //make namespace prefix lowercase and uppercase the first letter of the title
            if (indexOfColon == -1 || wgCanonicalNamespace.toLowerCase() != normalizedNamespaceName) //no namespace prefix - either no colon or a nonsensical namespace prefix (for example, "Foo" in "Foo: The Story of My Life")
            {
                normalizedRealTitle = normalizeTitle(realTitleText)
                normalizedRealTitle = normalizedRealTitle.charAt(0).toUpperCase() + normalizedRealTitle.substring(1)
                normalizedPageTitle = wgPageName.charAt(0).toUpperCase() + wgPageName.substring(1)
            }
            else //using a namespace prefix
            {
                var normalizedRealPageTitle = normalizeTitle(realTitleText.substring(indexOfColon + 1))
               
                normalizedRealTitle = normalizedNamespaceName
                if (normalizedNamespaceName != "") //namespace 0 is a special case where the leading colon should never be shown
                 {
                 {
                     normalizedRealTitle += ":"
                }
                     list.removeChild(listelements[i]);
                normalizedRealTitle += normalizedRealPageTitle.charAt(0).toUpperCase() + normalizedRealPageTitle.substring(1)
                normalizedPageTitle = wgPageName.substring(0, wgPageName.indexOf(":") + 1).toLowerCase() + wgPageName.substring(wgPageName.indexOf(":") + 1)
            }
           
            if (normalizedRealTitle == normalizedPageTitle) //normalized titles match, so we can do full replacement
            {
                var h1 = document.getElementsByTagName("h1")[0]
               
                //remove all child nodes, including text
                while (h1.firstChild)
                {
                    h1.removeChild(h1.firstChild)
                }
               
                //populate with nodes of real title
                while (realTitle.firstChild) //the children are moved to a new parent element
                {
                    h1.appendChild(realTitle.firstChild)
                 }
                 }
               
                //delete the real title banner since the problem is solved
                var realTitleBanner = document.getElementById("RealTitleBanner")
                realTitleBanner.parentNode.removeChild(realTitleBanner)
             }
             }
           
            //no matter what, correct the page title
            document.title = realTitleText + " - Wikipedia, the free encyclopedia"
         }
         }
     })
     }
    catch(e)
    {
      // let's just ignore what's happened
      return;
    }
}
}


Line 401: Line 478:
   *  Maintainers: [[User:Random832]]
   *  Maintainers: [[User:Random832]]
   */
   */
ts_alternate_row_colors = false;
ts_alternate_row_colors = false;


Line 409: Line 485:
  *
  *
  *  Maintainers: [[User:Krimpet]]
  *  Maintainers: [[User:Krimpet]]
  ****/
  */
function uploadwizard_newusers() {
function uploadwizard_newusers()
  if (wgNamespaceNumber == 4 && wgTitle == "Upload" && wgAction == "view") {
{
    var oldDiv = document.getElementById("autoconfirmedusers"),
    if (mw.config.get('wgNamespaceNumber') == 4 && mw.config.get('wgTitle') == 'Upload' && mw.config.get('wgAction') === 'view')
        newDiv = document.getElementById("newusers");
    {
    if (oldDiv && newDiv) {
        var oldDiv = document.getElementById("autoconfirmedusers"),
      if (typeof wgUserGroups == "object" && wgUserGroups) {
            newDiv = document.getElementById("newusers");
        for (i = 0; i < wgUserGroups.length; i++) {
        if (oldDiv && newDiv)
          if (wgUserGroups[i] == "autoconfirmed") {
        {
             oldDiv.style.display = "block";
            if (typeof wgUserGroups == "object" && wgUserGroups)
             newDiv.style.display = "none";
            {
                for (i = 0; i < wgUserGroups.length; i++)
                {
                    if (wgUserGroups[i] == "autoconfirmed")
                    {
                        oldDiv.style.display = "block";
                        newDiv.style.display = "none";
                        return;
                    }
                }
            }
             oldDiv.style.display = "none";
             newDiv.style.display = "block";
             return;
             return;
          }
         }
         }
      }
      oldDiv.style.display = "none";
      newDiv.style.display = "block";
      return;
     }
     }
  }
}
}
addOnloadHook(uploadwizard_newusers);
 
$(uploadwizard_newusers);




/** Disambig editintro ********************************************************
/***** autosort_sortable ********
  *
  * Auto-sorts sortable tables by a given column (why is this not built-in?!)
  * Description: Adds an editintro on disambiguation pages. Original code
  * You must opt into this feature by placing "autosort" in the list of
  * located at [[User:RockMFR/disambigeditintro.js]].
  * the table's classes along with "sortable"
  *
  *
  *  Maintainers: [[User:RockMFR]], [[User:Quiddity]]
  *  Maintainers: [[User:Iritscen]]
  */
  */
if (wgNamespaceNumber == 0) addOnloadHook(function(){
if (!document.getElementById('disambig')) return
var el = document.getElementById('ca-edit')
if (el) el = el.getElementsByTagName('a')[0]
if (el) el.href += '&editintro=Template:Disambig_editintro'
})


//</source>
// For some reason, the arrow buttons and headerSort classes are not attached to sortable tables immediately upon the "load" event, and we need those, so we wait a bit before trying to sort
/* </nowiki></pre> */
function sortTimer()
{
    setTimeout(function()
    {
        sortSortableTables();
    }, (1 * 1000));
}
 
function sortSortableTables()
{
    console.log("Sorting the autosort tables.");
    // Iterate over all <div> elements
    var divs = document.getElementsByTagName("div");
    if (!divs) return;
    for (var i = 0; i < divs.length; i++)
    {
        var theDiv = divs[i];
        var tables = theDiv.getElementsByTagName("table");
        if (!tables) continue;
        for (var j = 0; j < tables.length; j++)
        {
            var theTable = tables[j];
            // If we found a sortable table that is asking for autosort...
            if ($(theTable).hasClass("sortable") && $(theTable).hasClass("autosort"))
            {
                var sortColumnNum = 1, curColumnNum = 0;
 
                // First check if there is any by-column-x class at all, then take the time to figure out the value of x
                var patt = /by-column/;
                if (patt.test(theTable.className))
                {
                    for (var col = 1; col < 10; col++)
                    {
                        var colOption = "by-column-" + col;
                        if ($(theTable).hasClass(colOption))
                        {
                            //console.log("Table " + j + " wants to sort by column " + col);
                            sortColumnNum = col;
 
                            // Now look for sort button and click it
                            var allTHs = theTable.getElementsByTagName("th");
                            if (!allTHs)
                            {
                                console.log("Failed to get 'th' elements!");
                                continue;
                            }
                            for (var k = 0; k < allTHs.length; k++)
                            {
                                //console.log("Class names for 'th' # " + k + " are " + allTHs[k].className);
                                if ($(allTHs[k]).hasClass("headerSort"))
                                {
                                    curColumnNum++;
                                    if (curColumnNum == sortColumnNum)
                                    {
                                        console.log("Clicking sort button (ID " + k + ") for column " + sortColumnNum);
                                        $(allTHs[k]).trigger("click"); // use jQuery's trigger() to send click event to this arrow
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
 
$(sortTimer);

Latest revision as of 15:21, 2 October 2022

/** extract a URL parameter from the current URL **********
 * From [[en:User:Lupin/autoedit.js]]
 *
 * paramName  : the name of the parameter to extract
 */
function getURLParamValue(paramName, url) 
{
    if (typeof (url) == 'undefined' || url === null)
        url = document.location.href;
    var cmdRe = RegExp('[&?]' + paramName + '=([^&#]*)'); // Stop at hash
    var m = cmdRe.exec(url);
    if (m && m.length > 1)
        return decodeURIComponent(m[1]);
    return null;
}

/** &withJS= URL parameter *******
 * Allow to try custom scripts from MediaWiki space 
 * without editing [[Special:Mypage/monobook.js]]
 */
var extraJS = getURLParamValue("withJS");
if (extraJS && extraJS.match("^MediaWiki:[^&<>=%]*\.js$"))
{
    mw.loader.load('/w/index.php?title=' + extraJS + '&action=raw&ctype=text/javascript');
}


/* Focus us on the Search box if we're on the Main Page, so we can immediately start typing */
if (mw.config.get('wgIsMainPage'))
{
    $(function()
    {
        $('#searchInput').focus();
    });
}


/* If we're on the Search page, load the script that augments that page */
if (mw.config.get('wgPageName') === 'Special:Search')
{
    mw.loader.load('/w/index.php?title=MediaWiki:Common.js/search.js&action=raw&ctype=text/javascript');
}


/* Scripts specific to Internet Explorer */
if (navigator.appName == 'Microsoft Internet Explorer')
{
    /** Internet Explorer bug fix **************************************************
     *
     *  Description: Fixes IE horizontal scrollbar bug
     *  Maintainers: [[User:Tom-]]?
     */
    
    var oldWidth;
    var docEl = document.documentElement;
    
    var fixIEScroll = function()
    {
        if (!oldWidth || docEl.clientWidth > oldWidth)
        {
            doFixIEScroll();
        }
        else
        {
            setTimeout(doFixIEScroll, 1);
        }
        
        oldWidth = docEl.clientWidth;
    };
    
    var doFixIEScroll = function()
    {
        docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
    };
    
    document.attachEvent("onreadystatechange", fixIEScroll);
    document.attachEvent("onresize", fixIEScroll);
    
    // In print IE (7?) does not like line-height
    appendCSS('@media print {sup, sub, p, .documentDescription {line-height: normal;}}');

    // IE overflow bug
    appendCSS('div.overflowbugx {overflow-x: scroll !important; overflow-y: hidden !important;} div.overflowbugy {overflow-y: scroll !important; overflow-x: hidden !important;}');

    // IE zoomfix
    // Use to fix right floating div/table inside tables
    appendCSS('.iezoomfix div, .iezoomfix table {zoom: 1;}');
}


/** Hover tables *********************************************************
 *
 *  Description: Allows tables to use mouse-over to provide explanation of
 *               the pointed-to content.
 *  Maintainers: [[User:Iritscen]]
 */
function showDescrip(typeID, show_or_not)
{
    var DescripPanel = document.getElementsByClassName("hovertable_descrip")[0]; /* only get 1st one on page to keep things simple */
    var Descrips = DescripPanel.getElementsByTagName("span");

    if (!DescripPanel || !Descrips)
        return false;

    for (var i = 0; i < Descrips.length; i++)
    {
        if (Descrips[i].id == typeID)
        {
            if (show_or_not)
                Descrips[i].style.display = "block";
            else
                Descrips[i].style.display = "none";
        }
    }
}

function initHoverTables()
{
    var Tables = document.getElementsByClassName("hovertable");
    if (!Tables)
        return false;

    for (var i = 0; i < Tables.length; i++)
    {
        var Cells = Tables[i].getElementsByTagName("td");
        if (!Cells) continue;

        for (var j = 0; j < Cells.length; j++)
        {
            if ($(Cells[j]).hasClass("hovercell"))
            {
                $(Cells[j]).mouseover(new Function("evt", "showDescrip(this.id, true);"));
                $(Cells[j]).mouseout(new Function("evt", "showDescrip(this.id, false);"));
            }
        }
    }
}

$(initHoverTables);

/** Hover GIFs *********************************************************
 *
 *  Description: Allows GIFs to only animate upon mouse-over.
 *  
 *  Maintainers: [[User:Iritscen]]
 */
function swapImage(gifID, show_gif)
{
    var gif_span = document.getElementById(gifID);
    var gif_image = gif_span.getElementsByClassName("image")[0];
    var gif_img = gif_image.getElementsByTagName("img")[0];
    var gif_src = gif_img.src;

    if (!gif_img)
        return false;

    if (show_gif)
        gif_img.src = gif_src.replace('.jpg', '.gif');
    else
        gif_img.src = gif_src.replace('.gif', '.jpg');
}

function initHoverGIFs()
{
    var gifs = document.getElementsByClassName("hovergif");

    if (!gifs)
        return false;

    for (var i = 0; i < gifs.length; i++)
    {
        $(gifs[i]).mouseover(swapImage(this.id, true));
        $(gifs[i]).mouseout(swapImage(this.id, false));
    }
}

$(initHoverGIFs);


/** Collapsible tables *********************************************************
 *
 *  Description: Allows tables to be collapsed, showing only the header. See
 *               [[Wikipedia:NavFrame]].
 *  Maintainers: [[User:R. Koot]]
 */

var autoCollapse = 2;
var collapseCaption = "hide";
var expandCaption = "show";

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

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

    var Rows = Table.rows;

    if (Button.firstChild.data == collapseCaption)
    {
        for (var i = 1; i < Rows.length; i++)
        {
            Rows[i].style.display = "none";
        }
        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()
{
    var tableIndex = 0;
    var NavigationBoxes = new Object();
    var Tables = document.getElementsByTagName("table");

    for (var i = 0; i < Tables.length; i++)
    {
        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;

            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", "#");
            $(ButtonLink).click(new Function("evt", "collapseTable(" + tableIndex + " ); return killEvt(evt);"));
            ButtonLink.appendChild(ButtonText);

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

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

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

$(createCollapseButtons);


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

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

// 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;

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

    // if hidden now
    }
    else if (NavToggle.firstChild.data == NavigationBarShow)
    {
        for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling)
        {
            if ($(NavChild).hasClass("NavContent") || $(NavChild).hasClass("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 ($(NavFrame).hasClass("NavFrame"))
        {
            indexNavigationBar++;
            var NavToggle = document.createElement("a");
            NavToggle.className = 'NavToggle';
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');

            var isCollapsed = $(NavFrame).hasClass("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 ($(NavChild).hasClass("NavPic") || $(NavChild).hasClass("NavContent"))
                {
                    if (NavChild.style.display == 'none')
                    {
                        isCollapsed = true;
                    }
                }
            }
            if (isCollapsed)
            {
                for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling)
                {
                    if ($(NavChild).hasClass("NavPic") || $(NavChild).hasClass("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 ($(NavFrame.childNodes[j]).hasClass("NavHead"))
                {
                    NavToggle.style.color = NavFrame.childNodes[j].style.color;
                    NavFrame.childNodes[j].appendChild(NavToggle);
                }
            }
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
        }
    }
}

$(createNavigationBarToggleButton);


// Allows sidebar's "navigation", "toolbox" and "languages" sections to be customized
function ModifySidebar(action, section, name, link)
{
    try
    {
        switch (section)
        {
          case "languages":
            var target = "p-lang";
            break;
          case "toolbox":
            var target = "p-tb";
            break;
          case "navigation":
            var target = "p-navigation";
            break;
          default:
            var target = "p-" + section;
            break;
        }
 
        if (action == "add")
        {
            var node = document.getElementById(target)
                               .getElementsByTagName('div')[0]
                               .getElementsByTagName('ul')[0];
 
            var aNode = document.createElement('a');
            var liNode = document.createElement('li');
 
            aNode.appendChild(document.createTextNode(name));
            aNode.setAttribute('href', link);
            liNode.appendChild(aNode);
            liNode.className='plainlinks';
            node.appendChild(liNode);
        }

        if (action == "sep")
        {
            var node = document.getElementById(target)
                               .getElementsByTagName('div')[0]
                               .getElementsByTagName('ul')[0];
 
            var liNode = document.createElement('li');
            liNode.style.listStyleImage="url('http://wiki.oni2.net/w/images/1/10/Separator.png')";
            liNode.style.listStylePosition='inside';
            node.appendChild(liNode);
        }
 
        if (action == "remove")
        {
            var list = document.getElementById(target)
                               .getElementsByTagName('div')[0]
                               .getElementsByTagName('ul')[0];
 
            var listelements = list.getElementsByTagName('li');
 
            for (var i = 0; i < listelements.length; i++)
            {
                if (listelements[i].getElementsByTagName('a')[0].innerHTML == name ||
                    listelements[i].getElementsByTagName('a')[0].href == link)
                {
 
                    list.removeChild(listelements[i]);
                }
            }
        }
 
    }
    catch(e)
    {
      // let's just ignore what's happened
      return;
    }
}


/** Table sorting fixes ************************************************
  *
  *  Description: Disables code in table sorting routine to set classes on even/odd rows
  *  Maintainers: [[User:Random832]]
  */
ts_alternate_row_colors = false;


/***** uploadwizard_newusers ********
 * Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]]
 *
 *  Maintainers: [[User:Krimpet]]
 */
function uploadwizard_newusers()
{
    if (mw.config.get('wgNamespaceNumber') == 4 && mw.config.get('wgTitle') == 'Upload' && mw.config.get('wgAction') === 'view')
    {
        var oldDiv = document.getElementById("autoconfirmedusers"),
            newDiv = document.getElementById("newusers");
        if (oldDiv && newDiv)
        {
            if (typeof wgUserGroups == "object" && wgUserGroups)
            {
                for (i = 0; i < wgUserGroups.length; i++)
                {
                    if (wgUserGroups[i] == "autoconfirmed")
                    {
                        oldDiv.style.display = "block";
                        newDiv.style.display = "none";
                        return;
                    }
                }
            }
            oldDiv.style.display = "none";
            newDiv.style.display = "block";
            return;
        }
    }
}

$(uploadwizard_newusers);


/***** autosort_sortable ********
 * Auto-sorts sortable tables by a given column (why is this not built-in?!)
 * You must opt into this feature by placing "autosort" in the list of
 * the table's classes along with "sortable"
 *
 *  Maintainers: [[User:Iritscen]]
 */

// For some reason, the arrow buttons and headerSort classes are not attached to sortable tables immediately upon the "load" event, and we need those, so we wait a bit before trying to sort
function sortTimer()
{
    setTimeout(function()
    {
        sortSortableTables();
    }, (1 * 1000));
}

function sortSortableTables()
{
    console.log("Sorting the autosort tables.");
    // Iterate over all <div> elements
    var divs = document.getElementsByTagName("div");
    if (!divs) return;
    for (var i = 0; i < divs.length; i++)
    {
        var theDiv = divs[i];
        var tables = theDiv.getElementsByTagName("table");
        if (!tables) continue;
        for (var j = 0; j < tables.length; j++)
        {
            var theTable = tables[j];
            // If we found a sortable table that is asking for autosort...
            if ($(theTable).hasClass("sortable") && $(theTable).hasClass("autosort"))
            {
                var sortColumnNum = 1, curColumnNum = 0;

                // First check if there is any by-column-x class at all, then take the time to figure out the value of x
                var patt = /by-column/;
                if (patt.test(theTable.className))
                {
                    for (var col = 1; col < 10; col++)
                    {
                        var colOption = "by-column-" + col;
                        if ($(theTable).hasClass(colOption))
                        {
                            //console.log("Table " + j + " wants to sort by column " + col);
                            sortColumnNum = col;

                            // Now look for sort button and click it
                            var allTHs = theTable.getElementsByTagName("th");
                            if (!allTHs)
                            {
                                console.log("Failed to get 'th' elements!");
                                continue;
                            }
                            for (var k = 0; k < allTHs.length; k++)
                            {
                                //console.log("Class names for 'th' # " + k + " are " + allTHs[k].className);
                                if ($(allTHs[k]).hasClass("headerSort"))
                                {
                                    curColumnNum++;
                                    if (curColumnNum == sortColumnNum)
                                    {
                                        console.log("Clicking sort button (ID " + k + ") for column " + sortColumnNum);
                                        $(allTHs[k]).trigger("click"); // use jQuery's trigger() to send click event to this arrow
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

$(sortTimer);