var ajaxapp = Class.create( {
			initialize: function() {

			},
			indicator : 'ajaxLoadingBox',
			debug	: 'false',
			requestCounter : 0,
			responseValue : {},
			msgContainer : 'msgContainer',
			callback : function(theAction, func, params, onComplete, url) {	
				
				var param = new Hash();
				var request_method = 'post'; // Alway use post
			
				if (document.forms[params]) {
					param = $H($(params).serialize(true));
				} else {
					if (Object.isHash(params)) {
						param = param.update(params);
					} else {
						param = new Hash();
					}
				}
				param = param.merge({ajaxapp: theAction});
				uri = window.location.href;
				if (ajaxapp.debug) ajaxapp.debug("Action (to be handled in callback):\n\n" + theAction);
				uri = (url.length > 0 ) ? url : uri
				if (ajaxapp.debug) ajaxapp.debug("Params passed to xhr:\n\n" + params.toJSON());
				new Ajax.Request(uri,{
					method: request_method,
					parameters: param.toQueryString(),
					requestHeaders: {accept: 'application/json'},
					onSuccess: function(transport) {
						//dbug(transport.responseText)
						if (transport.getHeader('Location') != null && transport.getHeader('Location') != uri){
							window.location = eval(transport.getHeader('Location'))
							return;
						}
						if (ajaxapp.debug) ajaxapp.debug("Response on callback:\n\n" + transport.responseText);
						if (transport.responseText.startsWith('{ "root":')){
							responseValue = transport.responseText.evalJSON(true)
							if (func) func(responseValue.root);
							if (responseValue.root.ajaxmsg) ajaxapp.showMessage(responseValue.root.ajaxmsg);
						} else {
							if (func) {
								func(transport.responseText);

							}else{
								ajaxapp.debug("callback function not found:\n\n" + transport.responseText);
							}
						}
					},
					onFailure: ajaxapp.callbackFailure,
					onComplete: onComplete,
					on302 : function(transport){
						alert('An error has occured, please try again by simply refreshing this page.')
					},
					on500 : function(transport){
						alert('An error has occured, please try again by simply refreshing this page.')
					}
				}); 
			},
			showMessage : function(inMsg){
				$(ajaxapp.msgContainer).update(inMsg.msgtext);
			},
			callbackFailure : function(transport) {
				alert("failed")
				friendlyMsg = transport.responseText;
				friendlyMsg = friendlyMsg.replace(new RegExp("(<head[\\s\\S]*?</head>)|(<script[\\s\\S]*?</script>)", "gi"), "");
				friendlyMsg = friendlyMsg.stripTags();
				friendlyMsg = friendlyMsg.replace(new RegExp("[\\s]+", "gi"), " ");
				alert(friendlyMsg);
			},
			debug : function(msg){
				alert("<DEBUG MESSAGE>\n\n" + msg);
			}
	});
	
	