nicetitle_add_event(window, "load", make_nicetitles);

var XHTMLNS = "http://www.w3.org/1999/xhtml";
var CURRENT_NICE_TITLE;
var browser = new Browser();

if (!nicetitle_tagnames)
	var nicetitle_tagnames = ['a', 'img'];
var nicetitle_remove_title = true;
// var nicetitle_max_width = 400;

// Add an eventListener to browsers that can do it somehow.
// Originally by the amazing Scott Andrew.
function nicetitle_add_event(obj, evType, fn)
{
	if (obj.addEventListener)
	{
		obj.addEventListener(evType, fn, false);
		return true;
	}
	else if (obj.attachEvent)
	{
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	}
	return false;
}

// Determine browser and version.
function Browser()
{
	// blah, browser detect, but mouse-position stuff doesn't work any other way
	var ua, s, i;

	this.isIE = false;
	this.isNS = false;
	this.version = null;

	ua = navigator.userAgent;

	s = "MSIE";
	if ((i = ua.indexOf(s)) >= 0)
	{
		this.isIE = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}

	s = "Netscape6/";
	if ((i = ua.indexOf(s)) >= 0)
	{
		this.isNS = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}

	// Treat any other "Gecko" browser as NS 6.1.
	s = "Gecko";
	if ((i = ua.indexOf(s)) >= 0)
	{
		this.isNS = true;
		this.version = 6.1;
		return;
	}
}

function make_nicetitles()
{
	if (!document.createElement || !document.getElementsByTagName)
		return;
	// add namespace methods to HTML DOM; this makes the script work in both
	// HTML and XML contexts.
	if(!document.createElementNS)
	{
		document.createElementNS = function(ns,elt)
		{
			return document.createElement(elt);
		}
	}

	for (var k in nicetitle_tagnames)
	{
		var elements = document.getElementsByTagName(nicetitle_tagnames[k]);
		if (elements)
		{
			for (var i=0; i<elements.length; i++)
			{
				var elm = elements[i];
				if (elm.title)
				{
					elm.setAttribute("nicetitle", elm.title);
					if (nicetitle_remove_title)
						elm.removeAttribute("title");
					nicetitle_add_event(elm, "mouseover", show_nicetitle);
					nicetitle_add_event(elm, "mouseout",  hide_nicetitle);
					nicetitle_add_event(elm, "focus",     show_nicetitle);
					nicetitle_add_event(elm, "blur",      hide_nicetitle);
				}
			}
		}
	}
}

function show_nicetitle(event)
{
	if (CURRENT_NICE_TITLE)
		hide_nicetitle(CURRENT_NICE_TITLE);
	if (!document.getElementsByTagName)
		return;
	if (window.event && window.event.srcElement)
	{
		elm = window.event.srcElement
	}
	else if (event && event.target)
	{
		elm = event.target
	}

	if (!elm)
		return;

	nicetitle = elm.getAttribute('nicetitle');
	if (!nicetitle)
		return;

	var nt_div = document.createElementNS(XHTMLNS, 'div');
	nt_div.className = 'nicetitle';
	nt_text = document.createTextNode(nicetitle);
	nt_text_paragraph = document.createElementNS(XHTMLNS, 'p');
	nt_text_paragraph.className = 'nicetitle_text';
	nt_text_paragraph.appendChild(nt_text);
	nt_div.appendChild(nt_text_paragraph);
	if (typeof elm.href != 'undefined')
		if (elm.href)
		{
			nt_href = document.createTextNode(elm.href);
			nt_href_paragraph = document.createElementNS(XHTMLNS, 'p');
			nt_href_paragraph.className = 'nicetitle_href' + ' ' + 'nicetitle_href_' + elm.tagName.toLowerCase();
			nt_href_paragraph.appendChild(nt_href);
			nt_div.appendChild(nt_href_paragraph);
		}

	xy = find_object_position(elm);
	nt_div.style.left = (xy[0]) + 'px';

	delta_height = elm.clientHeight;
	if (delta_height == 0)
		delta_height = elm.offsetHeight;
	nt_div.style.top = (xy[1] + delta_height + 10) + 'px';

	document.getElementsByTagName("body")[0].appendChild(nt_div);

	// if (nicetitle_max_width)
	if (typeof nicetitle_max_width != 'undefined')
		if (nt_div.clientWidth > nicetitle_max_width)
			nt_div.style.width = nicetitle_max_width + 'px';

	CURRENT_NICE_TITLE = nt_div;
}

function hide_nicetitle(e)
{
	if (!document.getElementsByTagName)
		return;
	if (CURRENT_NICE_TITLE)
	{
		document.getElementsByTagName("body")[0].removeChild(CURRENT_NICE_TITLE);
		CURRENT_NICE_TITLE = null;
	}
}

function find_object_position(obj)
{
	if (obj.offsetParent)
	{
		for (var pos_x = 0, pos_y = 0; obj.offsetParent; obj = obj.offsetParent)
		{
			pos_x += obj.offsetLeft;
			pos_y += obj.offsetTop;
		}
		return [pos_x, pos_y];
	}
	return [obj.x, obj.y];
}
 