/*
 * ToolTip
 *
 * Depends:
 *	ui.core.js
 *	ui.draggable.js
 *	ui.resizable.js
 *  ui.dialog.js
 */

(function($){
	jQuery.fn.extend({
		ToolTip: function(type) {
			if (type == "onload") {
				this.each(function() {
					var config = $(this).ParseClass();
					if (config && config.divSelector) {
						$(config.divSelector).hide();
					}
				});
				return;
			}
			this.live("mouseover", function(e) {
				var $this = $(this);
				
				var config = $this.ParseClass();
				if (!config) {
					config = {};
				}
				
				if (config.divSelector) {
					$this.attr("titleToolTip", $(config.divSelector).hide().html());
				} else if ($this.attr("title")) {
					$this.attr("titleToolTip", $this.attr("title"));
					$this.attr("title", "");
				}
				
				var title = String($this.attr("titleToolTip")).split("||"),
				dialog = getDialog(config),
				content = (title.length > 1)? title[1] : title[0];
				try {
					content = decodeURIComponent(content);
				} catch(e) {}
				
				if (title.length > 1) {
					$("div.ui-dialog-titlebar", dialog.parent()).show();
					dialog.dialog("option", "title", title[0]);
				} else {
					$("div.ui-dialog-titlebar", dialog.parent()).hide();
				}

				dialog.html('<div class="box rBox noJS">' + content + '</div>').dialog("open");
				if (dialog.roundbox) {
					dialog.data("roundboxinit", false).roundbox();
					dialog.find("div.rBox").roundbox();
				}
				
				var offset = $this.offset(),
				$window = $(window),
				parent = dialog.parent(".ui-dialog"),
				arr = parent.find("div.arrow").css("top", null),
				scrollOffset = {left:$window.scrollLeft(), top:$window.scrollTop()},
				windowSize = {width:$window.width(), height:$window.height()},
				dialogSize = {width:parent.outerWidth(), height:parent.outerHeight()},
				left = offset.left - scrollOffset.left + $this.outerWidth() + arr.width(),
				top = offset.top - scrollOffset.top;
				
				if ($this.height() < (arr.position().top + arr.height()/2) * 2) {
					top = top - (arr.position().top + arr.height()/2) + $this.height()/2;
				}
				
				dialog.dialog("option", "position", [left, top]);
				
				if (left-1 > parent.offset().left + $(document).scrollLeft()) {
					parent.addClass("arrowRight");
					
					left = offset.left - scrollOffset.left - arr.width() - dialogSize.width;
					
					dialog.dialog("option", "position", [left, top]);
				} else {
					parent.removeClass("arrowRight");
				}
				arr.css({"top": null});
				var arrTop = offset.top-parent.offset().top-arr.height()/2 + 3;
				if (arrTop < 2) {
					arrTop = 5;
				} else if (arrTop > dialogSize.height + 7) {
					arrTop = dialogSize.height + 7;
				}
				arr.css("top", arrTop + "px");
				
                if ($(this).hasClass("persist-hover"))
				    return true;

				return false;
			});
			this.live("mouseout", function(e) {
				getDialog().dialog("close").dialog("destroy");
				$.fn.ToolTip.dialog = null;
			});
			this.live("click", function(e) {
			    if ($(this).hasClass("persist-click"))
			        return true;
				return false;
			});
			var getDialog = function(exts) {
				if (!$.fn.ToolTip.dialog) {
					$.fn.ToolTip.dialog = $('<div></div>').dialog({
						bgiframe: true,
						minHeight: 0,
						dialogClass: "toolTip",
						width: (exts && exts.dialogWidth) ? parseInt(exts.dialogWidth, 10) : 250
					});
					
					var arrow = document.createElement("div"),
					cont = $.fn.ToolTip.dialog.parents(".ui-dialog")[0];
					arrow.className = "arrow";
					cont.appendChild(arrow);
				}
				
				return $.fn.ToolTip.dialog;
			}
		}
	});
	
	$(".tooltip").ToolTip();
	$(document).ready(function() {
		$("a.tooltip, span.tooltip, div.tooltip").ToolTip("onload");
	});
})(jQuery);
