Diferencia entre revisiones de «MediaWiki:Common.js»

De WikiEducator
Saltar a: navegación, buscar
(add subpages to Toolbox)
(add JSconfig)
Línea 1: Línea 1:
 
/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página. */
 
/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página. */
 
/* Any JavaScript here will be loaded for all users on every page load. */
 
/* Any JavaScript here will be loaded for all users on every page load. */
 +
 +
/* Scripts specific to Internet Explorer */
 +
/*if ($.client.profile().name == 'msie') { */
 +
if ($.browser.msie) {
 +
    /** 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
 +
    //mw.util.addCSS('@media print { sup, sub, p, .documentDescription { line-height: normal; } }');
 +
 +
    // IE overflow bug
 +
    //mw.util.addCSS('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
 +
    //mw.util.addCSS('.iezoomfix div, .iezoomfix table { zoom: 1; }');
 +
 +
    // Import scripts specific to Internet Explorer 6
 +
    //if ($.client.profile().versionBase == '6') {
 +
    if ($.browser.msie && (parseInt($.browser.version, 10) === 6)) {
 +
        importScript('MediaWiki:Common.js/IE60Fixes.js');
 +
    }
 +
}
 +
 +
/* Fixes for Windows XP font rendering */
 +
if (navigator.appVersion.search(/windows nt 5/i) != -1) {
 +
    //mw.util.addCSS('.IPA {font-family: "Lucida Sans Unicode", "Arial Unicode MS";} ' +
 +
    //              '.Unicode {font-family: "Arial Unicode MS", "Lucida Sans Unicode";}');
 +
}
 +
 +
/* Helper script for .hlist class in Common.css
 +
* Last updated: September 3, 2012
 +
* Maintainer: [[User:Edokter]]
 +
*/
 +
 +
//if ( $.client.profile().name == 'msie' ) {
 +
if ( $.browser.msie ) {
 +
    /* Add pseudo-selector class to last-child list items in IE 8 */
 +
    if ( parseInt($.browser.version, 10) === 8 ) {
 +
        $( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' )
 +
            .addClass( 'hlist-last-child' );
 +
    }
 +
    /* Generate interpuncts and parens for IE < 8 */
 +
    if ( parseInt($.browser.version, 10) < 8 ) {
 +
        $( '.hlist' ).find( 'dt' ).not( ':last-child' )
 +
            .append( ': ' );
 +
        $( '.hlist' ).find( 'dd, li' ).not( ':last-child' )
 +
            .append( '<b>·</b> ' );
 +
        $( '.hlist' ).find( 'dl dl, ol ol, ul ul' )
 +
            .prepend( '( ' ).append( ') ' );
 +
    }
 +
}
 +
 +
/** JSconfig ************
 +
* Global configuration options to enable/disable and configure
 +
* specific script features from [[MediaWiki:Common.js]] and
 +
* [[MediaWiki:Monobook.js]]
 +
* This framework adds config options (saved as cookies) to [[Special:Preferences]]
 +
* For a more permanent change you can override the default settings in your
 +
* [[Special:Mypage/monobook.js]]
 +
* for Example: JSconfig.keys[loadAutoInformationTemplate] = false;
 +
*
 +
*  Maintainer: [[User:Dschwen]]
 +
*/
 +
 +
var JSconfig =
 +
{
 +
prefix : 'jsconfig_',
 +
keys : {},
 +
meta : {},
 +
 +
//
 +
// Register a new configuration item
 +
//  * name          : String, internal name
 +
//  * default_value : String or Boolean (type determines configuration widget)
 +
//  * description  : String, text appearing next to the widget in the preferences, or an hash-object
 +
//                    containing translations of the description indexed by the language code
 +
//  * prefpage      : Integer (optional), section in the preferences to insert the widget:
 +
//                    0 : User profile        User profile
 +
//                    1 : Skin                Appearance
 +
//                    2 : Math                Date and Time
 +
//                    3 : Files                Editing
 +
//                    4 : Date and time        Recent Changes
 +
//                    5 : Editing              Watchlist
 +
//                    6 : Recent changes      Search Options
 +
//                    7 : Watchlist            Misc
 +
//                    8 : Search              Gadgets
 +
//                    9 : Misc
 +
//
 +
// Access keys through JSconfig.keys[name]
 +
//
 +
registerKey : function( name, default_value, description, prefpage )
 +
{
 +
  if( typeof JSconfig.keys[name] == 'undefined' )
 +
  JSconfig.keys[name] = default_value;
 +
  else {
 +
  // all cookies are read as strings,
 +
  // convert to the type of the default value
 +
  switch( typeof default_value )
 +
  {
 +
    case 'boolean' : JSconfig.keys[name] = ( JSconfig.keys[name] == 'true' ); break;
 +
    case 'number'  : JSconfig.keys[name] = JSconfig.keys[name]/1; break;
 +
  }
 +
  }
 +
 +
  JSconfig.meta[name] = {
 +
  'description' :
 +
    description[wgUserLanguage] || description.en ||
 +
    ( typeof(description) == "string" && description ) ||
 +
    "<i>en</i> translation missing",
 +
  'page' : prefpage || 0, 'default_value' : default_value };
 +
 +
  // if called after setUpForm(), we'll have to add an extra input field
 +
  if( JSconfig.prefsTabs ) JSconfig.addPrefsInput( name );
 +
},
 +
 +
readCookies : function()
 +
{
 +
  var cookies = document.cookie.split("; ");
 +
  var p =JSconfig.prefix.length;
 +
  var i;
 +
 +
  for( var key in cookies )
 +
  {
 +
  if( cookies[key].substring(0,p) == JSconfig.prefix )
 +
  {
 +
    i = cookies[key].indexOf('=');
 +
    //alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) );
 +
    JSconfig.keys[cookies[key].substring(p,i)] = cookies[key].substring(i+1);
 +
  }
 +
  }
 +
},
 +
 +
writeCookies : function()
 +
{
 +
  var expdate = new Date();
 +
  expdate.setTime(expdate.getTime()+1000*60*60*24*3650);  // expires in 3560 days
 +
  for( var key in JSconfig.keys )
 +
  document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=' + expdate.toUTCString();
 +
},
 +
 +
evaluateForm : function()
 +
{
 +
  var w_ctrl,wt;
 +
  //alert('about to save JSconfig');
 +
  for( var key in JSconfig.meta ) {
 +
  w_ctrl = document.getElementById( JSconfig.prefix + key )
 +
  if( w_ctrl )
 +
  {
 +
    wt = typeof JSconfig.meta[key].default_value;
 +
    switch( wt ) {
 +
    case 'boolean' : JSconfig.keys[key] = w_ctrl.checked; break;
 +
    case 'string' : JSconfig.keys[key] = w_ctrl.value; break;
 +
    }
 +
  }
 +
  }
 +
 +
  JSconfig.writeCookies();
 +
  return true;
 +
},
 +
 +
prefsTabs : false,
 +
 +
setUpForm : function()
 +
{
 +
  var prefChild = document.getElementById('preferences');
 +
  if( !prefChild ) return;
 +
  prefChild = prefChild.childNodes;
 +
 +
  //
 +
  // make a list of all preferences sections
 +
  //
 +
  var tabs = new Array;
 +
  var len = prefChild.length;
 +
  for( var key = 0; key < len; key++ ) {
 +
  if( prefChild[key].tagName &&
 +
      prefChild[key].tagName.toLowerCase() == 'fieldset' )
 +
    tabs.push(prefChild[key]);
 +
  }
 +
  JSconfig.prefsTabs = tabs;
 +
 +
  //
 +
  // Create Widgets for all registered config keys
 +
  //
 +
  for( var key in JSconfig.meta ) JSconfig.addPrefsInput(key);
 +
 +
  addEvent(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm );
 +
},
 +
 +
addPrefsInput : function( key ) {
 +
  var w_div = document.createElement( 'DIV' );
 +
 +
  var w_label = document.createElement( 'LABEL' );
 +
  var wt = typeof JSconfig.meta[key].default_value;
 +
  switch ( wt ) {
 +
  case 'boolean':
 +
    JSconfig.meta[key].description = " " + JSconfig.meta[key].description;
 +
    break;
 +
  case 'string': default:
 +
    JSconfig.meta[key].description += ": ";
 +
    break;
 +
  }
 +
  w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) );
 +
  w_label.htmlFor = JSconfig.prefix + key;
 +
 +
  var w_ctrl = document.createElement( 'INPUT' );
 +
  w_ctrl.id = JSconfig.prefix + key;
 +
 +
  // before insertion into the DOM tree
 +
  switch( wt ) {
 +
  case 'boolean':
 +
    w_ctrl.type = 'checkbox';
 +
    w_div.appendChild( w_ctrl );
 +
    w_div.appendChild( w_label );
 +
    break;
 +
  case 'string': default:
 +
    w_ctrl.type = 'text';
 +
    w_div.appendChild( w_label );
 +
    w_div.appendChild( w_ctrl );
 +
    break;
 +
  }
 +
 +
  JSconfig.prefsTabs[JSconfig.meta[key].page].appendChild( w_div );
 +
 +
  // after insertion into the DOM tree
 +
  switch( wt ) {
 +
  case 'boolean' : w_ctrl.defaultChecked = w_ctrl.checked = JSconfig.keys[key]; break;
 +
  case 'string' : w_ctrl.defaultValue = w_ctrl.value = JSconfig.keys[key]; break;
 +
  }
 +
}
 +
};
 +
 +
JSconfig.readCookies();
  
 
/* Test if an element has a certain class **************************************
 
/* Test if an element has a certain class **************************************

Revisión de 19:40 11 oct 2012

/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página. */
/* Any JavaScript here will be loaded for all users on every page load. */
 
/* Scripts specific to Internet Explorer */
/*if ($.client.profile().name == 'msie') { */
if ($.browser.msie) {
    /** 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
    //mw.util.addCSS('@media print { sup, sub, p, .documentDescription { line-height: normal; } }');
 
    // IE overflow bug
    //mw.util.addCSS('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
    //mw.util.addCSS('.iezoomfix div, .iezoomfix table { zoom: 1; }');
 
    // Import scripts specific to Internet Explorer 6
    //if ($.client.profile().versionBase == '6') {
    if ($.browser.msie && (parseInt($.browser.version, 10) === 6)) {
        importScript('MediaWiki:Common.js/IE60Fixes.js');
    }
}
 
/* Fixes for Windows XP font rendering */
if (navigator.appVersion.search(/windows nt 5/i) != -1) {
    //mw.util.addCSS('.IPA {font-family: "Lucida Sans Unicode", "Arial Unicode MS";} ' + 
    //               '.Unicode {font-family: "Arial Unicode MS", "Lucida Sans Unicode";}');
}
 
/* Helper script for .hlist class in Common.css
 * Last updated: September 3, 2012
 * Maintainer: [[User:Edokter]]
 */
 
//if ( $.client.profile().name == 'msie' ) {
if ( $.browser.msie ) {
    /* Add pseudo-selector class to last-child list items in IE 8 */
    if ( parseInt($.browser.version, 10) === 8 ) {
        $( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' )
            .addClass( 'hlist-last-child' );
    }
    /* Generate interpuncts and parens for IE < 8 */
    if ( parseInt($.browser.version, 10) < 8 ) {
        $( '.hlist' ).find( 'dt' ).not( ':last-child' )
            .append( ': ' );
        $( '.hlist' ).find( 'dd, li' ).not( ':last-child' )
            .append( '<b>·</b> ' );
        $( '.hlist' ).find( 'dl dl, ol ol, ul ul' )
            .prepend( '( ' ).append( ') ' );
    }
}
 
/** JSconfig ************
 * Global configuration options to enable/disable and configure
 * specific script features from [[MediaWiki:Common.js]] and
 * [[MediaWiki:Monobook.js]]
 * This framework adds config options (saved as cookies) to [[Special:Preferences]]
 * For a more permanent change you can override the default settings in your 
 * [[Special:Mypage/monobook.js]]
 * for Example: JSconfig.keys[loadAutoInformationTemplate] = false;
 *
 *  Maintainer: [[User:Dschwen]]
 */
 
var JSconfig =
{
 prefix : 'jsconfig_',
 keys : {},
 meta : {},
 
 //
 // Register a new configuration item
 //  * name          : String, internal name
 //  * default_value : String or Boolean (type determines configuration widget)
 //  * description   : String, text appearing next to the widget in the preferences, or an hash-object
 //                    containing translations of the description indexed by the language code
 //  * prefpage      : Integer (optional), section in the preferences to insert the widget:
 //                     0 : User profile         User profile
 //                     1 : Skin                 Appearance
 //                     2 : Math                 Date and Time
 //                     3 : Files                Editing
 //                     4 : Date and time        Recent Changes
 //                     5 : Editing              Watchlist
 //                     6 : Recent changes       Search Options
 //                     7 : Watchlist            Misc
 //                     8 : Search               Gadgets
 //                     9 : Misc
 //
 // Access keys through JSconfig.keys[name]
 //
 registerKey : function( name, default_value, description, prefpage )
 {
  if( typeof JSconfig.keys[name] == 'undefined' ) 
   JSconfig.keys[name] = default_value;
  else {
   // all cookies are read as strings, 
   // convert to the type of the default value
   switch( typeof default_value )
   {
    case 'boolean' : JSconfig.keys[name] = ( JSconfig.keys[name] == 'true' ); break;
    case 'number'  : JSconfig.keys[name] = JSconfig.keys[name]/1; break;
   }
  }
 
  JSconfig.meta[name] = { 
   'description' : 
    description[wgUserLanguage] || description.en || 
    ( typeof(description) == "string" && description ) || 
    "<i>en</i> translation missing", 
   'page' : prefpage || 0, 'default_value' : default_value };
 
  // if called after setUpForm(), we'll have to add an extra input field
  if( JSconfig.prefsTabs ) JSconfig.addPrefsInput( name );
 },
 
 readCookies : function()
 {
  var cookies = document.cookie.split("; ");
  var p =JSconfig.prefix.length;
  var i;
 
  for( var key in cookies )
  {
   if( cookies[key].substring(0,p) == JSconfig.prefix )
   {
    i = cookies[key].indexOf('=');
    //alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) );
    JSconfig.keys[cookies[key].substring(p,i)] = cookies[key].substring(i+1);
   }
  }
 },
 
 writeCookies : function()
 {
  var expdate = new Date();
  expdate.setTime(expdate.getTime()+1000*60*60*24*3650);  // expires in 3560 days
  for( var key in JSconfig.keys )
   document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=' + expdate.toUTCString();
 },
 
 evaluateForm : function()
 {
  var w_ctrl,wt;
  //alert('about to save JSconfig');
  for( var key in JSconfig.meta ) {
   w_ctrl = document.getElementById( JSconfig.prefix + key )
   if( w_ctrl ) 
   {
    wt = typeof JSconfig.meta[key].default_value;
    switch( wt ) {
     case 'boolean' : JSconfig.keys[key] = w_ctrl.checked; break;
     case 'string' : JSconfig.keys[key] = w_ctrl.value; break;
    }
   }
  }
 
  JSconfig.writeCookies();
  return true;
 },
 
 prefsTabs : false,
 
 setUpForm : function()
 { 
  var prefChild = document.getElementById('preferences');
  if( !prefChild ) return;
  prefChild = prefChild.childNodes;
 
  //
  // make a list of all preferences sections
  //
  var tabs = new Array;
  var len = prefChild.length;
  for( var key = 0; key < len; key++ ) {
   if( prefChild[key].tagName &&
       prefChild[key].tagName.toLowerCase() == 'fieldset' ) 
    tabs.push(prefChild[key]);
  }
  JSconfig.prefsTabs = tabs;
 
  //
  // Create Widgets for all registered config keys
  //
  for( var key in JSconfig.meta ) JSconfig.addPrefsInput(key);
 
  addEvent(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm );
 },
 
 addPrefsInput : function( key ) {
  var w_div = document.createElement( 'DIV' );
 
  var w_label = document.createElement( 'LABEL' );
  var wt = typeof JSconfig.meta[key].default_value;
  switch ( wt ) {
   case 'boolean':
    JSconfig.meta[key].description = " " + JSconfig.meta[key].description;
    break;
   case 'string': default:
    JSconfig.meta[key].description += ": ";
    break;
  }
  w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) );
  w_label.htmlFor = JSconfig.prefix + key;
 
  var w_ctrl = document.createElement( 'INPUT' );
  w_ctrl.id = JSconfig.prefix + key;
 
  // before insertion into the DOM tree
  switch( wt ) {
   case 'boolean':
    w_ctrl.type = 'checkbox';
    w_div.appendChild( w_ctrl );
    w_div.appendChild( w_label );
    break;
   case 'string': default:
    w_ctrl.type = 'text';
    w_div.appendChild( w_label );
    w_div.appendChild( w_ctrl );
    break;
  }
 
  JSconfig.prefsTabs[JSconfig.meta[key].page].appendChild( w_div );
 
  // after insertion into the DOM tree
  switch( wt ) {
   case 'boolean' : w_ctrl.defaultChecked = w_ctrl.checked = JSconfig.keys[key]; break;
   case 'string' : w_ctrl.defaultValue = w_ctrl.value = JSconfig.keys[key]; break;
  }
 }
};
 
JSconfig.readCookies();
 
/* Test if an element has a certain class **************************************
  *
  * Description: Uses regular expressions and caching for better performance.
  * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[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);
     };
 })();
 
 
/** 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 ( 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.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.setAttribute( "id", "collapseButton" + tableIndex );
             ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
             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 ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
             collapseTable( i );
         }
     }
 }
 
 addOnloadHook( createCollapseButtons );
 
/***** subPagesLink ********
 * Adds a link to subpages of current page
 *
 *  Maintainers: [[:he:משתמש:ערן]], [[User:Dschwen]]
 *
 *  JSconfig items: bool JSconfig.subPagesLink
 *                       (true=enabled (default), false=disabled)
 ****/
var subPagesLink =
{ 
 //
 // Translations of the menu item
 //
 i18n :
 {
  'bg': 'Подстраници',
  'ca': 'Subpàgines',
  'cs': 'Podstránky',
  'de': 'Unterseiten',
  'en': 'Subpages',    // default
  'et': 'Alamlehed',
  'eo': 'Subpaĝoj',
  'eu': 'Azpiorrialdeak',
  'es': 'Subpáginas',
  'fi': 'Alasivut',
  'fr': 'Sous-pages',
  'gl': 'Subpáxinas',
  'he': 'דפי משנה',
  'hr': 'Podstranice',
  'it': 'Sottopagine',
  'is': 'Undirsíður',
  'ko': '하위 문서 목록',
  'nl': "Subpagina's",
  'no': 'Undersider',
  'pl': 'Podstrony',
  'ru': 'Подстраницы'
 },
 
 install: function()
 {
  // honor user configuration
  if( !JSconfig.keys['subPagesLink'] ) return;
 
  if ( document.getElementById("t-whatlinkshere") 
       &&  wgNamespaceNumber != -2   // Media: (upcoming)
       &&  wgNamespaceNumber != -1   // Special:
       && wgNamespaceNumber != 6     // Image:
       &&  wgNamespaceNumber != 14   // Category:
     )
  {
   var subpagesText = subPagesLink.i18n[wgUserLanguage] || subPagesLink.i18n['en'];
   var subpagesLink = wgArticlePath.replace('$1','Special:Prefixindex/' + wgPageName +'/');
 
   addPortletLink( 'p-tb', subpagesLink, subpagesText, 't-subpages' );
  }
 }
}
JSconfig.registerKey('subPagesLink', true, 
 {
  'bg': 'Показване на връзката Подстраници в менюто с инструменти',
  'cs': 'Zobrazovat v panelu nástrojů odkaz Podstránky',
  'en': 'Show a Subpages link in the toolbox', // default
  'pl': 'Pokaż w panelu bocznym link do podstron',
  'ru': 'Показывать ссылку на подстраницы в меню инструментов'
 }, 7);
addOnloadHook(subPagesLink.install);
 
function WEAddStyles(a) {
  var ss = document.createElement('style');
  ss.type = 'text/css';
  ss.media = 'screen';
  ss.title = 'WE';
  if (ss.stylesheet) ss.stylesheet.cssText = a; //IE
  else ss.appendChild(document.createTextNode(a));
  document.getElementsByTagName('head')[0].appendChild(ss);
}
 
addOnloadHook(function() {
  /* hide some navigation and other unnecessary elements if displayed in an iFrame */
  if (window.self != window.top) {
    var content = document.getElementById('content');
    if (content) {
      content.style.margin = 0;
      content.style.borderStyle = 'none';
    }
    var removals = ['column-one', 'siteNotice', 'contentSub', 'siteSub', 'catlinks', 'page-base', 'head-base', 'head', 'panel', 'footer-info-lastmod', 'footer-info-viewcount', 'footer-places', 'footer-icon-poweredby', 'f-poweredbyico', 'lastmod', 'viewcount', 'privacy', 'about', 'disclaimer'];
    for (var i=0; i<removals.length; i++) {
      var g = document.getElementById(removals[i])
      if (g) {
        g.style.display = 'none';
      }
    }
    document.body.style.background='none';
    var divs = document.getElementsByTagName('div');
    for (i=0; i<divs.length; i++) {
      if (divs[i].className.match(/navigation/i)) {
        divs[i].style.display = 'none';
      }
    }
    g = document.getElementById('footer');
    if (g) {
      g.style.marginLeft = 0;
    }
    var foot = document.getElementById('f-list') || document.getElementById('footer-info');
    if (foot) {
      var li = document.createElement('li');
      g = wgServer + '/' + wgPageName;
      li.innerHTML = 'Fuente: <a href="' + g + '">' + g + '</a>';
      li.style.display = 'block';
      foot.insertBefore(li, document.getElementById('copyright') || document.getElementById('footer-info-copyright'));
    }
    var q = {};
    var qs = document.location.search;
    qs = qs.substring(1).toLowerCase().split('&');
    for (i=0; i<qs.length; i++) {
      g = qs[i].split('=');
      if (g[0] == 'links') {
        var largs = g[1].split('|');
        for (var j=0; j<largs.length; j++) {
          q[largs[j]] = true;
        }
        var hilight = q.highlight ? ' background: yellow;' : '';
        var hover = q.hover ? ' background: yellow;' : '';
        if (q.none || q.highlight || q.hover) {
          WEAddStyles('a.link {text-decoration: none; padding: 0px; background: none; ' + hilight + '} a.visited {text-decoration: none;' + hilight +'} a:active {text-decoration: none;' + hilight + '} a:hover {text-decoration: none;' + hilight + hover + '}');
        }
        var as = document.getElementsByTagName('a');
        for (j=0; j<as.length; j++) {
          var href = as[j].getAttribute('href');
          if (href) {
            if (q.none || q.show || q.hover || q.highlight) {
              as[j].setAttribute('onclick', 'return false;');
            }
            if (q.window) {
              as[j].setAttribute('target', '_WE');
            }
          }
        }
      }
    }
    // if postMessage is supported, try to let the parent know our size
    if (parent.postMessage) {
      var ht = content.offsetHeight;
      var ftr = document.getElementById('footer');
      if (ftr) { ht = ht + ftr.offsetHeight; }
      var loc = document.location.href;
      parent.postMessage('height^' + ht + '^' + loc, "*");
    }
  }
});
 
/* add Links button with permanent link, short link, and iframe snippets for each
 * 2010-12-21 http://WikiEducator.org/User:JimTittsler
 * short links derived from [[commons:Bugzilla:021572]] -- [[commons:meta:user:Platonides]]
 */
function weSelectMe(node) {
  var selection, range, doc, win;
  if ((doc = node.ownerDocument) && (win=doc.defaultView) && typeof win.getSelection != 'undefined' && typeof doc.createRange != 'undefined' && (selection = window.getSelection()) && typeof selection.removeAllRanges != 'undefined') {
    range = doc.createRange();
    range.selectNode(node);
    selection.removeAllRanges();
    selection.addRange(range);
  } else if (document.body && typeof document.body.createTextRange != 'undefined' && (range = document.body.createTextRange())) { /* IE */
    range.moveToElementText(node);
    range.select();
  }
}
 
addOnloadHook( function() {
  var plink = document.getElementById("t-permalink");
  if (wgArticleId && plink) {
    var permanent_link = wgScript + '?oldid=' + wgCurRevisionId;
    var short_url = wgScript + '?curid=' + wgArticleId;
    plink.innerHTML = ['<a href="#" title="Permanent and short URLs, IFrame snippets for this page" onClick="var weLinks=document.getElementById(\'weLinks\'); if (weLinks.style.display == \'none\') { weLinks.style.display = \'block\'; weSelectMe(document.getElementById(\'we_page_iframe\'));} else { weLinks.style.display = \'none\'; } return false;">Links</a>'
      , '<ul id="weLinks" style="display:none;">'
      , '<li><a href="' + permanent_link + '" title="Permanent link to this revision">Permanent Link</a></li>'
      , '<li>IFrame snippet to this revision:<br>'
      , '<span onClick="weSelectMe(this);">&lt;iframe src="' + wgServer + permanent_link + '" width="100%" height="300"&gt;&lt;/iframe&gt;</span></li>'
      , '<li><a href="' + short_url + '" title="Reference page by article id">Short URL</a></li>'
      , '<li>IFrame snippet to this page:<br>'
      , '<span id="we_page_iframe" onClick="weSelectMe(this);">&lt;iframe src="' + wgServer + short_url + '" width="100%" height="300"&gt;&lt;/iframe&gt;</span></li>'
      , '</ul>'
    ].join('');
   }
} );
 
 // BEGIN Dynamic Navigation Bars
 // NEEDS Enable multiple onload functions 
 
 // set up the words in your language
 var NavigationBarHide = 'Collapse';
 var NavigationBarShow = 'Expand';
 
 // 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 = 0;
 
 
 // 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.className == 'NavPic') {
                NavChild.style.display = 'none';
            }
            if (NavChild.className == 'NavContent') {
                NavChild.style.display = 'none';
            }
            if (NavChild.className == 'NavToggle') {
                NavChild.firstChild.data = NavigationBarShow;
            }
        }
 
    // if hidden now
    } else if (NavToggle.firstChild.data == NavigationBarShow) {
        for (
                var NavChild = NavFrame.firstChild;
                NavChild != null;
                NavChild = NavChild.nextSibling
            ) {
            if (NavChild.className == 'NavPic') {
                NavChild.style.display = 'block';
            }
            if (NavChild.className == 'NavContent') {
                NavChild.style.display = 'block';
            }
            if (NavChild.className == 'NavToggle') {
                NavChild.firstChild.data = NavigationBarHide;
            }
        }
    }
 }
 
 // adds show/hide-button to navigation bars
 function createNavigationBarToggleButton()
 {
    var indexNavigationBar = 0;
    // iterate over all < div >-elements
    for(
            var i=0; 
            NavFrame = document.getElementsByTagName("div")[i]; 
            i++
        ) {
        // if found a navigation bar
        if (NavFrame.className == "NavFrame") {
 
            indexNavigationBar++;
            var NavToggle = document.createElement("a");
            NavToggle.className = 'NavToggle';
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
 
            var NavToggleText = document.createTextNode(NavigationBarHide);
            NavToggle.appendChild(NavToggleText);
 
            // add NavToggle-Button as first div-element 
            // in < div class="NavFrame" >
            NavFrame.insertBefore(
                NavToggle,
                NavFrame.firstChild
            );
            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);
        }
    }
 
 }
addOnloadHook(createNavigationBarToggleButton);