﻿$(function () {
	$(document).mousemove(function (e) {
		cursor_position.x = e.pageX;
		cursor_position.y = e.pageY;
	});

	var $tooltip = $('\
        <div class="tooltip-outer">\
			<div class="tooltip-wrapper">\
				<div class="tooltip-shadow" style="left: 1px; top: 1px;"></div>\
				<div class="tooltip-shadow" style="left: 2px; top: 2px;"></div>\
				<div class="tooltip-shadow" style="left: 3px; top: 3px;"></div>\
				<div class="tooltip-shadow" style="left: 4px; top: 4px;"></div>\
				<div class="tooltip-shadow" style="left: 5px; top: 5px;"></div>\
				<div class="tooltip-shadow" style="left: 6px; top: 6px;"></div>\
				<div class="cluetip-orion"></div>\
			</div>\
            <div class="tooltip-stem"></div>\
        </div>\
    ');

	var $tooltip_inner = $("div.cluetip-orion", $tooltip);
	var $tooltip_stem = $("div.tooltip-stem", $tooltip);
	var $tooltip_wrapper = $("div.tooltip-wrapper", $tooltip);
	var $tooltip_shadow = $("div.tooltip-shadow", $tooltip).css({ opacity: 0.1 });
	var $tooltip_divs = $tooltip.children().hide();
	var $tooltip_timer;
	var $tooltip_request;
	var $tooltip_parent;
	var $iframe = $('<iframe class="tooltip-iframe" scrolling="no" frameborder="0"></iframe>')

	var is_tooltip_available = false;
	var cursor_position = { x: 0, y: 0 };

	var getId = /netobject=([a-z]+)(:|%3a)(\d+)/i;

	$.swtooltip = function (control, tipText) {
		var $control = $(control);

		// add iframe for put a tooltip DIV over a SELECT in IE6
		if ($.browser.msie && ($.browser.version == "6.0"))
			$("body").append($iframe);

		control.onmouseover = function () {
			$tooltip_timer = setTimeout(function () {
				if ($tooltip_request) {
					$tooltip_request.abort();
					$tooltip_request = null;
				}

				if (!$control.swtooltip)
					$control.swtooltip = new $tooltipHelper(control, tipText);

				$control.swtooltip.show();
			}, 200);
		};
		control.onmouseout = function () {
			if ($tooltip_timer) {
				clearTimeout($tooltip_timer);
				$tooltip_timer = null;
			}

			if ($tooltip_request) {
				$tooltip_request.abort();
				$tooltip_request = null;
			}

			if ($.browser.msie && ($.browser.version == "6.0"))
				$iframe.css('display', 'none');

			if ($control.swtooltip)
				$control.swtooltip.hide();
		};
	}

	$tooltipHelper = function (control, tipText) {
		this.control = control;
		this.tipText = tipText;
		this.cache = {};

		if (tipText || this.url()) {
			var _this = this;

			$("img[alt]", control).removeAttr("alt");

			if (!is_tooltip_available) {
				is_tooltip_available = true;
				$("body").append($tooltip);
			}
		}
	}

	$.extend($tooltipHelper.prototype, {
		static_cache: {},

		hide: function () {
			$tooltip.hide();
			$tooltip_divs.hide();
		},

		show: function () {
			if (this.tipText) {
				$tooltip_inner.html(this.tipText);
				this.adjustPosition();
			}
			else {
				if (this.ajaxSettings().url != null)
					$tooltip_request = $.ajax(this.ajaxSettings());
			}
		},

		adjustPosition: function () {
			$tooltip.removeClass("stem-bottom-top stem-top-right stem-bottom-left stem-bottom-right");
			$tooltip_divs.show();
			$tooltip.show()
			var v = viewport();
			var p = position($tooltip_wrapper);
			var r = (v.x + v.cx < p.x + $tooltip_inner.width());
			var b = (v.y + v.cy < p.y + $tooltip_inner.height());

			if (b && r) {
				$tooltip.addClass("stem-bottom-right");
				$tooltip.css('top', p.y - 20);
				$tooltip.css('left', p.x - $tooltip_inner.width() - 40);
			}
			else if (b) {
				$tooltip.addClass("stem-bottom-left");
				$tooltip.css('top', p.y - 20);
				$tooltip.css('left', p.x + 15);
			}
			else if (r) {
				$tooltip.addClass("stem-top-right");
				$tooltip.css('top', p.y);
				$tooltip.css('left', p.x - $tooltip_inner.width() - 40);
			}
			else {
				$tooltip.addClass("stem-top-left");
				$tooltip.css('top', p.y);
				$tooltip.css('left', p.x + 15);
			}

			if ((p.cy + p.y) < $tooltip_stem.height())
				$tooltip_wrapper.css('top', '0');

			$tooltip_shadow.css({
				width: $tooltip_inner.width(),
				height: $tooltip_inner.height()
			});

			if ($.browser.msie && ($.browser.version == "6.0")) {
				$iframe.css('display', 'block');
				$iframe.css({
					width: $tooltip_inner.width() + 4,
					height: $tooltip_inner.height() + 4,
					top: $tooltip_inner.offset().top,
					left: $tooltip_inner.offset().left
				});
			}
		},

		ajaxSettings: function () {
			var _this = this;

			return $.extend({
				url: this.url(),

				complete: function () {
					_this.adjustPosition();
				}
			}, this.ajaxSettingsBase);
		},

		ajaxSettingsBase: {
			dataType: 'html',

			error: function () {
				$tooltip_request = null;
				$tooltip_inner.html('<i>sorry, the contents could not be loaded</i>');
			},

			success: function (data) {
				$tooltip_request = null;
				// check if data is net object tooltip
				if (data.indexOf('NetObjectTipBody') > -1) {
					data = data.replace(/<s(cript|tyle)(.|\s)*?\/s(cript|tyle)>/g, '').replace(/<(link|title)(.|\s)*?\/(link|title)>/g, '');
					$tooltip_inner.html(data);
				}
				else if (data == 'NoTip') {
					this.complete = function () { };
				}
				else {
					$tooltip_inner.html('<i>sorry, the contents could not be loaded</i>');
				}
			}
		},

		width: function () {
			return this.static_cache.width || (this.static_cache.width = this.getWidth());
		},

		getWidth: function () {
			var left = 0;
			var right = 0;

			$tooltip.children().each(function () {
				var p = position($(this));

				if (p.x < left)
					left = p.x;

				if (p.x + p.cx > right)
					right = p.x + p.cx;
			});

			return right - left;
		},

		netobject: function () {
			return this.cache.netobject || (this.cache.netobject = this.getNetobject())
		},

		getNetobject: function () {
			return getId.exec(this.control.href);
		},

		url: function () {
			return this.cache.url || (this.cache.url = this.getUrl());
		},

		getUrl: function () {
			var id = this.netobject();
			var tipURL = id && NetObjectTypeToTipPagePath[id[1]];
			var ctx = window.OrionRequestItems || {};

			if (!tipURL || (this.currentPageId && (id[1] == this.currentPageId[1]) && (id[3] == this.currentPageId[3])))
				return null;

			tipURL += ((tipURL.indexOf('?') < 0) ? '?' : '&') + "NetObject=" + id[1] + ":" + id[3];
			if (ctx.ViewLimitationID) tipURL += "&viewlim=" + ctx.ViewLimitationID;

			return tipURL;
		},

		currentPageId: getId.exec(document.location)
	});

	function viewport() {
		var $window = $(window);

		return {
			x: $window.scrollLeft(),
			y: $window.scrollTop(),
			cx: $window.width(),
			cy: $window.height()
		};
	}

	function position(control) {
		var p = control.position();
		return {
			x: cursor_position.x, //p.left,
			y: cursor_position.y, //p.top,
			cx: control.width,
			cy: control.heigth
		};
	}

	// do not show tooltips if the link has a class "NoTip"
	$("a[tooltip!='processed'][href*='NetObject=']:not(.NoTip)").livequery(function () {
		this.tooltip = 'processed';
		$.swtooltip(this);
	});
});

