2014-04-20 03:06:48 +00:00
/*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
* /
2010-02-28 11:01:18 +00:00
/ * T h i s n o t i c e m u s t b e u n t o u c h e d a t a l l t i m e s .
Copyright ( c ) 2002 - 2008 Walter Zorn . All rights reserved .
2014-04-20 03:06:48 +00:00
wz _tooltip . js v . 5.31
2010-02-28 11:01:18 +00:00
The latest version is available at
http : //www.walterzorn.com
or http : //www.devira.com
or http : //www.walterzorn.de
Created 1.12 . 2002 by Walter Zorn ( Web : http : //www.walterzorn.com )
Last modified : 7.11 . 2008
Easy - to - use cross - browser tooltips .
Just include the script at the beginning of the < body > section , and invoke
Tip ( 'Tooltip text' ) to show and UnTip ( ) to hide the tooltip , from the desired
HTML eventhandlers . Example :
< a onmouseover = "Tip('Some text')" onmouseout = "UnTip()" href = "index.htm" > My home page < / a >
No container DIV required .
By default , width and height of tooltips are automatically adapted to content .
Is even capable of dynamically converting arbitrary HTML elements to tooltips
by calling TagToTip ( 'ID_of_HTML_element_to_be_converted' ) instead of Tip ( ) ,
which means you can put important , search - engine - relevant stuff into tooltips .
Appearance & behaviour of tooltips can be individually configured
via commands passed to Tip ( ) or TagToTip ( ) .
Tab Width : 4
LICENSE : LGPL
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License ( LGPL ) as published by the Free Software Foundation ; either
version 2.1 of the License , or ( at your option ) any later version .
This library is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
For more details on the GNU Lesser General Public License ,
see http : //www.gnu.org/copyleft/lesser.html
* /
2014-04-20 03:06:48 +00:00
var config = { } ; // new Object();
2010-02-28 11:01:18 +00:00
//=================== GLOBAL TOOLTIP CONFIGURATION =========================//
2014-04-20 03:06:48 +00:00
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;
2010-02-28 11:01:18 +00:00
// if false, you should hide those HTML elements yourself
// For each of the following config variables there exists a command, which is
// just the variablename in uppercase, to be passed to Tip() or TagToTip() to
// configure tooltips individually. Individual commands override global
// configuration. Order of commands is arbitrary.
// Example: onmouseover="Tip('Tooltip text', LEFT, true, BGCOLOR, '#FF9900', FADEIN, 400)"
2014-04-20 03:06:48 +00:00
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;
2010-02-28 11:01:18 +00:00
// -1: tooltip width confined to the width required for the titlebar
//======= END OF TOOLTIP CONFIG, DO NOT CHANGE ANYTHING BELOW ==============//
//===================== PUBLIC =============================================//
function Tip ( )
{
tt _Tip ( arguments , null ) ;
}
function TagToTip ( )
{
var t2t = tt _GetElt ( arguments [ 0 ] ) ;
2014-04-20 03:06:48 +00:00
if ( t2t ) {
2010-02-28 11:01:18 +00:00
tt _Tip ( arguments , t2t ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
function UnTip ( )
{
tt _OpReHref ( ) ;
2014-04-20 03:06:48 +00:00
if ( tt _aV [ DURATION ] < 0 && ( tt _iState & 0x2 ) ) {
2010-02-28 11:01:18 +00:00
tt _tDurt . Timer ( "tt_HideInit()" , - tt _aV [ DURATION ] , true ) ;
2014-04-20 03:06:48 +00:00
} else if ( ! ( tt _aV [ STICKY ] && ( tt _iState & 0x2 ) ) ) {
2010-02-28 11:01:18 +00:00
tt _HideInit ( ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
2014-04-20 03:06:48 +00:00
//================== PUBLIC PLUGIN API =====================================//
2010-02-28 11:01:18 +00:00
// 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
2014-04-20 03:06:48 +00:00
tt _aV = [ ] , // Caches and enumerates config data for currently active tooltip
2010-02-28 11:01:18 +00:00
tt _sContent , // Inner tooltip text or HTML
tt _t2t , tt _t2tDad , // Tag converted to tip, and its DOM parent element
tt _musX , tt _musY ,
tt _over ,
tt _x , tt _y , tt _w , tt _h ; // Position, width and height of currently displayed tooltip
function tt _Extension ( )
{
tt _ExtCmdEnum ( ) ;
tt _aExt [ tt _aExt . length ] = this ;
return this ;
}
function tt _SetTipPos ( x , y )
{
var css = tt _aElt [ 0 ] . style ;
tt _x = x ;
tt _y = y ;
css . left = x + "px" ;
css . top = y + "px" ;
if ( tt _ie56 )
{
var ifrm = tt _aElt [ tt _aElt . length - 1 ] ;
if ( ifrm )
{
ifrm . style . left = css . left ;
ifrm . style . top = css . top ;
}
}
}
function tt _HideInit ( )
{
if ( tt _iState )
{
tt _ExtCallFncs ( 0 , "HideInit" ) ;
tt _iState &= ~ ( 0x4 | 0x8 ) ;
if ( tt _flagOpa && tt _aV [ FADEOUT ] )
{
tt _tFade . EndTimer ( ) ;
if ( tt _opa )
{
var n = Math . round ( tt _aV [ FADEOUT ] / ( tt _aV [ FADEINTERVAL ] * ( tt _aV [ OPACITY ] / tt _opa ) ) ) ;
tt _Fade ( tt _opa , tt _opa , 0 , n ) ;
return ;
}
}
tt _tHide . Timer ( "tt_Hide();" , 1 , false ) ;
}
}
function tt _Hide ( )
{
if ( tt _db && tt _iState )
{
tt _OpReHref ( ) ;
if ( tt _iState & 0x2 )
{
tt _aElt [ 0 ] . style . visibility = "hidden" ;
tt _ExtCallFncs ( 0 , "Hide" ) ;
}
tt _tShow . EndTimer ( ) ;
tt _tHide . EndTimer ( ) ;
tt _tDurt . EndTimer ( ) ;
tt _tFade . EndTimer ( ) ;
if ( ! tt _op && ! tt _ie )
{
tt _tWaitMov . EndTimer ( ) ;
tt _bWait = false ;
}
2014-04-20 03:06:48 +00:00
if ( tt _aV [ CLICKCLOSE ] || tt _aV [ CLICKSTICKY ] ) {
2010-02-28 11:01:18 +00:00
tt _RemEvtFnc ( document , "mouseup" , tt _OnLClick ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _ExtCallFncs ( 0 , "Kill" ) ;
// In case of a TagToTip tip, hide converted DOM node and
// re-insert it into DOM
2014-04-20 03:06:48 +00:00
if ( tt _t2t && ! tt _aV [ COPYCONTENT ] ) {
2010-02-28 11:01:18 +00:00
tt _UnEl2Tip ( ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _iState = 0 ;
tt _over = null ;
tt _ResetMainDiv ( ) ;
2014-04-20 03:06:48 +00:00
if ( tt _aElt [ tt _aElt . length - 1 ] ) {
2010-02-28 11:01:18 +00:00
tt _aElt [ tt _aElt . length - 1 ] . style . display = "none" ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
}
function tt _GetElt ( id )
{
return ( document . getElementById ? document . getElementById ( id )
: document . all ? document . all [ id ]
: null ) ;
}
function tt _GetDivW ( el )
{
return ( el ? ( el . offsetWidth || el . style . pixelWidth || 0 ) : 0 ) ;
}
function tt _GetDivH ( el )
{
return ( el ? ( el . offsetHeight || el . style . pixelHeight || 0 ) : 0 ) ;
}
function tt _GetScrollX ( )
{
return ( window . pageXOffset || ( tt _db ? ( tt _db . scrollLeft || 0 ) : 0 ) ) ;
}
function tt _GetScrollY ( )
{
return ( window . pageYOffset || ( tt _db ? ( tt _db . scrollTop || 0 ) : 0 ) ) ;
}
function tt _GetClientW ( )
{
return tt _GetWndCliSiz ( "Width" ) ;
}
function tt _GetClientH ( )
{
return tt _GetWndCliSiz ( "Height" ) ;
}
function tt _GetEvtX ( e )
{
2014-04-20 03:06:48 +00:00
return ( e ? ( ( typeof ( e . pageX ) !== tt _u ) ? e . pageX : ( e . clientX + tt _GetScrollX ( ) ) ) : 0 ) ;
2010-02-28 11:01:18 +00:00
}
function tt _GetEvtY ( e )
{
2014-04-20 03:06:48 +00:00
return ( e ? ( ( typeof ( e . pageY ) !== tt _u ) ? e . pageY : ( e . clientY + tt _GetScrollY ( ) ) ) : 0 ) ;
2010-02-28 11:01:18 +00:00
}
function tt _AddEvtFnc ( el , sEvt , PFnc )
{
if ( el )
{
2014-04-20 03:06:48 +00:00
if ( el . addEventListener ) {
2010-02-28 11:01:18 +00:00
el . addEventListener ( sEvt , PFnc , false ) ;
2014-04-20 03:06:48 +00:00
} else {
2010-02-28 11:01:18 +00:00
el . attachEvent ( "on" + sEvt , PFnc ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
}
function tt _RemEvtFnc ( el , sEvt , PFnc )
{
if ( el )
{
2014-04-20 03:06:48 +00:00
if ( el . removeEventListener ) {
2010-02-28 11:01:18 +00:00
el . removeEventListener ( sEvt , PFnc , false ) ;
2014-04-20 03:06:48 +00:00
} else {
2010-02-28 11:01:18 +00:00
el . detachEvent ( "on" + sEvt , PFnc ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
}
function tt _GetDad ( el )
{
return ( el . parentNode || el . parentElement || el . offsetParent ) ;
}
function tt _MovDomNode ( el , dadFrom , dadTo )
{
2014-04-20 03:06:48 +00:00
if ( dadFrom ) {
2010-02-28 11:01:18 +00:00
dadFrom . removeChild ( el ) ;
2014-04-20 03:06:48 +00:00
}
if ( dadTo ) {
2010-02-28 11:01:18 +00:00
dadTo . appendChild ( el ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
//====================== PRIVATE ===========================================//
2014-04-20 03:06:48 +00:00
// JSHint doesn't like the use of "new Number(0)" at all.
//noinspection JSHint
var tt _aExt = [ ] , // Array of extension objects
2010-02-28 11:01:18 +00:00
tt _db , tt _op , tt _ie , tt _ie56 , tt _bBoxOld , // Browser flags
tt _body ,
tt _ovr _ , // HTML element the mouse is currently over
tt _flagOpa , // Opacity support: 1=IE, 2=Khtml, 3=KHTML, 4=Moz, 5=W3C
tt _maxPosX , tt _maxPosY ,
tt _iState = 0 , // Tooltip active |= 1, shown |= 2, move with mouse |= 4, exclusive |= 8
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
2014-04-20 03:06:48 +00:00
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 ) ,
2010-02-28 11:01:18 +00:00
tt _bWait = false ,
tt _u = "undefined" ;
function tt _Init ( )
{
tt _MkCmdEnum ( ) ;
// Send old browsers instantly to hell
2014-04-20 03:06:48 +00:00
if ( ! tt _Browser ( ) || ! tt _MkMainDiv ( ) ) {
2010-02-28 11:01:18 +00:00
return ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
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
2014-04-20 03:06:48 +00:00
if ( TagsToTip || tt _Debug ) {
2010-02-28 11:01:18 +00:00
tt _SetOnloadFnc ( ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
// Ensure the tip be hidden when the page unloads
tt _AddEvtFnc ( window , "unload" , tt _Hide ) ;
}
// Creates command names by translating config variable names to upper case
function tt _MkCmdEnum ( )
{
var n = 0 ;
2014-04-20 03:06:48 +00:00
for ( var i in config ) {
2010-02-28 11:01:18 +00:00
eval ( "window." + i . toString ( ) . toUpperCase ( ) + " = " + n ++ ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _aV . length = n ;
}
function tt _Browser ( )
{
var n , nv , n6 , w3c ;
2014-04-20 03:06:48 +00:00
n = navigator . userAgent . toLowerCase ( ) ;
2010-02-28 11:01:18 +00:00
nv = navigator . appVersion ;
2014-04-20 03:06:48 +00:00
tt _op = ( document . defaultView && typeof ( eval ( "w" + "indow" + "." + "o" + "p" + "er" + "a" ) ) !== tt _u ) ;
tt _ie = n . indexOf ( "msie" ) !== - 1 && document . all && ! tt _op ;
2010-02-28 11:01:18 +00:00
if ( tt _ie )
{
2014-04-20 03:06:48 +00:00
var ieOld = ( ! document . compatMode || document . compatMode === "BackCompat" ) ;
2010-02-28 11:01:18 +00:00
tt _db = ! ieOld ? document . documentElement : ( document . body || null ) ;
2014-04-20 03:06:48 +00:00
if ( tt _db ) {
tt _ie56 = parseFloat ( nv . substring ( nv . indexOf ( "MSIE" ) + 5 ) ) >= 5.5 &&
typeof document . body . style . maxHeight === tt _u ;
}
2010-02-28 11:01:18 +00:00
}
else
{
tt _db = document . documentElement || document . body ||
( document . getElementsByTagName ? document . getElementsByTagName ( "body" ) [ 0 ]
: null ) ;
if ( ! tt _op )
{
2014-04-20 03:06:48 +00:00
n6 = document . defaultView && typeof document . defaultView . getComputedStyle !== tt _u ;
2010-02-28 11:01:18 +00:00
w3c = ! n6 && document . getElementById ;
}
}
tt _body = ( document . getElementsByTagName ? document . getElementsByTagName ( "body" ) [ 0 ]
: ( document . body || null ) ) ;
if ( tt _ie || n6 || tt _op || w3c )
{
if ( tt _body && tt _db )
{
2014-04-20 03:06:48 +00:00
if ( document . attachEvent || document . addEventListener ) {
2010-02-28 11:01:18 +00:00
return true ;
2014-04-20 03:06:48 +00:00
}
}
else {
tt _Err ( "wz_tooltip.js must be included INSIDE the body section, immediately after the opening <body> tag." , false ) ;
2010-02-28 11:01:18 +00:00
}
}
tt _db = null ;
return false ;
}
function tt _MkMainDiv ( )
{
// Create the tooltip DIV
2014-04-20 03:06:48 +00:00
if ( tt _body . insertAdjacentHTML ) {
2010-02-28 11:01:18 +00:00
tt _body . insertAdjacentHTML ( "afterBegin" , tt _MkMainDivHtm ( ) ) ;
2014-04-20 03:06:48 +00:00
} else if ( typeof tt _body . innerHTML !== tt _u && document . createElement && tt _body . appendChild ) {
2010-02-28 11:01:18 +00:00
tt _body . appendChild ( tt _MkMainDivDom ( ) ) ;
2014-04-20 03:06:48 +00:00
}
if ( window . tt _GetMainDivRefs /* FireFox Alzheimer */ && tt _GetMainDivRefs ( ) ) {
2010-02-28 11:01:18 +00:00
return true ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _db = null ;
return false ;
}
function tt _MkMainDivHtm ( )
{
return (
'<div id="WzTtDiV"></div>' +
2020-03-13 09:23:54 +00:00
( tt _ie56 ? ( '<iframe id="WzTtIfRm" src="javascript:false" scrolling="no" frameborder="0" style="filter:Alpha(opacity=0);position:absolute;top:0;left:0;display:none;"></iframe>' )
2010-02-28 11:01:18 +00:00
: '' )
) ;
}
function tt _MkMainDivDom ( )
{
var el = document . createElement ( "div" ) ;
2014-04-20 03:06:48 +00:00
if ( el ) {
2010-02-28 11:01:18 +00:00
el . id = "WzTtDiV" ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
return el ;
}
function tt _GetMainDivRefs ( )
{
tt _aElt [ 0 ] = tt _GetElt ( "WzTtDiV" ) ;
if ( tt _ie56 && tt _aElt [ 0 ] )
{
tt _aElt [ tt _aElt . length - 1 ] = tt _GetElt ( "WzTtIfRm" ) ;
2014-04-20 03:06:48 +00:00
if ( ! tt _aElt [ tt _aElt . length - 1 ] ) {
2010-02-28 11:01:18 +00:00
tt _aElt [ 0 ] = null ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
if ( tt _aElt [ 0 ] )
{
var css = tt _aElt [ 0 ] . style ;
css . visibility = "hidden" ;
css . position = "absolute" ;
css . overflow = "hidden" ;
return true ;
}
return false ;
}
function tt _ResetMainDiv ( )
{
tt _SetTipPos ( 0 , 0 ) ;
tt _aElt [ 0 ] . innerHTML = "" ;
tt _aElt [ 0 ] . style . width = "0px" ;
tt _h = 0 ;
}
function tt _IsW3cBox ( )
{
var css = tt _aElt [ 0 ] . style ;
css . padding = "10px" ;
css . width = "40px" ;
2014-04-20 03:06:48 +00:00
tt _bBoxOld = ( tt _GetDivW ( tt _aElt [ 0 ] ) === 40 ) ;
2010-02-28 11:01:18 +00:00
css . padding = "0px" ;
tt _ResetMainDiv ( ) ;
}
function tt _OpaSupport ( )
{
var css = tt _body . style ;
2014-04-20 03:06:48 +00:00
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
2010-02-28 11:01:18 +00:00
: 0 ;
}
// Ported from http://dean.edwards.name/weblog/2006/06/again/
// (Dean Edwards et al.)
function tt _SetOnloadFnc ( )
{
tt _AddEvtFnc ( document , "DOMContentLoaded" , tt _HideSrcTags ) ;
tt _AddEvtFnc ( window , "load" , tt _HideSrcTags ) ;
2014-04-20 03:06:48 +00:00
if ( tt _body . attachEvent ) {
2010-02-28 11:01:18 +00:00
tt _body . attachEvent ( "onreadystatechange" ,
function ( ) {
2014-04-20 03:06:48 +00:00
if ( tt _body . readyState === "complete" ) {
2010-02-28 11:01:18 +00:00
tt _HideSrcTags ( ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
} ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
if ( /WebKit|KHTML/i . test ( navigator . userAgent ) )
{
var t = setInterval ( function ( ) {
if ( /loaded|complete/ . test ( document . readyState ) )
{
clearInterval ( t ) ;
tt _HideSrcTags ( ) ;
}
} , 10 ) ;
}
}
function tt _HideSrcTags ( )
{
2014-04-20 03:06:48 +00:00
if ( ! window . tt _HideSrcTags || window . tt _HideSrcTags . done ) {
2010-02-28 11:01:18 +00:00
return ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
window . tt _HideSrcTags . done = true ;
2014-04-20 03:06:48 +00:00
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 ) ;
}
2010-02-28 11:01:18 +00:00
}
function tt _HideSrcTagsRecurs ( dad )
{
var ovr , asT2t ;
// Walk the DOM tree for tags that have an onmouseover or onclick attribute
// containing a TagToTip('...') call.
// (.childNodes first since .children is bugous in Safari)
var a = dad . childNodes || dad . children || null ;
for ( var i = a ? a . length : 0 ; i ; )
{ -- i ;
2014-04-20 03:06:48 +00:00
if ( ! tt _HideSrcTagsRecurs ( a [ i ] ) ) {
2010-02-28 11:01:18 +00:00
return false ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
ovr = a [ i ] . getAttribute ? ( a [ i ] . getAttribute ( "onmouseover" ) || a [ i ] . getAttribute ( "onclick" ) )
2014-04-20 03:06:48 +00:00
: ( typeof a [ i ] . onmouseover === "function" ) ? ( a [ i ] . onmouseover || a [ i ] . onclick )
2010-02-28 11:01:18 +00:00
: null ;
if ( ovr )
{
asT2t = ovr . toString ( ) . match ( /TagToTip\s*\(\s*'[^'.]+'\s*[\),]/ ) ;
if ( asT2t && asT2t . length )
{
2014-04-20 03:06:48 +00:00
if ( ! tt _HideSrcTag ( asT2t [ 0 ] ) ) {
2010-02-28 11:01:18 +00:00
return false ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
}
}
return true ;
}
function tt _HideSrcTag ( sT2t )
{
var id , el ;
// The ID passed to the found TagToTip() call identifies an HTML element
// to be converted to a tooltip, so hide that element
id = sT2t . replace ( /.+'([^'.]+)'.+/ , "$1" ) ;
el = tt _GetElt ( id ) ;
if ( el )
{
2014-04-20 03:06:48 +00:00
if ( tt _Debug && ! TagsToTip ) {
2010-02-28 11:01:18 +00:00
return false ;
2014-04-20 03:06:48 +00:00
} else {
2010-02-28 11:01:18 +00:00
el . style . display = "none" ;
2014-04-20 03:06:48 +00:00
}
}
else {
tt _Err ( "Invalid ID\n'" + id + "'\npassed to TagToTip(). There exists no HTML element with that ID." , true ) ;
2010-02-28 11:01:18 +00:00
}
return true ;
}
function tt _Tip ( arg , t2t )
{
2014-04-20 03:06:48 +00:00
if ( ! tt _db || ( tt _iState & 0x8 ) ) {
2010-02-28 11:01:18 +00:00
return ;
2014-04-20 03:06:48 +00:00
}
if ( tt _iState ) {
2010-02-28 11:01:18 +00:00
tt _Hide ( ) ;
2014-04-20 03:06:48 +00:00
}
if ( ! tt _Enabled ) {
2010-02-28 11:01:18 +00:00
return ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _t2t = t2t ;
2014-04-20 03:06:48 +00:00
if ( ! tt _ReadCmds ( arg ) ) {
2010-02-28 11:01:18 +00:00
return ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _iState = 0x1 | 0x4 ;
tt _AdaptConfig1 ( ) ;
tt _MkTipContent ( arg ) ;
tt _MkTipSubDivs ( ) ;
tt _FormatTip ( ) ;
tt _bJmpVert = false ;
tt _bJmpHorz = false ;
tt _maxPosX = tt _GetClientW ( ) + tt _GetScrollX ( ) - tt _w - 1 ;
tt _maxPosY = tt _GetClientH ( ) + tt _GetScrollY ( ) - tt _h - 1 ;
tt _AdaptConfig2 ( ) ;
// Ensure the tip be shown and positioned before the first onmousemove
tt _OverInit ( ) ;
tt _ShowInit ( ) ;
tt _Move ( ) ;
}
function tt _ReadCmds ( a )
{
var i ;
// First load the global config values, to initialize also values
// for which no command is passed
i = 0 ;
2014-04-20 03:06:48 +00:00
for ( var j in config ) {
2010-02-28 11:01:18 +00:00
tt _aV [ i ++ ] = config [ j ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
// 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 )
{
2014-04-20 03:06:48 +00:00
for ( i = a . length - 1 ; i > 0 ; i -= 2 ) {
2010-02-28 11:01:18 +00:00
tt _aV [ a [ i - 1 ] ] = a [ i ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
return true ;
}
2014-04-20 03:06:48 +00:00
tt _Err ( "Incorrect call of Tip() or TagToTip().\n Each command must be followed by a value." , true ) ;
2010-02-28 11:01:18 +00:00
return false ;
}
function tt _AdaptConfig1 ( )
{
tt _ExtCallFncs ( 0 , "LoadConfig" ) ;
// Inherit unspecified title formattings from body
2014-04-20 03:06:48 +00:00
if ( ! tt _aV [ TITLEBGCOLOR ] . length ) {
2010-02-28 11:01:18 +00:00
tt _aV [ TITLEBGCOLOR ] = tt _aV [ BORDERCOLOR ] ;
2014-04-20 03:06:48 +00:00
}
if ( ! tt _aV [ TITLEFONTCOLOR ] . length ) {
2010-02-28 11:01:18 +00:00
tt _aV [ TITLEFONTCOLOR ] = tt _aV [ BGCOLOR ] ;
2014-04-20 03:06:48 +00:00
}
if ( ! tt _aV [ TITLEFONTFACE ] . length ) {
2010-02-28 11:01:18 +00:00
tt _aV [ TITLEFONTFACE ] = tt _aV [ FONTFACE ] ;
2014-04-20 03:06:48 +00:00
}
if ( ! tt _aV [ TITLEFONTSIZE ] . length ) {
2010-02-28 11:01:18 +00:00
tt _aV [ TITLEFONTSIZE ] = tt _aV [ FONTSIZE ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
if ( tt _aV [ CLOSEBTN ] )
{
// Use title colours for non-specified closebutton colours
2014-04-20 03:06:48 +00:00
if ( ! tt _aV [ CLOSEBTNCOLORS ] ) {
2010-02-28 11:01:18 +00:00
tt _aV [ CLOSEBTNCOLORS ] = new Array ( "" , "" , "" , "" ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
for ( var i = 4 ; i ; )
{ -- i ;
2014-04-20 03:06:48 +00:00
if ( ! tt _aV [ CLOSEBTNCOLORS ] [ i ] . length ) {
2010-02-28 11:01:18 +00:00
tt _aV [ CLOSEBTNCOLORS ] [ i ] = ( i & 1 ) ? tt _aV [ TITLEFONTCOLOR ] : tt _aV [ TITLEBGCOLOR ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
// Enforce titlebar be shown
2014-04-20 03:06:48 +00:00
if ( ! tt _aV [ TITLE ] . length ) {
2010-02-28 11:01:18 +00:00
tt _aV [ TITLE ] = " " ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
// Circumvents broken display of images and fade-in flicker in Geckos < 1.8
2014-04-20 03:06:48 +00:00
if ( tt _aV [ OPACITY ] === 100 && typeof tt _aElt [ 0 ] . style . MozOpacity !== tt _u && ! Array . every ) {
2010-02-28 11:01:18 +00:00
tt _aV [ OPACITY ] = 99 ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
// Smartly shorten the delay for fade-in tooltips
2014-04-20 03:06:48 +00:00
if ( tt _aV [ FADEIN ] && tt _flagOpa && tt _aV [ DELAY ] > 100 ) {
2010-02-28 11:01:18 +00:00
tt _aV [ DELAY ] = Math . max ( tt _aV [ DELAY ] - tt _aV [ FADEIN ] , 100 ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
function tt _AdaptConfig2 ( )
{
if ( tt _aV [ CENTERMOUSE ] )
{
tt _aV [ OFFSETX ] -= ( ( tt _w - ( tt _aV [ SHADOW ] ? tt _aV [ SHADOWWIDTH ] : 0 ) ) >> 1 ) ;
tt _aV [ JUMPHORZ ] = false ;
}
}
// Expose content globally so extensions can modify it
function tt _MkTipContent ( a )
{
if ( tt _t2t )
{
2014-04-20 03:06:48 +00:00
if ( tt _aV [ COPYCONTENT ] ) {
2010-02-28 11:01:18 +00:00
tt _sContent = tt _t2t . innerHTML ;
2014-04-20 03:06:48 +00:00
} else {
2010-02-28 11:01:18 +00:00
tt _sContent = "" ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
2014-04-20 03:06:48 +00:00
else {
2010-02-28 11:01:18 +00:00
tt _sContent = a [ 0 ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _ExtCallFncs ( 0 , "CreateContentString" ) ;
}
function tt _MkTipSubDivs ( )
{
var sCss = 'position:relative;margin:0px;padding:0px;border-width:0px;left:0px;top:0px;line-height:normal;width:auto;' ,
sTbTrTd = ' cellspacing="0" cellpadding="0" border="0" style="' + sCss + '"><tbody style="' + sCss + '"><tr><td ' ;
tt _aElt [ 0 ] . style . width = tt _GetClientW ( ) + "px" ;
tt _aElt [ 0 ] . innerHTML =
2014-04-20 03:06:48 +00:00
( '' +
( tt _aV [ TITLE ] . length ?
( '<div id="WzTiTl" style="position:relative;z-index:1;">' +
'<table id="WzTiTlTb"' + sTbTrTd + 'id="WzTiTlI" style="' + sCss + '">' +
tt _aV [ TITLE ] +
'</td>' +
( tt _aV [ CLOSEBTN ] ?
( '<td align="right" style="' + sCss + 'text-align:right;">' +
'<span id="WzClOsE" style="position:relative;left:2px;padding-left:2px;padding-right:2px;' +
'cursor:' + ( tt _ie ? 'hand' : 'pointer' ) +
';" onmouseover="tt_OnCloseBtnOver(1)" onmouseout="tt_OnCloseBtnOver(0)" onclick="tt_HideInit()">' +
tt _aV [ CLOSEBTNTEXT ] +
'</span></td>' )
: '' ) +
'</tr></tbody></table></div>' )
: '' ) +
'<div id="WzBoDy" style="position:relative;z-index:0;">' +
'<table' + sTbTrTd + 'id="WzBoDyI" style="' + sCss + '">' +
tt _sContent +
'</td></tr></tbody></table></div>' +
( tt _aV [ SHADOW ] ?
( '<div id="WzTtShDwR" style="position:absolute;overflow:hidden;"></div>' +
'<div id="WzTtShDwB" style="position:relative;overflow:hidden;"></div>' )
2010-02-28 11:01:18 +00:00
: '' )
) ;
tt _GetSubDivRefs ( ) ;
// Convert DOM node to tip
2014-04-20 03:06:48 +00:00
if ( tt _t2t && ! tt _aV [ COPYCONTENT ] ) {
2010-02-28 11:01:18 +00:00
tt _El2Tip ( ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _ExtCallFncs ( 0 , "SubDivsCreated" ) ;
}
function tt _GetSubDivRefs ( )
{
var aId = new Array ( "WzTiTl" , "WzTiTlTb" , "WzTiTlI" , "WzClOsE" , "WzBoDy" , "WzBoDyI" , "WzTtShDwB" , "WzTtShDwR" ) ;
2014-04-20 03:06:48 +00:00
for ( var i = aId . length ; i ; -- i ) {
2010-02-28 11:01:18 +00:00
tt _aElt [ i ] = tt _GetElt ( aId [ i - 1 ] ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
function tt _FormatTip ( )
{
var css , w , h , pad = tt _aV [ PADDING ] , padT , wBrd = tt _aV [ BORDERWIDTH ] ,
iOffY , iOffSh , iAdd = ( pad + wBrd ) << 1 ;
//--------- Title DIV ----------
if ( tt _aV [ TITLE ] . length )
{
padT = tt _aV [ TITLEPADDING ] ;
css = tt _aElt [ 1 ] . style ;
css . background = tt _aV [ TITLEBGCOLOR ] ;
css . paddingTop = css . paddingBottom = padT + "px" ;
css . paddingLeft = css . paddingRight = ( padT + 2 ) + "px" ;
css = tt _aElt [ 3 ] . style ;
css . color = tt _aV [ TITLEFONTCOLOR ] ;
2014-04-20 03:06:48 +00:00
if ( tt _aV [ WIDTH ] === - 1 ) {
2010-02-28 11:01:18 +00:00
css . whiteSpace = "nowrap" ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
css . fontFamily = tt _aV [ TITLEFONTFACE ] ;
css . fontSize = tt _aV [ TITLEFONTSIZE ] ;
css . fontWeight = "bold" ;
css . textAlign = tt _aV [ TITLEALIGN ] ;
// Close button DIV
if ( tt _aElt [ 4 ] )
{
css = tt _aElt [ 4 ] . style ;
css . background = tt _aV [ CLOSEBTNCOLORS ] [ 0 ] ;
css . color = tt _aV [ CLOSEBTNCOLORS ] [ 1 ] ;
css . fontFamily = tt _aV [ TITLEFONTFACE ] ;
css . fontSize = tt _aV [ TITLEFONTSIZE ] ;
css . fontWeight = "bold" ;
}
2014-04-20 03:06:48 +00:00
if ( tt _aV [ WIDTH ] > 0 ) {
2010-02-28 11:01:18 +00:00
tt _w = tt _aV [ WIDTH ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
else
{
tt _w = tt _GetDivW ( tt _aElt [ 3 ] ) + tt _GetDivW ( tt _aElt [ 4 ] ) ;
// Some spacing between title DIV and closebutton
2014-04-20 03:06:48 +00:00
if ( tt _aElt [ 4 ] ) {
2010-02-28 11:01:18 +00:00
tt _w += pad ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
// Restrict auto width to max width
2014-04-20 03:06:48 +00:00
if ( tt _aV [ WIDTH ] < - 1 && tt _w > - tt _aV [ WIDTH ] ) {
2010-02-28 11:01:18 +00:00
tt _w = - tt _aV [ WIDTH ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
// Ensure the top border of the body DIV be covered by the title DIV
iOffY = - wBrd ;
}
else
{
tt _w = 0 ;
iOffY = 0 ;
}
//-------- Body DIV ------------
css = tt _aElt [ 5 ] . style ;
css . top = iOffY + "px" ;
if ( wBrd )
{
css . borderColor = tt _aV [ BORDERCOLOR ] ;
css . borderStyle = tt _aV [ BORDERSTYLE ] ;
css . borderWidth = wBrd + "px" ;
}
2014-04-20 03:06:48 +00:00
if ( tt _aV [ BGCOLOR ] . length ) {
2010-02-28 11:01:18 +00:00
css . background = tt _aV [ BGCOLOR ] ;
2014-04-20 03:06:48 +00:00
}
if ( tt _aV [ BGIMG ] . length ) {
2010-02-28 11:01:18 +00:00
css . backgroundImage = "url(" + tt _aV [ BGIMG ] + ")" ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
css . padding = pad + "px" ;
css . textAlign = tt _aV [ TEXTALIGN ] ;
if ( tt _aV [ HEIGHT ] )
{
css . overflow = "auto" ;
2014-04-20 03:06:48 +00:00
if ( tt _aV [ HEIGHT ] > 0 ) {
2010-02-28 11:01:18 +00:00
css . height = ( tt _aV [ HEIGHT ] + iAdd ) + "px" ;
2014-04-20 03:06:48 +00:00
} else {
2010-02-28 11:01:18 +00:00
tt _h = iAdd - tt _aV [ HEIGHT ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
// TD inside body DIV
css = tt _aElt [ 6 ] . style ;
css . color = tt _aV [ FONTCOLOR ] ;
css . fontFamily = tt _aV [ FONTFACE ] ;
css . fontSize = tt _aV [ FONTSIZE ] ;
css . fontWeight = tt _aV [ FONTWEIGHT ] ;
css . textAlign = tt _aV [ TEXTALIGN ] ;
2014-04-20 03:06:48 +00:00
if ( tt _aV [ WIDTH ] > 0 ) {
2010-02-28 11:01:18 +00:00
w = tt _aV [ WIDTH ] ;
// Width like title (if existent)
2014-04-20 03:06:48 +00:00
} else if ( tt _aV [ WIDTH ] === - 1 && tt _w ) {
2010-02-28 11:01:18 +00:00
w = tt _w ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
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
2014-04-20 03:06:48 +00:00
if ( tt _aV [ WIDTH ] < - 1 && w > - tt _aV [ WIDTH ] ) {
2010-02-28 11:01:18 +00:00
w = - tt _aV [ WIDTH ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
2014-04-20 03:06:48 +00:00
if ( w > tt _w ) {
2010-02-28 11:01:18 +00:00
tt _w = w ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _w += iAdd ;
//--------- Shadow DIVs ------------
if ( tt _aV [ SHADOW ] )
{
tt _w += tt _aV [ SHADOWWIDTH ] ;
iOffSh = Math . floor ( ( tt _aV [ SHADOWWIDTH ] * 4 ) / 3 ) ;
// Bottom shadow
css = tt _aElt [ 7 ] . style ;
css . top = iOffY + "px" ;
css . left = iOffSh + "px" ;
css . width = ( tt _w - iOffSh - tt _aV [ SHADOWWIDTH ] ) + "px" ;
css . height = tt _aV [ SHADOWWIDTH ] + "px" ;
css . background = tt _aV [ SHADOWCOLOR ] ;
// Right shadow
css = tt _aElt [ 8 ] . style ;
css . top = iOffSh + "px" ;
css . left = ( tt _w - tt _aV [ SHADOWWIDTH ] ) + "px" ;
css . width = tt _aV [ SHADOWWIDTH ] + "px" ;
css . background = tt _aV [ SHADOWCOLOR ] ;
}
2014-04-20 03:06:48 +00:00
else {
2010-02-28 11:01:18 +00:00
iOffSh = 0 ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
//-------- Container DIV -------
tt _SetTipOpa ( tt _aV [ FADEIN ] ? 0 : tt _aV [ OPACITY ] ) ;
tt _FixSize ( iOffY , iOffSh ) ;
}
// Fixate the size so it can't dynamically change while the tooltip is moving.
function tt _FixSize ( iOffY , iOffSh )
{
var wIn , wOut , h , add , pad = tt _aV [ PADDING ] , wBrd = tt _aV [ BORDERWIDTH ] , i ;
tt _aElt [ 0 ] . style . width = tt _w + "px" ;
tt _aElt [ 0 ] . style . pixelWidth = tt _w ;
wOut = tt _w - ( ( tt _aV [ SHADOW ] ) ? tt _aV [ SHADOWWIDTH ] : 0 ) ;
// Body
wIn = wOut ;
2014-04-20 03:06:48 +00:00
if ( ! tt _bBoxOld ) {
2010-02-28 11:01:18 +00:00
wIn -= ( pad + wBrd ) << 1 ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _aElt [ 5 ] . style . width = wIn + "px" ;
// Title
if ( tt _aElt [ 1 ] )
{
wIn = wOut - ( ( tt _aV [ TITLEPADDING ] + 2 ) << 1 ) ;
2014-04-20 03:06:48 +00:00
if ( ! tt _bBoxOld ) {
2010-02-28 11:01:18 +00:00
wOut = wIn ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _aElt [ 1 ] . style . width = wOut + "px" ;
tt _aElt [ 2 ] . style . width = wIn + "px" ;
}
// Max height specified
if ( tt _h )
{
h = tt _GetDivH ( tt _aElt [ 5 ] ) ;
if ( h > tt _h )
{
2014-04-20 03:06:48 +00:00
if ( ! tt _bBoxOld ) {
2010-02-28 11:01:18 +00:00
tt _h -= ( pad + wBrd ) << 1 ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _aElt [ 5 ] . style . height = tt _h + "px" ;
}
}
tt _h = tt _GetDivH ( tt _aElt [ 0 ] ) + iOffY ;
// Right shadow
2014-04-20 03:06:48 +00:00
if ( tt _aElt [ 8 ] ) {
2010-02-28 11:01:18 +00:00
tt _aElt [ 8 ] . style . height = ( tt _h - iOffSh ) + "px" ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
i = tt _aElt . length - 1 ;
if ( tt _aElt [ i ] )
{
tt _aElt [ i ] . style . width = tt _w + "px" ;
tt _aElt [ i ] . style . height = tt _h + "px" ;
}
}
function tt _DeAlt ( el )
{
var aKid ;
if ( el )
{
2014-04-20 03:06:48 +00:00
if ( el . alt ) {
2010-02-28 11:01:18 +00:00
el . alt = "" ;
2014-04-20 03:06:48 +00:00
}
if ( el . title ) {
2010-02-28 11:01:18 +00:00
el . title = "" ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
aKid = el . childNodes || el . children || null ;
if ( aKid )
{
2014-04-20 03:06:48 +00:00
for ( var i = aKid . length ; i ; ) {
2010-02-28 11:01:18 +00:00
tt _DeAlt ( aKid [ -- i ] ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
}
}
// This hack removes the native tooltips over links in Opera
function tt _OpDeHref ( el )
{
2014-04-20 03:06:48 +00:00
if ( ! tt _op ) {
2010-02-28 11:01:18 +00:00
return ;
2014-04-20 03:06:48 +00:00
}
if ( tt _elDeHref ) {
2010-02-28 11:01:18 +00:00
tt _OpReHref ( ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
while ( el )
{
if ( el . hasAttribute && el . hasAttribute ( "href" ) )
{
el . t _href = el . getAttribute ( "href" ) ;
el . t _stats = window . status ;
el . removeAttribute ( "href" ) ;
el . style . cursor = "hand" ;
tt _AddEvtFnc ( el , "mousedown" , tt _OpReHref ) ;
window . status = el . t _href ;
tt _elDeHref = el ;
break ;
}
el = tt _GetDad ( el ) ;
}
}
function tt _OpReHref ( )
{
if ( tt _elDeHref )
{
tt _elDeHref . setAttribute ( "href" , tt _elDeHref . t _href ) ;
tt _RemEvtFnc ( tt _elDeHref , "mousedown" , tt _OpReHref ) ;
window . status = tt _elDeHref . t _stats ;
tt _elDeHref = null ;
}
}
function tt _El2Tip ( )
{
var css = tt _t2t . style ;
// Store previous positioning
tt _t2t . t _cp = css . position ;
tt _t2t . t _cl = css . left ;
tt _t2t . t _ct = css . top ;
tt _t2t . t _cd = css . display ;
// Store the tag's parent element so we can restore that DOM branch
// when the tooltip is being hidden
tt _t2tDad = tt _GetDad ( tt _t2t ) ;
tt _MovDomNode ( tt _t2t , tt _t2tDad , tt _aElt [ 6 ] ) ;
css . display = "block" ;
css . position = "static" ;
css . left = css . top = css . marginLeft = css . marginTop = "0px" ;
}
function tt _UnEl2Tip ( )
{
// Restore positioning and display
var css = tt _t2t . style ;
css . display = tt _t2t . t _cd ;
tt _MovDomNode ( tt _t2t , tt _GetDad ( tt _t2t ) , tt _t2tDad ) ;
css . position = tt _t2t . t _cp ;
css . left = tt _t2t . t _cl ;
css . top = tt _t2t . t _ct ;
tt _t2tDad = null ;
}
function tt _OverInit ( )
{
2014-04-20 03:06:48 +00:00
if ( window . event ) {
2010-02-28 11:01:18 +00:00
tt _over = window . event . target || window . event . srcElement ;
2014-04-20 03:06:48 +00:00
} else {
2010-02-28 11:01:18 +00:00
tt _over = tt _ovr _ ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _DeAlt ( tt _over ) ;
tt _OpDeHref ( tt _over ) ;
}
function tt _ShowInit ( )
{
tt _tShow . Timer ( "tt_Show()" , tt _aV [ DELAY ] , true ) ;
2014-04-20 03:06:48 +00:00
if ( tt _aV [ CLICKCLOSE ] || tt _aV [ CLICKSTICKY ] ) {
2010-02-28 11:01:18 +00:00
tt _AddEvtFnc ( document , "mouseup" , tt _OnLClick ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
function tt _Show ( )
{
var css = tt _aElt [ 0 ] . style ;
// 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 ) ;
2014-04-20 03:06:48 +00:00
if ( tt _aV [ STICKY ] || ! tt _aV [ FOLLOWMOUSE ] ) {
2010-02-28 11:01:18 +00:00
tt _iState &= ~ 0x4 ;
2014-04-20 03:06:48 +00:00
}
if ( tt _aV [ EXCLUSIVE ] ) {
2010-02-28 11:01:18 +00:00
tt _iState |= 0x8 ;
2014-04-20 03:06:48 +00:00
}
if ( tt _aV [ DURATION ] > 0 ) {
2010-02-28 11:01:18 +00:00
tt _tDurt . Timer ( "tt_HideInit()" , tt _aV [ DURATION ] , true ) ;
2014-04-20 03:06:48 +00:00
}
tt _ExtCallFncs ( 0 , "Show" ) ;
2010-02-28 11:01:18 +00:00
css . visibility = "visible" ;
tt _iState |= 0x2 ;
2014-04-20 03:06:48 +00:00
if ( tt _aV [ FADEIN ] ) {
2010-02-28 11:01:18 +00:00
tt _Fade ( 0 , 0 , tt _aV [ OPACITY ] , Math . round ( tt _aV [ FADEIN ] / tt _aV [ FADEINTERVAL ] ) ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _ShowIfrm ( ) ;
}
function tt _ShowIfrm ( )
{
if ( tt _ie56 )
{
var ifrm = tt _aElt [ tt _aElt . length - 1 ] ;
if ( ifrm )
{
var css = ifrm . style ;
css . zIndex = tt _aElt [ 0 ] . style . zIndex - 1 ;
css . display = "block" ;
}
}
}
function tt _Move ( e )
{
2014-04-20 03:06:48 +00:00
if ( e ) {
2010-02-28 11:01:18 +00:00
tt _ovr _ = e . target || e . srcElement ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
e = e || window . event ;
if ( e )
{
tt _musX = tt _GetEvtX ( e ) ;
tt _musY = tt _GetEvtY ( e ) ;
}
if ( tt _iState & 0x4 )
{
// Prevent jam of mousemove events
if ( ! tt _op && ! tt _ie )
{
2014-04-20 03:06:48 +00:00
if ( tt _bWait ) {
2010-02-28 11:01:18 +00:00
return ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _bWait = true ;
tt _tWaitMov . Timer ( "tt_bWait = false;" , 1 , true ) ;
}
if ( tt _aV [ FIX ] )
{
tt _iState &= ~ 0x4 ;
tt _PosFix ( ) ;
}
2014-04-20 03:06:48 +00:00
else if ( ! tt _ExtCallFncs ( e , "MoveBefore" ) ) {
2010-02-28 11:01:18 +00:00
tt _SetTipPos ( tt _Pos ( 0 ) , tt _Pos ( 1 ) ) ;
2014-04-20 03:06:48 +00:00
}
tt _ExtCallFncs ( [ tt _musX , tt _musY ] , "MoveAfter" ) ;
2010-02-28 11:01:18 +00:00
}
}
function tt _Pos ( iDim )
{
var iX , bJmpMod , cmdAlt , cmdOff , cx , iMax , iScrl , iMus , bJmp ;
// Map values according to dimension to calculate
if ( iDim )
{
bJmpMod = tt _aV [ JUMPVERT ] ;
cmdAlt = ABOVE ;
cmdOff = OFFSETY ;
cx = tt _h ;
iMax = tt _maxPosY ;
iScrl = tt _GetScrollY ( ) ;
iMus = tt _musY ;
bJmp = tt _bJmpVert ;
}
else
{
bJmpMod = tt _aV [ JUMPHORZ ] ;
cmdAlt = LEFT ;
cmdOff = OFFSETX ;
cx = tt _w ;
iMax = tt _maxPosX ;
iScrl = tt _GetScrollX ( ) ;
iMus = tt _musX ;
bJmp = tt _bJmpHorz ;
}
if ( bJmpMod )
{
2014-04-20 03:06:48 +00:00
if ( tt _aV [ cmdAlt ] && ( ! bJmp || tt _CalcPosAlt ( iDim ) >= iScrl + 16 ) ) {
2010-02-28 11:01:18 +00:00
iX = tt _PosAlt ( iDim ) ;
2014-04-20 03:06:48 +00:00
}
else if ( ! tt _aV [ cmdAlt ] && bJmp && tt _CalcPosDef ( iDim ) > iMax - 16 ) {
2010-02-28 11:01:18 +00:00
iX = tt _PosAlt ( iDim ) ;
2014-04-20 03:06:48 +00:00
} else {
2010-02-28 11:01:18 +00:00
iX = tt _PosDef ( iDim ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
else
{
iX = iMus ;
2014-04-20 03:06:48 +00:00
if ( tt _aV [ cmdAlt ] ) {
2010-02-28 11:01:18 +00:00
iX -= cx + tt _aV [ cmdOff ] - ( tt _aV [ SHADOW ] ? tt _aV [ SHADOWWIDTH ] : 0 ) ;
2014-04-20 03:06:48 +00:00
}
else {
2010-02-28 11:01:18 +00:00
iX += tt _aV [ cmdOff ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
// Prevent tip from extending past clientarea boundary
2014-04-20 03:06:48 +00:00
if ( iX > iMax ) {
2010-02-28 11:01:18 +00:00
iX = bJmpMod ? tt _PosAlt ( iDim ) : iMax ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
// In case of insufficient space on both sides, ensure the left/upper part
// of the tip be visible
2014-04-20 03:06:48 +00:00
if ( iX < iScrl ) {
2010-02-28 11:01:18 +00:00
iX = bJmpMod ? tt _PosDef ( iDim ) : iScrl ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
return iX ;
}
function tt _PosDef ( iDim )
{
2014-04-20 03:06:48 +00:00
if ( iDim ) {
2010-02-28 11:01:18 +00:00
tt _bJmpVert = tt _aV [ ABOVE ] ;
2014-04-20 03:06:48 +00:00
}
else {
2010-02-28 11:01:18 +00:00
tt _bJmpHorz = tt _aV [ LEFT ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
return tt _CalcPosDef ( iDim ) ;
}
function tt _PosAlt ( iDim )
{
2014-04-20 03:06:48 +00:00
if ( iDim ) {
2010-02-28 11:01:18 +00:00
tt _bJmpVert = ! tt _aV [ ABOVE ] ;
2014-04-20 03:06:48 +00:00
}
else {
2010-02-28 11:01:18 +00:00
tt _bJmpHorz = ! tt _aV [ LEFT ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
return tt _CalcPosAlt ( iDim ) ;
}
function tt _CalcPosDef ( iDim )
{
return iDim ? ( tt _musY + tt _aV [ OFFSETY ] ) : ( tt _musX + tt _aV [ OFFSETX ] ) ;
}
function tt _CalcPosAlt ( iDim )
{
var cmdOff = iDim ? OFFSETY : OFFSETX ;
var dx = tt _aV [ cmdOff ] - ( tt _aV [ SHADOW ] ? tt _aV [ SHADOWWIDTH ] : 0 ) ;
2014-04-20 03:06:48 +00:00
if ( tt _aV [ cmdOff ] > 0 && dx <= 0 ) {
2010-02-28 11:01:18 +00:00
dx = 1 ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
return ( ( iDim ? ( tt _musY - tt _h ) : ( tt _musX - tt _w ) ) - dx ) ;
}
function tt _PosFix ( )
{
var iX , iY ;
2014-04-20 03:06:48 +00:00
if ( typeof ( tt _aV [ FIX ] [ 0 ] ) === "number" )
2010-02-28 11:01:18 +00:00
{
iX = tt _aV [ FIX ] [ 0 ] ;
iY = tt _aV [ FIX ] [ 1 ] ;
}
else
{
2014-04-20 03:06:48 +00:00
if ( typeof ( tt _aV [ FIX ] [ 0 ] ) === "string" ) {
2010-02-28 11:01:18 +00:00
el = tt _GetElt ( tt _aV [ FIX ] [ 0 ] ) ;
// First slot in array is direct reference to HTML element
2014-04-20 03:06:48 +00:00
} else {
2010-02-28 11:01:18 +00:00
el = tt _aV [ FIX ] [ 0 ] ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
iX = tt _aV [ FIX ] [ 1 ] ;
iY = tt _aV [ FIX ] [ 2 ] ;
// By default, vert pos is related to bottom edge of HTML element
2014-04-20 03:06:48 +00:00
if ( ! tt _aV [ ABOVE ] && el ) {
2010-02-28 11:01:18 +00:00
iY += tt _GetDivH ( el ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
for ( ; el ; el = el . offsetParent )
{
iX += el . offsetLeft || 0 ;
iY += el . offsetTop || 0 ;
}
}
// For a fixed tip positioned above the mouse, use the bottom edge as anchor
// (recommended by Christophe Rebeschini, 31.1.2008)
2014-04-20 03:06:48 +00:00
if ( tt _aV [ ABOVE ] ) {
2010-02-28 11:01:18 +00:00
iY -= tt _h ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
tt _SetTipPos ( iX , iY ) ;
}
function tt _Fade ( a , now , z , n )
{
if ( n )
{
now += Math . round ( ( z - now ) / n ) ;
2014-04-20 03:06:48 +00:00
if ( ( z > a ) ? ( now >= z ) : ( now <= z ) ) {
2010-02-28 11:01:18 +00:00
now = z ;
2014-04-20 03:06:48 +00:00
} else {
tt _tFade . Timer ( "tt_Fade(" + a + "," + now + "," + z + "," + ( n - 1 ) + ")" , tt _aV [ FADEINTERVAL ] , true ) ;
}
}
if ( now ) {
tt _SetTipOpa ( now ) ;
} else {
tt _Hide ( ) ;
2010-02-28 11:01:18 +00:00
}
}
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 ) ;
2014-04-20 03:06:48 +00:00
if ( tt _aElt [ 1 ] ) {
2010-02-28 11:01:18 +00:00
tt _SetOpa ( tt _aElt [ 1 ] , opa ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
if ( tt _aV [ SHADOW ] )
{
opa = Math . round ( opa * 0.8 ) ;
tt _SetOpa ( tt _aElt [ 7 ] , opa ) ;
tt _SetOpa ( tt _aElt [ 8 ] , opa ) ;
}
}
function tt _OnCloseBtnOver ( iOver )
{
var css = tt _aElt [ 4 ] . style ;
iOver <<= 1 ;
css . background = tt _aV [ CLOSEBTNCOLORS ] [ iOver ] ;
css . color = tt _aV [ CLOSEBTNCOLORS ] [ iOver + 1 ] ;
}
function tt _OnLClick ( e )
{
// Ignore right-clicks
e = e || window . event ;
2014-04-20 03:06:48 +00:00
if ( ! ( ( e . button && e . button & 2 ) || ( e . which && e . which === 3 ) ) )
2010-02-28 11:01:18 +00:00
{
if ( tt _aV [ CLICKSTICKY ] && ( tt _iState & 0x4 ) )
{
tt _aV [ STICKY ] = true ;
tt _iState &= ~ 0x4 ;
}
2014-04-20 03:06:48 +00:00
else if ( tt _aV [ CLICKCLOSE ] ) {
2010-02-28 11:01:18 +00:00
tt _HideInit ( ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
}
function tt _Int ( x )
{
var y ;
return ( isNaN ( y = parseInt ( x ) ) ? 0 : y ) ;
}
Number . prototype . Timer = function ( s , iT , bUrge )
{
2014-04-20 03:06:48 +00:00
if ( ! this . value || bUrge ) {
2010-02-28 11:01:18 +00:00
this . value = window . setTimeout ( s , iT ) ;
2014-04-20 03:06:48 +00:00
}
} ;
2010-02-28 11:01:18 +00:00
Number . prototype . EndTimer = function ( )
{
if ( this . value )
{
window . clearTimeout ( this . value ) ;
this . value = 0 ;
}
2014-04-20 03:06:48 +00:00
} ;
2010-02-28 11:01:18 +00:00
function tt _GetWndCliSiz ( s )
{
var db , y = window [ "inner" + s ] , sC = "client" + s , sN = "number" ;
2014-04-20 03:06:48 +00:00
if ( typeof y === sN )
2010-02-28 11:01:18 +00:00
{
var y2 ;
return (
// Gecko or Opera with scrollbar
// ... quirks mode
2014-04-20 03:06:48 +00:00
( ( db = document . body ) && typeof ( y2 = db [ sC ] ) === sN && y2 && y2 <= y ) ? y2
2010-02-28 11:01:18 +00:00
// ... strict mode
2014-04-20 03:06:48 +00:00
: ( ( db = document . documentElement ) && typeof ( y2 = db [ sC ] ) === sN && y2 && y2 <= y ) ? y2
2010-02-28 11:01:18 +00:00
// No scrollbar, or clientarea size == 0, or other browser (KHTML etc.)
: y
) ;
}
// IE
return (
// document.documentElement.client+s functional, returns > 0
( ( db = document . documentElement ) && ( y = db [ sC ] ) ) ? y
2020-03-13 09:23:54 +00:00
// ... not functional, in which case document.body.client+s
2010-02-28 11:01:18 +00:00
// is the clientarea size, fortunately
: document . body [ sC ]
) ;
}
function tt _SetOpa ( el , opa )
{
var css = el . style ;
tt _opa = opa ;
2014-04-20 03:06:48 +00:00
if ( tt _flagOpa === 1 )
2010-02-28 11:01:18 +00:00
{
if ( opa < 100 )
{
// Hacks for bugs of IE:
// 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
2014-04-20 03:06:48 +00:00
if ( typeof ( el . filtNo ) === tt _u ) {
2010-02-28 11:01:18 +00:00
el . filtNo = css . filter ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
// 2.) A DIV cannot be made visible in a single step if an
// opacity < 100 has been applied while the DIV was hidden
2014-04-20 03:06:48 +00:00
var bVis = css . visibility !== "hidden" ;
2010-02-28 11:01:18 +00:00
// 3.) In IE6, applying an opacity < 100 has no effect if the
2014-04-20 03:06:48 +00:00
// element has no layout (position, size, zoom, ...)
2010-02-28 11:01:18 +00:00
css . zoom = "100%" ;
2014-04-20 03:06:48 +00:00
if ( ! bVis ) {
2010-02-28 11:01:18 +00:00
css . visibility = "visible" ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
css . filter = "alpha(opacity=" + opa + ")" ;
2014-04-20 03:06:48 +00:00
if ( ! bVis ) {
2010-02-28 11:01:18 +00:00
css . visibility = "hidden" ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
2014-04-20 03:06:48 +00:00
else if ( typeof ( el . filtNo ) !== tt _u ) {
2010-02-28 11:01:18 +00:00
// Restore 'non-filter'
css . filter = el . filtNo ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
else
{
opa /= 100.0 ;
switch ( tt _flagOpa )
{
case 2 :
css . KhtmlOpacity = opa ; break ;
case 3 :
css . KHTMLOpacity = opa ; break ;
case 4 :
css . MozOpacity = opa ; break ;
case 5 :
css . opacity = opa ; break ;
}
}
}
function tt _Err ( sErr , bIfDebug )
{
2014-04-20 03:06:48 +00:00
if ( tt _Debug || ! bIfDebug ) {
2010-02-28 11:01:18 +00:00
alert ( "Tooltip Script Error Message:\n\n" + sErr ) ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
//============ EXTENSION (PLUGIN) MANAGER ===============//
function tt _ExtCmdEnum ( )
{
var s ;
// Add new command(s) to the commands enum
for ( var i in config )
{
s = "window." + i . toString ( ) . toUpperCase ( ) ;
if ( eval ( "typeof(" + s + ") == tt_u" ) )
{
eval ( s + " = " + tt _aV . length ) ;
tt _aV [ tt _aV . length ] = null ;
}
}
}
function tt _ExtCallFncs ( arg , sFnc )
{
var b = false ;
for ( var i = tt _aExt . length ; i ; )
{ -- i ;
var fnc = tt _aExt [ i ] [ "On" + sFnc ] ;
// Call the method the extension has defined for this event
2014-04-20 03:06:48 +00:00
if ( fnc && fnc ( arg ) ) {
2010-02-28 11:01:18 +00:00
b = true ;
2014-04-20 03:06:48 +00:00
}
2010-02-28 11:01:18 +00:00
}
return b ;
}
tt _Init ( ) ;