﻿var ajaxWaitingList = [];
var requestingContainers = [];
var requestProcessing = false;
var processing = 0;
var serviceWaitingList = [];
var serviceProcessing = false;

function processRequests()
{
	
	requestProcessing = true;
	
	if(ajaxWaitingList.length == 0)
	{
		requestProcessing = false;
		return;
	}
		
	request = ajaxWaitingList.shift();
	
	$.ajax({	context: request,
		   		global : false,
		   		beforeSend : function() { processing++; SetLoading(this); },
				data : request[1],
				error : function(obj, stat) { RequestError(request, stat); },
				success : function(data) { RequestSuccess(this, data); if(this[0] == "cRealContent" && historyRequest(this, data)) UpdateRCHistory(this)},
				url : 'request.php',
				type : request[2].toString(),
				complete : function() { UnSetLoading(this); processing--; processRequests();}
		   });
	
	if(processing < 6)
		setTimeout("processRequests();", 300);
}


function SetLoading(containerID)
{
	var cont = $('#' + containerID);
	
	cont.fadeTo("fast", 0.5);
	if(cont.width() > 50 && cont.height() > 50 && $("#" + containerID + "_loading", cont).length == 0)
	{
		loading = $("<img src='images/loading.gif' style='position:absolute;cursor:pointer' title='إلغاء' onclick=\"UnSetLoading('" + containerID + "')\" />").attr('id', containerID + "_loading").offset({top:(cont.offset().top + cont.height() / 2), left: (cont.offset().left + cont.width() / 2)});
		cont.prepend(loading);
	}
}


function UnSetLoading(req)
{
	if(req[0] in requestingContainers && CompareRequests(req, requestingContainers[req[0]]))
		delete(requestingContainers[req[0]]);
	
	cont = $('#' + req[0]);
	
	$("#" + req[0] + "_loading", cont).remove();
	
	cont.fadeTo("slow", 1, function() {$('#' + req[0]).css('opacity', 1); });
}


function RequestError(request, stat)
{
	
}


function RequestSuccess(req, data)
{
	if(req[0] in requestingContainers)
		$('#' + req[0]).fadeTo("fast", 0, function() { $(this).html(data); });
}

function addRequest(containerID, parameters, type)
{
	if(containerID == "")
		return;
	
	if(containerID in requestingContainers)
		return;
	
	if(typeof(parameters) == "object")
	{
		pars = "";
		for(k in parameters)
			pars += k + "=" + encodeURI(parameters[k]) + "&";
			
		parameters = pars;
	}
	
	if(parameters.indexOf("containerID=") < 0)
		parameters = "containerID=" + containerID + "&" + parameters;
	
	if(typeof(type) != "string")
		type = "GET";
	
	req = [containerID, parameters, type];
	requestingContainers[containerID] = req, 
	ajaxWaitingList.push(req);
	
	if(!requestProcessing)
		setTimeout("processRequests();", 300);
}

function historyRequest(request, response)
{
	if(request == null || request[0] != "cRealContent")
		return false;
	
	if($("noHistory", $(response)).length > 0)
		return false;
	
	par = (typeof(request[1]) == "string")? request[1] : $.param(request[1]);
	
	if(request[2].toLowerCase() == "post")
		return false;
		
	return true;
}

function CompareRequests(req1, req2)
{
	if(req1 == req2)
		return true;
	if(req1 == null || req2 == null)
		return false;
	
	if(req1[0] != req2[0])
		return false;
		
	par1 = (typeof(req1[1]) == "string")? req1[1] : $.param(req1[1]);
	par2 = (typeof(req2[1]) == "string")? req2[1] : $.param(req2[1]);
	
	if(par1 != par2)
		return false;
	
	if(req1[1] != req2[1])
		return false;
	
	if(req1[2] != req2[2])
		return false;
	
	return true;
}

function callService(serviceID, params, callBack)
{
	if(typeof(serviceID) == "undefined")
		return;
	
	if(typeof(params) == "object")
	{
		pars = "";
		for(k in params)
			pars += k + "=" + encodeURI(params[k]) + "&";
			
		params = pars;
	}
	
	if(params.indexOf("serviceID=") < 0)
		params = "serviceID=" + serviceID + "&" + params;
	
	serviceWaitingList.push([serviceID, params, callBack]);
	
	if(!serviceProcessing)
		processServices();
}

function processServices()
{
	if(serviceProcessing)
		return;
	
	if(serviceWaitingList.length == 0)
		return;
		
	serviceCall = serviceWaitingList.pop();
	
	serviceProcessing = true;
	
	$.ajax({
				context: serviceCall,
		   		global : false,
				data : serviceCall[1],
				error : function(obj, stat) { ServiceError(this, stat); },
				success : function(data) { if(typeof(this[2]) == "function") this[2](data); },
				url : 'service.php',
				type : "POST",
				dataType : "xml",
				complete : function() { serviceProcessing = false; processServices();}
			});
}

function ServiceError(x, s)
{
	alert(s);
}
