

(function($) {
	
	$.widget("ui.FormManager", $.extend({ } ,$.ui.mouse, {
		
		options: { 
			// initial values are stored in the widget's prototype 
			url: "_procesa.php",
			submitButton: "submit",
			msgContainer: "elformerror",
			preErrorMsgHtml: "Revise lo siguiente:<br />",
			msgItemTagOpen: "<p>",
			msgItemTagClose: "</p>",
			preloaderHtml: "loading..",
			controls: [],
			refreshOnComplete: true,
			extraDataToPost:{},
			onSuccess: function(serverData){}
		},
		
		_init: function() {
		
			this._setData('errors', []);
			this._setData('values', []);
			this._setData('processEnabled', true);
			
			$("#"+this.options.msgContainer).hide();
			
			var myself = "#"+this.element.attr('id');
			
			// EVENTO AL BOTON
			$("#"+this.options.submitButton).bind("click", function(evt,data) { 
				$(myself).FormManager("process");
		    });
			
			// AGREGO LA ETIQUETA FORM Y LE CAMBIO EL COMPORTAMIENTO:
			$(myself).wrapInner('<form />');
			$(myself + " form").attr("action", "");		
			$(myself + " form").submit(function(event) {
				event.preventDefault();
				$(myself).FormManager("process");
				return false;
				
			});			
			//	
			
			// ADD EVENT HANDLERS
			var len = this.options.controls.length;
			for(var i=0; i<len; i++) {
				var itemId = this.options.controls[i].id;
				
				$('#'+itemId).bind("onValidationErrors", function(evt,data) { 
					$(myself).FormManager("addErrors", data);
			    });
				
				$('#'+itemId).bind("onGetValue", function(evt,data) { 
					$(myself).FormManager("addValue", {name:$(evt.currentTarget).attr('id'), value:data}); 
					//$(myself).FormManager("addValue", {name:$(evt.currentTarget).attr('name'), value:data}); // HAY QUE ARREGLARLO
			    });				
			}			
			//
			
		},
		
		disableSubmits: function() {
			this._setData('processEnabled', false);
			
			//$("#"+this.options.submitButton).hide();
			$("#"+this.options.submitButton).animate({opacity: 0.25}, 1);			
			
		},		
		
		enableSubmits: function() {
			this._setData('processEnabled', true);
			
			//$("#"+this.options.submitButton).show();
			$("#"+this.options.submitButton).animate({opacity: 1}, 1);	
		},			
		
		addErrors: function(controlErrors) {
			var errors = this._getData('errors');
			var len = controlErrors.length;
			for(var j=0; j<len; j++) {
				errors.push(controlErrors[j]);
			}			
			this._setData('errors', errors);				
		},
		
		addValue: function(valueObj) {
			var values = this._getData('values');
			values.push(valueObj);
			this._setData('values', values);
		},		
		
		validateFields: function() {
		
			// CHECK EACH VALIDATION REGEX
			var len = this.options.controls.length;
			for(var i=0; i<len; i++) {
				var itemId = this.options.controls[i].id;
				var itemKind = this.options.controls[i].kind;
				//$('#'+itemId).textbox("validate");
				to_eval = "$('#" + itemId + "')." + itemKind + "('validate');";
				eval(to_eval);
			}

		},		
		
		getValues: function() {
			
			// CHECK EACH VALIDATION REGEX
			var len = this.options.controls.length;
			for(var i=0; i<len; i++) {
				var itemId = this.options.controls[i].id;
				var itemKind = this.options.controls[i].kind;
				//$('#'+itemId).textbox("getValue");
				to_eval = "$('#" + itemId + "')." + itemKind + "('getValue');";
				eval(to_eval);				
			}

		},			
		
		disableControls: function() {
			// DESABILITO TODOS LOS CONTROLES
			var len = this.options.controls.length;
			for(var i=0; i<len; i++) {
				var itemId = this.options.controls[i].id;
				var itemKind = this.options.controls[i].kind;
				//$('#'+itemId).textbox("disable");
				to_eval = "$('#" + itemId + "')." + itemKind + "('disable');";
				eval(to_eval);				
			}			
			//
		},	
		
		enableControls: function() {
			// DESABILITO TODOS LOS CONTROLES
			var len = this.options.controls.length;
			for(var i=0; i<len; i++) {
				var itemId = this.options.controls[i].id;
				var itemKind = this.options.controls[i].kind;
				//$('#'+itemId).textbox("enable");
				to_eval = "$('#" + itemId + "')." + itemKind + "('enable');";
				eval(to_eval);				
			}			
			//
		},		
		
		refreshControls: function() {
			// DESABILITO TODOS LOS CONTROLES
			var len = this.options.controls.length;
			for(var i=0; i<len; i++) {
				var itemId = this.options.controls[i].id;
				var itemKind = this.options.controls[i].kind;
				//$('#'+itemId).textbox("refresh");
				to_eval = "$('#" + itemId + "')." + itemKind + "('refresh');";
				eval(to_eval);				
			}			
			//
		},			
		
		process: function() {
			var processEnabled = this._getData('processEnabled');
			
			var msg = "";
			var preErrorMsgHtml = "";
			if (this.options.hasOwnProperty("preErrorMsgHtml")){
				preErrorMsgHtml = this.options.preErrorMsgHtml;
			}				
			
			
			if (processEnabled){
				
				var myself = "#"+this.element.attr('id');
				this.validateFields();
				var errors = this._getData('errors');
				this._setData('errors', []);
				this._setData('values', []);
				
				var hasErrors = false;
				var errorMsg = "";
				
				$(myself).FormManager("disableSubmits");
				
				// CHECK ERRORS
				var len = errors.length;
				for(var i=0; i<len; i++) {
					errorMsg += this.options.msgItemTagOpen + errors[i] + this.options.msgItemTagClose;
				}
				
				if (len > 0) hasErrors = true;
				
				if (hasErrors) msg = preErrorMsgHtml + errorMsg;			
				
				$("#"+this.options.msgContainer).slideUp('fast', function() {
					$(myself).FormManager("msgRestart", msg, hasErrors);
				});
				
			}
			
		},
		
		msgRestart: function(msg, hasErrors) {
			
			//alert("msgRestart - msg:" + msg + " hasErrors:" + hasErrors);
			//return;
			
			var myself = "#"+this.element.attr('id');
			
			if (hasErrors == true){ // MUESTRO LOS ERRORES
				$("#"+this.options.msgContainer).html(msg);
				
				$(myself).FormManager("enableSubmits");
				
				$("#"+this.options.msgContainer).slideDown('fast', function() {
					//$("#"+this.options.submitButton).show(); // NO ANDA
				});				
			}
			else { // NO HAY ERRORES, ENVÍO LA DATA
				this.prepareToSend(); // REVISAR PORQUE ENTRA EN BUCLE INFINITO
			}
		},	
		
		prepareToSend: function() {
			var myself = "#"+this.element.attr('id');
			
			this.disableControls();
			
			$("#"+this.options.msgContainer).html(this.options.preloaderHtml);
			$("#"+this.options.msgContainer).slideDown('fast', function() {
				$(myself).FormManager("sendData");
			});		

		},
		
		sendData: function() {
			// GET EACH VALUE
			this.getValues();
			
			var values = this._getData('values');
			var data = {};
			
			// CREO EL OBJETO QUE VOY A USAR PARA POSTEAR 
			var len = values.length;
			for(var i=0; i<len; i++) {
				var item = values[i];
				data[item.name] = item.value;
			}			
			
			// AGREGO LA DATA EXTRA PASADA POR extraDataToPost:
			for(var prop in this.options.extraDataToPost) {
				data[prop] = this.options.extraDataToPost[prop];
			}				
			
			// TEST PARA VER SI TIENE TODA LA DATA QUE ESPERO
			/*
			debugObj = "";
			for(var prop in data) {
			    //if(data.hasOwnProperty(prop))
			    	debugObj += "&" + prop + "=" + data[prop];
			}
			alert(debugObj);
			*/
			//

			var myself = "#"+this.element.attr('id');
			
			$.ajax({
					url: this.options.url,
					global: false,
					type: "POST",
					data: data,
					dataType: "json",
					success: function(serverResponse){
						 
						$(myself).FormManager("prepareToEnd", serverResponse);
			         
					}
			   }
			);			
			
			
		},			
				
		
		prepareToEnd: function(serverResponse) {
			var myself = "#"+this.element.attr('id');
			$("#"+this.options.msgContainer).slideUp('fast', function() {
				$(myself).FormManager("end", serverResponse);
			});		

		},
		

		end: function(serverResponse) {
			var myself = "#"+this.element.attr('id');
			
			$(myself).FormManager("enableSubmits");
			
			this.enableControls();
			
			/*
			debugObj = "";
			for(var prop in serverResponse.data) {
			    //if(data.hasOwnProperty(prop))
			    	debugObj += "<br>" + prop + "=" + serverResponse.data[prop];
			}	
			*/		
			
			if (serverResponse.success == true){ // NO HAY ERRORES
				if (this.options.refreshOnComplete == true){
					this.refreshControls();
					
					if (this.options.hasOwnProperty("onSuccess")){
						if (serverResponse.hasOwnProperty("serverData")){
							this.options.onSuccess(serverResponse.serverData);
						}
						else {
							this.options.onSuccess();
						}
					}
					
					
				}
				
				$("#"+this.options.msgContainer).html(serverResponse.msg);
				$("#"+this.options.msgContainer).slideDown('fast', function() {
				    // Animation complete.
				});				
			}
			else { // HAY ERRORES
					
				var msg = "";
				var preErrorMsgHtml = "";
				var errorMsg = "";
				var hasErrors = false;
				
				if (serverResponse.hasOwnProperty("msg")){
					msg = serverResponse.msg;
				}
				if (this.options.hasOwnProperty("preErrorMsgHtml")){
					preErrorMsgHtml = this.options.preErrorMsgHtml;
				}				
				
				for(var prop in serverResponse.validationErrors) {
					var itemId = serverResponse.validationErrors[prop].id;
					var itemErrors = serverResponse.validationErrors[prop].errors;
					
					var len = itemErrors.length;
					for(var i=0; i<len; i++) {
						hasErrors = true;
						errorMsg += this.options.msgItemTagOpen + itemErrors[i] + this.options.msgItemTagClose;
					}	
					
					// RECORRO TODOS LOS CONTROLES Y BUSCO EL QUE CORRESPONDE PARA SETEARLE EL ERROR:
					for(var i=0; i<this.options.controls.length; i++) {
						if (this.options.controls[i].id == itemId){
							var itemKind = this.options.controls[i].kind;
							to_eval = "$('#" + itemId + "')." + itemKind + "('externalError');";
							eval(to_eval);
						}
					}
					//					
					
				}					
				
				if (hasErrors) msg = msg + preErrorMsgHtml + errorMsg;
				this.msgRestart(msg, true);
				
			}
		}
		

	
		
		
		

	}));

	
})(jQuery);



