var CurrencyConverter = function (objConfig){
	
	var that = this;
	
	this._iRequestID = 0;
	this._iUID = Math.floor(Math.random()*1000);

	this._objConfig = objConfig || {};
	
	if(!this._objConfig.key)
		this._objConfig.key = 'default';
		
	if(!this._objConfig.serviceURL)
		this._objConfig.serviceURL = 'http://www.terra.com.ar/invertia/jsapi/index.php';
		
	if(!this._objConfig.buttonConvert)
		this._objConfig.buttonConvert = 'CurrencyConverter_buttonConvert';
		
	if(!this._objConfig.inputFrom)
		this._objConfig.inputFrom = 'CurrencyConverter_inputFrom';
		
	if(!this._objConfig.inputTo)
		this._objConfig.inputTo = 'CurrencyConverter_inputTo';
		
	if(!this._objConfig.inputAmount)
		this._objConfig.inputAmount = 'CurrencyConverter_inputAmount';
		
	if(!this._objConfig.outputResult)
		this._objConfig.outputResult = 'CurrencyConverter_outputResult';

	this._RPCCall = function (strMethod, arrParams) {
		
		var strVarname = 'response_'+this._iUID+'_'+this._iRequestID;
		var arrParams = arrParams || [];
		arrParams.unshift(this._objConfig.key);
		var strRequest = [	'{id:',
							this._iRequestID,
							',method:"',
							strMethod,
							'",params:["',
							arrParams.join('","'),
							'"]}' ].join('');
		
		var objContext = {
			url:	this._objConfig.serviceURL+'?'+[
					's=currencyconverter',
					'v='+strVarname,
					'r='+strRequest ].join('&'),
			handle: this['_handler_'+strMethod],
			timeoutSeconds: 5,
			checkString: strVarname
		}
		
		ScriptSrcTransport.removeScripts();
		ScriptSrcTransport.bind(objContext);
		
		this._iRequestID++;
	};
		
	this._handler_getCurrencies = function (strType, objData, objEvent) {
		var funcShowError = function (strMessage) {
			alert("No se pudo inicializar el Conversor de Monedas.\n"+(strMessage || "Intente luego"));
		};
		switch(strType){
			case 'load':
				if(objEvent.error){
					funcShowError('Request Error');
				}else{
					var objSelectFrom	= document.getElementById(that._objConfig.inputFrom);
					var objSelectTo 	= document.getElementById(that._objConfig.inputTo);
					objSelectFrom.innerHTML = objSelectTo.innerHTML = '';
					var objOptionFrom	= document.createElement('option');
					var objOptionTo		= document.createElement('option');
					objOptionFrom.innerHTML = objOptionTo.innerHTML = 'Seleccione...';
					objSelectFrom.appendChild(objOptionFrom);
					objSelectTo.appendChild(objOptionTo);
					for(iIndex = 0; iIndex < objEvent.response.result.length; iIndex++){
						var strCurrency = objEvent.response.result[iIndex];
						objOptionFrom = document.createElement('option');
						objOptionTo = document.createElement('option');
						objOptionFrom.innerHTML = objOptionTo.innerHTML = objOptionFrom.value = objOptionTo.value = strCurrency;
						objSelectFrom.appendChild(objOptionFrom);
						objSelectTo.appendChild(objOptionTo);
					}
					var objInputAmount = document.getElementById(that._objConfig.inputAmount);
					var objOutputResult	= document.getElementById(that._objConfig.outputResult);
					objOutputResult.value = objInputAmount.value = '';
					objOutputResult.disabled = objInputAmount.disabled = objSelectFrom.disabled = objSelectTo.disabled = false;
					document.getElementById(that._objConfig.buttonConvert).onclick = that.convert;
				}
				break;
			case 'error':
				alert(objData);
			case 'timeout':
			default:
				funcShowError(strType);
				break;
		}
	};
			
	this._handler_convert = function(strType, objData, objEvent) {
		var funcShowError = function (strMessage) {
			alert("No se pudo realizar la conversión.\n"+(strMessage || "Intente luego"));
		};
		switch(strType){
			case 'load':
				if(objEvent.error){
					funcShowError('Request Error');
				}else{
					var objResult = document.getElementById(that._objConfig.outputResult)
					objResult.value = objEvent.response.result.value;
					var objDate = new Date();
					objDate.setTime(objEvent.response.result.time*1000);
					objResult.title = "Calculado: "+objDate.toString()+", Actualizado: "+objEvent.response.result.updated;
				}
				break;
			case 'error':
			case 'timeout':
			default:
				funcShowError(strType);
				break;
		}
	};
	
	this.loadCurrencies = function() {
		var objSelectFrom	= document.getElementById(that._objConfig.inputFrom);
		var objSelectTo 	= document.getElementById(that._objConfig.inputTo);
		var objInputAmount	= document.getElementById(that._objConfig.inputAmount);
		var objOutputResult	= document.getElementById(that._objConfig.outputResult);
		var objOptionFrom	= document.createElement('option');
		var objOptionTo		= document.createElement('option');
		objOutputResult.disabled = objInputAmount.disabled = objSelectFrom.disabled = objSelectTo.disabled = true;
		objOptionTo.innerHTML = objOptionFrom.innerHTML = objOutputResult.value = objInputAmount.value = 'Cargando...';
		objSelectFrom.appendChild(objOptionFrom);
		objSelectTo.appendChild(objOptionTo);
		that._RPCCall('getCurrencies');
	};
	
	this.convert = function () {
		var strFrom 	= document.getElementById(that._objConfig.inputFrom).value;
		var strTo 		= document.getElementById(that._objConfig.inputTo).value;
		var strAmount 	= document.getElementById(that._objConfig.inputAmount).value;
		
		document.getElementById(that._objConfig.outputResult).value = '';
		
		if(!strFrom){
			alert('Seleccione Moneda de Origen');
		}else if(!strTo){
			alert('Seleccione Moneda de Destino');
		}else if(!strAmount){
			alert('Ingrese la cantidad a convertir');
		}else{
			that._RPCCall('convert',[strFrom,strTo,strAmount]);
		}
	}
	
	this.loadCurrencies();
};


