
var AjaxTooltip = {

	StaticVal: 0,

	_delay: 1000,

	loaderIMG: '/scripts/ajax.toolkit/pz01.gif',

	_cache: {},

	_baseTooltipClass: "ajax-tooltip",

	addTooltip: function(item, callwhat, callparams, notcache, showbywhat, addClassName, addCloseButton) {

		if (!$g(item)) return;
		if (showbywhat) {
			if (showbywhat == 1) showbywhat = "click";

			if (showbywhat == "rightclick") {
				f = function(e) {
					if (e.which && !window.opera) rightclick = (e.which == 3);
					else if (e.button) rightclick = (e.button == 2);
					if (rightclick) {
						e.stopPropagation();
						e.preventDefault();
						AjaxTooltip.LoadTooltip(e, this);
						return false;
					}
				}
				showbywhat = "mouseup";
				AjaxToolkit.addEvent(item, showbywhat, f);
				showbywhat = "contextmenu";
			} else {
				f = AjaxTooltip.LoadTooltip;
			}

			AjaxToolkit.addEvent(item, showbywhat, f);
			item.Tooltipshowbyclick = showbywhat;
		} else {
			item._tooltip_show_timer = null;
			item._tooltip_hide_timer = null;
			var f0 = function() {
				clearTimeout(this._tooltip_hide_timer);
				this._tooltip_show_timer = setTimeout('AjaxTooltip.LoadTooltip(false, $g("'+this.id+'"));', AjaxTooltip._delay);
			};
			var f1 = function() {
				clearTimeout(this._tooltip_show_timer);
				this._tooltip_hide_timer = setTimeout('AjaxTooltip.HideTooltip(false, $g("'+this.id+'"));', AjaxTooltip._delay);
			}
			AjaxToolkit.addEvent(item, 'mouseover', f0 );
			AjaxToolkit.addEvent(item, 'mouseout', f1 );
		}

		item.onTooltipShow = function(){};
		item.onTooltipLoad = function(){};
		item.onTooltipHide = function(){};
		item.destroyTooltipOnClose = false;

		item.Tooltipcall = [callwhat, callparams];
		if (notcache) item.notcache = 1;
		if (addClassName) item.addClassName = addClassName;
		if (addCloseButton) item.addCloseButton = addCloseButton;
		return item;
	},

	CreateTooltip: function(item) {
		var tooltipElement = document.createElement('DIV');
		tooltipElement.className = AjaxTooltip._baseTooltipClass;
		if (item.addClassName) {tooltipElement.className = tooltipElement.className + " " + item.addClassName};
		var zX = item.style.zIndex, zI = item.offsetParent;
		while (zI && zI.offsetParent) {
			if (zI.style.zIndex > zX) zX = zI.style.zIndex;
			zI = zI.offsetParent;
		}
		tooltipElement.style.zIndex = zX>199 ? zX : 200 ;
		tooltipElement.style["position"] = "absolute";
		tooltipElement.style["display"] = "none";

		tooltipElement.ownerItem = item;
		tooltipElement.isLoaded = false;
		tooltipElement.isLoading = false;
		tooltipElement.id = "ajax-tooltip_"+this.StaticVal++;
		tooltipElement.call = item.Tooltipcall;
		if (!item.notcache) tooltipElement.cacheid = item.Tooltipcall[0]+':'+AjaxToolkit.packArray(item.Tooltipcall[1]);
		item.tooltip = tooltipElement;

		document.body.appendChild(tooltipElement);
		if (item.Tooltipshowbyclick) {
			tooltipElement.Tooltipshowbyclick = item.Tooltipshowbyclick;
		} else {
			//AjaxToolkit.addEvent(tooltipElement, 'mouseover', AjaxTooltip.ShowTooltip);
			//AjaxToolkit.addEvent(tooltipElement, 'mouseout', AjaxTooltip.HideTooltip);

			var f0 = function() {
				clearTimeout(this.ownerItem._tooltip_hide_timer);
				AjaxTooltip.ShowTooltip(this);
			};
			var f1 = function() {
				clearTimeout(this.ownerItem._tooltip_show_timer);
				this.ownerItem._tooltip_hide_timer = setTimeout('AjaxTooltip.HideTooltip(false, $g("'+this.id+'"));', AjaxTooltip._delay);
			}
			AjaxToolkit.addEvent(tooltipElement, 'mouseover', f0 );
			AjaxToolkit.addEvent(tooltipElement, 'mouseout', f1 );
		}
	},

	LoadTooltip: function(e, el) {
		if (!el) el = this;
		if (!el.tooltip) AjaxTooltip.CreateTooltip(el);
		if (el.tooltip) {
			if (!el.tooltip.isLoaded) {

				if (!el.tooltip.isLoading) {
					el.tooltip.isLoading = true;
					el.tooltip.innerHTML = "<span><img src=\""+AjaxTooltip.loaderIMG+"\" /></span>";
					var url = '/.ajax/?f=tooltip-loader&tooltipId='+el.tooltip.id+'&call='+el.tooltip.call[0]+AjaxToolkit.packArray(el.tooltip.call[1]);
					if (AjaxTooltip._cache[el.tooltip.cacheid]) {
						AjaxTooltip.AjaxCallBack(el.tooltip.id, AjaxTooltip._cache[el.tooltip.cacheid], true);
					} else {
						loadXMLDoc(url);
					}
				}
			}

			AjaxTooltip.ShowParentTooltip(el);
			el.tooltip.style.display = "block";

			var addClassName = AjaxTooltip.SetTooltipPos(el, el.tooltipSkipSmartPos);

			var cName = AjaxTooltip._baseTooltipClass + (el.addClassName ? (' ' + el.addClassName) : '') + ' ' + addClassName;
			if (el.tooltip.className != cName) el.tooltip.className = cName;
			AjaxToolkit.processBehind(el.tooltip, 'hide');
			el.onTooltipShow(el.tooltip);

			if (e) {
				e.stopPropagation();
				e.preventDefault();
				return false;
			}
		}

	},

	SetTooltipPos: function(el, skipsmart) {
		var pos1 = Coordinates.northwestOffset(el, true);
		var pos2 = Coordinates.southeastOffset(el, true);

		var top = pos1.y + 2;
		var left = pos2.x - 2;
		var classNames = ['north', 'east'];

		var toolWidth = parseInt(el.tooltip.offsetWidth);
		var toolHeight = parseInt(el.tooltip.offsetHeight);

		var skip = skipsmart && ( typeof skipsmart != "string" ) && !isNumber(skipsmart);

		if (!skip) {
			var winWidth, winHeight, d=document;
			if (typeof window.innerWidth!='undefined') {
				winWidth = window.innerWidth;
				winHeight = window.innerHeight;
			} else {
				if (d.documentElement && typeof d.documentElement.clientWidth!='undefined' && d.documentElement.clientWidth!=0) {
					winWidth = d.documentElement.clientWidth
					winHeight = d.documentElement.clientHeight
				} else {
					if (d.body && typeof d.body.clientWidth!='undefined') {
						winWidth = d.body.clientWidth
						winHeight = d.body.clientHeight
					}
				}
			}

			winWidth = winWidth + (document.all ? document.body.scrollLeft : pageXOffset);
			winHeight = winHeight + (document.all ? document.body.scrollTop : pageYOffset);

			if (skipsmart == 'left') {
				left = pos1.x + 2;
			} else if (skipsmart == 'right') {

			} else if (left + toolWidth > winWidth) {
				var rleft = pos1.x + 6 - toolWidth;
				if (rleft>0) {
					left = rleft;
					classNames[1] = 'west';
				}
			}

			if (skipsmart == 'top') {
				top = pos1.y + 2;
			} else if (skipsmart == 'bottom') {

			} else if (top + toolHeight > winHeight) {
				var rtop = pos1.y + 10 - toolHeight;
				if (rtop > 0) {
					top = rtop;
					classNames[1] = 'south';
				}
			}
		}

		el.tooltip.style["top"] = top + "px";
		el.tooltip.style["left"] = left + "px";

		return classNames.join('-');
	},

	ShowParentTooltip: function(item) {
		var obj = item;
		while(obj&&!(obj.nodeName=="DIV"&&obj.className.match(/ajax-tooltip/i))) {
			obj=obj.parentNode;
		}/**/
		if (obj) {
/*			if (!obj.isLoaded) {
				AjaxTooltip.LoadTooltip(false, obj.ownerItem);
			} else {
				/ *obj.style.display = "block";* /
				AjaxTooltip.ShowTooltip(obj);
			}
*/
			AjaxTooltip.ShowTooltip(obj);
			clearTimeout(obj.ownerItem._tooltip_hide_timer);
			AjaxTooltip.ShowParentTooltip(obj.parentNode);
		}
	},

	ResetTooltip: function(item, reload) {
		var obj = $g(item);
		while(obj&&!(obj.nodeName=="DIV"&&obj.className.match(/ajax-tooltip/i))) {
			obj=obj.parentNode;
		}/**/
		if (obj) {
			obj.isLoaded=false;
			obj.isLoading=false;
			clearTimeout(obj.ownerItem._tooltip_show_timer);
			clearTimeout(obj.ownerItem._tooltip_hide_timer);
			//alert(obj.id);
			AjaxTooltip.HideTooltip.call(obj);
			if (reload==1) {AjaxTooltip.LoadTooltip(false, obj.ownerItem);}
			return true;
		}
	},

	ResetTooltipTree: function(item, reload) {
		var obj = $g(item);
		while(obj&&!(obj.nodeName=="DIV"&&obj.className.match(/ajax-tooltip/i))) {
			obj=obj.parentNode;
		}/**/
		if (obj) {
			obj.isLoaded=false;
			obj.isLoading=false;
			clearTimeout(obj.ownerItem._tooltip_show_timer);
			clearTimeout(obj.ownerItem._tooltip_hide_timer);
			//alert(obj.id);
			AjaxToolkit.processBehind(obj, 'show');
			if (AjaxTooltip.ResetTooltipTree(obj.ownerItem, reload)) {
				obj.style.display = "none";
			} else {
				if (reload==1) {AjaxTooltip.LoadTooltip(false, obj.ownerItem);} else {obj.style.display = "none";}
			}
			return true;
		}
	},

	HideParentTooltip: function(item) {
		var obj = item;
		while(obj&&!(obj.nodeName=="DIV"&&obj.className.match(/ajax-tooltip/i))) {
			obj=obj.parentNode;
		}/**/
		if (obj) {
			clearTimeout(obj.ownerItem._tooltip_show_timer);
			AjaxToolkit.processBehind(obj, 'show');
			obj.style.display = "none";
			AjaxTooltip.HideParentTooltip(obj.parentNode);
		}
	},

	HideTooltip: function(e, el) {
		var item = el || this;
		if (item.ownerItem) {
			item = item;
			//alert(item.id);
		} else if (item.tooltip) {
			item = item.tooltip;
		}
		if (item && item.ownerItem) {
			//AjaxTooltip.HideParentTooltip(item.ownerItem);
			clearTimeout(item.ownerItem._tooltip_show_timer);
			AjaxToolkit.processBehind(item, 'show');
			item.ownerItem.onTooltipHide(item);
			item.style.display = "none";
			AjaxTooltip.ShowParentTooltip(item.ownerItem);
		}
	},

	ShowTooltip: function(el) {
		var item = el || this;
		if (item.ownerItem) {
			item = item;
		} else if (item.tooltip) {
			item = item.tooltip;
		}
//		if (item && item.ownerItem) {
//			clearTimeout(item.ownerItem._tooltip_hide_timer);
//			AjaxTooltip.LoadTooltip(false, item.ownerItem);
//		}
	},

	AjaxCallBack: function(id, data, fromCache) {
		var tooltip = $g(id);
		if (tooltip) {
			if (typeof data == "string") {
				if (window["pasteInto"]) {pasteInto(id, data);} else {$g(id).innerHTML = data;}
			} else if(data) {
				tooltip._dataSource = data.parentNode;
				data.parentNode.removeChild(data);
				$g(id).innerHTML = "";
				$g(id).appendChild(data);
				/*
				var p = data.parentNode;
				p.removeChild(data);
				$g(id).innerHTML = "";
				p._link = $g(id).appendChild(data);*/

			}
			tooltip.isLoaded = true;
			if (tooltip.cacheid) {
				AjaxTooltip._cache[tooltip.cacheid] = data;
			}
			if (tooltip.ownerItem.addCloseButton) {
				var delDiv = $a(tooltip, "DIV");
				delDiv.innerHTML = "X";
				delDiv.className = "tooltipClose";
				delDiv.style.position = "absolute";
				delDiv.style.top = "0px";
				delDiv.style.right = "0px";
				delDiv.style.width = "10px";
				delDiv.style.height = "10px";
				delDiv.style.cursor = "pointer";
				AjaxToolkit.addEvent(delDiv, "click", function() {AjaxTooltip.HideTooltip(false, tooltip);});
				if (tooltip.ownerItem.destroyTooltipOnClose) {
					_a.addEvent(delDiv, "click", function() {
						AjaxToolkit.processBehind(tooltip, 'show');
						if (tooltip._dataSource) {
							var c = tooltip.childNodes;
							for (var i=0; i<c.length; i++) {
								if (c[i] != this) {
									$a(tooltip._dataSource, c[i]);
								}
							}
						}
						tooltip.innerHTML = "";
						tooltip.isLoaded = false; tooltip.isLoading = false;
					});
				}
			}
			if (!fromCache) {
				tooltip.ownerItem.onTooltipLoad(tooltip);
			}
			AjaxTooltip.LoadTooltip(null, tooltip.ownerItem);
		}
	},

	putUnderground: function() {
		var u = document.createElement('DIV');
		u.style.position = "absolute";
		u.style.top = 0; u.style.left = 0;
		u.style.zIndex = 99; u.style.overflow = "hidden";
		u.style.width = "100%"; u.style.height = "100%";
		u.id = "undgr-"+this.StaticVal++;
		document.body.appendChild(u);
		var f = function(e) {if (this.parentNode) this.parentNode.removeChild(this);};
		AjaxToolkit.addEvent(u, 'click', f);
		return u;
	}
}

var fooImg = new Image();
fooImg.src = AjaxTooltip.loaderIMG;

var JSTooltip = {

	prototype: AjaxToolkit,

	addTooltip: function(item, content, showbywhat, addClassName, skipSmartPos, addCloseButton) {
		item = $g(item);
		content = content || item.title;
		if (!content) return false;
		if (showbywhat) {
			AjaxToolkit.addEvent(item, showbywhat, JSTooltip.LoadTooltip);
			item.Tooltipshowbyclick = showbywhat;
		} else {
			AjaxToolkit.addEvent(item, 'mouseover', JSTooltip.LoadTooltip);
			AjaxToolkit.addEvent(item, 'mouseout', AjaxTooltip.HideTooltip);
		}

		item.onTooltipShow = function(){};
		item.onTooltipHide = function(){};
		item.onTooltipLoad = function(){};

		addClassName = addClassName ? (addClassName + " static-tooltip") : "static-tooltip";

		item.addClassName = addClassName;
		item.tooltipSkipSmartPos = skipSmartPos || null;
		item.TooltipContent = content;
		item.notcache = 1;
		if (addCloseButton) item.addCloseButton = addCloseButton;
		return item;
	},

	LoadTooltip: function(e, el) {
		if (!el) el = this;
		if (!el.tooltip) AjaxTooltip.CreateTooltip(el);
		if (el.tooltip) {
			if (el.getAttribute("title")) {
				el.removeAttribute("title");
				el.title = "";
			}
			if (!el.tooltip.isLoaded) {

				AjaxTooltip.AjaxCallBack(el.tooltip.id, el.TooltipContent);
			}

			AjaxTooltip.ShowParentTooltip(el);

			el.tooltip.style.display = "block";

			AjaxTooltip.SetTooltipPos(el, el.tooltipSkipSmartPos);

			el.onTooltipShow(el.tooltip);
			AjaxToolkit.processBehind(el.tooltip, 'hide');

			e.stopPropagation();
		}
	}
};

//JSTooltip.prototype = AjaxTooltip;

