/*
* ***** BEGIN LICENSE BLOCK *****
* Version: ZAPL 1.1
*
* The contents of this file are subject to the Zimbra AJAX Public
* License Version 1.1 ("License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.zimbra.com/license
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is: Zimbra AJAX Toolkit.
*
* The Initial Developer of the Original Code is Zimbra, Inc.
* Portions created by Zimbra are Copyright (C) 2005 Zimbra, Inc.
* All Rights Reserved.
*
* Contributor(s):
*
* ***** END LICENSE BLOCK *****
*/
function DwtToolTip(shell, className, dialog) {
this.shell = shell;
this._dialog = dialog;
this._div = shell.getDocument().createElement("div");
this._div.className = className || "DwtToolTip";
this._div.style.position = DwtControl.ABSOLUTE_STYLE;
this.shell.getHtmlElement().appendChild(this._div);
Dwt.setZIndex(this._div, Dwt.Z_HIDDEN);
var borderStyle = AjxEnv.isIE ? "hover_IE" : "hover";
var substitutions = { id: "tooltip" };
this._borderStart = DwtBorder.getBorderStartHtml(borderStyle, substitutions);
this._borderEnd = DwtBorder.getBorderEndHtml(borderStyle, substitutions);
}
DwtToolTip.TOOLTIP_DELAY = 750;
DwtToolTip.prototype.toString =
function() {
return "DwtToolTip";
}
DwtToolTip.prototype.getContent =
function() {
return this._div.innerHTML;
}
DwtToolTip.prototype.setContent =
function(content) {
this._content = content;
}
DwtToolTip.prototype.popup = function(x, y) {
if (this._content != null) {
this._div.innerHTML = this._borderStart + this._content + this._borderEnd;
var WINDOW_GUTTER = 5;
var POPUP_OFFSET_X = 8;
var POPUP_OFFSET_Y = 8;
var tt = document.getElementById('tooltip_tip_t');
var tb = document.getElementById('tooltip_tip_b');
var t = tt;
var ex = x;
var ey = y;
var w = this.shell.getSize();
var ww = w.x;
var wh = w.y;
var p = Dwt.getSize(this._div);
var pw = p.x;
var ph = p.y;
var btEl = document.getElementById('tooltip_border_tm');
var blEl = document.getElementById('tooltip_border_ml');
var brEl = document.getElementById('tooltip_border_mr');
var bbEl = document.getElementById('tooltip_border_bm');
var bth = Dwt.getSize(btEl).y;
var blw = Dwt.getSize(blEl).x;
var brw = Dwt.getSize(brEl).x;
var bbh = Dwt.getSize(bbEl).y;
var ttw = Dwt.getSize(tt).x;
var tth = Dwt.getSize(tt).y;
var tbw = Dwt.getSize(tb).x;
var tbh = Dwt.getSize(tb).y;
/***
DBG.println(
"---
"+
"event: <"+ex+","+ey+">
"+
"window: "+ww+"x"+wh+"
"+
"popup: "+pw+"x"+ph+"
"+
"borders: top="+btEl+", left="+blEl+", right="+brEl+", bottom="+bbEl+"
"+
"borders: top="+bth+", left="+blw+", right="+brw+", bottom="+bbh+"
"+
"tip: top="+ttw+"x"+tth+", bottom="+tbw+"x"+tbh
);
/***/
var px = ex - pw / 2 - POPUP_OFFSET_X;
var py;
var ty;
var tw;
// tip up
var adjust = tbh; // NOTE: because bottom tip is relative
if (ph + ey + tth - bth + POPUP_OFFSET_Y < wh - WINDOW_GUTTER + adjust) {
py = ey + tth - bth + POPUP_OFFSET_Y;
tb.style.display = "none";
ty = bth - tth;
tw = ttw;
t = tt;
}
// tip down
else {
py = ey - ph - tbh + bbh - POPUP_OFFSET_Y;
py += tbh; // NOTE: because bottom tip is relative
tt.style.display = "none";
ty = -bbh;
tw = tbw;
t = tb;
}
//DBG.println("position: <"+px+","+py+">");
// make sure popup is wide enough for tip graphic
if (pw - blw - brw < tw) {
var contentEl = document.getElementById("tooltip_contents");
contentEl.width = tw; // IE
contentEl.style.width = String(tw)+"px"; // everyone else
}
// adjust popup x-location
if (px < WINDOW_GUTTER) {
px = WINDOW_GUTTER;
}
else if (px + pw > ww - WINDOW_GUTTER) {
px = ww - WINDOW_GUTTER - pw;
}
//DBG.println("position: <"+px+","+py+">");
// adjust tip x-location
var tx = ex - px - tw / 2;
//DBG.println("tip: <"+tx+","+ty+">");
if (tx + tw > pw - brw) {
tx = pw - brw - tw;
}
if (tx < blw) {
tx = blw;
}
//DBG.println("tip: <"+tx+","+ty+">");
t.style.left = tx;
t.style.top = ty;
if (t == tb) {
var y = t.offsetTop;//Dwt.getLocation(t).y;
this._div.style.clip = "rect(auto,auto,"+(y + tbh)+",auto)";
}
else {
this._div.style.clip = "rect(auto,auto,auto,auto)";
}
Dwt.setLocation(this._div, px, py);
var zIndex = this._dialog ? this._dialog.getZIndex() + Dwt.Z_INC : Dwt.Z_TOOLTIP;
Dwt.setZIndex(this._div, zIndex);
}
}
DwtToolTip.prototype.popdown =
function() {
if (this._content != null) {
Dwt.setLocation(this._div, Dwt.LOC_NOWHERE, Dwt.LOC_NOWHERE);
}
}