Difference between revisions of "MediaWiki:Common.js"

From JaWiki (Jabber/XMPP wiki)
Jump to: navigation, search
(сим-сим, закройся!)
(попробуем иначе)
Line 108: Line 108:
 
/* <h2> Сворачивающиеся блоки </h2> */
 
/* <h2> Сворачивающиеся блоки </h2> */
  
  /** Collapsible tables *********************************************************
+
  /*
  *
+
   *  Невозбранно позаимствовано в http://ru.wikipedia.org/wiki/MediaWiki:Common.js
  *  Description: Allows tables to be collapsed, showing only the header. See
+
  *              http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
+
  *  Maintainers: **MAINTAINERS**
+
   *  Невозбранно позаимствовано в http://www.mediawiki.org/wiki/Manual:NavFrame
+
 
   */
 
   */
  var autoCollapse = 2;
+
  var NavigationBarShowDefault = 2
  var collapseCaption = 'скрыть';
+
  var NavigationBarHide = '[скрыть]'
  var expandCaption = 'показать';
+
  var NavigationBarShow = '[показать]'
 
   
 
   
  function collapseTable( tableIndex ) {
+
  var hasClass = (function (){
var Button = document.getElementById( 'collapseButton' + tableIndex );
+
  var reCache = {}
var Table = document.getElementById( 'collapsibleTable' + tableIndex );
+
  return function (element, className){
 +
    return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className)
 +
  }
 +
})()
 
   
 
   
if ( !Table || !Button ) {
+
function collapsibleTables(){
return false;
+
  var Table, HRow,  HCell, btn, a, tblIdx = 0, colTables = []
}
+
  var allTables = document.getElementsByTagName('table')
 +
  for (var i=0; Table = allTables[i]; i++){
 +
    if (!hasClass(Table, 'collapsible')) continue
 +
    if (!(HRow=Table.rows[0])) continue
 +
    if (!(HCell=HRow.getElementsByTagName('th')[0])) continue
 +
    Table.id = 'collapsibleTable' + tblIdx
 +
    btn = document.createElement('span')
 +
    btn.style.cssText = 'float:right; font-weight:normal; font-size:smaller'
 +
    a = document.createElement('a')
 +
    a.id = 'collapseButton' + tblIdx
 +
    a.href = 'javascript:collapseTable(' + tblIdx + ');'
 +
    a.style.color = HCell.style.color
 +
    a.appendChild(document.createTextNode(NavigationBarHide))
 +
    btn.appendChild(a)
 +
    HCell.insertBefore(btn, HCell.childNodes[0])
 +
    colTables[tblIdx++] = Table
 +
  }
 +
  for (var i=0; i < tblIdx; i++)
 +
    if ((tblIdx > NavigationBarShowDefault && hasClass(colTables[i], 'autocollapse')) || hasClass(colTables[i], 'collapsed'))
 +
      collapseTable(i)
 +
}
 
   
 
   
var Rows = Table.rows;
+
function collapseTable (idx){
 +
  var Table = document.getElementById('collapsibleTable' + idx)
 +
  var btn = document.getElementById('collapseButton' + idx)
 +
  if (!Table || !btn) return false
 +
  var Rows = Table.rows
 +
  var isShown = (btn.firstChild.data == NavigationBarHide)
 +
  btn.firstChild.data = isShown ?  NavigationBarShow : NavigationBarHide
 +
  var disp = isShown ? 'none' : Rows[0].style.display
 +
  for (var i=1; i < Rows.length; i++)
 +
    Rows[i].style.display = disp
 +
}
 
   
 
   
if ( Button.firstChild.data == collapseCaption ) {
+
function collapsibleDivs(){
for ( var i = 1; i < Rows.length; i++ ) {
+
  var navIdx = 0, colNavs = [], i, NavFrame
Rows[i].style.display = 'none';
+
  var divs = document.getElementById('content').getElementsByTagName('div')
}
+
  for (i=0; NavFrame = divs[i]; i++) {
Button.firstChild.data = expandCaption;
+
    if (!hasClass(NavFrame, 'NavFrame')) continue
} else {
+
    NavFrame.id = 'NavFrame' + navIdx
for ( var i = 1; i < Rows.length; i++ ) {
+
    var a = document.createElement('a')
Rows[i].style.display = Rows[0].style.display;
+
    a.className = 'NavToggle'
}
+
    a.id = 'NavToggle' + navIdx
Button.firstChild.data = collapseCaption;
+
    a.href = 'javascript:collapseDiv(' + navIdx + ');'
}
+
    a.appendChild(document.createTextNode(NavigationBarHide))
 +
    for (var j=0; j < NavFrame.childNodes.length; j++)
 +
      if (hasClass(NavFrame.childNodes[j], 'NavHead'))
 +
        NavFrame.childNodes[j].appendChild(a)
 +
    colNavs[navIdx++] = NavFrame
 +
  }
 +
  for (i=0; i < navIdx; i++)
 +
  if ((navIdx > NavigationBarShowDefault && !hasClass(colNavs[i], 'expanded')) || hasClass(colNavs[i], 'collapsed'))
 +
    collapseDiv(i)
 
  }
 
  }
 
   
 
   
  function createCollapseButtons() {
+
  function collapseDiv(idx) {
var tableIndex = 0;
+
  var div = document.getElementById('NavFrame' + idx)
var NavigationBoxes = new Object();
+
  var btn = document.getElementById('NavToggle' + idx)
var Tables = document.getElementsByTagName( 'table' );
+
  if (!div || !btn) return false
+
  var isShown = (btn.firstChild.data == NavigationBarHide)
for ( var i = 0; i < Tables.length; i++ ) {
+
  btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide
if ( hasClass( Tables[i], 'collapsible' ) ) {
+
  var disp = isShown ? 'none' : 'block'
/* only add button and increment count if there is a header row to work with */
+
  for (var child = div.firstChildchild != nullchild = child.nextSibling)
var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0];
+
    if (hasClass(child, 'NavPic') || hasClass(child, 'NavContent'))  
if( !HeaderRow ) continue;
+
      child.style.display = disp
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 MediaWiki:Common.css
+
+
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 );
 
 
/** Test if an element has a certain class **************************************
 
  *
 
  * Description: Uses regular expressions and caching for better performance.
 
  * Maintainers: <nowiki>[[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]</nowiki>
 
  */
 
 
var hasClass = (function() {
 
var reCache = {};
 
return function( element, className ) {
 
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
 
};
 
})();
 

Revision as of 20:57, 22 May 2010

/* Any JavaScript here will be loaded for all users on every page load. */


/* <h2> Обеспечение функционирования {{tl|RealTitle}} </h2> */

 /** "Technical restrictions" title fix *****************************************
 *
 * Description:
 * Maintainers: [[w:en:User:Interiot|Interiot]], [[w:en:User:Mets501|Mets501]], [[w:en:User:Freakofnurture|Freakofnurture]]
 * Спёрто в [[w:en:MediaWiki:Common.js|Википедии]]
 */
 //
 // For pages that have something like Template:Lowercase, replace the title, but only if it is cut-and-pasteable as a valid wikilink.
 // (for instance iPod's title is updated. But [[w:en:C#|C#]] is not an equivalent
 // wikilink, so [[w:en:C Sharp|C Sharp]] doesn't have its main title changed)
 // Likewise for users who have selected the U.K. date format ("1 March") the  
 // titles of day-of-the-year articles will appear in that style. Users with any
 // other date setting are not affected.
 //
 // The function looks for a banner like this: 
 // &lt;div id="RealTitleBanner"&gt;  ... &lt;span id="RealTitle"&gt;title&lt;/span&gt; ... &lt;/div&gt;
 // An element with id=DisableRealTitle disables the function.
 //
 var disableRealTitle = 0; // users can set disableRealTitle = 1 locally to disable.
 if (wgIsArticle) { // don't display the RealTitle when editing, since it is apparently inconsistent (doesn't show when editing sections, doesn't show when not previewing)
  addOnloadHook(function() {
    try {
        var realTitleBanner = document.getElementById("RealTitleBanner");
        if (realTitleBanner && !document.getElementById("DisableRealTitle") && !disableRealTitle ) {
            var realTitle = document.getElementById("RealTitle");
            if (realTitle) {
                var realTitleHTML = realTitle.innerHTML;
                realTitleText = pickUpText(realTitle);
                
                var isPasteable = 0;
                //var containsHTML = /</.test(realTitleHTML);    // contains ANY HTML
                var containsTooMuchHTML = /</.test( realTitleHTML.replace(/<\/?(sub|sup|small|big)>/gi, "") ); // contains HTML that will be ignored when cut-n-pasted as a wikilink
                // calculate whether the title is pasteable
                var verifyTitle = realTitleText.replace(/^ +/, "");       // trim left spaces
                verifyTitle = verifyTitle.charAt(0).toUpperCase() + verifyTitle.substring(1, verifyTitle.length);    // uppercase first character
 
                // if the namespace prefix is there, remove it on our verification copy. If it isn't there, add it to the original realValue copy.
                if (wgNamespaceNumber != 0) {
                    if (wgCanonicalNamespace == verifyTitle.substr(0, wgCanonicalNamespace.length).replace(/ /g, "_") && verifyTitle.charAt(wgCanonicalNamespace.length) == ":") {
                        verifyTitle = verifyTitle.substr(wgCanonicalNamespace.length + 1);
                    } else {
                        realTitleText = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleText;
                        realTitleHTML = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleHTML;
                    }
                }
 
                // verify whether wgTitle matches
                verifyTitle = verifyTitle.replace(/[\s_]+/g, " ");      // underscores and multiple spaces to single spaces
                verifyTitle = verifyTitle.replace(/^\s+/, "").replace(/\s+$/, "");        // trim left and right spaces
                verifyTitle = verifyTitle.charAt(0).toUpperCase() + verifyTitle.substring(1, verifyTitle.length);    // uppercase first character
                isPasteable = 1;
                var h1 = document.getElementsByTagName("h1")[0];
                if (h1 && isPasteable) {
                    h1.innerHTML = containsTooMuchHTML ? realTitleText : realTitleHTML;
                    if (!containsTooMuchHTML)
                        realTitleBanner.style.display = "none";
                    var contentSub = document.getElementById("contentSub");
                    if ( contentSub.getElementsByTagName("a") &&
                      contentSub.getElementsByTagName("a")[0].innerHTML == h1.innerHTML )
                        contentSub.style.display = "none";
                }
                document.title = realTitleText + " — Jabber Wiki";
            }
        }
    } catch (e) {
        /* Something went wrong. */
    }
  });
 }
 
 // similar to innerHTML, but only returns the text portions of the insides, excludes HTML
 function pickUpText(aParentElement) {
 var str = "";
 
 function pickUpTextInternal(aElement) {
  var child = aElement.firstChild;
  while (child) {
   if (child.nodeType == 1)     // ELEMENT_NODE 
    pickUpTextInternal(child);
   else if (child.nodeType == 3)   // TEXT_NODE
    str += child.nodeValue;
 
   child = child.nextSibling;
  }
 }
 
  pickUpTextInternal(aParentElement);
  return str;
 }
 
 //fix edit summary prompt for undo
 //this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the
 //edit summary unchanged
 //this was added by [[w:en:User:Deskana|Deskana]], code by [[w:en:User:Tra|Tra]]
 addOnloadHook(function () {
   if (document.location.search.indexOf("undo=") != -1
   && document.getElementsByName('wpAutoSummary')[0]) {
     document.getElementsByName('wpAutoSummary')[0].value='1';
   }
 })


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

 /*
  *  Невозбранно позаимствовано в http://ru.wikipedia.org/wiki/MediaWiki:Common.js
  */
 var NavigationBarShowDefault = 2
 var NavigationBarHide = '[скрыть]'
 var NavigationBarShow = '[показать]'
 
 var hasClass = (function (){
   var reCache = {}
   return function (element, className){
     return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className)
   }
 })()
 
 function collapsibleTables(){
   var Table, HRow,  HCell, btn, a, tblIdx = 0, colTables = []
   var allTables = document.getElementsByTagName('table')
   for (var i=0; Table = allTables[i]; i++){
     if (!hasClass(Table, 'collapsible')) continue
     if (!(HRow=Table.rows[0])) continue
     if (!(HCell=HRow.getElementsByTagName('th')[0])) continue
     Table.id = 'collapsibleTable' + tblIdx
     btn = document.createElement('span')
     btn.style.cssText = 'float:right; font-weight:normal; font-size:smaller'
     a = document.createElement('a')
     a.id = 'collapseButton' + tblIdx
     a.href = 'javascript:collapseTable(' + tblIdx + ');' 
     a.style.color = HCell.style.color
     a.appendChild(document.createTextNode(NavigationBarHide))
     btn.appendChild(a)
     HCell.insertBefore(btn, HCell.childNodes[0])
     colTables[tblIdx++] = Table
   }
   for (var i=0; i < tblIdx; i++)
     if ((tblIdx > NavigationBarShowDefault && hasClass(colTables[i], 'autocollapse')) || hasClass(colTables[i], 'collapsed'))
       collapseTable(i)
 }
 
 function collapseTable (idx){
   var Table = document.getElementById('collapsibleTable' + idx)
   var btn = document.getElementById('collapseButton' + idx)
   if (!Table || !btn) return false
   var Rows = Table.rows
   var isShown = (btn.firstChild.data == NavigationBarHide)
   btn.firstChild.data = isShown ?  NavigationBarShow : NavigationBarHide
   var disp = isShown ? 'none' : Rows[0].style.display
   for (var i=1; i < Rows.length; i++) 
     Rows[i].style.display = disp
 }
 
 function collapsibleDivs(){
   var navIdx = 0, colNavs = [], i, NavFrame
   var divs = document.getElementById('content').getElementsByTagName('div')
   for (i=0; NavFrame = divs[i]; i++) {
     if (!hasClass(NavFrame, 'NavFrame')) continue
     NavFrame.id = 'NavFrame' + navIdx
     var a = document.createElement('a')
     a.className = 'NavToggle'
     a.id = 'NavToggle' + navIdx
     a.href = 'javascript:collapseDiv(' + navIdx + ');'
     a.appendChild(document.createTextNode(NavigationBarHide))
     for (var j=0; j < NavFrame.childNodes.length; j++)
       if (hasClass(NavFrame.childNodes[j], 'NavHead'))
         NavFrame.childNodes[j].appendChild(a)
     colNavs[navIdx++] = NavFrame
   }
   for (i=0; i < navIdx; i++)
   if ((navIdx > NavigationBarShowDefault && !hasClass(colNavs[i], 'expanded')) || hasClass(colNavs[i], 'collapsed'))
     collapseDiv(i)
 }
 
 function collapseDiv(idx) {
   var div = document.getElementById('NavFrame' + idx)
   var btn = document.getElementById('NavToggle' + idx)
   if (!div || !btn) return false
   var isShown = (btn.firstChild.data == NavigationBarHide)
   btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide 
   var disp = isShown ? 'none' : 'block'
   for (var child = div.firstChild;  child != null;  child = child.nextSibling)
     if (hasClass(child, 'NavPic') || hasClass(child, 'NavContent')) 
       child.style.display = disp
 }