(function () {
var WhenDomReady = function(callBack,scope){ var scope = scope || window; var args = []; for (var i=2, len = arguments.length; i < len; ++i) { args.push(arguments[i]); }; if (navigator.userAgent.match(/WebKit/)) { (function(){ if(document.readyState != 'complete' && document.readyState != 'loaded') return setTimeout(arguments.callee, 1); callBack.apply(scope, args); })(); } else if (document.addEventListener) { document.addEventListener("DOMContentLoaded", function(){callBack.apply(scope, args);}, false); } else if (document.all) {   if(!document.getElementById('WhenDomReady_element')) {document.write("<scr" + "ipt id=\"WhenDomReady_element\" defer=true " + "src=//:><\/scr" + "ipt>");  } document.getElementById('WhenDomReady_element').attachEvent("onreadystatechange",function(){ if (document.getElementById('WhenDomReady_element').readyState=="complete"){ callBack.apply(scope, args); } }); } }

var njdc = {
	util: {
		init: function () {
			if (!Array.prototype.push) {
				Array.prototype.push = function(elem) {
					this[this.length] = elem;
				}
			}
		},
		hasClassName: function(lmnt,classname) {
			var classArray = lmnt.className.split(' ');
			for (var i = 0; i < classArray.length; i++) {
				if (classArray[i] == classname) {
					return true;
				}
			}
			return false;
		},
		removeClassName: function(lmnt,classname) {
			if (njdc.util.hasClassName(lmnt,classname)) {
				if (lmnt.className == classname) {
					lmnt.className = "";
					return true;
				} else {
					lmnt.className = lmnt.className.replace(' '+classname,'');
					lmnt.className = lmnt.className.replace(classname+' ','');
					return true;
				}
			}
			return false;
		},
		addClassName: function(lmnt,classname) {
			if (!njdc.util.hasClassName(lmnt,classname)) {
				lmnt.className += ' ' + classname;
				return true;
			} else {
				return false;
			}
		},
		listenerRegistry: {
			_registry: null,
			init: function() {
				if (this._registry == null) {
					this._registry = [];
					//this.registerListener(window, "unload", this.clearRegistry);
				}
			},
			registerListener: function(lmnt, type, handler, capture) {
				this.init();
				if (typeof lmnt == "string") {
					lmnt = document.getElementById(lmnt);
				}

				if (lmnt == null || handler == null) {
					return false;
				}

				if (lmnt.addEventListener) {
					lmnt.addEventListener(type, handler, capture);
					this._registry.push({lmnt: lmnt, type: type, handler: handler, capture: capture});
					return true;
				}

				if (lmnt.attachEvent && lmnt.attachEvent("on" + type, handler)) {
					this._registry.push({lmnt: lmnt, type: type, handler: handler, capture: false});
					return true;
				}
				return false;
			},
			clearRegistry: function() {
				for (var i = 0; i < this._registry.length; i++) {
					with (this._registry[i]) {
						if (lmnt.removeEventListener)
						lmnt.removeEventListener(type, handler, capture);
						else if (lmnt.detachEvent)
						lmnt.detachEvent("on" + type, handler);
					}
				}
				this._registry = null;
			}
		}
	},
	init: function () {
		this.util.init();
		this.mainNavigation.init();
		this.forms.init();
	},
	mainNavigation: {
		mainNavigationElement: null,
		mainNavigationElementId: 'main-navigation',
		activeLis: [],
		init: function () {
			this.mainNavigationElement = document.getElementById(this.mainNavigationElementId);
			var children = this.mainNavigationElement.childNodes;
			for (var i = 0; i < children.length; i++) {
				if (children[i].nodeType == 1 && children[i].nodeName.toLowerCase() == 'li') {
					this.activeLis[this.activeLis.length] = children[i];
				}
			}
			this.mainNavigationElement.onmouseout = function (e) {
				njdc.mainNavigation.handle(e);
			}
			this.mainNavigationElement.onmouseover = function (e) {
				njdc.mainNavigation.handle(e);
			}
		},
		handle: function (e) {
			if (!e) {var e = window.event;}
			var target = (window.event) ? e.srcElement : e.target;

			if (e.type == 'mouseout') {
				/* ie uses toElement for relatedTarget, and relatedTarget for the href of a link which is the src of an event... */
				var relatedTarget = (e.toElement) ? e.toElement : e.relatedTarget;

				/* firefox spawns 'anonymous-div's and throws terrible errors when you try and request properties of them...? */
				try {
					relatedTarget.className;
				} catch (e) {
					return false;
				}
				while (relatedTarget != this.mainNavigationElement && relatedTarget.parentNode) {
					try {	
						relatedTarget = relatedTarget.parentNode;
					} catch (e) {
					}
				}
				if (relatedTarget == this.mainNavigationElement) {return false;}
				this.hide();
			} else if (e.type == 'mouseover') {
				var originalTarget = (window.event) ? e.srcElement : e.target;
				var isAnActiveLi = function (lmnt) {
					var activeLis = njdc.mainNavigation.activeLis;
					for (var i = 0; i < activeLis.length; i++) {
						if (activeLis[i] == lmnt) {
							return true;
						}
					}
					return false;
				}
					while (target != document.body && target.nodeName.toLowerCase() != 'html' && !isAnActiveLi(target) && target.parentNode) {
						target = target.parentNode;	
					}

					if (isAnActiveLi(target)) {
						this.hide();
						njdc.util.addClassName(target,'hover');
						return true;
					} else {
						return false;
					}
			} else {return false;}
		},
		hide: function () {
			var lis = this.activeLis;
			for (var i = 0; i < lis.length; i++) {
				njdc.util.removeClassName(lis[i],'hover');
			}
		}
	},
	forms: {
		inputs: [],
		textInputs: [],
		clearValueInputs: [],
		init: function () {
			this.inputs = document.getElementsByTagName('input');
			for (var i = 0; i < this.inputs.length; i++) {
				if (this.inputs[i].getAttribute('type') == 'text') {this.textInputs[this.textInputs.length] = this.inputs[i];}
			}
			for (var i = 0; i < this.textInputs.length; i++) {
				if (njdc.util.hasClassName(this.textInputs[i],'clearValueOnFirstFocus')) {
					this.clearValueInputs[this.clearValueInputs.length] = this.textInputs[i];
					njdc.util.listenerRegistry.registerListener(this.textInputs[i], 'focus', function (e) {njdc.forms.handle(e);}, true);
				}
			}
		},
		handle: function (e) {
			if (!e) {var e = window.event;}
			if (!e.target) {e.target = e.srcElement;}
			if (njdc.util.hasClassName(e.target,'clearValueOnFirstFocus')) {
				this.clearValue(e.target);
			}
		},
		clearValue: function (lmnt) {
			var originalValue = null;
			if (lmnt.getAttribute) {
				originalValue = lmnt.getAttribute('value');
			} else {
				originalValue = lmnt.attributes['value'];
			}
			if (lmnt.value == originalValue) {
				lmnt.value = '';
				return true;
			} else {
				return false;
			}
		}
	}
};

WhenDomReady(  
  function(){  
		njdc.init();
  }  
); 
})();

