var HANS = function () {
	var domDeleteNode, domDeleteChildNodes, domGetParentForm, domAugmentElementWithHTML, domSetElementInnerHTML, domDisableElement, domEnableElement;
	
	domDeleteNode = function (pageElement) {
		if (pageElement) { //make sure the node exists
			domDeleteChildNodes(pageElement); //first delete node's children
			YAHOO.util.Event.purgeElement(pageElement); //remove listeners
			if (typeof pageElement.outerHTML !== 'undefined') {
				pageElement.outerHTML = ''; //prevent pseudo-leak in IE
			}
			else {
				if (pageElement.parentNode) { //if the node has a parent
					pageElement.parentNode.removeChild(pageElement); //remove the node from the DOM tree
				}
			}
				
			//delete pageElement; //clean up just to be sure
		}
		return true;
	};
	
	domDeleteChildNodes = function (pageElement) {
		if (pageElement) { //make sure the node exists
			while (pageElement.hasChildNodes()) { //delete all of node's children
				domDeleteNode(pageElement.firstChild);
			}
		}
		return true;
	};
	
	domGetParentForm = function (pageElement) {
		for (var currentElement = pageElement; currentElement.parentNode; currentElement = currentElement.parentNode) {
			if (currentElement.tagName === "FORM") {
				return currentElement;
			}
		}
		return null;
	};	
	
	domAugmentElementWithHTML = function (pageElement, HTMLtoAppend) {
		domSetElementInnerHTML(pageElement, pageElement.innerHTML + HTMLtoAppend);
		return true;
	};
	
	domSetElementInnerHTML = function (pageElement, newInnerHTML) {
		domDeleteChildNodes(pageElement);
		pageElement.innerHTML = newInnerHTML;
		return true;
	};
	
	domDisableElement = function (pageElement) {
		if( pageElement.tagName == "INPUT" || pageElement.tagName == "SELECT" ) {
			pageElement.blur();
			pageElement.disabled = true;
		}
		else {
			for( var i = 0; i < pageElement.childNodes.length; i++ ) {
				domDisableElement( pageElement.childNodes[i] );
			}
		}
	};
	
	domEnableElement = function (pageElement) {
		if( pageElement.tagName == "INPUT" || pageElement.tagName == "SELECT" ) {
			pageElement.disabled = false;
		}
		else {
			for( var i = 0; i < pageElement.childNodes.length; i++ ) {
				domEnableElement( pageElement.childNodes[i] );
			}
		}
	};
	
	var domScrollToBottom = function (pageElement) {
		pageElement.scrollTop = pageElement.scrollHeight;
	};
	
	var utf8Encode = function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
		
		for (var n = 0; n < string.length; n++) {
			
			var c = string.charCodeAt(n);
			
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			
		}
		
		return utftext;
	};		
	
	var utf8Decode = function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
		
		while ( i < utftext.length ) {
			
			c = utftext.charCodeAt(i);
			
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
			
		}
		
		return string;
	};
	
	var eventIsRightClick = function (e) {
		if (!e) {
			var e = window.event;
		}
		if (e.which) {
			return e.which == 3;
		}
		else if (e.button) {
			return e.button == 2;
		}
		
		return false;
	};
	
	var eventGetTargetOf = function (e) {
		var targetElement;
		if (!e) {
			var e = window.event;
		}
		if (e.target){
			targetElement = e.target;
		}
		else if (e.srcElement) {
			targetElement = e.srcElement;
		}
		
		if (targetElement.nodeType == 3) {// defeat Safari bug
			targetElement = targetElement.parentNode;
		}
		
		return targetElement;
	};
	
	return {
		domHelper : {
			deleteNode : domDeleteNode,
			deleteChildNodes : domDeleteChildNodes,
			getParentForm : domGetParentForm,
			augmentElementWithHTML : domAugmentElementWithHTML,
			setElementInnerHTML : domSetElementInnerHTML,
			disableElement : domDisableElement,
			enableElement : domEnableElement,
			scrollToBottom : domScrollToBottom
		},
		
		utf8 : {
			encode : utf8Encode,
			decode : utf8Decode
		},
		
		eventHelper : {
			isRightClick : eventIsRightClick,
			getTargetOf : eventGetTargetOf
		}
	};
	
}();