if (typeof HD == "undefined" || !HD) {
	/**
	 * The HD global namespace object.  If HD is already defined, the
	 * existing HD object will not be overwritten so that defined
	 * namespaces are preserved.
	 * 
	 * @class HD
	 * @static
	 */
	var HD = {
		// temporarily holds events event listeners until YUI is loaded
		onLoadQueue : [],
		isYuiLoaded : false,
		util : {},
		loader : null,
		classMap : {},
		
		get : function(identifier) {
			return YAHOO.util.Dom.get(identifier);
		},
		
		// Overriding scope isn't available in the YUI version included.
		getByClass : function(className, elementType, containerEl, apply /*, o, overrides*/) {
			return YAHOO.util.Dom.getElementsByClassName.apply(YAHOO.util.Dom, arguments);
		},
		
		addModules : function(loader) {
			for(var key in this.modules) {
				loader.addModule(this.modules[key]);
			}
		},
		
		insert : function(config) {
			var loader = this.getLoader();
			if(loader !== null) {
				loader.insert(config);
			}
		},
		
		getLoader : function() {
			if(this.loader === null) {
				this.loader = new YAHOO.util.YUILoader();
				this.addModules(this.loader);
			}
			return this.loader;
		},
		
		extend : function(subClass, superClasses) {
			/*
			if(typeof YAHOO != "undefined" && !!YAHOO) {
				YAHOO.lang.extend(subClass, superClass);
			}
			*/
			for(var i = 0, len = superClasses.length; i < len; i++) {
				var superClass = superClasses[i];
				for(var a in superClass.prototype) {
					if(!subClass.prototype[a]) {
						subClass.prototype[a] = superClass.prototype[a];
					}
				}
			}
			//return subClass;
		},
		
		// Clone an object (deep cloning will break with object instances).
		clone : function(source, deep) {
			var result = {};
			for (var prop in source) {
				if (deep && typeof source[prop] == 'object') {
					result[prop] = this.clone(source[prop], deep);
				}
				else {
					result[prop] = source[prop];
				}
			}
			return result;
		},
		
		// Create a merged object.
		merge : function(source, override, deep, clone) {
			for (var prop in override) {
				source[prop] = override[prop];
			}
			return source;
		},
		
		register : function(name, className, info) {
			/*
			if(typeof YAHOO != "undefined" && !!YAHOO) {
				YAHOO.register(name, className, info);
			}
			*/
			HD.classMap[name] = className;
		},
		
		onLoad : function(callback) {
			if(typeof YAHOO != "undefined") {
				YAHOO.util.Event.onDOMReady(callback);
			} else {
				this.onLoadQueue.push(callback);
			}
		},
		
		addClass : function(element, className) {
			YAHOO.util.Dom.addClass(element, className);
		},
		
		removeClass : function(element, className) {
			YAHOO.util.Dom.removeClass(element, className);
		},
		
		replaceClass : function(element, oldClassName, className) {
			YAHOO.util.Dom.replaceClass(element, oldClassName, className);
		},
		
		hasClass : function(element, className) {
			return YAHOO.util.Dom.hasClass(element, className);
		},
		
		show : function(element) {
			HD.removeClass(element, HD.CSS_CLASSES.HIDDEN);
		},
		
		hide : function(element) {
			HD.addClass(element, HD.CSS_CLASSES.HIDDEN);
		},
		
		// YUI independent method for inserting JS
		includeJs : function(url, callback) {
			var cb = callback;
			var script = document.createElement("script");
			script.type = "text/javascript";
			script.language = "javascript";
			script.src = url;
			
			if(navigator.userAgent.indexOf("IE")>=0) {
				script.onreadystatechange = function(){
					if(script && ("loaded" == script.readyState || "complete" == script.readyState)) {
						script.onreadystatechange=null;
						cb();
					}
				};
			} else {
				script.onload=function(){
					script.onload=null;
					cb();
				};
			}
			
			document.getElementsByTagName("head")[0].appendChild(script);
		},
		
		yuiLoaded : function() {
			for(var i = 0, len = HD.onLoadQueue.length; i < len; i++) {
				HD.onLoad(HD.onLoadQueue[i]);
			}
		},
		
		containsText : function(string, text) {
			if(string === null) {
				return false;
			}
			return string.indexOf(text) > -1;
		},
		
		pluck : function(array, element) {
			var tempArray = [];
			for(var i = 0, len = array.length; i < len; i++) {
				var tempElement = array[i];
				if(tempElement != element) {
					tempArray.push(tempElement);
				}
			}
			array = tempArray;
		},
		
		log : function(message, severity) {
			// TODO use YUI logger
		}
	};
}
