2007-01-31 23:34:31 +01: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 .
2010-01-17 04:20:45 +01:00
Copyright ( c ) 2002 - 2008 Walter Zorn . All rights reserved .
2007-01-31 23:34:31 +01:00
2010-01-17 04:20:45 +01:00
wz _tooltip . js v . 5.31
2007-01-31 23:34:31 +01:00
The latest version is available at
http : //www.walterzorn.com
or http : //www.devira.com
or http : //www.walterzorn.de
2010-01-17 04:20:45 +01:00
Created 1.12 . 2002 by Walter Zorn ( Web : http : //www.walterzorn.com )
Last modified : 7.11 . 2008
2007-01-31 23:34:31 +01:00
2010-01-17 04:20:45 +01:00
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 ( ) .
2007-01-31 23:34:31 +01:00
2010-01-17 04:20:45 +01:00
Tab Width : 4
2007-01-31 23:34:31 +01:00
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
* /
2010-01-17 04:20:45 +01:00
var config = new Object ( ) ;
2007-01-31 23:34:31 +01:00
2010-01-17 04:20:45 +01:00
//=================== 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;
// 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)"
config . Above = false // false or true - tooltip above mousepointer
config . BgColor = 'lightyellow' // Background colour (HTML colour value, in quotes)
config . BgImg = '' // Path to background image, none if empty string ''
config . BorderColor = '#606060'
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 = '#000000'
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
2010-02-02 12:37:49 +01:00
config . Width = 300 // Tooltip width; 0 for automatic adaption to tooltip content; < -1 (e.g. -240) for a maximum width for that automatic adaption;
2010-01-17 04:20:45 +01: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 ] ) ;
if ( t2t )
tt _Tip ( arguments , t2t ) ;
}
function UnTip ( )
{
tt _OpReHref ( ) ;
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 ) ) )
tt _HideInit ( ) ;
}
//================== 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 _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 )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
ifrm . style . left = css . left ;
ifrm . style . top = css . top ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
}
}
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 )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
tt _tWaitMov . EndTimer ( ) ;
tt _bWait = false ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
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 ] )
tt _UnEl2Tip ( ) ;
tt _iState = 0 ;
tt _over = null ;
tt _ResetMainDiv ( ) ;
if ( tt _aElt [ tt _aElt . length - 1 ] )
tt _aElt [ tt _aElt . length - 1 ] . style . display = "none" ;
2007-01-31 23:34:31 +01:00
}
}
2010-01-17 04:20:45 +01:00
function tt _GetElt ( id )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
return ( document . getElementById ? document . getElementById ( id )
: document . all ? document . all [ id ]
: null ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _GetDivW ( el )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
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 )
{
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 ) ;
}
function tt _AddEvtFnc ( el , sEvt , PFnc )
{
if ( el )
{
if ( el . addEventListener )
el . addEventListener ( sEvt , PFnc , false ) ;
else
el . attachEvent ( "on" + sEvt , PFnc ) ;
}
}
function tt _RemEvtFnc ( el , sEvt , PFnc )
{
if ( el )
{
if ( el . removeEventListener )
el . removeEventListener ( sEvt , PFnc , false ) ;
else
el . detachEvent ( "on" + sEvt , PFnc ) ;
}
}
function tt _GetDad ( el )
{
return ( el . parentNode || el . parentElement || el . offsetParent ) ;
}
function tt _MovDomNode ( el , dadFrom , dadTo )
{
if ( dadFrom )
dadFrom . removeChild ( el ) ;
if ( dadTo )
dadTo . appendChild ( el ) ;
}
//====================== PRIVATE ===========================================//
var tt _aExt = new Array ( ) , // 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
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
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" ;
2007-01-31 23:34:31 +01:00
2010-01-17 04:20:45 +01:00
function tt _Init ( )
{
tt _MkCmdEnum ( ) ;
// Send old browsers instantly to hell
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 )
tt _SetOnloadFnc ( ) ;
// 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 ;
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 ( ) ,
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 ;
if ( tt _ie )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
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 ;
2007-01-31 23:34:31 +01:00
}
else
{
2010-01-17 04:20:45 +01:00
tt _db = document . documentElement || document . body ||
( document . getElementsByTagName ? document . getElementsByTagName ( "body" ) [ 0 ]
: null ) ;
if ( ! tt _op )
{
n6 = document . defaultView && typeof document . defaultView . getComputedStyle != tt _u ;
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 )
{
if ( document . attachEvent || document . addEventListener )
return true ;
}
else
tt _Err ( "wz_tooltip.js must be included INSIDE the body section,"
+ " immediately after the opening <body> tag." , false ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
tt _db = null ;
return false ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _MkMainDiv ( )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
// Create the tooltip DIV
if ( tt _body . insertAdjacentHTML )
tt _body . insertAdjacentHTML ( "afterBegin" , tt _MkMainDivHtm ( ) ) ;
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 ( ) )
return true ;
tt _db = null ;
return false ;
}
function tt _MkMainDivHtm ( )
{
return (
'<div id="WzTtDiV"></div>' +
( tt _ie56 ? ( '<iframe id="WzTtIfRm" src="javascript:false" scrolling="no" frameborder="0" style="filter:Alpha(opacity=0);position:absolute;top:0px;left:0px;display:none;"></iframe>' )
: '' )
) ;
}
function tt _MkMainDivDom ( )
{
var el = document . createElement ( "div" ) ;
if ( el )
el . id = "WzTtDiV" ;
return el ;
}
function tt _GetMainDivRefs ( )
{
tt _aElt [ 0 ] = tt _GetElt ( "WzTtDiV" ) ;
if ( tt _ie56 && tt _aElt [ 0 ] )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
tt _aElt [ tt _aElt . length - 1 ] = tt _GetElt ( "WzTtIfRm" ) ;
if ( ! tt _aElt [ tt _aElt . length - 1 ] )
tt _aElt [ 0 ] = null ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01: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" ;
tt _bBoxOld = ( tt _GetDivW ( tt _aElt [ 0 ] ) == 40 ) ;
css . padding = "0px" ;
tt _ResetMainDiv ( ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _OpaSupport ( )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
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
: 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 ) ;
if ( tt _body . attachEvent )
tt _body . attachEvent ( "onreadystatechange" ,
function ( ) {
if ( tt _body . readyState == "complete" )
tt _HideSrcTags ( ) ;
} ) ;
if ( /WebKit|KHTML/i . test ( navigator . userAgent ) )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
var t = setInterval ( function ( ) {
if ( /loaded|complete/ . test ( document . readyState ) )
{
clearInterval ( t ) ;
tt _HideSrcTags ( ) ;
}
} , 10 ) ;
2007-01-31 23:34:31 +01:00
}
}
2010-01-17 04:20:45 +01:00
function tt _HideSrcTags ( )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
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 ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _HideSrcTagsRecurs ( dad )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
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 ;
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 )
: null ;
if ( ovr )
{
asT2t = ovr . toString ( ) . match ( /TagToTip\s*\(\s*'[^'.]+'\s*[\),]/ ) ;
if ( asT2t && asT2t . length )
{
if ( ! tt _HideSrcTag ( asT2t [ 0 ] ) )
return false ;
}
}
}
return true ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _HideSrcTag ( sT2t )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
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 )
{
if ( tt _Debug && ! TagsToTip )
return false ;
else
el . style . display = "none" ;
}
else
tt _Err ( "Invalid ID\n'" + id + "'\npassed to TagToTip()."
+ " There exists no HTML element with that ID." , true ) ;
return true ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _Tip ( arg , t2t )
{
if ( ! tt _db || ( tt _iState & 0x8 ) )
return ;
if ( tt _iState )
tt _Hide ( ) ;
if ( ! tt _Enabled )
return ;
tt _t2t = t2t ;
if ( ! tt _ReadCmds ( arg ) )
return ;
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 ;
2007-01-31 23:34:31 +01:00
2010-01-17 04:20:45 +01:00
// First load the global config values, to initialize also values
// for which no command is passed
i = 0 ;
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 )
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 ) ;
return false ;
}
function tt _AdaptConfig1 ( )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
tt _ExtCallFncs ( 0 , "LoadConfig" ) ;
// Inherit unspecified title formattings from body
if ( ! tt _aV [ TITLEBGCOLOR ] . length )
tt _aV [ TITLEBGCOLOR ] = tt _aV [ BORDERCOLOR ] ;
if ( ! tt _aV [ TITLEFONTCOLOR ] . length )
tt _aV [ TITLEFONTCOLOR ] = tt _aV [ BGCOLOR ] ;
if ( ! tt _aV [ TITLEFONTFACE ] . length )
tt _aV [ TITLEFONTFACE ] = tt _aV [ FONTFACE ] ;
if ( ! tt _aV [ TITLEFONTSIZE ] . length )
tt _aV [ TITLEFONTSIZE ] = tt _aV [ FONTSIZE ] ;
if ( tt _aV [ CLOSEBTN ] )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
// Use title colours for non-specified closebutton colours
if ( ! tt _aV [ CLOSEBTNCOLORS ] )
tt _aV [ CLOSEBTNCOLORS ] = new Array ( "" , "" , "" , "" ) ;
for ( var i = 4 ; i ; )
{ -- i ;
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 )
tt _aV [ TITLE ] = " " ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
// 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 )
tt _aV [ OPACITY ] = 99 ;
// Smartly shorten the delay for fade-in tooltips
if ( tt _aV [ FADEIN ] && tt _flagOpa && tt _aV [ DELAY ] > 100 )
tt _aV [ DELAY ] = Math . max ( tt _aV [ DELAY ] - tt _aV [ FADEIN ] , 100 ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _AdaptConfig2 ( )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
if ( tt _aV [ CENTERMOUSE ] )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
tt _aV [ OFFSETX ] -= ( ( tt _w - ( tt _aV [ SHADOW ] ? tt _aV [ SHADOWWIDTH ] : 0 ) ) >> 1 ) ;
tt _aV [ JUMPHORZ ] = false ;
2007-01-31 23:34:31 +01:00
}
}
2010-01-17 04:20:45 +01:00
// Expose content globally so extensions can modify it
function tt _MkTipContent ( a )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
if ( tt _t2t )
{
if ( tt _aV [ COPYCONTENT ] )
tt _sContent = tt _t2t . innerHTML ;
else
tt _sContent = "" ;
}
else
tt _sContent = a [ 0 ] ;
tt _ExtCallFncs ( 0 , "CreateContentString" ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _MkTipSubDivs ( )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
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 =
( ''
+ ( 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>' )
: '' )
) ;
tt _GetSubDivRefs ( ) ;
// Convert DOM node to tip
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 )
tt _aElt [ i ] = tt _GetElt ( aId [ i - 1 ] ) ;
}
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 )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
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 ] ;
if ( tt _aV [ WIDTH ] == - 1 )
css . whiteSpace = "nowrap" ;
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" ;
}
if ( tt _aV [ WIDTH ] > 0 )
tt _w = tt _aV [ WIDTH ] ;
else
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
tt _w = tt _GetDivW ( tt _aElt [ 3 ] ) + tt _GetDivW ( tt _aElt [ 4 ] ) ;
// Some spacing between title DIV and closebutton
if ( tt _aElt [ 4 ] )
tt _w += pad ;
// Restrict auto width to max width
if ( tt _aV [ WIDTH ] < - 1 && tt _w > - tt _aV [ WIDTH ] )
tt _w = - tt _aV [ WIDTH ] ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
// Ensure the top border of the body DIV be covered by the title DIV
iOffY = - wBrd ;
}
else
{
tt _w = 0 ;
iOffY = 0 ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
//-------- 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" ;
}
if ( tt _aV [ BGCOLOR ] . length )
css . background = tt _aV [ BGCOLOR ] ;
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 )
css . height = ( tt _aV [ HEIGHT ] + iAdd ) + "px" ;
else
tt _h = iAdd - tt _aV [ HEIGHT ] ;
}
// 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 ] ;
if ( tt _aV [ WIDTH ] > 0 )
w = tt _aV [ WIDTH ] ;
// Width like title (if existent)
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 ] )
w = - tt _aV [ WIDTH ] ;
}
if ( w > tt _w )
tt _w = w ;
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 ] ;
}
else
iOffSh = 0 ;
//-------- Container DIV -------
tt _SetTipOpa ( tt _aV [ FADEIN ] ? 0 : tt _aV [ OPACITY ] ) ;
tt _FixSize ( iOffY , iOffSh ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
// Fixate the size so it can't dynamically change while the tooltip is moving.
function tt _FixSize ( iOffY , iOffSh )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
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 ;
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 )
wOut = wIn ;
tt _aElt [ 1 ] . style . width = wOut + "px" ;
tt _aElt [ 2 ] . style . width = wIn + "px" ;
}
// Max height specified
if ( tt _h )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
h = tt _GetDivH ( tt _aElt [ 5 ] ) ;
if ( h > tt _h )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
if ( ! tt _bBoxOld )
tt _h -= ( pad + wBrd ) << 1 ;
tt _aElt [ 5 ] . style . height = tt _h + "px" ;
2007-01-31 23:34:31 +01:00
}
}
2010-01-17 04:20:45 +01:00
tt _h = tt _GetDivH ( tt _aElt [ 0 ] ) + iOffY ;
// Right shadow
if ( tt _aElt [ 8 ] )
tt _aElt [ 8 ] . style . height = ( tt _h - iOffSh ) + "px" ;
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 )
{
if ( el . alt )
el . alt = "" ;
if ( el . title )
el . title = "" ;
aKid = el . childNodes || el . children || null ;
if ( aKid )
{
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 )
return ;
if ( tt _elDeHref )
tt _OpReHref ( ) ;
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 ) ;
}
2007-01-31 23:34:31 +01:00
}
function tt _OpReHref ( )
{
2010-01-17 04:20:45 +01:00
if ( tt _elDeHref )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
tt _elDeHref . setAttribute ( "href" , tt _elDeHref . t _href ) ;
tt _RemEvtFnc ( tt _elDeHref , "mousedown" , tt _OpReHref ) ;
window . status = tt _elDeHref . t _stats ;
tt _elDeHref = null ;
2007-01-31 23:34:31 +01:00
}
}
2010-01-17 04:20:45 +01:00
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 ( )
{
if ( window . event )
tt _over = window . event . target || window . event . srcElement ;
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 ] )
tt _AddEvtFnc ( document , "mouseup" , tt _OnLClick ) ;
}
function tt _Show ( )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
var css = tt _aElt [ 0 ] . style ;
2007-01-31 23:34:31 +01:00
2010-01-17 04:20:45 +01:00
// 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 ] )
tt _iState &= ~ 0x4 ;
if ( tt _aV [ EXCLUSIVE ] )
tt _iState |= 0x8 ;
if ( tt _aV [ DURATION ] > 0 )
tt _tDurt . Timer ( "tt_HideInit()" , tt _aV [ DURATION ] , true ) ;
tt _ExtCallFncs ( 0 , "Show" )
css . visibility = "visible" ;
tt _iState |= 0x2 ;
if ( tt _aV [ FADEIN ] )
tt _Fade ( 0 , 0 , tt _aV [ OPACITY ] , Math . round ( tt _aV [ FADEIN ] / tt _aV [ FADEINTERVAL ] ) ) ;
tt _ShowIfrm ( ) ;
}
function tt _ShowIfrm ( )
{
if ( tt _ie56 )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
var ifrm = tt _aElt [ tt _aElt . length - 1 ] ;
if ( ifrm )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
var css = ifrm . style ;
css . zIndex = tt _aElt [ 0 ] . style . zIndex - 1 ;
css . display = "block" ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
}
}
function tt _Move ( e )
{
if ( e )
tt _ovr _ = e . target || e . srcElement ;
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 )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
if ( tt _bWait )
return ;
tt _bWait = true ;
tt _tWaitMov . Timer ( "tt_bWait = false;" , 1 , true ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
if ( tt _aV [ FIX ] )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
tt _iState &= ~ 0x4 ;
tt _PosFix ( ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
else if ( ! tt _ExtCallFncs ( e , "MoveBefore" ) )
tt _SetTipPos ( tt _Pos ( 0 ) , tt _Pos ( 1 ) ) ;
tt _ExtCallFncs ( [ tt _musX , tt _musY ] , "MoveAfter" )
2007-01-31 23:34:31 +01:00
}
}
2010-01-17 04:20:45 +01:00
function tt _Pos ( iDim )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
var iX , bJmpMod , cmdAlt , cmdOff , cx , iMax , iScrl , iMus , bJmp ;
// Map values according to dimension to calculate
if ( iDim )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
bJmpMod = tt _aV [ JUMPVERT ] ;
cmdAlt = ABOVE ;
cmdOff = OFFSETY ;
cx = tt _h ;
iMax = tt _maxPosY ;
iScrl = tt _GetScrollY ( ) ;
iMus = tt _musY ;
bJmp = tt _bJmpVert ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
else
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
bJmpMod = tt _aV [ JUMPHORZ ] ;
cmdAlt = LEFT ;
cmdOff = OFFSETX ;
cx = tt _w ;
iMax = tt _maxPosX ;
iScrl = tt _GetScrollX ( ) ;
iMus = tt _musX ;
bJmp = tt _bJmpHorz ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
if ( bJmpMod )
{
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 )
iX = tt _PosAlt ( iDim ) ;
else
iX = tt _PosDef ( iDim ) ;
}
else
{
iX = iMus ;
if ( tt _aV [ cmdAlt ] )
iX -= cx + tt _aV [ cmdOff ] - ( tt _aV [ SHADOW ] ? tt _aV [ SHADOWWIDTH ] : 0 ) ;
else
iX += tt _aV [ cmdOff ] ;
}
// Prevent tip from extending past clientarea boundary
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 )
iX = bJmpMod ? tt _PosDef ( iDim ) : iScrl ;
return iX ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _PosDef ( iDim )
{
if ( iDim )
tt _bJmpVert = tt _aV [ ABOVE ] ;
else
tt _bJmpHorz = tt _aV [ LEFT ] ;
return tt _CalcPosDef ( iDim ) ;
}
function tt _PosAlt ( iDim )
{
if ( iDim )
tt _bJmpVert = ! tt _aV [ ABOVE ] ;
else
tt _bJmpHorz = ! tt _aV [ LEFT ] ;
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 ) ;
if ( tt _aV [ cmdOff ] > 0 && dx <= 0 )
dx = 1 ;
return ( ( iDim ? ( tt _musY - tt _h ) : ( tt _musX - tt _w ) ) - dx ) ;
}
function tt _PosFix ( )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
var iX , iY ;
if ( typeof ( tt _aV [ FIX ] [ 0 ] ) == "number" )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
iX = tt _aV [ FIX ] [ 0 ] ;
iY = tt _aV [ FIX ] [ 1 ] ;
}
else
{
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
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 )
iY += tt _GetDivH ( el ) ;
for ( ; el ; el = el . offsetParent )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
iX += el . offsetLeft || 0 ;
iY += el . offsetTop || 0 ;
2007-01-31 23:34:31 +01:00
}
}
2010-01-17 04:20:45 +01:00
// 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 ] )
iY -= tt _h ;
tt _SetTipPos ( iX , iY ) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _Fade ( a , now , z , n )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01:00
if ( n )
{
now += Math . round ( ( z - now ) / n ) ;
if ( ( z > a ) ? ( now >= z ) : ( now <= z ) )
now = z ;
else
tt _tFade . Timer (
"tt_Fade("
+ a + "," + now + "," + z + "," + ( n - 1 )
+ ")" ,
tt _aV [ FADEINTERVAL ] ,
true
) ;
}
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 ] )
tt _SetOpa ( tt _aElt [ 1 ] , opa ) ;
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 ;
2007-01-31 23:34:31 +01:00
2010-01-17 04:20:45 +01:00
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 ;
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 ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
else if ( tt _aV [ CLICKCLOSE ] )
tt _HideInit ( ) ;
}
}
function tt _Int ( x )
{
var y ;
return ( isNaN ( y = parseInt ( x ) ) ? 0 : y ) ;
}
Number . prototype . Timer = function ( s , iT , bUrge )
{
if ( ! this . value || bUrge )
this . value = window . setTimeout ( s , iT ) ;
}
Number . prototype . EndTimer = function ( )
{
if ( this . value )
{
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 )
{
var y2 ;
return (
// Gecko or Opera with scrollbar
// ... quirks mode
( ( 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
// No scrollbar, or clientarea size == 0, or other browser (KHTML etc.)
: y
) ;
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
// IE
return (
// document.documentElement.client+s functional, returns > 0
( ( db = document . documentElement ) && ( y = db [ sC ] ) ) ? y
// ... not functional, in which case document.body.client+s
// is the clientarea size, fortunately
: document . body [ sC ]
) ;
}
function tt _SetOpa ( el , opa )
{
var css = el . style ;
tt _opa = opa ;
if ( tt _flagOpa == 1 )
2007-01-31 23:34:31 +01:00
{
2010-01-17 04:20:45 +01: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
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" ;
// 3.) In IE6, applying an opacity < 100 has no effect if the
// element has no layout (position, size, zoom, ...)
css . zoom = "100%" ;
if ( ! bVis )
css . visibility = "visible" ;
css . filter = "alpha(opacity=" + opa + ")" ;
if ( ! bVis )
css . visibility = "hidden" ;
}
else if ( typeof ( el . filtNo ) != tt _u )
// Restore 'non-filter'
css . filter = el . filtNo ;
2007-01-31 23:34:31 +01:00
}
else
2010-01-17 04:20:45 +01:00
{
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 ;
}
}
2007-01-31 23:34:31 +01:00
}
2010-01-17 04:20:45 +01:00
function tt _Err ( sErr , bIfDebug )
{
if ( tt _Debug || ! bIfDebug )
alert ( "Tooltip Script Error Message:\n\n" + sErr ) ;
}
//============ 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
if ( fnc && fnc ( arg ) )
b = true ;
}
return b ;
}
2007-01-31 23:34:31 +01:00
tt _Init ( ) ;