
xwp.xwpage.plugins.ajax = new function () {
	var self = this;
	
	self.queue = {};

	self.get = function (url, args) {
		self._newRequest(self._mergeArgs(args, {
			url: url,
			method: 'get'
		}));
	};

	self.post = function (url, data, args) {
		self._newRequest(self._mergeArgs(args, {
			url: url,
			method: 'post',
			data: data
		}));
	};

	self.open = function (args) {
		
		if (typeof(args.url) == 'undefined') {
			self.triggerError("open(): url undefined !");
			return false;
		}

		self._newRequest(self._mergeArgs({
			method: 'get'
		}, args));
		
	};
	
	self.internal = function (request, args) {

		if (typeof(args) == 'string')
			args = {
				data: args,
				method: 'post'
			};
			
		self._newRequest(self._mergeArgs({
			url: 'index.php?:=)' + (typeof(xwp.xwpage.conf['session.id']) != 'undefined' ? '&sid=' + xwp.xwpage.conf['session.id'] : '') + '&' + request,
			method: 'get'
		}, args));
	};
	
	self._mergeArgs = function () {
		var k, k1, ret = {};
		
		for (k = 0; k < arguments.length; k++)
			if (typeof(arguments[k]) == 'object')
				for (k1 in arguments[k])
					ret[k1] = arguments[k][k1];

		return ret;
	};
	
	self._newRequest = function (args) {
		
		// Check args
		if (typeof(args) != 'object') {
			self.triggerError("_newRequest(): invalid arguments !");
			return false;
		}
			
		if (typeof(args.id) == 'undefined')
			self._doRequest(args);
		else {
			if (typeof(self.queue[args.id]) == 'undefined')
				self.queue[args.id] = new Array();
			
			args.status = 'queue';
			args.first = self.queue[args.id].length == 0 ? true : false;

			self.queue[args.id].push(args);
			self._nextRequest(args.id);
		}
		
	};
	
	self._nextRequest = function (id) {
		if (self.queue[id].length > 0 && self.queue[id][0].status == 'queue') {
			self.queue[id][0].status = 'parse';
			self._doRequest(self.queue[id][0]);
		}
	};
	
	self._doRequest = function (args) {
		var link = new xwp.xmlhttp();
		
		link.onReceive = function (data) {
			self.doEvent('onReceive', data, args);
			if (args.eval)
				eval(data);
			if (typeof(args.onReceive) == 'function')
				args.onReceive(data, args);
		};
		
		link.onOpen = function () {
			if (typeof(args.id) == 'undefined' || self.queue[args.id][0].first) {
				self.doEvent('onOpen', args);
				if (typeof(args.onOpen) == 'function')
					args.onOpen(args);
			}
		};
		
		link.onDone = function () {
			var e = false;
			
			if (typeof(args.id) == 'undefined')
				e = true;
			else {
				self.queue[args.id].shift();
				if (self.queue[args.id].length == 0)
					e = true;
				else
					self._nextRequest(args.id);
			}
			
			if (e) {
				self.doEvent('onDone', args);
				if (typeof(args.onDone) == 'function')
					args.onDone(args);
			}
			
		};
		
		link.onError = function (status) {
			if (typeof(args.onError) == 'function' && args.onError(status, args) === false)
				self.triggerError("XMLHTTP Error: " + status.code + " " + status.text);
		};
		
		link.open(args.url, args.method, args.data);

	};

};
