
addEvent(window, "load", makeNiceTitles);

var browser = new Browser();
var masterHelpList = new Array();
var glbNiceTableClass	= "nicetable";
var glbNiceCellClass	= "helptextCell";
var glbNicePtrImg	= "/js/lt_blue_ptr2.gif";
var glbNiceCloseImg	= "/js/char_x.gif";
var glbNiceMaxWidth	= 180;
var arOpenHelp = new Array();

/*
readjustHelpReports()
setupNiceHelpByTagname( tagname )
alreadyOpenReport( lnkNode )
masterHelpReport()
Browser()
getMousePosition(event)
getParent(el, pTagName)
addEvent(obj, evType, fn)
closeAllOpenHelps()
closeHelp( e )
ultOffTop( me )
ultOffLeft( me )
showNiceError(e, errormsg) 
setNiceMaxWidth( new_width )
setNiceTitleProps( ptr_img_path, close_img_path, cell_class, table_class )
makeNiceTitles()
*/

function makeNiceTitles()
{
	if (!document.links || !document.createElement) return;
	for (var ti=0;ti<document.links.length;ti++) {
		var lnk = document.links[ti];
		if (lnk.helpbox) {
			lnk.setAttribute("nicetitle",lnk.helpbox);
			lnk.removeAttribute("helpbox");
			addEvent(lnk,"click",showNiceError);
		}
	}
}

function setNiceTitleProps( ptr_img_path, close_img_path, cell_class, table_class )
{
	glbNiceTableClass = table_class;
	glbNiceCellClass = cell_class;
	glbNiceCloseImg = close_img_path;
	glbNicePtrImg	= ptr_img_path;
}

function setNiceMaxWidth( new_width )
{
	glbNiceMaxWidth = new_width;
}

function showNiceError(e, errormsg) 
{

	if (!document.getElementsByTagName) return;

	if( !e )
		return;
		
	if( !errormsg )
	{
		try {
		
			if (window.event && window.event.srcElement) 
			{
				lnk = window.event.srcElement

			} else if (e && e.target) {

				lnk = e.target
			}
			if (!lnk) return;
			
			if (!lnk.getAttribute("nicetitle")) {
				lnk = getParent(lnk,"A");
			}
			
			nicetitle = lnk.getAttribute("nicetitle");
			
		} catch(excep) { return; }	
	}
	else
	{
		nicetitle = errormsg;
		lnk = e;
	}
	

	if( alreadyOpenReport(e) ) return;
	closeAllOpenHelps();

	var d = document.createElement("table");

	d.className = glbNiceTableClass;

	var randint = parseInt(Math.random()*1000000);
	randint = "tab" + randint;

	d.id = randint;

	try {
		d.innerHTML = '<tr><td valign=top align=right><img id=ptr src="'+glbNicePtrImg+'"></td><td class='+glbNiceCellClass+'><div id=x><a onClick="closeHelp( \''+randint+'\' )"><img src="'+glbNiceCloseImg+'"></a></div>' + nicetitle + '</td></tr>';
	} catch(fu) {

		try {
			mynewrow = d.insertRow(0);

			mynewrow.insertCell(-1);
			mynewrow.insertCell(-1);

			mynewrow.cells[0].vAlign="top";
			mynewrow.cells[0].align="right";
			mynewrow.cells[0].innerHTML = '<td valign=top align=right><img valign=top style="margin:0px; padding:0px;" id=ptr src="'+glbNicePtrImg+'"></td>';
			mynewrow.cells[1].innerHTML = '<td class="'+glbNiceCellClass+'"><div id=x><a onClick="closeHelp( \''+randint+'\' )"><img src="'+glbNiceCloseImg+'"></a></div>' + nicetitle + '</td>';
			mynewrow.cells[1].className = glbNiceCellClass;
		} catch(fu2) {
			alert( "exception: '"+fu2+"'" );
		}
	}

	masterHelpList[randint] = new Object();
	masterHelpList[randint].node = d;
	masterHelpList[randint].parent = e;

	STD_WIDTH = glbNiceMaxWidth;

	if( lnk.href )
	{
		h = lnk.href.length;
	}
	else
	{
		h = 0;
	}

	if( !nicetitle )
	{
		nicetitle = "";
	}

	t = nicetitle.length;
	h_pixels = h*6; t_pixels = t*10;

	if( h_pixels > STD_WIDTH ) {
		w = h_pixels;
	} else if( (STD_WIDTH>t_pixels) && (t_pixels>h_pixels) ) {
		w = t_pixels;
	} else if( (STD_WIDTH>t_pixels) && (h_pixels>t_pixels) ) {
		w = h_pixels;
	} else {
		w = STD_WIDTH;
	}

	//d.style.width = w + 'px';
	d.rows[0].cells[1].width = w;

	d.style.position = "absolute";
	
	if( e.offsetWidth )
		d.style.left = ultOffLeft(lnk ) + e.offsetWidth + 'px';
	else
		d.style.left = ultOffLeft(lnk ) + 'px';

	d.style.top  = ultOffTop( lnk ) + 'px';

	document.getElementsByTagName("body")[0].appendChild(d);

	/// add this menu to the list of open menus.
	arOpenHelp.push( d );
}

function ultOffTop( me )
{
	if( me.offsetParent ){
		return me.offsetTop + ultOffTop( me.offsetParent );
	} else {
		return me.offsetTop;
	}
}

function ultOffLeft( me )
{
	if( me.offsetParent ){
		return me.offsetLeft + ultOffLeft( me.offsetParent );
	} else {
		return me.offsetLeft;
	}
}

function closeHelp( e )
{
	if (!document.getElementsByTagName) return;

	var myNode = document.getElementById(e);
	
	for( i=0; i<arOpenHelp.length; i++ )	
	{
		if( arOpenHelp[i] == myNode )
		{
			arOpenHelp[i] = arOpenHelp[length-1];		
			arOpenHelp.pop();
			i = arOpenHelp.length;
		}
	}
	
	try {
		if (myNode) {
			document.getElementsByTagName("body")[0].removeChild(myNode);
			myNode = null;
			masterHelpList[e] = null;
		} else {
			alert( "tried to close '"+e+"', which didn't exist.  Jerk. ");
		}
	} catch( e1 ) {}	
}

function closeAllOpenHelps()
{

	for( i=0; i<arOpenHelp.length; i++ )	
	{
		myNode = arOpenHelp[i];
		
		e = myNode.id;

		try {
			if (myNode) {
				document.getElementsByTagName("body")[0].removeChild(myNode);
				myNode = null;
				masterHelpList[e] = null;
			} else {
				alert( "tried to close '"+e+"', which didn't exist.  Jerk. ");
			}
		} catch( e1 ) {}
	}
}

/// shorthand for inline-html insertion 
function caoe()
{
	closeAllOpenHelps();
}


// Add an eventListener to browsers that can do it somehow.
// Originally by the amazing Scott Andrew.
function addEvent(obj, evType, fn){
  if (obj.addEventListener){
	obj.addEventListener(evType, fn, true);
	return true;
  } else if (obj.attachEvent){
	var r = obj.attachEvent("on"+evType, fn);
	return r;
  } else {
	return false;
  }
}

function getParent(el, pTagName) {
	if (el == null) return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
		return el;
	else
		return getParent(el.parentNode, pTagName);
}

function getMousePosition(event) {
  if (browser.isIE) {
	x = window.event.clientX + document.documentElement.scrollLeft
	  + document.body.scrollLeft;
	y = window.event.clientY + document.documentElement.scrollTop
	  + document.body.scrollTop;
  }
  if (browser.isNS) {
	x = event.clientX + window.scrollX;
	y = event.clientY + window.scrollY;
  }
  return [x,y];
}

// 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 masterHelpReport() {

	i=0;
	for( name in masterHelpList )
	{

		alert( ""+ i + ": " + name );
		i++;
	}

	alert( "there are "+i+" open helpnodes." );

	for( name in masterHelpList )
	{
		alert( "masterHelpList['"+name+"'].node = '"+masterHelpList[name].node+"'" );
		alert( "masterHelpList['"+name+"'].parent.x = '"+masterHelpList[name].parent.offsetLeft+"'" );
		alert( "masterHelpList['"+name+"'].parent.y = '"+masterHelpList[name].parent.offsetTop+"'" );
	}
}

function alreadyOpenReport( lnkNode )
{
	for( name in masterHelpList )
	{
		if( masterHelpList[name] )
			if( masterHelpList[name].parent == lnkNode )
				return true;
	}

	return false;
}

function readjustHelpReports()
{
	for( name in masterHelpList )
	{
		if( masterHelpList[name] )
		{
			masterHelpList[name].node.style.left = ultOffLeft(masterHelpList[name].parent) + 'px';
			masterHelpList[name].node.style.top  =  ultOffTop(masterHelpList[name].parent) + 'px';
		}
	}
}

function setupNiceHelpByTagname( tagname )
{
	var allA = document.getElementsByTagName( tagname );

	for (i=0;i<allA.length;i++)
	{
		if( allA[i].getAttribute("helpbox") )
		{
			//this.style.cursor='url(cursor.cur)'
			allA[i].onmouseover = function () { this.style.cursor = 'pointer'; };

			allA[i].setAttribute("nicetitle", allA[i].getAttribute("helpbox") );

			allA[i].removeAttribute("helpbox");

			addEvent(allA[i],"click",showNiceError);
		}
	}
	
	allA = document.getElementsByTagName( "body" );
	if( !allA[0] ) { alert("noes!"); return; }
	
	if( document.parentWindow )
	{
		allA = document.getElementsByTagName( "body" );
		if( !allA[0] ) { alert("noes!"); return; }
		
		allA[0].onresize = function () { readjustHelpReports(); };
	}
	else
	{
		windObj = document.defaultView.onresize = function () { readjustHelpReports(); };
	}
}