function AJAX() {
	var t = this;
	var e;
	
	/* Code testing stuff */
	var useMock = false;
	var mockResponse = null;
 
/*
 *	The first line should be used live: www.qruiser.com
 *	The second line should be used on test server: test.qruiser.com
 *	The thirs line is used only in develop environment: dev.qruiser.com
 */
// 	t.logLoc = urlpath+'/?id='+memberId;
	t.rp = urlpath+'/request/';
	t.POST = null;
	t.form = false;
	t.upload = false;
	t.debug = function(str) { };
	t.handleSuccess =	function(o) {
		var d = document;
		/*	Unless a debug callback is specified by user function, this does nothing
			Comment the following line in production environment. */
		 t.debug(o.responseText);

		/*	eval() is slow for large amounts of data. Should not handle more than at most a couple
		 *	of thousand DB rows.
		 *	Uncomment the try and catch parts for production environment.
		 */
			if (t.useMock == true) {
				var response = eval("(" + t.mockResponse + ")");
			}
			else {
				var response = eval("(" + o.responseText + ")");	// create an object from the response
			}
			var data = response.data;							// Actual response data
			var meta = response.meta;							// Response meta data: meta.info and meta.count
	
			// Needs a qruiser spceific log out check setup server side.
			if (meta.status == 'loggedout') {
				showDivPopup(data[0], t.e, meta.close_text, "error", "center");
				if (meta.fullfillRequest)
					t.resultHandler(data, meta);
			}
			else if (meta.status == 'queued') {
				alert(meta.error_text);
			}
			else if (meta.status == 'error') {
				showDivPopup(meta.error_text, t.e, meta.close_text, "error", "event");
				if (t.failureHandler)
					t.failureHandler(data, meta);
			}
			else {
				t.resultHandler(data, meta);
			}
	};
	/*	The upload response is wrapped between pre tags in Safari for some reason:
		<pre[possibly some stuff here]>[upload response]</pre>
	*/
	t.handleUpload = function(o) {
		var str = o.responseText;
		var reStart = /^<pre[^>]*>/gi;
		var reEnd = /<\/pre>$/gi;
		
		str = str.replace(reStart, '');
		str = str.replace(reEnd, '');
		o.responseText = str;
		t.handleSuccess(o);
	};
	t.handleFailure =	function(o) {
							var language = "SE";
							switch (language) {
								case 'UK':
									var e = "Error";
									break;
								default:
									var e = "Fel";
							}
							alert(e);
						};
	t.callback = {
		success:	t.handleSuccess,
		failure:	t.handleFailure,
		upload:		t.handleUpload,
	//	argument:	args,
		scope:		t
	};
	t.startRequest =		function() {
								if (t.form)
									YAHOO.util.Connect.setForm(t.form, t.upload);
								YAHOO.util.Connect.asyncRequest('POST', t.rp, t.callback, t.POST);
							};

	t.setEvent = function(e) {
		if (navigator.userAgent.indexOf("MSIE") > 0) {
			var tmp = {
				clientX:	e.clientX,
				clientY:	e.clientY,
				scrollLeft:	e.scrollLeft,
				scrollTop:	e.scrollTop,
				clientLeft:	e.clientLeft,
				clientTop:	e.clientTop
			};
			t.e = tmp;
		}
		else
			t.e = e;
	};
};

function printAjaxError(e) {
	var d = document;
	var oErrors = d.getElementById('error_texts');
	var oCC = d.getElementById('column_center');

	if (oErrors !== null) 
		oCC.removeChild(oErrors);

	var oP = d.createElement('div');
	oP.style.margin = "0px";
	oP.style.padding = "0px";
	oP.setAttribute("id", 'error_texts');


	var oDiv = d.createElement('div');
	oDiv.className = "errorbox";

	var oImg = d.createElement('img');
	oImg.src = "http://icon.qruiser.com/images/exclamation.gif";
	oImg.width = "7";
	oImg.height = "20";
	oImg.className = "errorboxexclamation";
	oDiv.appendChild(oImg);
	oDiv.innerHTML = oDiv.innerHTML + e;
	oP.appendChild(oDiv);
//	oP.innerHTML = e;
	oCC.insertBefore(oP, oCC.childNodes[0]);
}


 
/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/	
var getElementsByClassName = function (className, tag, elm){
	if (elm == null)
		var elm = document;
	if (elm.getElementsByClassName) {
		var total = elm.getElementsByClassName(className);
		return total;

		getElementsByClassName = function (className, tag, elm) {
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null;
				returnElements = [];
				current;

			for(var i=elements.length-1; i>-1; --i){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};