// -------------------------------------------------------------------------------------------------
// POST to AJAX Request Broker
// -------------------------------------------------------------------------------------------------
// Updated and different from TAE pajax (can no longer override target)
// BUT supports option on_complete functions
// AND template group overrides
// AND transparent JSON encoding of variables that require it (namely objects, NOT arrays)
// -------------------------------------------------------------------------------------------------

var ajax_request_broker_url = '/ajax/ajax_request_broker_4front.php';

var pajax_template_groups = new Object;

// -------------------------------------------------------------------------------------------------

function pajax(params, target_id, on_complete)
{
	// POST Ajax
	
	params = seemless_json(params);
	params = check_for_template_group_override(params);

	var t = $(target_id);
	if (!t)
	{
		//console.log('Target not found: ' + target_id);
		return;
	}
	t.addClass('ajaxload');
	
	var pajax = new Request.HTML(
		{
			url: ajax_request_broker_url,
			data: params,
			update: t,
			onSuccess: function()
				{
					t.removeClass('ajaxload');
					if (on_complete) on_complete();
				}
		}
	);
	pajax.post();
}

// -------------------------------------------------------------------------------------------------

function pajax_replace(params, target_id, on_complete)
{
	// POST Ajax, replacing the target_id
	
	params = seemless_json(params);
	params = check_for_template_group_override(params);

	var t = $(target_id);
	if (!t)
	{
		//console.log('Target not found: ' + target_id);
		return;
	}
	t.addClass('ajaxload');

	var pajax = new Request.HTML(
		{
			url: ajax_request_broker_url,
			data: params,
			onSuccess: function(el)
				{
					var rep = $(el[1]); // Get first non text node - assumes well-formed XHTML is returned
					if (!rep) rep = $(el[0]); // IE fudge
					rep ? rep.replaces(t) : t.dispose(); // Delete if nothing returned
					if (on_complete) on_complete();
				}
		}
	);
	pajax.post();
}

// -------------------------------------------------------------------------------------------------

function pajax_form(e, form_obj, target_id, on_complete)
{
	// POST Ajax Form
	
	if ($defined(e))
	{
		var ev = new Event(e);
		ev.preventDefault(); // Does this work - I don't think I've checked
	}
	
	var t = $(target_id);
	if (!t)
	{
		//console.log('Target not found: ' + target_id);
		return;
	}
	t.addClass('ajaxload');
	
	// Add template group override if its defined
	var xclass = form_obj.elements['xclass'] ? form_obj.elements['xclass'].value : null;
	if (xclass)
	{
		if (!$defined(form_obj.grab)) form_obj = $(form_obj); // Check the form has been extended by mootools - IE need this
		var hid_1 = new Element('input', { 'type': 'hidden', 'name': 'template_group', 'value': pajax_template_groups[xclass] });
		form_obj.grab(hid_1);
	}

	var pajax = new Request.HTML(
		{
			url: ajax_request_broker_url,
			update: t,
			onSuccess: function()
				{
					t.removeClass('ajaxload');
					if (on_complete) on_complete();
				}
		}
	);
	pajax.post(form_obj);
}

// -------------------------------------------------------------------------------------------------

function seemless_json(params)
{
	var params = $H(params);
	params_enc = params.map(function(value, key)
				{
						if (typeof value == 'object')
						{
							if (value instanceof Array) return value;
							return JSON.encode(value);
						}
						else
						{
							return value;
						}
				}
	);
	params_enc = params_enc.getClean();
	return params_enc;
}

// -------------------------------------------------------------------------------------------------

function check_for_template_group_override(params)
{
	if (!$defined(params.xclass)) return params;
	if (pajax_template_groups[params.xclass]) params.template_group = pajax_template_groups[params.xclass];
	return params;
}