/**
 * @author pmedina
 */

/*
 * Objeto conversor multidivisa
 */
function ConversorMultidivisa(){
	
	/**
	 * Moneda por defecto
	 */ 
	this.DIVISA_POR_DEFECTO_CODIGO = 'EUR';
	this.DIVISA_POR_DEFECTO_NOMBRE = 'Euro';
	this.DIVISA_POR_DEFECTO_SIMBOLO = '&euro;';
	this.DIVISA_POR_DEFECTO_FACTOR = 1;

	/**
	 * Moneda actual
	 */
	this.DIVISA_ACTUAL = this.DIVISA_POR_DEFECTO_CODIGO;
	
	/**
	 * Array de objetos Divisa
	 */
	this.arrDivisas = new Array();
	
	/**
	 * Array de nodos de precio
	 */
	this.arrNodosPrecio = new Array();
	
	/**
	 * Contenedor del selector
	 */
	this.selectorContainer = null;
	
	/**
	 * Nodo del selector de divisa
	 */
	this.nodoSelector = null;

	/**
	 * Formato numérico (determinado por el idioma de la aplicación)
	 */
	this.formatoNumerico = 'eu';

	/**
	 * Idioma del web
	 */
	this.idioma;

	/**
	 * Nombre de la cookie que almacena la divisa actual
	 */
	this.cookieDivisaName = 'divisaActual';
	
		
	// Formato europeo. Separador de miles con puntos y de decimales con comas
	//this.REGEX_PRECIO_EU = /\d+(,\d{2})?/;
	// Formato ingles. Separador de miles con comas y de decimales con puntos
	/**
	 * Expresión regular para los nodos de precio
	 */
	this.REGEX_PRECIO = /\d+(.\d+)?/;
}

/**
 * Añade una divisa al conversor
 * @param {String} codigo
 * @param {String} simbolo
 * @param {String} nombre
 * @param {Float} factorConversion
 */
ConversorMultidivisa.prototype.addDivisa = function (codigo, nombre, simbolo, factorConversion){
	var oDivisa = new Divisa(codigo, nombre, simbolo, factorConversion);
	//this.arrDivisas[nombre] = oDivisa;
    this.arrDivisas[codigo] = oDivisa;
}

/**
 * Aplica la conversion a todos los nodos que se le hayan añadido
 * @param {String} sMonedaDestino
 * @param {String} sSetCookie
 */
ConversorMultidivisa.prototype.calculaConversion = function(sMonedaDestino, sSetCookie){
	
	/*
	// Formato numerico para los precios
	this.formatoNumerico =  (this.idioma == 'en') ? 'en' : 'eu';
   	
	// TODO: Obtenemos el valor de la divisa actual desde la cookie. En caso de no existir la cookie, valdrá por defecto EUR
	this.DIVISA_ACTUAL = (this.getDivisaFromCookie()!= null) ? this.getDivisaFromCookie() : this.DIVISA_POR_DEFECTO_CODIGO; 
	
	

	// Recorremos los nodos de precio
	for (var i in this.arrNodosPrecio){
		
		// Nodo actual, Tipo y Valor
		var nodoActual = this.arrNodosPrecio[i].nodo;
		var precioNodo = this.arrNodosPrecio[i].precio;
		
		
		var precioNodoActual = null;
		var factorConversion = null;
		
		// Si convertimos a euros, ya tenemos el precio
		if (sMonedaDestino == this.DIVISA_POR_DEFECTO_CODIGO){
			precioNodoActual = precioNodo;
		}
		// Si convertimos a otra moneda, tenemos que utilizar una "función matemática" exáctamente igual a la que se usaba en las otras versiones...
		else{
			factorConversion = this.arrDivisas[sMonedaDestino].factorConversion;
			precioNodoActual = parseFloat(factorConversion * precioNodo);  
		}
		 
		// Precio formateado
		var sSimbolo = this.arrDivisas[sMonedaDestino].simbolo;
		if(sSimbolo == ''){
			sSimbolo = this.DIVISA_POR_DEFECTO_SIMBOLO;
		}
		
		if(this.formatoNumerico == 'en'){
			sSeparadorMiles = ','
		}else{
			sSeparadorMiles = '.'
		}
		
		this.arrNodosPrecio[i].formattedPrice = this.buildPrettyNumber(precioNodoActual, sSimbolo, 2, sSeparadorMiles);
		
		
		// Ponemos el nuevo valor
	   if(this.arrNodosPrecio[i].nodo.tagName == 'INPUT'){
	      this.arrNodosPrecio[i].nodo.value = this.arrNodosPrecio[i].formattedPrice;
	   }else{
	      this.arrNodosPrecio[i].nodo.innerHTML = this.arrNodosPrecio[i].formattedPrice;
	   }
	}

	// Aqui fijaremos la Cookie de la divisa actual para poder recuperar la divisa en uso en las paginas ulteriores
    if (sSetCookie == "true"){
       this.setCookieDivisa( this.cookieDivisaName, sMonedaDestino);
    }
	
	
	this.DIVISA_ACTUAL = sMonedaDestino;
	*/
}


ConversorMultidivisa.prototype.actualizaNodoPrecio = function(sIdNodo, fNuevoPrecio){
	
	
	// Buscamos el objeto para el nodo especificado
	var oNodoPrecio = this.arrNodosPrecio[sIdNodo];
	if (oNodoPrecio){
		oNodoPrecio.precio = fNuevoPrecio;
	}
	
	this.calculaConversion(this.getDivisaFromCookie(),'true');

	
}

/**
 * Añade un nodo de precio al array de nodos del objeto
 * @param {String} sIdNodo
 */
ConversorMultidivisa.prototype.addNodoPrecio = function (sIdNodo, precio){
	
	// Si el nodo es accesible
	var nodo = document.getElementById(sIdNodo);

	// NOTA. Para los nodos, añadiremos la propiedad monedaActual
	// Lo añadimos al array de nodos
	if (nodo){
	   	this.arrNodosPrecio[sIdNodo] = new Object;
		this.arrNodosPrecio[sIdNodo].nodo = nodo;
		this.arrNodosPrecio[sIdNodo].precio = parseFloat(precio);
	}
	
}

/**
 * Construye un numero decimal bonito a partir de un flotante
 * @param {Object} fNumber numero en flotante
 * @param {Object} iNumDecs numero de decimales
 * @param {Object} sSeparadorMiles separador de miles
 */
ConversorMultidivisa.prototype.buildPrettyNumber = function(fNumber,sSimbolo,iNumDecs,sSeparadorMiles){
	
	
	
	// this.arrNodosPrecio[i].formattedPrice = this.buildPrettyNumber(precioNodoActual, sSimbolo, 2, sSeparadorMiles);
	var charSeparador = sSeparadorMiles;
	var separadorDecimales = '';
	var prefijo = '';
	var sufijo = '';
	
	// Redondeamos los decimales
	sNumero = ''+this.rellenaCeros( this.redondeaDecimales(fNumber,2), 2 );

	// Convertimos el numero a string
	//var sNumero = fNumber.toString();
	
	if (sNumero.indexOf(".")!=-1){
		//si el numero es decimal
		aux = sNumero.split('.');
		parteEntera = aux[0];
		parteDecimal = aux[1];
		
		// Truncamos los decimales al máximo
		//parteDecimal = (parteDecimal.length>iNumDecs) ? parteDecimal.substring(0,iNumDecs) : parteDecimal;
		decimal=true;
	} else {
		decimal=false;
	}
	
	if (parseFloat(parteEntera) >= 1000 || parseFloat(parteEntera) <= -1000) {
			
		var insert_position;

		// Calculate the position of the first comma
		switch (parteEntera.length % 3) {
			case 1 :
				insert_position = 1;
				break;
			case 2 :
				insert_position = 2;
				break;
			case 0 :
				insert_position = 3;
				break
		}
		
		while (insert_position < parteEntera.length) {
			if(this.idioma == 'en'){
				
				parteEntera = parteEntera.left(insert_position) + "," + parteEntera.substring(insert_position);
				
			}else{
				
				parteEntera = parteEntera.left(insert_position) + "." + parteEntera.substring(insert_position);
		
			}
			
			insert_position += 4
		}
	}
	if (this.idioma == 'en'){
		prefijo = sSimbolo+' ';
		separadorDecimales = '.';
			
	}else{
		sufijo = ' '+ sSimbolo;
		separadorDecimales = ',';
	}
	 
	// Si hay parte decimal la concatenamos
	
	if (decimal){
		sNumero = prefijo + parteEntera + separadorDecimales + parteDecimal + sufijo;
	}else{
		sNumero = prefijo + parteEntera + sufijo;
	}
	
	return sNumero;
		
	
}

/**
 * Pinta el selector multidivisa
 * @param {String} sIdContenedorSelector
 */
ConversorMultidivisa.prototype.pintaSelectorDivisa = function(titolDivisa){
	
	var oThis = this;
	
	/******* VERSION CON SELECTS FALSOS *********/
	this.nodoSelector = document.createElement("div");
	this.nodoSelector.className = "fakeSelect";
	
	this.etiqueta = document.createElement("span");
	this.etiqueta.className = "etiqueta";
	this.etiqueta.innerHTML = 'divisa:';
    this.etiqueta.innerHTML = titolDivisa;


    this.container = document.createElement("div");
	this.container.className = "container";
	
	var cajaTexto = document.createElement("div");
	cajaTexto.className = "cajaTexto";
	
	this.textoDivisaActual = document.createElement("a");
	this.textoDivisaActual.href="javascript:void(0)";
	this.textoDivisaActual.onclick = function(){
		oThis.populaSelectorDivisas('true');
	}
    
	this.textoDivisaActual.innerHTML = this.arrDivisas[this.DIVISA_ACTUAL].nombre;

	cajaTexto.appendChild(this.textoDivisaActual);
	
	this.nodoSelector.appendChild(this.etiqueta);
	this.container.appendChild(cajaTexto);
	this.listaDivisas = document.createElement('ul');
	this.listaDivisas.visible = false;
	this.nodoSelector.appendChild(this.container);
	
	// Si ya se ha fijado el container, le añadimos el selector al container
	if (this.selectorContainer){
		this.selectorContainer.appendChild(this.nodoSelector);	
	}
	/********* FIN VERSION SELECTS FALSOS **********/
	
}

/**
 * Popula la capa de divisas disponibles
 * @param {String} sSetCookie
 */
ConversorMultidivisa.prototype.populaSelectorDivisas = function(sSetCookie){
	
	// Si la lista ya ha sido desplegada, la ocultamos
	if(this.listaDivisas.visible == true){
		this.listaDivisas.visible = false;
		this.listaDivisas.style.display = "none";
		return;	
	}
	// Reseteamos el selector
	this.reseteaSelectorDivisas();
	
	var oThis = this;

	for (var i in this.arrDivisas){
        if(this.arrDivisas[i].codigo != this.DIVISA_ACTUAL){
			var divisa = document.createElement("li");
			var textoDivisa = document.createElement("a");
			textoDivisa.href="javascript:void(0)";
            textoDivisa.codigoDivisa = this.arrDivisas[i].codigo;
			textoDivisa.nombreDivisa = this.arrDivisas[i].nombre;
			textoDivisa.onclick = function(){
                oThis.calculaConversion(this.codigoDivisa, sSetCookie);
                oThis.reseteaSelectorDivisas();
				oThis.textoDivisaActual.innerHTML = this.nombreDivisa;
			}
			textoDivisa.innerHTML = this.arrDivisas[i].nombre;
			divisa.appendChild(textoDivisa);
			this.listaDivisas.appendChild(divisa);
		}
	}
	this.container.appendChild(this.listaDivisas);
	
	this.listaDivisas.style.display = "block";
	this.listaDivisas.visible = true;
	
}
/**
 * Truncado de decimales
 * @param {Object} fNumero
 * @param {Object} numDecimales
 */
ConversorMultidivisa.prototype.redondeaDecimales = function(fNumero, numDecimales){
	var result1 = fNumero * Math.pow(10, numDecimales);
	var result2 = Math.round(result1);
	var result3 = result2 / Math.pow(10, numDecimales);
	return (result3);
}

/**
 * Rellena con ceros hasta completar los decimales 
 * @param {Object} valorRedondeado
 * @param {Object} numDecimales
 */
ConversorMultidivisa.prototype.rellenaCeros = function(valorRedondeado, numDecimales){
	var sNumero = valorRedondeado.toString();
	var longitudDecimal;
	
	var indexDecimal = sNumero.indexOf(".")

	if (indexDecimal == -1) {
		longitudDecimal = 0;
		sNumero += numDecimales > 0 ? "." : "";
	}else{
		longitudDecimal = sNumero.length - indexDecimal - 1;
	}
	
	var relleno = numDecimales - longitudDecimal;
	
	if (relleno > 0) {
	
		for (var counter = 1; counter <= relleno; counter++){
			sNumero += "0";
		}
	}
	return sNumero;
}

/**
 * Resetea la capa de divisas disponibles
 */
ConversorMultidivisa.prototype.reseteaSelectorDivisas = function(){
		
	while(this.listaDivisas.childNodes.length > 0){
		this.listaDivisas.removeChild(this.listaDivisas.lastChild);
	}
	this.listaDivisas.style.display = "none";
	this.listaDivisas.visible = false;
}


/**
 * Fija el contenedor del selector multidivisa
 * @param {String} sIdContainer
 */
ConversorMultidivisa.prototype.setContainer = function(sIdContainer){
	// Contenedor del selector
	this.selectorContainer = document.getElementById(sIdContainer);
}


/**
 * Fija el idioma. En el conversor, solo interesa el idioma para los formatos de los numeros
 * Podiamos fijar en este punto formato para los numeros en funcion de los idiomas
 * @param {Object} sIdioma
 */
ConversorMultidivisa.prototype.setIdioma = function(sIdioma){
	
	// Podemos añadir en este punto formato en para otros idiomas
	switch (sIdioma){
		case 'en':
			this.idioma = 'en';
			break;
		default:
			this.idioma = 'eu';		
	}

}

/**
 * Fija la divisa por defecto.
 * @param {Object} sCodigo
 * @param {Object} sNombre
 * @param {Object} sSimbolo
 * @param {Float} fFactor
 */
ConversorMultidivisa.prototype.setDivisaPorDefecto = function(sCodigo, sNombre, sSimbolo, fFactor){
	this.DIVISA_POR_DEFECTO_CODIGO = sCodigo;
	this.DIVISA_POR_DEFECTO_NOMBRE = sNombre;
	this.DIVISA_POR_DEFECTO_SIMBOLO = sSimbolo;
	this.DIVISA_POR_DEFECTO_FACTOR = fFactor;
}

/**
 * Fija la visibilidad del selector
 * @param {boolean} bVisible
 */
ConversorMultidivisa.prototype.setVisible = function (bVisible){
	if (bVisible){
		this.nodoSelector.style.display = "block";
	} else {
		this.nodoSelector.style.display = "none";
	}
}

/**
 * Actualiza todos los nodos de precio. Metodo desencadenado en el onchange de selectores de tipo de alojamiento y regimen
 * @param {String} sSetCookie
 */
ConversorMultidivisa.prototype.actualizaNodosPrecio = function (sSetCookie){

	// Guardamos la divisa en uso
//	var divisaEnUso = this.DIVISA_ACTUAL;
	// Los selectores siempre guardan el precio en euro
//	this.DIVISA_ACTUAL = this.DIVISA_POR_DEFECTO_CODIGO;
	// Calculamos la conversion
//	this.calculaConversion(divisaEnUso, sSetCookie);
	// Fijamos la divisa actual a la divisa en la que trabajabamos
//	this.DIVISA_ACTUAL = divisaEnUso;	
	// Fijamos la divisa en el selector
//	this.textoDivisaActual.innerHTML = this.arrDivisas[this.DIVISA_ACTUAL].nombre;

}

/**
 * Fija una cookie para la divisa en uso con el valor de la ultima divisa seleccionada
 * @param {Object} sName
 * @param {Object} sValue
 * @param {Object} oExpires
 * @param {Object} sPath
 * @param {Object} sDomain
 * @param {Object} bSecure
 */
ConversorMultidivisa.prototype.setCookieDivisa = function(sName, sValue, oExpires, sPath, sDomain, bSecure){

	var sCookie = sName + "=" + sValue;
	if(oExpires){
		sCookie += "; expires='" + oExpires+"'";
	}
	if(sPath){
		sCookie += "; path=" + sPath;
	}
	if(sDomain){
		sCookie += "; domain=" + sDomain;
	}
	if(bSecure){
		sCookie += "; secure=";
	}

	document.cookie = sCookie;

}

/**
 * Obtiene el valor de la divisa en uso de la cookie
 */
ConversorMultidivisa.prototype.getDivisaFromCookie= function(){
	
	var sRE = "(?:; )?"+ this.cookieDivisaName + "=([^;]*);?";
	var oRE = new RegExp(sRE);
	
	if (oRE.test(document.cookie)){
		return (RegExp["$1"]);
	}else{
		return null;
	}

}

/**
 *	Fija la divisa actual (por si la cogemos de una cookie...)
 */
ConversorMultidivisa.prototype.setDivisaActual = function (sDivisa){
	this.DIVISA_ACTUAL = sDivisa;
	this.textoDivisaActual.innerHTML = this.arrDivisas[this.DIVISA_ACTUAL].nombre;
}


/**
 * Objeto que representa una divisa
 * El factor de conversionn es siempre respecto a la moneda por defecto
 * @param {String} codigo
 * @param {String} nombre
 * @param {String} simbolo
 * @param {Float} factorConversion
 */
function Divisa(codigo, nombre, simbolo, factorConversion){
	this.codigo = codigo;
	this.simbolo = simbolo;
	this.nombre = nombre;
	this.factorConversion = factorConversion;
}

function extractLeft(total_chars) {
	return this.substring(0, total_chars)
}

/**
 * Extension para string
 */
String.prototype.left = extractLeft;


