Extension:FBConnect/wz tooltip/wz tooltip.js

')			: '')		+ ' '		+ ' '		+ (tt_aV[SHADOW]			? (' ' + ' ')			: '')		);	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) {		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 {			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]; }		// Ensure the top border of the body DIV be covered by the title DIV iOffY = -wBrd; }	else {		tt_w = 0; iOffY = 0; }

// Body DIV css = tt_aElt[5].style; css.top = iOffY + "px"; if(wBrd) {		css.borderColor = tt_aV[BORDERCOLOR]; css.borderStyle = tt_aV[BORDERSTYLE]; css.borderWidth = wBrd + "px"; }	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); } // Fixate the size so it can't dynamically change while the tooltip is moving. function tt_FixSize(iOffY, iOffSh) {	var wIn, wOut, h, add, pad = tt_aV[PADDING], wBrd = tt_aV[BORDERWIDTH], i;

tt_aElt[0].style.width = tt_w + "px"; tt_aElt[0].style.pixelWidth = tt_w; wOut = tt_w - ((tt_aV[SHADOW]) ? tt_aV[SHADOWWIDTH] : 0); // Body wIn = wOut; 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) {		h = tt_GetDivH(tt_aElt[5]); if(h > tt_h) {			if(!tt_bBoxOld) tt_h -= (pad + wBrd) << 1; tt_aElt[5].style.height = tt_h + "px"; }	}	tt_h = tt_GetDivH(tt_aElt[0]) + iOffY; // Right shadow if(tt_aElt[8]) 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); } } function tt_OpReHref {	if(tt_elDeHref) {		tt_elDeHref.setAttribute("href", tt_elDeHref.t_href); tt_RemEvtFnc(tt_elDeHref, "mousedown", tt_OpReHref); window.status = tt_elDeHref.t_stats; tt_elDeHref = null; } } function tt_El2Tip {	var css = tt_t2t.style;

// Store previous positioning tt_t2t.t_cp = css.position; tt_t2t.t_cl = css.left; tt_t2t.t_ct = css.top; tt_t2t.t_cd = css.display; // Store the tag's parent element so we can restore that DOM branch // when the tooltip is being hidden tt_t2tDad = tt_GetDad(tt_t2t); tt_MovDomNode(tt_t2t, tt_t2tDad, tt_aElt[6]); css.display = "block"; css.position = "static"; css.left = css.top = css.marginLeft = css.marginTop = "0px"; } function tt_UnEl2Tip {	// Restore positioning and display var css = tt_t2t.style;

css.display = tt_t2t.t_cd; tt_MovDomNode(tt_t2t, tt_GetDad(tt_t2t), tt_t2tDad); css.position = tt_t2t.t_cp; css.left = tt_t2t.t_cl; css.top = tt_t2t.t_ct; tt_t2tDad = null; } function tt_OverInit {	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 {	var css = tt_aElt[0].style;

// Override the z-index of the topmost wz_dragdrop.js D&D item css.zIndex = Math.max((window.dd && dd.z) ? (dd.z + 2) : 0, 1010); 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) {		var ifrm = tt_aElt[tt_aElt.length - 1]; if(ifrm) {			var css = ifrm.style; css.zIndex = tt_aElt[0].style.zIndex - 1; css.display = "block"; }	} } function tt_Move(e) {	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) {			if(tt_bWait) return; tt_bWait = true; tt_tWaitMov.Timer("tt_bWait = false;", 1, true); }		if(tt_aV[FIX]) {			tt_iState &= ~0x4; tt_PosFix; }		else if(!tt_ExtCallFncs(e, "MoveBefore")) tt_SetTipPos(tt_Pos(0), tt_Pos(1)); tt_ExtCallFncs([tt_musX, tt_musY], "MoveAfter") } } function tt_Pos(iDim) {	var iX, bJmpMod, cmdAlt, cmdOff, cx, iMax, iScrl, iMus, bJmp;

// Map values according to dimension to calculate if(iDim) {		bJmpMod = tt_aV[JUMPVERT]; cmdAlt = ABOVE; cmdOff = OFFSETY; cx = tt_h; iMax = tt_maxPosY; iScrl = tt_GetScrollY; iMus = tt_musY; bJmp = tt_bJmpVert; }	else {		bJmpMod = tt_aV[JUMPHORZ]; cmdAlt = LEFT; cmdOff = OFFSETX; cx = tt_w; iMax = tt_maxPosX; iScrl = tt_GetScrollX; iMus = tt_musX; bJmp = tt_bJmpHorz; }	if(bJmpMod) {		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; } 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 {	var iX, iY;

if(typeof(tt_aV[FIX][0]) == "number") {		iX = tt_aV[FIX][0]; iY = tt_aV[FIX][1]; }	else {		if(typeof(tt_aV[FIX][0]) == "string") 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) {			iX += el.offsetLeft || 0; iY += el.offsetTop || 0; }	}	// For a fixed tip positioned above the mouse, use the bottom edge as anchor // (recommended by Christophe Rebeschini, 31.1.2008) if(tt_aV[ABOVE]) iY -= tt_h; tt_SetTipPos(iX, iY); } function tt_Fade(a, now, z, n) { 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;

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; }		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		); }	// 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) {		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;	}	else	{		opa /= 100.0;		switch(tt_flagOpa)		{		case 2:			css.KhtmlOpacity = opa; break;		case 3:			css.KHTMLOpacity = opa; break;		case 4:			css.MozOpacity = opa; break;		case 5:			css.opacity = opa; break;		}	} } function tt_Err(sErr, bIfDebug) {	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; } // This needs to be executed in the body, so add it as an onload hook addOnloadHook(tt_Init);