// DEFINIÇÕES

var ajaxFormValidationConfig = new Object();
var ajaxActionHistory = new Array();
var curAction = null;
var actionQueue = [];

// BÁSICO

function loadHTML(url, params, target, callback, mode)
{
	if(mode == undefined)mode = 'POST';

	var onComplete = function(data){
		$('#' + target).html(data);
		if(callback != undefined)callback();
 	};

	if(mode == 'POST')$.post(url, params,  onComplete);
		else $.get(url, params,  onComplete);
}//loadHTML

function loadJSON(url, params, callback, error_callback, mode)
{
	$.ajax({
		url:url,
		data:params,
		type:(mode == undefined)?('GET'):('POST'),
		dataType:'html',
		success:callback,
		error:error_callback
	});
}//loadJSON

// FORM

var configSmartForm = function(form_id, val_rules, val_messages)
{
	$('#' + form_id).validate({
		errorElement: 'strong',
		errorPlacement: formFieldError,
		rules: val_rules,
		meta: 'validate'
	});
}//configSmartForm

var formFieldError = function(error, element)
{
	if($('#' + element.attr('name') + '_error').length > 0)
	{
		$('#' + element.attr('name') + '_error').html(error);
	}//if hint
}//formFieldError

function ajaxSubmitForm(obj)
{
	var form_id = $(obj).attr('ownerid');

	$('#' + form_id).validate(ajaxFormValidationConfig[form_id]);
	if($('#' + form_id).valid())
	{
		var options = {success:function(obj){genericActionReceiver(obj)}, type:'POST', dataType:'json', error:genericActionError};
		ajaxFormSend(form_id, options);
	}//if valid

	return false;
}//ajaxSubmitForm

function ajaxSubmitFormDirect(form_id, params)
{
	var options = {success:function(obj){genericActionReceiver(obj)}, type:'POST', dataType:'json', error:genericActionError};
	ajaxFormSend(form_id, options);
	return false;
}//ajaxSubmitFormDirect

function ajaxFormSend(form_id, options)
{
	if(curAction == null)
	{
		ajaxSetCurActionForm(form_id, options);
		try
		{
			$('#' + form_id).ajaxSubmit(options);
		}//try sub
		catch(e)
		{
			alert(e);
		}
	}//if !curAction
}//ajaxFormSend

var ajaxAddFieldError = function(error, element)
{
	$hint = element.parent().children('p');

	if($hint.length > 0)
	{
		$hint.append(error);
	}//if hint
	else if($('#' + element.attr('name') + '_hint').length > 0)
	{
		$('#' + element.attr('name') + '_hint').append(error);
	}//if hint
	else
	{
		var $fieldset = element.parent("fieldset");
		while($fieldset.length == 0)
		{
			element = element.parent();
			$fieldset = element.parent("fieldset");
		}//while !fieldset

		if($fieldset.next("p").html() == '')error.appendTo($fieldset.next("p"));
	}//else procura fieldset
}//ajaxConfigForm

// ACTION

function callActionQuiet(url, params, mode)
{
	if(curAction == null)
	{
		ajaxSetCurAction(url, params, mode, false);
		loadJSON(url, params, genericActionReceiver, genericActionError, mode);
	}//if !curAction
	else queueAction(url, params, mode, false);
}//callActionQuiet

function callAction(url, params, mode)
{
	if(curAction == null)
	{
		ajaxSetCurAction(url, params, mode);
		loadJSON(url, params, genericActionReceiver, genericActionError, mode);
	}//if !curAction
	else queueAction(url, params, mode, true);
}//callAction

function ajaxSetCurAction(url, params, mode, showLoading)
{
	if(showLoading != false)setLoading(true);
	curAction = {url:url, params:params, mode:mode}
}//ajaxSetCurAction

function queueAction(url, params, mode, showLoading)
{
	var action = {url:url, params:params, mode:mode, loading:showLoading};
	actionQueue.push(action);
}//ajaxSetCurAction

function advanceActionQueue()
{
	if(actionQueue.length > 0)
	{
		var next_act = actionQueue.shift();

		if(next_act.loading)callAction(next_act.url, next_act.params, next_act.mode);
			else callActionQuiet(next_act.url, next_act.params, next_act.mode);
	}//if queue
}//advanceActionQueue

function genericActionReceiver(data)
{
	var obj;

	//console.log(data);

	try
	{
		if(typeof data != 'object')obj = eval("(" + data + ")");
			else obj = data;
	}//try
	catch(e)
	{
		errorBox(data);
		ajaxUnsetCurAction(true);
		return;
	}//catch

	ajaxUnsetCurAction(true);

	var cmd = obj['cmd'];
	var func = cmd['func'];
	var params = obj['params'];

	if(obj['params']['debug'] == true)
	{
		errorBox(dump(obj));
	}//if debug

	//alert(func);

	if(func != undefined)callJSFunctions(func);
	advanceActionQueue();
}//genericActionReceiver

function genericActionError(XMLHttpRequest, textStatus, errorThrown)
{
	ajaxUnsetCurAction(true);
	if(XMLHttpRequest.responseText == '')return;
	errorBox("ERROR: " + textStatus + "\n\r" + dump(errorThrown) + ":\n\r" + XMLHttpRequest.responseText);
}//genericActionError

function callJSFunctions(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];

		//alert(func_name + ': ' + func);

		try
		{
			if(typeof func == 'function')func.apply(null, params);
		}//try
		catch(e)
		{

		}//catch e
		func = null;
	}//for func in func_arr
}//callJSFunctions

// HISTORY

function ajaxUnsetCurAction(add_to_history)
{
	if(add_to_history == true && curAction != null)
	{
		if(curAction.url != undefined)ajaxAddToHistory();
	}//if add to history
	curAction = null;
	setLoading(false);
}//ajaxUnsetCurAction

function ajaxSetCurActionForm(form_id, options)
{
	setLoading(true);
	curAction = {form_id:form_id, options:options}
}//ajaxSetCurActionForm

function ajaxAddToHistory()
{
	ajaxActionHistory.push(curAction);
}//consolidateHistory

function ajaxHistoryBack(i)
{
	for(var h = 0; h < i; h++)
	{
		var obj = ajaxActionHistory.pop();
		if(obj != undefined)
		{
			if(obj.form_id != undefined)
			{
				ajaxFormSend(obj.form_id, obj.options)
			}//if form
			else callAction(obj.url, obj.params, obj.mode);
		}//if obj
	}//for h
}//ajaxHistoryBack

function ajaxReload()
{
	ajaxHistoryBack(1);
}//ajaxReload
