// LIBRARY MANAGEMENT

jQuery.getScripts = function(scripts, onComplete)
{
	var advanceQueue = function(data, response)
	{
		$('#loadingBox').show();

		var queue = $(document).data('jsPHPInt_LibQueue');
		var scr = queue.shift();

		if(scr != undefined && scr != null)
		{
			$(document).data('jsPHPInt_LibQueue', queue);

			try
			{
				$.getScript(scr, advanceQueue);
			}
			catch(e)
			{
				alert(e);
			}//catch
		}//if script
		else
		{
			$('#loadingBox').hide();
			$(document).data('jsPHPInt_LibQueue', null);
			onComplete();
		}//else over
	};//advanceQueue

	var queue = scripts;
	$(document).data('jsPHPInt_LibQueue', queue);

	advanceQueue();
}//jQuery.getScripts

var setJSPath = function(path)
{
	 $(document).data('jsPHPInt_LibPath', path);
}//setJSPath

var getJSPath = function()
{
	 return $(document).data('jsPHPInt_LibPath');
}//setJSPath

var getLoadedLibs = function()
{
	var loaded = $(document).data('jsPHPInt_Libs');
	if(loaded == undefined)loaded = {};
	return loaded;
}//getLoadedLibs

var setLoadedLibs = function(libs)
{
	var loaded = getLoadedLibs();

	var tl = libs.length;
	for(var l = 0; l < tl; l++)loaded[libs[l]] = 1;

	$(document).data('jsPHPInt_Libs', loaded);
}//setLoadedLibs

var loadLibs = function(libs, callback)
{
	var loaded = getLoadedLibs();

	var load = [];
	var tl = libs.length;
	var path = getJSPath();
	for(var l = 0; l < tl; l++)
	{
		if(loaded[libs[l]] != 1)load.push(path + libs[l] + '.js');
	}//for l

	if(load.length > 0)$.getScripts(load, callback);
		else callback();
}//loadLibs

// AJAX CALLS

var loadJSON = function(url, params, callback, error_callback, mode)
{
	$.ajax({
		url:url,
		data:params,
		type:(mode == undefined)?('GET'):('POST'),
		dataType:'html',
		success:callback,
		error:error_callback
	});
}//loadJSON

var ajaxSetCurAction = function(url, params, mode)
{
	$(document).data('jsPHPInt_curAction', {url:url, params:params, mode:mode});
}//ajaxSetCurAction

var callAction = function(url, params, mode)
{
	var curAction = $(document).data('jsPHPInt_curAction');
	if(curAction == null)
	{
		ajaxSetCurAction(url, params, mode);
		loadJSON(url, params, genericActionReceiver, genericActionError, mode);
	}//if !curAction
	else queueAction(url, params, mode, true);
}//callAction

var getActionQueue = function()
{
	var actionQueue = $(document).data('jsPHPInt_actionQueue');
	if(actionQueue == null)actionQueue = [];
	return actionQueue;
}//getActionQueue

var queueAction = function(url, params, mode)
{
	var actionQueue = $(document).data('jsPHPInt_actionQueue');
	var action = {url:url, params:params, mode:mode};

	getActionQueue().push(action);

	$(document).data('jsPHPInt_actionQueue', actionQueue);
}//ajaxSetCurAction

var advanceActionQueue = function()
{
	if(getActionQueue().length > 0)
	{
		var next_act = getActionQueue().shift();
		callAction(next_act.url, next_act.params, next_act.mode);
	}//if queue
}//advanceActionQueue

var ajaxUnsetCurAction = function()
{
	$(document).data('jsPHPInt_curAction', null);
}//ajaxUnsetCurAction

// RESPONSE PROCESSING

var processCommands = function(cmd)
{
	var func = cmd['func'];
	var jquery = cmd['jq'];

	if(func != undefined)callJSFunctions(func);
	if(jquery != undefined)callJQuery(jquery);

	advanceActionQueue();
}//processCommands

var genericActionReceiver = function(data)
{
	var obj;

	try
	{
		if(typeof data != 'object')obj = eval("(" + data + ")");
			else obj = data;
	}//try
	catch(e)
	{
		errorBox(data);
		ajaxUnsetCurAction(true);
		return;
	}//catch

	ajaxUnsetCurAction(true);	

	if(obj == null)return;
	
	//console.log(obj);
	
	if(obj['params']['debug'] == true)
	{
		errorBox(dump(obj));
		return;
	}//if debug	
	
	var cmd = obj['cmd'];
	if(cmd == null)return;

	var lib = cmd['lib'];
	if(lib != undefined)
	{
		loadLibs(lib, function(){processCommands(cmd)});
		return;
	}//if lib

	processCommands(cmd);
}//genericActionReceiver

var genericActionError = function(XMLHttpRequest, textStatus, errorThrown)
{
	//try textarea
	if(XMLHttpRequest.responseText.indexOf('<textarea>') == 0 || XMLHttpRequest.responseText.indexOf('<TEXTAREA>') == 0)
	{
		$tarea = $(XMLHttpRequest.responseText);
		if($tarea.val() != undefined)
		{
			genericActionReceiver($tarea.val());
			return;
		}//if textarea
	}//if teaxtarea

	ajaxUnsetCurAction(true);
	if(XMLHttpRequest.responseText == '')return;
	errorBox("ERROR: " + textStatus + "\n\r" + XMLHttpRequest.responseText);
}//genericActionError

var callJSFunctions = function(func_arr)
{
	for(var f in func_arr)
	{
		var func_name = func_arr[f]['func'];
		var params = func_arr[f]['params'];

		var func = window[func_name];

		if(typeof func == 'function')func.apply(null, params);
		func = null;
	}//for func in func_arr
}//callJSFunctions

var callJQuery = function(jq_arr)
{
	errorBox('callJQuery NOT YET DEFINED');
}//callJQuery

// SETUP

$(document).ready(function(){
	$('#loadingBox').ajaxStart(function(){
		   $(this).show();
	});

	$('#loadingBox').ajaxComplete(function(){
		   $(this).hide();
	});
});
