var MBAjax = {
	
	transactions: [0],
	
	get: function(sAction,oParams,fnCallback) {
		return MBAjax.action('GET', sAction, oParams, fnCallback);
	},
	
	post: function(sAction,oParams,fnCallback) {
		return MBAjax.action('POST', sAction, oParams, fnCallback);
	},
	
	action: function(sMethod, sAction, oParams, fnCallback) {
		iTransactionId = MBAjax.transactions.length;
		
		MBAjax.transactions[iTransactionId] = new MBAjaxTransaction();
		MBAjax.transactions[iTransactionId].id				= iTransactionId
		MBAjax.transactions[iTransactionId].requestAction	= sAction;
		MBAjax.transactions[iTransactionId].requestParams	= oParams;
		MBAjax.transactions[iTransactionId].callback		= fnCallback;
		
		oReadyParams = MBAjax.prepareParams(oParams);
		
		oReadyParams.action			= sAction;
		oReadyParams.transactionId	= iTransactionId;
		
		sUrl = 'http://'+document.location.hostname+'/ajax.php';
		if (sMethod == 'POST') {
			dDate = new Date;
			sUrl += '?cache='+dDate.getTime();
		}
		
		return $.ajax({
			url			:	sUrl,
			type		:	sMethod,
			data		:	oReadyParams,
			dataType	:	'json',
			success		:	MBAjax.parseResponse
		});
	},
	
	prepareParams: function(oParams) {
		oNewParams = {};
		for (sKey in oParams) {
			if (typeof(oParams[sKey]) == "object") {
				oNewParams[sKey] = "MBAjax__Array";
				iArrayCount = 0;
				for (sSubKey in oParams[sKey]) {
					oNewParams['MBAjax__Array__'+sKey+'__'+iArrayCount] = oParams[sKey][sSubKey];
					iArrayCount++;
				}
				oNewParams['MBAjax__ArrayCount__'+sKey] = iArrayCount;
			} else {
				oNewParams[sKey] = oParams[sKey];
			}
		}
		return oNewParams;
	},
	
	parseResponse: function(oResponse) {
		if (oResponse.transactionId) {
			if (MBAjax.transactions[oResponse.transactionId]) {
				if (MBAjax.transactions[oResponse.transactionId].requestAction == oResponse.action) {
					MBAjax.transactions[oResponse.transactionId].callback(oResponse);
				}
			}
		}
	}
};

var MBAjaxTransaction = function(){
	this.id				= -1;
	this.requestParams	= {};
	this.requestAction	= '';
	this.callback		= function(oResponse){};
};