abilitypath.glossary =
{
	"id": "ap_glossary_definition",
	"prefix": "/glossary-definitions",
	"phrases": [],
	"state": "off",

	"getXOff": function(el)
	{
		var off = 0;
		if ((""+el.offsetLeft).match(/^[0-9]+$/))
		{
			off = el.offsetLeft;
		}

		if (el.offsetParent)
		{
			off += this.getXOff(el.offsetParent);
		}
		return off;
	},

	"getYOff": function(el)
	{
		var off = 0;
		if ((""+el.offsetTop).match(/^[0-9]+$/))
		{
			off = el.offsetTop;
		}

		if (el.offsetParent)
		{
			off += this.getYOff(el.offsetParent);
		}
		return off;
	},

	"initDef": function()
	{
		def = jQuery("div#"+this.id);
		if (!def.length)
		{
			jQuery("body").append('<div id="ap_glossary_definition"><'+'/div>');
			def = jQuery("div#"+this.id);
		}
		return def;
	},

	"showDef": function(defTxt, tgtEl)
	{
		var def;
		if (this.state != "off")
		{
			def = this.initDef();

			def.css("left", this.getXOff(tgtEl)+"px").css("top", (this.getYOff(tgtEl) + tgtEl.offsetHeight)+"px");
			def.css("display", "block").html(defTxt);
		}
	},
	
	"showDefLoading": function(tgtEl)
	{
		var def;
		if (this.state != "off")
		{
			def = this.initDef();

			def.css("left", this.getXOff(tgtEl)+"px").css("top", (this.getYOff(tgtEl) + tgtEl.offsetHeight)+"px");
			def.css("display", "block").html("Loading definition...");
		}
	},
	
	"success": function(data, options)
	{
		var m = data.replace(/[\r\n]+/g, " ").match(/<div\s+class="?definition"?\s*>(.+)<\/div>\s*<div\s+class="?definition_end"?\s*>/i);
		this.showDef(m[1], options.tgtEl);
		this.phrases[options.tgtElPhrase] = m[1];
	},
	"successW": function(data)
	{
		abilitypath.glossary.success(data, this);
	},


	"error": function(data, options)
	{
		this.showDef("No definition available", options.tgtEl);
	},
	"errorW": function(data)
	{
		abilitypath.glossary.error(data, this);
	},

	"init": function()
	{
		var over = function()
		{
		  var glossary = abilitypath.glossary, defTxt,
		  	phrase = jQuery(this).html().toLowerCase().replace(/\s+/, " ").replace(/^\s+/, "").replace(/\s+$/, "");
			glossary.state = "on";
			glossary.showDefLoading(this)
			if ((defTxt = glossary.phrases[phrase]) && defTxt.length)
			{
				 glossary.showDef(defTxt, this);
			}
			else
			{
				jQuery.ajax
				(
					{
						"dataType": "html",
						"url": glossary.prefix+"/"+encodeURIComponent(phrase.replace(/\s/g, "-"))+".html", 
						"success": glossary.successW,
						"error": glossary.errorW,
						"tgtEl": this,
						"tgtElPhrase": phrase
					}
				);
			}
		}
		var out = function()
		{
			abilitypath.glossary.state = "off";
			jQuery("div#"+abilitypath.glossary.id).css("display", "none");
		}
		jQuery("span.glossary").mouseover(over).mouseout(out);		
	}
};
jQuery(document).ready(abilitypath.glossary.init);
