var REQUEST_DEFAULT_METHOD = "POST";

var globalEval = function globalEval(src) {
    if (window.execScript) {
        window.execScript(src);
        return;
    }
    var fn = function() {
        window.eval.call(window,src);
    };
    fn();
};

function getEl(elementId){
	return document.getElementById(elementId);
};

function jumpToAnchor(anchor) {
	window.location = String(window.location).replace(/\#.*$/, "") + anchor;
};

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [ curleft, curtop ];
};

function showBubble(bubbleId, referenceId, offsetX, offsetY) {
	myRef = getEl(referenceId);
	myBubble = getEl(bubbleId);
	refPos = findPos(myRef);
	myBubble.style.left = refPos[0] + offsetX + "px";
	myBubble.style.top = refPos[1] + offsetY + "px";
	myBubble.style.visibility = 'visible';
};

function hideModalBubble(bubbleId) {
	var myBubble = getEl(bubbleId);
	if (typeof document.getElementById('disablingDiv') != 'undefined' &&
		document.getElementById('disablingDiv') != null) {
		document.getElementById('disablingDiv').style.display = 'none';
	}
	myBubble.style.display = 'none';
};

function showModalBubble(bubbleId, referenceId, offsetX, offsetY) {
	if (typeof document.getElementById('disablingDiv') != 'undefined' &&
		document.getElementById('disablingDiv') != null) {
		var h = document.body.offsetHeight;
		var w = document.body.offsetWidth;
		document.getElementById('disablingDiv').style.height = h+"px";
		document.getElementById('disablingDiv').style.width = w+"px";
		document.getElementById('disablingDiv').style.display = 'block';
	}
	var myRef = getEl(referenceId);
	var myBubble = getEl(bubbleId);
	var refPos = findPos(myRef);
	myBubble.style.left = refPos[0] + offsetX + "px";
	myBubble.style.top = refPos[1] + offsetY + "px";
	myBubble.style.display = '';
};

function hideBubble(bubbleId) {
	myBubble = getEl(bubbleId);
	myBubble.style.visibility = 'hidden';
};

function trim(str) {
	str = str.replace(/^\s+/, '');
	for ( var i = str.length - 1; i >= 0; i--) {
		if (/\S/.test(str.charAt(i))) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return str;
};

function setElementValue(param, value) {
	if(getEl(param) != null)
		getEl(param).value = value;
};

function addOption(selectId, text, value) {
	var optn = document.createElement("OPTION");
	optn.text = text;
	optn.value = value;
	getEl(selectId).options.add(optn);
};

function clearError(field) {
	var errorElem = getEl(field+"_error");
	if (errorElem != null) {
		errorElem.style.display='none';
		errorElem.innerHTML = '';
	}
};

function CallbackObject(requestURL) {
	this.url = requestURL;
	this.responseXML = null;
	this.responseText = null;
};

function AsyncRequest(requestURL, method, encodeParams) {
	function getXMLRequest() {
		if(typeof ActiveXObject != 'undefined') {
			try {
				return new ActiveXObject("Msxml2.XMLHTTP");}
			catch (e) {
				try {
					return new ActiveXObject("Microsoft.XMLHTTP");}
				catch (e2) {
					if (window.XMLHttpRequest) {
						return new XMLHttpRequest();
					} else {
						return null;
					}
				}
			}
		} else if (window.XMLHttpRequest) {
			try {
				return new XMLHttpRequest();}
			catch (e) {
				return null;
			}
		} else {
			return null;
		}
	}

	function appendParameters(url, parameters, encode) {
		var completeURL = url;
		if (parameters != undefined && parameters != null) {
			if (completeURL.charAt(completeURL.length - 1) != '?') {
				if (completeURL.indexOf('?') >= 0)
					completeURL += '&';
				else
					completeURL += '?';
			}
			completeURL += createParameterString(parameters, encode);
		}
		return completeURL;
	}

	function createParameterString(parameters,encode) {
		var completeParams = '';
		if (parameters != undefined && parameters != null) {
			for ( var i in parameters) {
				if (encode != undefined && encode != null && encode) {
					completeParams += i.replace(/\+/g, '%2B') + '=' + parameters[i].replace(/\+/g, '%2B') + '&';
				} else {
					completeParams += i + '=' + parameters[i] + '&';
				}
			}
			if (completeParams.charAt(completeParams.length - 1) == '&')
				completeParams = completeParams.substring(0, completeParams.length - 1);
		}
		return completeParams;
	}

	var that = this;

	this.url = requestURL;
	if (encodeParams == undefined || encodeParams == null)
		this.encode = false;
	else 
		this.encode = encodeParams;
	if (method == undefined || method == null)
		this.method = REQUEST_DEFAULT_METHOD;
	else
		this.method = method;
	this.requestObj = getXMLRequest();
	this.callback = function() {
	};
	this.parameters = new Object();

	this.submit = function(callbackFunction) {
		that.callback = callbackFunction;
		var thisObj = that;
		var theRequest = that.requestObj;
		theRequest.onreadystatechange = function() {
			thisObj.callbackHandler(thisObj);
		};
		if (that.method != 'GET') {
			var paramString = createParameterString(that.parameters, that.encode);
			theRequest.open('POST', that.url, that);
			theRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			theRequest.setRequestHeader("Content-length", paramString.length);
			theRequest.setRequestHeader("Connection", "close");
			that.requestObj.send(paramString);
		} else {
			var completeURL = appendParameters(that.url, that.parameters, that.encode);
			theRequest.open('GET', completeURL, that);
			theRequest.send(null);
		}
	};

	this.callbackHandler = function() {
		if (that.requestObj.readyState == 4) {
			var callbackObj = new CallbackObject(that.url);
			try {
				callbackObj.responseXML = that.requestObj.responseXML.documentElement;
			} catch (e) {
			}
			callbackObj.responseText = that.requestObj.responseText;
			that.callback(callbackObj);
		}
	};

};
