Difference between revisions of "MediaWiki:Common.js"

From The Infosphere, the Futurama Wiki
Jump to navigation Jump to search
(Episode articles with special characters would not work correctly as they reserved for other purposes. This should fix that.)
 
(80 intermediate revisions by 3 users not shown)
Line 2: Line 2:
var reasonCaptionShow = "Show reason";
var reasonCaptionShow = "Show reason";
var reasonCaptionHide = "Hide reason";
var reasonCaptionHide = "Hide reason";
var docCaptionShow = "Show documentation";
var docCaptionHide = "Hide documentation";
var tpbCoverChange = "Alternate Image";
//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 hasClass = (function () {
Line 47: Line 54:
addOnloadHook(createAllReasonButtons);
addOnloadHook(createAllReasonButtons);


function columnAreaImage(){
function collapseDoc(id) {
var divS;
  var content = document.getElementById("docContent-" + id);
var divC;
  var rSwitch = document.getElementById("docSwitch-" + id);
if (document.getElementById ) {
  if(rSwitch.firstChild.data==docCaptionShow) {
divS = document.getElementById("column-content");
    content.style.display = "block";
divC = document.getElementById("content");
    rSwitch.firstChild.data = docCaptionHide;
} else if (document.all ) {
  } else {
divS = document.all["column-content"];
    content.style.display = "none";
divC = document.all["content"];
    rSwitch.firstChild.data = docCaptionShow;
} else {
  }
return;
}
if ( divS && divS.style ){
var divSHval;
if (divS.style.pixelHeight) {
divSHval= divS.style.pixelHeight;
} else {
divSHval= divS.offsetHeight;
}
if(Number(divSHval) >1136){
//1136=768(number bigger than background image and side buttons)+imgheight(370)
divS.style.backgroundImage = "url(/images/0/02/Infosphere_lower_Background.png)";
divS.style.backgroundPosition = "bottom left";
divS.style.backgroundRepeat = "no-repeat";
if(hasClass(document.body, "ns-8"))
return;
if(divC && divC.style ) {
//Uhm... apparently this is working now!  Woo!
divC.style.backgroundImage = "url(/images/4/44/Infosphere_content_Background.png)";
divC.style.backgroundPosition = "bottom left";
divC.style.backgroundRepeat = "no-repeat";
}
}
}
}
}


addOnloadHook(columnAreaImage);
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() {
function getClientHeight() {
return document.documentElement.clientHeight;
    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";
}
}


Line 102: Line 407:


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


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


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


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


Line 177: Line 504:


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


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


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


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


function getTranscriptElement(el) {
function getTranscriptElement(el) {
var tn = el.tagName.toLowerCase();
    if(el.id.indexOf("transline-")!=-1)
if(tn=="dl" || (tn=="div" && hasClass(el, "poem")))
        return el;
return el;
    while(el.id.indexOf("transline-")==-1) {
var ptn = el.parentNode.tagName.toLowerCase();
        if(el.id=="bodyContent")
switch(tn) {
            return null;
case "i":
        el = el.parentNode;
case "em":
    }
if(ptn=="dd")
    return el;
return el.parentNode.parentNode;
if(ptn=="p")
return el.parentNode.parentNode;
case "dd":
return el.parentNode;
case "b":
case "strong":
if(ptn=="p")
return el.parentNode.parentNode;
if(ptn=="i")
return el.parentNode.parentNode.parentNode;
case "dl":
return el.parentNode;
case "p":
return el.parentNode;
default:
return null;
}
}
}


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


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


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


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


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


function transcriptHlMultiple() {
function transcriptHlMultiple() {
if(!transcriptHlSecondMode) {
    if(!transcriptHlSecondMode) {
setTranscriptStatus("Double click a line below the current one.");
        setTranscriptStatus("Double click a line below the current one.");
document.getElementById("transcript-multiple").firstChild.data = "Leave multiple highlight mode";
        document.getElementById("transcript-multiple").firstChild.data = "Leave multiple highlight mode";
transcriptHlSecondMode = true;
        transcriptHlSecondMode = true;
} else {
    } else {
setTranscriptStatus("Double click a line.");
        setTranscriptStatus("Double click a line.");
document.getElementById("transcript-multiple").firstChild.data = "Highlight multiple lines";
        document.getElementById("transcript-multiple").firstChild.data = "Highlight multiple lines";
transcriptHlSecondMode = false;
        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";
      opt[15]="Spoiler alert:<br/>Robots and whatnot";
      if(d.getDate() == 1 && d.getMonth() == 0)
      {
        opt[16]="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);

Latest revision as of 03:18, 8 January 2014

/* 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 Image";

//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";
      opt[15]="Spoiler alert:<br/>Robots and whatnot";
      if(d.getDate() == 1 && d.getMonth() == 0)
      {
        opt[16]="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);