//<script>
// Element Library
//
// Miller Hare element library v1.0
// 04/12/2006 Miller Hare Limited
//
// simple functions for doing things with DOM elements

// Get Elements

	function myGetElementById(elid) {
		return myGetElementByID(elid);
	}
	function myGetElementByID(elid) {
		if (document.getElementById) {
			return document.getElementById(elid);
		} else {
			if (document.all) {
				return document.all[elid];
			} else {
				return null;
			}
		}
	}
	
	function myGetElementByIdFrom(doc, elid) {
		if (document.getElementById) {
			return doc.getElementById(elid);
		} else {
			if (document.all) {
				return doc.all[elid];
			} else {
				return null;
			}
		}
	}
	
	function myGetElementsByTagName(tag) {
		if (document.getElementsByTagName) {
			return document.getElementsByTagName(tag);
		} else {
			if (document.all && document.all.tags) {
				return document.all.tags(tag);
			} else {
				return null;
			}
		}
	}
	
	
	function getFirstChildElement(node) {
		if (node.hasChildNodes) {
			for (var i=0; i<node.childNodes.length; i++) {
				if (node.childNodes.item(i).nodeType === 1) {
					return node.childNodes.item(i);
				}
			}
		}
		
		return null;
	}
	
	function forEachTagBelow(node, tagName, fn) {
		var c, cl;
		if (node && node.hasChildNodes && fn) {
			c = node.childNodes;
			cl = c.length
			for (var i=0; i<cl; i++) {
				if (c.item(i).tagName === tagName) {
					fn(c.item(i));
				}
			}
		}
	}
			
	
	
// Class names
		
	function hasClassName(el ,strClassName) {
		var classNames = ' ' + el.className + ' ';
		return (classNames.indexOf(' ' + strClassName + ' '));
	}
	
	function addClassName(el, strClassName) {
		if (hasClassName(el, strClassName)<0) {
			if (el.className.length > 0) {
				el.className += ' ' + strClassName;
			} else {
				el.className = strClassName;
			}
			return true;
		}
		return false;
	}
	
	function removeClassName(el, strClassName) {
		var classPrefix = '';
		var classPostfix = '';
		
		var classNameStart = hasClassName(el, strClassName);
		
		if (classNameStart < 0) {
			return false;
		}
		
		if (classNameStart > 0) {
			classPrefix = el.className.substr(0,classNameStart);
		}
		if (classNameStart + strClassName.length < el.className.length) {
			classPostfix = el.className.substr(classNameStart + strClassName.length + 1);
		}
		el.className = classPrefix + classPostfix;
		return true;
	}
	
	function toggleClassName(el, strClassName, state) {
		if (state) {
			addClassName(el, strClassName);
		} else {
			removeClassName(el, strClassName);
		}
	}

// Stylesheets

	function updateCSS(selector, property, value) {
		//alter property value associated with a selector anywhere in a document's stylesheets
		//returns true if rule was altered, false if no rule with the supplied selector name could be found
		
		var useCssRules, oCssRules;
		var rule, ss;
		var lcaseSelector;
		
		if (document.styleSheets && document.styleSheets.length > 0 && selector) {
			useCssRules = document.styleSheets[0].cssRules;
			
			lcaseSelector = selector.toLowerCase();
			
			//step backwards through stylesheets and rules, so we change the rule with the highest specificity?
			for (ss = document.styleSheets.length-1; ss >= 0; ss--){
			
				if (useCssRules) {
					oCssRules = document.styleSheets[ss].cssRules;
				} else {
					oCssRules = document.styleSheets[ss].rules;
				}
				
				if (oCssRules) {
					for (rule = oCssRules.length-1; rule >= 0; rule--) {
						if (oCssRules[rule].selectorText.toLowerCase() == lcaseSelector) {
							if (oCssRules[rule].style) {
								oCssRules[rule].style[property] = value;
								return true;
							} else {
								alert("unable to set " + selector + " property " + property + " to " + value + ". (stylesheet " + ss + ", rule " + rule + ")");
							}
						}
					}
				}
			}
		}
		return false;
	}

// Events

	function findEventElement(e, tagName) {
		var element = e.target || e.srcElement;		tagName = tagName.toUpperCase();
		while (element.parentNode && (!element.tagName || (element.tagName != tagName))) {
			element = element.parentNode;		}		if (!element.tagName || (element.tagName != tagName)) {			return null;		} else {
			return element;		}
	}
