/* 	Glossary Class */

//addLoadEvent(GlossarySetup);

/*
function GlossarySetup()
{
	
	var arr_triggers = document.getElementsBySelector('.glossary');
	
	if(arr_triggers.length>0)
	{
		new Glossary(arr_triggers, 'glossary_content','visualglossary.asp','termslist', 'visualglossarylist.asp');
	}
}
*/
Glossary = Class.create();
Glossary.prototype = ({
	initialize: function (str_glossary, str_glossary_xml, str_terms, str_terms_xml)
	{		
		this._str_terms 		=	str_terms	
		this._str_glossary		=	str_glossary;
		
		this._str_terms_xml		= 	str_terms_xml;
		this._str_glossary_xml	= 	str_glossary_xml;
		this._regex_glossary_id	=	new RegExp(/glossary_(\d*)/);//regex for glossary term id
		
		this._dom_glossary		= 	this.createGlossary(); //add glossary to document
		
		this._arr_glossaryTargets	= this.getTargets('.glossary');
		this.glossaryObserver		= this.getId.bindAsEventListener(this);
		
		this.attachTriggers(this._arr_glossaryTargets, this.glossaryObserver);
								
		
		this.getTerms			= 	this.getTerms.bind(this);
		this.getGlossaryContent	= 	this.getGlossaryContent.bind(this);
	
	},
	
	createGlossary: function()
	{
		if(!$('glossary'))
			this._dom_glossary = this.InsertElement('glossary', 'top_layers');	
		else
			this._dom_glossary = $('glossary');
			
		new Ajax.Request(this._str_glossary_xml,
		Object.extend({
			asynchronous: true,
			onComplete: this.glossarySetup.bind(this)
		  }, {method: 'get', parameters: 'term=0'})
		);
		
		return this._dom_glossary;
	},
		
	glossarySetup: function (originalRequest)
	{		
		new Insertion.Top(this._dom_glossary, originalRequest.responseText);
		
		this._arr_tremsTargets	= this.getTargets('#letters a');
		this.termsObserver		= this.getTerms.bindAsEventListener(this);
		this.attachTriggers(this._arr_tremsTargets, this.termsObserver);
		this._dom_terms			=	this.InsertElement(this._str_terms, this._dom_glossary.id);
	},
	
	getTargets: function(str_selector)
	{
		var targets = document.getElementsBySelector(str_selector);
		return targets;
	},
	
	attachTriggers: function (targets, handler)
	{
		for (var i=0; i<targets.length; i++)
		{
			Event.observe(targets[i], 'click', handler);
		}
	},
	
	InsertElement: function(str_layer_id, str_within_id)
	{
		var dom_elem = $(str_layer_id);
		var dom_within = $(str_within_id);
		
		if(!dom_elem && dom_within)
		{	
			dom_elem 						= document.createElement( 'div' );
			dom_elem.id 					= str_layer_id;
			
			dom_elem = dom_within.insertBefore( dom_elem, dom_within.firstChild );
			//elem found or successfully added to body	
			
			return dom_elem;
		}
		//not able to find or create elem
		return false;
	},
	
	getId:function (e)
	{
		var e = fixEvents(e);
		var regex_glossary_id = this._regex_glossary_id;		
	
		if(e && regex_glossary_id)
		{
		//attempt to find id
			regex_glossary_id.test( e.trgt.className );
			var int_id = (RegExp.$1 != '') ?  RegExp.$1 : false;
			
			this.getGlossaryContent(int_id);
		}

		return false;
	},
	
	getGlossaryContent: function(id)
	{	
		if(id==0)
		{
			this.showGlossary();
		}
		else
		{
			//clicked on a glossary term
			var pars	= 'term='+ id;
						
			new Ajax.Updater(
			this._str_glossary, this._str_glossary_xml,
			Object.extend({
				asynchronous: true,
				onComplete: this.showGlossary.bind(this)
			  }, {method: 'get', parameters: pars})
			);
		}
	},


	getTerms: function(e)
	{
	
		var e = fixEvents(e);
		
		//clicked on a letter link
		if('a' == e.trgt.nodeName.toLowerCase() )
		{
			//setup query
			var pars	= 'letter='+ e.trgt.innerHTML;

			new Ajax.Updater(
			this._dom_terms, this._str_terms_xml,
			Object.extend({
       			asynchronous: true,
        		onComplete: this.showTerms.bind(this)
			  }, {method: 'get', parameters: pars})
			);
		}
	},
	
	showTerms: function ()
	{	
		Element.show(this._dom_terms);

		var arr_targets 		=  document.getElementsBySelector('#termslist a');	
		this.attachTriggers(arr_targets, this.getId.bind(this));
		
		//sIFR();
	},
	
	showGlossary: function ()
	{
		//attach events to new glossary terms
		var arr_targets = document.getElementsBySelector('#'+this._str_glossary+' a.glossary');	
		this.attachTriggers(arr_targets, this.getId.bind(this));
		
		//attach events to new tooltips
		//TooltipSetup()
		SB.trigger('register');

		Element.show($('top_layers'));
				
		setTransparency();
		this._dom_glossary.style.display='block';
			
		//hide terms list
		Element.hide(this._dom_terms);
		
	}
});
