// Sigrie Tooltips (Internal)
var URL_BASE = "(^|http://db\.mmo-champion\.com|http://.*\.sigrie\.com/)/"
var URL_REGEX = URL_BASE + "(i|item|s|spell|a|ach|achievement|c|creature|npc|q|quest|is|itemset)/([A-Za-z0-9-]+).*"
var TOOLTIP_RETRIEVING_HTML = '<span class="tt-retrieving">Retrieving tooltip...</span>'
var TOOLTIP_ERROR_HTML = '<span class="tt-error">Error retrieving tooltip</span>'
var TOOLTIP_MAX_WIDTH = 310

var ttlib = {
	init: function() {
		ttlib.createRequest()
		var jstooltip = document.createElement("div")
		jstooltip.id = "tooltip"
		jstooltip.className = "tooltip tt-hover"
		document.getElementsByTagName("body")[0].appendChild(jstooltip)
		ttlib.jstooltip = jstooltip
		ttlib.hide()
		ttlib.parseDocument()
		ttlib.requestcount = 0
		ttlib.requests = new Array()
		ttlib.queue = new Array()
		ttlib.currentRequest = null
		ttlib.currentMouseover = ""
		ttlib.cache = new Object()
		document.onmousemove = ttlib.mouseMove
	},
	mouseMove: function(e) {
		if (ttlib.jstooltip.style.visibility == "hidden") return;
		var cursor = ttlib.cursorPosition(e)
		var de = document.documentElement
		var body = document.body
		var y = cursor.y - 15
		var x = cursor.x + 20
		if (cursor.y + ttlib.jstooltip.offsetHeight > de.clientHeight + body.scrollTop + de.scrollTop) {
			var diff = (de.clientHeight + body.scrollTop + de.scrollTop) - (cursor.y + ttlib.jstooltip.offsetHeight)
			y += diff
		}
		ttlib.jstooltip.style.left = "" + (x) + "px"
		ttlib.jstooltip.style.top = "" + (y) + "px"
	},
	createRequest: function() {
		var xhr
		if (window.XMLHttpRequest) {
			xhr = new XMLHttpRequest()
		} else if (window.ActiveXObject) {
			xhr = new ActiveXObject("Microsoft.XMLHTTP")
		}
		ttlib.xhr = xhr
	},
	request: function(url) {
		ttlib.requestcount++
		ttlib.xhr.open("GET", url, true)
		ttlib.xhr.onreadystatechange = function() {
			if(ttlib.xhr.readyState==4) {
				if (ttlib.xhr.status == 500 || ttlib.xhr.status == 404) ttlib.jstooltip.innerHTML = TOOLTIP_ERROR_HTML;
				else {
					ttlib.cache[ttlib.currentRequest["cache"]] = ttlib.xhr.responseText
					if (ttlib.currentRequest["cache"] == ttlib.currentMouseover) {
						ttlib.jstooltip.innerHTML = ttlib.xhr.responseText
						ttlib.show()
					}
				}
				ttlib.currentRequest = null
				ttlib.processQueue()
			}
		}
		ttlib.xhr.send(null)
	},
	queueRequest: function(url) {
		var req = new Object()
		req["url"] = url + "/tooltip"
		req["cache"] = url
		ttlib.queue.push(req)
		ttlib.processQueue()
	},
	processQueue: function() {
		if (ttlib.queue.length > 0 && ttlib.currentRequest == null) {
			ttlib.currentRequest = ttlib.queue.pop()
			ttlib.request(ttlib.currentRequest["url"])
		}
	},
	isValid: function(url) {
		for (var i = 0; i < TOOLTIP_CLASS_BLACKLIST.length; i++) {
			if (url.parentNode.className.match(TOOLTIP_CLASS_BLACKLIST[i])) return false;
		}
		url = url.getAttribute("href") || "#" // check for <a>
		return url.match(URL_REGEX) // we use getAttribute because href always returns an absolute url
	},
	startTooltip: function(atag) {
		ttlib.currentMouseover = atag
		if (ttlib.cache[atag]) {
			ttlib.jstooltip.innerHTML = ttlib.cache[atag]
			ttlib.show()
		} else {
			ttlib.jstooltip.innerHTML = TOOLTIP_RETRIEVING_HTML
			ttlib.show()
			ttlib.queueRequest(atag)
		}
	},
	parseDocument: function() {
		var links = document.getElementsByTagName("a")
		for(var i = 0; i < links.length; i++) {
			if(ttlib.isValid(links[i])) {
				links[i].onmouseover = function(evt) { ttlib.startTooltip(this) }
				links[i].onmouseout = function(evt) { ttlib.hide() }
			}
		}
	},
	cursorPosition: function(e) {
		e = e || window.event
		var cursor = {x: 0, y: 0}
		if (e.pageX || e.pageY) {
			cursor.x = e.pageX
			cursor.y = e.pageY
		} else {
			var de = document.documentElement
			var b = document.body
			cursor.x = e.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0)
			cursor.y = e.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0)
		}
		return cursor;
	},
	show: function() {
		if(ttlib.jstooltip.style.width > TOOLTIP_MAX_WIDTH || ttlib.jstooltip.style.width > TOOLTIP_MAX_WIDTH
			|| ttlib.jstooltip.offsetWidth > TOOLTIP_MAX_WIDTH || ttlib.jstooltip.offsetWidth > TOOLTIP_MAX_WIDTH) {
			ttlib.jstooltip.style.width = TOOLTIP_MAX_WIDTH;
		} else {
			ttlib["jstooltip"]["style"]["width"] = ttlib["jstooltip"]["style"]["width"]
		}
		ttlib.jstooltip.style.visibility = "visible"
	},
	hide: function() {
		ttlib.jstooltip.style.visibility = "hidden"
		ttlib.currentMouseover = null
	}
}

addLoadEvent(ttlib.init)