/*
** Funciones para el tratamiento de los datos via AJAX
*/

/*PETICION EN AJAX*/
function ajaxRequest(params, url, options){

	var params_request;//parametros que se van a enviar
	//Compruebo si se trata de un string o ya es un objeto
	if(typeof params != "object")
		params_request = params.evalJSON();
	else
		params_request = params;

	//Limpiamos los mensajes de validacion del formulario
	if(options.form != null)
		cleanValidate(options.form);

	//¿Queremos actualizar una capa?
	if(options.updater != null)
		ajaxUpdater(params_request, url, options);
	else
		ajaxNoUpdater(params_request, url, options);
}

/*Envia parametros y actualiza capa*/
function ajaxUpdater(params, url, options){

	var method_request = 'post';//metodo de la peticion
	var encoding_request = 'UTF-8';//tipo de codificacion

	//lanzamos el metodo con todos sus parametros
	new Ajax.Updater(options.updater, url, {method: method_request,
											parameters: params,
											asynchronous: true,
											evalScripts: true,
											encoding: encoding_request, 
											requestHeaders:['X-Update', options.updater],
							
											onComplete:function(request, json) {
												Element.hide(options.loading);
											}, 
							
											onLoading:function(request){
												Element.show(options.loading);
											},
							
											onSuccess:function(transport){
												//deseo respuesta por parte del servidor?
												if(options.response){
													//ARRAY(hash) --> JSON --> OBJECT
													params_response = transport.responseText.evalJSON();
													//Si todo salio bien
													if(params_response.result_action){
														//Muestro mensaje de OK general
														messageResult('msg-request', params_response.result_msg, params_response.result_action);
													}else{
														//Muestro mensaje de error general
														messageResult('msg-request', params_response.result_msg, params_response.result_action);
														//Genero mensajes de error individual
														checkErrors(options.form, params_response);
													}
												}
											}

										}
					);
}

/*Envia parametros, sin actualizar capa*/
function ajaxNoUpdater(params, url, options){

	var method_request = 'post';//metodo de la peticion
	var encoding_request = 'UTF-8';//tipo de codificacion

	//lanzamos el metodo con todos sus parametros
	new Ajax.Request(url, { method: method_request,
							parameters: params,
							asynchronous: true,
							evalScripts: true,
							encoding: encoding_request, 
							
							onComplete:function(request, json){
								Element.hide(options.loading);
							}, 
							
							onLoading:function(request){
								Element.show(options.loading);
							},
							
							onSuccess:function(transport){
								//deseo respuesta por parte del servidor?
								if(options.response){
									//ARRAY(hash) --> JSON --> OBJECT
									params_response =  transport.responseText.evalJSON();
									//Si todo salio bien
									if(params_response.result_action){
										if(params_response.url_redirect == ""){
											//Muestro mensaje de OK general
											messageResult('msg-request', params_response.result_msg, params_response.result_action);
										}else{
											window.location.href=params_response.url_redirect;
										}
									}else{
										//Muestro mensaje de error general
										messageResult('msg-request', params_response.result_msg, params_response.result_action);
										//Genero mensajes de error individual
										checkErrors(options.form, params_response);
									}
								}
							}
						}
					);
}

/*Funcion encargada de crear las capas mostrando los errores de validacion*/
function checkErrors(form, params){
	var params_keys = new Array() 

	//pasamos los valores del objeto a un array
	var i=0;
	for(var field in params.error_fields){
		params_keys[i] = field;
		i++;
	}

	//Recorro todos los input del formulario
	$$('#'+ form +' .required-field').each(function(element){
		if(in_array(element.id,params_keys))
			//incluyo la clase de error en el elemento padre
			element.parentNode.addClassName('element-red');
			//genero la etiqueta del error en la capa padre
			messageErrorField(element.parentNode, params.error_fields[element.id]) 
	});
								
}

//Encargada de crear las capas de los mensajes personalizados de los campos de un formulario
function messageErrorField(element, text){

	//Atributos nueva capa
	var attrs_parent = {
		class : 'msg-required'
	}; 
	var div_message = new Element('span', attrs_parent);

	div_message.update(text);//texto

	//Coloco a las capas dentro de la estructura del DOM 
  	element.insert({bottom: div_message});
}

//Encargada de crear el mensaje general de resultados
function messageResult(elementid, text, result){

	if(result)
		var class_txt = 'green';
	else
		var class_txt = 'orange';

	//Atributos nueva capa
	var attrs_parent = {
			id : elementid,
			class: class_txt
	}; 
	var div_message = new Element('span', attrs_parent);

	div_message.update(text);//texto

	//El mensaje es colocado en el ultimo elemento del formulario
	//justo al lado del boton que realiza la accion 
	$('endform').insert({ bottom : div_message});
		
}


//Elimina todas las clases incluidad y capas generadas en la vista
//por el sistema de validación
function cleanValidate(){
	
	//eliminamos la clase element-red de todos los elementos
	$$('.element').each(function(element){
		if(element.hasClassName('element-red'))
			element.removeClassName('element-red');
			
	});		
	
	//eliminamos todos los mensajes de los campos
	$$('.msg-required').each(function(element){
		element.remove();
	});	
	
	//eliminamos mensaje general
	if($('msg-request'))
		$('msg-request').remove();
}

