﻿/**
 * Responsible for validating and submitting
 * all html forms on landing pages.
 */
LPCForm = function () {
	//FormHandler Object
	var Form = function(pre_fxn, post_fxn, error_fxn, request_url, translation) {
		this.pre_fxn		= pre_fxn;
		this.post_fxn		= post_fxn;
		this.error_fxn		= error_fxn;
		this.request_url 	= request_url;		
		this.translation    = translation;
		
		this.request_result	= '';
		
		this.elements = new Array();
		
		this.addElement = addElement;
		
		this.process 		= process;
		this.processInline	= processInline;
		this.validate 		= validate;
		this.validateInline = validateInline;
		this.sendRequest 	= sendRequest;
		this.requestSuccess	= requestSuccess;
		this.requestFailure	= requestFailure;
		this.getFormData	= getFormData;
	};
	
	var process = function () {
		
		if (!this.validate()) {
			return false;
		}
		
		if (this.pre_fxn.call() == false) { 
			return false;
		}
		
		data = this.sendRequest();
	};
	
	var processInline = function () {
		
		if (!this.validateInline()) {
			return false;
		}
		
		if (this.pre_fxn.call() == false) { 
			return false;
		}
		
		data = this.sendRequest();
	};
	
	var requestSuccess = function (data) {
		//ref = this;
		alert(this.url);
		//this.post_fxn.call(data);
	}; 
	
	var requestFailure = function(requestObj, status) {
		this.error_fxn.call(requestObj);
	};
	
	var getFormData = function() {
		var formDataObj = new Object();
			formDataObj.instance_id = instance_id;
		for (var i=0; i<this.elements.length; i++) {
			var id   = this.elements[i].id;
			var name = $("#"+id).attr("name");
			//var name = this.elements[i].name;
			if (this.elements[i].type == 'checkbox') {
				formDataObj[name] = $("#"+id).is(':checked');
			} else {
				formDataObj[name] = $("#"+id).val();
			}
		}

		return formDataObj;
	}
	
	var sendRequest = function() {
		var ref = this;
		data = this.getFormData();
		$.ajax({
			type:"POST", 
			url:this.request_url,
			data:data,
			success: this.post_fxn,
			error: this.error_fxn});
	};
	
	var validate = function () {
		form_elements = this.elements;
		v = new Validation(this.translation);
		for (var i=0; i < form_elements.length; i++) {
			e = form_elements[i];
			v.registerElement(e.id, e.display, e.type, e.min_length, e.max_length);
		}
		if (v.validate()) {
			return true;
		} else {
			var message = '';
			var errors = v.getErrors();
			for (var i=0; i < errors.length; i++) {
				message = message+errors[i]+"\n";	
			}
			alert(message);
			v.clearErrors();
			return false;
		}
	};
	
	var validateInline = function () {
		form_elements = this.elements;
		v = new Validation(this.translation);
		for (var i=0; i < form_elements.length; i++) {
			e = form_elements[i];
			v.registerElement(e.id, e.display, e.type, e.min_length, e.max_length);
		}
		if (v.validateInline()) {
			return true;
		} else {
			// Clear form elements first:
			for (var i=0; i < form_elements.length; i++) {
				e = form_elements[i];
				var obj = $("#" + e.id);
				var objError = $("#" + e.id + "_error");
				
				obj.removeClass("form_error_field");
				objError.hide();
			}
			// Set the errors:
			var errorsInline = v.getErrorsInline();
			for (var i in errorsInline) {
              var obj = $("#" + i);
              obj.addClass("form_error_field");

              // jQuery's "objError.length > 0" is the way to check if an element exists.
              // But that returns also zero for empty elements, so, let's use getElementById() here.
              if( !document.getElementById(i + "_error")) {
                // If the error container doesn't exists, create it.
                obj.after( '<div id="' + i + '_error" class="form_error"></div>');
              }

              var objError = $("#" + i + "_error");              
              objError.text( errorsInline[i]);
              objError.show();
			}
			v.clearErrorsInline();
			return false;
		}
	};
	
	var addElement = function (name, id, type, required, min_length, max_length) {
		this.elements.push(new FormElement(name, id, type, required, min_length, max_length));
	};	
	
	//FormElement Object
	var FormElement = function(name, id, type, required, min_length, max_length) {
		this.display    = name;
		this.id			= id;
		this.type		= type;
		this.required 	= required;
		this.min_length	= min_length;
		this.max_length	= max_length;
	};
	
	return {
		Form: Form
	};
}();