/*
Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work of Simon Willison (see comments by Simon below).
Description: Uses css selectors to apply javascript behaviours to enable unobtrusive javascript in html documents.
*/

var Behaviour = {
list : new Array,
register : function(sheet) {
	Behaviour.list.push(sheet);
},
start : function(){
	Behaviour.addLoadEvent(function() {
		Behaviour.apply();
	});
},
apply : function() {
	for (h = 0; sheet = Behaviour.list[h]; h++) {
		for (selector in sheet) {
			list = document.getElementsBySelector(selector);
			if (! list) { continue; }
			for (i = 0; element = list[i]; i++) { sheet[selector](element); }
		}
	}
},
addLoadEvent : function(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') { window.onload = func; }
	else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}
}
Behaviour.start();

/*
The following code is Copyright (C) Simon Willison 2004.
document.getElementsBySelector(selector)
- returns an array of element objects from the current document
matching the CSS selector. Selectors can contain element names, 
class names and ids and can be nested. For example:
elements = document.getElementsBySelect('div#main p a.external')
Will return an array of all 'a' elements with 'external' in their 
class attribute that are contained inside 'p' elements that are 
contained inside the 'div' element which has id="main"
New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
See http://www.w3.org/TR/css3-selectors/#attribute-selectors
Version 0.4 - Simon Willison, March 25th 2003
-- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows
-- Opera 7 fails
*/

function getAllChildren(e) {
	return e.all ? e.all : e.getElementsByTagName('*');
}
document.getElementsBySelector = function(selector) {
	if (!document.getElementsByTagName) { return new Array(); }
	var tokens			= selector.split(' ');
	var currentContext	= new Array(document);
	for (var i = 0; i < tokens.length; i++) {
		token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
		if (token.indexOf('#') > -1) {
			var bits		= token.split('#');
			var tagName		= bits[0];
			var id			= bits[1];
			var element		= document.getElementById(id);
			if (tagName && element.nodeName.toLowerCase() != tagName) { return new Array(); }
			currentContext	= new Array(element);
			continue;
		}
		if (token.indexOf('.') > -1) {
			var bits		= token.split('.');
			var tagName		= bits[0];
			var className	= bits[1];
			if (! tagName) { tagName = '*'; }
			var found		= new Array;
			var foundCount	= 0;
			for (var h = 0; h < currentContext.length; h++) {
			var elements;
			if (tagName == '*') { elements = getAllChildren(currentContext[h]); }
			else { elements = currentContext[h].getElementsByTagName(tagName); }
			for (var j = 0; j < elements.length; j++) { found[foundCount++] = elements[j]; }
		}
		currentContext			= new Array;
		var currentContextIndex	= 0;
		for (var k = 0; k < found.length; k++) {
			if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) { currentContext[currentContextIndex++] = found[k]; }
		}
		continue;
	}
	if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
		var tagName				= RegExp.$1;
		var attrName			= RegExp.$2;
		var attrOperator		= RegExp.$3;
		var attrValue			= RegExp.$4;
		if (! tagName) { tagName = '*'; }
		var found				= new Array;
		var foundCount			= 0;
		for (var h = 0; h < currentContext.length; h++) {
			var elements;
			if (tagName == '*') { elements = getAllChildren(currentContext[h]); }
			else { elements = currentContext[h].getElementsByTagName(tagName); }
			for (var j = 0; j < elements.length; j++) { found[foundCount++] = elements[j]; }
		}
		currentContext			= new Array;
		var currentContextIndex	= 0;
		var checkFunction;
		switch (attrOperator) {
			case '=':
				checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
				break;
			case '~':
				checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
				break;
			case '|':
				checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
				break;
			case '^':
				checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
				break;
			case '$':
				checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
				break;
			case '*':
				checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
				break;
			default :
				checkFunction = function(e) { return e.getAttribute(attrName); };
		}
		currentContext			= new Array;
		var currentContextIndex	= 0;
		for (var k = 0; k < found.length; k++) {
			if (checkFunction(found[k])) { currentContext[currentContextIndex++] = found[k]; }
		}
		continue;
	}
	if (! currentContext[0]){ return; }
	tagName						= token;
	var found					= new Array;
	var foundCount				= 0;
	for (var h = 0; h < currentContext.length; h++) {
		var elements = currentContext[h].getElementsByTagName(tagName);
		for (var j = 0; j < elements.length; j++) { found[foundCount++] = elements[j]; }
	}
	currentContext = found;
}
return currentContext;
}
