Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 96326d7c

Von Kivitendo Admin vor mehr als 9 Jahren hinzugefügt

  • ID 96326d7c4d49b793888ff6c5ab357caf05157e64
  • Vorgänger 77c9d23b
  • Nachfolger 77061a7b

Update von wz_tooltip.js auf Version 5.31

in Vorbereitung auf Bankerweiterung
Anpassung des Formeltooltips an neue Syntax

Unterschiede anzeigen:

js/wz_tooltip.js
1 1
/* This notice must be untouched at all times.
2
Copyright (c) 2002-2008 Walter Zorn. All rights reserved.
2 3

  
3
wz_tooltip.js    v. 3.38
4
wz_tooltip.js	 v. 5.31
4 5

  
5 6
The latest version is available at
6 7
http://www.walterzorn.com
7 8
or http://www.devira.com
8 9
or http://www.walterzorn.de
9 10

  
10
Copyright (c) 2002-2005 Walter Zorn. All rights reserved.
11
Created 1. 12. 2002 by Walter Zorn (Web: http://www.walterzorn.com )
12
Last modified: 9. 12. 2005
11
Created 1.12.2002 by Walter Zorn (Web: http://www.walterzorn.com )
12
Last modified: 7.11.2008
13 13

  
14
Cross-browser tooltips working even in Opera 5 and 6,
15
as well as in NN 4, Gecko-Browsers, IE4+, Opera 7+ and Konqueror.
16
No onmouseouts required.
17
Appearance of tooltips can be individually configured
18
via commands within the onmouseovers.
14
Easy-to-use cross-browser tooltips.
15
Just include the script at the beginning of the <body> section, and invoke
16
Tip('Tooltip text') to show and UnTip() to hide the tooltip, from the desired
17
HTML eventhandlers. Example:
18
<a onmouseover="Tip('Some text')" onmouseout="UnTip()" href="index.htm">My home page</a>
19
No container DIV required.
20
By default, width and height of tooltips are automatically adapted to content.
21
Is even capable of dynamically converting arbitrary HTML elements to tooltips
22
by calling TagToTip('ID_of_HTML_element_to_be_converted') instead of Tip(),
23
which means you can put important, search-engine-relevant stuff into tooltips.
24
Appearance & behaviour of tooltips can be individually configured
25
via commands passed to Tip() or TagToTip().
19 26

  
27
Tab Width: 4
20 28
LICENSE: LGPL
21 29

  
22 30
This library is free software; you can redistribute it and/or
......
32 40
see http://www.gnu.org/copyleft/lesser.html
33 41
*/
34 42

  
43
var config = new Object();
35 44

  
36 45

  
37
////////////////  GLOBAL TOOPTIP CONFIGURATION  /////////////////////
38
var ttAbove       = false;        // tooltip above mousepointer? Alternative: true
39
var ttBgColor     = "#e6ecff";
40
var ttBgImg       = "";           // path to background image;
41
var ttBorderColor = "#003399";
42
var ttBorderWidth = 1;
43
var ttDelay       = 500;          // time span until tooltip shows up [milliseconds]
44
var ttFontColor   = "#000066";
45
var ttFontFace    = "arial,helvetica,sans-serif";
46
var ttFontSize    = "11px";
47
var ttFontWeight  = "normal";     // alternative: "bold";
48
var ttLeft        = false;        // tooltip on the left of the mouse? Alternative: true
49
var ttOffsetX     = 12;           // horizontal offset of left-top corner from mousepointer
50
var ttOffsetY     = 15;           // vertical offset                   "
51
var ttOpacity     = 100;          // opacity of tooltip in percent (must be integer between 0 and 100)
52
var ttPadding     = 3;            // spacing between border and content
53
var ttShadowColor = "";
54
var ttShadowWidth = 0;
55
var ttStatic      = false;        // tooltip NOT move with the mouse? Alternative: true
56
var ttSticky      = false;        // do NOT hide tooltip on mouseout? Alternative: true
57
var ttTemp        = 0;            // time span after which the tooltip disappears; 0 (zero) means "infinite timespan"
58
var ttTextAlign   = "left";
59
var ttTitleColor  = "#ffffff";    // color of caption text
60
var ttWidth       = 300;
61
////////////////////  END OF TOOLTIP CONFIG  ////////////////////////
62

  
63

  
64

  
65
//////////////  TAGS WITH TOOLTIP FUNCTIONALITY  ////////////////////
66
// List may be extended or shortened:
67
var tt_tags = new Array("a","area","b","big","caption","center","code","dd","div","dl","dt","em","h1","h2","h3","h4","h5","h6","i","img","input","li","map","ol","p","pre","s", "select", "small","span","strike","strong","sub","sup","table","td","th","tr","tt","u","var","ul","layer");
68
/////////////////////////////////////////////////////////////////////
69

  
70

  
71

  
72
///////// DON'T CHANGE ANYTHING BELOW THIS LINE /////////////////////
73
var tt_obj = null,         // current tooltip
74
tt_ifrm = null,            // iframe to cover windowed controls in IE
75
tt_objW = 0, tt_objH = 0,  // width and height of tt_obj
76
tt_objX = 0, tt_objY = 0,
77
tt_offX = 0, tt_offY = 0,
78
xlim = 0, ylim = 0,        // right and bottom borders of visible client area
79
tt_sup = false,            // true if T_ABOVE cmd
80
tt_sticky = false,         // tt_obj sticky?
81
tt_wait = false,
82
tt_act = false,            // tooltip visibility flag
83
tt_sub = false,            // true while tooltip below mousepointer
84
tt_u = "undefined",
85
tt_mf = null,              // stores previous mousemove evthandler
86
// Opera: disable href when hovering <a>
87
tt_tag = null;             // stores hovered dom node, href and previous statusbar txt
88

  
89

  
90
var tt_db = (document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body? document.body : null,
91
tt_n = navigator.userAgent.toLowerCase(),
92
tt_nv = navigator.appVersion;
93
// Browser flags
94
var tt_op = !!(window.opera && document.getElementById),
95
tt_op6 = tt_op && !document.defaultView,
96
tt_op7 = tt_op && !tt_op6,
97
tt_ie = tt_n.indexOf("msie") != -1 && document.all && tt_db && !tt_op,
98
tt_ie6 = tt_ie && parseFloat(tt_nv.substring(tt_nv.indexOf("MSIE")+5)) >= 5.5,
99
tt_n4 = (document.layers && typeof document.classes != tt_u),
100
tt_n6 = (!tt_op && document.defaultView && typeof document.defaultView.getComputedStyle != tt_u),
101
tt_w3c = !tt_ie && !tt_n6 && !tt_op && document.getElementById;
102

  
103
function tt_Int(t_x)
104
{
105
	var t_y;
106
	return isNaN(t_y = parseInt(t_x))? 0 : t_y;
107
}
108
function wzReplace(t_x, t_y)
109
{
110
	var t_ret = "",
111
	t_str = this,
112
	t_xI;
113
	while((t_xI = t_str.indexOf(t_x)) != -1)
114
	{
115
		t_ret += t_str.substring(0, t_xI) + t_y;
116
		t_str = t_str.substring(t_xI + t_x.length);
117
	}
118
	return t_ret+t_str;
119
}
120
String.prototype.wzReplace = wzReplace;
121
function tt_N4Tags(tagtyp, t_d, t_y)
122
{
123
	t_d = t_d || document;
124
	t_y = t_y || new Array();
125
	var t_x = (tagtyp=="a")? t_d.links : t_d.layers;
126
	for(var z = t_x.length; z--;) t_y[t_y.length] = t_x[z];
127
	for(z = t_d.layers.length; z--;) t_y = tt_N4Tags(tagtyp, t_d.layers[z].document, t_y);
128
	return t_y;
129
}
130
function tt_Htm(tt, t_id, txt)
131
{
132
	var t_bgc = (typeof tt.T_BGCOLOR != tt_u)? tt.T_BGCOLOR : ttBgColor,
133
	t_bgimg   = (typeof tt.T_BGIMG != tt_u)? tt.T_BGIMG : ttBgImg,
134
	t_bc      = (typeof tt.T_BORDERCOLOR != tt_u)? tt.T_BORDERCOLOR : ttBorderColor,
135
	t_bw      = (typeof tt.T_BORDERWIDTH != tt_u)? tt.T_BORDERWIDTH : ttBorderWidth,
136
	t_ff      = (typeof tt.T_FONTFACE != tt_u)? tt.T_FONTFACE : ttFontFace,
137
	t_fc      = (typeof tt.T_FONTCOLOR != tt_u)? tt.T_FONTCOLOR : ttFontColor,
138
	t_fsz     = (typeof tt.T_FONTSIZE != tt_u)? tt.T_FONTSIZE : ttFontSize,
139
	t_fwght   = (typeof tt.T_FONTWEIGHT != tt_u)? tt.T_FONTWEIGHT : ttFontWeight,
140
	t_opa     = (typeof tt.T_OPACITY != tt_u)? tt.T_OPACITY : ttOpacity,
141
	t_padd    = (typeof tt.T_PADDING != tt_u)? tt.T_PADDING : ttPadding,
142
	t_shc     = (typeof tt.T_SHADOWCOLOR != tt_u)? tt.T_SHADOWCOLOR : (ttShadowColor || 0),
143
	t_shw     = (typeof tt.T_SHADOWWIDTH != tt_u)? tt.T_SHADOWWIDTH : (ttShadowWidth || 0),
144
	t_algn    = (typeof tt.T_TEXTALIGN != tt_u)? tt.T_TEXTALIGN : ttTextAlign,
145
	t_tit     = (typeof tt.T_TITLE != tt_u)? tt.T_TITLE : "",
146
	t_titc    = (typeof tt.T_TITLECOLOR != tt_u)? tt.T_TITLECOLOR : ttTitleColor,
147
	t_w       = (typeof tt.T_WIDTH != tt_u)? tt.T_WIDTH  : ttWidth;
148
	if(t_shc || t_shw)
149
	{
150
		t_shc = t_shc || "#cccccc";
151
		t_shw = t_shw || 5;
152
	}
153
	if(tt_n4 && (t_fsz == "10px" || t_fsz == "11px")) t_fsz = "12px";
154

  
155
	var t_optx = (tt_n4? '' : tt_n6? ('-moz-opacity:'+(t_opa/100.0)) : tt_ie? ('filter:Alpha(opacity='+t_opa+')') : ('opacity:'+(t_opa/100.0))) + ';';
156
	var t_y = '<div id="'+t_id+'" style="position:absolute;z-index:1010;';
157
	t_y += 'left:0px;top:0px;width:'+(t_w+t_shw)+'px;visibility:'+(tt_n4? 'hide' : 'hidden')+';'+t_optx+'">' +
158
		'<table border="0" cellpadding="0" cellspacing="0"'+(t_bc? (' bgcolor="'+t_bc+'" style="background:'+t_bc+';"') : '')+' width="'+t_w+'">';
159
	if(t_tit)
160
	{
161
		t_y += '<tr><td style="padding-left:3px;padding-right:3px;" align="'+t_algn+'"><font color="'+t_titc+'" face="'+t_ff+'" ' +
162
			'style="color:'+t_titc+';font-family:'+t_ff+';font-size:'+t_fsz+';"><b>' +
163
			(tt_n4? '&nbsp;' : '')+t_tit+'</b></font></td></tr>';
164
	}
165
	t_y += '<tr><td><table border="0" cellpadding="'+t_padd+'" cellspacing="'+t_bw+'" width="100%">' +
166
		'<tr><td'+(t_bgc? (' bgcolor="'+t_bgc+'"') : '')+(t_bgimg? ' background="'+t_bgimg+'"' : '')+' style="text-align:'+t_algn+';';
167
	if(tt_n6) t_y += 'padding:'+t_padd+'px;';
168
	t_y += '" align="'+t_algn+'"><font color="'+t_fc+'" face="'+t_ff+'"' +
169
		' style="color:'+t_fc+';font-family:'+t_ff+';font-size:'+t_fsz+';font-weight:'+t_fwght+';">';
170
	if(t_fwght == 'bold') t_y += '<b>';
171
	t_y += txt;
172
	if(t_fwght == 'bold') t_y += '</b>';
173
	t_y += '</font></td></tr></table></td></tr></table>';
174
	if(t_shw)
175
	{
176
		var t_spct = Math.round(t_shw*1.3);
177
		if(tt_n4)
46
//===================  GLOBAL TOOLTIP CONFIGURATION  =========================//
47
var tt_Debug	= true		// false or true - recommended: false once you release your page to the public
48
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
49
var TagsToTip	= true		// false or true - if true, HTML elements to be converted to tooltips via TagToTip() are automatically hidden;
50
							// if false, you should hide those HTML elements yourself
51

  
52
// For each of the following config variables there exists a command, which is
53
// just the variablename in uppercase, to be passed to Tip() or TagToTip() to
54
// configure tooltips individually. Individual commands override global
55
// configuration. Order of commands is arbitrary.
56
// Example: onmouseover="Tip('Tooltip text', LEFT, true, BGCOLOR, '#FF9900', FADEIN, 400)"
57

  
58
config. Above			= false		// false or true - tooltip above mousepointer
59
config. BgColor			= '#E2E7FF'	// Background colour (HTML colour value, in quotes)
60
config. BgImg			= ''		// Path to background image, none if empty string ''
61
config. BorderColor		= '#003099'
62
config. BorderStyle		= 'solid'	// Any permitted CSS value, but I recommend 'solid', 'dotted' or 'dashed'
63
config. BorderWidth		= 1
64
config. CenterMouse		= false		// false or true - center the tip horizontally below (or above) the mousepointer
65
config. ClickClose		= false		// false or true - close tooltip if the user clicks somewhere
66
config. ClickSticky		= false		// false or true - make tooltip sticky if user left-clicks on the hovered element while the tooltip is active
67
config. CloseBtn		= false		// false or true - closebutton in titlebar
68
config. CloseBtnColors	= ['#990000', '#FFFFFF', '#DD3333', '#FFFFFF']	// [Background, text, hovered background, hovered text] - use empty strings '' to inherit title colours
69
config. CloseBtnText	= '&nbsp;X&nbsp;'	// Close button text (may also be an image tag)
70
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
71
config. Delay			= 400		// Time span in ms until tooltip shows up
72
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
73
config. Exclusive		= false		// false or true - no other tooltip can appear until the current one has actively been closed
74
config. FadeIn			= 100		// Fade-in duration in ms, e.g. 400; 0 for no animation
75
config. FadeOut			= 100
76
config. FadeInterval	= 30		// Duration of each fade step in ms (recommended: 30) - shorter is smoother but causes more CPU-load
77
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.
78
config. FollowMouse		= true		// false or true - tooltip follows the mouse
79
config. FontColor		= '#000044'
80
config. FontFace		= 'Verdana,Geneva,sans-serif'
81
config. FontSize		= '8pt'		// E.g. '9pt' or '12px' - unit is mandatory
82
config. FontWeight		= 'normal'	// 'normal' or 'bold';
83
config. Height			= 0			// Tooltip height; 0 for automatic adaption to tooltip content, < 0 (e.g. -100) for a maximum for automatic adaption
84
config. JumpHorz		= false		// false or true - jump horizontally to other side of mouse if tooltip would extend past clientarea boundary
85
config. JumpVert		= true		// false or true - jump vertically		"
86
config. Left			= false		// false or true - tooltip on the left of the mouse
87
config. OffsetX			= 14		// Horizontal offset of left-top corner from mousepointer
88
config. OffsetY			= 8			// Vertical offset
89
config. Opacity			= 100		// Integer between 0 and 100 - opacity of tooltip in percent
90
config. Padding			= 3			// Spacing between border and content
91
config. Shadow			= false		// false or true
92
config. ShadowColor		= '#C0C0C0'
93
config. ShadowWidth		= 5
94
config. Sticky			= false		// false or true - fixate tip, ie. don't follow the mouse and don't hide on mouseout
95
config. TextAlign		= 'left'	// 'left', 'right' or 'justify'
96
config. Title			= ''		// Default title text applied to all tips (no default title: empty string '')
97
config. TitleAlign		= 'left'	// 'left' or 'right' - text alignment inside the title bar
98
config. TitleBgColor	= ''		// If empty string '', BorderColor will be used
99
config. TitleFontColor	= '#FFFFFF'	// Color of title text - if '', BgColor (of tooltip body) will be used
100
config. TitleFontFace	= ''		// If '' use FontFace (boldified)
101
config. TitleFontSize	= ''		// If '' use FontSize
102
config. TitlePadding	= 2
103
config. Width			= 0			// Tooltip width; 0 for automatic adaption to tooltip content; < -1 (e.g. -240) for a maximum width for that automatic adaption;
104
									// -1: tooltip width confined to the width required for the titlebar
105
//=======  END OF TOOLTIP CONFIG, DO NOT CHANGE ANYTHING BELOW  ==============//
106

  
107

  
108

  
109

  
110
//=====================  PUBLIC  =============================================//
111
function Tip()
112
{
113
	tt_Tip(arguments, null);
114
}
115
function TagToTip()
116
{
117
	var t2t = tt_GetElt(arguments[0]);
118
	if(t2t)
119
		tt_Tip(arguments, t2t);
120
}
121
function UnTip()
122
{
123
	tt_OpReHref();
124
	if(tt_aV[DURATION] < 0 && (tt_iState & 0x2))
125
		tt_tDurt.Timer("tt_HideInit()", -tt_aV[DURATION], true);
126
	else if(!(tt_aV[STICKY] && (tt_iState & 0x2)))
127
		tt_HideInit();
128
}
129

  
130
//==================  PUBLIC PLUGIN API	 =====================================//
131
// Extension eventhandlers currently supported:
132
// OnLoadConfig, OnCreateContentString, OnSubDivsCreated, OnShow, OnMoveBefore,
133
// OnMoveAfter, OnHideInit, OnHide, OnKill
134

  
135
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
136
tt_aV = new Array(),	// Caches and enumerates config data for currently active tooltip
137
tt_sContent,			// Inner tooltip text or HTML
138
tt_t2t, tt_t2tDad,		// Tag converted to tip, and its DOM parent element
139
tt_musX, tt_musY,
140
tt_over,
141
tt_x, tt_y, tt_w, tt_h; // Position, width and height of currently displayed tooltip
142

  
143
function tt_Extension()
144
{
145
	tt_ExtCmdEnum();
146
	tt_aExt[tt_aExt.length] = this;
147
	return this;
148
}
149
function tt_SetTipPos(x, y)
150
{
151
	var css = tt_aElt[0].style;
152

  
153
	tt_x = x;
154
	tt_y = y;
155
	css.left = x + "px";
156
	css.top = y + "px";
157
	if(tt_ie56)
158
	{
159
		var ifrm = tt_aElt[tt_aElt.length - 1];
160
		if(ifrm)
178 161
		{
179
			t_y += '<layer bgcolor="'+t_shc+'" left="'+t_w+'" top="'+t_spct+'" width="'+t_shw+'" height="0"></layer>' +
180
				'<layer bgcolor="'+t_shc+'" left="'+t_spct+'" align="bottom" width="'+(t_w-t_spct)+'" height="'+t_shw+'"></layer>';
162
			ifrm.style.left = css.left;
163
			ifrm.style.top = css.top;
181 164
		}
182
		else
165
	}
166
}
167
function tt_HideInit()
168
{
169
	if(tt_iState)
170
	{
171
		tt_ExtCallFncs(0, "HideInit");
172
		tt_iState &= ~(0x4 | 0x8);
173
		if(tt_flagOpa && tt_aV[FADEOUT])
174
		{
175
			tt_tFade.EndTimer();
176
			if(tt_opa)
177
			{
178
				var n = Math.round(tt_aV[FADEOUT] / (tt_aV[FADEINTERVAL] * (tt_aV[OPACITY] / tt_opa)));
179
				tt_Fade(tt_opa, tt_opa, 0, n);
180
				return;
181
			}
182
		}
183
		tt_tHide.Timer("tt_Hide();", 1, false);
184
	}
185
}
186
function tt_Hide()
187
{
188
	if(tt_db && tt_iState)
189
	{
190
		tt_OpReHref();
191
		if(tt_iState & 0x2)
192
		{
193
			tt_aElt[0].style.visibility = "hidden";
194
			tt_ExtCallFncs(0, "Hide");
195
		}
196
		tt_tShow.EndTimer();
197
		tt_tHide.EndTimer();
198
		tt_tDurt.EndTimer();
199
		tt_tFade.EndTimer();
200
		if(!tt_op && !tt_ie)
183 201
		{
184
			t_optx = tt_n6? '-moz-opacity:0.85;' : tt_ie? 'filter:Alpha(opacity=85);' : 'opacity:0.85;';
185
			t_y += '<div id="'+t_id+'R" style="position:absolute;background:'+t_shc+';left:'+t_w+'px;top:'+t_spct+'px;width:'+t_shw+'px;height:1px;overflow:hidden;'+t_optx+'"></div>' +
186
				'<div style="position:relative;background:'+t_shc+';left:'+t_spct+'px;top:0px;width:'+(t_w-t_spct)+'px;height:'+t_shw+'px;overflow:hidden;'+t_optx+'"></div>';
202
			tt_tWaitMov.EndTimer();
203
			tt_bWait = false;
187 204
		}
205
		if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY])
206
			tt_RemEvtFnc(document, "mouseup", tt_OnLClick);
207
		tt_ExtCallFncs(0, "Kill");
208
		// In case of a TagToTip tip, hide converted DOM node and
209
		// re-insert it into DOM
210
		if(tt_t2t && !tt_aV[COPYCONTENT])
211
			tt_UnEl2Tip();
212
		tt_iState = 0;
213
		tt_over = null;
214
		tt_ResetMainDiv();
215
		if(tt_aElt[tt_aElt.length - 1])
216
			tt_aElt[tt_aElt.length - 1].style.display = "none";
188 217
	}
189
	return(t_y+'</div>' +
190
		(tt_ie6 ? '<iframe id="TTiEiFrM" src="javascript:false" scrolling="no" frameborder="0" style="filter:Alpha(opacity=0);position:absolute;top:0px;left:0px;display:none;"></iframe>' : ''));
191 218
}
192
function tt_EvX(t_e)
219
function tt_GetElt(id)
220
{
221
	return(document.getElementById ? document.getElementById(id)
222
			: document.all ? document.all[id]
223
			: null);
224
}
225
function tt_GetDivW(el)
226
{
227
	return(el ? (el.offsetWidth || el.style.pixelWidth || 0) : 0);
228
}
229
function tt_GetDivH(el)
230
{
231
	return(el ? (el.offsetHeight || el.style.pixelHeight || 0) : 0);
232
}
233
function tt_GetScrollX()
234
{
235
	return(window.pageXOffset || (tt_db ? (tt_db.scrollLeft || 0) : 0));
236
}
237
function tt_GetScrollY()
238
{
239
	return(window.pageYOffset || (tt_db ? (tt_db.scrollTop || 0) : 0));
240
}
241
function tt_GetClientW()
242
{
243
	return tt_GetWndCliSiz("Width");
244
}
245
function tt_GetClientH()
246
{
247
	return tt_GetWndCliSiz("Height");
248
}
249
function tt_GetEvtX(e)
250
{
251
	return (e ? ((typeof(e.pageX) != tt_u) ? e.pageX : (e.clientX + tt_GetScrollX())) : 0);
252
}
253
function tt_GetEvtY(e)
254
{
255
	return (e ? ((typeof(e.pageY) != tt_u) ? e.pageY : (e.clientY + tt_GetScrollY())) : 0);
256
}
257
function tt_AddEvtFnc(el, sEvt, PFnc)
258
{
259
	if(el)
260
	{
261
		if(el.addEventListener)
262
			el.addEventListener(sEvt, PFnc, false);
263
		else
264
			el.attachEvent("on" + sEvt, PFnc);
265
	}
266
}
267
function tt_RemEvtFnc(el, sEvt, PFnc)
268
{
269
	if(el)
270
	{
271
		if(el.removeEventListener)
272
			el.removeEventListener(sEvt, PFnc, false);
273
		else
274
			el.detachEvent("on" + sEvt, PFnc);
275
	}
276
}
277
function tt_GetDad(el)
278
{
279
	return(el.parentNode || el.parentElement || el.offsetParent);
280
}
281
function tt_MovDomNode(el, dadFrom, dadTo)
282
{
283
	if(dadFrom)
284
		dadFrom.removeChild(el);
285
	if(dadTo)
286
		dadTo.appendChild(el);
287
}
288

  
289
//======================  PRIVATE  ===========================================//
290
var tt_aExt = new Array(),	// Array of extension objects
291

  
292
tt_db, tt_op, tt_ie, tt_ie56, tt_bBoxOld,	// Browser flags
293
tt_body,
294
tt_ovr_,				// HTML element the mouse is currently over
295
tt_flagOpa,				// Opacity support: 1=IE, 2=Khtml, 3=KHTML, 4=Moz, 5=W3C
296
tt_maxPosX, tt_maxPosY,
297
tt_iState = 0,			// Tooltip active |= 1, shown |= 2, move with mouse |= 4, exclusive |= 8
298
tt_opa,					// Currently applied opacity
299
tt_bJmpVert, tt_bJmpHorz,// Tip temporarily on other side of mouse
300
tt_elDeHref,			// The tag from which we've removed the href attribute
301
// Timer
302
tt_tShow = new Number(0), tt_tHide = new Number(0), tt_tDurt = new Number(0),
303
tt_tFade = new Number(0), tt_tWaitMov = new Number(0),
304
tt_bWait = false,
305
tt_u = "undefined";
306

  
307

  
308
function tt_Init()
309
{
310
	tt_MkCmdEnum();
311
	// Send old browsers instantly to hell
312
	if(!tt_Browser() || !tt_MkMainDiv())
313
		return;
314
	tt_IsW3cBox();
315
	tt_OpaSupport();
316
	tt_AddEvtFnc(document, "mousemove", tt_Move);
317
	// In Debug mode we search for TagToTip() calls in order to notify
318
	// the user if they've forgotten to set the TagsToTip config flag
319
	if(TagsToTip || tt_Debug)
320
		tt_SetOnloadFnc();
321
	// Ensure the tip be hidden when the page unloads
322
	tt_AddEvtFnc(window, "unload", tt_Hide);
323
}
324
// Creates command names by translating config variable names to upper case
325
function tt_MkCmdEnum()
193 326
{
194
	var t_y = tt_Int(t_e.pageX || t_e.clientX || 0) +
195
		tt_Int(tt_ie? tt_db.scrollLeft : 0) +
196
		tt_offX;
197
	if(t_y > xlim) t_y = xlim;
198
	var t_scr = tt_Int(window.pageXOffset || (tt_db? tt_db.scrollLeft : 0) || 0);
199
	if(t_y < t_scr) t_y = t_scr;
200
	return t_y;
327
	var n = 0;
328
	for(var i in config)
329
		eval("window." + i.toString().toUpperCase() + " = " + n++);
330
	tt_aV.length = n;
201 331
}
202
function tt_EvY(t_e)
332
function tt_Browser()
203 333
{
204
	var t_y = tt_Int(t_e.pageY || t_e.clientY || 0) +
205
		tt_Int(tt_ie? tt_db.scrollTop : 0);
206
	if(tt_sup) t_y -= (tt_objH + tt_offY - 15);
207
	else if(t_y > ylim || !tt_sub && t_y > ylim-24)
334
	var n, nv, n6, w3c;
335

  
336
	n = navigator.userAgent.toLowerCase(),
337
	nv = navigator.appVersion;
338
	tt_op = (document.defaultView && typeof(eval("w" + "indow" + "." + "o" + "p" + "er" + "a")) != tt_u);
339
	tt_ie = n.indexOf("msie") != -1 && document.all && !tt_op;
340
	if(tt_ie)
208 341
	{
209
		t_y -= (tt_objH + 5);
210
		tt_sub = false;
342
		var ieOld = (!document.compatMode || document.compatMode == "BackCompat");
343
		tt_db = !ieOld ? document.documentElement : (document.body || null);
344
		if(tt_db)
345
			tt_ie56 = parseFloat(nv.substring(nv.indexOf("MSIE") + 5)) >= 5.5
346
					&& typeof document.body.style.maxHeight == tt_u;
211 347
	}
212 348
	else
213 349
	{
214
		t_y += tt_offY;
215
		tt_sub = true;
350
		tt_db = document.documentElement || document.body ||
351
				(document.getElementsByTagName ? document.getElementsByTagName("body")[0]
352
				: null);
353
		if(!tt_op)
354
		{
355
			n6 = document.defaultView && typeof document.defaultView.getComputedStyle != tt_u;
356
			w3c = !n6 && document.getElementById;
357
		}
358
	}
359
	tt_body = (document.getElementsByTagName ? document.getElementsByTagName("body")[0]
360
				: (document.body || null));
361
	if(tt_ie || n6 || tt_op || w3c)
362
	{
363
		if(tt_body && tt_db)
364
		{
365
			if(document.attachEvent || document.addEventListener)
366
				return true;
367
		}
368
		else
369
			tt_Err("wz_tooltip.js must be included INSIDE the body section,"
370
					+ " immediately after the opening <body> tag.", false);
216 371
	}
217
	return t_y;
372
	tt_db = null;
373
	return false;
374
}
375
function tt_MkMainDiv()
376
{
377
	// Create the tooltip DIV
378
	if(tt_body.insertAdjacentHTML)
379
		tt_body.insertAdjacentHTML("afterBegin", tt_MkMainDivHtm());
380
	else if(typeof tt_body.innerHTML != tt_u && document.createElement && tt_body.appendChild)
381
		tt_body.appendChild(tt_MkMainDivDom());
382
	if(window.tt_GetMainDivRefs /* FireFox Alzheimer */ && tt_GetMainDivRefs())
383
		return true;
384
	tt_db = null;
385
	return false;
386
}
387
function tt_MkMainDivHtm()
388
{
389
	return(
390
		'<div id="WzTtDiV"></div>' +
391
		(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>')
392
		: '')
393
	);
218 394
}
219
function tt_ReleasMov()
395
function tt_MkMainDivDom()
220 396
{
221
	if(document.onmousemove == tt_Move)
397
	var el = document.createElement("div");
398
	if(el)
399
		el.id = "WzTtDiV";
400
	return el;
401
}
402
function tt_GetMainDivRefs()
403
{
404
	tt_aElt[0] = tt_GetElt("WzTtDiV");
405
	if(tt_ie56 && tt_aElt[0])
222 406
	{
223
		if(!tt_mf && document.releaseEvents) document.releaseEvents(Event.MOUSEMOVE);
224
		document.onmousemove = tt_mf;
407
		tt_aElt[tt_aElt.length - 1] = tt_GetElt("WzTtIfRm");
408
		if(!tt_aElt[tt_aElt.length - 1])
409
			tt_aElt[0] = null;
410
	}
411
	if(tt_aElt[0])
412
	{
413
		var css = tt_aElt[0].style;
414

  
415
		css.visibility = "hidden";
416
		css.position = "absolute";
417
		css.overflow = "hidden";
418
		return true;
225 419
	}
420
	return false;
421
}
422
function tt_ResetMainDiv()
423
{
424
	tt_SetTipPos(0, 0);
425
	tt_aElt[0].innerHTML = "";
426
	tt_aElt[0].style.width = "0px";
427
	tt_h = 0;
428
}
429
function tt_IsW3cBox()
430
{
431
	var css = tt_aElt[0].style;
432

  
433
	css.padding = "10px";
434
	css.width = "40px";
435
	tt_bBoxOld = (tt_GetDivW(tt_aElt[0]) == 40);
436
	css.padding = "0px";
437
	tt_ResetMainDiv();
226 438
}
227
function tt_ShowIfrm(t_x)
439
function tt_OpaSupport()
228 440
{
229
	if(!tt_obj || !tt_ifrm) return;
230
	if(t_x)
441
	var css = tt_body.style;
442

  
443
	tt_flagOpa = (typeof(css.KhtmlOpacity) != tt_u) ? 2
444
				: (typeof(css.KHTMLOpacity) != tt_u) ? 3
445
				: (typeof(css.MozOpacity) != tt_u) ? 4
446
				: (typeof(css.opacity) != tt_u) ? 5
447
				: (typeof(css.filter) != tt_u) ? 1
448
				: 0;
449
}
450
// Ported from http://dean.edwards.name/weblog/2006/06/again/
451
// (Dean Edwards et al.)
452
function tt_SetOnloadFnc()
453
{
454
	tt_AddEvtFnc(document, "DOMContentLoaded", tt_HideSrcTags);
455
	tt_AddEvtFnc(window, "load", tt_HideSrcTags);
456
	if(tt_body.attachEvent)
457
		tt_body.attachEvent("onreadystatechange",
458
			function() {
459
				if(tt_body.readyState == "complete")
460
					tt_HideSrcTags();
461
			} );
462
	if(/WebKit|KHTML/i.test(navigator.userAgent))
231 463
	{
232
		tt_ifrm.style.width = tt_objW+'px';
233
		tt_ifrm.style.height = tt_objH+'px';
234
		tt_ifrm.style.display = "block";
464
		var t = setInterval(function() {
465
					if(/loaded|complete/.test(document.readyState))
466
					{
467
						clearInterval(t);
468
						tt_HideSrcTags();
469
					}
470
				}, 10);
235 471
	}
236
	else tt_ifrm.style.display = "none";
237 472
}
238
function tt_GetDiv(t_id)
473
function tt_HideSrcTags()
239 474
{
240
	return(
241
		tt_n4? (document.layers[t_id] || null)
242
		: tt_ie? (document.all[t_id] || null)
243
		: (document.getElementById(t_id) || null)
244
	);
475
	if(!window.tt_HideSrcTags || window.tt_HideSrcTags.done)
476
		return;
477
	window.tt_HideSrcTags.done = true;
478
	if(!tt_HideSrcTagsRecurs(tt_body))
479
		tt_Err("There are HTML elements to be converted to tooltips.\nIf you"
480
				+ " want these HTML elements to be automatically hidden, you"
481
				+ " must edit wz_tooltip.js, and set TagsToTip in the global"
482
				+ " tooltip configuration to true.", true);
245 483
}
246
function tt_GetDivW()
484
function tt_HideSrcTagsRecurs(dad)
247 485
{
248
	return tt_Int(
249
		tt_n4? tt_obj.clip.width
250
		: (tt_obj.style.pixelWidth || tt_obj.offsetWidth)
251
	);
486
	var ovr, asT2t;
487
	// Walk the DOM tree for tags that have an onmouseover or onclick attribute
488
	// containing a TagToTip('...') call.
489
	// (.childNodes first since .children is bugous in Safari)
490
	var a = dad.childNodes || dad.children || null;
491

  
492
	for(var i = a ? a.length : 0; i;)
493
	{--i;
494
		if(!tt_HideSrcTagsRecurs(a[i]))
495
			return false;
496
		ovr = a[i].getAttribute ? (a[i].getAttribute("onmouseover") || a[i].getAttribute("onclick"))
497
				: (typeof a[i].onmouseover == "function") ? (a[i].onmouseover || a[i].onclick)
498
				: null;
499
		if(ovr)
500
		{
501
			asT2t = ovr.toString().match(/TagToTip\s*\(\s*'[^'.]+'\s*[\),]/);
502
			if(asT2t && asT2t.length)
503
			{
504
				if(!tt_HideSrcTag(asT2t[0]))
505
					return false;
506
			}
507
		}
508
	}
509
	return true;
252 510
}
253
function tt_GetDivH()
511
function tt_HideSrcTag(sT2t)
254 512
{
255
	return tt_Int(
256
		tt_n4? tt_obj.clip.height
257
		: (tt_obj.style.pixelHeight || tt_obj.offsetHeight)
258
	);
513
	var id, el;
514

  
515
	// The ID passed to the found TagToTip() call identifies an HTML element
516
	// to be converted to a tooltip, so hide that element
517
	id = sT2t.replace(/.+'([^'.]+)'.+/, "$1");
518
	el = tt_GetElt(id);
519
	if(el)
520
	{
521
		if(tt_Debug && !TagsToTip)
522
			return false;
523
		else
524
			el.style.display = "none";
525
	}
526
	else
527
		tt_Err("Invalid ID\n'" + id + "'\npassed to TagToTip()."
528
				+ " There exists no HTML element with that ID.", true);
529
	return true;
530
}
531
function tt_Tip(arg, t2t)
532
{
533
	if(!tt_db || (tt_iState & 0x8))
534
		return;
535
	if(tt_iState)
536
		tt_Hide();
537
	if(!tt_Enabled)
538
		return;
539
	tt_t2t = t2t;
540
	if(!tt_ReadCmds(arg))
541
		return;
542
	tt_iState = 0x1 | 0x4;
543
	tt_AdaptConfig1();
544
	tt_MkTipContent(arg);
545
	tt_MkTipSubDivs();
546
	tt_FormatTip();
547
	tt_bJmpVert = false;
548
	tt_bJmpHorz = false;
549
	tt_maxPosX = tt_GetClientW() + tt_GetScrollX() - tt_w - 1;
550
	tt_maxPosY = tt_GetClientH() + tt_GetScrollY() - tt_h - 1;
551
	tt_AdaptConfig2();
552
	// Ensure the tip be shown and positioned before the first onmousemove
553
	tt_OverInit();
554
	tt_ShowInit();
555
	tt_Move();
259 556
}
557
function tt_ReadCmds(a)
558
{
559
	var i;
260 560

  
261
// Compat with DragDrop Lib: Ensure that z-index of tooltip is lifted beyond toplevel dragdrop element
262
function tt_SetDivZ()
561
	// First load the global config values, to initialize also values
562
	// for which no command is passed
563
	i = 0;
564
	for(var j in config)
565
		tt_aV[i++] = config[j];
566
	// Then replace each cached config value for which a command is
567
	// passed (ensure the # of command args plus value args be even)
568
	if(a.length & 1)
569
	{
570
		for(i = a.length - 1; i > 0; i -= 2)
571
			tt_aV[a[i - 1]] = a[i];
572
		return true;
573
	}
574
	tt_Err("Incorrect call of Tip() or TagToTip().\n"
575
			+ "Each command must be followed by a value.", true);
576
	return false;
577
}
578
function tt_AdaptConfig1()
263 579
{
264
	var t_i = tt_obj.style || tt_obj;
265
	if(t_i)
580
	tt_ExtCallFncs(0, "LoadConfig");
581
	// Inherit unspecified title formattings from body
582
	if(!tt_aV[TITLEBGCOLOR].length)
583
		tt_aV[TITLEBGCOLOR] = tt_aV[BORDERCOLOR];
584
	if(!tt_aV[TITLEFONTCOLOR].length)
585
		tt_aV[TITLEFONTCOLOR] = tt_aV[BGCOLOR];
586
	if(!tt_aV[TITLEFONTFACE].length)
587
		tt_aV[TITLEFONTFACE] = tt_aV[FONTFACE];
588
	if(!tt_aV[TITLEFONTSIZE].length)
589
		tt_aV[TITLEFONTSIZE] = tt_aV[FONTSIZE];
590
	if(tt_aV[CLOSEBTN])
266 591
	{
267
		if(window.dd && dd.z)
268
			t_i.zIndex = Math.max(dd.z+1, t_i.zIndex);
269
		if(tt_ifrm) tt_ifrm.style.zIndex = t_i.zIndex-1;
592
		// Use title colours for non-specified closebutton colours
593
		if(!tt_aV[CLOSEBTNCOLORS])
594
			tt_aV[CLOSEBTNCOLORS] = new Array("", "", "", "");
595
		for(var i = 4; i;)
596
		{--i;
597
			if(!tt_aV[CLOSEBTNCOLORS][i].length)
598
				tt_aV[CLOSEBTNCOLORS][i] = (i & 1) ? tt_aV[TITLEFONTCOLOR] : tt_aV[TITLEBGCOLOR];
599
		}
600
		// Enforce titlebar be shown
601
		if(!tt_aV[TITLE].length)
602
			tt_aV[TITLE] = " ";
270 603
	}
604
	// Circumvents broken display of images and fade-in flicker in Geckos < 1.8
605
	if(tt_aV[OPACITY] == 100 && typeof tt_aElt[0].style.MozOpacity != tt_u && !Array.every)
606
		tt_aV[OPACITY] = 99;
607
	// Smartly shorten the delay for fade-in tooltips
608
	if(tt_aV[FADEIN] && tt_flagOpa && tt_aV[DELAY] > 100)
609
		tt_aV[DELAY] = Math.max(tt_aV[DELAY] - tt_aV[FADEIN], 100);
271 610
}
272
function tt_SetDivPos(t_x, t_y)
611
function tt_AdaptConfig2()
273 612
{
274
	var t_i = tt_obj.style || tt_obj;
275
	var t_px = (tt_op6 || tt_n4)? '' : 'px';
276
	t_i.left = (tt_objX = t_x) + t_px;
277
	t_i.top = (tt_objY = t_y) + t_px;
278
	if(tt_ifrm)
613
	if(tt_aV[CENTERMOUSE])
279 614
	{
280
		tt_ifrm.style.left = t_i.left;
281
		tt_ifrm.style.top = t_i.top;
615
		tt_aV[OFFSETX] -= ((tt_w - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0)) >> 1);
616
		tt_aV[JUMPHORZ] = false;
282 617
	}
283 618
}
284
function tt_ShowDiv(t_x)
619
// Expose content globally so extensions can modify it
620
function tt_MkTipContent(a)
285 621
{
286
	tt_ShowIfrm(t_x);
287
	if(tt_n4) tt_obj.visibility = t_x? 'show' : 'hide';
288
	else tt_obj.style.visibility = t_x? 'visible' : 'hidden';
289
	tt_act = t_x;
622
	if(tt_t2t)
623
	{
624
		if(tt_aV[COPYCONTENT])
625
			tt_sContent = tt_t2t.innerHTML;
626
		else
627
			tt_sContent = "";
628
	}
629
	else
630
		tt_sContent = a[0];
631
	tt_ExtCallFncs(0, "CreateContentString");
632
}
633
function tt_MkTipSubDivs()
634
{
635
	var sCss = 'position:relative;margin:0px;padding:0px;border-width:0px;left:0px;top:0px;line-height:normal;width:auto;',
636
	sTbTrTd = ' cellspacing="0" cellpadding="0" border="0" style="' + sCss + '"><tbody style="' + sCss + '"><tr><td ';
637

  
638
	tt_aElt[0].style.width = tt_GetClientW() + "px";
639
	tt_aElt[0].innerHTML =
640
		(''
641
		+ (tt_aV[TITLE].length ?
642
			('<div id="WzTiTl" style="position:relative;z-index:1;">'
643
			+ '<table id="WzTiTlTb"' + sTbTrTd + 'id="WzTiTlI" style="' + sCss + '">'
644
			+ tt_aV[TITLE]
645
			+ '</td>'
646
			+ (tt_aV[CLOSEBTN] ?
647
				('<td align="right" style="' + sCss
648
				+ 'text-align:right;">'
649
				+ '<span id="WzClOsE" style="position:relative;left:2px;padding-left:2px;padding-right:2px;'
650
				+ 'cursor:' + (tt_ie ? 'hand' : 'pointer')
651
				+ ';" onmouseover="tt_OnCloseBtnOver(1)" onmouseout="tt_OnCloseBtnOver(0)" onclick="tt_HideInit()">'
652
				+ tt_aV[CLOSEBTNTEXT]
653
				+ '</span></td>')
654
				: '')
655
			+ '</tr></tbody></table></div>')
656
			: '')
657
		+ '<div id="WzBoDy" style="position:relative;z-index:0;">'
658
		+ '<table' + sTbTrTd + 'id="WzBoDyI" style="' + sCss + '">'
659
		+ tt_sContent
660
		+ '</td></tr></tbody></table></div>'
661
		+ (tt_aV[SHADOW]
662
			? ('<div id="WzTtShDwR" style="position:absolute;overflow:hidden;"></div>'
663
				+ '<div id="WzTtShDwB" style="position:relative;overflow:hidden;"></div>')
664
			: '')
665
		);
666
	tt_GetSubDivRefs();
667
	// Convert DOM node to tip
668
	if(tt_t2t && !tt_aV[COPYCONTENT])
669
		tt_El2Tip();
670
	tt_ExtCallFncs(0, "SubDivsCreated");
671
}
672
function tt_GetSubDivRefs()
673
{
674
	var aId = new Array("WzTiTl", "WzTiTlTb", "WzTiTlI", "WzClOsE", "WzBoDy", "WzBoDyI", "WzTtShDwB", "WzTtShDwR");
675

  
676
	for(var i = aId.length; i; --i)
677
		tt_aElt[i] = tt_GetElt(aId[i - 1]);
290 678
}
291
function tt_OpDeHref(t_e)
679
function tt_FormatTip()
292 680
{
293
	var t_tag;
294
	if(t_e)
681
	var css, w, h, pad = tt_aV[PADDING], padT, wBrd = tt_aV[BORDERWIDTH],
682
	iOffY, iOffSh, iAdd = (pad + wBrd) << 1;
683

  
684
	//--------- Title DIV ----------
685
	if(tt_aV[TITLE].length)
295 686
	{
296
		t_tag = t_e.target;
297
		while(t_tag)
687
		padT = tt_aV[TITLEPADDING];
688
		css = tt_aElt[1].style;
689
		css.background = tt_aV[TITLEBGCOLOR];
690
		css.paddingTop = css.paddingBottom = padT + "px";
691
		css.paddingLeft = css.paddingRight = (padT + 2) + "px";
692
		css = tt_aElt[3].style;
693
		css.color = tt_aV[TITLEFONTCOLOR];
694
		if(tt_aV[WIDTH] == -1)
695
			css.whiteSpace = "nowrap";
696
		css.fontFamily = tt_aV[TITLEFONTFACE];
697
		css.fontSize = tt_aV[TITLEFONTSIZE];
698
		css.fontWeight = "bold";
699
		css.textAlign = tt_aV[TITLEALIGN];
700
		// Close button DIV
701
		if(tt_aElt[4])
298 702
		{
299
			if(t_tag.hasAttribute("href"))
300
			{
301
				tt_tag = t_tag
302
				tt_tag.t_href = tt_tag.getAttribute("href");
303
				tt_tag.removeAttribute("href");
304
				tt_tag.style.cursor = "hand";
305
				tt_tag.onmousedown = tt_OpReHref;
306
				tt_tag.stats = window.status;
307
				window.status = tt_tag.t_href;
308
				break;
309
			}
310
			t_tag = t_tag.parentElement;
703
			css = tt_aElt[4].style;
704
			css.background = tt_aV[CLOSEBTNCOLORS][0];
705
			css.color = tt_aV[CLOSEBTNCOLORS][1];
706
			css.fontFamily = tt_aV[TITLEFONTFACE];
707
			css.fontSize = tt_aV[TITLEFONTSIZE];
708
			css.fontWeight = "bold";
709
		}
710
		if(tt_aV[WIDTH] > 0)
711
			tt_w = tt_aV[WIDTH];
712
		else
713
		{
714
			tt_w = tt_GetDivW(tt_aElt[3]) + tt_GetDivW(tt_aElt[4]);
715
			// Some spacing between title DIV and closebutton
716
			if(tt_aElt[4])
717
				tt_w += pad;
718
			// Restrict auto width to max width
719
			if(tt_aV[WIDTH] < -1 && tt_w > -tt_aV[WIDTH])
720
				tt_w = -tt_aV[WIDTH];
721
		}
722
		// Ensure the top border of the body DIV be covered by the title DIV
723
		iOffY = -wBrd;
724
	}
725
	else
726
	{
727
		tt_w = 0;
728
		iOffY = 0;
729
	}
730

  
731
	//-------- Body DIV ------------
732
	css = tt_aElt[5].style;
733
	css.top = iOffY + "px";
734
	if(wBrd)
735
	{
736
		css.borderColor = tt_aV[BORDERCOLOR];
737
		css.borderStyle = tt_aV[BORDERSTYLE];
738
		css.borderWidth = wBrd + "px";
739
	}
740
	if(tt_aV[BGCOLOR].length)
741
		css.background = tt_aV[BGCOLOR];
742
	if(tt_aV[BGIMG].length)
743
		css.backgroundImage = "url(" + tt_aV[BGIMG] + ")";
744
	css.padding = pad + "px";
745
	css.textAlign = tt_aV[TEXTALIGN];
746
	if(tt_aV[HEIGHT])
747
	{
748
		css.overflow = "auto";
749
		if(tt_aV[HEIGHT] > 0)
750
			css.height = (tt_aV[HEIGHT] + iAdd) + "px";
751
		else
752
			tt_h = iAdd - tt_aV[HEIGHT];
753
	}
754
	// TD inside body DIV
755
	css = tt_aElt[6].style;
756
	css.color = tt_aV[FONTCOLOR];
757
	css.fontFamily = tt_aV[FONTFACE];
758
	css.fontSize = tt_aV[FONTSIZE];
759
	css.fontWeight = tt_aV[FONTWEIGHT];
760
	css.textAlign = tt_aV[TEXTALIGN];
761
	if(tt_aV[WIDTH] > 0)
762
		w = tt_aV[WIDTH];
763
	// Width like title (if existent)
764
	else if(tt_aV[WIDTH] == -1 && tt_w)
765
		w = tt_w;
766
	else
767
	{
768
		// Measure width of the body's inner TD, as some browsers would expand
769
		// the container and outer body DIV to 100%
770
		w = tt_GetDivW(tt_aElt[6]);
771
		// Restrict auto width to max width
772
		if(tt_aV[WIDTH] < -1 && w > -tt_aV[WIDTH])
773
			w = -tt_aV[WIDTH];
774
	}
775
	if(w > tt_w)
776
		tt_w = w;
777
	tt_w += iAdd;
778

  
779
	//--------- Shadow DIVs ------------
780
	if(tt_aV[SHADOW])
781
	{
782
		tt_w += tt_aV[SHADOWWIDTH];
783
		iOffSh = Math.floor((tt_aV[SHADOWWIDTH] * 4) / 3);
784
		// Bottom shadow
785
		css = tt_aElt[7].style;
786
		css.top = iOffY + "px";
787
		css.left = iOffSh + "px";
788
		css.width = (tt_w - iOffSh - tt_aV[SHADOWWIDTH]) + "px";
789
		css.height = tt_aV[SHADOWWIDTH] + "px";
790
		css.background = tt_aV[SHADOWCOLOR];
791
		// Right shadow
792
		css = tt_aElt[8].style;
793
		css.top = iOffSh + "px";
794
		css.left = (tt_w - tt_aV[SHADOWWIDTH]) + "px";
795
		css.width = tt_aV[SHADOWWIDTH] + "px";
796
		css.background = tt_aV[SHADOWCOLOR];
797
	}
798
	else
799
		iOffSh = 0;
800

  
801
	//-------- Container DIV -------
802
	tt_SetTipOpa(tt_aV[FADEIN] ? 0 : tt_aV[OPACITY]);
803
	tt_FixSize(iOffY, iOffSh);
804
}
805
// Fixate the size so it can't dynamically change while the tooltip is moving.
806
function tt_FixSize(iOffY, iOffSh)
807
{
808
	var wIn, wOut, h, add, pad = tt_aV[PADDING], wBrd = tt_aV[BORDERWIDTH], i;
809

  
810
	tt_aElt[0].style.width = tt_w + "px";
811
	tt_aElt[0].style.pixelWidth = tt_w;
812
	wOut = tt_w - ((tt_aV[SHADOW]) ? tt_aV[SHADOWWIDTH] : 0);
813
	// Body
814
	wIn = wOut;
815
	if(!tt_bBoxOld)
816
		wIn -= (pad + wBrd) << 1;
817
	tt_aElt[5].style.width = wIn + "px";
818
	// Title
819
	if(tt_aElt[1])
820
	{
821
		wIn = wOut - ((tt_aV[TITLEPADDING] + 2) << 1);
822
		if(!tt_bBoxOld)
823
			wOut = wIn;
824
		tt_aElt[1].style.width = wOut + "px";
825
		tt_aElt[2].style.width = wIn + "px";
826
	}
827
	// Max height specified
828
	if(tt_h)
829
	{
830
		h = tt_GetDivH(tt_aElt[5]);
831
		if(h > tt_h)
832
		{
833
			if(!tt_bBoxOld)
834
				tt_h -= (pad + wBrd) << 1;
835
			tt_aElt[5].style.height = tt_h + "px";
836
		}
837
	}
838
	tt_h = tt_GetDivH(tt_aElt[0]) + iOffY;
839
	// Right shadow
840
	if(tt_aElt[8])
841
		tt_aElt[8].style.height = (tt_h - iOffSh) + "px";
842
	i = tt_aElt.length - 1;
843
	if(tt_aElt[i])
844
	{
845
		tt_aElt[i].style.width = tt_w + "px";
846
		tt_aElt[i].style.height = tt_h + "px";
847
	}
848
}
849
function tt_DeAlt(el)
850
{
851
	var aKid;
852

  
853
	if(el)
854
	{
855
		if(el.alt)
856
			el.alt = "";
857
		if(el.title)
858
			el.title = "";
859
		aKid = el.childNodes || el.children || null;
860
		if(aKid)
861
		{
862
			for(var i = aKid.length; i;)
863
				tt_DeAlt(aKid[--i]);
311 864
		}
312 865
	}
313 866
}
867
// This hack removes the native tooltips over links in Opera
868
function tt_OpDeHref(el)
869
{
870
	if(!tt_op)
871
		return;
872
	if(tt_elDeHref)
873
		tt_OpReHref();
874
	while(el)
875
	{
876
		if(el.hasAttribute && el.hasAttribute("href"))
877
		{
878
			el.t_href = el.getAttribute("href");
879
			el.t_stats = window.status;
880
			el.removeAttribute("href");
881
			el.style.cursor = "hand";
882
			tt_AddEvtFnc(el, "mousedown", tt_OpReHref);
883
			window.status = el.t_href;
884
			tt_elDeHref = el;
885
			break;
886
		}
887
		el = tt_GetDad(el);
888
	}
889
}
314 890
function tt_OpReHref()
315 891
{
316
	if(tt_tag)
892
	if(tt_elDeHref)
317 893
	{
318
		tt_tag.setAttribute("href", tt_tag.t_href);
319
		window.status = tt_tag.stats;
320
		tt_tag = null;
894
		tt_elDeHref.setAttribute("href", tt_elDeHref.t_href);
895
		tt_RemEvtFnc(tt_elDeHref, "mousedown", tt_OpReHref);
896
		window.status = tt_elDeHref.t_stats;
897
		tt_elDeHref = null;
321 898
	}
322 899
}
323
function tt_Show(t_e, t_id, t_sup, t_delay, t_fix, t_left, t_offx, t_offy, t_static, t_sticky, t_temp)
900
function tt_El2Tip()
901
{
902
	var css = tt_t2t.style;
903

  
904
	// Store previous positioning
905
	tt_t2t.t_cp = css.position;
906
	tt_t2t.t_cl = css.left;
907
	tt_t2t.t_ct = css.top;
908
	tt_t2t.t_cd = css.display;
909
	// Store the tag's parent element so we can restore that DOM branch
910
	// when the tooltip is being hidden
911
	tt_t2tDad = tt_GetDad(tt_t2t);
912
	tt_MovDomNode(tt_t2t, tt_t2tDad, tt_aElt[6]);
913
	css.display = "block";
914
	css.position = "static";
915
	css.left = css.top = css.marginLeft = css.marginTop = "0px";
916
}
917
function tt_UnEl2Tip()
918
{
919
	// Restore positioning and display
920
	var css = tt_t2t.style;
921

  
922
	css.display = tt_t2t.t_cd;
923
	tt_MovDomNode(tt_t2t, tt_GetDad(tt_t2t), tt_t2tDad);
924
	css.position = tt_t2t.t_cp;
925
	css.left = tt_t2t.t_cl;
926
	css.top = tt_t2t.t_ct;
927
	tt_t2tDad = null;
928
}
929
function tt_OverInit()
324 930
{
325
	if(tt_obj) tt_Hide();
326
	tt_mf = document.onmousemove || null;
327
	if(window.dd && (window.DRAG && tt_mf == DRAG || window.RESIZE && tt_mf == RESIZE)) return;
328
	var t_sh, t_h;
931
	if(window.event)
932
		tt_over = window.event.target || window.event.srcElement;
933
	else
934
		tt_over = tt_ovr_;
935
	tt_DeAlt(tt_over);
936
	tt_OpDeHref(tt_over);
937
}
938
function tt_ShowInit()
939
{
940
	tt_tShow.Timer("tt_Show()", tt_aV[DELAY], true);
941
	if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY])
942
		tt_AddEvtFnc(document, "mouseup", tt_OnLClick);
943
}
944
function tt_Show()
945
{
946
	var css = tt_aElt[0].style;
329 947

  
330
	tt_obj = tt_GetDiv(t_id);
331
	if(tt_obj)
948
	// Override the z-index of the topmost wz_dragdrop.js D&D item
949
	css.zIndex = Math.max((window.dd && dd.z) ? (dd.z + 2) : 0, 1010);
950
	if(tt_aV[STICKY] || !tt_aV[FOLLOWMOUSE])
951
		tt_iState &= ~0x4;
952
	if(tt_aV[EXCLUSIVE])
953
		tt_iState |= 0x8;
954
	if(tt_aV[DURATION] > 0)
955
		tt_tDurt.Timer("tt_HideInit()", tt_aV[DURATION], true);
956
	tt_ExtCallFncs(0, "Show")
957
	css.visibility = "visible";
958
	tt_iState |= 0x2;
959
	if(tt_aV[FADEIN])
960
		tt_Fade(0, 0, tt_aV[OPACITY], Math.round(tt_aV[FADEIN] / tt_aV[FADEINTERVAL]));
961
	tt_ShowIfrm();
962
}
963
function tt_ShowIfrm()
964
{
965
	if(tt_ie56)
332 966
	{
333
		t_e = t_e || window.event;
334
		tt_sub = !(tt_sup = t_sup);
335
		tt_sticky = t_sticky;
336
		tt_objW = tt_GetDivW();
337
		tt_objH = tt_GetDivH();
338
		tt_offX = t_left? -(tt_objW+t_offx) : t_offx;
339
		tt_offY = t_offy;
340
		if(tt_op7) tt_OpDeHref(t_e);
341
		if(tt_n4)
967
		var ifrm = tt_aElt[tt_aElt.length - 1];
968
		if(ifrm)
342 969
		{
343
			if(tt_obj.document.layers.length)
344
			{
345
				t_sh = tt_obj.document.layers[0];
346
				t_sh.clip.height = tt_objH - Math.round(t_sh.clip.width*1.3);
347
			}
970
			var css = ifrm.style;
971
			css.zIndex = tt_aElt[0].style.zIndex - 1;
972
			css.display = "block";
348 973
		}
974
	}
975
}
976
function tt_Move(e)
977
{
978
	if(e)
979
		tt_ovr_ = e.target || e.srcElement;
980
	e = e || window.event;
981
	if(e)
982
	{
983
		tt_musX = tt_GetEvtX(e);
984
		tt_musY = tt_GetEvtY(e);
985
	}
986
	if(tt_iState & 0x4)
987
	{
988
		// Prevent jam of mousemove events
989
		if(!tt_op && !tt_ie)
990
		{
991
			if(tt_bWait)
992
				return;
993
			tt_bWait = true;
994
			tt_tWaitMov.Timer("tt_bWait = false;", 1, true);
995
		}
996
		if(tt_aV[FIX])
997
		{
998
			tt_iState &= ~0x4;
999
			tt_PosFix();
1000
		}
1001
		else if(!tt_ExtCallFncs(e, "MoveBefore"))
1002
			tt_SetTipPos(tt_Pos(0), tt_Pos(1));
1003
		tt_ExtCallFncs([tt_musX, tt_musY], "MoveAfter")
1004
	}
1005
}
1006
function tt_Pos(iDim)
1007
{
1008
	var iX, bJmpMod, cmdAlt, cmdOff, cx, iMax, iScrl, iMus, bJmp;
1009

  
1010
	// Map values according to dimension to calculate
1011
	if(iDim)
1012
	{
1013
		bJmpMod = tt_aV[JUMPVERT];
1014
		cmdAlt = ABOVE;
1015
		cmdOff = OFFSETY;
1016
		cx = tt_h;
1017
		iMax = tt_maxPosY;
1018
		iScrl = tt_GetScrollY();
1019
		iMus = tt_musY;
1020
		bJmp = tt_bJmpVert;
1021
	}
1022
	else
1023
	{
1024
		bJmpMod = tt_aV[JUMPHORZ];
1025
		cmdAlt = LEFT;
1026
		cmdOff = OFFSETX;
1027
		cx = tt_w;
1028
		iMax = tt_maxPosX;
1029
		iScrl = tt_GetScrollX();
1030
		iMus = tt_musX;
1031
		bJmp = tt_bJmpHorz;
1032
	}
1033
	if(bJmpMod)
1034
	{
1035
		if(tt_aV[cmdAlt] && (!bJmp || tt_CalcPosAlt(iDim) >= iScrl + 16))
1036
			iX = tt_PosAlt(iDim);
1037
		else if(!tt_aV[cmdAlt] && bJmp && tt_CalcPosDef(iDim) > iMax - 16)
1038
			iX = tt_PosAlt(iDim);
1039
		else
1040
			iX = tt_PosDef(iDim);
1041
	}
1042
	else
1043
	{
1044
		iX = iMus;
1045
		if(tt_aV[cmdAlt])
1046
			iX -= cx + tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0);
1047
		else
1048
			iX += tt_aV[cmdOff];
1049
	}
1050
	// Prevent tip from extending past clientarea boundary
1051
	if(iX > iMax)
1052
		iX = bJmpMod ? tt_PosAlt(iDim) : iMax;
1053
	// In case of insufficient space on both sides, ensure the left/upper part
1054
	// of the tip be visible
1055
	if(iX < iScrl)
1056
		iX = bJmpMod ? tt_PosDef(iDim) : iScrl;
1057
	return iX;
1058
}
1059
function tt_PosDef(iDim)
1060
{
1061
	if(iDim)
1062
		tt_bJmpVert = tt_aV[ABOVE];
1063
	else
1064
		tt_bJmpHorz = tt_aV[LEFT];
1065
	return tt_CalcPosDef(iDim);
1066
}
1067
function tt_PosAlt(iDim)
1068
{
1069
	if(iDim)
1070
		tt_bJmpVert = !tt_aV[ABOVE];
1071
	else
1072
		tt_bJmpHorz = !tt_aV[LEFT];
1073
	return tt_CalcPosAlt(iDim);
1074
}
1075
function tt_CalcPosDef(iDim)
1076
{
1077
	return iDim ? (tt_musY + tt_aV[OFFSETY]) : (tt_musX + tt_aV[OFFSETX]);
1078
}
1079
function tt_CalcPosAlt(iDim)
1080
{
1081
	var cmdOff = iDim ? OFFSETY : OFFSETX;
1082
	var dx = tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0);
1083
	if(tt_aV[cmdOff] > 0 && dx <= 0)
1084
		dx = 1;
1085
	return((iDim ? (tt_musY - tt_h) : (tt_musX - tt_w)) - dx);
1086
}
1087
function tt_PosFix()
1088
{
1089
	var iX, iY;
1090

  
1091
	if(typeof(tt_aV[FIX][0]) == "number")
1092
	{
1093
		iX = tt_aV[FIX][0];
1094
		iY = tt_aV[FIX][1];
1095
	}
1096
	else
1097
	{
1098
		if(typeof(tt_aV[FIX][0]) == "string")
1099
			el = tt_GetElt(tt_aV[FIX][0]);
1100
		// First slot in array is direct reference to HTML element
349 1101
		else
1102
			el = tt_aV[FIX][0];
1103
		iX = tt_aV[FIX][1];
1104
		iY = tt_aV[FIX][2];
1105
		// By default, vert pos is related to bottom edge of HTML element
1106
		if(!tt_aV[ABOVE] && el)
1107
			iY += tt_GetDivH(el);
1108
		for(; el; el = el.offsetParent)
350 1109
		{
351
			t_sh = tt_GetDiv(t_id+'R');
352
			if(t_sh)
353
			{
354
				t_h = tt_objH - tt_Int(t_sh.style.pixelTop || t_sh.style.top || 0);
355
				if(typeof t_sh.style.pixelHeight != tt_u) t_sh.style.pixelHeight = t_h;
356
				else t_sh.style.height = t_h+'px';
357
			}
1110
			iX += el.offsetLeft || 0;
1111
			iY += el.offsetTop || 0;
358 1112
		}
1113
	}
1114
	// For a fixed tip positioned above the mouse, use the bottom edge as anchor
1115
	// (recommended by Christophe Rebeschini, 31.1.2008)
1116
	if(tt_aV[ABOVE])
1117
		iY -= tt_h;
1118
	tt_SetTipPos(iX, iY);
1119
}
1120
function tt_Fade(a, now, z, n)
1121
{
1122
	if(n)
1123
	{
1124
		now += Math.round((z - now) / n);
1125
		if((z > a) ? (now >= z) : (now <= z))
1126
			now = z;
1127
		else
1128
			tt_tFade.Timer(
1129
				"tt_Fade("
1130
				+ a + "," + now + "," + z + "," + (n - 1)
1131
				+ ")",
1132
				tt_aV[FADEINTERVAL],
1133
				true
1134
			);
1135
	}
1136
	now ? tt_SetTipOpa(now) : tt_Hide();
1137
}
1138
function tt_SetTipOpa(opa)
1139
{
1140
	// To circumvent the opacity nesting flaws of IE, we set the opacity
1141
	// for each sub-DIV separately, rather than for the container DIV.
1142
	tt_SetOpa(tt_aElt[5], opa);
1143
	if(tt_aElt[1])
1144
		tt_SetOpa(tt_aElt[1], opa);
1145
	if(tt_aV[SHADOW])
1146
	{
1147
		opa = Math.round(opa * 0.8);
1148
		tt_SetOpa(tt_aElt[7], opa);
1149
		tt_SetOpa(tt_aElt[8], opa);
1150
	}
1151
}
1152
function tt_OnCloseBtnOver(iOver)
1153
{
1154
	var css = tt_aElt[4].style;
359 1155

  
360
		xlim = tt_Int((tt_db && tt_db.clientWidth)? tt_db.clientWidth : window.innerWidth) +
361
			tt_Int(window.pageXOffset || (tt_db? tt_db.scrollLeft : 0) || 0) -
362
			tt_objW -
363
			(tt_n4? 21 : 0);
364
		ylim = tt_Int(window.innerHeight || tt_db.clientHeight) +
365
			tt_Int(window.pageYOffset || (tt_db? tt_db.scrollTop : 0) || 0) -
366
			tt_objH - tt_offY;
367

  
368
		tt_SetDivZ();
369
		if(t_fix) tt_SetDivPos(tt_Int((t_fix = t_fix.split(','))[0]), tt_Int(t_fix[1]));
370
		else tt_SetDivPos(tt_EvX(t_e), tt_EvY(t_e));
371

  
372
		var t_txt = 'tt_ShowDiv(\'true\');';
373
		if(t_sticky) t_txt += '{'+
374
				'tt_ReleasMov();'+
375
				'window.tt_upFunc = document.onmouseup || null;'+
376
				'if(document.captureEvents) document.captureEvents(Event.MOUSEUP);'+
377
				'document.onmouseup = new Function("window.setTimeout(\'tt_Hide();\', 10);");'+
378
			'}';
379
		else if(t_static) t_txt += 'tt_ReleasMov();';
380
		if(t_temp > 0) t_txt += 'window.tt_rtm = window.setTimeout(\'tt_sticky = false; tt_Hide();\','+t_temp+');';
381
		window.tt_rdl = window.setTimeout(t_txt, t_delay);
382

  
383
		if(!t_fix)
1156
	iOver <<= 1;
1157
	css.background = tt_aV[CLOSEBTNCOLORS][iOver];
1158
	css.color = tt_aV[CLOSEBTNCOLORS][iOver + 1];
1159
}
1160
function tt_OnLClick(e)
1161
{
1162
	//  Ignore right-clicks
1163
	e = e || window.event;
1164
	if(!((e.button && e.button & 2) || (e.which && e.which == 3)))
1165
	{
1166
		if(tt_aV[CLICKSTICKY] && (tt_iState & 0x4))
384 1167
		{
385
			if(document.captureEvents) document.captureEvents(Event.MOUSEMOVE);
386
			document.onmousemove = tt_Move;
1168
			tt_aV[STICKY] = true;
1169
			tt_iState &= ~0x4;
387 1170
		}
1171
		else if(tt_aV[CLICKCLOSE])
1172
			tt_HideInit();
388 1173
	}
389 1174
}
390
var tt_area = false;
391
function tt_Move(t_ev)
1175
function tt_Int(x)
1176
{
1177
	var y;
1178

  
1179
	return(isNaN(y = parseInt(x)) ? 0 : y);
1180
}
1181
Number.prototype.Timer = function(s, iT, bUrge)
1182
{
1183
	if(!this.value || bUrge)
1184
		this.value = window.setTimeout(s, iT);
1185
}
1186
Number.prototype.EndTimer = function()
392 1187
{
393
	if(!tt_obj) return;
394
	if(tt_n6 || tt_w3c)
1188
	if(this.value)
395 1189
	{
396
		if(tt_wait) return;
397
		tt_wait = true;
398
		setTimeout('tt_wait = false;', 5);
1190
		window.clearTimeout(this.value);
... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.

Auch abrufbar als: Unified diff