// General Properties
var properties = {
	defaultPopupWidth: 800,
	defaultPopupHeight: 500
}

// General Library Functions
// TODO: Add find next non-text node to Library
var library = {

	// Add Event
	addEvent: function(elm, evType, fn, useCapture)
	{
		if(elm.addEventListener)
		{
			elm.addEventListener(evType, fn, useCapture);
			return true;
		}
		else if(elm.attachEvent)
		{
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		}
		else
		{
			elm['on' + evType] = fn;
		}
	},
	
	// Check for presence CSS selector in className
	checkClass: function(elm, selector, startsWith)
	{		
		if(!elm.className)
			return false;

		if(startsWith && (' ' + elm.className).indexOf(' ' + selector) != -1)
		{
			return true;
		}
		else if((' ' + elm.className + ' ').indexOf(' ' + selector + ' ') != -1)
		{
			return true;
		} 
		else
		{
			return false;
		}
	},
	
	// Find parent element that matches tag name
	ascendDom: function(elm, tag)
	{		
			while (elm.nodeName.toLowerCase() != tag && elm.nodeName.toLowerCase() != 'body')
				elm = elm.parentNode;
			return elm;
	},
	
	// Rollover Mouse Over IE currentTarget fix
  getMouseOverFor: function(node) {
    return function(e) { library.rolloverMouseOver(e, node); };
  },

	// Rollover Mouse Out IE currentTarget fix
  getMouseOutFor: function(node) {
    return function(e) { library.rolloverMouseOut(e, node); };
  },
	
	//  Rollover Mouse Over
	rolloverMouseOver: function(e, targetElement)
	{
		var element = window.event ? targetElement : e ? e.currentTarget : null;
    if (!element)
			return;
		element.className += ' hover';
	},

	//  Rollover Mouse Out
	rolloverMouseOut: function(e, targetElement)
	{
		var element = window.event ? targetElement : e ? e.currentTarget : null;
    if (!element)
			return;
		element.className = element.className.replace(/\shover/i, "");
	},
	
	//  Tooltip Activate
	tooltipActivate: function(e)
	{
		var element = window.event ? window.event.srcElement : e ? e.target : null;
    if (!element)
			return;

		element = library.ascendDom(element,"div");
		
		element.className += ' help-tip';
	},

	//  Tooltip Deactivate
	tooltipDeactivate: function(e, targetElement)
	{
		var element = window.event ? window.event.srcElement : e ? e.target : null;
    if (!element)
			return;
			
		element = library.ascendDom(element,"div");
		
		element.className = element.className.replace(/\shelp-tip/i, "");
	}
}




// Div Tag Behaviours
var divBehaviour = {

	init: function()
	{
		if(!document.getElementsByTagName)
			return;
		divBehaviour.divTags = document.getElementsByTagName('div');
		
		for(var i = 0; i < divBehaviour.divTags.length; i++)
		{
			// Rollover Behaviour
			if(library.checkClass(divBehaviour.divTags[i], "rollover"))
			{
				library.addEvent(divBehaviour.divTags[i], 'mouseover', library.getMouseOverFor(divBehaviour.divTags[i]), false);
				library.addEvent(divBehaviour.divTags[i], 'mouseout', library.getMouseOutFor(divBehaviour.divTags[i]), false);
			}
			
			// Switch Content Behaviour
			if(library.checkClass(divBehaviour.divTags[i], "switch"))
			{
				// NB This code only allows for one set of switch tags per page
				var switchElements = divBehaviour.divTags[i].getElementsByTagName('div');
				for(var j = 0; j < switchElements.length; j++)
				{
					if(library.checkClass(switchElements[j], "switch-section"))
    				divBehaviour.divSwitchSections[divBehaviour.divSwitchSections.length] = switchElements[j];
					if(library.checkClass(switchElements[j], "switch-tab"))
    				divBehaviour.divSwitchTabs[divBehaviour.divSwitchTabs.length] = switchElements[j];
				}

				for(var j = 0; j < divBehaviour.divSwitchTabs.length; j++)
				{
  				divBehaviour.divSwitchTabs[j].innerHTML = "<a href='javascript:divBehaviour.switchSection(" + j + ")'>" + divBehaviour.divSwitchTabs[j].innerHTML + "</a>";
				}
			}
				
		}
	},
	
	switchSection: function (section)
	{
		for(var i = 0; i < divBehaviour.divSwitchSections.length; i++)
		{
			divBehaviour.divSwitchSections[i].className = divBehaviour.divSwitchSections[i].className.replace(/\ssection-shown/g, "");
		}
		divBehaviour.divSwitchSections[section].className += " section-shown";
		
		for(var i = 0; i < divBehaviour.divSwitchTabs.length; i++)
		{
			divBehaviour.divSwitchTabs[i].className = divBehaviour.divSwitchTabs[i].className.replace(/\stab-shown/g, "");
		}
		divBehaviour.divSwitchTabs[section].className += " tab-shown";
	},
	
	divTags: [],
	divSwitchSections: [],
	divSwitchTabs: []
};
library.addEvent(window, 'load', divBehaviour.init, false);

// Select Behaviours
var selectBehaviour = {

	init: function()
	{
		if(!document.getElementsByTagName)
			return;
		selectBehaviour.selectTags = document.getElementsByTagName('select');
		
		for(var i = 0; i < selectBehaviour.selectTags.length; i++)
		{
			// Menu Link Behaviour
			if(library.checkClass(selectBehaviour.selectTags[i], "menu-links"))
			{
			}
			
			// Help Behaviour
			if(library.checkClass(selectBehaviour.selectTags[i], "help"))
			{
  			library.addEvent(selectBehaviour.selectTags[i], 'mouseover', library.tooltipActivate, false);
  			library.addEvent(selectBehaviour.selectTags[i], 'mouseout', library.tooltipDeactivate, false);
			}
			
			// Set Focus Behaviour
			if(library.checkClass(selectBehaviour.selectTags[i], "set-focus"))
			{
				selectBehaviour.selectTags[i].focus();
			}
		}
	},
	
	selectTags: []
};
library.addEvent(window, 'load', selectBehaviour.init, false);

// Input Behaviours
var inputBehaviour = {

	init: function()
	{
		if(!document.getElementsByTagName)
			return;
		inputBehaviour.inputTags = document.getElementsByTagName('input');
		
		for(var i = 0; i < inputBehaviour.inputTags.length; i++)
		{
			// Rollover Behaviour
			if(library.checkClass(inputBehaviour.inputTags[i], "rollover"))
			{
				library.addEvent(inputBehaviour.inputTags[i], 'mouseover', library.getMouseOverFor(inputBehaviour.inputTags[i]), false);
				library.addEvent(inputBehaviour.inputTags[i], 'mouseout', library.getMouseOutFor(inputBehaviour.inputTags[i]), false);
			}
			
			// Help Behaviour
			if(library.checkClass(inputBehaviour.inputTags[i], "help"))
			{
  			library.addEvent(inputBehaviour.inputTags[i], 'focus', library.tooltipActivate, false);
  			library.addEvent(inputBehaviour.inputTags[i], 'blur', library.tooltipDeactivate, false);

				// Add Mouseover for Checkboxes, Radio Buttons
				if(inputBehaviour.inputTags[i].type == "checkbox")
				{
  				library.addEvent(inputBehaviour.inputTags[i], 'mouseover', library.tooltipActivate, false);
  				library.addEvent(inputBehaviour.inputTags[i], 'mouseout', library.tooltipDeactivate, false);
				}
			}
			
			// Set Focus Behaviour
			if(library.checkClass(inputBehaviour.inputTags[i], "set-focus"))
			{
				inputBehaviour.inputTags[i].focus();
			}
		}
	},
	
	inputTags: []
};
library.addEvent(window, 'load', inputBehaviour.init, false);

// Anchor Link Behaviours
var linkBehaviour = {

	init: function()
	{
		if(!document.getElementsByTagName)
			return;
		linkBehaviour.links = document.getElementsByTagName('a');
		
		for(var i = 0; i < linkBehaviour.links.length; i++)
		{
			// New Window Behaviour
			if(library.checkClass(linkBehaviour.links[i], "new-window"))
			{
				linkBehaviour.links[i].target = "_blank";
				linkBehaviour.links[i].title = "This link opens in a new window";
			}

			// Popup Window Behaviour
			if(library.checkClass(linkBehaviour.links[i], "popup"))
			{
				linkBehaviour.links[i].target = "popupWindow";
				linkBehaviour.links[i].title = "This link opens in a popup window";
				library.addEvent(linkBehaviour.links[i], 'click', linkBehaviour.oClickPopupWindow, false);
			}
		}
	},
	
	// Onclick Popup Window
	oClickPopupWindow: function(e)
	{
		var anchorLink;
		if(e && e.target)
			anchorLink = e.target;
		if(window.event && window.event.srcElement)
			anchorLink = window.event.srcElement;
		if(!anchorLink)
			return;
			
		if(anchorLink.nodeType == 3)
			anchorLink = anchorLink.parentNode;

		if(library.checkClass(anchorLink, "window-size-", true))
		{
			var pos = anchorLink.className.indexOf("window-size-");
			var xpos = anchorLink.className.indexOf("x",pos);
			var winWidth = anchorLink.className.substring(pos+12,xpos);
			var winHeight = anchorLink.className.substring(xpos+1,anchorLink.className.length);
		}
		else
		{
			var winWidth = properties.defaultPopupWidth;
			var winHeight = properties.defaultPopupHeight;
		}

		var popup = window.open('', 'popupWindow','resize=1,scrollbars=1,top=' + Math.round(document.body.clientHeight/2 - winHeight/2) + ',left=' + Math.round(document.body.clientWidth/2 - winWidth/2) + ',width=' + winWidth + ',height=' + winHeight);
	},
	
	links: []
};
library.addEvent(window, 'load', linkBehaviour.init, false);



// Close Window Behaviour
var closeWindowBehaviour = {

	init: function()
	{
		if(!document.getElementById || !document.createElement || !document.createTextNode)
			return;
		// NB This code only allows for one Close Window button per page
		var element = document.getElementById("CloseWindow");
		if(!element)
			return;
	
		var link = document.createElement('a');
		link.href="javascript:window.close()";
		var linkTn = document.createTextNode('Close Window');
		link.appendChild(linkTn);
		element.appendChild(link);
	},
	
	element: ""
};
library.addEvent(window, 'load', closeWindowBehaviour.init, false);
