

// Create Behaviour class
function Behaviour(HookType, HookName, EventName, FunctionName)
{
	/**** Properties ****/
	this.HookType = HookType;
	this.HookName = HookName;
	this.EventName = EventName;
	this.FunctionName = FunctionName;
	
	
	/**** Methods ****/
	

	
	
	/****  Implementation ****/
		

}






// Defined Constants
var HOOKTYPE_CLASS = 1;
var HOOKTYPE_ID = 2;
var HOOKTYPE_ONLOAD = 3;


// Create BehaviourManager class
function BehaviourManager()
{
	/**** Properties ****/
	this.Behaviours = new Array();
	
	
	/**** Methods ****/
	
	this.RegisterBehaviour = RegisterBehaviour
	this.InstallBehaviours = InstallBehaviours;
	this.AddBehaviour = AddBehaviour;
		
	
	/****  Implementation ****/

	
	// Install a Behavoir into the DOM
	function AddBehaviour(Tag, Behaviour)
	{
		if (Tag.addEventHandler)
			Tag.addEventHandler(Behaviour.EventName, Behaviour.FunctionName, false);
		else
			eval("Tag.on" + Behaviour.EventName + " = Behaviour.FunctionName;");
	}
	

	// Install All Registered Behaviours	
	function InstallBehaviours()
	{
		// Loop through all Tags
		var Tags = document.body.getElementsByTagName('*');
		for (var Count=0; Count<Tags.length; Count++)
		{
			// Loop through Behaviours
			for (var BCount=0; BCount<this.Behaviours.length; BCount++)
			{
				// Add Class Behaviours
				if ( this.Behaviours[BCount].HookType == HOOKTYPE_CLASS && Tags[Count].className.indexOf(this.Behaviours[BCount].HookName) != -1 )
					this.AddBehaviour(Tags[Count], this.Behaviours[BCount]);
			
				// Add ID Behaviours
				else if ( this.Behaviours[BCount].HookType == HOOKTYPE_ID && Tags[Count].id.indexOf(this.Behaviours[BCount].HookName) != -1 )
					this.AddBehaviour(Tags[Count], this.Behaviours[BCount]);
			}			
						
				
			/* Do General OnInstall Actions */
			
			// Hidden By Script
			if ( Tags[Count].className.indexOf('HiddenByScript') != -1 )
				Tags[Count].style.display = 'none';	
			
		}
		
		
		// Run onLoad behaviours
		for (var BCount=0; BCount<this.Behaviours.length; BCount++)
		{
			if ( this.Behaviours[BCount].HookType == HOOKTYPE_ONLOAD )
				this.Behaviours[BCount].FunctionName();
		}
		
	}
	
	
	
	// Register a Behavoir with the Manager
	function RegisterBehaviour(HookType, HookName, EventName, FunctionName)
	{
		this.Behaviours.push( new Behaviour(HookType, HookName, EventName, FunctionName) );
	}
	
}





// Internet Explorer browser test
IE = (navigator.appName=="Microsoft Internet Explorer");


// Create Behaviour Manager
var Behaviours = new BehaviourManager();


// Add Page Loaded to onload
if (window.addEventHandler)
	window.addEventHandler('load', PageLoaded, false);
else
	window.onload = PageLoaded;
	

// Page Load handler
function PageLoaded()
{
	
	// Install Behaviours
	Behaviours.InstallBehaviours();	
	
}


// Register Standard Behaviours
Behaviours.RegisterBehaviour(HOOKTYPE_CLASS, 'ReceiveFullFocus', 'focus', select);				
Behaviours.RegisterBehaviour(HOOKTYPE_CLASS, 'ExternalLink', 'click', openInNewWindow);	
Behaviours.RegisterBehaviour(HOOKTYPE_CLASS, 'OpenInNewWindow', 'click', openInNewWindow);


// Give an Input Field select focus when clicked
function select()
{
		this.select();
}


// Handle SelectControl field changed
function doSelect()
{
	// "Click" the SelectControl's Submit Button
	this.parentNode.childNodes[4].click();
}


// Open link in a new window
function openInNewWindow()
{
	window.open(this.href);
	return false;
}