AjaxEngine=Class.create();
AjaxEngine.prototype = {
	initialize: function() {
		this.ajaxElements=new Array();
		this.ajaxObjects=new Array();
		this.requestURLS=new Array();
		this.options={};
	},

	registerAjaxElement: function(anId,anElement) {
		if (!anElement) anElement=$(anId);
		this.ajaxElements[anId]=anElement;
	},

	registerAjaxObject: function(anId,anObject) {
		this.ajaxObjects[anId]=anObject;
	},

	registerRequest: function (requestLogicalName,requestURL) {
		this.requestURLS[requestLogicalName]=requestURL;
	},

	sendRequest: function(requestName,options) {
		if (arguments.length>=2)
			if (typeof arguments[1]=='string')
				options={parameters: this._createQueryString(arguments,1)};
		this.sendRequestWithData(requestName,null,options);
	},

	sendRequestWithData: function(requestName,xmlDocument,options) {
		var requestURL=this.requestURLS[requestName];
		if (requestURL==null) return;

		if (arguments.length>=3)
			if (typeof arguments[2]=='string')
				options.parameters=this._createQueryString(arguments,2);

		$('icon_wait').style.top=Prototype._mouse[1]+'px';
		$('icon_wait').style.left=Prototype._mouse[0]+'px';
		$('icon_wait').style.display='block';
		new Ajax.Request(requestURL,this._requestOptions(options,xmlDocument));
	},

	_requestOptions: function(options,xmlDoc) {
		var requestHeaders=null;
		var sendMethod='post';
		if (xmlDoc==null)
				sendMethod='get';
		(!options) ? options = {} : '';

		if (!options._BasisOptionsProcessed){
			if (options.onComplete) options.onBasisComplete=options.onComplete;
			if (options.overrideOnComplete)
				options.onComplete=options.overrideOnComplete;
			else
				options.onComplete=this._onRequestComplete.bind(this);
				options._BasisOptionsProcessed = true;
		}

		this.options={
			requestHeaders: requestHeaders,
			parameters:     options.parameters,
			postBody:       xmlDoc,
			method:         sendMethod,
			onComplete:     options.onComplete
		};
		Object.extend(this.options,options);
		return this.options;
	},

	_createQueryString: function(theArgs,offset) {
		var queryString="";
		for (var i=offset;i<theArgs.length;i++) {
			if (i!=offset) queryString+="&";
			var anArg=theArgs[i];

			if (anArg.name!=undefined && anArg.value!=undefined) {
				queryString+=anArg.name+"="+escape(anArg.value);
			} else {
				var ePos=anArg.indexOf('=');
				var argName=anArg.substring(0,ePos);
				var argValue=anArg.substring(ePos+1);
				queryString+=argName+"="+escape(argValue);
			}
		}
		return queryString;
	},

	_onRequestComplete: function(request) {
		$('icon_wait').style.display='none';
		if(!request) return;
		if (request.status!=200) return;

		var response=request.responseXML.getElementsByTagName("ajax-response");
		if (response==null || response.length!=1) return;
		this._processAjaxResponse(response[0].childNodes);
      
		var onBasisComplete=this.options.onBasisComplete;
		if (onBasisComplete!=null) onBasisComplete();
	},

	_processAjaxResponse: function(xmlResponseElements) {
		for (var i=0;i<xmlResponseElements.length;i++) {
			var responseElement=xmlResponseElements[i];

			if (responseElement.nodeType!=1) continue;

			var responseType=responseElement.getAttribute("type");
			var responseId=responseElement.getAttribute("id");

			if (responseType=="object")
				this._processAjaxObjectUpdate(this.ajaxObjects[responseId],responseElement);
			else if (responseType=="element")
				this._processAjaxElementUpdate(this.ajaxElements[responseId],responseElement);
			else
				alert('unrecognized AjaxResponse type : '+responseType);
		}
	},

	_processAjaxObjectUpdate: function(ajaxObject,responseElement) {
		ajaxObject.ajaxUpdate(responseElement);
	}
}
var ajaxEngine=new AjaxEngine();
document.onmousemove=function(e) {
	if (!isMSIE) {
		Prototype._mouse[0]=e.pageX;
		Prototype._mouse[1]=e.pageY;
	} else {
		Prototype._mouse[0]=(event.clientX+(document.documentElement.scrollLeft || document.body.scrollLeft));
		Prototype._mouse[1]=(event.clientY+(document.documentElement.scrollTop || document.body.scrollTop));
	}
}