/* generated javascript */
if (!window.skin) {
	var skin = 'monaco';
	var stylepath = 'http://images.wikia.com/common/releases_200911.4/skins';
}

/* MediaWiki:Common.js */
/* Any JavaScript here will be loaded for all users on every page load. */
 /** 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.getElementsByTagName( "tr" ); 
 
     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" ) ) \{
             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.setAttribute( "id", "collapseButton" + tableIndex );
             ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
             ButtonLink.appendChild( ButtonText );
 
             Button.appendChild( document.createTextNode( "[" ) );
             Button.appendChild( ButtonLink );
             Button.appendChild( document.createTextNode( "]" ) );
 
             var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
             /* only add button and increment count if there is a header row to work with */
             if (Header) \{
                 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 );

 /** Dynamic Navigation Bars (experimental) *************************************
  *
  *  Description: See [[Wikipedia:NavFrame]].
  *  Maintainers: UNMAINTAINED
  */
 
  // set up the words in your language
  var NavigationBarHide = '[' + collapseCaption + ']';
  var NavigationBarShow = '[' + expandCaption + ']';
  
  // 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 = autoCollapse;
  
  
  // 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 ( hasClass( NavChild, 'NavPic' ) ) \{
                 NavChild.style.display = 'none';
             \}
             if ( hasClass( NavChild, 'NavContent') ) \{
                 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 (hasClass(NavChild, 'NavPic')) \{
                 NavChild.style.display = 'block';
             \}
             if (hasClass(NavChild, 'NavContent')) \{
                 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 (hasClass(NavFrame, "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);
             // 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 (hasClass(NavFrame.childNodes[j], "NavHead")) \{
                 NavFrame.childNodes[j].appendChild(NavToggle);
               \}
             \}
             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 );

 // ============================================================
 // BEGIN Enable multiple onload functions
 
 // setup onload functions this way:
 // aOnloadFunctions[aOnloadFunctions.length] = function_name; // without brackets!
 
 if (!window.aOnloadFunctions) \{
   var aOnloadFunctions = new Array();
 \}
 
 window.onload = function() \{
   if (window.aOnloadFunctions) \{
     for (var _i=0; _i<aOnloadFunctions.length; _i++) \{
       aOnloadFunctions[_i]();
     \}
   \}
 \}
 
 // END Enable multiple onload functions
 // ============================================================

 // ============================================================
 // BEGIN Dynamic Navigation Bars
 
 // set up the words in your language
 var NavigationBarHide = 'Hide';
 var NavigationBarShow = 'Show';
 
 // 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);
     \}
   \}
 
 \}
 
 aOnloadFunctions[aOnloadFunctions.length] = createNavigationBarToggleButton;
 
 // END Dynamic Navigation Bars
 // ============================================================


 function addLoadEvent(func) 
 \{
   if (window.addEventListener) 
     window.addEventListener("load", func, false);
   else if (window.attachEvent) 
     window.attachEvent("onload", func);
 \}
/* <pre><nowiki> */
// ============================================================
// BEGIN Dynamic Navigation Bars (experimantal)
// This script is from Wikipedia. For author attribution, please see http://en.wikipedia.org/w/index.php?title=MediaWiki:Common.js&action=history


/* 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.getElementsByTagName( "tr" ); 
 
     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" ) ) \{
             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.setAttribute( "id", "collapseButton" + tableIndex );
             ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
             ButtonLink.appendChild( ButtonText );
 
             Button.appendChild( document.createTextNode( "[" ) );
             Button.appendChild( ButtonLink );
             Button.appendChild( document.createTextNode( "]" ) );
 
             var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
             /* only add button and increment count if there is a header row to work with */
             if (Header) \{
                 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 );

 /** Dynamic Navigation Bars (experimental) *************************************
  *
  *  Description: See [[Wikipedia:NavFrame]].
  *  Maintainers: UNMAINTAINED
  */
 
  // set up the words in your language
  var NavigationBarHide = '[' + collapseCaption + ']';
  var NavigationBarShow = '[' + expandCaption + ']';
  
  // 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 = autoCollapse;
  
  
  // 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 ( hasClass( NavChild, 'NavPic' ) ) \{
                 NavChild.style.display = 'none';
             \}
             if ( hasClass( NavChild, 'NavContent') ) \{
                 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 (hasClass(NavChild, 'NavPic')) \{
                 NavChild.style.display = 'block';
             \}
             if (hasClass(NavChild, 'NavContent')) \{
                 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 (hasClass(NavFrame, "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);
             // 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 (hasClass(NavFrame.childNodes[j], "NavHead")) \{
                 NavFrame.childNodes[j].appendChild(NavToggle);
               \}
             \}
             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);
         \}
     \}
   
  \}

// ==================================================
//\tab Collapsible Portlets (experimental)
// ==================================================

function foldingPortlets()
\{
\tab var portlets = getElementsByClassName(document.getElementById('column-one'),'div','portlet');
\tab var portskip = ['p-personal', 'p-cactions', 'p-logo', 'ads-top-left', 'p-search', 'p-tbx', 'p-wikicities-nav'];
\tab var first=true;

\tab for(var i=0;i<portlets.length;i++)
\tab\{
\tab\tab if(portskip.join(' ').indexOf(portlets[i].id)==-1)
\tab\tab\{
\tab\tab\tab var pd = portlets[i].getElementsByTagName('div')[0];
\tab\tab\tab var ph = portlets[i].getElementsByTagName('h5')[0];
\tab\tab\tab ph.className = 'portletCollapsible'
\tab\tab\tab pd.setAttribute('id','pbody-'+i);
\tab\tab\tab pd.style.display='none';

\tab\tab\tab var link = document.createElement('a');
\tab\tab\tab var head = getAllText(ph);
\tab\tab\tab while(ph.firstChild) ph.removeChild(ph.firstChild);
\tab\tab\tab link.appendChild(document.createTextNode(head));
\tab\tab\tab link.setAttribute('href','javascript:showPortlet(\\'' + i + '\\');');
\tab\tab\tab link.setAttribute('id','plink-'+i);
\tab\tab\tab link.className = 'portletClosed';
\tab\tab\tab ph.appendChild(link);

\tab\tab\tab if(first==true)
\tab\tab\tab\{
\tab\tab\tab\tab first=false; 
\tab\tab\tab\tab showPortlet(i);
\tab\tab\tab\}
\tab\tab\}
\tab\}
\}
if(skin=='monobook'&&!window.portletsNormal) addOnloadHook(foldingPortlets)

function getAllText(thing)
\{
\tab if (thing.nodeType == 3) return thing.nodeValue;
\tab var text = new Array(); var i=0;
\tab while(thing.childNodes[i])
\tab\{
\tab\tab text[text.length] = getAllText(thing.childNodes[i]);
\tab\tab i++;
\tab\}
\tab return text.join('');
\}

function showPortlet(id)
\{
\tab var pd = document.getElementById('pbody-'+id);
\tab var pl = document.getElementById('plink-'+id);

\tab if(pd.style.display=='none')
\tab\{
\tab\tab pd.style.display='block';
\tab\tab pl.className = 'portletOpened';
\tab\}
\tab else
\tab\{
\tab\tab pd.style.display='none';
\tab\tab pl.className = 'portletClosed';
\tab\}
\}

// ==================================================
//\tab End Collapsible Portlets
// ==================================================
 
  addOnloadHook( createNavigationBarToggleButton );

// END Dynamic Navigation Bars (experimantal)
// ============================================================

// **************************************************
// Experimental javascript countdown timer (Splarka)
// Version 0.0.2
// **************************************************
// Embed with a span class="countdowntimer", eg:
// <span class="countdowntimer" style="display:none;">April 12 2008 00:00:01 AM EST</span>
// default replacement text can accompany, eg: <span class="notimer">*javascript required*</span>

function updatetimer(i) \{
  var now = new Date();
  var then = timers[i].eventdate;
  var diff = count=Math.floor((then.getTime()-now.getTime())/1000);

  // catch bad date strings
  if(isNaN(diff)) \{ 
    timers[i].firstChild.nodeValue = '** ' + timers[i].eventdate + ' **' ;
    return;
  \}

  // catch negative dates
  if(diff<0) \{
    diff = -diff;
    var left = 'ago since';
  \} else \{
    var left = 'until';
  \}

  // calcuate the diff
  left = (diff%60) + ' seconds ' + left;
    diff=Math.floor(diff/60);
  if(diff > 0) left = (diff%60) + ' minutes ' + left;
    diff=Math.floor(diff/60);
  if(diff > 0) left = (diff%24) + ' hours ' + left;
    diff=Math.floor(diff/24);
  if(diff > 0) left = diff + ' days ' + left
  timers[i].firstChild.nodeValue = left;

  // a setInterval() is more efficient, but calling setTimeout()
  // makes errors break the script rather than infinitely recurse
  tim[i] = setTimeout('updatetimer(' + i + ')',1000);
\}

function checktimers() \{
  var untimers = getElementsByClassName(document, 'span', 'notimer');
  for(var i=0;i < untimers.length; i++) \{
    untimers[i].style.display = 'none';    
  \}
  timers = getElementsByClassName(document, 'span', 'countdowntimer');  //global
  tim = new Array(); // generic holder for the timeouts, global
  if(timers.length == 0) return;
  for(var i=0;i < timers.length; i++) \{
    timers[i].eventdate = new Date(timers[i].firstChild.nodeValue);
    timers[i].firstChild.nodeValue = '0 days 0 hours 0 minutes 0 seconds';
    timers[i].style.display = 'inline';
    updatetimer(i);  //start it up
  \}
\}
addOnloadHook(checktimers)

// **************************************************
//  - end -  Experimental javascript countdown timer
// **************************************************
/** Title rewrite ********************************************************
 * Rewrites the page's title, used by Template:Title
 * By Sikon
 */

function rewriteTitle()
\{
   if(typeof(SKIP_TITLE_REWRITE) != 'undefined' && SKIP_TITLE_REWRITE)
       return;

   var titleDiv = document.getElementById('title-meta');

   if(titleDiv == null || titleDiv == undefined)
       return;

   var cloneNode = titleDiv.cloneNode(true);
   var firstHeading = getElementsByClass('firstHeading', document.getElementById('content'), 'h1')[0];
   var node = firstHeading.childNodes[0];

   // new, then old!
   firstHeading.replaceChild(cloneNode, node);
   cloneNode.style.display = "inline";

   var titleAlign = document.getElementById('title-align');
   firstHeading.style.textAlign = titleAlign.childNodes[0].nodeValue;
\}

addOnloadHook(rewriteTitle, false);
 
/*

//CGI:IRC stuff

This is the script to add CGI:IRC login box to random pages (like [[Wikimania:IRC]]). Please report problems to [[user talk:Cometstyles]]. If recently modified, do a hard refresh of [http://mortalkombat.wikia.com/index.php?title=Mediawiki:Irc.js&action=raw&ctype=text/javascript&dontcountme=s this page] to make mods go live.


:Just add <code><nowiki><div id="cgiircbox"/> </nowiki></code> to a random page.


Note: This is based on the login page from CGI:IRC 0.5, which is made by David Leadbeater and is under the GPL. See http://cgiirc.sf.net .
<source lang="javascript">
*/
function add_irc() {
irc_div = document.getElementById("cgiircbox");
if (irc_div) {
//alt server
//http://chatwikizine.memebot.com/cgi-bin/cgiirc/irc.cgi
//http://irc.net/cgi-bin/irc/irc.cgi (allows all servers)
//http://68.213.57.225/irc.cgi
//http://wnirc.awardspace.com/advanced.html
 var irc_form = new_element("form", {id: 'cgiirclogin', name: 'cgiirclogin', method: 'post', action: 'http://chatwikizine.memebot.com/cgi-bin/cgiirc/irc.cgi', onsubmit: 'setjs();return nickvalid()'}, irc_div);
 new_input('interface', 'nonjs', 'hidden', irc_form);
 new_input('Server', 'irc.freenode.net', 'hidden', irc_form);
 table = new_element("table", {border: 0, cellpadding: 5, cellspacing: 0, id: "cgiircboxtable"}, irc_form);
 //to seperate out table rows

 (function() {
  var tr = new_element("tr", {}, table);
  var td1 = new_element("td", {colspan: 2, align: "center", bgcolor: "#c0c0dd", style: "font-weight: bold;"}, tr);
  var ircTitle = document.createTextNode("CGI:IRC Login");
  td1.appendChild(ircTitle);
 })();
 (function() {
  var tr = new_element("tr", {}, table);
  var td1 = new_element("td", {align: "right", bgcolor: "#f1f1f1", id: "nickname-label-a"}, tr);
  var td2 = new_element("td", {align: "left", bgcolor: "#f1f1f1", id: "nickname-a"}, tr);

 })();


 (function() {
  var tr = new_element("tr", {}, table);
  var td1 = new_element("td", {align: "right", bgcolor: "#f1f1f1", id: "channel-label-a"}, tr);
  var td2 = new_element("td", {align: "left", bgcolor: "#f1f1f1", id: "channel-a"}, tr);

 })();
 (function() {
  var tr = new_element("tr", {}, table);
  var td1 = new_element("td", {align: "left", bgcolor: "#d9d9d9", id: "ircAdvanced-td"}, tr);
  var AdvancedLink = new_element("a", {href: "javascript:show_ircAdvanced()", style: "font-size:small;", id: "ircAdvanced"}, td1);
  var ircAdvanced = document.createTextNode("Advanced...");
  AdvancedLink.appendChild(ircAdvanced);
  var td2 = new_element("td", {align: "right", bgcolor: "#d9d9d9", id: "go-a"}, tr);

 })();

 new_label('Nickname-label', 'nickname', 'Your Nickname: ', document.getElementById("nickname-label-a"));

 if (wgUserGroups && (wgUserGroups.indexOf("user") > 0)) {
  var irc_username = wgUserName;
  }
 else {
  var irc_username = "Wikimaniac" + (Math.floor(Math.random()*100));
 }
 new_input('Nickname', irc_username, 'text', document.getElementById("nickname-a"));
 new_label('Channel-label', 'channel', 'IRC channel (which chat room): ', document.getElementById("channel-label-a"));
 var channel = new_element('select', {name: "Channel", id: "Channel", onchange: "irc_channelChange(this.selectedIndex);"}, document.getElementById("channel-a"));
//start chat chan
 var ircDiscussion = new_element('optgroup', {label: "Discussion", id: "ircDiscussion"}, channel);

 var ircwikinews = new_element("option", {name: "#Mortalkombat", value: "#Mortalkombat", selected: "selected"}, ircDiscussion);
 ircwikinews.appendChild(document.createTextNode("General discussion"));
 
 ircwikinewsen = new_element("option", {name: "#cometstyles", value: "#cometstyles"}, ircDiscussion);
 ircwikinewsen.appendChild(document.createTextNode("The REAL cabal"));

 new_input('go', ' Chat! ', 'submit', document.getElementById("go-a"));

//do the setcharset stuff 
 setcharset()
 }


}
//functions called by above
function show_ircAdvanced() {
//do nothing!
//eventually I will make this expand the form
alert("Advanced options not currently available");
}

function irc_channelChange(chan) {
//fix server
var form = document.getElementById("cgiirclogin");

var serv = document.getElementById("Server");
//break not on all for a reason
switch (chan) {
 case 0:
 case 1:
  //switch to freenode
  serv.setAttribute("value", "irc.freenode.net");
  form.setAttribute("action", "http://chatwikizine.memebot.com/cgi-bin/cgiirc/irc.cgi");
  break;
 case 2:
  //RC
  serv.setAttribute("value", "irc.wikimedia.org");
  form.setAttribute("action", "http://irc.net/cgi-bin/irc/irc.cgi");
  break;
 }
}


function new_input(id, value, type, attach) {
 var new_opt = document.createElement("input");
 new_opt.setAttribute('id', id);
 new_opt.setAttribute('name', id);
 new_opt.setAttribute('value', value);
 new_opt.setAttribute('type', type);
 //starting adding to tree 
 attach.appendChild(new_opt);
 return(document.getElementById(id));
}
function new_label(id, input, value, attach) {
 var new_opt = document.createElement("label");
 new_opt.setAttribute('id', id);
 new_opt.setAttribute('name', id);
 new_opt.setAttribute('for', input);
 var label = document.createTextNode(value);
 new_opt.appendChild(label);
 //starting adding to tree 
 if (attach && attach.appendChild) {
  attach.appendChild(new_opt);
 } else {
  alert("JS Error (CGI::IRC): Can not find element to append new element to. (opt)");
 }
 return(document.getElementById(id));
}

function new_element (name, attributes) {
//Create element, and attributes, and optionally add to tree
// call as new_element(element name to create(string), attributes of element (object), optionally element to append as a child to) 
 if (name) {
  var elm = document.createElement(name);
 } else {
  return null;
 }
//set attributes
 if (typeof(attributes) == "object") {
  for (var i in attributes) {
   elm.setAttribute(i, attributes[i]);
  } 
 } else {
  return null;
 }

//attach to tree (but only if third argument given)
 if (arguments[2]) {
  var appendState = arguments[2].appendChild(elm)
  if (!appendState) {
   alert("JS Error (CGI::IRC): Can not find element to append new element to. (element)");
  }
 }
 return elm;
}

function setjs() {
//This function might be under the GPL as it is from cgi:irc 0.5 by David Leadbeater. see http://cgiirc.sf.net
 if(navigator.product == 'Gecko') {
   document.cgiirclogin["interface"].value = 'mozilla';
 }else if(window.opera && document.childNodes) {
   document.cgiirclogin["interface"].value = 'opera7';
 }else if(navigator.appName == 'Microsoft Internet Explorer' &&
    navigator.userAgent.indexOf("Mac_PowerPC") > 0) {
    document.cgiirclogin["interface"].value = 'konqueror';
 }else if(navigator.appName == 'Microsoft Internet Explorer' &&
 document.getElementById && document.getElementById('ietest').innerHTML) {
   document.cgiirclogin["interface"].value = 'ie';
 }else if(navigator.appName == 'Konqueror') {
    document.cgiirclogin["interface"].value = 'konqueror';
 }else if(window.opera) {
   document.cgiirclogin["interface"].value = 'opera';
 }
}
function nickvalid() {
//This function might be under the GPL as it is from cgi:irc 0.5 by David Leadbeater. see http://cgiirc.sf.net
   var nick = document.cgiirclogin.Nickname.value;
   if(nick.match(/^[A-Za-z0-9\[\]\{\}^\\\|\_\-`]{1,32}$/))
      return true;
   alert('Please enter a valid nickname');
   document.cgiirclogin.Nickname.value = nick.replace(/[^A-Za-z0-9\[\]\{\}^\\\|\_\-`]/g, '');
   return false;
}
function setcharset() {
//This function might be under the GPL as it is from cgi:irc 0.5 by David Leadbeater. see http://cgiirc.sf.net
	if(document.charset && document.cgiirclogin["Character set"])
		document.cgiirclogin['Character set'].value = document.charset
}
//because this is already from a load event
add_irc();
//</source>

/* MediaWiki:Monaco.js */
