var g_items = {};
var g_heroes = {};
var g_heroLevels = {};
var g_abilities = {};
var g_creeps = {};
var g_neutrals = {};

var Tooltip = {
	div: null,
	interval: null,

	init: function() {
		var div = ce('div');
		div.id = 'hondb_tooltip';
		div.style.zIndex = 100;

		ae(document.body, div);

		div.style.position = 'absolute';

		Tooltip.div = div;
	},

	scan: function(t, e) {
		if (t.nodeName == 'A' && (t.href.length > 0 || t.rel.length > 0) && t.rel != 'nott') {}
		else return false;

		if (t.rel.indexOf('tt:') == 0)
			parseTooltipLink(t, e);
		else if (t.href.indexOf('?item=') > -1)
			parseItemLink(t, e);
		else if (t.href.indexOf('?hero=') > -1)
			parseHeroLink(t, e);
		else if (t.href.indexOf('?ability=') > -1)
			parseAbilityLink(t, e);
		else if (t.href.indexOf('?creep=') > -1)
			parseCreepLink(t, e);
		else if (t.href.indexOf('?neutral=') > -1)
			parseNeutralLink(t, e);
		else
			return false;
		return true;
	},

	onMouseOver: function(e) {
		e = $E(e);
		var t = e._target;

		var i = 0;
		while(t != null && i < 5 && !Tooltip.scan(t, e))
		{
			t = t.parentNode;
			++i;
		}
	},

	onMouseMove: function(e) {
		e = $E(e);
		if (Tooltip.visible())
			Tooltip.move(e);
	},

	onMouseOut: function(e) {
		Tooltip.hide();
		if (Tooltip.interval !== null) {
			clearInterval(Tooltip.interval);
			Tooltip.interval = null;
		}
	},

	show: function(content) {
		if (Tooltip.div === null) {
			Tooltip.init();
		}

		var div = Tooltip.div;
		div.innerHTML = content;

		div.style.visibility = 'visible';
		div.style.display = '';
	},

	move: function(e) {
		if (Tooltip.div === null)
			Tooltip.init();

		var div = Tooltip.div;

		var w = div.getWidth();
		var h = div.getHeight();
		var scrOffset = document.viewport.getScrollOffsets();
		var scrW = document.viewport.getWidth();
		var scrH = document.viewport.getHeight();

		var left = 0, top = 0;
		var x = Event.pointerX(e), y = Event.pointerY(e);

		if (x + 5 + w > scrOffset.left + scrW)
			left = x - 5 - w;
		else
			left = x + 5;

		if (y + 3 + h <= scrOffset.top + scrH)
			top = y + 3;
		else if (y - 3 - h >= scrOffset.top)
			top = y - 3 - h;
		else
			top = scrOffset.top + 3;

		div.style.left = left + 'px';
		div.style.top = top + 'px';
	},

	hide: function() {
		if (Tooltip.div === null) return;
		Tooltip.div.style.display = 'none';
		Tooltip.div.style.visibility = 'hidden';
	},

	visible: function() {
		if (Tooltip.div === null) return;
		if (Tooltip.div.style.visibility == 'visible') return true;
		return false;
	}
};

var request = function(type, id) {
	var script = ce('script');
	script.type = 'text/javascript';
	script.src = 'tooltip.php?type=' + type + '&id=' + id;
	ae(document.body, script);
}

var requestItem = function(id) {
	request(1, id);
}

var requestHero = function(id, extra) {
	var script = ce('script');
	script.type = 'text/javascript';
	script.src = 'tooltip.php?type=2&id=' + id;
	if (extra !== undefined)
		script.src += '&extra=' + extra;
	ae(document.body, script);
}

var requestAbility = function(id) {
	request(3, id);
}

var requestCreep = function(id) {
	request(4, id);
}

var requestNeutral = function(id) {
	request(5, id);
}

var parseItemLink = function(a, e) {
	if (!e) return;
	var id = a.href.match(/\?item=([a-z0-9-]+)/i);
	if (id === null)
		return;
	id = id[1];
	//a.addClassName('itemlink');

	if (g_items[id] !== undefined) {
		Tooltip.show(g_items[id], a);
		Tooltip.move(e);
	}
	else {
		requestItem(id);
		if (Tooltip.interval !== null) {
			clearInterval(Tooltip.interval);
			Tooltip.interval = null;
		}
		Tooltip.show('<div class="tooltip">Loading ...</div>', a);
		Tooltip.move(e);
		Tooltip.interval = setInterval(function() {
			if (g_items[id] !== undefined) {
				clearInterval(Tooltip.interval);
				Tooltip.interval = null;
				Tooltip.show(g_items[id], a);
			}
		}, 333);
	}

	if (!a.onmouseout) {
		a.onmousemove = Tooltip.onMouseMove;
		a.onmouseout = Tooltip.onMouseOut;
	}
};

var parseHeroLink = function(a, e) {
	if (!e) return;
	var id = a.href.match(/\?hero=([a-z0-9-]+)/i);
	if (id === null)
		return;
	id = id[1];
	//a.addClassName('herolink');

	var level = null;
	if (a.rel != '') {
		var kv = a.rel.split(';');
		level = kv[0].split(':')[1];
	}
	if (level === null) {
		if (g_heroes[id] !== undefined) {
			Tooltip.show(g_heroes[id], a);
			Tooltip.move(e);
		}
		else {
			requestHero(id);
			if (Tooltip.interval !== null) {
				clearInterval(Tooltip.interval);
				Tooltip.interval = null;
			}
			Tooltip.show('<div class="tooltip">Loading ...</div>', a);
			Tooltip.move(e);
			Tooltip.interval = setInterval(function() {
				if (g_heroes[id] !== undefined) {
					clearInterval(Tooltip.interval);
					Tooltip.interval = null;
					Tooltip.show(g_heroes[id], a);
				}
			}, 333);
		}
	}
	else {
		if (g_heroLevels[id] !== undefined && g_heroLevels[id][level] !== undefined) {
			Tooltip.show(g_heroLevels[id][level], a);
			Tooltip.move(e);
		}
		else {
			requestHero(id, a.rel);
			if (Tooltip.interval !== null) {
				clearInterval(Tooltip.interval);
				Tooltip.interval = null;
			}
			Tooltip.show('<div class="tooltip">Loading ...</div>', a);
			Tooltip.move(e);
			Tooltip.interval = setInterval(function() {
				if (g_heroLevels[id] !== undefined && g_heroLevels[id][level] !== undefined) {
					clearInterval(Tooltip.interval);
					Tooltip.interval = null;
					Tooltip.show(g_heroLevels[id][level], a);
				}
			}, 333);
		}
	}

	if (!a.onmouseout) {
		a.onmousemove = Tooltip.onMouseMove;
		a.onmouseout = Tooltip.onMouseOut;
	}
};

var parseAbilityLink = function(a, e) {
	if (!e) return;
	var id = a.href.match(/\?ability=([a-z0-9-]+)/i);
	if (id === null)
		return;
	id = id[1];
	//a.addClassName('abilitylink');

	if (g_abilities[id] !== undefined) {
		Tooltip.show(g_abilities[id], a);
		Tooltip.move(e);
	}
	else {
		requestAbility(id);
		if (Tooltip.interval !== null) {
			clearInterval(Tooltip.interval);
			Tooltip.interval = null;
		}
		Tooltip.show('<div class="tooltip">Loading ...</div>', a);
		Tooltip.move(e);
		Tooltip.interval = setInterval(function() {
			if (g_abilities[id] !== undefined) {
				clearInterval(Tooltip.interval);
				Tooltip.interval = null;
				Tooltip.show(g_abilities[id], a);
			}
		}, 333);
	}

	if (!a.onmouseout) {
		a.onmousemove = Tooltip.onMouseMove;
		a.onmouseout = Tooltip.onMouseOut;
	}
};

var parseCreepLink = function(a, e) {
	if (!e) return;
	var id = a.href.match(/\?creep=([a-z0-9-]+)/i);
	if (id === null)
		return;
	id = id[1];

	if (g_creeps[id] !== undefined) {
		Tooltip.show(g_creeps[id], a);
		Tooltip.move(e);
	}
	else {
		requestCreep(id);
		if (Tooltip.interval !== null) {
			clearInterval(Tooltip.interval);
			Tooltip.interval = null;
		}
		Tooltip.show('<div class="tooltip">Loading ...</div>', a);
		Tooltip.move(e);
		Tooltip.interval = setInterval(function() {
			if (g_creeps[id] !== undefined) {
				clearInterval(Tooltip.interval);
				Tooltip.interval = null;
				Tooltip.show(g_creeps[id], a);
			}
		}, 333);
	}

	if (!a.onmouseout) {
		a.onmousemove = Tooltip.onMouseMove;
		a.onmouseout = Tooltip.onMouseOut;
	}
};

var parseNeutralLink = function(a, e) {
	if (!e) return;
	var id = a.href.match(/\?neutral=([a-z0-9-]+)/i);
	if (id === null)
		return;
	id = id[1];
	//a.addClassName('abilitylink');

	if (g_neutrals[id] !== undefined) {
		Tooltip.show(g_neutrals[id], a);
		Tooltip.move(e);
	}
	else {
		requestNeutral(id);
		if (Tooltip.interval !== null) {
			clearInterval(Tooltip.interval);
			Tooltip.interval = null;
		}
		Tooltip.show('<div class="tooltip">Loading ...</div>', a);
		Tooltip.move(e);
		Tooltip.interval = setInterval(function() {
			if (g_neutrals[id] !== undefined) {
				clearInterval(Tooltip.interval);
				Tooltip.interval = null;
				Tooltip.show(g_neutrals[id], a);
			}
		}, 333);
	}

	if (!a.onmouseout) {
		a.onmousemove = Tooltip.onMouseMove;
		a.onmouseout = Tooltip.onMouseOut;
	}
};

var parseTooltipLink = function(a, e) {
	if (!e) return;
	var tt = a.rel.match(/^tt:(.*)$/);
	if (tt === null)
		return;
	tt = tt[1];

	Tooltip.show('<div class="tooltip2">' + tt + '</div>', a);
	Tooltip.move(e);
	if (Tooltip.interval !== null) {
		clearInterval(Tooltip.interval);
		Tooltip.interval = null;
	}

	if (!a.onmouseout) {
		a.onmousemove = Tooltip.onMouseMove;
		a.onmouseout = Tooltip.onMouseOut;
	}
}

document.observe('dom:loaded', function() {
	aE(document, 'mouseover', Tooltip.onMouseOver);
});
