
if ( !ajaxObjects )
{
	var ajaxCalls = {};
	var ajaxObjects = {};
}

function OnSlowUpdateDim( containerId )
{
	$( "#" + containerId ).fadeTo('fast',0.45);
}

function ServerCallComplete( ajaxCallId, data )
{
	if ( ajaxCalls[ ajaxCallId ].onSuccess )
	{
		ajaxCalls[ ajaxCallId ].onSuccess( ajaxCallId, data );
	}
}

function ServerCall( ajaxCallId, params )
{
	var ajaxCall = ajaxCalls[ ajaxCallId ];

	if ( ajaxCall.handler )
	{
		ajaxCall.handler.abort();
	}

	if ( ajaxCall.millisecondDelay > 0 )
	{
		if ( ajaxCall.delayTimer )
		{
			clearTimeout( ajaxCall.delayTimer );
		}

		ajaxCall.delayTimer = setTimeout( ExecuteServerCall, ajaxCall.millisecondDelay, ajaxCall, params );
	}
	else
	{
		ExecuteServerCall( ajaxCall, params );
	}
}

function ExecuteServerCall( ajaxCall, params )
{
	clearTimeout( ajaxCall.timer );

	if ( ajaxCall.containerId != "" )
	{
		ajaxCall.timer = setTimeout( "OnSlowUpdateDim( '" + ajaxCall.containerId + "' )", 200 );
	}

	var extraData = "";

	if ( ajaxCall.jsonPassThrough )
	{
		extraData = "param0=" + $.toJSON( params );
	}
	else
	{
		var p = 0;

		if ( params )
		{
			for( var x = 0; x < params.length; x++ )
			{
				extraData += "param" + p + "=" + params[x] + "&";
				p++;
			}
		}

	    for( var x = 0; x < ajaxCall.params.length; x++ )
		{
			extraData += "param" + p + "=" + ajaxCall.params[x] + "&";
			p++;
		}

		for( var x = 0; x < ajaxCall.jsVariables.length; x++ )
		{
			extraData += "param" + p + "=" + eval( ajaxCall.jsVariables[x] ) + "&";
			p++;
		}

		extraData += $("input,select,textarea").serialize();
	}

	var countOfCalls = 0;

    for ( var i in ajaxCalls )
    {
    	countOfCalls = Math.max( countOfCalls, i );
	}

	var countOfObjects = 0;

    for ( var i in ajaxObjects )
    {
    	countOfObjects = Math.max( countOfObjects, i );
	}

	var ajaxUrl = "/ajax/server-call";
	var inputData = "object-data=" + ajaxObjects[ ajaxCall.objectId ] + "&ct=" + ajaxCall.contentType + "&frm=" + ajaxCall.form + "&f=" + ajaxCall.functionName + "&containerId=" + ajaxCall.containerId + "&ac=" + countOfCalls + "&oc=" + countOfObjects + "&" + extraData;

	ajaxCall.handler = $.post(
		ajaxUrl,
		inputData,
			function( data )
			{
				clearTimeout( ajaxCall.timer );

				if ( ajaxCall.containerId != '' )
				{
					$( "#" + ajaxCall.containerId ).html( data ).fadeTo('fast',1);
				}

				ServerCallComplete( ajaxCall.callId, data );

				if ( ajaxCall.contentType == 'js' )
				{
					eval( data );
				}
			}
		);

	if ( ajaxCall.onBegin )
	{
		ajaxCall.onBegin( ajaxCall.calId );
	}
}
