// DEFINIÇÕES

var ajaxFormValidationConfig = new Object();
var ajaxActionHistory = new Array();
var curAction = null;

// 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:'json',
		success:callback,
		error:error_callback
	});
}//loadJSON

// FORM

function ajaxConfigForm(form_id, val_rules, val_messages)
{
	var validation_options = {
		errorElement:"strong",
		errorClass:'form_error',
		errorPlacement:ajaxAddFieldError,
		rules:val_rules
	}//validation_options

	ajaxFormValidationConfig[form_id] = validation_options;

	var validator = $("#" + form_id).bind("invalid-form.validate", function(){}).validate(validation_options);
}//configAjaxFormValidation

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 ajaxFormSend(form_id, options)
{
	if(curAction == null)
	{
		ajaxSetCurActionForm(form_id, options);
		$('#' + form_id).ajaxSubmit(options);
	}//if !curAction
}//ajaxFormSend

function ajaxAddFieldError(error, element)
{
	$hint = element.parent().children('p');

	if($hint.length > 0)
	{
		$hint.append(error);
	}//if hint
	else if($('#' + element.attr('name') + '_error').length > 0)
	{
		$('#' + element.attr('name') + '_error').append(error);
	}//if hint
}//ajaxConfigForm

// ACTION

function callActionQuiet(url, params, mode)
{
	if(curAction == null)
	{
		ajaxSetCurAction(url, params, mode, false);
		loadJSON(url, params, genericActionReceiver, genericActionError, mode);
	}//if !curAction
}//callActionQuiet

function callAction(url, params, mode)
{
	if(curAction == null)
	{
		ajaxSetCurAction(url, params, mode);

		loadJSON(url, params, genericActionReceiver, genericActionError, mode);
	}//if !curAction
}//callAction

function genericActionReceiver(obj)
{
	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)
}//genericActionReceiver

function genericActionError(XMLHttpRequest, textStatus, errorThrown)
{
	ajaxUnsetCurAction(true);
	if(errorThrown == undefined)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);

		if(typeof func == 'function')func.apply(null, params);
		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 ajaxSetCurAction(url, params, mode, showLoading)
{
	if(showLoading != false)setLoading(true);
	curAction = {url:url, params:params, mode:mode}
}//ajaxSetCurAction

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