Difference between revisions of "MediaWiki:Common.js"

From Pensapedia, the Pensacola encyclopedia
Jump to navigation Jump to search
m
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
+
/** Import module *************************************************************
 +
  *
 +
  *  Description: Includes a raw wiki page as javascript or CSS,
 +
  *              used for including user made modules.
 +
  *  Maintainers: [[User:AzaToth]]
 +
  */
 +
importedScripts = {}; // object keeping track of included scripts, so a script ain't included twice
 +
function importScript( page ) {
 +
    if( importedScripts[page] ) {
 +
        return;
 +
    }
 +
    importedScripts[page] = true;
 +
    var url = wgScriptPath
 +
            + '/index.php?title='
 +
            + encodeURIComponent( page.replace( ' ', '_' ) )
 +
            + '&action=raw&ctype=text/javascript';
 +
    var scriptElem = document.createElement( 'script' );
 +
    scriptElem.setAttribute( 'src' , url );
 +
    scriptElem.setAttribute( 'type' , 'text/javascript' );
 +
    document.getElementsByTagName( 'head' )[0].appendChild( scriptElem );
 +
}
 +
 +
function importStylesheet( page ) {
 +
    var sheet = '@import "'
 +
              + wgScriptPath
 +
              + '/index.php?title='
 +
              + encodeURIComponent( page.replace( ' ', '_' ) )
 +
              + '&action=raw&ctype=text/css";'
 +
    var styleElem = document.createElement( 'style' );
 +
    styleElem.setAttribute( 'type' , 'text/css' );
 +
    styleElem.appendChild( document.createTextNode( sheet ) );
 +
    document.getElementsByTagName( 'head' )[0].appendChild( styleElem );
 +
}
 +
 
 +
/* Test if an element has a certain class ***************************************/
 +
 +
var hasClass = (function () {
 +
    var reCache = {};
 +
    return function (element, className) {
 +
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
 +
    };
 +
})();
 +
 
 +
/** Internet Explorer bug fix ***************************************************/
 +
 +
if (window.showModalDialog && document.compatMode && document.compatMode == "CSS1Compat")
 +
{
 +
  var oldWidth;
 +
  var docEl = document.documentElement;
 +
 +
  function fixIEScroll()
 +
  {
 +
    if (!oldWidth || docEl.clientWidth > oldWidth)
 +
      doFixIEScroll();
 +
    else
 +
      setTimeout(doFixIEScroll, 1);
 +
 
 +
    oldWidth = docEl.clientWidth;
 +
  }
 +
 +
  function doFixIEScroll() {
 +
    docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
 +
  }
 +
 +
  document.attachEvent("onreadystatechange", fixIEScroll);
 +
  attachEvent("onresize", fixIEScroll);
 +
}
 +
 
 +
/** "Technical restrictions" title fix ******************************************/
 
   
 
   
 
  // For pages that have something like Template:Lowercase, replace the title, but only if it is cut-and-pasteable as a valid wikilink.
 
  // 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 [[et Café]]'s title is updated.  <nowiki>But [[C#]] is not an equivalent wikilink, so [[C Sharp]] doesn't have its main title changed)</nowiki>
 
 
  //
 
  //
 
  // The function looks for a banner like this: <nowiki>
 
  // The function looks for a banner like this: <nowiki>
Line 56: Line 123:
 
  }
 
  }
 
     });
 
     });
 +
}
 +
 +
 +
// 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;
 
  }
 
  }

Revision as of 18:02, 10 May 2007

 /** Import module *************************************************************
  *
  *  Description: Includes a raw wiki page as javascript or CSS, 
  *               used for including user made modules.
  *  Maintainers: [[User:AzaToth]]
  */
 importedScripts = {}; // object keeping track of included scripts, so a script ain't included twice
 function importScript( page ) {
     if( importedScripts[page] ) {
         return;
     }
     importedScripts[page] = true;
     var url = wgScriptPath
             + '/index.php?title='
             + encodeURIComponent( page.replace( ' ', '_' ) )
             + '&action=raw&ctype=text/javascript';
     var scriptElem = document.createElement( 'script' );
     scriptElem.setAttribute( 'src' , url );
     scriptElem.setAttribute( 'type' , 'text/javascript' );
     document.getElementsByTagName( 'head' )[0].appendChild( scriptElem );
 }
 
 function importStylesheet( page ) {
     var sheet = '@import "'
               + wgScriptPath
               + '/index.php?title='
               + encodeURIComponent( page.replace( ' ', '_' ) )
               + '&action=raw&ctype=text/css";'
     var styleElem = document.createElement( 'style' );
     styleElem.setAttribute( 'type' , 'text/css' );
     styleElem.appendChild( document.createTextNode( sheet ) );
     document.getElementsByTagName( 'head' )[0].appendChild( styleElem );
 }

 /* Test if an element has a certain class ***************************************/
 
 var hasClass = (function () {
     var reCache = {};
     return function (element, className) {
         return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
     };
 })();

 /** Internet Explorer bug fix ***************************************************/
 
 if (window.showModalDialog && document.compatMode && document.compatMode == "CSS1Compat")
 {
   var oldWidth;
   var docEl = document.documentElement;
 
   function fixIEScroll()
   {
     if (!oldWidth || docEl.clientWidth > oldWidth)
       doFixIEScroll();
     else
       setTimeout(doFixIEScroll, 1);
   
     oldWidth = docEl.clientWidth;
   }
 
   function doFixIEScroll() {
     docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
   }
 
   document.attachEvent("onreadystatechange", fixIEScroll);
   attachEvent("onresize", fixIEScroll);
 }

 /** "Technical restrictions" title fix ******************************************/
 
 // For pages that have something like Template:Lowercase, replace the title, but only if it is cut-and-pasteable as a valid wikilink.
 //
 // The function looks for a banner like this: <nowiki>
 // <div id="RealTitleBanner">    <!-- div that gets hidden -->
 //   <span id="RealTitle">title</span>
 // </div>
 // </nowiki>An element with id=DisableRealTitle disables the function.
 var disableRealTitle = 0;		// users can disable this by making this true from their monobook.js
 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(/^ +/, "").replace(/ +$/, "");		// trim left and right spaces
 				verifyTitle = verifyTitle.replace(/_/g, " ");		// underscores to spaces
 				verifyTitle = verifyTitle.charAt(0).toUpperCase() + verifyTitle.substring(1, verifyTitle.length);	// uppercase first character
 				isPasteable = (verifyTitle == wgTitle);
 
 				var h1 = document.getElementsByTagName("h1")[0];
 				if (h1 && isPasteable) {
 					h1.innerHTML = containsTooMuchHTML ? realTitleText : realTitleHTML;
 					if (!containsTooMuchHTML)
 						realTitleBanner.style.display = "none";
 				}
 				document.title = realTitleText + " - Pensapedia, the Pensacola encyclopedia";
 			}
 		}
 	} 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;
 }