diff --git a/themes/lite/wz_tooltip.js b/themes/lite/wz_tooltip.js index 01f55f2d..2ffa50fe 100644 --- a/themes/lite/wz_tooltip.js +++ b/themes/lite/wz_tooltip.js @@ -1,7 +1,14 @@ +/*jshint bitwise:false, curly:true, eqeqeq:true, evil:true, forin:false, noarg:true, noempty:true, nonew:true, undef:false, strict:false, browser:true */ +/* + This is rather old JS code that is quite problematic (use of global namespace) and + is also likely full of bugs. I would really like to remove this from the Shimmie + imageboard if possible. + - jgen +*/ /* This notice must be untouched at all times. Copyright (c) 2002-2008 Walter Zorn. All rights reserved. -wz_tooltip.js v. 5.31 +wz_tooltip.js v. 5.31 The latest version is available at http://www.walterzorn.com @@ -40,13 +47,13 @@ For more details on the GNU Lesser General Public License, see http://www.gnu.org/copyleft/lesser.html */ -var config = new Object(); +var config = {}; // new Object(); //=================== GLOBAL TOOLTIP CONFIGURATION =========================// -var tt_Debug = true // false or true - recommended: false once you release your page to the public -var tt_Enabled = true // Allows to (temporarily) suppress tooltips, e.g. by providing the user with a button that sets this global variable to false -var TagsToTip = true // false or true - if true, HTML elements to be converted to tooltips via TagToTip() are automatically hidden; +var tt_Debug = true; // false or true - recommended: false once you release your page to the public +var tt_Enabled = true; // Allows to (temporarily) suppress tooltips, e.g. by providing the user with a button that sets this global variable to false +var TagsToTip = true; // false or true - if true, HTML elements to be converted to tooltips via TagToTip() are automatically hidden; // if false, you should hide those HTML elements yourself // For each of the following config variables there exists a command, which is @@ -55,52 +62,52 @@ var TagsToTip = true // false or true - if true, HTML elements to be converted // configuration. Order of commands is arbitrary. // Example: onmouseover="Tip('Tooltip text', LEFT, true, BGCOLOR, '#FF9900', FADEIN, 400)" -config. Above = false // false or true - tooltip above mousepointer -config. BgColor = '#E2E7FF' // Background colour (HTML colour value, in quotes) -config. BgImg = '' // Path to background image, none if empty string '' -config. BorderColor = '#003099' -config. BorderStyle = 'solid' // Any permitted CSS value, but I recommend 'solid', 'dotted' or 'dashed' -config. BorderWidth = 1 -config. CenterMouse = false // false or true - center the tip horizontally below (or above) the mousepointer -config. ClickClose = false // false or true - close tooltip if the user clicks somewhere -config. ClickSticky = false // false or true - make tooltip sticky if user left-clicks on the hovered element while the tooltip is active -config. CloseBtn = false // false or true - closebutton in titlebar -config. CloseBtnColors = ['#990000', '#FFFFFF', '#DD3333', '#FFFFFF'] // [Background, text, hovered background, hovered text] - use empty strings '' to inherit title colours -config. CloseBtnText = ' X ' // Close button text (may also be an image tag) -config. CopyContent = true // When converting a HTML element to a tooltip, copy only the element's content, rather than converting the element by its own -config. Delay = 400 // Time span in ms until tooltip shows up -config. Duration = 0 // Time span in ms after which the tooltip disappears; 0 for infinite duration, < 0 for delay in ms _after_ the onmouseout until the tooltip disappears -config. Exclusive = false // false or true - no other tooltip can appear until the current one has actively been closed -config. FadeIn = 100 // Fade-in duration in ms, e.g. 400; 0 for no animation -config. FadeOut = 100 -config. FadeInterval = 30 // Duration of each fade step in ms (recommended: 30) - shorter is smoother but causes more CPU-load -config. Fix = null // Fixated position, two modes. Mode 1: x- an y-coordinates in brackets, e.g. [210, 480]. Mode 2: Show tooltip at a position related to an HTML element: [ID of HTML element, x-offset, y-offset from HTML element], e.g. ['SomeID', 10, 30]. Value null (default) for no fixated positioning. -config. FollowMouse = true // false or true - tooltip follows the mouse -config. FontColor = '#000044' -config. FontFace = 'Verdana,Geneva,sans-serif' -config. FontSize = '8pt' // E.g. '9pt' or '12px' - unit is mandatory -config. FontWeight = 'normal' // 'normal' or 'bold'; -config. Height = 0 // Tooltip height; 0 for automatic adaption to tooltip content, < 0 (e.g. -100) for a maximum for automatic adaption -config. JumpHorz = false // false or true - jump horizontally to other side of mouse if tooltip would extend past clientarea boundary -config. JumpVert = true // false or true - jump vertically " -config. Left = false // false or true - tooltip on the left of the mouse -config. OffsetX = 14 // Horizontal offset of left-top corner from mousepointer -config. OffsetY = 8 // Vertical offset -config. Opacity = 100 // Integer between 0 and 100 - opacity of tooltip in percent -config. Padding = 3 // Spacing between border and content -config. Shadow = false // false or true -config. ShadowColor = '#C0C0C0' -config. ShadowWidth = 5 -config. Sticky = false // false or true - fixate tip, ie. don't follow the mouse and don't hide on mouseout -config. TextAlign = 'left' // 'left', 'right' or 'justify' -config. Title = '' // Default title text applied to all tips (no default title: empty string '') -config. TitleAlign = 'left' // 'left' or 'right' - text alignment inside the title bar -config. TitleBgColor = '' // If empty string '', BorderColor will be used -config. TitleFontColor = '#FFFFFF' // Color of title text - if '', BgColor (of tooltip body) will be used -config. TitleFontFace = '' // If '' use FontFace (boldified) -config. TitleFontSize = '' // If '' use FontSize -config. TitlePadding = 2 -config. Width = 0 // Tooltip width; 0 for automatic adaption to tooltip content; < -1 (e.g. -240) for a maximum width for that automatic adaption; +config. Above = false; // false or true - tooltip above mousepointer +config. BgColor = '#E2E7FF'; // Background colour (HTML colour value, in quotes) +config. BgImg = ''; // Path to background image, none if empty string '' +config. BorderColor = '#003099'; +config. BorderStyle = 'solid'; // Any permitted CSS value, but I recommend 'solid', 'dotted' or 'dashed' +config. BorderWidth = 1; +config. CenterMouse = false; // false or true - center the tip horizontally below (or above) the mousepointer +config. ClickClose = false; // false or true - close tooltip if the user clicks somewhere +config. ClickSticky = false; // false or true - make tooltip sticky if user left-clicks on the hovered element while the tooltip is active +config. CloseBtn = false; // false or true - closebutton in titlebar +config. CloseBtnColors = ['#990000', '#FFFFFF', '#DD3333', '#FFFFFF']; // [Background, text, hovered background, hovered text] - use empty strings '' to inherit title colours +config. CloseBtnText = ' X '; // Close button text (may also be an image tag) +config. CopyContent = true; // When converting a HTML element to a tooltip, copy only the element's content, rather than converting the element by its own +config. Delay = 400; // Time span in ms until tooltip shows up +config. Duration = 0; // Time span in ms after which the tooltip disappears; 0 for infinite duration, < 0 for delay in ms _after_ the onmouseout until the tooltip disappears +config. Exclusive = false; // false or true - no other tooltip can appear until the current one has actively been closed +config. FadeIn = 100; // Fade-in duration in ms, e.g. 400; 0 for no animation +config. FadeOut = 100; +config. FadeInterval = 30; // Duration of each fade step in ms (recommended: 30) - shorter is smoother but causes more CPU-load +config. Fix = null; // Fixated position, two modes. Mode 1: x- an y-coordinates in brackets, e.g. [210, 480]. Mode 2: Show tooltip at a position related to an HTML element: [ID of HTML element, x-offset, y-offset from HTML element], e.g. ['SomeID', 10, 30]. Value null (default) for no fixated positioning. +config. FollowMouse = true; // false or true - tooltip follows the mouse +config. FontColor = '#000044'; +config. FontFace = 'Verdana,Geneva,sans-serif'; +config. FontSize = '8pt'; // E.g. '9pt' or '12px' - unit is mandatory +config. FontWeight = 'normal'; // 'normal' or 'bold'; +config. Height = 0; // Tooltip height; 0 for automatic adaption to tooltip content, < 0 (e.g. -100) for a maximum for automatic adaption +config. JumpHorz = false; // false or true - jump horizontally to other side of mouse if tooltip would extend past clientarea boundary +config. JumpVert = true; // false or true - jump vertically " +config. Left = false; // false or true - tooltip on the left of the mouse +config. OffsetX = 14; // Horizontal offset of left-top corner from mousepointer +config. OffsetY = 8; // Vertical offset +config. Opacity = 100; // Integer between 0 and 100 - opacity of tooltip in percent +config. Padding = 3; // Spacing between border and content +config. Shadow = false; // false or true +config. ShadowColor = '#C0C0C0'; +config. ShadowWidth = 5; +config. Sticky = false; // false or true - fixate tip, ie. don't follow the mouse and don't hide on mouseout +config. TextAlign = 'left'; // 'left', 'right' or 'justify' +config. Title = ''; // Default title text applied to all tips (no default title: empty string '') +config. TitleAlign = 'left'; // 'left' or 'right' - text alignment inside the title bar +config. TitleBgColor = ''; // If empty string '', BorderColor will be used +config. TitleFontColor = '#FFFFFF'; // Color of title text - if '', BgColor (of tooltip body) will be used +config. TitleFontFace = ''; // If '' use FontFace (boldified) +config. TitleFontSize = ''; // If '' use FontSize +config. TitlePadding = 2; +config. Width = 0; // Tooltip width; 0 for automatic adaption to tooltip content; < -1 (e.g. -240) for a maximum width for that automatic adaption; // -1: tooltip width confined to the width required for the titlebar //======= END OF TOOLTIP CONFIG, DO NOT CHANGE ANYTHING BELOW ==============// @@ -115,25 +122,27 @@ function Tip() function TagToTip() { var t2t = tt_GetElt(arguments[0]); - if(t2t) + if(t2t) { tt_Tip(arguments, t2t); + } } function UnTip() { tt_OpReHref(); - if(tt_aV[DURATION] < 0 && (tt_iState & 0x2)) + if(tt_aV[DURATION] < 0 && (tt_iState & 0x2)) { tt_tDurt.Timer("tt_HideInit()", -tt_aV[DURATION], true); - else if(!(tt_aV[STICKY] && (tt_iState & 0x2))) + } else if(!(tt_aV[STICKY] && (tt_iState & 0x2))) { tt_HideInit(); + } } -//================== PUBLIC PLUGIN API =====================================// +//================== PUBLIC PLUGIN API =====================================// // Extension eventhandlers currently supported: // OnLoadConfig, OnCreateContentString, OnSubDivsCreated, OnShow, OnMoveBefore, // OnMoveAfter, OnHideInit, OnHide, OnKill var tt_aElt = new Array(10), // Container DIV, outer title & body DIVs, inner title & body TDs, closebutton SPAN, shadow DIVs, and IFRAME to cover windowed elements in IE -tt_aV = new Array(), // Caches and enumerates config data for currently active tooltip +tt_aV = [], // Caches and enumerates config data for currently active tooltip tt_sContent, // Inner tooltip text or HTML tt_t2t, tt_t2tDad, // Tag converted to tip, and its DOM parent element tt_musX, tt_musY, @@ -202,18 +211,21 @@ function tt_Hide() tt_tWaitMov.EndTimer(); tt_bWait = false; } - if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY]) + if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY]) { tt_RemEvtFnc(document, "mouseup", tt_OnLClick); + } tt_ExtCallFncs(0, "Kill"); // In case of a TagToTip tip, hide converted DOM node and // re-insert it into DOM - if(tt_t2t && !tt_aV[COPYCONTENT]) + if(tt_t2t && !tt_aV[COPYCONTENT]) { tt_UnEl2Tip(); + } tt_iState = 0; tt_over = null; tt_ResetMainDiv(); - if(tt_aElt[tt_aElt.length - 1]) + if(tt_aElt[tt_aElt.length - 1]) { tt_aElt[tt_aElt.length - 1].style.display = "none"; + } } } function tt_GetElt(id) @@ -248,30 +260,32 @@ function tt_GetClientH() } function tt_GetEvtX(e) { - return (e ? ((typeof(e.pageX) != tt_u) ? e.pageX : (e.clientX + tt_GetScrollX())) : 0); + return (e ? ((typeof(e.pageX) !== tt_u) ? e.pageX : (e.clientX + tt_GetScrollX())) : 0); } function tt_GetEvtY(e) { - return (e ? ((typeof(e.pageY) != tt_u) ? e.pageY : (e.clientY + tt_GetScrollY())) : 0); + return (e ? ((typeof(e.pageY) !== tt_u) ? e.pageY : (e.clientY + tt_GetScrollY())) : 0); } function tt_AddEvtFnc(el, sEvt, PFnc) { if(el) { - if(el.addEventListener) + if(el.addEventListener) { el.addEventListener(sEvt, PFnc, false); - else + } else { el.attachEvent("on" + sEvt, PFnc); + } } } function tt_RemEvtFnc(el, sEvt, PFnc) { if(el) { - if(el.removeEventListener) + if(el.removeEventListener) { el.removeEventListener(sEvt, PFnc, false); - else + } else { el.detachEvent("on" + sEvt, PFnc); + } } } function tt_GetDad(el) @@ -280,15 +294,18 @@ function tt_GetDad(el) } function tt_MovDomNode(el, dadFrom, dadTo) { - if(dadFrom) + if(dadFrom) { dadFrom.removeChild(el); - if(dadTo) + } + if(dadTo) { dadTo.appendChild(el); + } } //====================== PRIVATE ===========================================// -var tt_aExt = new Array(), // Array of extension objects - +// JSHint doesn't like the use of "new Number(0)" at all. +//noinspection JSHint +var tt_aExt = [], // Array of extension objects tt_db, tt_op, tt_ie, tt_ie56, tt_bBoxOld, // Browser flags tt_body, tt_ovr_, // HTML element the mouse is currently over @@ -299,8 +316,7 @@ tt_opa, // Currently applied opacity tt_bJmpVert, tt_bJmpHorz,// Tip temporarily on other side of mouse tt_elDeHref, // The tag from which we've removed the href attribute // Timer -tt_tShow = new Number(0), tt_tHide = new Number(0), tt_tDurt = new Number(0), -tt_tFade = new Number(0), tt_tWaitMov = new Number(0), +tt_tShow = new Number(0), tt_tHide = new Number(0), tt_tDurt = new Number(0), tt_tFade = new Number(0), tt_tWaitMov = new Number(0), tt_bWait = false, tt_u = "undefined"; @@ -309,15 +325,17 @@ function tt_Init() { tt_MkCmdEnum(); // Send old browsers instantly to hell - if(!tt_Browser() || !tt_MkMainDiv()) + if(!tt_Browser() || !tt_MkMainDiv()) { return; + } tt_IsW3cBox(); tt_OpaSupport(); tt_AddEvtFnc(document, "mousemove", tt_Move); // In Debug mode we search for TagToTip() calls in order to notify // the user if they've forgotten to set the TagsToTip config flag - if(TagsToTip || tt_Debug) + if(TagsToTip || tt_Debug) { tt_SetOnloadFnc(); + } // Ensure the tip be hidden when the page unloads tt_AddEvtFnc(window, "unload", tt_Hide); } @@ -325,25 +343,27 @@ function tt_Init() function tt_MkCmdEnum() { var n = 0; - for(var i in config) + for(var i in config) { eval("window." + i.toString().toUpperCase() + " = " + n++); + } tt_aV.length = n; } function tt_Browser() { var n, nv, n6, w3c; - n = navigator.userAgent.toLowerCase(), + n = navigator.userAgent.toLowerCase(); nv = navigator.appVersion; - tt_op = (document.defaultView && typeof(eval("w" + "indow" + "." + "o" + "p" + "er" + "a")) != tt_u); - tt_ie = n.indexOf("msie") != -1 && document.all && !tt_op; + tt_op = (document.defaultView && typeof(eval("w" + "indow" + "." + "o" + "p" + "er" + "a")) !== tt_u); + tt_ie = n.indexOf("msie") !== -1 && document.all && !tt_op; if(tt_ie) { - var ieOld = (!document.compatMode || document.compatMode == "BackCompat"); + var ieOld = (!document.compatMode || document.compatMode === "BackCompat"); tt_db = !ieOld ? document.documentElement : (document.body || null); - if(tt_db) - tt_ie56 = parseFloat(nv.substring(nv.indexOf("MSIE") + 5)) >= 5.5 - && typeof document.body.style.maxHeight == tt_u; + if(tt_db) { + tt_ie56 = parseFloat(nv.substring(nv.indexOf("MSIE") + 5)) >= 5.5 && + typeof document.body.style.maxHeight === tt_u; + } } else { @@ -352,7 +372,7 @@ function tt_Browser() : null); if(!tt_op) { - n6 = document.defaultView && typeof document.defaultView.getComputedStyle != tt_u; + n6 = document.defaultView && typeof document.defaultView.getComputedStyle !== tt_u; w3c = !n6 && document.getElementById; } } @@ -362,12 +382,13 @@ function tt_Browser() { if(tt_body && tt_db) { - if(document.attachEvent || document.addEventListener) + if(document.attachEvent || document.addEventListener) { return true; + } + } + else { + tt_Err("wz_tooltip.js must be included INSIDE the body section, immediately after the opening tag.", false); } - else - tt_Err("wz_tooltip.js must be included INSIDE the body section," - + " immediately after the opening tag.", false); } tt_db = null; return false; @@ -375,12 +396,14 @@ function tt_Browser() function tt_MkMainDiv() { // Create the tooltip DIV - if(tt_body.insertAdjacentHTML) + if(tt_body.insertAdjacentHTML) { tt_body.insertAdjacentHTML("afterBegin", tt_MkMainDivHtm()); - else if(typeof tt_body.innerHTML != tt_u && document.createElement && tt_body.appendChild) + } else if(typeof tt_body.innerHTML !== tt_u && document.createElement && tt_body.appendChild) { tt_body.appendChild(tt_MkMainDivDom()); - if(window.tt_GetMainDivRefs /* FireFox Alzheimer */ && tt_GetMainDivRefs()) + } + if(window.tt_GetMainDivRefs /* FireFox Alzheimer */ && tt_GetMainDivRefs()) { return true; + } tt_db = null; return false; } @@ -395,8 +418,9 @@ function tt_MkMainDivHtm() function tt_MkMainDivDom() { var el = document.createElement("div"); - if(el) + if(el) { el.id = "WzTtDiV"; + } return el; } function tt_GetMainDivRefs() @@ -405,8 +429,9 @@ function tt_GetMainDivRefs() if(tt_ie56 && tt_aElt[0]) { tt_aElt[tt_aElt.length - 1] = tt_GetElt("WzTtIfRm"); - if(!tt_aElt[tt_aElt.length - 1]) + if(!tt_aElt[tt_aElt.length - 1]) { tt_aElt[0] = null; + } } if(tt_aElt[0]) { @@ -432,7 +457,7 @@ function tt_IsW3cBox() css.padding = "10px"; css.width = "40px"; - tt_bBoxOld = (tt_GetDivW(tt_aElt[0]) == 40); + tt_bBoxOld = (tt_GetDivW(tt_aElt[0]) === 40); css.padding = "0px"; tt_ResetMainDiv(); } @@ -440,11 +465,11 @@ function tt_OpaSupport() { var css = tt_body.style; - tt_flagOpa = (typeof(css.KhtmlOpacity) != tt_u) ? 2 - : (typeof(css.KHTMLOpacity) != tt_u) ? 3 - : (typeof(css.MozOpacity) != tt_u) ? 4 - : (typeof(css.opacity) != tt_u) ? 5 - : (typeof(css.filter) != tt_u) ? 1 + tt_flagOpa = (typeof(css.KhtmlOpacity) !== tt_u) ? 2 + : (typeof(css.KHTMLOpacity) !== tt_u) ? 3 + : (typeof(css.MozOpacity) !== tt_u) ? 4 + : (typeof(css.opacity) !== tt_u) ? 5 + : (typeof(css.filter) !== tt_u) ? 1 : 0; } // Ported from http://dean.edwards.name/weblog/2006/06/again/ @@ -453,12 +478,14 @@ function tt_SetOnloadFnc() { tt_AddEvtFnc(document, "DOMContentLoaded", tt_HideSrcTags); tt_AddEvtFnc(window, "load", tt_HideSrcTags); - if(tt_body.attachEvent) + if(tt_body.attachEvent) { tt_body.attachEvent("onreadystatechange", function() { - if(tt_body.readyState == "complete") + if(tt_body.readyState === "complete") { tt_HideSrcTags(); + } } ); + } if(/WebKit|KHTML/i.test(navigator.userAgent)) { var t = setInterval(function() { @@ -472,14 +499,16 @@ function tt_SetOnloadFnc() } function tt_HideSrcTags() { - if(!window.tt_HideSrcTags || window.tt_HideSrcTags.done) + if(!window.tt_HideSrcTags || window.tt_HideSrcTags.done) { return; + } window.tt_HideSrcTags.done = true; - if(!tt_HideSrcTagsRecurs(tt_body)) - tt_Err("There are HTML elements to be converted to tooltips.\nIf you" - + " want these HTML elements to be automatically hidden, you" - + " must edit wz_tooltip.js, and set TagsToTip in the global" - + " tooltip configuration to true.", true); + if(!tt_HideSrcTagsRecurs(tt_body)) { + tt_Err("There are HTML elements to be converted to tooltips.\nIf you" + + " want these HTML elements to be automatically hidden, you" + + " must edit wz_tooltip.js, and set TagsToTip in the global" + + " tooltip configuration to true.", true); + } } function tt_HideSrcTagsRecurs(dad) { @@ -491,18 +520,20 @@ function tt_HideSrcTagsRecurs(dad) for(var i = a ? a.length : 0; i;) {--i; - if(!tt_HideSrcTagsRecurs(a[i])) + if(!tt_HideSrcTagsRecurs(a[i])) { return false; + } ovr = a[i].getAttribute ? (a[i].getAttribute("onmouseover") || a[i].getAttribute("onclick")) - : (typeof a[i].onmouseover == "function") ? (a[i].onmouseover || a[i].onclick) + : (typeof a[i].onmouseover === "function") ? (a[i].onmouseover || a[i].onclick) : null; if(ovr) { asT2t = ovr.toString().match(/TagToTip\s*\(\s*'[^'.]+'\s*[\),]/); if(asT2t && asT2t.length) { - if(!tt_HideSrcTag(asT2t[0])) + if(!tt_HideSrcTag(asT2t[0])) { return false; + } } } } @@ -518,27 +549,32 @@ function tt_HideSrcTag(sT2t) el = tt_GetElt(id); if(el) { - if(tt_Debug && !TagsToTip) + if(tt_Debug && !TagsToTip) { return false; - else + } else { el.style.display = "none"; + } + } + else { + tt_Err("Invalid ID\n'" + id + "'\npassed to TagToTip(). There exists no HTML element with that ID.", true); } - else - tt_Err("Invalid ID\n'" + id + "'\npassed to TagToTip()." - + " There exists no HTML element with that ID.", true); return true; } function tt_Tip(arg, t2t) { - if(!tt_db || (tt_iState & 0x8)) + if(!tt_db || (tt_iState & 0x8)) { return; - if(tt_iState) + } + if(tt_iState) { tt_Hide(); - if(!tt_Enabled) + } + if(!tt_Enabled) { return; + } tt_t2t = t2t; - if(!tt_ReadCmds(arg)) + if(!tt_ReadCmds(arg)) { return; + } tt_iState = 0x1 | 0x4; tt_AdaptConfig1(); tt_MkTipContent(arg); @@ -561,52 +597,62 @@ function tt_ReadCmds(a) // First load the global config values, to initialize also values // for which no command is passed i = 0; - for(var j in config) + for(var j in config) { tt_aV[i++] = config[j]; + } // Then replace each cached config value for which a command is // passed (ensure the # of command args plus value args be even) if(a.length & 1) { - for(i = a.length - 1; i > 0; i -= 2) + for(i = a.length - 1; i > 0; i -= 2) { tt_aV[a[i - 1]] = a[i]; + } return true; } - tt_Err("Incorrect call of Tip() or TagToTip().\n" - + "Each command must be followed by a value.", true); + tt_Err("Incorrect call of Tip() or TagToTip().\n Each command must be followed by a value.", true); return false; } function tt_AdaptConfig1() { tt_ExtCallFncs(0, "LoadConfig"); // Inherit unspecified title formattings from body - if(!tt_aV[TITLEBGCOLOR].length) + if(!tt_aV[TITLEBGCOLOR].length) { tt_aV[TITLEBGCOLOR] = tt_aV[BORDERCOLOR]; - if(!tt_aV[TITLEFONTCOLOR].length) + } + if(!tt_aV[TITLEFONTCOLOR].length) { tt_aV[TITLEFONTCOLOR] = tt_aV[BGCOLOR]; - if(!tt_aV[TITLEFONTFACE].length) + } + if(!tt_aV[TITLEFONTFACE].length) { tt_aV[TITLEFONTFACE] = tt_aV[FONTFACE]; - if(!tt_aV[TITLEFONTSIZE].length) + } + if(!tt_aV[TITLEFONTSIZE].length) { tt_aV[TITLEFONTSIZE] = tt_aV[FONTSIZE]; + } if(tt_aV[CLOSEBTN]) { // Use title colours for non-specified closebutton colours - if(!tt_aV[CLOSEBTNCOLORS]) + if(!tt_aV[CLOSEBTNCOLORS]) { tt_aV[CLOSEBTNCOLORS] = new Array("", "", "", ""); + } for(var i = 4; i;) {--i; - if(!tt_aV[CLOSEBTNCOLORS][i].length) + if(!tt_aV[CLOSEBTNCOLORS][i].length) { tt_aV[CLOSEBTNCOLORS][i] = (i & 1) ? tt_aV[TITLEFONTCOLOR] : tt_aV[TITLEBGCOLOR]; + } } // Enforce titlebar be shown - if(!tt_aV[TITLE].length) + if(!tt_aV[TITLE].length) { tt_aV[TITLE] = " "; + } } // Circumvents broken display of images and fade-in flicker in Geckos < 1.8 - if(tt_aV[OPACITY] == 100 && typeof tt_aElt[0].style.MozOpacity != tt_u && !Array.every) + if(tt_aV[OPACITY] === 100 && typeof tt_aElt[0].style.MozOpacity !== tt_u && !Array.every) { tt_aV[OPACITY] = 99; + } // Smartly shorten the delay for fade-in tooltips - if(tt_aV[FADEIN] && tt_flagOpa && tt_aV[DELAY] > 100) + if(tt_aV[FADEIN] && tt_flagOpa && tt_aV[DELAY] > 100) { tt_aV[DELAY] = Math.max(tt_aV[DELAY] - tt_aV[FADEIN], 100); + } } function tt_AdaptConfig2() { @@ -621,13 +667,15 @@ function tt_MkTipContent(a) { if(tt_t2t) { - if(tt_aV[COPYCONTENT]) + if(tt_aV[COPYCONTENT]) { tt_sContent = tt_t2t.innerHTML; - else + } else { tt_sContent = ""; + } } - else + else { tt_sContent = a[0]; + } tt_ExtCallFncs(0, "CreateContentString"); } function tt_MkTipSubDivs() @@ -637,44 +685,45 @@ function tt_MkTipSubDivs() tt_aElt[0].style.width = tt_GetClientW() + "px"; tt_aElt[0].innerHTML = - ('' - + (tt_aV[TITLE].length ? - ('
' - + '' - + tt_aV[TITLE] - + '' - + (tt_aV[CLOSEBTN] ? - ('') + ('' + + (tt_aV[TITLE].length ? + ('
' + + '
' - + '' - + tt_aV[CLOSEBTNTEXT] - + '
' + + tt_aV[TITLE] + + '' + + (tt_aV[CLOSEBTN] ? + ('') + : '') + + '
' + + '' + + tt_aV[CLOSEBTNTEXT] + + '
') + : '') + + '
' + + '' + + tt_sContent + + '
' + + (tt_aV[SHADOW] ? + ('
' + + '
') : '') - + '') - : '') - + '
' - + '' - + tt_sContent - + '
' - + (tt_aV[SHADOW] - ? ('
' - + '
') - : '') ); tt_GetSubDivRefs(); // Convert DOM node to tip - if(tt_t2t && !tt_aV[COPYCONTENT]) + if(tt_t2t && !tt_aV[COPYCONTENT]) { tt_El2Tip(); + } tt_ExtCallFncs(0, "SubDivsCreated"); } function tt_GetSubDivRefs() { var aId = new Array("WzTiTl", "WzTiTlTb", "WzTiTlI", "WzClOsE", "WzBoDy", "WzBoDyI", "WzTtShDwB", "WzTtShDwR"); - for(var i = aId.length; i; --i) + for(var i = aId.length; i; --i) { tt_aElt[i] = tt_GetElt(aId[i - 1]); + } } function tt_FormatTip() { @@ -691,8 +740,9 @@ function tt_FormatTip() css.paddingLeft = css.paddingRight = (padT + 2) + "px"; css = tt_aElt[3].style; css.color = tt_aV[TITLEFONTCOLOR]; - if(tt_aV[WIDTH] == -1) + if(tt_aV[WIDTH] === -1) { css.whiteSpace = "nowrap"; + } css.fontFamily = tt_aV[TITLEFONTFACE]; css.fontSize = tt_aV[TITLEFONTSIZE]; css.fontWeight = "bold"; @@ -707,17 +757,20 @@ function tt_FormatTip() css.fontSize = tt_aV[TITLEFONTSIZE]; css.fontWeight = "bold"; } - if(tt_aV[WIDTH] > 0) + if(tt_aV[WIDTH] > 0) { tt_w = tt_aV[WIDTH]; + } else { tt_w = tt_GetDivW(tt_aElt[3]) + tt_GetDivW(tt_aElt[4]); // Some spacing between title DIV and closebutton - if(tt_aElt[4]) + if(tt_aElt[4]) { tt_w += pad; + } // Restrict auto width to max width - if(tt_aV[WIDTH] < -1 && tt_w > -tt_aV[WIDTH]) + if(tt_aV[WIDTH] < -1 && tt_w > -tt_aV[WIDTH]) { tt_w = -tt_aV[WIDTH]; + } } // Ensure the top border of the body DIV be covered by the title DIV iOffY = -wBrd; @@ -737,19 +790,22 @@ function tt_FormatTip() css.borderStyle = tt_aV[BORDERSTYLE]; css.borderWidth = wBrd + "px"; } - if(tt_aV[BGCOLOR].length) + if(tt_aV[BGCOLOR].length) { css.background = tt_aV[BGCOLOR]; - if(tt_aV[BGIMG].length) + } + if(tt_aV[BGIMG].length) { css.backgroundImage = "url(" + tt_aV[BGIMG] + ")"; + } css.padding = pad + "px"; css.textAlign = tt_aV[TEXTALIGN]; if(tt_aV[HEIGHT]) { css.overflow = "auto"; - if(tt_aV[HEIGHT] > 0) + if(tt_aV[HEIGHT] > 0) { css.height = (tt_aV[HEIGHT] + iAdd) + "px"; - else + } else { tt_h = iAdd - tt_aV[HEIGHT]; + } } // TD inside body DIV css = tt_aElt[6].style; @@ -758,22 +814,25 @@ function tt_FormatTip() css.fontSize = tt_aV[FONTSIZE]; css.fontWeight = tt_aV[FONTWEIGHT]; css.textAlign = tt_aV[TEXTALIGN]; - if(tt_aV[WIDTH] > 0) + if(tt_aV[WIDTH] > 0) { w = tt_aV[WIDTH]; // Width like title (if existent) - else if(tt_aV[WIDTH] == -1 && tt_w) + } else if(tt_aV[WIDTH] === -1 && tt_w) { w = tt_w; + } else { // Measure width of the body's inner TD, as some browsers would expand // the container and outer body DIV to 100% w = tt_GetDivW(tt_aElt[6]); // Restrict auto width to max width - if(tt_aV[WIDTH] < -1 && w > -tt_aV[WIDTH]) + if(tt_aV[WIDTH] < -1 && w > -tt_aV[WIDTH]) { w = -tt_aV[WIDTH]; + } } - if(w > tt_w) + if(w > tt_w) { tt_w = w; + } tt_w += iAdd; //--------- Shadow DIVs ------------ @@ -795,8 +854,9 @@ function tt_FormatTip() css.width = tt_aV[SHADOWWIDTH] + "px"; css.background = tt_aV[SHADOWCOLOR]; } - else + else { iOffSh = 0; + } //-------- Container DIV ------- tt_SetTipOpa(tt_aV[FADEIN] ? 0 : tt_aV[OPACITY]); @@ -812,15 +872,17 @@ function tt_FixSize(iOffY, iOffSh) wOut = tt_w - ((tt_aV[SHADOW]) ? tt_aV[SHADOWWIDTH] : 0); // Body wIn = wOut; - if(!tt_bBoxOld) + if(!tt_bBoxOld) { wIn -= (pad + wBrd) << 1; + } tt_aElt[5].style.width = wIn + "px"; // Title if(tt_aElt[1]) { wIn = wOut - ((tt_aV[TITLEPADDING] + 2) << 1); - if(!tt_bBoxOld) + if(!tt_bBoxOld) { wOut = wIn; + } tt_aElt[1].style.width = wOut + "px"; tt_aElt[2].style.width = wIn + "px"; } @@ -830,15 +892,17 @@ function tt_FixSize(iOffY, iOffSh) h = tt_GetDivH(tt_aElt[5]); if(h > tt_h) { - if(!tt_bBoxOld) + if(!tt_bBoxOld) { tt_h -= (pad + wBrd) << 1; + } tt_aElt[5].style.height = tt_h + "px"; } } tt_h = tt_GetDivH(tt_aElt[0]) + iOffY; // Right shadow - if(tt_aElt[8]) + if(tt_aElt[8]) { tt_aElt[8].style.height = (tt_h - iOffSh) + "px"; + } i = tt_aElt.length - 1; if(tt_aElt[i]) { @@ -852,25 +916,30 @@ function tt_DeAlt(el) if(el) { - if(el.alt) + if(el.alt) { el.alt = ""; - if(el.title) + } + if(el.title) { el.title = ""; + } aKid = el.childNodes || el.children || null; if(aKid) { - for(var i = aKid.length; i;) + for(var i = aKid.length; i;) { tt_DeAlt(aKid[--i]); + } } } } // This hack removes the native tooltips over links in Opera function tt_OpDeHref(el) { - if(!tt_op) + if(!tt_op) { return; - if(tt_elDeHref) + } + if(tt_elDeHref) { tt_OpReHref(); + } while(el) { if(el.hasAttribute && el.hasAttribute("href")) @@ -928,18 +997,20 @@ function tt_UnEl2Tip() } function tt_OverInit() { - if(window.event) + if(window.event) { tt_over = window.event.target || window.event.srcElement; - else + } else { tt_over = tt_ovr_; + } tt_DeAlt(tt_over); tt_OpDeHref(tt_over); } function tt_ShowInit() { tt_tShow.Timer("tt_Show()", tt_aV[DELAY], true); - if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY]) + if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY]) { tt_AddEvtFnc(document, "mouseup", tt_OnLClick); + } } function tt_Show() { @@ -947,17 +1018,21 @@ function tt_Show() // Override the z-index of the topmost wz_dragdrop.js D&D item css.zIndex = Math.max((window.dd && dd.z) ? (dd.z + 2) : 0, 1010); - if(tt_aV[STICKY] || !tt_aV[FOLLOWMOUSE]) + if(tt_aV[STICKY] || !tt_aV[FOLLOWMOUSE]) { tt_iState &= ~0x4; - if(tt_aV[EXCLUSIVE]) + } + if(tt_aV[EXCLUSIVE]) { tt_iState |= 0x8; - if(tt_aV[DURATION] > 0) + } + if(tt_aV[DURATION] > 0) { tt_tDurt.Timer("tt_HideInit()", tt_aV[DURATION], true); - tt_ExtCallFncs(0, "Show") + } + tt_ExtCallFncs(0, "Show"); css.visibility = "visible"; tt_iState |= 0x2; - if(tt_aV[FADEIN]) + if(tt_aV[FADEIN]) { tt_Fade(0, 0, tt_aV[OPACITY], Math.round(tt_aV[FADEIN] / tt_aV[FADEINTERVAL])); + } tt_ShowIfrm(); } function tt_ShowIfrm() @@ -975,8 +1050,9 @@ function tt_ShowIfrm() } function tt_Move(e) { - if(e) + if(e) { tt_ovr_ = e.target || e.srcElement; + } e = e || window.event; if(e) { @@ -988,8 +1064,9 @@ function tt_Move(e) // Prevent jam of mousemove events if(!tt_op && !tt_ie) { - if(tt_bWait) + if(tt_bWait) { return; + } tt_bWait = true; tt_tWaitMov.Timer("tt_bWait = false;", 1, true); } @@ -998,9 +1075,10 @@ function tt_Move(e) tt_iState &= ~0x4; tt_PosFix(); } - else if(!tt_ExtCallFncs(e, "MoveBefore")) + else if(!tt_ExtCallFncs(e, "MoveBefore")) { tt_SetTipPos(tt_Pos(0), tt_Pos(1)); - tt_ExtCallFncs([tt_musX, tt_musY], "MoveAfter") + } + tt_ExtCallFncs([tt_musX, tt_musY], "MoveAfter"); } } function tt_Pos(iDim) @@ -1032,44 +1110,54 @@ function tt_Pos(iDim) } if(bJmpMod) { - if(tt_aV[cmdAlt] && (!bJmp || tt_CalcPosAlt(iDim) >= iScrl + 16)) + if(tt_aV[cmdAlt] && (!bJmp || tt_CalcPosAlt(iDim) >= iScrl + 16)) { iX = tt_PosAlt(iDim); - else if(!tt_aV[cmdAlt] && bJmp && tt_CalcPosDef(iDim) > iMax - 16) + } + else if(!tt_aV[cmdAlt] && bJmp && tt_CalcPosDef(iDim) > iMax - 16) { iX = tt_PosAlt(iDim); - else + } else { iX = tt_PosDef(iDim); + } } else { iX = iMus; - if(tt_aV[cmdAlt]) + if(tt_aV[cmdAlt]) { iX -= cx + tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0); - else + } + else { iX += tt_aV[cmdOff]; + } } // Prevent tip from extending past clientarea boundary - if(iX > iMax) + if(iX > iMax) { iX = bJmpMod ? tt_PosAlt(iDim) : iMax; + } // In case of insufficient space on both sides, ensure the left/upper part // of the tip be visible - if(iX < iScrl) + if(iX < iScrl) { iX = bJmpMod ? tt_PosDef(iDim) : iScrl; + } return iX; } function tt_PosDef(iDim) { - if(iDim) + if(iDim) { tt_bJmpVert = tt_aV[ABOVE]; - else + } + else { tt_bJmpHorz = tt_aV[LEFT]; + } return tt_CalcPosDef(iDim); } function tt_PosAlt(iDim) { - if(iDim) + if(iDim) { tt_bJmpVert = !tt_aV[ABOVE]; - else + } + else { tt_bJmpHorz = !tt_aV[LEFT]; + } return tt_CalcPosAlt(iDim); } function tt_CalcPosDef(iDim) @@ -1080,31 +1168,34 @@ function tt_CalcPosAlt(iDim) { var cmdOff = iDim ? OFFSETY : OFFSETX; var dx = tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0); - if(tt_aV[cmdOff] > 0 && dx <= 0) + if(tt_aV[cmdOff] > 0 && dx <= 0) { dx = 1; + } return((iDim ? (tt_musY - tt_h) : (tt_musX - tt_w)) - dx); } function tt_PosFix() { var iX, iY; - if(typeof(tt_aV[FIX][0]) == "number") + if(typeof(tt_aV[FIX][0]) === "number") { iX = tt_aV[FIX][0]; iY = tt_aV[FIX][1]; } else { - if(typeof(tt_aV[FIX][0]) == "string") + if(typeof(tt_aV[FIX][0]) === "string") { el = tt_GetElt(tt_aV[FIX][0]); // First slot in array is direct reference to HTML element - else + } else { el = tt_aV[FIX][0]; + } iX = tt_aV[FIX][1]; iY = tt_aV[FIX][2]; // By default, vert pos is related to bottom edge of HTML element - if(!tt_aV[ABOVE] && el) + if(!tt_aV[ABOVE] && el) { iY += tt_GetDivH(el); + } for(; el; el = el.offsetParent) { iX += el.offsetLeft || 0; @@ -1113,8 +1204,9 @@ function tt_PosFix() } // For a fixed tip positioned above the mouse, use the bottom edge as anchor // (recommended by Christophe Rebeschini, 31.1.2008) - if(tt_aV[ABOVE]) + if(tt_aV[ABOVE]) { iY -= tt_h; + } tt_SetTipPos(iX, iY); } function tt_Fade(a, now, z, n) @@ -1122,26 +1214,26 @@ function tt_Fade(a, now, z, n) if(n) { now += Math.round((z - now) / n); - if((z > a) ? (now >= z) : (now <= z)) + if((z > a) ? (now >= z) : (now <= z)) { now = z; - else - tt_tFade.Timer( - "tt_Fade(" - + a + "," + now + "," + z + "," + (n - 1) - + ")", - tt_aV[FADEINTERVAL], - true - ); + } else { + tt_tFade.Timer( "tt_Fade(" + a + "," + now + "," + z + "," + (n - 1) + ")", tt_aV[FADEINTERVAL], true); + } + } + if (now) { + tt_SetTipOpa(now); + } else { + tt_Hide(); } - now ? tt_SetTipOpa(now) : tt_Hide(); } function tt_SetTipOpa(opa) { // To circumvent the opacity nesting flaws of IE, we set the opacity // for each sub-DIV separately, rather than for the container DIV. tt_SetOpa(tt_aElt[5], opa); - if(tt_aElt[1]) + if(tt_aElt[1]) { tt_SetOpa(tt_aElt[1], opa); + } if(tt_aV[SHADOW]) { opa = Math.round(opa * 0.8); @@ -1161,15 +1253,16 @@ function tt_OnLClick(e) { // Ignore right-clicks e = e || window.event; - if(!((e.button && e.button & 2) || (e.which && e.which == 3))) + if(!((e.button && e.button & 2) || (e.which && e.which === 3))) { if(tt_aV[CLICKSTICKY] && (tt_iState & 0x4)) { tt_aV[STICKY] = true; tt_iState &= ~0x4; } - else if(tt_aV[CLICKCLOSE]) + else if(tt_aV[CLICKCLOSE]) { tt_HideInit(); + } } } function tt_Int(x) @@ -1180,9 +1273,10 @@ function tt_Int(x) } Number.prototype.Timer = function(s, iT, bUrge) { - if(!this.value || bUrge) + if(!this.value || bUrge) { this.value = window.setTimeout(s, iT); -} + } +}; Number.prototype.EndTimer = function() { if(this.value) @@ -1190,19 +1284,19 @@ Number.prototype.EndTimer = function() window.clearTimeout(this.value); this.value = 0; } -} +}; function tt_GetWndCliSiz(s) { var db, y = window["inner" + s], sC = "client" + s, sN = "number"; - if(typeof y == sN) + if(typeof y === sN) { var y2; return( // Gecko or Opera with scrollbar // ... quirks mode - ((db = document.body) && typeof(y2 = db[sC]) == sN && y2 && y2 <= y) ? y2 + ((db = document.body) && typeof(y2 = db[sC]) === sN && y2 && y2 <= y) ? y2 // ... strict mode - : ((db = document.documentElement) && typeof(y2 = db[sC]) == sN && y2 && y2 <= y) ? y2 + : ((db = document.documentElement) && typeof(y2 = db[sC]) === sN && y2 && y2 <= y) ? y2 // No scrollbar, or clientarea size == 0, or other browser (KHTML etc.) : y ); @@ -1221,7 +1315,7 @@ function tt_SetOpa(el, opa) var css = el.style; tt_opa = opa; - if(tt_flagOpa == 1) + if(tt_flagOpa === 1) { if(opa < 100) { @@ -1229,23 +1323,27 @@ function tt_SetOpa(el, opa) // 1.) Once a CSS filter has been applied, fonts are no longer // anti-aliased, so we store the previous 'non-filter' to be // able to restore it - if(typeof(el.filtNo) == tt_u) + if(typeof(el.filtNo) === tt_u) { el.filtNo = css.filter; + } // 2.) A DIV cannot be made visible in a single step if an // opacity < 100 has been applied while the DIV was hidden - var bVis = css.visibility != "hidden"; + var bVis = css.visibility !== "hidden"; // 3.) In IE6, applying an opacity < 100 has no effect if the - // element has no layout (position, size, zoom, ...) + // element has no layout (position, size, zoom, ...) css.zoom = "100%"; - if(!bVis) + if(!bVis) { css.visibility = "visible"; + } css.filter = "alpha(opacity=" + opa + ")"; - if(!bVis) + if(!bVis) { css.visibility = "hidden"; + } } - else if(typeof(el.filtNo) != tt_u) + else if(typeof(el.filtNo) !== tt_u) { // Restore 'non-filter' css.filter = el.filtNo; + } } else { @@ -1265,8 +1363,9 @@ function tt_SetOpa(el, opa) } function tt_Err(sErr, bIfDebug) { - if(tt_Debug || !bIfDebug) + if(tt_Debug || !bIfDebug) { alert("Tooltip Script Error Message:\n\n" + sErr); + } } //============ EXTENSION (PLUGIN) MANAGER ===============// @@ -1292,8 +1391,9 @@ function tt_ExtCallFncs(arg, sFnc) {--i; var fnc = tt_aExt[i]["On" + sFnc]; // Call the method the extension has defined for this event - if(fnc && fnc(arg)) + if(fnc && fnc(arg)) { b = true; + } } return b; }