//Define sub-objects in the Webclient object.

var WebClient={
	AsyncHTTP:Object,
	DOM:Object,
	GenFunc:Object
}

// Global configurationvariables.
var gsClassName = "WebPage.WebClient";
var gsErrors = "";
var goXMLHttpFactories = [
	function() {return new XMLHttpRequest()},
	function() {return new ActiveXObject("Msxml2.XMLHTTP")},
	function() {return new ActiveXObject("Msxml3.XMLHTTP")},
	function() {return new ActiveXObject("Microsoft.XMLHTTP")}
];

// Functions to manage asynchronous http-requests.
WebClient.AsyncHTTP = function(asCalledFrom) {
	//ClassHeader
	var lsClassName = "AsyncHTTP";
	var lsCalledFrom;
	if(asCalledFrom != null) {lsCalledFrom = asCalledFrom;}else{lsCalledFrom = gsClassName;}
	var lsClassPath = lsCalledFrom + '.' + lsClassName;
	var loDOM = new WebClient.DOM(lsClassPath);
	var loGenFunc = new WebClient.GenFunc(lsClassPath);
	//End ClassHeader
	
	this.httpRequest = function(asURL, asParameters, aoCallbackHandler) { // Performs a HttpGet-request on asURL and returns HTTPXML-object.		
		//Create XMLHTTP-object using object-detection
		var loXMLHTTP;
		for (var i=0;i<goXMLHttpFactories.length;i++) {
			try {
				loXMLHTTP = goXMLHttpFactories[i]();
			}
			catch (e) {
				continue;
			}
			break;
		}
		
		if (!loXMLHTTP) {
			loGenFunc.handleError(lsClassPath,'httpRequest()','error','Cannot create XMLHTTP instance.');
			aoCallbackHandler();
		}
		else {
			loXMLHTTP.onreadystatechange = function() {
				if (loXMLHTTP.readyState == 4||loXMLHTTP.readyState=="complete") {
					try {
						if (loXMLHTTP.status != 200 && loXMLHTTP.status != 304) {
							loGenFunc.handleError(lsClassPath,'httpRequest()','error',loXMLHTTP.status + ' http-status returned by URL: ' + asURL + '.');
						}
					} catch (e) {}
				aoCallbackHandler(loXMLHTTP);
				}
			}
            // after the example in: http://www.captain.at/howto-ajax-form-post-request.php
			loXMLHTTP.open('POST', asURL, true);
			loXMLHTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			loXMLHTTP.setRequestHeader("Content-length", asParameters.length);
			loXMLHTTP.setRequestHeader("Connection", "close");
			loXMLHTTP.send(asParameters);
		}
	}
}

// Functions to transform the client-document using the Document  Object Model.
WebClient.DOM = function(asCalledFrom) {
	//ClassHeader
	var lsClassName = "DOM";
	var lsCalledFrom;
	if(asCalledFrom != null) {lsCalledFrom = asCalledFrom;}else{lsCalledFrom = gsClassName;}
	var lsClassPath = lsCalledFrom + '.' + lsClassName;
	var loGenFunc = new WebClient.GenFunc(lsClassPath);
	//End ClassHeader
	
	this.setFocus = function(asObjectID) { //Sets focus to asObjectID
		try {
			document.getElementById(asObjectID).focus();
		} catch (e) {
			loGenFunc.handleError(lsClassPath,'setFocus()','warning',e.description + ' (ElementID: ' + asObjectID + ')');
		}
	}
	
	this.hideElement = function(asObjectID) { //Hides an element
		try {
			document.getElementById(asObjectID).style.display="none";
		} catch (e) {
			loGenFunc.handleError(lsClassPath,'hideElement()','warning',e.description + ' (ElementID: ' + asObjectID + ')');
		}
	}
	
	this.unHideElement = function(asObjectID, asType) { //Unhides element
		var lsType = asType;
		if (!lsType) {lsType="block"}
		try {
			document.getElementById(asObjectID).style.display=lsType;
		} catch (e) {
			loGenFunc.handleError(lsClassPath,'unHideElement()','error',e.description + ' (ElementID: ' + asObjectID + ', Type: ' + lsType + ')');
		}
	}
	
	this.setInnerHTML = function(asObjectID, asNewHTML) { // Sets value asNewHTML as HTML-content in element asObjectID.
		try {
			var loElement = document.getElementById(asObjectID);
			loElement.innerHTML = asNewHTML;
		} catch (e) {
			loGenFunc.handleError(lsClassPath,'setInnerHTML()','error',e.description + ' (ElementID: ' + asObjectID + ', NewHTML: ' + asNewHTML + ')');
		}
		return false;
	}
	
	this.setInnerHTMLMulti = function(aarrObjectID, aoNewHTML) { // Sets value(s) asNewHTML as HTML-content in array aarrObjectID.
		var i,loElement,lsValue;
		var lbIsArray = loGenFunc.isArray(aoNewHTML);
		for (i=0;i<aarrObjectID.length;i++) {
			if (lbIsArray == true) {
				lsValue = aoNewHTML[i];
			}
			else {
				lsValue = aoNewHTML;
			}
			try {
				loElement = document.getElementById(aarrObjectID[i]);
				loElement.innerHTML = lsValue;
			} catch (e) {
				loGenFunc.handleError(lsClassPath,'setInnerHTMLMulti()','error',e.description + ' (ElementID: ' + aarrObjectID[i] + ', NewHTML: ' + lsValue + ')');
			}
		}
		return false;
	}
	
	this.setInnerText = function(asObjectID, asNewText) { // Sets value asNewText as TextContent in element asObjectID.
		try {
			var loElement = document.getElementById(asObjectID);
			if (loElement.innerText) {
				loElement.innerText = asNewText;
			}
			else {
				loElement.textContent = asNewText;
			}
		} catch (e) {
			loGenFunc.handleError(lsClassPath,'setInnerText()','error',e.description + ' (ElementID: ' + asObjectID + ', NewText: ' + asNewText + ')');
		}
		return false;
	}
	
	this.setInnerTextMulti = function(aarrObjectID, aoNewText) { // Sets value(s) aoNewText as TextContent in array aarrObjectID.
		var i,loElement,lsValue;
		var lbIsArray = loGenFunc.isArray(aoNewHTML);
		for (i=0;i<aarrObjectID.length;i++) {
			if (lbIsArray == true) {
				lsValue = aoNewHTML[i];
			}
			else {
				lsValue = aoNewHTML;
			}
			try {
				loElement = document.getElementById(aarrObjectID[i]);
				if (loElement.innerText) {
					loElement.innerText = lsValue;
				}
				else {
					loElement.textContent = lsValue;
				}
			} catch (e) {
				loGenFunc.handleError(lsClassPath,'setInnerTextMulti()','error',e.description + ' (ElementID: ' + aarrObjectID[i] + ', NewHTML: ' + lsValue + ')');
			}
		}
		return false;
	}
	
	this.findPos = function(aoObj) {
		var curleft = curtop = 0;
		if (aoObj.offsetParent) {
			curleft = aoObj.offsetLeft
			curtop = aoObj.offsetTop
			while (aoObj = aoObj.offsetParent) {
				curleft += aoObj.offsetLeft
				curtop += aoObj.offsetTop
			}
		}
		return [curleft,curtop];
	}
}

// General Functions, including ErrorHandling.
WebClient.GenFunc = function(asCalledFrom) {
	//ClassHeader
	var lsClassName = "GenFunc";
	var lsCalledFrom;
	if(asCalledFrom != null) {lsCalledFrom = asCalledFrom;}else{lsCalledFrom = gsClassName;}
	var lsClassPath = lsCalledFrom + '.' + lsClassName;
	//End ClassHeader

	this.Errors = gsErrors;
	
	this.handleError = function(asClass, asFunction, asType, asErrorMessage) { // Creates errormessage and sends it to the server by placing a pixel-tag.
		var lsError = '[' + asClass + '.' + asFunction + '] ' + asErrorMessage;
		gsErrors = gsErrors + lsError;
		//try {
		//	var loElement = document.getElementById("Errors");
		//	var loValue = '<img src="/webservices/errorhandling/eventtolog.aspx?app=' + this.urlEncode(asClass + '.' + asFunction) + '&type=' + asType + '&msg=' + this.urlEncode(this.Left(asErrorMessage,500)) + '&page=' + window.location + '" id="errorImg" width="0" />';
		//	loElement.innerHTML = loValue;
		//} catch (e) {}
	}
	
	this.urlEncode = function(asInput) { // To urlencode asInput into UTF-8; encodeURI reserved characters
		var lsHex = "0123456789ABCDEF";		
		var utftext = "";
		var liCode;

		asInput = asInput.replace(/\r\n/g,"\n");

		for (var n = 0; n < asInput.length; n++) {
			var c = asInput.charCodeAt(n);
			if (c < 128) {
				utftext += encodeURIComponent(asInput.charAt(n));
			}
			else if ((c > 127) && (c < 2048)) {
				liCode = String.fromCharCode((c >> 6) | 192).charCodeAt(0);
				utftext += "%" + lsHex.charAt((liCode >> 4) & 0xF) + lsHex.charAt(liCode & 0xF);
				liCode = String.fromCharCode((c & 63) | 128).charCodeAt(0);
				utftext += "%" + lsHex.charAt((liCode >> 4) & 0xF)+ lsHex.charAt(liCode & 0xF);
			}
			else {
				liCode = String.fromCharCode((c >> 12) | 224).charCodeAt(0);
				utftext += "%" + lsHex.charAt((liCode >> 4) & 0xF) + lsHex.charAt(liCode & 0xF);
				liCode = String.fromCharCode(((c >> 6) & 63) | 128).charCodeAt(0);
				utftext += "%" + lsHex.charAt((liCode  >> 4) & 0xF) + lsHex.charAt(liCode & 0xF);
				liCode = String.fromCharCode((c & 63) | 128).charCodeAt(0);
				utftext += "%" + lsHex.charAt((liCode >> 4) & 0xF) + lsHex.charAt(liCode & 0xF);
			}
		}
		return utftext;
	}
	
	this.isArray = function(aoInput){
		var lbArray = false;
		if (aoInput) {
			if (typeof aoInput == 'object' || typeof aoInput == 'function') {
				if (aoInput.constructor == Array) {
					lbArray = true;
				}
			}
		}
		return lbArray;
	}
	
	this.existsInArray = function(aoarrSourceArray, aoSearchField) {
		var lbExists = false;
		for (var i=0; i<aoarrSourceArray.length; i++){
			if (aoarrSourceArray[i] == aoSearchField){
				lbExists = true;
			}
		}
		return lbExists;
	}
	
	this.makePostString = function(aarrFields) {
		var i,i2,loElement;
		var lsOutput = "";
		for (i=0;i<aarrFields.length;i++) {
			try {
				loElement = document.getElementById(aarrFields[i]);
				if (loElement == null || loElement.type == "radio") {
					loElement = document.getElementsByName(aarrFields[i]);
					for (i2=0;i2<loElement.length;i2++) {
						if (loElement[i2].checked == true){
							lsOutput += aarrFields[i] + "=" + this.urlEncode(loElement[i2].value) + "&";
							break;
						}
					}
				}
				else if(loElement.type == "checkbox") {
					if (loElement.checked){
						lsOutput += aarrFields[i] + "=true&";
					}
				} 				
				else {
					lsOutput += aarrFields[i] + "=" + this.urlEncode(loElement.value) + "&";
				}
			} catch (e) {
				lsOutput += aarrFields[i]+'=notfound&';
			}
		}
		return lsOutput + Math.random();
	}
	
	this.Left = function(asInput, aiLen) {
		if (aiLen <= 0) {
			return "";
		}
		else if (aiLen > String(asInput).length) {
			return asInput;
		}
		else {
			return String(asInput).substring(0,aiLen);
		}
	}
	
	this.addCustomEvent = function(aoObj,asType,asFuncName) {
		if (aoObj.addEventListener) {
			aoObj.addEventListener(asType,asFuncName,false);
		}
		else if (aoObj.attachEvent) {
			aoObj.attachEvent("on"+asType,asFuncName);
		}
	}
}

//Create objects
var goAsyncHTTP = new WebClient.AsyncHTTP();
var goDOM = new WebClient.DOM();
var goGENFUNC = new WebClient.GenFunc();