MediaWiki:Common.js

/* Any JavaScript here will be loaded for all users on every page load. */

// ************************************************** // Start Javascript Libraries // **************************************************

+function(e,t,n,o){function i{g=p;for(var e,t=0;m.length>0&&100>t;){t++,e=m[0],m[0]=void 0,m.splice(0,1);try{e}catch(n){o(n)}}}function r(e){try{if(e.displayName==s||e.name==s||f!=typeof e.$&&f!=typeof e.$$&&f!=typeof e.addStyle&&f!=typeof e.addScript)return p}catch(t){}return!1}function a{return g}function c(e){var t=typeof e,n="function"==t;if(n||"object"==t)if(r(e))l=e,i;else if(n)if(g)try{e}catch(o){}else m.push(e)}function u(n){n=n||1,l=typeof wikiMod!==f?wikiMod:e[s]||t[s]||(w?w[s]:null);try{if(!g&&!l&&35>n)return setTimeout(function(e){u((e||n)+1)},20,n)}catch(o){}i}var l,f="undefined",s="wikiMod",d="onWikiModReady",p=!0,y=!1,w=typeof unsafeWindow!==f&&"window"===n.prototype.toString.call(unsafeWindow).replace(/^\[object |\]$/g,"").toLowerCase?unsafeWindow:null,g=!1,m=[],h={allowCallbacks:p,allowCrossOriginArguments:p};if(!(w&&f!=typeof w[d]&&f!=typeof e[d]||!w&&f!=typeof t[d])){if(w&&f==typeof w[d]&&f!=typeof exportFunction)try{n.defineProperty(w,d,{get:exportFunction(a,w,h),set:exportFunction(c,w,h),enumerable:p,configurable:y})}catch(b){o(b)}try{n.defineProperty(e,d,{get:a,set:c,enumerable:p,configurable:y})}catch(b){o(b)}if(f==typeof t[d])try{n.defineProperty(t,d,{get:a,set:c,enumerable:p,configurable:y})}catch(b){o(b)}u}}(this,window,Object,console.log);

importScriptPage('User:Jgjake2/js/wikiMod.min.js', 'deadisland');

importScriptPage('User:Jgjake2/js/TabView_Edit_Buttons.js', 'deadisland');

// ************************************************** // End Javascript Libraries // **************************************************

// Read a page's GET URL variables and return them as an associative array. - jgjake2 function getUrlVars { var vars = [], hash, hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'), i = 0; for (i < hashes.length; i++) { hash = hashes[i].split('='); vars.push(hash[0]); vars[hash[0]] = hash[1]; }   return vars; }

function getCookie(c_name) { var i = 0, x, y, ARRcookies = document.cookie.split(";"); for (i < ARRcookies.length; i++) { x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("=")); y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1); x = x.replace(/^\s+|\s+$/g, ""); if (x == c_name) { return unescape(y); }   } }

function checkCookie(cookieName, cookieVal) { if (getCookie(cookieName) == cookieVal) return true; else return false; }

// Add Popup Script importScriptPage('User:Jgjake2/js/Popups.js', 'deadisland');

// ************************************************** // wikiMod Dependant Scripts // **************************************************

// will finish debugging before adding to site //importScriptPage('User:Jgjake2/js/TabView_Edit_Buttons.js', 'deadisland'); importScriptPage('User:Jgjake2/js/jsEditCount.js', 'deadisland');

// ************************************************** // End wikiMod Dependant Scripts // **************************************************

// ************************************************** // Insert Non-Time Critical Scripts Below Here... // **************************************************

/* import script for auto-refresh recent changes */ importScriptPage('AjaxRC/code.js', 'dev'); var ajaxPages = ["Special:RecentChanges","Special:WikiActivity"];

// Add Syntax Highlighting // importScriptPage('User:Jgjake2/js/SyntaxHighlight.js', 'deadisland');

// Change Page Name importScriptPage('User:Jgjake2/js/DISPLAYTITLE.js', 'deadisland');

importScriptPage('EditIntroButton/code.js', 'dev');

importScriptPage('PurgeButton/code.js', 'dev');

// ************************************************** // Experimental javascript countdown timer (Splarka) // Version 0.0.3 // ************************************************** // // Usage example: // //  Only January 01 2007 00:00:00 PST until New years. // //  Javascript disabled. // // If the date is in the format "x|January 01 2007 00:00:00 PST", then the timer is periodic with period x seconds using the given date as the starting time. function updatetimer(i) { var now = new Date; var then = timers[i].eventdate; var diff = Math.floor((then.getTime - now.getTime) / 1000);

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

// reduce modulo period if necessary if (timers[i].period > 0) { if (diff < 0) diff = timers[i].period - ((-diff) % timers[i].period); else diff = diff % timers[i].period; }

// determine plus/minus if (diff < 0) { diff = -diff; var tpm = ''; } else { var tpm = ''; }

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

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

function checktimers { //hide 'nocountdown' and show 'countdown' var nocountdowns = getElementsByClassName(document, 'span', 'nocountdown'); for (var i in nocountdowns) nocountdowns[i].style.display = 'none'; var countdowns = getElementsByClassName(document, 'span', 'countdown'); for (var i in countdowns) countdowns[i].style.display = 'inline';

//set up global objects timers and timeouts. timers = getElementsByClassName(document, 'span', 'countdowndate'); timeouts = []; // generic holder for the timeouts, global if (timers.length === 0) return; for (var i in timers) { var str = timers[i].firstChild.nodeValue; var j = str.indexOf('|'); if (j == -1) timers[i].period = 0; else { timers[i].period = parseInt(str.substr(0, j)); if (isNaN(timers[i].period) || timers[i].period < 0) timers[i].period = 0; str = str.substr(j + 1); }       timers[i].eventdate = new Date(str); updatetimer(i); //start it up   } } addOnloadHook(checktimers);

// ************************************************** // - end -  Experimental javascript countdown timer // ************************************************** /** Collapsible tables ********************************************************* * * Description: Allows tables to be collapsed, showing only the header. See *              NavFrame. * Taken from Wikipedia's Common.js. */

var hasClass = (function {    var reCache = {};    return function (element, className) {        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);   }; });

var autoCollapse = 2; var collapseCaption = "hide"; var expandCaption = "show";

function collapseTable(tableIndex) { var Button = document.getElementById("collapseButton" + tableIndex); var Table = document.getElementById("collapsibleTable" + tableIndex);

if (!Table || !Button) { return false; }

var Rows = Table.rows;

if (Button.firstChild.data == collapseCaption) { for (var i = 1; i < Rows.length; i++) { Rows[i].style.display = "none"; }       Button.firstChild.data = expandCaption; } else { for (var i = 1; i < Rows.length; i++) { Rows[i].style.display = Rows[0].style.display; }       Button.firstChild.data = collapseCaption; } }

function createCollapseButtons { var tableIndex = 0; var NavigationBoxes = {}; var Tables = document.getElementsByTagName("table");

for (var i = 0; i < Tables.length; i++) { if (hasClass(Tables[i], "collapsible")) {

/* only add button and increment count if there is a header row to work with */ var HeaderRow = Tables[i].getElementsByTagName("tr")[0]; if (!HeaderRow) continue; var Header = HeaderRow.getElementsByTagName("th")[0]; if (!Header) continue;

NavigationBoxes[tableIndex] = Tables[i]; Tables[i].setAttribute("id", "collapsibleTable" + tableIndex);

var Button = document.createElement("span"); var ButtonLink = document.createElement("a"); var ButtonText = document.createTextNode(collapseCaption);

Button.style.styleFloat = "right"; Button.style.cssFloat = "right"; Button.style.fontWeight = "normal"; Button.style.textAlign = "right"; Button.style.width = "3.5em";

ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute("id", "collapseButton" + tableIndex); ButtonLink.setAttribute("href", "javascript:collapseTable(" + tableIndex + ");"); ButtonLink.appendChild(ButtonText);

Button.appendChild(document.createTextNode("[")); Button.appendChild(ButtonLink); Button.appendChild(document.createTextNode("]"));

Header.insertBefore(Button, Header.childNodes[0]); tableIndex++; }   }

for (var i = 0; i < tableIndex; i++) { if (hasClass(NavigationBoxes[i], "collapsed") || (tableIndex >= autoCollapse && hasClass(NavigationBoxes[i], "autocollapse"))) { collapseTable(i); }   } }

addOnloadHook(createCollapseButtons);

/** Dynamic Navigation Bars (experimental) ************************************* * * Description: See NavFrame. * Taken from Wikipedia's Common.js. */

// set up the words in your language var NavigationBarHide = '[' + collapseCaption + ']'; var NavigationBarShow = '[' + expandCaption + ']';

// shows and hides content and picture (if available) of navigation bars // Parameters: //    indexNavigationBar: the index of navigation bar to be toggled function toggleNavigationBar(indexNavigationBar) { var NavToggle = document.getElementById("NavToggle" + indexNavigationBar); var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);

if (!NavFrame || !NavToggle) { return false; }

// if shown now if (NavToggle.firstChild.data == NavigationBarHide) { for (       var NavChild = NavFrame.firstChild;        NavChild !== null;        NavChild = NavChild.nextSibling) { if (hasClass(NavChild, 'NavPic')) { NavChild.style.display = 'none'; }           if (hasClass(NavChild, 'NavContent')) { NavChild.style.display = 'none'; }       }        NavToggle.firstChild.data = NavigationBarShow;

// if hidden now } else if (NavToggle.firstChild.data == NavigationBarShow) { for (       var NavChild = NavFrame.firstChild;        NavChild !== null;        NavChild = NavChild.nextSibling) { if (hasClass(NavChild, 'NavPic')) { NavChild.style.display = 'block'; }           if (hasClass(NavChild, 'NavContent')) { NavChild.style.display = 'block'; }       }        NavToggle.firstChild.data = NavigationBarHide; } }

// adds show/hide-button to navigation bars function createNavigationBarToggleButton { var indexNavigationBar = 0; // iterate over all -elements var divs = document.getElementsByTagName("div"); for (   var i = 0;    NavFrame = divs[i];    i++) { // if found a navigation bar if (hasClass(NavFrame, "NavFrame")) {

indexNavigationBar++; var NavToggle = document.createElement("a"); NavToggle.className = 'NavToggle'; NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar); NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');

var NavToggleText = document.createTextNode(NavigationBarHide); for (           var NavChild = NavFrame.firstChild;            NavChild !== null;            NavChild = NavChild.nextSibling) { if (hasClass(NavChild, 'NavPic') || hasClass(NavChild, 'NavContent')) { if (NavChild.style.display == 'none') { NavToggleText = document.createTextNode(NavigationBarShow); break; }               }            }

NavToggle.appendChild(NavToggleText); // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) for (           var j = 0;            j < NavFrame.childNodes.length;            j++) { if (hasClass(NavFrame.childNodes[j], "NavHead")) { NavFrame.childNodes[j].appendChild(NavToggle); }           }            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar); }   } }

addOnloadHook(createNavigationBarToggleButton);