3,295
edits
m (oops) |
No edit summary |
||
Line 1: | Line 1: | ||
/* Any JavaScript here will be loaded for all users on every page load. */ | /* Any JavaScript here will be loaded for all users on every page load. */ | ||
/* Shrinking talk bubble sprites */ | /* Shrinking talk bubble sprites */ | ||
$(document).ready(function() { | $(document).ready(function () { | ||
if (document.readyState != "complete") { | if (document.readyState != "complete") { | ||
setTimeout(arguments.callee,100); | setTimeout(arguments.callee, 100); | ||
return; | return; | ||
} | } | ||
$("table.talkbubble").each(function() { | $("table.talkbubble").each(function () { | ||
$(this).find("td").first().width(90).css("text-align","center").find("img").each(function() { | $(this).find("td").first().width(90).css("text-align", "center").find("img").each(function () { | ||
if ($(this).width() > 90) | if ($(this).width() > 90) $(this).css("height", "auto").width(90); | ||
}); | }); | ||
}); | }); | ||
}); | }); | ||
// ================== | |||
// Code for Template:Suite3 | |||
// Author: Soxra | |||
// ================== | |||
$(document).ready(function () { | |||
$(".morphMaster").each(function () { | |||
var $master = $(this); | |||
var $tabs = $master.find(".morphTabBox"); | |||
var $container = $master.find(".morphTabContainer"); | |||
$tabs.find(".morphLink").click(function () { | |||
var id = $(this).attr("id"); | |||
id = id.substr(0, id.length - 4); | |||
$container.find(".morphContent").hide(); | |||
$container.find("#" + id + "Content").show(); | |||
}); | |||
}); | |||
}); | |||
// ============================================================ | // ============================================================ | ||
Line 27: | Line 46: | ||
var hasClass = (function () { | var hasClass = (function () { | ||
var reCache = {}; | |||
return function (element, className) { | |||
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); | |||
}; | |||
})(); | })(); | ||
/** Collapsible tables ********************************************************* | |||
* | |||
* Description: Allows tables to be collapsed, showing only the header. See | |||
* [[Wikipedia:NavFrame]]. | |||
* Maintainers: [[User:R. Koot]] | |||
*/ | |||
var autoCollapse = 2; | |||
var collapseCaption = "hide"; | |||
var expandCaption = "show"; | |||
function collapseTable(tableIndex) { | |||
var Button = document.getElementById("collapseButton" + tableIndex); | |||
var Table = document.getElementById("collapsibleTable" + tableIndex); | |||
if (!Table || !Button) { | |||
return false; | |||
} | |||
var Rows = Table.getElementsByTagName("tr"); | |||
if (Button.firstChild.data == collapseCaption) { | |||
for (var i = 1; i < Rows.length; i++) { | |||
Rows[i].style.display = "none"; | |||
} | |||
Button.firstChild.data = expandCaption; | |||
} else { | |||
for (var i = 1; i < Rows.length; i++) { | |||
Rows[i].style.display = Rows[0].style.display; | |||
} | |||
Button.firstChild.data = collapseCaption; | |||
} | |||
} | |||
function createCollapseButtons() { | |||
var tableIndex = 0; | |||
var NavigationBoxes = new Object(); | |||
var Tables = document.getElementsByTagName("table"); | |||
for (var i = 0; i < Tables.length; i++) { | |||
if (hasClass(Tables[i], "collapsible")) { | |||
NavigationBoxes[tableIndex] = Tables[i]; | |||
Tables[i].setAttribute("id", "collapsibleTable" + tableIndex); | |||
var Button = document.createElement("span"); | |||
var ButtonLink = document.createElement("a"); | |||
var ButtonText = document.createTextNode(collapseCaption); | |||
Button.style.styleFloat = "right"; | |||
Button.style.cssFloat = "right"; | |||
Button.style.fontWeight = "normal"; | |||
Button.style.textAlign = "right"; | |||
Button.style.width = "6em"; | |||
ButtonLink.setAttribute("id", "collapseButton" + tableIndex); | |||
ButtonLink.setAttribute("href", "javascript:collapseTable(" + tableIndex + ");"); | |||
ButtonLink.appendChild(ButtonText); | |||
Button.appendChild(document.createTextNode("[")); | |||
Button.appendChild(ButtonLink); | |||
Button.appendChild(document.createTextNode("]")); | |||
var Header = Tables[i].getElementsByTagName("tr")[0].getElementsByTagName("th")[0]; | |||
/* only add button and increment count if there is a header row to work with */ | |||
if (Header) { | |||
Header.insertBefore(Button, Header.childNodes[0]); | |||
tableIndex++; | |||
} | |||
} | |||
} | |||
for (var i = 0; i < tableIndex; i++) { | |||
if (hasClass(NavigationBoxes[i], "collapsed") || (tableIndex >= autoCollapse && hasClass(NavigationBoxes[i], "autocollapse"))) { | |||
collapseTable(i); | |||
} | |||
} | |||
} | |||
addOnloadHook(createCollapseButtons); | |||
/** Dynamic Navigation Bars (experimental) ************************************* | |||
* | |||
* Description: See [[Wikipedia:NavFrame]]. | |||
* Maintainers: UNMAINTAINED | |||
*/ | |||
// set up the words in your language | |||
var NavigationBarHide = '[' + collapseCaption + ']'; | |||
var NavigationBarShow = '[' + expandCaption + ']'; | |||
// set up max count of Navigation Bars on page, | |||
// if there are more, all will be hidden | |||
// NavigationBarShowDefault = 0; // all bars will be hidden | |||
// NavigationBarShowDefault = 1; // on pages with more than 1 bar all bars will be hidden | |||
var NavigationBarShowDefault = autoCollapse; | |||
// shows and hides content and picture (if available) of navigation bars | |||
// Parameters: | |||
// indexNavigationBar: the index of navigation bar to be toggled | |||
function toggleNavigationBar(indexNavigationBar) { | |||
var NavToggle = document.getElementById("NavToggle" + indexNavigationBar); | |||
var NavFrame = document.getElementById("NavFrame" + indexNavigationBar); | |||
if (!NavFrame || !NavToggle) { | |||
return false; | |||
} | |||
// if shown now | |||
if (NavToggle.firstChild.data == NavigationBarHide) { | |||
for ( | |||
var NavChild = NavFrame.firstChild; | |||
NavChild != null; | |||
NavChild = NavChild.nextSibling) { | |||
if (hasClass(NavChild, 'NavPic')) { | |||
NavChild.style.display = 'none'; | |||
} | |||
if (hasClass(NavChild, 'NavContent')) { | |||
NavChild.style.display = 'none'; | |||
} | |||
} | |||
NavToggle.firstChild.data = NavigationBarShow; | |||
// if hidden now | |||
} else if (NavToggle.firstChild.data == NavigationBarShow) { | |||
for ( | |||
var NavChild = NavFrame.firstChild; | |||
NavChild != null; | |||
NavChild = NavChild.nextSibling) { | |||
if (hasClass(NavChild, 'NavPic')) { | |||
NavChild.style.display = 'block'; | |||
} | |||
if (hasClass(NavChild, 'NavContent')) { | |||
NavChild.style.display = 'block'; | |||
} | |||
} | |||
NavToggle.firstChild.data = NavigationBarHide; | |||
} | |||
} | |||
// adds show/hide-button to navigation bars | |||
function createNavigationBarToggleButton() { | |||
var indexNavigationBar = 0; | |||
// iterate over all < div >-elements | |||
var divs = document.getElementsByTagName("div"); | |||
for ( | |||
var i = 0; | |||
NavFrame = divs[i]; | |||
i++) { | |||
// if found a navigation bar | |||
if (hasClass(NavFrame, "NavFrame")) { | |||
indexNavigationBar++; | |||
var NavToggle = document.createElement("a"); | |||
NavToggle.className = 'NavToggle'; | |||
NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar); | |||
NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');'); | |||
var NavToggleText = document.createTextNode(NavigationBarHide); | |||
NavToggle.appendChild(NavToggleText); | |||
// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) | |||
for ( | |||
var j = 0; | |||
j < NavFrame.childNodes.length; | |||
j++) { | |||
if (hasClass(NavFrame.childNodes[j], "NavHead")) { | |||
NavFrame.childNodes[j].appendChild(NavToggle); | |||
} | |||
} | |||
NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar); | |||
} | |||
} | |||
// if more Navigation Bars found than Default: hide all | |||
if (NavigationBarShowDefault < indexNavigationBar) { | |||
for ( | |||
var i = 1; | |||
i <= indexNavigationBar; | |||
i++) { | |||
toggleNavigationBar(i); | |||
} | |||
} | |||
} | |||
addOnloadHook(createNavigationBarToggleButton); | |||
Line 234: | Line 244: | ||
// This occurs silently every 60 seconds without a full page reload occuring. | // This occurs silently every 60 seconds without a full page reload occuring. | ||
function setCookie(c_name,value,expiredays) { | function setCookie(c_name, value, expiredays) { | ||
var exdate=new Date(); | var exdate = new Date(); | ||
exdate.setDate(exdate.getDate()+expiredays); | exdate.setDate(exdate.getDate() + expiredays); | ||
document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString()); | document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString()); | ||
} | } | ||
function getCookie(c_name) { | function getCookie(c_name) { | ||
if (document.cookie.length>0) { | if (document.cookie.length > 0) { | ||
c_start=document.cookie.indexOf(c_name + "="); | c_start = document.cookie.indexOf(c_name + "="); | ||
if (c_start!=-1) { | if (c_start != -1) { | ||
c_start=c_start + c_name.length+1; | c_start = c_start + c_name.length + 1; | ||
c_end=document.cookie.indexOf(";",c_start); | c_end = document.cookie.indexOf(";", c_start); | ||
if (c_end==-1) c_end=document.cookie.length; | if (c_end == -1) c_end = document.cookie.length; | ||
return unescape(document.cookie.substring(c_start,c_end)); | return unescape(document.cookie.substring(c_start, c_end)); | ||
} | } | ||
} | } | ||
return ""; | return ""; | ||
} | } | ||
Line 259: | Line 269: | ||
function ajaxRC() { | function ajaxRC() { | ||
appTo = $(".firstHeading"); | appTo = $(".firstHeading"); | ||
appTo.append(' <span style="font-size: xx-small; border-bottom: 1px dotted; cursor:help;" title="Automatically refresh the current page every ' + Math.floor(rcRefresh/1000) + ' seconds">AUTO-REFRESH:</span><input type="checkbox" id="autoRefreshToggle"><span style="position:relative; top:5px; left:5px;" id="autoRefreshProgress"><img src="/images/loader.gif" border="0" alt="AJAX operation in progress" /></span>'); | appTo.append(' <span style="font-size: xx-small; border-bottom: 1px dotted; cursor:help;" title="Automatically refresh the current page every ' + Math.floor(rcRefresh / 1000) + ' seconds">AUTO-REFRESH:</span><input type="checkbox" id="autoRefreshToggle"><span style="position:relative; top:5px; left:5px;" id="autoRefreshProgress"><img src="/images/loader.gif" border="0" alt="AJAX operation in progress" /></span>'); | ||
$("#autoRefreshToggle").click(function() { | $("#autoRefreshToggle").click(function () { | ||
setCookie("ajaxRC", $("#autoRefreshToggle").is(":checked") ? "on" : "off") | setCookie("ajaxRC", $("#autoRefreshToggle").is(":checked") ? "on" : "off") | ||
loadRCData() | loadRCData() | ||
}); | }); | ||
$("#autoRefreshProgress").hide(); | $("#autoRefreshProgress").hide(); | ||
if (getCookie("ajaxRC")=="on" || ajaxRCOverride) { | if (getCookie("ajaxRC") == "on" || ajaxRCOverride) { | ||
$("#autoRefreshToggle").attr("checked", "checked"); | $("#autoRefreshToggle").attr("checked", "checked"); | ||
setTimeout("loadRCData();", rcRefresh); | setTimeout("loadRCData();", rcRefresh); | ||
} | } | ||
} | } | ||
function loadRCData() { | function loadRCData() { | ||
if (!$("#autoRefreshToggle").is(":checked")) return; | if (!$("#autoRefreshToggle").is(":checked")) return; | ||
$('#autoRefreshProgress').show() | $('#autoRefreshProgress').show() | ||
$(article).load(location.href + " "+article+" > *", function (data) { | $(article).load(location.href + " " + article + " > *", function (data) { | ||
$(article + " .mw-collapsible").makeCollapsible(); | $(article + " .mw-collapsible").makeCollapsible(); | ||
$('#autoRefreshProgress').hide() | $('#autoRefreshProgress').hide() | ||
Line 280: | Line 291: | ||
} | } | ||
$(function() { | $(function () { | ||
article = "#bodyContent"; | article = "#bodyContent"; | ||
for (x in ajaxPages) { if (wgPageName == ajaxPages[x] && $("#autoRefreshToggle").length==0) ajaxRC(); } | for (x in ajaxPages) { | ||
if (wgPageName == ajaxPages[x] && $("#autoRefreshToggle").length == 0) ajaxRC(); | |||
} | |||
}); | }); | ||
Line 318: | Line 331: | ||
==================================================*/ | ==================================================*/ | ||
function tabberObj(argsObj) | function tabberObj(argsObj) { | ||
{ | var arg; /* name of an argument to override */ | ||
/* Element for the main tabber div. If you supply this in argsObj, | |||
then the init() method will be called. | then the init() method will be called. | ||
*/ | */ | ||
this.div = null; | |||
/* Class of the main tabber div */ | |||
this.classMain = "tabber"; | |||
/* Rename classMain to classMainLive after tabifying | |||
(so a different style can be applied) | (so a different style can be applied) | ||
*/ | */ | ||
this.classMainLive = "tabberlive"; | |||
/* Class of each DIV that contains a tab */ | |||
this.classTab = "tabbertab"; | |||
/* Class to indicate which tab should be active on startup */ | |||
this.classTabDefault = "tabbertabdefault"; | |||
/* Class for the navigation UL */ | |||
this.classNav = "tabbernav"; | |||
/* When a tab is to be hidden, instead of setting display='none', we | |||
set the class of the div to classTabHide. In your screen | set the class of the div to classTabHide. In your screen | ||
stylesheet you should set classTabHide to display:none. In your | stylesheet you should set classTabHide to display:none. In your | ||
Line 350: | Line 362: | ||
the information is printed. | the information is printed. | ||
*/ | */ | ||
this.classTabHide = "tabbertabhide"; | |||
/* Class to set the navigation LI when the tab is active, so you can | |||
use a different style on the active tab. | use a different style on the active tab. | ||
*/ | */ | ||
this.classNavActive = "tabberactive"; | |||
/* Elements that might contain the title for the tab, only used if a | |||
title is not specified in the TITLE attribute of DIV classTab. | title is not specified in the TITLE attribute of DIV classTab. | ||
*/ | */ | ||
this.titleElements = ['h2', 'h3', 'h4', 'h5', 'h6']; | |||
/* Should we strip out the HTML from the innerHTML of the title elements? | |||
This should usually be true. | This should usually be true. | ||
*/ | */ | ||
this.titleElementsStripHTML = false; | |||
/* If the user specified the tab names using a TITLE attribute on | |||
the DIV, then the browser will display a tooltip whenever the | the DIV, then the browser will display a tooltip whenever the | ||
mouse is over the DIV. To prevent this tooltip, we can remove the | mouse is over the DIV. To prevent this tooltip, we can remove the | ||
TITLE attribute after getting the tab name. | TITLE attribute after getting the tab name. | ||
*/ | */ | ||
this.removeTitle = true; | |||
/* If you want to add an id to each link set this to true */ | |||
this.addLinkId = false; | |||
/* If addIds==true, then you can set a format for the ids. | |||
<tabberid> will be replaced with the id of the main tabber div. | <tabberid> will be replaced with the id of the main tabber div. | ||
<tabnumberzero> will be replaced with the tab number | <tabnumberzero> will be replaced with the tab number | ||
Line 386: | Line 398: | ||
(with all non-alphanumeric characters removed) | (with all non-alphanumeric characters removed) | ||
*/ | */ | ||
this.linkIdFormat = '<tabberid>nav<tabnumberone>'; | |||
/* You can override the defaults listed above by passing in an object: | |||
var mytab = new tabber({property:value,property:value}); | var mytab = new tabber({property:value,property:value}); | ||
*/ | */ | ||
for (arg in argsObj) { | |||
this[arg] = argsObj[arg]; | |||
} | |||
/* Create regular expressions for the class names; Note: if you | |||
change the class names after a new object is created you must | change the class names after a new object is created you must | ||
also change these regular expressions. | also change these regular expressions. | ||
*/ | */ | ||
this.REclassMain = new RegExp('\\b' + this.classMain + '\\b', 'gi'); | |||
this.REclassMainLive = new RegExp('\\b' + this.classMainLive + '\\b', 'gi'); | |||
this.REclassTab = new RegExp('\\b' + this.classTab + '\\b', 'gi'); | |||
this.REclassTabDefault = new RegExp('\\b' + this.classTabDefault + '\\b', 'gi'); | |||
this.REclassTabHide = new RegExp('\\b' + this.classTabHide + '\\b', 'gi'); | |||
/* Array of objects holding info about each tab */ | |||
this.tabs = new Array(); | |||
/* If the main tabber div was specified, call init() now */ | |||
if (this.div) { | |||
this.init(this.div); | |||
/* We don't need the main div anymore, and to prevent a memory leak | |||
in IE, we must remove the circular reference between the div | in IE, we must remove the circular reference between the div | ||
and the tabber object. */ | and the tabber object. */ | ||
this.div = null; | |||
} | |||
} | } | ||
Line 424: | Line 438: | ||
tabberObj.prototype.init = function(e) | tabberObj.prototype.init = function (e) { | ||
{ | /* Set up the tabber interface. | ||
e = element (the main containing div) | e = element (the main containing div) | ||
Line 434: | Line 447: | ||
*/ | */ | ||
var | |||
childNodes, /* child nodes of the tabber div */ | |||
i, i2, /* loop indices */ | |||
t, /* object to store info about a single tab */ | |||
defaultTab = 0, | |||
/* which tab to select by default */ | |||
DOM_ul, /* tabbernav list */ | |||
DOM_li, /* tabbernav list item */ | |||
DOM_a, /* tabbernav link */ | |||
aId, /* A unique id for DOM_a */ | |||
headingElement; /* searching for text to use in the tab */ | |||
/* Verify that the browser supports DOM scripting */ | |||
if (!document.getElementsByTagName) { | |||
return false; | |||
} | |||
/* If the main DIV has an ID then save it. */ | |||
if (e.id) { | |||
this.id = e.id; | |||
} | |||
/* Clear the tabs array (but it should normally be empty) */ | |||
this.tabs.length = 0; | |||
/* Loop through an array of all the child nodes within our tabber element. */ | |||
childNodes = e.childNodes; | |||
for (i = 0; i < childNodes.length; i++) { | |||
/* Find the nodes where class="tabbertab" */ | |||
if (childNodes[i].className && childNodes[i].className.match(this.REclassTab)) { | |||
/* Create a new object to save info about this tab */ | |||
t = new Object(); | |||
/* Save a pointer to the div for this tab */ | |||
t.div = childNodes[i]; | |||
/* Add the new object to the array of tabs */ | |||
this.tabs[this.tabs.length] = t; | |||
/* If the class name contains classTabDefault, | |||
then select this tab by default. | then select this tab by default. | ||
*/ | */ | ||
if (childNodes[i].className.match(this.REclassTabDefault)) { | |||
defaultTab = this.tabs.length - 1; | |||
} | |||
} | |||
} | |||
/* Create a new UL list to hold the tab headings */ | |||
DOM_ul = document.createElement("ul"); | |||
DOM_ul.className = this.classNav; | |||
/* Loop through each tab we found */ | |||
for (i = 0; i < this.tabs.length; i++) { | |||
t = this.tabs[i]; | |||
/* Get the label to use for this tab: | |||
From the title attribute on the DIV, | From the title attribute on the DIV, | ||
Or from one of the this.titleElements[] elements, | Or from one of the this.titleElements[] elements, | ||
Or use an automatically generated number. | Or use an automatically generated number. | ||
*/ | */ | ||
t.headingText = t.div.title; | |||
/* Remove the title attribute to prevent a tooltip from appearing */ | |||
if (this.removeTitle) { | |||
t.div.title = ''; | |||
} | |||
if (!t.headingText) { | |||
/* Title was not defined in the title of the DIV, | |||
So try to get the title from an element within the DIV. | So try to get the title from an element within the DIV. | ||
Go through the list of elements in this.titleElements | Go through the list of elements in this.titleElements | ||
(typically heading elements ['h2','h3','h4']) | (typically heading elements ['h2','h3','h4']) | ||
*/ | */ | ||
for (i2 = 0; i2 < this.titleElements.length; i2++) { | |||
headingElement = t.div.getElementsByTagName(this.titleElements[i2])[0]; | |||
if (headingElement) { | |||
t.headingText = headingElement.innerHTML; | |||
if (this.titleElementsStripHTML) { | |||
t.headingText.replace(/<br>/gi, " "); | |||
t.headingText = t.headingText.replace(/<[^>]+>/g, ""); | |||
} | |||
break; | |||
} | |||
} | |||
} | |||
if (!t.headingText) { | |||
/* Title was not found (or is blank) so automatically generate a | |||
number for the tab. | number for the tab. | ||
*/ | */ | ||
t.headingText = i + 1; | |||
} | |||
/* Create a list element for the tab */ | |||
DOM_li = document.createElement("li"); | |||
/* Save a reference to this list item so we can later change it to | |||
the "active" class */ | the "active" class */ | ||
t.li = DOM_li; | |||
/* Create a link to activate the tab */ | |||
DOM_a = document.createElement("a"); | |||
DOM_a.appendChild(document.createTextNode(t.headingText)); | |||
DOM_a.href = "javascript:void(null);"; | |||
DOM_a.title = t.headingText; | |||
DOM_a.onclick = this.navClick; | |||
/* Add some properties to the link so we can identify which tab | |||
was clicked. Later the navClick method will need this. | was clicked. Later the navClick method will need this. | ||
*/ | */ | ||
DOM_a.tabber = this; | |||
DOM_a.tabberIndex = i; | |||
/* Do we need to add an id to DOM_a? */ | |||
if (this.addLinkId && this.linkIdFormat) { | |||
/* Determine the id name */ | |||
aId = this.linkIdFormat; | |||
aId = aId.replace(/<tabberid>/gi, this.id); | |||
aId = aId.replace(/<tabnumberzero>/gi, i); | |||
aId = aId.replace(/<tabnumberone>/gi, i + 1); | |||
aId = aId.replace(/<tabtitle>/gi, t.headingText.replace(/[^a-zA-Z0-9\-]/gi, '')); | |||
DOM_a.id = aId; | |||
} | |||
/* Add the link to the list element */ | |||
DOM_li.appendChild(DOM_a); | |||
/* Add the list element to the list */ | |||
DOM_ul.appendChild(DOM_li); | |||
} | |||
/* Add the UL list to the beginning of the tabber div */ | |||
e.insertBefore(DOM_ul, e.firstChild); | |||
/* Make the tabber div "live" so different CSS can be applied */ | |||
e.className = e.className.replace(this.REclassMain, this.classMainLive); | |||
/* Activate the default tab, and do not call the onclick handler */ | |||
this.tabShow(defaultTab); | |||
/* If the user specified an onLoad function, call it now. */ | |||
if (typeof this.onLoad == 'function') { | |||
this.onLoad({ | |||
tabber: this | |||
}); | |||
} | |||
return this; | |||
}; | }; | ||
tabberObj.prototype.navClick = function(event) | tabberObj.prototype.navClick = function (event) { | ||
{ | /* This method should only be called by the onClick event of an <A> | ||
element, in which case we will determine which tab was clicked by | element, in which case we will determine which tab was clicked by | ||
examining a property that we previously attached to the <A> | examining a property that we previously attached to the <A> | ||
Line 602: | Line 620: | ||
*/ | */ | ||
var | |||
rVal, /* Return value from the user onclick function */ | |||
a, /* element that triggered the onclick event */ | |||
self, /* the tabber object */ | |||
tabberIndex, /* index of the tab that triggered the event */ | |||
onClickArgs; /* args to send the onclick function */ | |||
a = this; | |||
if (!a.tabber) { | |||
return false; | |||
} | |||
self = a.tabber; | |||
tabberIndex = a.tabberIndex; | |||
/* Remove focus from the link because it looks ugly. | |||
I don't know if this is a good idea... | I don't know if this is a good idea... | ||
*/ | */ | ||
a.blur(); | |||
/* If the user specified an onClick function, call it now. | |||
If the function returns false then do not continue. | If the function returns false then do not continue. | ||
*/ | */ | ||
if (typeof self.onClick == 'function') { | |||
onClickArgs = { | |||
'tabber': self, | |||
'index': tabberIndex, | |||
'event': event | |||
}; | |||
/* IE uses a different way to access the event object */ | |||
if (!event) { | |||
onClickArgs.event = window.event; | |||
} | |||
rVal = self.onClick(onClickArgs); | |||
if (rVal === false) { | |||
return false; | |||
} | |||
} | |||
self.tabShow(tabberIndex); | |||
return false; | |||
}; | }; | ||
tabberObj.prototype.tabHideAll = function() | tabberObj.prototype.tabHideAll = function () { | ||
{ | var i; /* counter */ | ||
/* Hide all tabs and make all navigation links inactive */ | |||
for (i = 0; i < this.tabs.length; i++) { | |||
this.tabHide(i); | |||
} | |||
}; | }; | ||
tabberObj.prototype.tabHide = function(tabberIndex) | tabberObj.prototype.tabHide = function (tabberIndex) { | ||
{ | var div; | ||
if (!this.tabs[tabberIndex]) { | |||
return false; | |||
} | |||
/* Hide a single tab and make its navigation link inactive */ | |||
div = this.tabs[tabberIndex].div; | |||
/* Hide the tab contents by adding classTabHide to the div */ | |||
if (!div.className.match(this.REclassTabHide)) { | |||
div.className += ' ' + this.classTabHide; | |||
} | |||
this.navClearActive(tabberIndex); | |||
return this; | |||
}; | }; | ||
tabberObj.prototype.tabShow = function(tabberIndex) | tabberObj.prototype.tabShow = function (tabberIndex) { | ||
{ | /* Show the tabberIndex tab and hide all the other tabs */ | ||
var div; | |||
if (!this.tabs[tabberIndex]) { | |||
return false; | |||
} | |||
/* Hide all the tabs first */ | |||
this.tabHideAll(); | |||
/* Get the div that holds this tab */ | |||
div = this.tabs[tabberIndex].div; | |||
/* Remove classTabHide from the div */ | |||
div.className = div.className.replace(this.REclassTabHide, ''); | |||
/* Mark this tab navigation link as "active" */ | |||
this.navSetActive(tabberIndex); | |||
/* If the user specified an onTabDisplay function, call it now. */ | |||
if (typeof this.onTabDisplay == 'function') { | |||
this.onTabDisplay({ | |||
'tabber': this, | |||
'index': tabberIndex | |||
}); | |||
} | |||
return this; | |||
}; | }; | ||
tabberObj.prototype.navSetActive = function(tabberIndex) | tabberObj.prototype.navSetActive = function (tabberIndex) { | ||
{ | /* Note: this method does *not* enforce the rule | ||
that only one nav item can be active at a time. | that only one nav item can be active at a time. | ||
*/ | */ | ||
/* Set classNavActive for the navigation list item */ | |||
this.tabs[tabberIndex].li.className = this.classNavActive; | |||
return this; | |||
}; | }; | ||
tabberObj.prototype.navClearActive = function(tabberIndex) | tabberObj.prototype.navClearActive = function (tabberIndex) { | ||
{ | /* Note: this method does *not* enforce the rule | ||
that one nav should always be active. | that one nav should always be active. | ||
*/ | */ | ||
/* Remove classNavActive from the navigation list item */ | |||
this.tabs[tabberIndex].li.className = ''; | |||
return this; | |||
}; | }; | ||
Line 727: | Line 757: | ||
function tabberAutomatic(tabberArgs) | function tabberAutomatic(tabberArgs) { | ||
{ | /* This function finds all DIV elements in the document where | ||
class=tabber.classMain, then converts them to use the tabber | class=tabber.classMain, then converts them to use the tabber | ||
interface. | interface. | ||
Line 735: | Line 764: | ||
tabberArgs = an object to send to "new tabber()" | tabberArgs = an object to send to "new tabber()" | ||
*/ | */ | ||
var | |||
tempObj, /* Temporary tabber object */ | |||
divs, /* Array of all divs on the page */ | |||
i; /* Loop index */ | |||
if (!tabberArgs) { | |||
tabberArgs = {}; | |||
} | |||
/* Create a tabber object so we can get the value of classMain */ | |||
tempObj = new tabberObj(tabberArgs); | |||
/* Find all DIV elements in the document that have class=tabber */ | |||
/* First get an array of all DIV elements and loop through them */ | |||
divs = document.getElementsByTagName("div"); | |||
for (i = 0; i < divs.length; i++) { | |||
/* Is this DIV the correct class? */ | |||
if (divs[i].className && divs[i].className.match(tempObj.REclassMain)) { | |||
/* Now tabify the DIV */ | |||
tabberArgs.div = divs[i]; | |||
divs[i].tabber = new tabberObj(tabberArgs); | |||
} | |||
} | |||
return this; | |||
} | } | ||
Line 768: | Line 798: | ||
function tabberAutomaticOnLoad(tabberArgs) | function tabberAutomaticOnLoad(tabberArgs) { | ||
{ | |||
/* This function adds tabberAutomatic to the window.onload event, | |||
so it will run after the document has finished loading. | so it will run after the document has finished loading. | ||
*/ | */ | ||
// var oldOnLoad; | // var oldOnLoad; | ||
if (!tabberArgs) { | |||
tabberArgs = {}; | |||
} | |||
/* Taken from: http://simon.incutio.com/archive/2004/05/26/addLoadEvent */ | |||
/*oldOnLoad = window.onload; | |||
if (typeof window.onload != 'function') { | if (typeof window.onload != 'function') { | ||
window.onload = function() { | window.onload = function() { | ||
Line 792: | Line 823: | ||
}*/ | }*/ | ||
//Use the wiki onload | //Use the wiki onload | ||
addOnloadHook(function() { | addOnloadHook(function () { | ||
tabberAutomatic(tabberArgs); | |||
}) | |||
} | } | ||
Line 805: | Line 836: | ||
if (typeof tabberOptions == 'undefined') { | if (typeof tabberOptions == 'undefined') { | ||
tabberAutomaticOnLoad(); | |||
} else { | } else { | ||
if (!tabberOptions['manualStartup']) { | |||
tabberAutomaticOnLoad(tabberOptions); | |||
} | |||
} | } | ||
function restoreWatchlistLink () { | function restoreWatchlistLink() { | ||
var wlLink = document.createElement('a'); | |||
wlLink.href = '/Special:Watchlist'; | |||
wlLink.title = 'Your watchlist'; | |||
wlLink.innerHTML = "My watchlist"; | |||
var wlObj = document.createElement('span'); | |||
wlObj.id = 'header_mywatchlist'; | |||
wlObj.appendChild(wlLink); | |||
document.getElementById('userData').insertBefore(wlObj, document.getElementById('header_mytalk').nextSibling); | |||
} | } | ||
addOnloadHook(restoreWatchlistLink); | addOnloadHook(restoreWatchlistLink); | ||
/* Paypal button for main page */ | /* Paypal button for main page */ | ||
function onloadhookcustom() { | function onloadhookcustom() { | ||
var replace = document.getElementById("AdolasPayPal"); | |||
if (null != replace) { | |||
replace.innerHTML = '<form action="https://www.paypal.com/cgi-bin/webscr" method="post"><input type="hidden" name="cmd" value="_s-xclick"><input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----"><input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"><img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"></form>'; | |||
} | |||
} | } | ||
addOnloadHook(onloadhookcustom) | addOnloadHook(onloadhookcustom) | ||
Line 838: | Line 869: | ||
//countdown stuff | //countdown stuff | ||
function updatetimer(i) { | 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() { | 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 = new Array(); // 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); | addOnloadHook(checktimers); |
edits