X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=skins%2Fcommon%2Fwikibits.js;h=d9dcb802b982b4756231e5c25ae1f4134904be96;hb=07a395bd9beae9e9e88d032f9a135a454eed4ca4;hp=ce61ca88a99592a530ec0b655cf9e6b1379cfdc6;hpb=e4cb5d4be79be785c5f70ed9bdc2bef23d995dbe;p=lhc%2Fweb%2Fwiklou.git diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index ce61ca88a9..d9dcb802b9 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -1,218 +1,257 @@ // MediaWiki JavaScript support functions -var clientPC = navigator.userAgent.toLowerCase(); // Get client info -var is_gecko = /gecko/.test( clientPC ) && +window.clientPC = navigator.userAgent.toLowerCase(); // Get client info +window.is_gecko = /gecko/.test( clientPC ) && !/khtml|spoofer|netscape\/7\.0/.test(clientPC); -var webkit_match = clientPC.match(/applewebkit\/(\d+)/); + +window.is_safari = window.is_safari_win = window.webkit_version = + window.is_chrome = window.is_chrome_mac = false; +window.webkit_match = clientPC.match(/applewebkit\/(\d+)/); if (webkit_match) { - var is_safari = clientPC.indexOf('applewebkit') != -1 && + window.is_safari = clientPC.indexOf('applewebkit') != -1 && clientPC.indexOf('spoofer') == -1; - var is_safari_win = is_safari && clientPC.indexOf('windows') != -1; - var webkit_version = parseInt(webkit_match[1]); + window.is_safari_win = is_safari && clientPC.indexOf('windows') != -1; + window.webkit_version = parseInt(webkit_match[1]); + // Tests for chrome here, to avoid breaking old scripts safari left alone + // This is here for accesskeys + window.is_chrome = clientPC.indexOf('chrome') !== -1 && + clientPC.indexOf('spoofer') === -1; + window.is_chrome_mac = is_chrome && clientPC.indexOf('mac') !== -1 } -var is_khtml = navigator.vendor == 'KDE' || - ( document.childNodes && !document.all && !navigator.taintEnabled ); + // For accesskeys; note that FF3+ is included here! -var is_ff2 = /firefox\/[2-9]|minefield\/3/.test( clientPC ); -var is_ff2_ = /firefox\/2/.test( clientPC ); +window.is_ff2 = /firefox\/[2-9]|minefield\/3/.test( clientPC ); +window.ff2_bugs = /firefox\/2/.test( clientPC ); // These aren't used here, but some custom scripts rely on them -var is_ff2_win = is_ff2 && clientPC.indexOf('windows') != -1; -var is_ff2_x11 = is_ff2 && clientPC.indexOf('x11') != -1; +window.is_ff2_win = is_ff2 && clientPC.indexOf('windows') != -1; +window.is_ff2_x11 = is_ff2 && clientPC.indexOf('x11') != -1; + +window.is_opera = window.is_opera_preseven = window.is_opera_95 = + window.opera6_bugs = window.opera7_bugs = window.opera95_bugs = false; if (clientPC.indexOf('opera') != -1) { - var is_opera = true; - var is_opera_preseven = window.opera && !document.childNodes; - var is_opera_seven = window.opera && document.childNodes; - var is_opera_95 = /opera\/(9.[5-9]|[1-9][0-9])/.test( clientPC ); + window.is_opera = true; + window.is_opera_preseven = window.opera && !document.childNodes; + window.is_opera_seven = window.opera && document.childNodes; + window.is_opera_95 = /opera\/(9\.[5-9]|[1-9][0-9])/.test( clientPC ); + window.opera6_bugs = is_opera_preseven; + window.opera7_bugs = is_opera_seven && !is_opera_95; + window.opera95_bugs = /opera\/(9\.5)/.test( clientPC ); +} +// As recommended by , +// avoiding false positives from moronic extensions that append to the IE UA +// string (bug 23171) +window.ie6_bugs = false; +if ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( clientPC ) != null +&& parseFloat( RegExp.$1 ) <= 6.0 ) { + ie6_bugs = true; } // Global external objects used by this script. /*extern ta, stylepath, skin */ // add any onload functions in this hook (please don't hard-code any events in the xhtml source) -var doneOnloadHook; +window.doneOnloadHook = undefined; if (!window.onloadFuncts) { - var onloadFuncts = []; + window.onloadFuncts = []; } -function addOnloadHook(hookFunct) { +window.addOnloadHook = function( hookFunct ) { // Allows add-on scripts to add onload functions - if(!doneOnloadHook) { + if( !doneOnloadHook ) { onloadFuncts[onloadFuncts.length] = hookFunct; } else { hookFunct(); // bug in MSIE script loading } } -function hookEvent(hookName, hookFunct) { - addHandler(window, hookName, hookFunct); -} - -function importScript(page) { +window.importScript = function( page ) { // TODO: might want to introduce a utility function to match wfUrlencode() in PHP var uri = wgScript + '?title=' + encodeURIComponent(page.replace(/ /g,'_')).replace(/%2F/ig,'/').replace(/%3A/ig,':') + '&action=raw&ctype=text/javascript'; - return importScriptURI(uri); + return importScriptURI( uri ); } - -var loadedScripts = {}; // included-scripts tracker -function importScriptURI(url) { - if (loadedScripts[url]) { + +window.loadedScripts = {}; // included-scripts tracker +window.importScriptURI = function( url ) { + if ( loadedScripts[url] ) { return null; } loadedScripts[url] = true; - var s = document.createElement('script'); - s.setAttribute('src',url); - s.setAttribute('type','text/javascript'); - document.getElementsByTagName('head')[0].appendChild(s); + var s = document.createElement( 'script' ); + s.setAttribute( 'src', url ); + s.setAttribute( 'type', 'text/javascript' ); + document.getElementsByTagName('head')[0].appendChild( s ); return s; } - -function importStylesheet(page) { - return importStylesheetURI(wgScript + '?action=raw&ctype=text/css&title=' + encodeURIComponent(page.replace(/ /g,'_'))); + +window.importStylesheet = function( page ) { + return importStylesheetURI( wgScript + '?action=raw&ctype=text/css&title=' + encodeURIComponent( page.replace(/ /g,'_') ) ); } - -function importStylesheetURI(url,media) { - var l = document.createElement('link'); + +window.importStylesheetURI = function( url, media ) { + var l = document.createElement( 'link' ); l.type = 'text/css'; l.rel = 'stylesheet'; l.href = url; - if(media) l.media = media - document.getElementsByTagName('head')[0].appendChild(l); + if( media ) { + l.media = media; + } + document.getElementsByTagName('head')[0].appendChild( l ); return l; } - -function appendCSS(text) { - var s = document.createElement('style'); + +window.appendCSS = function( text ) { + var s = document.createElement( 'style' ); s.type = 'text/css'; s.rel = 'stylesheet'; - if (s.styleSheet) s.styleSheet.cssText = text //IE - else s.appendChild(document.createTextNode(text + '')) //Safari sometimes borks on null - document.getElementsByTagName('head')[0].appendChild(s); + if ( s.styleSheet ) { + s.styleSheet.cssText = text; // IE + } else { + s.appendChild( document.createTextNode( text + '' ) ); // Safari sometimes borks on null + } + document.getElementsByTagName('head')[0].appendChild( s ); return s; } -// special stylesheet links -if (typeof stylepath != 'undefined' && typeof skin != 'undefined') { - if (is_opera_preseven) { - importStylesheetURI(stylepath+'/'+skin+'/Opera6Fixes.css'); - } else if (is_opera_seven && !is_opera_95) { - importStylesheetURI(stylepath+'/'+skin+'/Opera7Fixes.css'); - } else if (is_opera_95) { - importStylesheetURI(stylepath+'/'+skin+'/Opera9Fixes.css'); - } else if (is_khtml) { - importStylesheetURI(stylepath+'/'+skin+'/KHTMLFixes.css'); - } else if (is_ff2_) { - importStylesheetURI(stylepath+'/'+skin+'/FF2Fixes.css'); +// Special stylesheet links for Monobook only (see bug 14717) +if ( typeof stylepath != 'undefined' && skin == 'monobook' ) { + if ( opera6_bugs ) { + importStylesheetURI( stylepath + '/' + skin + '/Opera6Fixes.css' ); + } else if ( opera7_bugs ) { + importStylesheetURI( stylepath + '/' + skin + '/Opera7Fixes.css' ); + } else if ( opera95_bugs ) { + importStylesheetURI( stylepath + '/' + skin + '/Opera9Fixes.css' ); + } else if ( ff2_bugs ) { + importStylesheetURI( stylepath + '/' + skin + '/FF2Fixes.css' ); } } -if (wgBreakFrames) { + +if ( 'wgBreakFrames' in window && window.wgBreakFrames ) { // Un-trap us from framesets - if (window.top != window) { + if ( window.top != window ) { window.top.location = window.location; } } -function showTocToggle() { - if (document.createTextNode) { +window.showTocToggle = function() { + if ( document.createTextNode ) { // Uses DOM calls to avoid document.write + XHTML issues - var linkHolder = document.getElementById('toctitle'); - var existingLink = document.getElementById('togglelink'); - if (!linkHolder || existingLink) { + var linkHolder = document.getElementById( 'toctitle' ); + var existingLink = document.getElementById( 'togglelink' ); + if ( !linkHolder || existingLink ) { // Don't add the toggle link twice return; } - var outerSpan = document.createElement('span'); + var outerSpan = document.createElement( 'span' ); outerSpan.className = 'toctoggle'; - var toggleLink = document.createElement('a'); + var toggleLink = document.createElement( 'a' ); toggleLink.id = 'togglelink'; toggleLink.className = 'internal'; - toggleLink.href = 'javascript:toggleToc()'; - toggleLink.appendChild(document.createTextNode(tocHideText)); + toggleLink.href = '#'; + addClickHandler( toggleLink, function( evt ) { toggleToc(); return killEvt( evt ); } ); + + toggleLink.appendChild( document.createTextNode( mediaWiki.msg.get( 'hidetoc' ) ) ); - outerSpan.appendChild(document.createTextNode('[')); - outerSpan.appendChild(toggleLink); - outerSpan.appendChild(document.createTextNode(']')); + outerSpan.appendChild( document.createTextNode( '[' ) ); + outerSpan.appendChild( toggleLink ); + outerSpan.appendChild( document.createTextNode( ']' ) ); - linkHolder.appendChild(document.createTextNode(' ')); - linkHolder.appendChild(outerSpan); + linkHolder.appendChild( document.createTextNode( ' ' ) ); + linkHolder.appendChild( outerSpan ); - var cookiePos = document.cookie.indexOf("hidetoc="); - if (cookiePos > -1 && document.cookie.charAt(cookiePos + 8) == 1) { + var cookiePos = document.cookie.indexOf( "hidetoc=" ); + if ( cookiePos > -1 && document.cookie.charAt( cookiePos + 8 ) == 1 ) { toggleToc(); } } } -function changeText(el, newText) { +window.changeText = function( el, newText ) { // Safari work around - if (el.innerText) { + if ( el.innerText ) { el.innerText = newText; - } else if (el.firstChild && el.firstChild.nodeValue) { + } else if ( el.firstChild && el.firstChild.nodeValue ) { el.firstChild.nodeValue = newText; } } -function toggleToc() { +window.killEvt = function( evt ) { + evt = evt || window.event || window.Event; // W3C, IE, Netscape + if ( typeof ( evt.preventDefault ) != 'undefined' ) { + evt.preventDefault(); // Don't follow the link + evt.stopPropagation(); + } else { + evt.cancelBubble = true; // IE + } + return false; // Don't follow the link (IE) +} + +window.toggleToc = function() { + var tocmain = document.getElementById( 'toc' ); var toc = document.getElementById('toc').getElementsByTagName('ul')[0]; - var toggleLink = document.getElementById('togglelink'); + var toggleLink = document.getElementById( 'togglelink' ); - if (toc && toggleLink && toc.style.display == 'none') { - changeText(toggleLink, tocHideText); + if ( toc && toggleLink && toc.style.display == 'none' ) { + changeText( toggleLink, mediaWiki.msg.get( 'hidetoc' ) ); toc.style.display = 'block'; document.cookie = "hidetoc=0"; + tocmain.className = 'toc'; } else { - changeText(toggleLink, tocShowText); + changeText( toggleLink, mediaWiki.msg.get( 'showtoc' ) ); toc.style.display = 'none'; document.cookie = "hidetoc=1"; + tocmain.className = 'toc tochidden'; } + return false; } -var mwEditButtons = []; -var mwCustomEditButtons = []; // eg to add in MediaWiki:Common.js +window.mwEditButtons = []; +window.mwCustomEditButtons = []; // eg to add in MediaWiki:Common.js -function escapeQuotes(text) { - var re = new RegExp("'","g"); - text = text.replace(re,"\\'"); - re = new RegExp("\\n","g"); - text = text.replace(re,"\\n"); - return escapeQuotesHTML(text); +window.escapeQuotes = function( text ) { + var re = new RegExp( "'", "g" ); + text = text.replace( re, "\\'" ); + re = new RegExp( "\\n", "g" ); + text = text.replace( re, "\\n" ); + return escapeQuotesHTML( text ); } -function escapeQuotesHTML(text) { - var re = new RegExp('&',"g"); - text = text.replace(re,"&"); - re = new RegExp('"',"g"); - text = text.replace(re,"""); - re = new RegExp('<',"g"); - text = text.replace(re,"<"); - re = new RegExp('>',"g"); - text = text.replace(re,">"); +window.escapeQuotesHTML = function( text ) { + var re = new RegExp( '&', "g" ); + text = text.replace( re, "&" ); + re = new RegExp( '"', "g" ); + text = text.replace( re, """ ); + re = new RegExp( '<', "g" ); + text = text.replace( re, "<" ); + re = new RegExp( '>', "g" ); + text = text.replace( re, ">" ); return text; } - /** * Set the accesskey prefix based on browser detection. */ -var tooltipAccessKeyPrefix = 'alt-'; -if (is_opera) { +window.tooltipAccessKeyPrefix = 'alt-'; +if ( is_opera ) { tooltipAccessKeyPrefix = 'shift-esc-'; -} else if (!is_safari_win && is_safari && webkit_version > 526) { +} else if ( is_chrome ) { + tooltipAccessKeyPrefix = is_chrome_mac ? 'ctrl-option-' : 'alt-'; +} else if ( !is_safari_win && is_safari && webkit_version > 526 ) { tooltipAccessKeyPrefix = 'ctrl-alt-'; -} else if (!is_safari_win && (is_safari +} else if ( !is_safari_win && ( is_safari || clientPC.indexOf('mac') != -1 - || clientPC.indexOf('konqueror') != -1 )) { + || clientPC.indexOf('konqueror') != -1 ) ) { tooltipAccessKeyPrefix = 'ctrl-'; -} else if (is_ff2) { +} else if ( is_ff2 ) { tooltipAccessKeyPrefix = 'alt-shift-'; } -var tooltipAccessKeyRegexp = /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/; +window.tooltipAccessKeyRegexp = /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/; /** * Add the appropriate prefix to the accesskey shown in the tooltip. @@ -222,25 +261,34 @@ var tooltipAccessKeyRegexp = /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/; * * @param Array nodeList -- list of elements to update */ -function updateTooltipAccessKeys( nodeList ) { +window.updateTooltipAccessKeys = function( nodeList ) { if ( !nodeList ) { - // skins without a "column-one" element don't seem to have links with accesskeys either - var columnOne = document.getElementById("column-one"); - if ( columnOne ) - updateTooltipAccessKeys( columnOne.getElementsByTagName("a") ); + // Rather than scan all links on the whole page, we can just scan these + // containers which contain the relevant links. This is really just an + // optimization technique. + var linkContainers = [ + 'column-one', // Monobook and Modern + 'mw-head', 'mw-panel', 'p-logo' // Vector + ]; + for ( var i in linkContainers ) { + var linkContainer = document.getElementById( linkContainers[i] ); + if ( linkContainer ) { + updateTooltipAccessKeys( linkContainer.getElementsByTagName( 'a' ) ); + } + } // these are rare enough that no such optimization is needed - updateTooltipAccessKeys( document.getElementsByTagName("input") ); - updateTooltipAccessKeys( document.getElementsByTagName("label") ); + updateTooltipAccessKeys( document.getElementsByTagName( 'input' ) ); + updateTooltipAccessKeys( document.getElementsByTagName( 'label' ) ); return; } for ( var i = 0; i < nodeList.length; i++ ) { var element = nodeList[i]; - var tip = element.getAttribute("title"); - if ( tip && tooltipAccessKeyRegexp.exec(tip) ) { + var tip = element.getAttribute( 'title' ); + if ( tip && tooltipAccessKeyRegexp.exec( tip ) ) { tip = tip.replace(tooltipAccessKeyRegexp, - "["+tooltipAccessKeyPrefix+"$5]"); - element.setAttribute("title", tip ); + '[' + tooltipAccessKeyPrefix + "$5]"); + element.setAttribute( 'title', tip ); } } } @@ -273,54 +321,98 @@ function updateTooltipAccessKeys( nodeList ) { * * @return Node -- the DOM node of the new item (an LI element) or null */ -function addPortletLink(portlet, href, text, id, tooltip, accesskey, nextnode) { - var node = document.getElementById(portlet); - if ( !node ) return null; - node = node.getElementsByTagName( "ul" )[0]; - if ( !node ) return null; +window.addPortletLink = function( portlet, href, text, id, tooltip, accesskey, nextnode ) { + var root = document.getElementById( portlet ); + if ( !root ) { + return null; + } + var uls = root.getElementsByTagName( 'ul' ); + var node; + if ( uls.length > 0 ) { + node = uls[0]; + } else { + node = document.createElement( 'ul' ); + var lastElementChild = null; + for ( var i = 0; i < root.childNodes.length; ++i ) { /* get root.lastElementChild */ + if ( root.childNodes[i].nodeType == 1 ) { + lastElementChild = root.childNodes[i]; + } + } + if ( lastElementChild && lastElementChild.nodeName.match( /div/i ) ) { + /* Insert into the menu divs */ + lastElementChild.appendChild( node ); + } else { + root.appendChild( node ); + } + } + if ( !node ) { + return null; + } + + // unhide portlet if it was hidden before + root.className = root.className.replace( /(^| )emptyPortlet( |$)/, "$2" ); - var link = document.createElement( "a" ); + var link = document.createElement( 'a' ); link.appendChild( document.createTextNode( text ) ); link.href = href; - var item = document.createElement( "li" ); - item.appendChild( link ); - if ( id ) item.id = id; + // Wrap in a span - make it work with vector tabs and has no effect on any other portlets + var span = document.createElement( 'span' ); + span.appendChild( link ); + + var item = document.createElement( 'li' ); + item.appendChild( span ); + if ( id ) { + item.id = id; + } if ( accesskey ) { - link.setAttribute( "accesskey", accesskey ); - tooltip += " ["+accesskey+"]"; + link.setAttribute( 'accesskey', accesskey ); + tooltip += ' [' + accesskey + ']'; } if ( tooltip ) { - link.setAttribute( "title", tooltip ); + link.setAttribute( 'title', tooltip ); } if ( accesskey && tooltip ) { updateTooltipAccessKeys( new Array( link ) ); } - if ( nextnode && nextnode.parentNode == node ) + if ( nextnode && nextnode.parentNode == node ) { node.insertBefore( item, nextnode ); - else + } else { node.appendChild( item ); // IE compatibility (?) + } return item; } -function getInnerText(el) { - if (typeof el == "string") return el; - if (typeof el == "undefined") { return el }; - if (el.textContent) return el.textContent; // not needed but it is faster - if (el.innerText) return el.innerText; // IE doesn't have textContent - var str = ""; +window.getInnerText = function( el ) { + if ( el.getAttribute( 'data-sort-value' ) !== null ) { + return el.getAttribute( 'data-sort-value' ); + } + + if ( typeof el == 'string' ) { + return el; + } + if ( typeof el == 'undefined' ) { + return el; + } + if ( el.textContent ) { + return el.textContent; // not needed but it is faster + } + if ( el.innerText ) { + return el.innerText; // IE doesn't have textContent + } + var str = ''; var cs = el.childNodes; var l = cs.length; - for (var i = 0; i < l; i++) { - switch (cs[i].nodeType) { - case 1: //ELEMENT_NODE - str += ts_getInnerText(cs[i]); + for ( var i = 0; i < l; i++ ) { + switch ( cs[i].nodeType ) { + case 1: // ELEMENT_NODE + str += ts_getInnerText( cs[i] ); break; - case 3: //TEXT_NODE + case 3: // TEXT_NODE str += cs[i].nodeValue; break; } @@ -328,101 +420,51 @@ function getInnerText(el) { return str; } - -/** - * Set up accesskeys/tooltips from the deprecated ta array. If doId - * is specified, only set up for that id. Note that this function is - * deprecated and will not be supported indefinitely -- use - * updateTooltipAccessKey() instead. - * - * @param mixed doId string or null - */ -function akeytt( doId ) { - // A lot of user scripts (and some of the code below) break if - // ta isn't defined, so we make sure it is. Explictly using - // window.ta avoids a "ta is not defined" error. - if (!window.ta) window.ta = new Array; - - // Make a local, possibly restricted, copy to avoid clobbering - // the original. - var ta; - if ( doId ) { - ta = [doId]; - } else { - ta = window.ta; - } - - // Now deal with evil deprecated ta - var watchCheckboxExists = document.getElementById( 'wpWatchthis' ) ? true : false; - for (var id in ta) { - var n = document.getElementById(id); - if (n) { - var a = null; - var ak = ''; - // Are we putting accesskey in it - if (ta[id][0].length > 0) { - // Is this object a object? If not assume it's the next child. - - if (n.nodeName.toLowerCase() == "a") { - a = n; - } else { - a = n.childNodes[0]; - } - // Don't add an accesskey for the watch tab if the watch - // checkbox is also available. - if (a && ((id != 'ca-watch' && id != 'ca-unwatch') || !watchCheckboxExists)) { - a.accessKey = ta[id][0]; - ak = ' ['+tooltipAccessKeyPrefix+ta[id][0]+']'; - } - } else { - // We don't care what type the object is when assigning tooltip - a = n; - ak = ''; - } - - if (a) { - a.title = ta[id][1]+ak; - } - } - } +/* Dummy for deprecated function */ +window.ta = []; +window.akeytt = function( doId ) { } -var checkboxes; -var lastCheckbox; +window.checkboxes = undefined; +window.lastCheckbox = undefined; -function setupCheckboxShiftClick() { +window.setupCheckboxShiftClick = function() { checkboxes = []; lastCheckbox = null; - var inputs = document.getElementsByTagName('input'); - addCheckboxClickHandlers(inputs); + var inputs = document.getElementsByTagName( 'input' ); + addCheckboxClickHandlers( inputs ); } -function addCheckboxClickHandlers(inputs, start) { - if ( !start) start = 0; +window.addCheckboxClickHandlers = function( inputs, start ) { + if ( !start ) { + start = 0; + } var finish = start + 250; - if ( finish > inputs.length ) + if ( finish > inputs.length ) { finish = inputs.length; + } for ( var i = start; i < finish; i++ ) { var cb = inputs[i]; - if ( !cb.type || cb.type.toLowerCase() != 'checkbox' ) + if ( !cb.type || cb.type.toLowerCase() != 'checkbox' || ( ' ' + cb.className + ' ' ).indexOf( ' noshiftselect ' ) != -1 ) { continue; + } var end = checkboxes.length; checkboxes[end] = cb; cb.index = end; - cb.onclick = checkboxClickHandler; + addClickHandler( cb, checkboxClickHandler ); } if ( finish < inputs.length ) { - setTimeout( function () { - addCheckboxClickHandlers(inputs, finish); + setTimeout( function() { + addCheckboxClickHandlers( inputs, finish ); }, 200 ); } } -function checkboxClickHandler(e) { - if (typeof e == 'undefined') { +window.checkboxClickHandler = function( e ) { + if ( typeof e == 'undefined' ) { e = window.event; } if ( !e.shiftKey || lastCheckbox === null ) { @@ -438,30 +480,16 @@ function checkboxClickHandler(e) { start = lastCheckbox; finish = this.index - 1; } - for (var i = start; i <= finish; ++i ) { + for ( var i = start; i <= finish; ++i ) { checkboxes[i].checked = endState; - if( i > start && typeof checkboxes[i].onchange == 'function' ) + if( i > start && typeof checkboxes[i].onchange == 'function' ) { checkboxes[i].onchange(); // fire triggers + } } lastCheckbox = this.index; return true; } -function toggle_element_activation(ida,idb) { - if (!document.getElementById) { - return; - } - document.getElementById(ida).disabled=true; - document.getElementById(idb).disabled=false; -} - -function toggle_element_check(ida,idb) { - if (!document.getElementById) { - return; - } - document.getElementById(ida).checked=true; - document.getElementById(idb).checked=false; -} /* Written by Jonathan Snook, http://www.snook.ca/jonathan @@ -469,68 +497,76 @@ function toggle_element_check(ida,idb) { Author says "The credit comment is all it takes, no license. Go crazy with it!:-)" From http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/ */ -function getElementsByClassName(oElm, strTagName, oClassNames){ +window.getElementsByClassName = function( oElm, strTagName, oClassNames ) { var arrReturnElements = new Array(); - if ( typeof( oElm.getElementsByClassName ) == "function" ) { + if ( typeof( oElm.getElementsByClassName ) == 'function' ) { /* Use a native implementation where possible FF3, Saf3.2, Opera 9.5 */ var arrNativeReturn = oElm.getElementsByClassName( oClassNames ); - if ( strTagName == "*" ) + if ( strTagName == '*' ) { return arrNativeReturn; - for ( var h=0; h < arrNativeReturn.length; h++ ) { - if( arrNativeReturn[h].tagName.toLowerCase() == strTagName.toLowerCase() ) + } + for ( var h = 0; h < arrNativeReturn.length; h++ ) { + if( arrNativeReturn[h].tagName.toLowerCase() == strTagName.toLowerCase() ) { arrReturnElements[arrReturnElements.length] = arrNativeReturn[h]; + } } return arrReturnElements; } - var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName); + var arrElements = ( strTagName == '*' && oElm.all ) ? oElm.all : oElm.getElementsByTagName( strTagName ); var arrRegExpClassNames = new Array(); - if(typeof oClassNames == "object"){ - for(var i=0; i. + // There's no obvious way to detect this programmatically, so we use + // version-testing. If Firefox fixes the bug, they'll jump twice, but + // better twice than not at all, so make the fix hit future versions as + // well. + if ( is_gecko ) { + addOnloadHook(function() { + if ( window.location.hash == fragment ) { + window.location.hash = fragment; + } + }); + } } } @@ -545,45 +581,46 @@ function redirectToFragment(fragment) { * @todo support all accepted date formats (bug 8226) */ -var ts_image_path = stylepath+"/common/images/"; -var ts_image_up = "sort_up.gif"; -var ts_image_down = "sort_down.gif"; -var ts_image_none = "sort_none.gif"; -var ts_europeandate = wgContentLanguage != "en"; // The non-American-inclined can change to "true" -var ts_alternate_row_colors = false; -var ts_number_transform_table = null; -var ts_number_regex = null; +window.ts_image_path = stylepath + '/common/images/'; +window.ts_image_up = 'sort_up.gif'; +window.ts_image_down = 'sort_down.gif'; +window.ts_image_none = 'sort_none.gif'; +window.ts_europeandate = wgContentLanguage != 'en'; // The non-American-inclined can change to "true" +window.ts_alternate_row_colors = false; +window.ts_number_transform_table = null; +window.ts_number_regex = null; -function sortables_init() { +window.sortables_init = function() { var idnum = 0; // Find all tables with class sortable and make them sortable - var tables = getElementsByClassName(document, "table", "sortable"); - for (var ti = 0; ti < tables.length ; ti++) { - if (!tables[ti].id) { - tables[ti].setAttribute('id','sortable_table_id_'+idnum); + var tables = getElementsByClassName( document, 'table', 'sortable' ); + for ( var ti = 0; ti < tables.length ; ti++ ) { + if ( !tables[ti].id ) { + tables[ti].setAttribute( 'id', 'sortable_table_id_' + idnum ); ++idnum; } - ts_makeSortable(tables[ti]); + ts_makeSortable( tables[ti] ); } } -function ts_makeSortable(table) { +window.ts_makeSortable = function( table ) { var firstRow; - if (table.rows && table.rows.length > 0) { - if (table.tHead && table.tHead.rows.length > 0) { + if ( table.rows && table.rows.length > 0 ) { + if ( table.tHead && table.tHead.rows.length > 0 ) { firstRow = table.tHead.rows[table.tHead.rows.length-1]; } else { firstRow = table.rows[0]; } } - if (!firstRow) return; + if ( !firstRow ) { + return; + } // We have a first row: assume it's the header, and make its contents clickable links - for (var i = 0; i < firstRow.cells.length; i++) { + for ( var i = 0; i < firstRow.cells.length; i++ ) { var cell = firstRow.cells[i]; - if ((" "+cell.className+" ").indexOf(" unsortable ") == -1) { - cell.innerHTML += '  ' - + '' + '' + '↓'; } } - if (ts_alternate_row_colors) { - ts_alternate(table); + if ( ts_alternate_row_colors ) { + ts_alternate( table ); } } -function ts_getInnerText(el) { +window.ts_getInnerText = function( el ) { return getInnerText( el ); } -function ts_resortTable(lnk) { +window.ts_resortTable = function( lnk ) { // get the span var span = lnk.getElementsByTagName('span')[0]; @@ -610,141 +647,163 @@ function ts_resortTable(lnk) { var column = td.cellIndex; var table = tr.parentNode; - while (table && !(table.tagName && table.tagName.toLowerCase() == 'table')) + while ( table && !( table.tagName && table.tagName.toLowerCase() == 'table' ) ) { table = table.parentNode; - if (!table) return; + } + if ( !table ) { + return; + } - if (table.rows.length <= 1) return; + if ( table.rows.length <= 1 ) { + return; + } // Generate the number transform table if it's not done already - if (ts_number_transform_table == null) { + if ( ts_number_transform_table === null ) { ts_initTransformTable(); } // Work out a type for the column // Skip the first row if that's where the headings are - var rowStart = (table.tHead && table.tHead.rows.length > 0 ? 0 : 1); - - var itm = ""; - for (var i = rowStart; i < table.rows.length; i++) { - if (table.rows[i].cells.length > column) { + var rowStart = ( table.tHead && table.tHead.rows.length > 0 ? 0 : 1 ); + var bodyRows = 0; + if (rowStart == 0 && table.tBodies) { + for (var i=0; i < table.tBodies.length; i++ ) { + bodyRows += table.tBodies[i].rows.length; + } + if (bodyRows < table.rows.length) + rowStart = 1; + } + + var itm = ''; + for ( var i = rowStart; i < table.rows.length; i++ ) { + if ( table.rows[i].cells.length > column ) { itm = ts_getInnerText(table.rows[i].cells[column]); - itm = itm.replace(/^[\s\xa0]+/, "").replace(/[\s\xa0]+$/, ""); - if (itm != "") break; + itm = itm.replace(/^[\s\xa0]+/, '').replace(/[\s\xa0]+$/, ''); + if ( itm != '' ) { + break; + } } } // TODO: bug 8226, localised date formats var sortfn = ts_sort_generic; var preprocessor = ts_toLowerCase; - if (/^\d\d[\/. -][a-zA-Z]{3}[\/. -]\d\d\d\d$/.test(itm)) { + if ( /^\d\d[\/. -][a-zA-Z]{3}[\/. -]\d\d\d\d$/.test( itm ) ) { preprocessor = ts_dateToSortKey; - } else if (/^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/.test(itm)) { + } else if ( /^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/.test( itm ) ) { preprocessor = ts_dateToSortKey; - } else if (/^\d\d[\/.-]\d\d[\/.-]\d\d$/.test(itm)) { + } else if ( /^\d\d[\/.-]\d\d[\/.-]\d\d$/.test( itm ) ) { preprocessor = ts_dateToSortKey; - // pound dollar euro yen currency cents - } else if (/(^[\u00a3$\u20ac\u00a4\u00a5]|\u00a2$)/.test(itm)) { + // (minus sign)([pound dollar euro yen currency]|cents) + } else if ( /(^([-\u2212] *)?[\u00a3$\u20ac\u00a4\u00a5]|\u00a2$)/.test( itm ) ) { preprocessor = ts_currencyToSortKey; - } else if (ts_number_regex.test(itm)) { + } else if ( ts_number_regex.test( itm ) ) { preprocessor = ts_parseFloat; } - var reverse = (span.getAttribute("sortdir") == 'down'); + var reverse = ( span.getAttribute( 'sortdir' ) == 'down' ); var newRows = new Array(); var staticRows = new Array(); - for (var j = rowStart; j < table.rows.length; j++) { + for ( var j = rowStart; j < table.rows.length; j++ ) { var row = table.rows[j]; - if((" "+row.className+" ").indexOf(" unsortable ") < 0) { - var keyText = ts_getInnerText(row.cells[column]); - var oldIndex = (reverse ? -j : j); - var preprocessed = preprocessor( keyText ); + if( (' ' + row.className + ' ').indexOf(' unsortable ') < 0 ) { + var keyText = ts_getInnerText( row.cells[column] ); + if( keyText === undefined ) { + keyText = ''; + } + var oldIndex = ( reverse ? -j : j ); + var preprocessed = preprocessor( keyText.replace(/^[\s\xa0]+/, '').replace(/[\s\xa0]+$/, '') ); - newRows[newRows.length] = new Array(row, preprocessed, oldIndex); - } else staticRows[staticRows.length] = new Array(row, false, j-rowStart); + newRows[newRows.length] = new Array( row, preprocessed, oldIndex ); + } else { + staticRows[staticRows.length] = new Array( row, false, j-rowStart ); + } } - newRows.sort(sortfn); + newRows.sort( sortfn ); var arrowHTML; - if (reverse) { - arrowHTML = '↓'; + if ( reverse ) { + arrowHTML = '↓'; newRows.reverse(); - span.setAttribute('sortdir','up'); + span.setAttribute( 'sortdir', 'up' ); } else { - arrowHTML = '↑'; - span.setAttribute('sortdir','down'); + arrowHTML = '↑'; + span.setAttribute( 'sortdir', 'down' ); } - for (var i = 0; i < staticRows.length; i++) { + for ( var i = 0; i < staticRows.length; i++ ) { var row = staticRows[i]; - newRows.splice(row[2], 0, row); + newRows.splice( row[2], 0, row ); } // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones // don't do sortbottom rows - for (var i = 0; i < newRows.length; i++) { - if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") == -1) - table.tBodies[0].appendChild(newRows[i][0]); + for ( var i = 0; i < newRows.length; i++ ) { + if ( ( ' ' + newRows[i][0].className + ' ').indexOf(' sortbottom ') == -1 ) { + table.tBodies[0].appendChild( newRows[i][0] ); + } } // do sortbottom rows only - for (var i = 0; i < newRows.length; i++) { - if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") != -1) - table.tBodies[0].appendChild(newRows[i][0]); + for ( var i = 0; i < newRows.length; i++ ) { + if ( ( ' ' + newRows[i][0].className + ' ').indexOf(' sortbottom ') != -1 ) { + table.tBodies[0].appendChild( newRows[i][0] ); + } } // Delete any other arrows there may be showing - var spans = getElementsByClassName(tr, "span", "sortarrow"); - for (var i = 0; i < spans.length; i++) { - spans[i].innerHTML = '↓'; + var spans = getElementsByClassName( tr, 'span', 'sortarrow' ); + for ( var i = 0; i < spans.length; i++ ) { + spans[i].innerHTML = '↓'; } span.innerHTML = arrowHTML; - if (ts_alternate_row_colors) { - ts_alternate(table); + if ( ts_alternate_row_colors ) { + ts_alternate( table ); } } -function ts_initTransformTable() { - if ( typeof wgSeparatorTransformTable == "undefined" +window.ts_initTransformTable = function() { + if ( typeof wgSeparatorTransformTable == 'undefined' || ( wgSeparatorTransformTable[0] == '' && wgDigitTransformTable[2] == '' ) ) { - digitClass = "[0-9,.]"; + var digitClass = "[0-9,.]"; ts_number_transform_table = false; } else { ts_number_transform_table = {}; // Unpack the transform table // Separators - ascii = wgSeparatorTransformTable[0].split("\t"); - localised = wgSeparatorTransformTable[1].split("\t"); - for ( var i = 0; i < ascii.length; i++ ) { + var ascii = wgSeparatorTransformTable[0].split("\t"); + var localised = wgSeparatorTransformTable[1].split("\t"); + for ( var i = 0; i < ascii.length; i++ ) { ts_number_transform_table[localised[i]] = ascii[i]; } // Digits ascii = wgDigitTransformTable[0].split("\t"); localised = wgDigitTransformTable[1].split("\t"); - for ( var i = 0; i < ascii.length; i++ ) { + for ( var i = 0; i < ascii.length; i++ ) { ts_number_transform_table[localised[i]] = ascii[i]; } // Construct regex for number identification - digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '\\.']; - maxDigitLength = 1; + var digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '\\.']; + var maxDigitLength = 1; for ( var digit in ts_number_transform_table ) { // Escape regex metacharacters - digits.push( + digits.push( digit.replace( /[\\\\$\*\+\?\.\(\)\|\{\}\[\]\-]/, function( s ) { return '\\' + s; } ) ); - if (digit.length > maxDigitLength) { + if ( digit.length > maxDigitLength ) { maxDigitLength = digit.length; } } if ( maxDigitLength > 1 ) { - digitClass = '[' + digits.join( '', digits ) + ']'; + var digitClass = '[' + digits.join( '', digits ) + ']'; } else { - digitClass = '(' + digits.join( '|', digits ) + ')'; + var digitClass = '(' + digits.join( '|', digits ) + ')'; } } @@ -752,68 +811,92 @@ function ts_initTransformTable() { // if percents and regular numbers aren't being mixed. ts_number_regex = new RegExp( "^(" + - "[+-]?[0-9][0-9,]*(\\.[0-9,]*)?(E[+-]?[0-9][0-9,]*)?" + // Fortran-style scientific + "[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?" + // Fortran-style scientific "|" + - "[+-]?" + digitClass + "+%?" + // Generic localised + "[-+\u2212]?" + digitClass + "+%?" + // Generic localised ")$", "i" ); } -function ts_toLowerCase( s ) { +window.ts_toLowerCase = function( s ) { return s.toLowerCase(); } -function ts_dateToSortKey(date) { +window.ts_dateToSortKey = function( date ) { // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX - if (date.length == 11) { - switch (date.substr(3,3).toLowerCase()) { - case "jan": var month = "01"; break; - case "feb": var month = "02"; break; - case "mar": var month = "03"; break; - case "apr": var month = "04"; break; - case "may": var month = "05"; break; - case "jun": var month = "06"; break; - case "jul": var month = "07"; break; - case "aug": var month = "08"; break; - case "sep": var month = "09"; break; - case "oct": var month = "10"; break; - case "nov": var month = "11"; break; - case "dec": var month = "12"; break; - // default: var month = "00"; - } - return date.substr(7,4)+month+date.substr(0,2); - } else if (date.length == 10) { - if (ts_europeandate == false) { - return date.substr(6,4)+date.substr(0,2)+date.substr(3,2); + if ( date.length == 11 ) { + switch ( date.substr( 3, 3 ).toLowerCase() ) { + case 'jan': + var month = '01'; + break; + case 'feb': + var month = '02'; + break; + case 'mar': + var month = '03'; + break; + case 'apr': + var month = '04'; + break; + case 'may': + var month = '05'; + break; + case 'jun': + var month = '06'; + break; + case 'jul': + var month = '07'; + break; + case 'aug': + var month = '08'; + break; + case 'sep': + var month = '09'; + break; + case 'oct': + var month = '10'; + break; + case 'nov': + var month = '11'; + break; + case 'dec': + var month = '12'; + break; + // default: var month = '00'; + } + return date.substr( 7, 4 ) + month + date.substr( 0, 2 ); + } else if ( date.length == 10 ) { + if ( ts_europeandate == false ) { + return date.substr( 6, 4 ) + date.substr( 0, 2 ) + date.substr( 3, 2 ); } else { - return date.substr(6,4)+date.substr(3,2)+date.substr(0,2); + return date.substr( 6, 4 ) + date.substr( 3, 2 ) + date.substr( 0, 2 ); } - } else if (date.length == 8) { - yr = date.substr(6,2); - if (parseInt(yr) < 50) { - yr = '20'+yr; - } else { - yr = '19'+yr; + } else if ( date.length == 8 ) { + var yr = date.substr( 6, 2 ); + if ( parseInt( yr ) < 50 ) { + yr = '20' + yr; + } else { + yr = '19' + yr; } - if (ts_europeandate == true) { - return yr+date.substr(3,2)+date.substr(0,2); + if ( ts_europeandate == true ) { + return yr + date.substr( 3, 2 ) + date.substr( 0, 2 ); } else { - return yr+date.substr(0,2)+date.substr(3,2); + return yr + date.substr( 0, 2 ) + date.substr( 3, 2 ); } } - return "00000000"; + return '00000000'; } -function ts_parseFloat( s ) { +window.ts_parseFloat = function( s ) { if ( !s ) { return 0; } - if (ts_number_transform_table != false) { + if ( ts_number_transform_table != false ) { var newNum = '', c; - + for ( var p = 0; p < s.length; p++ ) { c = s.charAt( p ); - if (c in ts_number_transform_table) { + if ( c in ts_number_transform_table ) { newNum += ts_number_transform_table[c]; } else { newNum += c; @@ -821,37 +904,37 @@ function ts_parseFloat( s ) { } s = newNum; } - - num = parseFloat(s.replace(/,/g, "")); - return (isNaN(num) ? 0 : num); + var num = parseFloat( s.replace(/[, ]/g, '').replace("\u2212", '-') ); + return ( isNaN( num ) ? -Infinity : num ); } -function ts_currencyToSortKey( s ) { - return ts_parseFloat(s.replace(/[^0-9.,]/g,'')); +window.ts_currencyToSortKey = function( s ) { + return ts_parseFloat(s.replace(/[^-\u22120-9.,]/g,'')); } -function ts_sort_generic(a, b) { +window.ts_sort_generic = function( a, b ) { return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : a[2] - b[2]; } -function ts_alternate(table) { +window.ts_alternate = function( table ) { // Take object table and get all it's tbodies. - var tableBodies = table.getElementsByTagName("tbody"); + var tableBodies = table.getElementsByTagName( 'tbody' ); // Loop through these tbodies - for (var i = 0; i < tableBodies.length; i++) { + for ( var i = 0; i < tableBodies.length; i++ ) { // Take the tbody, and get all it's rows - var tableRows = tableBodies[i].getElementsByTagName("tr"); + var tableRows = tableBodies[i].getElementsByTagName( 'tr' ); // Loop through these rows // Start at 1 because we want to leave the heading row untouched - for (var j = 0; j < tableRows.length; j++) { + for ( var j = 0; j < tableRows.length; j++ ) { // Check if j is even, and apply classes for both possible results - var oldClasses = tableRows[j].className.split(" "); - var newClassName = ""; - for (var k = 0; k < oldClasses.length; k++) { - if (oldClasses[k] != "" && oldClasses[k] != "even" && oldClasses[k] != "odd") - newClassName += oldClasses[k] + " "; + var oldClasses = tableRows[j].className.split(' '); + var newClassName = ''; + for ( var k = 0; k < oldClasses.length; k++ ) { + if ( oldClasses[k] != '' && oldClasses[k] != 'even' && oldClasses[k] != 'odd' ) { + newClassName += oldClasses[k] + ' '; + } } - tableRows[j].className = newClassName + (j % 2 == 0 ? "even" : "odd"); + tableRows[j].className = newClassName + ( j % 2 == 0 ? 'even' : 'odd' ); } } } @@ -859,8 +942,8 @@ function ts_alternate(table) { /* * End of table sorting code */ - - + + /** * Add a cute little box at the top of the screen to inform the user of * something, replacing any preexisting message. @@ -870,7 +953,7 @@ function ts_alternate(table) { * call to allow CSS/JS to hide different boxes. null = no class used. * @return Boolean True on success, false on failure */ -function jsMsg( message, className ) { +window.jsMsg = function( message, className ) { if ( !document.getElementById ) { return false; } @@ -887,7 +970,7 @@ function jsMsg( message, className ) { messageDiv, document.getElementById( 'content' ).firstChild ); - } else if ( document.getElementById('content') + } else if ( document.getElementById( 'content' ) && document.getElementById( 'article' ) ) { // Non-Monobook but still recognizable (old-style) document.getElementById( 'article').insertBefore( @@ -902,15 +985,15 @@ function jsMsg( message, className ) { messageDiv.setAttribute( 'id', 'mw-js-message' ); messageDiv.style.display = 'block'; if( className ) { - messageDiv.setAttribute( 'class', 'mw-js-message-'+className ); - } - - if (typeof message === 'object') { - while (messageDiv.hasChildNodes()) // Remove old content - messageDiv.removeChild(messageDiv.firstChild); - messageDiv.appendChild (message); // Append new content + messageDiv.setAttribute( 'class', 'mw-js-message-' + className ); } - else { + + if ( typeof message === 'object' ) { + while ( messageDiv.hasChildNodes() ) { // Remove old content + messageDiv.removeChild( messageDiv.firstChild ); + } + messageDiv.appendChild( message ); // Append new content + } else { messageDiv.innerHTML = message; } return true; @@ -922,11 +1005,11 @@ function jsMsg( message, className ) { * @param element Element to inject after * @param id Identifier string (for use with removeSpinner(), below) */ -function injectSpinner( element, id ) { - var spinner = document.createElement( "img" ); - spinner.id = "mw-spinner-" + id; - spinner.src = stylepath + "/common/images/spinner.gif"; - spinner.alt = spinner.title = "..."; +window.injectSpinner = function( element, id ) { + var spinner = document.createElement( 'img' ); + spinner.id = 'mw-spinner-' + id; + spinner.src = stylepath + '/common/images/spinner.gif'; + spinner.alt = spinner.title = '...'; if( element.nextSibling ) { element.parentNode.insertBefore( spinner, element.nextSibling ); } else { @@ -939,16 +1022,16 @@ function injectSpinner( element, id ) { * * @param id Identifier string */ -function removeSpinner( id ) { - var spinner = document.getElementById( "mw-spinner-" + id ); +window.removeSpinner = function( id ) { + var spinner = document.getElementById( 'mw-spinner-' + id ); if( spinner ) { spinner.parentNode.removeChild( spinner ); } } -function runOnloadHook() { +window.runOnloadHook = function() { // don't run anything below this for non-dom browsers - if (doneOnloadHook || !(document.getElementById && document.getElementsByTagName)) { + if ( doneOnloadHook || !( document.getElementById && document.getElementsByTagName ) ) { return; } @@ -957,12 +1040,11 @@ function runOnloadHook() { doneOnloadHook = true; updateTooltipAccessKeys( null ); - akeytt( null ); setupCheckboxShiftClick(); sortables_init(); // Run any added-on functions - for (var i = 0; i < onloadFuncts.length; i++) { + for ( var i = 0; i < onloadFuncts.length; i++ ) { onloadFuncts[i](); } } @@ -974,21 +1056,25 @@ function runOnloadHook() { * @param String attach Event to attach to * @param callable handler Event handler callback */ -function addHandler( element, attach, handler ) { - if( window.addEventListener ) { +window.addHandler = function( element, attach, handler ) { + if( element.addEventListener ) { element.addEventListener( attach, handler, false ); - } else if( window.attachEvent ) { + } else if( element.attachEvent ) { element.attachEvent( 'on' + attach, handler ); } } +window.hookEvent = function( hookName, hookFunct ) { + addHandler( window, hookName, hookFunct ); +} + /** * Add a click event handler to an element * * @param Element element Element to add handler to * @param callable handler Event handler callback */ -function addClickHandler( element, handler ) { +window.addClickHandler = function( element, handler ) { addHandler( element, 'click', handler ); } @@ -999,13 +1085,19 @@ function addClickHandler( element, handler ) { * @param String remove Event to remove * @param callable handler Event handler callback to remove */ -function removeHandler( element, remove, handler ) { +window.removeHandler = function( element, remove, handler ) { if( window.removeEventListener ) { element.removeEventListener( remove, handler, false ); } else if( window.detachEvent ) { element.detachEvent( 'on' + remove, handler ); } } -//note: all skins should call runOnloadHook() at the end of html output, +// note: all skins should call runOnloadHook() at the end of html output, // so the below should be redundant. It's there just in case. -hookEvent("load", runOnloadHook); +hookEvent( 'load', runOnloadHook ); + +if ( ie6_bugs ) { + importScriptURI( stylepath + '/common/IEFixes.js' ); +} + +showTocToggle();