
function lcfDecodeResultR(el)
{
	var hasSub = false;
	var obj = {};
	$(el).contents().each(function(){
		var a = $(this).get();
		for (var i=0;i<a.length;i++)
		{
			if (a[i].tagName)
			{
				hasSub = true;
				obj[a[i].tagName] = lcfDecodeResultR(a[i]);
			}
		}
	});
	if (hasSub)
	{
		return obj;
	}
	return $(el).text();
}

function lcfDecodeResult(xml)
{
	var obj = {};
	$(xml).find('return').children().each(function(){
		var a = $(this).get();
		for (var i=0;i<a.length;i++)
		{
			obj[a[i].tagName] = lcfDecodeResultR(a[i]);
		}
	});
	return obj;
}

/**
* main function for ajax form handling
*
* @formId : string  (form id)
* @controller : string  (relating lcf controller)
* @action : string  (relating lcf action)
* @callBacks : object	{ startCallBack(), endCallBack(), successCallBack(), errorCallBack(), xmlErrorCallBack() }  (defaults used if none set)
*/
function doAjaxForm(formId, controller, action, callBacks)
{
	// set callbacks
	callBacks = _doAjaxForm_setCallbacks(callBacks);
	
	// start process
	callBacks.startCallBack(formId);
	
	// serialise form data
	
	// send data
	$.ajax({
		type: "POST",
		url: _popup_lib_getAjaxUrl(formId,controller,action),
		dataType: 'xml',
		data: _popup_lib_getData(formId,controller,action),
		success: function(xml)
		{
			// BUSINESS ERRORS
			var businessErrorData = new Array();
			var tracker = 0;
			$(xml).find('exception business').each(function()
			{
				businessErrorData[tracker] = $(this).text();
				tracker++;
			});
			// RETURN BUSINESS ERRORS
			if(businessErrorData.length > 0)
			{
				businessErrorHandling(formId, businessErrorData);
				callBacks.endCallBack(formId);
				return false;
			}
			
			// VALIDATION ERRORS
			var errorData = new Object();
			$(xml).find('exception validation').each(function()
			{
				// compile error data
				message = $(this).find('message').text();
				current_fieldname = $(this).find('field').each(function(){
					errorData[ $(this).text() ] = message;
				});

				// add to error object
				//errorData[current_fieldname] = message;
			});
			// RETURN VALIDATION ERRORS
			if(countObjectProperties(errorData) > 0)
			{
				callBacks.errorCallBack(errorData);
				callBacks.endCallBack(formId);
				return false;
			}
			
			// SUCCESS
			return callBacks.successCallBack(formId, controller+'__'+action);
		},
		error: function()
		{
			callBacks.xmlErrorCallBack();
			callBacks.endCallBack(formId);
			return false;
		}
	});

	return false;
}

function useFc(formId)
{
	var r = false;
	$('#'+formId+'[fc=1]').each(function()
	{
		r = true;
	});
	return r;
}

function _popup_lib_getAjaxUrl(formId,controller,action)
{
	if (useFc(formId))
	{
		return getFcUrl()+'/'+controller.replace(/_/g,'-')+'/'+action.replace(/_/g,'-')+'';
	}
	return '/ajax_invoker.php';
}

function generateAjaxRequestUrl(controller,action,params)
{
	url = '<?php echoh($this->ajax_url);?>/'+controller+'/'+action+'?';
	return url + jQuery.param(params);
}

function _popup_lib_getData(formId,controller,action)
{
	var usingZend=true;
	if (useFc(formId))
	{
		var serialised_form = $('#'+formId+' textarea,#'+formId+' input,#'+formId+' select,#'+formId+' textarea').serialize();
		return serialised_form;
	}

	var serialised_form = $('#'+formId+' textarea,#'+formId+' input,#'+formId+' select,#'+formId+' textarea').serialize();

	serialised_form = 'action_'+controller+'__'+action+'=1&' + serialised_form;
	return serialised_form;
}

// **********************************************************************************************
// kept for backwards compatibility
// **********************************************************************************************
function processForm(formId, controller, action, errorcallback)
{
	callBacks = new Object();
	//callBacks.errorCallBack 	= errorcallback;
	action = action+'_validation';
	return doAjaxForm(formId, controller, action, callBacks);
}

function processFormClueTip(formId, controller, action, errorcallback, successcallback, gotoaction)
{
	callBacks = new Object();
	callBacks.successCallBack 	= successcallback;
	callBacks.errorCallBack 	= errorcallback;

	if(gotoaction != 1)
	{
		action = action+'_validation';
	}
	return doAjaxForm(formId, controller, action, callBacks);
}

// **********************************************************************************************
// sets default callbacks if none have been received
// **********************************************************************************************
function _doAjaxForm_setCallbacks(callBacks)
{
	if(callBacks.startCallBack == null)	callBacks.startCallBack 		= startCallBack;
	if(callBacks.endCallBack == null) callBacks.endCallBack 			= endCallBack;
	if(callBacks.successCallBack == null) callBacks.successCallBack 	= successCallBack;
	if(callBacks.errorCallBack == null) callBacks.errorCallBack 		= errorCallBack;
	if(callBacks.xmlErrorCallBack == null) callBacks.xmlErrorCallBack 	= xmlErrorCallBack;
	return callBacks;
}

// **********************************************************************************************
// default callbacks
// **********************************************************************************************
function startCallBack(formId)
{
	$('#'+formId).fadeTo("fast", 0.3);
}

function startCallBack__Login(formId)
{
	//startCallBack(formId);
	$('#'+formId).append("<img src='images/loading_ajax.gif' style='position:absolute; right:16px; top:16px;' class='process_image'>");
	$('#pleaseWait').css('visibility','visible');
}

function _setupErrorPopups()
{
	$('a.tips_error_rounded').cluetip({dropShadow: true, dropShadowSteps: 4, sticky: true, ajaxCache: false, width: '300px', showTitle: false, arrows: true, closePosition:'bottom', closeText:'x', cluezIndex: 9999 });
}


function endCallBack(formId)
{
	_setupErrorPopups();
	$('.process_image').hide();
	$('#'+formId).fadeTo("fast", 1);
}

function successCallBackMessage(formId, controllerAction)
{
	var message = $('#'+formId).attr('message__are_you_sure');
	if (!message)
	{
		message = 'website__are_you_sure';
	}
	tb_show('Message Popup', 'popuplib_yesno.php?form_id='+formId+'&controller_action='+controllerAction+'&mkey='+message+'&width=350&height=80');
}

function successCallBack(formId, controllerAction)
{
	_clearExistingErrors();
	var form = null;			
	if(_setFormAction(formId, controllerAction)) 
	{
		$('#'+formId).submit();
		return false;
	}
	return true;
}

function _setFormAction(formId, action)
{
	
	
	if(formId)
	{
		if (action.indexOf('_validation') > 0)
		{
			action = action.substr(0,action.indexOf('_validation'));
		}
		
		$('#'+formId).remove('input.processForm');
		var h = '<input name="action_'+action+'" class="processForm" type="hidden" value="1"/>';
		$('#'+formId).prepend(h);
		return true;
	}
	return false;
}

function errorCallBack(errorData)
{
	// remove any previous error_field styles
	_clearExistingErrors();
	
	for(fieldname in errorData)
	{
		message = errorData[fieldname];
		var current_field = null;

		$(document).find('form [name='+fieldname+']').each(function() {
			current_field = $(this);
		});
		
		// Fill in the error if we can
		if (current_field != null)
		{
			var errorLabel  = '';
			errorLabel += '<span class="error_area" id="error_area_'+fieldname+'">';
			errorLabel += '<span class="formInfo">';
			errorLabel += '<a href="show_error_tooltip.php?content='+urlencode(message)+'" rel="/show_error_tooltip.php?content='+urlencode(message)+'" class="tips_error_rounded" id="tooltip_'+fieldname+'" title="" onClick="return false;">';
			//errorLabel += '&nbsp;?&nbsp;';
			errorLabel += '<img src="/images/exclamation_icon.png" />';
			errorLabel += '</a>';
			errorLabel += '</span>';
			errorLabel += '</span>';

			var foundErrorLabel = false;
			current_field.parent().find('span.error_area').each(function()
			{
				$(this).replaceWith(errorLabel);
				foundErrorLabel = true;
			});
			if(foundErrorLabel == false)
			{
				current_field.after('<span class="error_area">'+errorLabel+'</span>');
			}
			
			// set error style on input
			current_field.addClass("error_field");
			
		}
		
		// If we did not find the element, we should just alert()
		else
		{
			if (!foundErrorLabel)
			{
				alert(fieldname+': '+message);
			}
		}
	}
}

function xmlErrorCallBack()
{
	alert('General error occured in reading the XML response.');
}

function _clearExistingErrors()
{
	$('.error_field').removeClass("error_field");
	$('span.error_area').text('');
}

// **********************************************************************************************
// other functions
// **********************************************************************************************
function _businessErrorHandling_getErrorMesage(businessErrorData,htmlV)
{
	if (htmlV)
	{
		return businessErrorData.join('<br/>');
	} else
	{
		return businessErrorData.join("\n");
	}
	return '';
}

function businessErrorHandling(formId, businessErrorData)
{
	if(_businessErrorHandling_getErrorMesage(businessErrorData,1).length > 0)
	{
		var statusArea = null;
		$('#'+formId+'_ajax_status_area').find(function() 
		{
			statusArea = $(this);
		});
		if (statusArea == null)
		{
			var buttons = {	Close : 'return false;' };
		    
		    thickMsgBox( "<div class=\"error\" style=\"height: 80px; overflow: auto;\">" + _businessErrorHandling_getErrorMesage(businessErrorData,0) + "</div>", buttons, 'default', 400, 125 );
			
		} else
		{
			$('#'+formId+'_ajax_status_area').html(_businessErrorHandling_getErrorMesage(businessErrorData,1));
		}
		return true;
	}
	return false;
}

function countObjectProperties(objectToCount)
{
	count = 0;
	for(prop in objectToCount)
	{
		count++;
	}
	return count;
}

function generateAjaxRequestUrl(controller,action,params)
{
	url = getFcUrl()+'/'+urlencode(controller)+'/'+urlencode(action)+'?';
	return url + jQuery.param(params);
}

function urlencode(str)
{
	str = escape(str);
	str = str.replace('+', '%2B');
	str = str.replace('%20', '+');
	str = str.replace('*', '%2A');
	str = str.replace('/', '%2F');
	str = str.replace('@', '%40');
	return str;
}

function closeErrors()
{
	$('#cluetip').hide();
    return false;
}

function successCallBack__Login(formId, controllerAction)
{
	// set hidden field
	hidden_field = "<input type='hidden' name='js_enabled' value='1'>";
	$("#"+formId).append(hidden_field);
	return successCallBack(formId, controllerAction);
}

function getFcUrl()
{
	return '/fc.php';
}

$(document).click(
	function()
	{
		closeErrors();
	}
);
