﻿if (typeof hoob != "object")
	hoob = new Object();

hoob.userAgent = navigator.userAgent.toLowerCase();
hoob.win = (hoob.userAgent.indexOf("win") > -1);
hoob.mac = (hoob.userAgent.indexOf("mac") > -1);
hoob.ie = (hoob.userAgent.indexOf("msie") > -1);
hoob.w3c = (document.getElementById && !hoob.ie);
hoob.opera = (hoob.userAgent.indexOf("opera") > -1);
hoob.safari = (hoob.userAgent.indexOf("safari") > -1);
hoob.version = (hoob.ie) ? parseFloat(navigator.appVersion.match(/MSIE\s(\d+\.\d+)/)[1]) : null;

hoob.getObj = function(strLayer) {
	if(typeof(strLayer) == "object") return strLayer;
	var elmLayer = document.getElementById(strLayer);
	if (!elmLayer)
		elmLayer = document.getElementsByName(strLayer)[0];
	return elmLayer;
}

hoob.show = function() {
	for (var i=0; i<hoob.show.arguments.length; i++) {
		if ((elmLayer=hoob.getObj(hoob.show.arguments[i])))
			elmLayer.style.visibility = "visible";
	}
}

hoob.hide = function() {
	for (var i=0; i<hoob.hide.arguments.length; i++) {
		if ((elmLayer=hoob.getObj(hoob.hide.arguments[i])))
			elmLayer.style.visibility = "hidden";
	}
}

hoob.moveTo = function(strLayer, x, y, bRight) {
	if (!(elmLayer=hoob.getObj(strLayer)))
		return false;
	if (bRight) {
		if (x || x==0) elmLayer.style.right = x + "px";
	} 
	else {
		if (x || x==0) elmLayer.style.left = x + "px";
	}
	if (y || y==0) elmLayer.style.top = y + "px";
}

hoob.moveBy = function(strLayer, x, y, bRight) {
	hoob.moveTo(strLayer, hoob.getX(strLayer) + x, hoob.getY(strLayer) + y, bRight);
}

hoob.getW = function(strLayer) {
	if (!(elmLayer=hoob.getObj(strLayer)))
		return false;
	if (window.getComputedStyle) {
		var style=getComputedStyle(elmLayer, null);
		return parseInt(style.getPropertyValue('width'));
	}
	else if (elmLayer.style.pixelWidth)
		return elmLayer.style.pixelWidth;
	else if(elmLayer.offsetWidth)
		return elmLayer.offsetWidth;
}

hoob.getH = function(strLayer) {
	if (!(elmLayer=hoob.getObj(strLayer)))
		return false;
	if(elmLayer.offsetHeight)
		return elmLayer.offsetHeight;
	else if (window.getComputedStyle) {
		var style=getComputedStyle(elmLayer, null);
		return parseInt(style.getPropertyValue('height'));
	}
	else if (elmLayer.style.pixelHeight)
		return elmLayer.style.pixelHeight;
}

hoob.getElementsByAttribute = function (strAttribute, strSearchValue, elmLayer, strTagName, bParentAxis, bPartialMatch) {
	strTagName = strTagName || "*";
	elmLayer = hoob.getObj(elmLayer) || document;
	var arElements = [];	
	if (bParentAxis) {
		// Look for parents
		while ((elmLayer = elmLayer.parentNode)) {
			var sAttrValue = elmLayer.getAttribute(strAttribute);
			if ((!strTagName || elmLayer.nodeName == strTagName) && 
				((strAttribute == "class" && (elmLayer.className == strSearchValue || (bPartialMatch && elmLayer.className.indexOf(strSearchValue) > -1))) ||
				(strSearchValue && (elmLayer.getAttribute(strAttribute) == strSearchValue || (bPartialMatch && sAttrValue && sAttrValue.indexOf(strSearchValue) > -1))) || 
				(!strSearchValue && sAttrValue))) {
					arElements.push(elmLayer);
			}
		}
	}
	else {
		// Look for children
		var arAllElements = elmLayer.getElementsByTagName(strTagName);
		var arElements = [];
		for (var i=0; i<arAllElements.length; i++) {
			var sAttrValue = arAllElements[i].getAttribute(strAttribute);
			if ((strAttribute == "class" && (arAllElements[i].className == strSearchValue || (bPartialMatch && arAllElements[i].className.indexOf(strSearchValue) > -1))) || 
				(strSearchValue && (sAttrValue == strSearchValue || (sAttrValue && sAttrValue.indexOf(strSearchValue) > -1))) ||
				(!strSearchValue && sAttrValue)) {
					arElements.push(arAllElements[i]);
			}
		}
	}
	return arElements.slice(0);
}

hoob.isEmail = function(strEmail) {
	var re=/^([a-z0-9]+([_*\-*\.]\w+)*)@([a-z0-9]+([\-\.][a-z0-9]+)*)\.([a-z0-9]+([\-\.][a-z0-9]+)*)/i;
	return re.test(strEmail);
}

/*
Användning:
Första parametern är själva fomuläret
Andra parametern är en array med alla formulärfält och hur dom skall kollas.
Varje item denna array är i sig ett object med dessa properties:
{name, type:'email/text/same', emptyOk:true/false, errorText, insertBefore:true/false, nodeName, fieldsToCheck:[array, namn på de fält man skall kolla emot om type=same (för t ex lösenord som skall upprepas)]}

Exempel på användning:
onsubmit="return hoob.checkForm('profileForm', [{name:'email', type:'email', emptyOk:false, errorText:'Var vänlig fyll i en giltig email-adress.', insertBefore:false, nodeName:'span'}])"
*/
hoob.checkForm = function(elmForm, arFields) {
	if (!(elmForm=hoob.getObj(elmForm))) return false;
	var bOk = true;
	for (var i=0; i<arFields.length; i++) {
		var elmField = elmForm[arFields[i].name];
		var sValue = elmField.value;
		var bThisOk = true;
		if (arFields[i].type == "text") {
			if (sValue.length < 1 && !arFields[i].emptyOk)
				bThisOk = false;
		}
		else if (arFields[i].type == "email") {
			if (!hoob.isEmail(sValue) && !(arFields[i].emptyOk && sValue.length < 1))
				bThisOk = false;
		}
		else if (arFields[i].type == "same") {
			if (!arFields[i].emptyOk && sValue.length < 1)
				bThisOk = false;
			for (var j=0; j<arFields[i].fieldsToCheck.length; j++) {
				var sCheckValue = elmForm[arFields[i].fieldsToCheck[j]].value;
				if (sValue != sCheckValue)
					bThisOk = false;
			}
		}
		if (bThisOk) {
			hoob.showFormError(elmField, arFields[i], true);
		}
		else {
			hoob.showFormError(elmField, arFields[i]);
			bOk = false;
		}
	}
	
	return bOk;
}

hoob.showFormError = function(elmField, oError, bClearError) {
	var elmError = oError.insertBefore ? elmField.previousSibling : elmField.nextSibling;
	if (!elmError || elmError.name != "formError") {
		elmError = document.createElement(oError.nodeName);
		if (oError.insertBefore)
			elmField.parentNode.insertBefore(elmError, elmField);
		else
			if (elmField.nextSibling)
				elmField.parentNode.insertBefore(elmError, elmField.nextSibling);
			else
				elmField.parentNode.appendChild(elmError);
		elmError.name = "formError";
		elmError.className = "formError";
	}
	var sText = bClearError ? "" : oError.errorText;
	elmError.innerHTML = sText;
}

hoob.getParentNode = function(strLayer, strParentNodeName, iDepth) {
	var elmLayer = hoob.getObj(strLayer);
	if (!elmLayer)
		return;
	iDepth = iDepth || 15;
	elmTmpParent = elmLayer.parentNode;
	if (!elmTmpParent)
		return;
	for (var i=0; i<iDepth; i++) {
		if (elmTmpParent.nodeName == strParentNodeName.toUpperCase())
			return elmTmpParent;
		else
			elmTmpParent = elmTmpParent.parentNode;
	}
	return false;
}

hoob.addEvent = function(strLayer, strEvent, strFunction, bRemove) {
	if (!(elmLayer=hoob.getObj(strLayer)))
		return false;
	if (bRemove) {
		if (elmLayer.removeEventListener) {
			elmLayer.removeEventListener(strEvent, eval(strFunction), false);
		} else if (elmLayer.detachEvent) {
			elmLayer.detachEvent("on" + strEvent, eval(strFunction));
		}
	}
	else {
		if (elmLayer.addEventListener) {
			elmLayer.addEventListener(strEvent, eval(strFunction), false);
		} else if (elmLayer.attachEvent) {
			elmLayer.attachEvent("on" + strEvent, eval(strFunction));
		} else { // For browsers that don't have any of the addEventListener or attachEvent methods, we create a attachEvent method (NN4.x and IE 5.x on Mac)
			if (!eval("elmLayer.addedEventFunctions_" + strEvent))
				eval("elmLayer.addedEventFunctions_" + strEvent + " = ''");
			eval("elmLayer.addedEventFunctions_" + strEvent + " += '" + strFunction + "(); '");
			eval("elmLayer.on" + strEvent + " = new Function('" + eval("elmLayer.addedEventFunctions_" + strEvent) + "')");
		}
	}
}

hoob.getEventCoords = function(evt){
	if (hoob.ie)
		return { x:window.event.clientX, y:window.event.clientY };
	else if (hoob.w3c)
		return { x:evt.clientX, y:evt.clientY };
}

hoob.getEventSrc = function(evt) {
	if (hoob.ie)
		return evt.srcElement;
	else if (hoob.w3c)
		return evt.target;
}

hoob.getDocScroll = function() {
	if (typeof window.pageXOffset != "undefined")
		return {x:window.pageXOffset, y:window.pageYOffset}
	else if (typeof window.scrollX != "undefined")
		return {x:window.scrollX, y:window.scrollY};
	else if (hoob.ie) {
		if (document.compatMode && document.compatMode == "CSS1Compat")
			return {x:document.body.parentNode.scrollLeft, y:document.body.parentNode.scrollTop};
		else
			return {x:document.body.scrollLeft, y:document.body.scrollTop};
	}
	return {x:0, y:0};
}

hoob.elementGetElementsById = function (strName, strTagName, elmLayer) {
	strTagName = strTagName || "*";
	elmLayer = elmLayer || document;
	var arAllElements = elmLayer.getElementsByTagName(strTagName);
	var arElements = [];
	for (var i=0; i<arAllElements.length; i++) {
		if (arAllElements[i].id == strName)
			arElements[arElements.length] = arAllElements[i];
	}
	return arElements.slice(0);
}

hoob.getQS = function(strWhich) {
	var re = new RegExp( "[&\?]"+strWhich+"=([^&]*)&?", "i" );
	re.exec(window.location.href);
	return RegExp.$1;
}


// ---------------- XML --------------------------------------------------------------------------

hoob.arXmlObjects = [];
hoob.arXmlOnloadFunctions = [];

hoob.createXmlObj = function(sXml, fOnLoad) {
	if (typeof sXml != "string")
		return sXml;
	var xml;
	if (window.ActiveXObject) {
		xml = new ActiveXObject("MSXML.DOMDocument");
		try {
			xml.setProperty("SelectionLanguage", "XPath");
		}
		catch(e) {}
	}
	else if (window.XMLHttpRequest) {
		xml = new XMLHttpRequest();
	}
	else
		return null;
	xml.async = true;
	hoob.arXmlObjects.push(xml);
	hoob.arXmlOnloadFunctions.push(fOnLoad);
	
	if (!sXml || sXml == "" || sXml.charAt(0) == "<") {
		if (window.ActiveXObject) { // IE
			xml.loadXML(sXml);
		}
		else if (window.DOMParser) { // Mozilla or Safari >= 2.0
			var oParser = new DOMParser();
			xml = oParser.parseFromString(sXml, "application/xml");
		}
		else if (window.XMLHttpRequest) { // Workaround for Safari < 2.0
			var sUrl = "data:text/xml;charset=utf-8," + encodeURIComponent(sXml);
			var req = new XMLHttpRequest();
			req.open("GET", sUrl);
			req.send(null);
			xml = req.responseXML;
		}
	}
	else {
		xml.onreadystatechange = new Function("hoob.onReadyStateChange_xmlObj(" + (hoob.arXmlObjects.length-1) + ")");
		if (window.ActiveXObject) {
			try {
				xml.load(sXml);
			}
			catch(e) {
				return null;
			}
		}
		else {
			xml.open("GET", sXml);
			xml.send("");
		}
	}
	return xml;
}

hoob.onReadyStateChange_xmlObj = function(iXmlObj) {
	var oXml = hoob.arXmlObjects[iXmlObj];
	if (oXml.readyState == 4 && hoob.arXmlOnloadFunctions[iXmlObj]) {
		var oRealXml = window.ActiveXObject ? oXml : oXml.responseXML;
		hoob.arXmlOnloadFunctions[iXmlObj](oRealXml);
	}
}

hoob.serializeXml = function(xmlNode) {
	var sXml;
	if (window.XMLSerializer) {
		// Gecko-based browsers, Safari, Opera.
		var oSerializer = new XMLSerializer();
		if (xmlNode)
			sXml = oSerializer.serializeToString(xmlNode);
	}
	else if (window.ActiveXObject)
		sXml = xmlNode.xml;
  return sXml;
}



String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };
