var formBuilderAutyoDispatches = {};

var ajaxSuccessCustomHandler 	= undefined;
var ajaxFailCustomHandler 		= undefined;

var formsProperties				= [];

$(document).ready(function(){
	if (formBuilderAutyoDispatches)
	{
		for (var key in formBuilderAutyoDispatches)
		{
			if (formBuilderAutyoDispatches[key])
			{
				for (var i=0;i<formBuilderAutyoDispatches[key].length;i++)
				{
					$(formBuilderAutyoDispatches[key][i]).trigger("change");
				}
			}
		}
	}
});


function FormBuilder()
{
	
}

FormBuilder.forceClosePopupIfSuccess = false;
FormBuilder.clearFormOnSubmitSuccess = true;


function FormBuilder_getFieldByName(form, fieldName)
{
	if (form && form.fields)
	{
		var i=0;
		for (i=0; i<form.fields.length;i++)
		{
			if (form.fields[i].name == fieldName)
			{
				return form.fields[i];
			}
		}
	}
	
	return false;
}


function FormBuilder_setupForm(id, setFocusOnFirstField)
{
	$(document).ready(function(){
		if (setFocusOnFirstField && setFocusOnFirstField == "1")
		{
			$(id+" input[type=text]")[0].focus();
		}
	});
}


function FormBuilder_setupFieldBrowser(jsInstanceName, target, codeHandler, formId)
{
	$('.'+jsInstanceName+'label').click(function(event)
	{
		event.preventDefault();
		
		$('.'+jsInstanceName+'container').html('Se incarca, va rugam asteptati...');
		
		SystemRequest.load('FormBuilder','executeFieldBrowserHandler',[codeHandler, jsInstanceName, formId], function(response){
			var popup = null;
			if (response.data)
			{
				if (target == 'popup')
				{
					popup = new Popup({content:response.data, closeOutside:false, modal:true, centered:true});
					popup.open();
				}
				else
				{
					$('.'+jsInstanceName+'container').html(response.data);
					$('.'+jsInstanceName+'container').show();
				}
				
				if ($('.'+jsInstanceName+'input').val() != "")
				{
					var currentObject = {};
					currentObject.name = $('.'+jsInstanceName+'label').html();
					currentObject.value = $('.'+jsInstanceName+'input').val();
				}
				else
				{
					var currentObject = {};
				}
				
				window[jsInstanceName].setup({currentObject:currentObject,selectHandler:function(selectedObject){
					$('.'+jsInstanceName+'label').html(selectedObject.name);
					$('.'+jsInstanceName+'input').val(selectedObject.value);
					$('.'+jsInstanceName+'inputLbl').val(selectedObject.name);
					
					FormBuilder_closeBrowserContainer($('.'+jsInstanceName+'container'),popup, target);
				}, cancelHandler:function(){
					FormBuilder_closeBrowserContainer($('.'+jsInstanceName+'container'),popup, target);
				}});
			}
		});
	});
}


function FormBuilder_closeBrowserContainer(container, popup, target)
{
	if (target == "inline")
	{
		container.html("");
		container.hide();
	}
	else
	{
		popup.close(true);
	}
}


function FormBuilder_addChangeListener(formId, parentField, childField, childFieldId, childFieldkey, childFieldOptionValue, childFieldOptionName)
{
	if (!formBuilderAutyoDispatches[formId])
	{
		formBuilderAutyoDispatches[formId] = [];
	}
	formBuilderAutyoDispatches[formId].push(parentField);

	setTimeout(function(){

		$(parentField).bind('change',function(event)
		{
			var val = $(parentField).val();

			var nameValue = {name:childFieldkey, value:val};
			
			SystemRequest.load('FormBuilder','getFieldDataSource',[childFieldId, nameValue], function(response){
				
				if ($(childField).children('option'))
				{
					$(childField).children('option').each(function(){
						
						if ($(this).attr("value") != '')
						{
							$(this).remove();
						}
					});
				}

				if (response.data)
				{
					if (response.data.constructor.toString().indexOf("Array") != -1 )
					{
						if (response.data.length > 0)
						{
							var i=0;
							for(i=0;i<response.data.length;i++)
							{
								$(childField).append("<option value="+response.data[i][childFieldOptionValue]+">"+response.data[i][childFieldOptionName]+"</option>");
							}
						}
					}
					else
					{
						$(childField).val(response.data);
					}
					
					$(childField).trigger("change");
				}
			},this);
		});
	},100);
	
	
}


function FormBuilder_clearFormByObject(formObject)
{
	try
	{
		FormBuilder_clearForm( $("#frmBuilderFrm" + formObject.__formId__)[0] );
	}catch(err){ 
		// form doesnt exists?
	};
}


function FormBuilder_clearForm(form)
{
	for (i = 0; i < form.length; i++)
	{
		if (!form[i].type || form[i].type == undefined)
		{	
			continue;
		}
	    field_type = form[i].type.toLowerCase();
	    switch (field_type)
	    {
	    case 'text':
	    case 'password':
	    case 'textarea':
	        form[i].value = '';
	        break;
	    case 'radio':
	    case 'checkbox':
	        if (form[i].checked)
	        {
	            form[i].checked = false;
	        }
	        break;
	    case 'select-one':
	    case 'select-multi':
	        form[i].selectedIndex = -1;
	        break;
	    default:
	        break;
	    }
	}
}


function FormBuilder_changeState(form,state)
{
	for (i = 0; i < form.length; i++)
	{
		var states 	= $(form[i]).attr("states");
		var name	= $(form[i]).attr("name"); 
		
		if (name == "__formState__")
		{
			$(form[i]).attr("value",state);
		}
		
		if (states != undefined && states.length > 0)
		{
			var idx = (states + '').indexOf(state);
			
			if (idx > -1)
			{
				$(form[i]).parent().parent().show();
			}
			else
			{
				$(form[i]).parent().parent().hide();
			}
		}
		else
		{
			$(form[i]).parent().parent().show();
		}
	}
}



function FormBuilder_dispatchSubmit(formId,justDispatchType)
{
	var formObj 	= {};
	var form 		= '#frmBuilderFrm'+formId;
	var formHeader 	= '.eobFrmBuilderFormHeader' + formId;
	
	$.each($(form).serializeArray(), function(i, field) {
		formObj[field.name] = field.value;
	});
	
	// default event type FormBuilder_submitForm
	var ev = new Event(justDispatchType, formObj, form);
	SystemCore.dispatchEvent( ev );
	
	if (ev.defaultPrevented == true)
	{
		return false;
	}
	return true;
}


function FormBuilder_createObjectFromDom(domElement)
{
	formObj = {};
	$.each($(domElement).serializeArray(), function(i, field) {
		formObj[field.name] = field.value;
	});
	
	return formObj;
}


/* TODO: De gasit solutie pentru dispatch de event.
function FormBuilder_forceSubmit(formJQ)
{
	formJQ.attr("onsubmit","");
	
}
*/

function FormBuilder_submitForm(formId, justDispatchType, withConfirm, confirmMessage)
{
	if (parseInt(withConfirm))
	{
		if (!confirm(confirmMessage))
		{
			return false;
		}
		
		if (justDispatchType !='' && justDispatchType != undefined)
		{
			return FormBuilder_dispatchSubmit(formId, justDispatchType);
		}
		return true;
	}
	
	return true;
}


function FormBuilder_submitAjaxForm(formId, formHandlerName, ajaxSuccessHandler, ajaxFailHandler, submitSuccessMessage, submitFailMessage, showFormOnSuccess, justDispatch, withConfirm, confirmMessage)
{
	if (withConfirm)
	{
		if (!confirm(confirmMessage))
		{
			return false;
		}
	}
	
	var values = {};
	var form = '#frmBuilderFrm'+formId;
	var formHeader = '.eobFrmBuilderFormHeader' + formId;
	
	var fileInputs 	= $(form+" input[type=file]");
	
	var hasFiles	= fileInputs && fileInputs.length > 0;
	
	
	$.each($(form).serializeArray(), function(i, field) {
	    values[field.name] = field.value;
	});
	
	if (justDispatch)
	{
		res = FormBuilder_dispatchSubmit(formId,justDispatch);
		if (!res)
		{
			return res;
		}
	}
	
	
	
	if (hasFiles)
	{
		var i = 0;
		var injector = new UploadInjector(form);
		injector.inject("uploadIframe","FormBuilder_uploadFormWithImageHandler");
		
		for(i=0;i<fileInputs.length;i++)
		{
			var name 			= $(fileInputs[i]).attr("name");
			var valuesEncode 	= base64_encode(serialize(values));
			
			injector.registerField(name,"FormBuilder.handleUploadedFormWithFiles",[formId, valuesEncode,'',formHandlerName],'1');
		}
		
		formsProperties[formId] = {
				form: form, 
				formHeader: formHeader, 
				ajaxSuccessHandler: ajaxSuccessHandler, 
				ajaxFailHandler: ajaxFailHandler, 
				submitSuccessMessage: submitSuccessMessage, 
				submitFailMessage: submitFailMessage, 
				showFormOnSuccess: showFormOnSuccess
		};
		
		return true;
	}
	else
	{
		SystemRequest.load('FormBuilder','handleUploadedForm',[formId, values, '', formHandlerName], function(response){
			FormBuilder_uploadFormHandler(response, formId, form, formHeader, ajaxSuccessHandler, ajaxFailHandler, submitSuccessMessage, submitFailMessage, showFormOnSuccess);
		});
	}
	return false;
}


function FormBuilder_uploadFormWithImageHandler(response)
{
	var formId 			= response.data.id
	var p				= formsProperties[formId];
	FormBuilder_uploadFormHandler(response, formId, p.form, p.formHeader, p.ajaxSuccessHandler, p.ajaxFailHandler, p.submitSuccessMessage, p.submitFailMessage, p.showFormOnSuccess);	
}


function FormBuilder_uploadFormHandler(response, formId, form, formHeader, ajaxSuccessHandler, ajaxFailHandler, submitSuccessMessage, submitFailMessage, showFormOnSuccess)
{
	$(".eobSuccess").html("");		
	$(".eobErrors").html("");
	
	if (!response.messages || response.messages.length < 1 || (response.success == true && FormBuilder.forceClosePopupIfSuccess))
	{
		if (FormBuilder.clearFormOnSubmitSuccess == true)
		{
			FormBuilder_clearForm(document['frmBuilderFrm'+formId]);
		}
	
		if (typeof ajaxSuccessCustomHandler == 'function')
		{
			ajaxSuccessCustomHandler(response.data);
		}
		else if (typeof ajaxSuccessHandler == 'function')
		{
			ajaxSuccessHandler(response.data);
		}
		if ($(form).parent().children(".eobSuccess").length == 0)
		{
			$(form).parent().prepend('<div class="eobSuccess">'+submitSuccessMessage+'</div>');
		}
		else
		{
			$(".eobSuccess").html(submitSuccessMessage);
		}
		
		if (showFormOnSuccess == 0)
		{
			$(form).html("");
			$(formHeader).html("");
		}
	}
	else
	{
		if (typeof ajaxFailCustomHandler == 'function')
		{
			ajaxFailCustomHandler(response.data);
		}
		else if (typeof ajaxFailHandler == 'function')
		{
			ajaxFailHandler(response.data);
		}
		else
		{
			if ($(form).parent().children(".eobErrors").length == 0)
			{
				$(form).parent().prepend('<div class="eobErrors">'+submitFailMessage+'</div>');
			}
			else
			{
				$(".eobErrors").html(submitFailMessage);
			}
		}
		
	
	}
}


function FormBuilder_ChangeStateNow(state,targetForm)
{
	if ($("#"+targetForm+" form")[0])
	{
		FormBuilder_changeState($("#"+targetForm+" form")[0],state);
	}
}





