Difference between revisions of "MediaWiki:Common.js"

From JaWiki (Jabber/XMPP wiki)
Jump to: navigation, search
(+много)
 
Line 215: Line 215:
  
 
  if (wgAction != 'history'){
 
  if (wgAction != 'history'){
  addOnloadHook(editZeroSection)
 
 
   addOnloadHook(collapsibleDivs)
 
   addOnloadHook(collapsibleDivs)
 
   addOnloadHook(collapsibleTables)
 
   addOnloadHook(collapsibleTables)
 +
  addOnloadHook(editZeroSection)
 
  }
 
  }

Latest revision as of 20:47, 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> */

 function editZeroSection(){
   var body = document.getElementById('bodyContent')
   if (!body) return
   var h2s = body.getElementsByTagName('H2')
   var h2 = h2s[0]
   if (!h2) return
   if (h2.parentNode.id == 'toctitle') h2 = h2s[1]
   if (!h2) return
   var span = h2.firstChild
   if (!span || span.className != 'editsection') return
   var zero = span.cloneNode(true)
   body.insertBefore(zero, body.firstChild)
   var a = zero.getElementsByTagName('a')[0]
   if (a.href.indexOf('&section=T') == -1 )  a.title = a.title.replace(/:.*$/,': 0')
   else a.title = 'Править секцию: 0'
   a.setAttribute('href', wgScript + '?title='+encodeURIComponent(wgPageName) + '&action=edit&section=0')
 }


/* <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
 }

 /* <h2>Загрузка некоторых из перечисленных выше функций</h2> */

 if (wgAction != 'history'){
   addOnloadHook(collapsibleDivs)
   addOnloadHook(collapsibleTables)
   addOnloadHook(editZeroSection)
 }