var ValidarFormularioCliente = false;
/**
	Dependencias:
		- mootools-1.2.1-core.js
		- mootools-1.2-more.js
		- FormHelp.js
*/

var MantenimientoCliente = {
	formActivo: null,
	formName: null,
	acciones: {},
	actions: {},
	messages: {},
	fields: {},
	cache: {},
	localidad: null,
	localidadFiscal: null,
	mode: null,
	modes: {alta: 0, modificacion:1},
	tipoCliente: null,	
	validarFormatoNIFCIF: null,	
	tiposCliente: {particular: 0, empresa:1},
  originalValues:{},
	/**
	* Inicializamos los eventos necesarios para el comportamiento de la página.
	* Inicializamos las modificaciones gráficas derivadas de los datos de formulario.
	* Realizamos las actualizaciones de datos iniciales según los datos indicados en el formulario.
	*/
	init: function() {
		Portal.init();
		this.formActivo = document.forms[this.formName];

		//limpiamos los campos de contraseña
		if($chk($('passwdOld')))$('passwdOld').set('value','');
		if($chk($('passwd')))$('passwd').set('value','');
		if($chk($('passwd2')))$('passwd2').set('value','');
		if(!$chk(this.mode)) this.mode = this.modes.alta;
		if(!$chk(this.tipoCliente)) this.tipoCliente = this.tiposCliente.particular;

		//Registro de datos iniciales para comprobar variaciones con el resultado final.
		if(this.mode == this.modes.modificacion) {
			this.originalValues.email = $('email').get('value').toLowerCase();
		}
		//Control inicial de checks
		//Todo: esto tiene que venir inicializado de otra forma en el caso de modificación.
		if(this.mode == this.modes.alta) {
			if($('empresasi').get('checked') == false && $('empresano').get('checked') == false) {
				$('empresano').set('checked', true);
			}
			if($('empresano').get('checked') == true || (
				$('mismaDireccionFiscalNo').get('checked') == false &&
				$('mismaDireccionFiscalSi').get('checked') == false
				)
			) {
				$('mismaDireccionFiscalSi').set('checked', true);
			}
		} else {

			if(
				this.tipoCliente != this.tiposCliente.particular &&
				!this.isMismaDireccionContactoFiscal()
			){
				$('mismaDireccionFiscalNo').set('checked', true);
			}

			if(
				this.tipoCliente == this.tiposCliente.particular || (
				$('mismaDireccionFiscalNo').get('checked') == false &&
				$('mismaDireccionFiscalSi').get('checked') == false
				)
			) {
				$('mismaDireccionFiscalSi').set('checked', true);
			}
		}

		//Ayudas gráficas de usabilidad.
		new TexAreaMaxLength ($('direccion'), 250, $('notifDireccionSize'));
		new TexAreaMaxLength ($('direccionFiscal'), 250, $('notifDireccionFiscalSize'));
		new FielsetUtility();
		this.asignarEventos();
		this.crearFormCheck();

		//Comprobación inicial de dirección de envío.
		this.controlCapasVisibles();

		this.seleccionPais('idPais', true);
		this.seleccionPais('idPaisFiscal', true);
		this.asignarNombreApellidos();
		this.asignarFechaNacimiento();
	},
		

	asignarEventos: function() {
        //Comprobaciones y carga de datos asociados al NIF/CIF
		$('CIF').addEvent('change', function() {
			MantenimientoCliente.asignarDatosClientePorCIF();
		});
		$('NIF').addEvent('change', function() {
			MantenimientoCliente.comprobarNIFExistente();
		});
		
		
		$('ddNacimiento').addEvent('change', function() {
			MantenimientoCliente.asignarFechaNacimiento();
		});
		$('mmNacimiento').addEvent('change', function() {
			MantenimientoCliente.asignarFechaNacimiento();
		});
		$('yyNacimiento').addEvent('change', function() {
			MantenimientoCliente.asignarFechaNacimiento();
		});
		

		$('email').addEvent('change', function() {
			MantenimientoCliente.comprobarEmailExistente();
		});

		$$('#empresasi, #empresano, #mismaDireccionFiscalSi, #mismaDireccionFiscalNo').each(function(elem, index) {
			elem.addEvent('click', function() {
				if(elem.get('id') == 'empresasi') {
					MantenimientoCliente.tipoCliente = MantenimientoCliente.tiposCliente.empresa;
				} else if(elem.get('id') == 'empresano') {
					MantenimientoCliente.tipoCliente = MantenimientoCliente.tiposCliente.particular;
				}
				MantenimientoCliente.controlCapasVisibles();
			});
		});

		$$('#mismaDireccionFiscalSi, #mismaDireccionFiscalNo').each(function(elem, index) {
			elem.addEvent('click', function() {
				MantenimientoCliente.comprobarAsignacionDatosDireccion(true);
			});
		});

		$$('#idPaisFiscal, #idPais').each(function(elem, index) {
			elem.addEvent('change', function() {
				MantenimientoCliente.seleccionPais(this.get('id'));
				MantenimientoCliente.comprobarAsignacionDatosDireccion();
			});
		});

		$$('#btnBuscarLocalidad, #btnBuscarLocalidadFiscal').each(function(elem, index) {
			elem.addEvent('click', function() {
				MantenimientoCliente.buscarLocalidad(this.get('id'));
			});
		});

		if(this.mode == this.modes.alta) {
			$('btnAltaCliente').addEvent('click', function(event){
				MantenimientoCliente.validaYEnvia(MantenimientoCliente.acciones.ALTA, event);
			});
		} else {
			$('btnModificarCliente').addEvent('click', function(event){        			   
				MantenimientoCliente.validaYEnvia(MantenimientoCliente.acciones.MODIFICA, event);
			});
		}

		if($('enlacePassword')) {
			$('enlacePassword').addEvent('click', function(){
				MantenimientoCliente.activarCambioPassword();
			});
		}
	},

	/**
	* Asigna los literales internacionalizados para cada error, crea las funciones especificas de validación
	* e inicializa el objeto formCheck.
	*/
	crearFormCheck: function(MODIFICACION) {
	
	       var isModificacion = (MODIFICACION && MODIFICACION == MantenimientoCliente.acciones.MODIFICA)
	
        /*Inicio de funciones de validación para FormCheck*/
        MantenimientoCliente.validarDocumento = function (doc) {
        	//Returns: 1 = NIF ok, 2 = CIF ok, 3 = NIE ok, -1 = NIF bad, -2 = CIF bad, -3 = NIE bad, 0 = ??? bad
        	var doc = doc.toUpperCase();
        	var num = new Array();
        	for (i = 0; i < 9; i ++){
        		num[i] = doc.substr(i, 1);
        	}
        	var regular = new RegExp("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)");
        	//si no tiene un formato valido devuelve error
        	if (!regular.exec(doc)){
        		return 0;
        	}

        	//comprobacion de NIFs estandar
        	regular = new RegExp('(^[0-9]{8}[A-Z]{1}$)');
        	if (regular.exec(doc)){
        		cadena = "TRWAGMYFPDXBNJZSQVHLCKE";
        		if (num[8] == cadena.substr(doc.substr(0, 8) % 23, 1))
        			return 1;
        		else
        			return -1;
        	}

        	//algoritmo para comprobacion de codigos tipo CIF
        	suma = num[2]*1 + num[4]*1 + num[6]*1;
        	for (i = 1; i < 8; i += 2) {
        		cadena = new String(2 * num[i]);
        		suma += cadena.substr(0,1)*1 + cadena.substr(1,1)*1;
        	}
        	sum = new String(suma);
        	n = new String(10 - sum.substr(sum.length - 1, 1));

        	//comprobacion de NIFs especiales (se calculan como CIFs)
        	regular = new RegExp('^[KLM]{1}');
        	if (regular.exec(doc)) {
        		if (num[8] == String.fromCharCode(64 + n))
        			return 1;
        		else
        			return -1;
        	}

        	//comprobacion de CIFs
        	regular = new RegExp('^[ABCDEFGHJNPQRSUVW]{1}');
        	if (regular.exec(doc)) {
        		if (num[8] == String.fromCharCode(64 + n) || num[8] == n.substr(n.length - 1, 1))
        			return 2;
        		else
        			return -2;
        	}

        	//comprobacion de NIEs
        	//T
        	regular = new RegExp('^[T]{1}');
        	if (regular.exec(doc)) {
        		regular = new RegExp('^[T]{1}[A-Z0-9]{8}$');
        		if (num[8] == regular.exec(doc))
        			return 3;
        		else
        			return -3;
        	}

        	//XYZ
        	regular = new RegExp('^[XYZ]{1}');
        	if (regular.exec(doc)) {
        		cadena1 = 'TRWAGMYFPDXBNJZSQVHLCKE';
        		//cadena2 = str_replace('X','0', doc);
        		//cadena2 = str_replace('Y','1', cadena2);
        		//cadena2 = str_replace('Z','2', cadena2);
        		cadena2 = doc.replace('X','0');
        		cadena2 = cadena2.replace('Y','1');
        		cadena2 = cadena2.replace('Z','2');
        		if (num[8] == cadena1.substr( cadena2.substr(0, 8) % 23, 1))
        			return 3;
        		else
        			return -3;
        	}
        	//si todavia no se ha verificado devuelve error
        	return 0;
        };


        MantenimientoCliente.checkCIF_NIF_NIE = function (el, isCIF, isNIF) {
        	if($('idPaisFiscal').get('value') != MantenimientoCliente.fields.ID_PAIS_ESPAGNA) return true;
        	else {
        	
        	  if(!isModificacion){
                if(!$chk(el) ) return true;
            			el.value = el.value.trim();
            		if(el.value.length == 0) {
            					el.errors.push(this.formCheck.options.alerts.required);
            					el.forceErrorNotif = true;
            					return false;
                }
                if(el.value.length != 9) {
                    var mensCIFNIF = (isCIF)?MantenimientoCliente.messages.CIF_INCORRECTO:MantenimientoCliente.messages.NIF_INCORRECTO;
          					el.errors.push(mensCIFNIF);
          					el.forceErrorNotif = true;
          					return false;
            		}		                		
            
        				var result = MantenimientoCliente.validarDocumento(el.value);				
        				if(isCIF && result == 2) return true;
                else if(isNIF && (result == 1 || result == 3)) return true;
            		else {            								  
            				  var mensCIFNIF = (isCIF)?MantenimientoCliente.messages.CIF_INCORRECTO:MantenimientoCliente.messages.NIF_INCORRECTO;                              				    
            				  el.errors.push(''+mensCIFNIF+'<br/>' +
                            					'<a href="javascript://" class="natural close"' +
                            					'onMouseDown="javascript:MantenimientoCliente.remove_validar_documento()">' +
                            					'Pinche aquí si esta seguro de que es correcto e intente guardar sus datos de nuevo.</a>');				  		
                      if(MantenimientoCliente.validarFormatoNIFCIF== MantenimientoCliente.fields.AFIRMATIVO){   		                          									
            					   el.forceErrorNotif = true;
            					   return false;
            					}else{
            					   el.forceErrorNotif = false;
            					   return true;
                      }
            					
                }
              }                
            }
        }
        
        MantenimientoCliente.checkNIF_NIE = function (el) {
        	MantenimientoCliente.checkCIF_NIF_NIE(el, false, true);
        };
        MantenimientoCliente.checkCIF = function (el) {
        	MantenimientoCliente.checkCIF_NIF_NIE(el, true, false);
        };
        MantenimientoCliente.remove_validar_documento = function(event){
          if($('CIF').validation){            
            $('CIF').validation.erase('%MantenimientoCliente.checkCIF');            
          }else{            
            $('NIF').validation.erase('%MantenimientoCliente.checkNIF_NIE');          
          }              		          	
          MantenimientoCliente.validarFormatoNIFCIF = MantenimientoCliente.fields.NEGATIVO;
    			MantenimientoCliente.formCheck.validateFormNow(event);
    		};
        

    		/*Fin de funciones de validación para FormCheck*/
    
    		//Creo y asigno el validador del formulario.
    		this.formCheck = new FormCheck(MantenimientoCliente.formName,{
    			display : {
                    showErrors: 0,
    				addClassErrorToField: 1,
    				//keepFocusOnError: 1,
    				titlesInsteadNames: 1
    			}
    		});
	},
		
	
	validarFecha: function(valor) {  	
  	var expreg = new RegExp ('^([0][1-9]|[12][0-9]|3[01])(/|-)(0[1-9]|1[012])\2(\d{4})$');
  	//if (expreg.test(el.value) == false) {
  	if (valor.match(/^(0[1-9]|[1-2]\d|3[0-1])\/(0[1-9]|1[0-2])\/([1-2][0,8,9]\d\d)$/) == false) {
  		//el.errors.push(this.options.alerts.date);  		
  		return false;  		
  	}
  	try {
  		var fecha = valor;
  		var dia = fecha.split('/')[0];
  		var mes = fecha.split('/')[1];
  		var anio = fecha.split('/')[2];
  		var fechaDate = new Date(anio, (mes.toInt() - 1),dia);
  		if(//Comprobación de fecha válida
  			dia != fechaDate.getDate() ||
  			mes != (fechaDate.getMonth()+1) ||
  			anio != fechaDate.getFullYear()
  		) {
  			//el.errors.push(this.options.alerts.date);  			
  			return false;
  		}
  	} catch(error) {
  		//el.errors.push(this.options.alerts.date);  		
  		return false;
  	}
  	return true;
  },

	
	/**
	* Comprueba que se haya introducido un valor no vacío en el campo CIF y comprueba en servidor los datos relacionados
	* con este valor.
	* En caso de encontrar un cliente con este CIF, asigna los datos a los campos de dirección Fiscal, en caso de tener
	* seleccionada la opción de Misma Dirección, se asignan estos valores a los campos de dirección de Envío.
	*/
	asignarDatosClientePorCIF: function() {
		var notif = $('notifDatosCliente');
		try {
			//ocultarCapa('capaMsgErrorEscrito');
			var cif = $('CIF').get('value').trim();
			notif.removeClass('dataOk');
			if(cif == '') return;
			notif.addClass('waitFieldOn');
			jsonrpc = new JSONRpcClient("/JSON-RPC");
			// Call a Java method on the server
			jsonrpc.RPCAuxCliente.obtenerDatosCliente(function(datosCliente, exception){
				if($chk(exception)) {
					//En caso de error no es necesario notificar nada al cliente ya que el no puede resolver nada.
					//Si rellena datos distintos para una empresa ya esistente... estos sobreescribirán a las actuales como
					//si se tratase de una modificación.
				}
				if($chk(datosCliente)) {
					//Al cargar los datos de la empresa hemos asignado al contacto los mismos que los fiscales.
					//Para evitar que se modifiquen los de la empresa de forma innecesaria, marcamos la opción de
					//direcciones distintas.
					$('mismaDireccionFiscalNo').set('checked', true);
					MantenimientoCliente.controlCapasVisibles();

					$('CIF').set('value',datosCliente.dniCif);
					$('direccionFiscal').set('value',datosCliente.direccion);
					$('idPaisFiscal').set('value',datosCliente.codPais);
					MantenimientoCliente.seleccionPais('idPaisFiscal');
					$('provinciaFiscal').set('value',datosCliente.provincia);
					$('localidadFiscal').set('value',datosCliente.ciudad);
					$('codigoPostalFiscal').set('value',datosCliente.codPostal);
					$('razonSocial').set('value',datosCliente.nombre);
                    MantenimientoCliente.comprobarAsignacionDatosDireccion();
                    notif.addClass('dataOk');
					notif.removeClass.delay(1000, notif, 'dataOk');
				}
				notif.removeClass('waitFieldOn');
			}, cif);

		} catch(e) {
			notif.removeClass('waitFieldOn');
			//En caso de error no es necesario notificar nada al cliente ya que el no puede resolver nada.
			//Si rellena datos distintos para una empresa ya esistente... estos sobreescribirán a las actuales como
			//si se tratase de una modificación.
		}
	},

    /**
	* Comprueba si existe un usuario con el NIF indicado.
	*/
	comprobarNIFExistente: function() {
		var notif = $('notifNIFExistente');
		try {
			//ocultarCapa('capaMsgErrorEscrito');
			var nif = $('NIF').get('value').trim();
			notif.removeClass('dataOk');
			if(nif == '') return;
			notif.addClass('waitFieldOn');
			jsonrpc = new JSONRpcClient("/JSON-RPC");
			// Call a Java method on the server
			jsonrpc.RPCAuxCliente.isNIFExistente(function(existe, exception){
				if($chk(exception)){
					//En caso de error durante la comprobación del NIF no notificamos nada.
					//La comprobación se realizará en servidor posteriormente.
				}
				if($chk(existe) && existe == true) {
				    Portal.showError(MantenimientoCliente.messages.ERROR_NIF_YA_EXISTENTE);
				} else {
					notif.addClass('dataOk');
					notif.removeClass.delay(1000, notif, 'dataOk');
				}
				notif.removeClass('waitFieldOn');
			},nif);
		} catch(e) {
			notif.removeClass('waitFieldOn');
			//En caso de error durante la comprobación del NIF no notificamos nada.
			//La comprobación se realizará en servidor posteriormente.
		}
	},

	/**
	* Comprueba si existe un usuario con el NIF indicado.
	*/
	comprobarEmailExistente: function() {
		var notif = $('notifEmailExistente');
		try {
			//ocultarCapa('capaMsgErrorEscrito');
			var email = $('email').get('value').trim();
			notif.removeClass('dataOk');
			if(email == '') return;
			if(
				MantenimientoCliente.mode == MantenimientoCliente.modes.modificacion &&
				email.toLowerCase() == MantenimientoCliente.originalValues.email
			) return;
            notif.addClass('waitFieldOn');
			jsonrpc = new JSONRpcClient("/JSON-RPC");
			// Call a Java method on the server
			jsonrpc.RPCAuxCliente.isEmailExistente(function(existe, exception){
				if($chk(exception)) {
					//En caso de error durante la comprobación del Email no notificamos nada.
					//La comprobación se realizará en servidor posteriormente.
				}
				if($chk(existe) && existe == true) {
					Portal.showError(MantenimientoCliente.messages.ERROR_MAIL_YA_EXISTE);
				} else {
					notif.addClass('dataOk');
					notif.removeClass.delay(1000, notif, 'dataOk');
				}
				notif.removeClass('waitFieldOn');
			},email);

		} catch(e) {
			notif.removeClass('waitFieldOn');
			//En caso de error durante la comprobación del Email no notificamos nada.
			//La comprobación se realizará en servidor posteriormente.
		}
	},

	/**
	 * Este método se encarga de transformar los datos de nombre y apellidos en un solo campo en una presentación en
	 * tres campos.
	 * La intenición es que este método desaparezca cuando ya esté asumida la funcionalidad de nombre y apellidos separados.
	 */
	 asignarNombreApellidos: function() {
			var objNombreC = 	this.formActivo.nombre_contacto;
			var objApellido1C =	this.formActivo.apellido1Contacto;
			var objApellido2C =	this.formActivo.apellido2Contacto;
			var objNombre = 	this.formActivo.nombre;
			var objApellido1 =	this.formActivo.apellido1;
			var objApellido2 =	this.formActivo.apellido2;
            var nombre = MantenimientoCliente.namesTemp.nombre;
            var apellido1 = MantenimientoCliente.namesTemp.apellido1;
            var apellido2 = MantenimientoCliente.namesTemp.apellido2;
            var nombreC = MantenimientoCliente.namesTemp.nombreC;
            var apellido1C = MantenimientoCliente.namesTemp.apellido1C;
            var apellido2C = MantenimientoCliente.namesTemp.apellido2C;

		if(objNombre && objApellido1 && objApellido2) {
			if(nombre.length > 14) {
				var posicion = nombre.indexOf(' ');
				if(posicion > 14 || posicion == -1) posicion = 14;
				apellido1 = (nombre.substring(posicion, nombre.length) + apellido1).trim();
				nombre = nombre.substring(0, posicion).trim();
			}
			if(apellido1.length > 12) {
				var posicion = apellido1.indexOf(' ');
				if(posicion > 12 || posicion == -1) posicion = 12;
				apellido2 = (apellido1.substring(posicion, apellido1.length) + apellido2).trim();
				apellido1 = apellido1.substring(0, posicion).trim();
			}
			if(apellido2.length > 12) {
				apellido2 = apellido2.substring(0, 12);
				//mostrarErrorEscrito("Error al asignar sus datos a los campos Nombre, Primer Apellido y Segundo Apellido. <br>Por favor, revise estos campos antes de continuar.");
			}
			objNombre.value = nombre.trim();
			objApellido1.value = apellido1.trim();
			objApellido2.value = apellido2.trim();
		}

		if(objNombreC && objApellido1C && objApellido2C) {
			if(nombreC.length > 14 || posicion == -1) {
				var posicion = nombreC.indexOf(' ');
				if(posicion > 14) posicion = 14;
				apellido1C = (nombreC.substring(posicion, nombreC.length) + apellido1C).trim();
				nombreC = nombreC.substring(0, posicion).trim();
			}

			if(apellido1C.length > 12) {
				var posicion = apellido1C.indexOf(' ');
				if(posicion > 12 || posicion == -1) posicion = 12;
				apellido2C = (apellido1C.substring(posicion, apellido1C.length) + apellido2C).trim();
				apellido1C = apellido1C.substring(0, posicion).trim();
			}
			if(apellido2C.length > 12) {
				apellido2C = apellido2C.substring(0, 12);
				//mostrarErrorEscrito("Error al asignar sus datos a los campos Nombre, Primer Apellido y Segundo Apellido. <br>Por favor, revise estos campos antes de continuar.");
			}
			objNombreC.value = nombreC.trim();
			objApellido1C.value = apellido1C.trim();
			objApellido2C.value = apellido2C.trim();
		}
	},

	/**
	 * Revisa la selección del usuario de utilizar la misma dirección de facturación y envío.
	 * En caso de tener seleccionado Misma Dirección asigna los datos de Fiscal a Envío, en caso contrario, limpia los
	 * datos de dirección de Envío y asigna solo el país de Facturacción a Envío.
	 */
	comprobarAsignacionDatosDireccion: function(limpiar) {

		if(
			MantenimientoCliente.tipoCliente == MantenimientoCliente.tiposCliente.particular ||
			$('mismaDireccionFiscalSi').get('checked') == true
		) {
			MantenimientoCliente.asignarDatosContactoAFiscal();
		} else if(limpiar){
			MantenimientoCliente.limpiarDireccionFiscal();
		}
		$('direccionFiscal').fireEvent('keydown');
		$('direccionFiscal').fireEvent('keyup');
		$('direccion').fireEvent('keydown');
		$('direccion').fireEvent('keyup');
	},

	/**
	* Este metodo se encarga de validar si los datos rellenos el los campos de país, provincia, localidad, código postal,
	* dirección y sus homólogos para dirección fical son equivalentes.
	*/
	isMismaDireccionContactoFiscal: function() {
		var fnt = function(idA, idB) {
			return $(idA).get('value').trim().toLowerCase() == $(idB).get('value').trim().toLowerCase();
		};
		return (
			fnt('idPais','idPaisFiscal') &&
			fnt('provincia','provinciaFiscal') &&
			fnt('localidad','localidadFiscal') &&
			fnt('codigoPostal','codigoPostalFiscal') &&
			fnt('direccion','direccionFiscal')
		);
	},
	/**
	* Asigna todos los datos de dirección de factura a los datos de dirección de envío de factura.
	*/
	asignarDatosContactoAFiscal: function() {
		if(MantenimientoCliente.tipoCliente == MantenimientoCliente.tiposCliente.particular) {
			$('nombre_contacto').set('value', $('nombre').get('value'));
			$('apellido1Contacto').set('value', $('apellido1').get('value'));
			$('apellido2Contacto').set('value', $('apellido2').get('value'));
		}
		$('direccionFiscal').set('value', $('direccion').get('value'));
		$('idPaisFiscal').set('value', $('idPais').get('value'));
		MantenimientoCliente.seleccionPais('idPaisFiscal');
		$('provinciaFiscal').set('value', $('provincia').get('value'));
		$('localidadFiscal').set('value', $('localidad').get('value'));
		$('codigoPostalFiscal').set('value', $('codigoPostal').get('value'));
		MantenimientoCliente.localidadFiscal = MantenimientoCliente.localidad;
	},

	/**
	* Limpia la información de dirección de envío de factura dejando asignado el país que tengamos en la dirección de factura.
	*/
	limpiarDireccionFiscal: function() {
		return;
		$('direccionFiscal').set('value', '');
		$('idPaisFiscal').set('value', $('idPais').get('value'));
		$('provinciaFiscal').set('value', '');
		$('localidadFiscal').set('value', '');
		$('codigoPostalFiscal').set('value', '');
	},

	/**
	* Controla la visualización de los campos de contraseña.
	*/
	activarCambioPassword: function(event) {
		if(event) new Event(event).stop();
		if($('divOldPasswd'))$('divEnlacePassword').addClass('hide');
		if($('divOldPasswd'))$('divOldPasswd').removeClass('hide');
		if($('divNewPasswd'))$('divNewPasswd').removeClass('hide');
		MantenimientoCliente.formCheck.formcheckRegister('passwdOld', 		"validate['required']");
		MantenimientoCliente.formCheck.formcheckRegister('passwd', 		"validate['required','length[6,-1]']");
		MantenimientoCliente.formCheck.formcheckRegister('passwd2', 		"validate['confirm[passwd]']");
	},

	/**
	 * De momento este método solo controla la visivilidad de las capas de dirección de envio de factura.
	 */
	controlCapasVisibles: function() {
		if(MantenimientoCliente.tipoCliente == MantenimientoCliente.tiposCliente.empresa) {
			$$('.personaJuridica').each(function(capa, index){
				capa.removeClass('hide');
			});
			$$('.personaFisica').each(function(capa, index){
				capa.addClass('hide');
			});
			$('capaDireccionFiscal').removeClass('hide');
			if($('mismaDireccionFiscalNo').get('checked') == true) {
				//Mostrar la dirección Fiscal.
				$('direccionFiscalDistinta').removeClass('hide');
			} else {
				//Ocultar dirección Fiscal
				$('mismaDireccionFiscalSi').set('checked', true);
				$('direccionFiscalDistinta').addClass('hide');
			}
		} else {
			$$('.personaJuridica').each(function(capa, index){
				capa.addClass('hide');
			});
			$$('.personaFisica').each(function(capa, index){
				capa.removeClass('hide');
			});
			//Ocultar dirección Fiscal
			$('capaDireccionFiscal').addClass('hide');
		}
		// Cada vez que cambiemos la visivilidad de los elementos hemos de alterar su validación para evitar mostrar
		// errores sobre elementos ocultos o no accesibles por el usuario.
		this.controlValidacionPorVisibilidad();
	},

	/**
	 * Este método asigna o elimina las validaciones de los elementos del formulario según su estado y visualización.
	 * Básicamente se encarga de los campos que se muestran dinámicamente según se trate de una persona física o empresa
	 * o si se ha seleccionado "Misma dirección" o no.
	 */
	controlValidacionPorVisibilidad: function() {
	   
		if(MantenimientoCliente.tipoCliente == MantenimientoCliente.tiposCliente.empresa) {
			//Quitar de la validación el NIF, nombre, apellido1 y apellido2			
			MantenimientoCliente.formCheck.formcheckDispose('NIF', 		"validate['%MantenimientoCliente.checkNIF_NIE']");			
			MantenimientoCliente.formCheck.formcheckDispose('nombre', 	"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('apellido1',	"validate['required']");			
			MantenimientoCliente.formCheck.formcheckDispose('tratamiento',	"validate['required']");			
			MantenimientoCliente.formCheck.formcheckDispose('ddNacimiento',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('mmNacimiento',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('yyNacimiento',	"validate['required']");

			//Añadir a la validación el CIF, razonSocial, nombre_contacto, apellido1Contacto y apellido2Contacto
			MantenimientoCliente.formCheck.formcheckRegister('CIF', 				"validate['%MantenimientoCliente.checkCIF']");
			MantenimientoCliente.formCheck.formcheckRegister('razonSocial', 		"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('nombre_contacto', 	"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('apellido1Contacto',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('tratamientoContacto',	"validate['required']");
						
		} else {
          		
			//Añadir a la validación el NIF, nombre, apellido1 y apellido2
			
			MantenimientoCliente.formCheck.formcheckRegister('NIF', 		"validate['%MantenimientoCliente.checkNIF_NIE']");
			MantenimientoCliente.formCheck.formcheckRegister('nombre', 	"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('apellido1',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('tratamiento',	"validate['required']");			
			MantenimientoCliente.formCheck.formcheckRegister('ddNacimiento',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('mmNacimiento',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('yyNacimiento',	"validate['required']");

			//Quitar de la validación el CIF, razonSocial, nombre_contacto, apellido1Contacto y apellido2Contacto
			MantenimientoCliente.formCheck.formcheckDispose('CIF', 				"validate['%MantenimientoCliente.checkCIF']");
			MantenimientoCliente.formCheck.formcheckDispose('razonSocial', 		"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('nombre_contacto', 	"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('apellido1Contacto',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('tratamientoContacto',	"validate['required']");
		}
		if(MantenimientoCliente.tipoCliente == MantenimientoCliente.tiposCliente.empresa && $('mismaDireccionFiscalNo').get('checked') == true) {
			//Añadir a la validación direccionFiscal, idPaisFiscal, provinciaFiscal, localidadFiscal y codigoPostalFiscal
			MantenimientoCliente.formCheck.formcheckRegister('direccionFiscal',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('idPaisFiscal',		"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('provinciaFiscal',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('localidadFiscal',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckRegister('codigoPostalFiscal',"validate['required']");
		} else {
			//Quitar de la validación direccionFiscal, idPaisFiscal, provinciaFiscal, localidadFiscal y codigoPostalFiscal
      MantenimientoCliente.formCheck.formcheckDispose('direccionFiscal',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('idPaisFiscal',		"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('provinciaFiscal',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('localidadFiscal',	"validate['required']");
			MantenimientoCliente.formCheck.formcheckDispose('codigoPostalFiscal',"validate['required']");
		}
	},
		
	asignarFechaNacimiento: function() {
		
			var dd = $('ddNacimiento').get('value');
	    var mm = $('mmNacimiento').get('value');
    	var yy = $('yyNacimiento').get('value');


    	if(
    		(dd && dd != '') &&
    		(mm && mm != '') &&
    		(yy && yy != '') )
    	{    		    		 
        var valor = dd + '/' + mm + '/' + yy;    		
    		var resultado = MantenimientoCliente.validarFecha(valor);
    		if(!resultado){
          $('ddNacimiento').set('value', '');
          valor='';          
        }            		
        $('fecNacimiento').set('value', valor);
    	} else {
      
        var valorFechaNacimiento = $('fecNacimiento').get('value');  
    	  if(valorFechaNacimiento!="" && valorFechaNacimiento!="01/01/1900"){ 
      		var ddmmyy = valorFechaNacimiento.split('/');                    		
      		if(ddmmyy) {      		  
      		  
      		  if(ddmmyy[2]<=1900){
      		      ddmmyy[0] = '';
      		      ddmmyy[1] = '';
      		      ddmmyy[2] = '';          			  
            }
      		                        		
      			if(ddmmyy[0])
      			  $('ddNacimiento').set('value', ddmmyy[0]);     				
      			if(ddmmyy[1])
      			  $('mmNacimiento').set('value', ddmmyy[1]);     				
      			if(ddmmyy[2]){        			        			  
      			  $('yyNacimiento').set('value', ddmmyy[2]);
            }                 				
      		}
      	}
    	}
	},				
	
	asignarValorInfoAdicional: function() {
		$('infoAdicional').set('value', MantenimientoCliente.fields.DESEA_INFO_ADICIONAL_SI);		
    if($('infoAdicionalChk').get('checked') == true){	 	   	 
  	 $('infoAdicional').set('value', MantenimientoCliente.fields.DESEA_INFO_ADICIONAL_NO);
    }         
	},

	/**
	*
	*/
	buscarLocalidad: function(sourceId) {
		var nameAdd = sourceId == 'btnBuscarLocalidadFiscal'? 'Fiscal': '';
		var codPostal = $('codigoPostal' + nameAdd).get('value').trim();
		var localidad = $('localidad' + nameAdd).get('value').trim();
		var provincia = $('provincia' + nameAdd).get('value').trim();
		var notif = $('notifFindLoc' + nameAdd);
		try {
			notif.addClass('waitFieldOn');
			jsonrpc = new JSONRpcClient("/JSON-RPC");
			// Call a Java method on the server
			var localidades = null;
			if(localidad.length > 0 || codPostal.length > 0) {
				localidades = jsonrpc.RPCLocalidad.obtenerDatosLocalidades(provincia, localidad, codPostal);
			}
			if($chk(localidades) && $chk(localidades.list) && localidades.list.length == 1) {
				var locAux = localidades.list[0];
				$('provincia' + nameAdd).set('value', locAux.provincia);
				$('localidad' + nameAdd).set('value', locAux.nombreciudad);
				$('codigoPostal' + nameAdd).set('value', locAux.codpostal);
				eval('MantenimientoCliente.localidad' + nameAdd + '=locAux');
				MantenimientoCliente.comprobarAsignacionDatosDireccion();
				//Hack para IE. En caso contrario no llega a mostrarte la carga.
				notif.removeClass.delay(100, notif, 'waitFieldOn');
				notif.addClass('dataOk');
				notif.removeClass.delay(1000, notif, 'dataOk');
				return true;
			} else {
				if($chk(localidades)) {
					MantenimientoCliente.cache.localidades = localidades.list;
				}
				var initFnt = function () {
					//BusquedaLocalidad.cache.provincias = MantenimientoCliente.cache.provincias;
					BusquedaLocalidad.init(
						provincia,
						localidad,
						codPostal,
						MantenimientoCliente,
						//($chk(localidades) && $chk(localidades.list))? localidades.list: null,
						function (localidad) {
							$('provincia' + nameAdd).set('value', localidad.provincia);
							$('localidad' + nameAdd).set('value', localidad.nombreciudad);
							$('codigoPostal' + nameAdd).set('value', localidad.codpostal);
							eval('MantenimientoCliente.localidad' + nameAdd + '=localidad');
							MantenimientoCliente.comprobarAsignacionDatosDireccion();
						}
					);
				};

				var jsAux = {
					id: 'jsLocalidad',
					path: '/restyling/js/BusquedaLocalidad.js'
				};
				FormHelp.showPopUp(
					'/restyling/jsp/localidad/busquedaLocalidad.jsp',
					'popupDiv',
					'popupDiv',
					true,
					null,
					{
						id: 'jsLocalidad',
						path: '/restyling/js/BusquedaLocalidad.js'
					},
					initFnt
				);
				//Hack para IE. En caso contrario no llega a mostrarte la carga.
				notif.removeClass.delay(100, notif, 'waitFieldOn');
				return false;
			}

		} catch(e) {
			notif.removeClass('waitFieldOn');
			//No lo internacionalizo. En teoría no debería mostrarse nunca.
			Portal.showError("Error inesperado al buscar su localidad.<br>"+
			"Intentelo más tarde o pruebe con otros datos.<br>" +
			"Gracias y disculpe las molestias");
		}

	},

	/**
	* Comprueba el país seleccionado y se encarga de realizar las actualizaciones gráficas necesarias.
	*/
	seleccionPais: function(sourceId, saveValue) {
		var nameAdd = sourceId == 'idPaisFiscal'? 'Fiscal': '';
		var codigoPostal = $('codigoPostal' + nameAdd);
		var provincia = $('provincia' + nameAdd);
		//Tomamos los datos actuales de los campos antes de eliminarlos
		var vCodigoPostal = codigoPostal.get('value');
		var vProvincia = provincia.get('value');
		var tabindexCodigoPostal = codigoPostal.get('tabindex');
		var tabindexProvincia = provincia.get('tabindex');
		var pCodigoPostal = codigoPostal.getParent();
		var pProvincia = provincia.getParent();

		//Eliminamos la validación de los elementos en formcheck y los propios elementos del DOM
		MantenimientoCliente.formCheck.formcheckDispose(codigoPostal.get('id'), "validate['required','digit','length[4,5]']");
		MantenimientoCliente.formCheck.formcheckDispose(provincia.get('id'), "validate['required']");
		codigoPostal.dispose();
		provincia.dispose();
		if($chk( $('btnBuscarLocalidad' + nameAdd) )) {
			$('btnBuscarLocalidad' + nameAdd).dispose();
		}

		if($('idPais' + nameAdd).get('value') == MantenimientoCliente.fields.ID_PAIS_ESPAGNA) {
			codigoPostal = new Element ('input', {
				'type': 'text',
				'id': 'codigoPostal' + nameAdd,
				'name': 'codigoPostal' + nameAdd,
				'maxlength': 5,
				'tabindex': tabindexCodigoPostal,
				'class': "text span-2 validate['required','digit','length[4,5]']"
			});

			provincia = new Element ('select', {
				'id': 'provincia' + nameAdd,
				'name': 'provincia' + nameAdd,
				'tabindex': tabindexProvincia,
				'class': "span-3   validate['required']"
			});

			var button = new Element('input',{
				'id': 'btnBuscarLocalidad' + nameAdd,
				'name': 'btnBuscarLocalidad' + nameAdd,
				'type': 'button',
				'class': 'span-2 button find',
				'value': MantenimientoCliente.messages.BUSCAR_LOCALIDAD,
				'events': {
					'click': function() {
						MantenimientoCliente.buscarLocalidad(this.get('id'));
					}
				}
			});

            //Añadimos los nuevos elementos y validaciones.
			pCodigoPostal.grab(codigoPostal);
			pProvincia.grab(provincia);
			$('btnContainer' + nameAdd).grab(button);
			MantenimientoCliente.formCheck.formcheckRegister('codigoPostal' + nameAdd, "validate['required','digit','length[4,5]']");
			MantenimientoCliente.formCheck.formcheckRegister('provincia' + nameAdd, "validate['required']");
			//Encapsulamos el código en una función para llamarlo de forma asíncrona en caso de no tener cacheadas las provincias.
			var fntRellenarProvincias = function() {
				$('notifPais' + nameAdd).removeClass('waitFieldOn');

				//Quitamos el campo de texto internacional y añadimos el combo nacional.
				var provincia = $('provincia' + nameAdd);
				provincia.grab( new Element('option',{
					'text': MantenimientoCliente.messages.PROVINCIA + '...',
					'value': ''
				}));
				if($chk(MantenimientoCliente.cache.provincias)) {
					MantenimientoCliente.cache.provincias.each(function(optionProvincia, index){
						provincia.grab( new Element('option',{
							'text': optionProvincia.nombre,
							'value': optionProvincia.id
						}));
					});
				}
				//Cambiamos las propiedades del código postal de las internacionales a las nacionales y añadimos el botón buscar localidad.
				codigoPostal.set('value', vCodigoPostal);
				if(saveValue) {
					provincia.set('value', vProvincia);
				}
			}


			try {
				//Si no tenemos los datos de forma previa lanzamos la consulta.
				if(!$chk(MantenimientoCliente.cache.provincias)) {
					$('notifPais' + nameAdd).addClass('waitFieldOn');
					jsonrpc = new JSONRpcClient("/JSON-RPC");
					// Call a Java method on the server
					jsonrpc.RPCLocalidad.obtenerProvincias(function(provincias, exception){
						if($chk(exception)) {
							//No lo internacionalizo. En teoría no debería mostrarse nunca.
							Portal.showError("Error inesperado al obtener las proincias.<br>"+
							"Intentelo más tarde y disculpe las molestias");
						}
						if($chk(provincias)) {
							MantenimientoCliente.cache.provincias = provincias.list;
						}
						fntRellenarProvincias();
					});
				} else {
					fntRellenarProvincias();
				}



			} catch(e) {
				$('notifPais' + nameAdd).removeClass('waitFieldOn');
				//No lo internacionalizo. En teoría no debería mostrarse nunca.
				Portal.showError("Error inesperado al obtener las proincias.<br>"+
				"Intentelo más tarde y disculpe las molestias");
			}

		} else {
			codigoPostal = new Element ('input', {
                'id': 'codigoPostal' + nameAdd,
                'type': 'text',
                'name': 'codigoPostal' + nameAdd,
                'maxlength': 20,
				'tabindex': tabindexCodigoPostal,
                'class': "text span-3"
			});

			provincia = new Element ('input', {
				'type': 'text',
                'id': 'provincia' + nameAdd,
                'name': 'provincia' + nameAdd,
                'tabindex': tabindexProvincia,
                'class': "text span-3 validate['required']"
			});

			pCodigoPostal.grab(codigoPostal);
			pProvincia.grab(provincia);

			codigoPostal.set('value', vCodigoPostal);
			if(saveValue) {
				provincia.set('value', vProvincia);
			}
		}
	},

	validaYEnvia: function(accion, event) {
		if(MantenimientoCliente.valida(accion, event)){
		  MantenimientoCliente.envia(accion, event);
    }
	},
	
	valida: function(accion, event) {
		var validado = true;
		  		
		InputHelp.clearValues();				 
    		
		MantenimientoCliente.controlValidacionPorVisibilidad();		
		MantenimientoCliente.comprobarAsignacionDatosDireccion();
            		
		MantenimientoCliente.crearFormCheck(accion);
  
    	if(MantenimientoCliente.formCheck.validateFormNow(event)) {
    	
    	 MantenimientoCliente.asignarFechaNacimiento();
    	 MantenimientoCliente.asignarValorInfoAdicional();

    		//Comprobamos los datos de localidad existentes
			// Si no se han realizado las búsquedas de localidades simulamos la búsqueda o
			// si tras la búsqueda no se hayan sustituido datos, en caso contrario realizamos nuevamente la búsqueda.
			if(
				$('idPais').get('value') == this.fields.ID_PAIS_ESPAGNA &&
				(
					!$chk(this.localidad) ||
					!$('codigoPostal').get('value') == this.localidad.codpostal ||
					!$('localidad').get('value') == this.localidad.nombreciudad ||
					!$('provincia').get('value') == this.localidad.provincia
				)
			) {
				validado = this.buscarLocalidad('btnBuscarLocalidad');
				if(!validado)  {
					InputHelp.setValues();					
					return false;
				}
			}

			if(
				$('idPaisFiscal').get('value') == this.fields.ID_PAIS_ESPAGNA &&
				(
					!$chk(this.localidadFiscal) ||
					!$('codigoPostalFiscal').get('value') == this.localidadFiscal.codpostal ||
					!$('localidadFiscal').get('value') == this.localidadFiscal.nombreciudad ||
					!$('provinciaFiscal').get('value') == this.localidadFiscal.provincia
				)
			) {
				validado = this.buscarLocalidad('btnBuscarLocalidadFiscal');
				if(!validado) {
					InputHelp.setValues();					
					return false;
				}
			}			
			return validado;			
		} else {
			InputHelp.setValues();
		}		
		return false;
	},
	
		envia: function(accion, event) {		
				MantenimientoCliente.formActivo.action = MantenimientoCliente.actions.REGISTRO_CLIENTE;
				MantenimientoCliente.formActivo.accion.value = accion;
				MantenimientoCliente.formActivo.localidad.disabled = false;
				MantenimientoCliente.formActivo.submit();			
	 }
	
}



window.addEvent('domready', function(){
	MantenimientoCliente.init();  	
	if(ValidarFormularioCliente){	 
	 MantenimientoCliente.valida();
  } 	
});
