﻿// CUSTOM INITIALISATION

window.onload = init;

var browserName;

// visual initialisation
function init() {

	// environment variables
	browserName = getBrowserName();	    
	
	// browser hacks
	if (browserName == 'ie') {
		// allow custom hover events on spans etc.		
		try {
			parseStylesheets();			
		} catch(e) {
			// unable to load as cross domain
		} 
	} else if (browserName == 'netscape') {
		// drop down navigation, remove in Netscape
		accessibleSkip(document.getElementsBySelector('#nav-primary ul li ul'));
	}
}

// browser check, via quirksmode
function checkBrowser(string)
{
	place = navigator.userAgent.toLowerCase().indexOf(string) + 1;
	thestring = string;
	return place;
}

function getBrowserName() {
	var browser;
	
	if (checkBrowser('konqueror'))
	{
		browser = "konqueror";
	}
	else if (checkBrowser('safari')) browser = "safari"
	else if (checkBrowser('omniweb')) browser = "omniweb"
	else if (checkBrowser('opera')) browser = "opera"
	else if (checkBrowser('webtv')) browser = "webtv";
	else if (checkBrowser('icab')) browser = "icab"
	else if (checkBrowser('msie')) browser = "ie"
	else if (checkBrowser('netscape')) browser = "netscape"
	else browser = "unknown";
	
	return browser;	
}

// UTILITIES

function replace(input, x, y) {
	var regex = new RegExp(x, 'g');
	return input.replace(regex, y);
}

function integerPad(n, totalDigits) { 
	n = n.toString(); 
	var pd = ''; 
	if (totalDigits > n.length) 
	{ 
		for (i=0; i < (totalDigits - n.length); i++) 
		{ 
			pd += '0'; 
		} 
	} 
	return pd + n.toString(); 
} 

function positionX(inputElement) 
{
    var offsetLeft = 0;
    if (inputElement.offsetParent)
    {
        while (inputElement.offsetParent)
        {
            offsetLeft += inputElement.offsetLeft;
            inputElement = inputElement.offsetParent;
        }
    }
    else if (inputElement.x)
    {
        offsetLeft += inputElement.x;
    }
    return offsetLeft;
}
    
function positionY(inputElement) 
{
    var offsetTop = 0;
    if (inputElement.offsetParent)
    {
        while (inputElement.offsetParent)
        {
            offsetTop += inputElement.offsetTop;
            inputElement = inputElement.offsetParent;
        }
    }
    else if (inputElement.y)
    {
        offsetTop += inputElement.y;
    }
    return offsetTop;
}

/**
 *	HOVER - V1.00.031224 - whatever:hover in IE
 *	---------------------------------------------
 *	Peterned - http://www.xs4all.nl/~peterned/
 *	(c) 2003 - Peter Nederlof
 *
 *	howto: body { behavior:url("csshover.htc"); }
 *	---------------------------------------------
 */

var currentSheet, doc = window.document;
function parseStylesheets() {
	var sheets = doc.styleSheets, l = sheets.length;
	for(var i=0; i<l; i++) 
		parseStylesheet(sheets[i]);
}

function parseStylesheet(sheet) {
	var l, rules, imports;
	if(sheet.imports) {
		imports = sheet.imports, l = imports.length;
		for(var i=0; i<l; i++) 
			parseStylesheet(sheet.imports[i]);
	}

	rules = (currentSheet = sheet).rules, l = rules.length;
	for(var j=0; j<l; j++) parseCSSRule(rules[j]);
}

function parseCSSRule(rule) {
	var select = rule.selectorText, style = rule.style.cssText;
	if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):hover/i).test(select)) return;
	
	var newSelect = select.replace(/(\.([a-z0-9_-]+):hover)|(:hover)/g, '.$2onHover');
	var hasClass = (/(\.([a-z0-9_-]+):hover)/g).exec(select);
	var className = (hasClass? hasClass[2]:'') + 'onHover';
	var affected = select.replace(/:hover.*$/g, '');
	var elements = getElementsBySelect(affected);
	
	currentSheet.addRule(newSelect, style);
	for(var i=0; i<elements.length; i++)
		new HoverElement(elements[i], className);
}

function HoverElement(node, className) {
	if(!node.hovers) node.hovers = {};
	if(node.hovers[className]) return;
	node.hovers[className] = true;
	node.attachEvent('onmouseover',
		function() { node.className += ' ' + className; });
	node.attachEvent('onmouseout',
		function() { node.className = 
			node.className.replace((new RegExp('\\s+'+className)),''); });
}

function getElementsBySelect(rule) {
	var parts, nodes = [doc];
	parts = rule.split(' ');
	for(var i=0; i<parts.length; i++) {
		nodes = getSelectedNodes(parts[i], nodes);
	}	return nodes;
}

function getSelectedNodes(select, elements) {
	var result, node, nodes = [];
	var classname = (/\.([a-z0-9_-]+)/i).exec(select);
	var identify = (/\#([a-z0-9_-]+)/i).exec(select);
	var tagName = (/^[a-z0-9]+/i).exec(select.toUpperCase()) || '*';
	for(var i=0; i<elements.length; i++) {
		result = elements[i].getElementsByTagName(tagName);
		for(var j=0; j<result.length; j++) {
			node = result[j];
			if((identify && node.id != identify[1]) || (classname && !(new RegExp('\\b' +
				classname[1] + '\\b').exec(node.className)))) continue;
			nodes[nodes.length] = node;
		}
	}	return nodes;
}


