MediaWiki:Common.js

From The Infosphere, the Futurama Wiki
Revision as of 15:20, 18 January 2012 by Svip (talk | contribs) (Added SOPA protest.)
Jump to navigation Jump to search

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
addOnloadHook(function() {
  var blackout = document.createElement('div');
  blackout.setAttribute('style', 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #000; color: #fff; text-align: center;');
  var div = document.createElement('div');
  div.setAttribute('style', 'margin: 200px;');
  var h1 = document.createElement('h1');
  h1.setAttribute('style', 'text-decoration: line-through;');
  h1.appendChild(document.createTextNode('The Infosphere'));
  var p = document.createElement('p');
  p.appendChild(document.createTextNode('There are currently pending legislation in the U.S. Congress (SOPA and PIPA) that would severely damage the freedom of the Internet, and would also hurt the independence of The Infosphere.'));
  var p2 = document.createElement('p');
  p2.appendChild(document.createTextNode('This legislation could at best force us to block access from American origin to avoid possible censorship of our site.'));
  var p3 = document.createElement('p');
  p3.appendChild(document.createTextNode('If you are a U.S. citizen, write your Congressman.  Tell them that truly beneficial sites like this could be severely limited or entirely removed by the pending legislation.'));
  var a = document.createElement('a');
  a.setAttribute('href', 'http://sopastrike.com');
  a.setAttribute('style', 'color: #a00;');
  a.appendChild(document.createTextNode('Learn more.'));
  div.appendChild(h1);
  div.appendChild(p);
  div.appendChild(p2);
  div.appendChild(p3);
  div.appendChild(a);
  blackout.appendChild(div);
  document.body.appendChild(blackout);
});


/* Any JavaScript here will be loaded for all users on every page load. */
var reasonCaptionShow = "Show reason";
var reasonCaptionHide = "Hide reason";
var docCaptionShow = "Show documentation";
var docCaptionHide = "Hide documentation";
var tpbCoverChange = "Alternate Cover";

//Add any javascript methods here or via [skin].js that need to be triggered after another method alters the page length 
var resizeMethods = '';     // e.g. 'function();function2();'


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 collapseReason(id) {
  var content = document.getElementById("reasonContent-" + id);
  var rSwitch = document.getElementById("reasonSwitch-" + id);
  if(rSwitch.firstChild.data==reasonCaptionShow) {
    content.style.display = "block";
    rSwitch.firstChild.data = reasonCaptionHide;
  } else {
    content.style.display = "none";
    rSwitch.firstChild.data = reasonCaptionShow;
  }
}

function createAllReasonButtons() {
  var reasonIndex = 0;
  var divs = document.getElementsByTagName("div");
  for(var i = 0; i < divs.length; i++) {
    if(hasClass(divs[i], "reasonContainer")) {
      var rSwitch = divs[i].childNodes[0].lastChild;
      var content = divs[i].childNodes[1];

      content.setAttribute("id", "reasonContent-" + reasonIndex);

      var link = document.createElement("a");
      var linkCaption = document.createTextNode(reasonCaptionShow);
      link.setAttribute("id", "reasonSwitch-" + reasonIndex);
      link.setAttribute("href", "javascript:collapseReason(" + reasonIndex + ");");
      link.appendChild(linkCaption);
      
      rSwitch.appendChild(link);
      
      reasonIndex++;
    }
  }
}

addOnloadHook(createAllReasonButtons);

function collapseDoc(id) {
  var content = document.getElementById("docContent-" + id);
  var rSwitch = document.getElementById("docSwitch-" + id);
  if(rSwitch.firstChild.data==docCaptionShow) {
    content.style.display = "block";
    rSwitch.firstChild.data = docCaptionHide;
  } else {
    content.style.display = "none";
    rSwitch.firstChild.data = docCaptionShow;
  }
}

function createAllDocButtons() {
  var docIndex = 0;
  var divs = document.getElementsByTagName("div");
  for(var i = 0; i < divs.length; i++) {
    if(hasClass(divs[i], "template-documentation")) {
      var subs = divs[i].childNodes;
      for(var j = 0; j < subs.length; j++) {
        if(hasClass(subs[j], "fake-h2"))
          var rSwitch = subs[j].firstChild;
        if(hasClass(subs[j], "documentation-content"))
          var content = subs[j];
      }

      content.setAttribute("id", "docContent-" + docIndex);

      var link = document.createElement("a");
      var linkCaption = document.createTextNode(docCaptionHide);
      link.setAttribute("id", "docSwitch-" + docIndex);
      link.setAttribute("href", "javascript:collapseDoc(" + docIndex + ");" + resizeMethods);
      link.appendChild(linkCaption);
      rSwitch.appendChild(link);

      docIndex++;
    }
  }
  if(docIndex>2) {
    for(var i = 0; i < docIndex; i++) {
      collapseDoc(i);
    }
  }
}

addOnloadHook(createAllDocButtons);

function ToggleCoverImage() {
  var el = document.getElementById("image2");
  if ( el.style.display != 'none' ) {
    el.style.display = 'none';
  }
  else {
    el.style.display = '';
  }
  el = document.getElementById("image1");
  if ( el.style.display != 'none' ) {
    el.style.display = 'none';
  }
  else {
    el.style.display = '';
  }
}

function createAllCoverButtons() {

  var divs = document.getElementsByTagName("div");
  for(var i = 0; i < divs.length; i++) {
    if(hasClass(divs[i], "CoverToggle")) {
     // var content = divs[i].lastChild;
      var link = document.createElement("a");
      var linkCaption = document.createTextNode(tpbCoverChange);
      link.setAttribute("href", "javascript:ToggleCoverImage();" + resizeMethods);
      link.appendChild(linkCaption);
 
      divs[i].appendChild(link);
 
      break;
    }
  }
}
 
addOnloadHook(createAllCoverButtons);

var textShow = 'show';
var textHide = 'hide';
var textProd = 'production order';
var textBrod = 'broadcast order';
var prodOrder = true;
var showNav = true;

function findShowHideElements() {
  var tables = document.getElementById("content").getElementsByTagName('table');
  for(var i = 0; i<tables.length; i++) {
    if(hasClass(tables[i], 'showhide')) {
      var spans = tables[i].getElementsByTagName('span');
      for(var j = 0; j<spans.length; j++) {
        if(hasClass(spans[j], 'show-button')) {
          var a = document.createElement('a');
          a.setAttribute('href', 'javascript://');
          a.setAttribute('onclick', 'toggleShow(this);' + resizeMethods);
          a.appendChild(document.createTextNode(textHide));
          spans[j].appendChild(document.createTextNode('['));
          spans[j].appendChild(a);
          spans[j].appendChild(document.createTextNode(']'));
          toggleShow(a);
        }
        if(hasClass(spans[j], 'navigation-toggle')) {
          var a = document.createElement('a');
          a.setAttribute('href', 'javascript://');
          a.setAttribute('onclick', 'toggleShowOrder(this);' + resizeMethods);
          a.appendChild(document.createTextNode(textProd));
          spans[j].appendChild(document.createTextNode('['));
          spans[j].appendChild(a);
          spans[j].appendChild(document.createTextNode(']'));
        }
      }
    }
  }
}

addOnloadHook(findShowHideElements);

function toggleShowOrder(anchor) {
  prodOrder = !prodOrder;
  if(showNav) { // only if visiable
    if(prodOrder) {
      var prodRow = 'table-row';
      var brodRow = 'none';
    } else {
      var brodRow = 'table-row';
      var prodRow = 'none';
    }
    var p = anchor.parentNode;
    while(p.tagName!='TABLE')
      var p = p.parentNode;
    var trs = p.getElementsByTagName('tr');
    for(var i = 0; i < trs.length; i++) {
      if(hasClass(trs[i], 'canhide')) {
        if(hasClass(trs[i], 'production-row')) {
          trs[i].style.display = prodRow;
        } else if(hasClass(trs[i], 'broadcast-row')) {
          trs[i].style.display = brodRow;
        } else {
          trs[i].style.display = 'none';
        }
      }
    }
  }
  if(prodOrder) {
    anchor.innerHTML = textProd;
  } else {
    anchor.innerHTML = textBrod;
  }
}

function toggleShow(anchor) {
  showNav = !showNav;
  if(showNav) {
    var dis = 'table-row';
  } else {
    var dis = 'none';
  }
  var p = anchor.parentNode;
  while(p.tagName!='TABLE')
    var p = p.parentNode;
  var trs = p.getElementsByTagName('tr');
  for(var i = 0; i < trs.length; i++) {
    if(hasClass(trs[i], 'canhide')) {
      if((prodOrder && hasClass(trs[i], 'production-row'))
         || (!prodOrder && hasClass(trs[i], 'broadcast-row'))
         || (!hasClass(trs[i], 'broadcast-row') && !hasClass(trs[i], 'production-row'))) //indicates comic
        trs[i].style.display = dis;
      else
        trs[i].style.display = 'none';
    }
  }
  if(showNav) {
    anchor.innerHTML = textHide;
  } else {
    anchor.innerHTML = textShow;
  }
}

function getClientHeight() {
    return document.documentElement.clientHeight;
}

function alternate_init() {
    var tables = getElementsByClassName(document, "table", "alternateable");
    for(var ti = 0; ti < tables.length; ti++) {
        ts_alternate(tables[ti]);
    }
}
addOnloadHook(alternate_init);

function ts_alternate(table) {
    // Take object table and get all it's tbodies.
    var tableBodies = table.getElementsByTagName("tbody");
    // Loop through these tbodies
    for (var i = 0; i < tableBodies.length; i++) {
        // Take the tbody, and get all it's rows
        var tableRows = tableBodies[i].getElementsByTagName("tr");
        // Loop through these rows
        // Start at 1 because we want to leave the heading row untouched
        var curRow = 0
        var sections = new Array();
        var s = 0;
        sections[s] = new Array();
        for (var j = 0; j < tableRows.length; j++) {
            if(tableRows[j].parentNode != tableBodies[i])
                continue;
            if(tableRows[j].tagName != 'TR')
                continue;
            var ignore = false;
            var oldClasses = tableRows[j].className.split(" ");
            
            var newClassName = "";
            for (var k = 0; k < oldClasses.length; k++) {
                if (oldClasses[k] == "alternate-ignore")
                    ignore = true;
                if (oldClasses[k] == "alternate-reset") {
                    curRow = 0;
                    ignore = true;
                }                    
                if (oldClasses[k] != "" && oldClasses[k] != "even" && oldClasses[k] != "odd")
                    newClassName += oldClasses[k] + " ";
            }
            if(curRow==0 && j>0) {
                s++;
                sections[s] = new Array();
            }
            if(ignore) {
                continue;
            }
            sections[s].push(tableRows[j]);
            curRow++;
        }
        for(var s = 0; s < sections.length; s++) {
            var l = sections[s].length;
            if (l<=1)
                continue;
            for(var r = 0; r < l; r++) {
                var row = sections[s][r];
                var oldClasses = row.className.split(" ");
            
                var newClassName = "";
                for (var k = 0; k < oldClasses.length; k++) {         
                    if (oldClasses[k] != "" && oldClasses[k] != "even" && oldClasses[k] != "odd")
                        newClassName += oldClasses[k] + " ";
                }
                row.className = newClassName + ((l-r) % 2 == 0 ? "odd" : "even");
            }
        }
    }
}

//Donation notice

var barWidth = 200;
var topAmount = 500;
var currentAmount = 0;

function updateDonationNotice() {
  if(!document.getElementById("donation-progress-number"))
    return;
  getDonation();
}

addOnloadHook(updateDonationNotice);

function getDonation() {
  var url = "/api.php?action=query&meta=allmessages&ammessages=donation-amount|donation-contributors&amlang=en&format=xml";
  ajax(url, getDonationEnd, []);
}

function getDonationEnd(xml, data) {
  var doc = xml.documentElement;
  var currentAmount = parseInt(doc.getElementsByTagName("message")[0].firstChild.data);
  var currentContributors = parseInt(doc.getElementsByTagName("message")[1].firstChild.data);
  var nowWidth = (currentAmount/topAmount)*barWidth;
  var number = document.getElementById("donation-progress-number");
  number.innerHTML = currentAmount;
  var progBar = document.getElementById("donation-progress-indicator");
  progBar.setAttribute("style", "width: " + nowWidth + "px");
  var contSpan = document.getElementById("donation-progress-contributors");
  contSpan.innerHTML = currentContributors;
}

function ajax(url, callbackFunction, data) {
  var request =  new XMLHttpRequest();
  request.open("GET", url, true);
  //request.setRequestHeader("Content-Type",
  //                         "application/x-www-form-urlencoded");
  request.onreadystatechange = function() {
    var done = 4, ok = 200;
    if (request.readyState == done) {
      if (request.status == ok) {
        if (request.responseXML) {
          callbackFunction(request.responseXML, data);
        }
      } else {
        if (request.responseXML) {
          alert(request.responseXML);
        } else {
          /*alert('Fejl:  Serveren stak mig i ryggen og skred. ' + request.status);*/
        }
      }
    }
  };
  request.send(null);
}

function canonNotice() {
  var e = document.getElementById('canon-notice-info');
  if(!e)
    return;
  e.setAttribute('onclick', 'toggleCanonNotice(event);');
}

addOnloadHook(canonNotice);

var canonNoticeShow = false;

function toggleCanonNotice(event) {
  var e = document.getElementById('canon-notice-text');
  ev = event || window.event;
  var docWidth = document.body.clientWidth;
  show = !canonNoticeShow;
  canonNoticeShow = !canonNoticeShow;
  if(!show) {
    e.style.display = 'none';
    return;
  }
  var et = document.getElementById('canon-notice-info');
  e.setAttribute('onclick', 'toggleCanonNotice(event);');
  et.setAttribute('onclick', 'toggleCanonNotice(event);');
  e.style.display = 'block';
  right = docWidth - ev.pageX - canonNoticeWidth/2;
  e.style.right = right + "px";
}

//The following is for transcript articles.
var currentTranscriptTarget = null;
var currentTranscriptTarget2 = null;
var currentTranscriptHl = null;
var currentTranscriptHlEnd = null;
var writtenTranscriptLineLink = false;
var transcriptHlColour = "#888888";
var transcriptHlSecondMode = false;
var specialCharacters = ["!", "*", "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]" ];
var specialCharactersValues = {"!" : "%21", "*" : "%2A", "'" : "%27", "(" : "%28", ")" : "%29", ";" : "%3B", ":" : "%3A", "@" : "%40", "&" : "%26", "=" : "%3D", "+" : "2B", "$" : "%24", "," : "%2C", "/" : "%2F", "?" : "%3F", "%" : "%25", "#" : "%23", "[" : "%5B", "]" : "%5D" };

function handleURI(str) {
    var tmp = str;
    for(var i = 0; i < specialCharacters.length; i++) {
        if(tmp.indexOf(specialCharacters[i])!=-1)
            tmp = tmp.replace(specialCharacters[i], specialCharactersValues[specialCharacters[i]]);
    }
    return tmp;
}

function getStyle(el,styleProp) {
    var x = document.getElementById(el);
    if (x.currentStyle)
        var y = x.currentStyle[styleProp];
    else if (window.getComputedStyle)
        var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
    return y;
}

function transcriptStart() {
    if((!document.getElementById("transcript-field") && wgAction=="view") || (wgTitle.indexOf("(transcript)")==-1 && wgAction=="edit")) //check if it is a transcript article, otherwise jump out.
        return;
    if(wgAction=="view") {
        var tf = document.getElementById("transcript-field");
        while(tf.firstChild)
            tf.removeChild(tf.firstChild);
        var activateText = document.createTextNode("Activate edit mode");
        var activateAnchor = document.createElement("a");
        activateAnchor.setAttribute("href", "javascript:activateTranscript();");
        activateAnchor.appendChild(activateText);
        tf.appendChild(activateAnchor);

        giveTranscriptElementsId();
        //Let's check if someone linked to a specific line in the transcript.
        var bookmark = location.hash;
        if(bookmark) {
            var bs = bookmark.split("-");
            var line = document.getElementById("transline-" + bs[1]);
            currentTranscriptHl = line;
            var ypos = line.offsetTop - (getClientHeight()/2);
            line.style.backgroundColor = transcriptHlColour;
            if(bs[2]) {
                var lstart = parseInt(bs[1]);
                var lend = parseInt(bs[2]);
                if(lstart < lend) {
                    for(var i = lstart+1; i<=lend; i++) {
                        var tmp = document.getElementById("transline-" + i);
                        if(tmp==null)
                            break;
                        tmp.style.backgroundColor = transcriptHlColour;
                        currentTranscriptHlEnd = tmp;
                    }
                    if((currentTranscriptHlEnd.offsetTop - line.offsetTop + 50) > getClientHeight())
                        ypos = line.offsetTop - 50;
                    else
                        ypos = line.offsetTop + (currentTranscriptHlEnd.offsetTop - line.offsetTop)/2 - (getClientHeight()/2);
                }
            }
            window.scrollBy(0, ypos);
        }
    } else if(wgAction=="edit") {
        var bookmark = location.hash;
        if(bookmark.indexOf("-")==-1)
            return;
        var lineid = parseInt(bookmark.split("-")[1])
        var findLine = 0;
        var fullContent = document.getElementById("wpTextbox1").firstChild.data.split("\n");
        var inTemplate = false;
        var line = "";
        var fontSize = parseInt(getStyle("wpTextbox1", "font-size"));
        if(!fontSize)
            fontSize = parseInt(getStyle("wpTextbox1", "fontSize"));
        var cWidth = parseInt(document.getElementById("wpTextbox1").offsetWidth);
        var fontWidth = fontSize/2 + 1;
        var lineLength = Math.floor(cWidth/fontWidth - 3 * fontWidth);
        var inBoxLine = 0;
        for(var i = 0; i < fullContent.length; i++) {
            var tmpline = fullContent[i];
            if(tmpline.indexOf("}}")!=-1) {
                inTemplate = false;
                findLine--;
            } else if(tmpline.indexOf("{{")!=-1) {
                inTemplate = true;
            }
            if(!inTemplate)
                findLine++;
            if(findLine>lineid)
                break;
            inBoxLine += Math.floor(tmpline.length/lineLength) + 1;
        }
        //var cHeight = document.getElementById("wpTextbox1").offsetHeight;
        var ypos = Math.floor(inBoxLine * (fontSize + 2));
        document.getElementById("wpTextbox1").scrollTop = ypos;
    }
}

addOnloadHook(transcriptStart);

function giveTranscriptElementsId() {
    var c = document.getElementById("bodyContent");
    var elementIndex = 0;
    var kids = c.childNodes;
    for(var i = 0; i < kids.length; i++) {
        var nt = kids[i].nodeType;
        if(nt!=1)
            continue;
        var tn = kids[i].tagName.toLowerCase();
        if(tn=="dl" || (tn=="div" && hasClass(kids[i], "poem"))) {
            kids[i].setAttribute("id", "transline-" + elementIndex);
            elementIndex++;
        }
    }
}

function activateTranscript() {
    var te = document.getElementById("transcript-edit");
    while(te.firstChild)
        te.removeChild(te.firstChild);
    var tf = document.getElementById("transcript-field");
    while(tf.firstChild)
        tf.removeChild(tf.firstChild);
    var deactivateAnchor = document.createElement("a");
    var deactivateText = document.createTextNode("Deactivate edit mode");
    deactivateAnchor.setAttribute("href", "javascript:deactivateTranscript();");
    deactivateAnchor.appendChild(deactivateText);
    var helpText = document.createTextNode("Double click any line to begin.");
    var div1 = document.createElement("div");
    var div2 = document.createElement("div");
    var p = document.createElement("p");
    var div3 = document.createElement("div");
    div1.setAttribute("class", "infoboxCentre");
    div2.setAttribute("id", "transcript-lineedit");
    div2.setAttribute("class", "infoboxCentre");
    p.setAttribute("style", "font-weight: bold;");
    div3.setAttribute("id", "transcript-linelink");
    div1.appendChild(deactivateAnchor);
    p.appendChild(helpText);
    div2.appendChild(p);
    te.appendChild(div1);
    te.appendChild(div2);
    te.appendChild(div3);
    te.setAttribute("style", "display:block; position: fixed; top: " + (getClientHeight()/2) + "px; right: 10px;");
    document.getElementById("bodyContent").addEventListener('click', transcriptLine, true);
}

function deactivateTranscript() {
    var te = document.getElementById("transcript-edit");
    while(te.firstChild)
        te.removeChild(te.firstChild);
    var tf = document.getElementById("transcript-field");
    te.style.display = "none";
    var activateText = document.createTextNode("Activate edit mode");
    var activateAnchor = document.createElement("a");
    activateAnchor.setAttribute("href", "javascript:activateTranscript();");
    activateAnchor.appendChild(activateText);
    tf.appendChild(activateAnchor);
    if(currentTranscriptHl!=null) {
        unHighlightLines(currentTranscriptHl.id.split("-")[1], true);
        currentTranscriptHl = null;
        currentTranscriptHlEnd = null;
    }
    writtenTranscriptLineLink = false;
    document.getElementById("bodyContent").removeEventListener('click', transcriptLine, true);
}

function unHighlightLines(start, several) {
    start = parseInt(start);
    if(!several) {
        document.getElementById("transline-" + start).style.background = "transparent";
        document.getElementById("transline-" + start).style.backgroundColor = "";
    } else {
        var i = start;
        while(1) {
            if(document.getElementById("transline-" + i)==null || document.getElementById("transline-" + i).style.backgroundColor=="")
                return;
            document.getElementById("transline-" + i).style.background = "transparent";
            document.getElementById("transline-" + i).style.backgroundColor = "";
            i++;
        }
    }
}

function getTranscriptElement(el) {
    if(el.id.indexOf("transline-")!=-1)
        return el;
    while(el.id.indexOf("transline-")==-1) {
        if(el.id=="bodyContent")
            return null;
        el = el.parentNode;
    }
    return el;
}

function transcriptLine(event) {
    if(!event) event = window.event;
    var el = getTranscriptElement(event.target);
    if(el==null)
        return;
    if(!transcriptHlSecondMode) {
        if((currentTranscriptTarget == el) && (currentTranscriptHl!=el)) {
            //Since we are here, it must be assumed this is the second time we clicked it.
            el.style.backgroundColor = transcriptHlColour;
            if(currentTranscriptHl) {
                unHighlightLines(currentTranscriptHl.id.split("-")[1], true);
                currentTranscriptHlEnd = null;
            }
            setTranscriptStatus("Work with this line or click another.");        
            currentTranscriptHl = el;
            transcriptLineLink();
        } else if(currentTranscriptTarget!=el) {
            currentTranscriptTarget = el;
        }
    } else {
        if((currentTranscriptTarget2 == el) && (currentTranscriptHlEnd!=el)) {
            startid = parseInt(currentTranscriptHl.id.split("-")[1]);
            endid = parseInt(el.id.split("-")[1]);
            unHighlightLines(startid+1, true);
            for(var i = startid+1; i<=endid; i++)
                document.getElementById("transline-" + i).style.backgroundColor = transcriptHlColour;
            currentTranscriptHlEnd = document.getElementById("transline-" + endid);
            transcriptLineLink();
        } else if(currentTranscriptTarget2!=el) {
            currentTranscriptTarget2 = el;
        }
    }
}

function transcriptLineLink() {
    hlTop = parseInt(currentTranscriptHl.id.split("-")[1]);
    pageName = handleURI(wgPageName);
    if(!writtenTranscriptLineLink) {
        writtenTranscriptLineLink = true;
        var tll = document.getElementById("transcript-linelink");
        var strong = document.createElement("strong");
        var text1 = document.createTextNode("Link to this line:");
        var text2 = document.createTextNode("Direct URL:");
        var text3 = document.createTextNode("In other articles:");
        var label1 = document.createElement("label");
        var label2 = document.createElement("label");
        label1.setAttribute("for", "transcript-directlinelink");
        label1.setAttribute("style", "float: left; clear:left;");
        label2.setAttribute("for", "transcript-articlelinelink")
        label2.setAttribute("style", "float: left; clear:left;");
        var input1 = document.createElement("input");
        var input2 = document.createElement("input");
        input1.setAttribute("id", "transcript-directlinelink");
        input1.setAttribute("size", "32");
        input1.setAttribute("type", "text");
        input1.setAttribute("value", wgServer + "/" + pageName + "#line-" + hlTop);
        input1.setAttribute("style", "float: left; clear:left; font-size: 0.85em; width: 240px;");
        input1.setAttribute("onFocus", "this.select();");
        input2.setAttribute("id", "transcript-articlelinelink");
        input2.setAttribute("size", "32");
        input2.setAttribute("type", "text");
        input2.setAttribute("value", "{{transline|" + wgTitle.split(" (")[0] + "|" + hlTop + "}}");
        input2.setAttribute("style", "float: left; clear:left; font-size: 0.85em; width: 240px;");
        input2.setAttribute("onFocus", "this.select();");
        strong.appendChild(text1);
        label1.appendChild(text2);
        label2.appendChild(text3);
        tll.appendChild(strong);
        tll.appendChild(label1);
        tll.appendChild(input1);
        tll.appendChild(label2);
        tll.appendChild(input2);

        var tel = document.getElementById("transcript-lineedit");
        var p1 = document.createElement("p");
        var p2 = document.createElement("p");
        var editAnchor = document.createElement("a");
        var editText = document.createTextNode("Edit this line");
        var multipleAnchor = document.createElement("a");
        var multipleText = document.createTextNode("Highlight multiple lines");
        editAnchor.setAttribute("href", "javascript:transcriptEditThisLine();");
        multipleAnchor.setAttribute("href", "javascript:transcriptHlMultiple();");
        multipleAnchor.setAttribute("id", "transcript-multiple");
        editAnchor.appendChild(editText);
        multipleAnchor.appendChild(multipleText);
        p1.appendChild(editAnchor);
        p2.appendChild(multipleAnchor);
        tel.appendChild(p1);
        tel.appendChild(p2);
    } else {
        var input1 = document.getElementById("transcript-directlinelink");
        var input2 = document.getElementById("transcript-articlelinelink");
        if(!transcriptHlSecondMode) {
            input1.setAttribute("value", wgServer + "/" + pageName + "#line-" + hlTop);
            input2.setAttribute("value", "{{transline|" + wgTitle.split(" (")[0] + "|" + hlTop + "}}");
        } else {
            var hl2Top = parseInt(currentTranscriptHlEnd.id.split("-")[1]);
            input1.setAttribute("value", wgServer + "/" + pageName + "#line-" + hlTop + "-" + hl2Top);
            input2.setAttribute("value", "{{transline|" + wgTitle.split(" (")[0] + "|" + hlTop + "|" + hl2Top + "}}");
        }
    }
}

function setTranscriptStatus(msg) {
    document.getElementById("transcript-lineedit").firstChild.firstChild.data = msg;
}

function transcriptEditThisLine() {
    var lid = parseInt(currentTranscriptHl.id.split("-")[1]);
    var url = wgServer + "/index.php?title=" + wgPageName + "&action=edit#line-" + lid;
    location.href = url;
}

function transcriptHlMultiple() {
    if(!transcriptHlSecondMode) {
        setTranscriptStatus("Double click a line below the current one.");
        document.getElementById("transcript-multiple").firstChild.data = "Leave multiple highlight mode";
        transcriptHlSecondMode = true;
    } else {
        setTranscriptStatus("Double click a line.");
        document.getElementById("transcript-multiple").firstChild.data = "Highlight multiple lines";
        transcriptHlSecondMode = false;        
    }
}

function getElementbyClass(rootobj, classname){
  var temparray=new Array();
  var inc=0;
  var rootlength=rootobj.length;
  for (i=0; i<rootlength; i++){
    if (rootobj[i].className==classname)
      temparray[inc++]=rootobj[i];
  }
  return temparray;
}

function randomise(optionsArray){
  if(optionsArray.length == 0)
  {
    return;
  }
  return optionsArray[Math.floor(Math.random() * optionsArray.length)];
}
 
function randomiseTitleCaptions(){
  if(wgTitle == "Main Page")
  {
    var titleCaption = getElementbyClass(document.getElementsByTagName("p"), "titleCaption");

    var d = new Date();
    if(d.getDate() == 30 && d.getMonth() == 0)
    {
      var sphereAge =d.getFullYear()-2006;
      //TODO: update this before 2027 (sphereAge == 21)
      titleCaption[0].innerHTML = "What day is today? It's The Infosphere's "+ sphereAge +"th birthday!";
    }
    else
    {
      var opt = new Array();
      opt[0]="As seen on TV";
      opt[1]="For external use only";
      opt[2]="Deciphered from crop circles";
      opt[3]="80% entertainment by volume";
      opt[4]="As foretold by Nostradamus";
      opt[5]="The proud result of prison labor";
      opt[6]="Proudly made on Earth";
      opt[7]="It just won't stay dead!";
      opt[8]="Torn from tomorrow's headlines";
      opt[9]="For the sophisticated shut-in";
      opt[10]="Dancing space potatoes?<br/>You bet!";
      opt[11]="A stern warning of things to come";
      opt[12]="Penetrates even the thickest foil hat";
      opt[13]="There will be a test";
      opt[14]="A by-product of the TV industry";
      if(d.getDate() == 1 && d.getMonth() == 0)
      {
        opt[15]="Happy New Year, naked weirdo!";
      }
      titleCaption[0].innerHTML = randomise(opt);
    }
  }
}
 
addOnloadHook(randomiseTitleCaptions);

function countdownTemplate(){
  var counters = getElementbyClass(document.getElementsByTagName("span"), "countdown");
  var today = new Date();
  for (i=0; i<counters.length; i++){
    var month = document.getElementById(counters[i].id+"_month").innerHTML;
    var date = document.getElementById(counters[i].id+"_date").innerHTML;
    var year = document.getElementById(counters[i].id+"_year").innerHTML;
    
    var endDate = new Date();
    endDate.setFullYear(year, month - 1, date);
    var daysLeft = (Math.round((endDate.getTime() - today.getTime())/86400000));
    counters[i].innerHTML = daysLeft;
    if ( daysLeft == 1 )
      document.getElementById(counters[i].id+"_days").innerHTML = "day";
    else
      document.getElementById(counters[i].id+"_days").innerHTML = "days";
  }
}

addOnloadHook(countdownTemplate);