/*

 * WFG-LIGHTSTREAMER

 * Web Client - wfgLightstreamer.js - Version 2.003

 * Copyright (c) 2010 Web Financial Group S.A. All Rights Reserved.

 * 

 * Min. Requirements:

 * - jquery-1.3.2.js

 * 

 * 

 */

 

document.domain = document.domain;

if (window.WFG == undefined) var WFG = {};



WFG.LS = {

	// Indica el estado global de Lightstreamer (ON, OFF)

	_lsStatusGlobal: 'ON',

	

	// Definicion de campos por defecto

	_numberField: {dec:2, dec_sep:',', ths_sep:'.', css_set:'css'},



	// Definir objeto para indicar si hay filas ocultas en las tablas

	_hiddenRows: {},



	// Objeto que almacena las instancias de las tablas utilizadas en la página

	_tableList: {},

	

	// Referencia al motor

	_engineRef: null,

	

	// Referencia de la PushPage

	_pushPageRef: null,



	// Array que almacena las solicitudes de tablas que no han podido realizarse antes de la inicialización del motor

	_buffer: new Array(),

		

	// Indica si estamos en modo test (En el caso de que sea 'true', hay que crear un objeto _lsPushTest que contenga: port,host,filePath)

	// var _lsPushTest: {'port':XX, 'host': push.domain.com, 'filePath':aa/bb/cc}

	_test: false,



  

//////////////// Tables Management //////////////////

	

/**************************************************************

 Description:

	Define una nueva tabla del tipo recibido

	

 Param:

 	- tableName: nombre de la tabla lógica

 	- tableType: tipo de la tabla lógica

 	- numGroup: nº del grupo de datos  (solo se utiliza si los grupos se definen manualmente)

 	

 Return:

 	Tabla generada

 	

 NOTA: Si se tiene un listado paginado, debe existir la variable (_confTables) con la configuracion:

	var _confTables = {

		ls_table_listado:{

			group1:[item, item, item, ...],

			group2:[item, item, item, ...],	

			group3:[item, item, item, ...],				

			schema: null		// array o null	

		}

	} 	

**************************************************************/

	newLsTable: function(tableName, tableType, numGroup){

		var _itemGroup = null;

		var _itemSchema = null;

		

		if (window._confTables){	// Grupos definidos manualmente 

			if (_confTables[tableName]){

				var _group = 'group' + numGroup;

				_itemGroup = _confTables[tableName][_group];

				_itemSchema = _confTables[tableName]['schema'];	

			}

		}

	

		switch(tableType){

			case 'overwrite':

				// Preparar la tabla por si hay paginación			

				if (_itemGroup != null){

					var _longGroup = _itemGroup.length;

					var _dif = _lsDataConf[tableName]['pagination'] - _longGroup;

					WFG.LS.rebuildLsTable(tableName, _dif)

				}				

				

				// Crear tabla

				var _newTable = new OverwriteTable(_itemGroup, _itemSchema, 'MERGE');

				_newTable.setDataAdapter(_lsDataConf[tableName]['data_adapter']);

				_newTable.setSnapshotRequired(true);

				_newTable.setRequestedMaxFrequency(_lsDataConf[tableName]['frequency']);

				_newTable.onItemUpdate = WFG.LS.updateItem;

				_newTable.onChangingValues = WFG.LS.formatValues;

				_newTable.setPushedHtmlEnabled(true);		

				break;

				

			case 'dynaMetaPushTable':

				// Crear tabla		

				var _newTable = new DynaMetapushTable(_lsDataConf[tableName]['group_id'], _itemSchema, 'COMMAND');

				_newTable.setDataAdapter(_lsDataConf[tableName]['data_adapter']);

				_newTable.setSnapshotRequired(true);

				_newTable.setRequestedMaxFrequency(_lsDataConf[tableName]['frequency']);

				_newTable.onChangingValues = WFG.LS.formatValues;

				_newTable.setPushedHtmlEnabled(true);

				_newTable.setMaxDynaRows(_lsDataConf[tableName]['max_rows']);							

				break;

				

			default:

				var _newTable = null;

		}

		

		return _newTable;

	},



/**************************************************************

 Description:

	Oculta/muestra filas de la tabla dependiendo de la página que esté visible. Se utiliza acuando la última página tiene menos filas que el resto

	- Si dif = 0: pag. interna (mostrar todas las filas)

	- Si pag > 0: ult. pag. Eliminar filas sobrantes

	

 Param:

 	- table: tabla 

 	- dif: nº de filas que sobran

**************************************************************/

	rebuildLsTable: function(table, dif){

	

		if (dif == 0){	// Página interna

			if (WFG.LS._hiddenRows[table]){	// hay filas ocultas --> mostrarlas

				var _aux = '#' + table + ' .ls_hidden';

	/* moo		$$(_aux).each(function(_elem){

					_elem.removeClass('ls_hidden');

				});

	*/			$(_aux).each(function(){

					$(this).removeClass('ls_hidden');

				});

				

				

				WFG.LS._hiddenRows[table] = false;

			}

		}

		else{	// Última página

			if (WFG.LS._hiddenRows[table] == false){

				// ocultar filas visibles sobrantes (las 'dif' ultimas)

				var _aux = '#' + table + ' .ls_row';

	// moo		var _auxElem = $$(_aux).reverse();

				var _auxElem = jQuery.makeArray(_aux).reverse();

				for (x=dif-1; x>=0; x--){			

	// moo			_auxElem[x].addClass('ls_hidden');

					$(_auxElem[x]).addClass('ls_hidden');

				}								

				WFG.LS._hiddenRows[table] = true;

			}		

		}

	},



/**************************************************************

 Description:

	Cambia los elementos de una tabla. Se utiliza en las paginaciones. esta función es llamada desde el frontal cuando se quiera cambiar de página

	

 Param:

 	- idTable: identificador de la tabla en la que se va a hacer el cambio 

	 	(ej: ls_table_xxx => idTable=xxx)

 	- numGroup: nº del grupo de elementos que va a estar activo => página

**************************************************************/

	changeLsTable: function(idTable, numGroup){

		var _t = 'ls_table_' + idTable;

		

		var _table = WFG.LS.newLsTable(_t, _lsDataConf[_t]['table_type'], numGroup);	

		if (_table != null) pushPage.addTable(_table, _t);	

	},



/**************************************************************

 Description:

	Genera una nueva tabla lógica o la recupera de la caché si ya existe

 

 Param:

 	- tableName: nombre de la tabla lógica	

**************************************************************/

	addLsTable: function(tableName){

		if (!WFG.LS._tableList[tableName]){	// Si la tabla no está generada

			// Inicializar elementos de tipo 'number'

			for( var _el in _lsDataConf[tableName]['fields'] ){	

				

				if (_lsDataConf[tableName]['fields'][_el]['type'] == 'number') {					

					var config = {};

					$.extend(true, config, WFG.LS._numberField, _lsDataConf[tableName]['fields'][_el]);									

					_lsDataConf[tableName]['fields'][_el] = config;		

				}

			}			

			WFG.LS._hiddenRows[tableName] = false;	// Indicar si hay filas ocultas en la tabla	

									

			var _table = WFG.LS.newLsTable(tableName, _lsDataConf[tableName]['table_type'], 1);

			WFG.LS._tableList[tableName] = _table;

		}

		else var _table = WFG.LS._tableList[tableName];	

		

		if (_table != null) {

			pushPage.addTable(_table, tableName);			

			if (_lsDataConf[tableName]['table_type'] == 'dynaMetaPushTable'){

				_table.setMetapushSort(_lsDataConf[tableName]['order']['field'],_lsDataConf[tableName]['order']['direction'],true);	

			}

		}				

	},



/**************************************************************

 Description:

	Inicializa las tablas que recibe

 

 Param:

 	- tables: array con las tablas a ainicializar	 	

**************************************************************/

	addLsTableGroup: function(tables){	

		if (tables.length>0){

			for (var i=tables.length-1; i>=0; i--){					

				WFG.LS.addLsTable(tables[i]);

			}	

		}

	},

	

/**************************************************************

 Description:

	Elimina una tabla existente en la página

	

 Param:

 	- tableName: nombre de la tabla



**************************************************************/

	removeLsTable: function(tableName){

		pushPage.removeTable(tableName);

	},



/**************************************************************

 Description:

	Elimina las tablas que recibe

 

 Param:

 	- tables: array con las tablas a eliminar	 	

**************************************************************/

	removeLsTableGroup: function(tables){	

		if (tables.length>0){

			for (var i=tables.length-1; i>=0; i--){					

				WFG.LS.removeLsTable(tables[i]);

			}	

		}

	},

	

//////////////// Master Push-Page Configuration //////////////////



/***************************************************************

 Description:		

	Actualiza el status

	

Param:

	- newStatus: texto descriptivo del status



***************************************************************/

	showLsStatus: function(newStatus) {

		var _statusContainer = document.getElementById('ls_status');

		if (_statusContainer) {

			_statusContainer.innerHTML = newStatus;

		}

	},

	

/**************************************************************

 Description:

	Comprueba si el motor está inicializado

*************************************************************/	

	checkLsEngine: function(){

		if ((WFG.LS._engineRef != null) && (WFG.LS._pushPageRef != null)) return 'RUNNING';

		else {

			if ((WFG.LS._pushPageRef != null) && (WFG.LS._engineRef == null)){

				return 'WAITING';

			}

			else return 'STOPPED';

		}

	},

	

/**************************************************************

 Description:

	Inicializa el motor y genera las tablas de datos

 

 Param:

 	- info: objeto json que contiene:

	 	- domain: dominio del servidor actual

		- tables: array con las tablas que hay que inicializar	

		

 	WFG.LS.initLsEngine({'domain': 'webfg.com','tables': ['ls_table1','ls_table2']});		

*************************************************************/

	initLsEngine: function(info){

		

		if ((WFG.LS._lsStatusGlobal == 'ON') && (_lsPushConf['ls_status'] == 'ON')){



			// Comprobar el estado del LS

			if (WFG.LS.checkLsEngine() == 'STOPPED'){	// LS NO arrancado

				WFG.LS._buffer.push(info);

				

				// Inicializacion				

				pushPage = new PushPage();

				WFG.LS._pushPageRef = pushPage;				

				

				pushPage.onClientAlert = null;

				pushPage.context.setDebugAlertsOnClientError(false); 

				pushPage.context.setRemoteAlertsOnClientError(true);		

				pushPage.context.setDomain(info.domain);

								

				// Configurar parametros del motor									

				if (WFG.LS._test){

					var _lsPort = WFG.LS._lsPushTest['port'];

					var _lsHost = WFG.LS._lsPushTest['host'];	

					var _lsFilePath = WFG.LS._lsPushTest['filePath'];	

				}

				else{

					// Comprobar si el frontal ha forzado a  un push concreto

					var _lsPush = WFG.LS.readCookie('lsPushDomain');

					var _protocol = document.location.protocol;

					if (_protocol == 'http:'){

						var _lsPort = 80;

						if (!_lsPush) _lsPush = 'push';

					}

					else{

						var _lsPort = 443;

						if (!_lsPush) _lsPush = 'push';		

					}

						

					var _lsFilePath = '/lightstreamer/lightstreamer/ls/';	

					var _lsHost = _lsPush + '.' + info.domain;

				}			

			

				pushPage.onEngineCreation = function(lsEngine) {

					lsEngine.onClientAlert = null;

					lsEngine.context.setDebugAlertsOnClientError(false);

					lsEngine.context.setRemoteAlertsOnClientError(true);					

					lsEngine.connection.setLSHost(_lsHost); 

					lsEngine.connection.setLSPort(_lsPort); 

					lsEngine.connection.setAdapterName(_lsPushConf['adapter']);

					if (window._lsPushConf['ls_auth'] === true){	// Hay autentificación

		/* moo			var ls_user = $('ls_auth1') ? $('ls_auth1').value : 'ERROR';

						var ls_pass = $('ls_auth2') ? $('ls_auth2').value : 'ERROR';

		*/				var ls_user = $('#ls_auth1').length ? $('#ls_auth1').val() : 'ERROR';

						var ls_pass = $('#ls_auth2').length ? $('#ls_auth2').val() : 'ERROR';

		

						lsEngine.connection.setUserName(ls_user); 

						lsEngine.connection.setPassword(ls_pass); 				

					}			

					lsEngine.changeStatus('STREAMING');			

				};

			

				// Status notification

				pushPage.onEngineReady = function(lsEngine) {

					WFG.LS._engineRef = lsEngine;

					lsEngine.onClientAlert = null;

					lsEngine.onServerError = function(errorCode, errorMessage){

						if (errorCode == 1) {	// usuario incorrectos

							if (window.showErrorMsg) showErrorMsg();

							else return false;										

						}

					};			

					lsEngine.onStatusChange = function(newStatus) {

						WFG.LS.showLsStatus(newStatus);

					};

					lsEngine.onStatusChange(lsEngine.getStatus());

					

					// Añade las tablas que están en el buffer

					for (var x = WFG.LS._buffer.length-1; x>=0; x--){				

						var info = WFG.LS._buffer[x];

						WFG.LS.addLsTableGroup(info.tables);	

					}

					WFG.LS._buffer = new Array();					

				};

				

				pushPage.onEngineLost = function() {

					WFG.LS.showLsStatus('WAITING FOR ENGINE...');

					WFG.LS._engineRef = null;

				};

			

				pushPage.bind();

				pushPage.createEngine('WFGCommonEngine', _lsFilePath, 'SHARE_SESSION', true);



			}	

			else if (WFG.LS.checkLsEngine() == 'WAITING'){	// LS NO arrancado

				WFG.LS._buffer.push(info);			

			}	

  			else{	// LS RUNNING

				WFG.LS.addLsTableGroup(info.tables);				  

			}			

		}

	},

		

//////////////// Event Handlers for the Stock Tables ////////////////



/**************************************************************

 Description:

	Recoge la actualización del elemento y define los efectos y cambios css

 

 Param:

 	- item: posición del elemento dentro del grupo

	- updateInfo: objeto que contiene los antiguos y nuevos valores del elemento

	- itemName: nombre del elemento (campo 'item')	

**************************************************************/

	updateItem: function(item, updateInfo, itemName) {

	

		// Comprobar si hay actualización

		if (updateInfo == null) {

			return;

		}

	

		var _table = updateInfo.LS_QfY.LS_LSh;		

		var _dat = _lsDataConf[_table];

	

		// Comprobar si hay que generar efectos

		updateInfo.addField('#do_fx', false);	

		if ((_dat['fields_fx_trend']) || (_dat['fields_fx_alert'])){

		

			// Comprobar si hay que hacer transición de efectos

		     if ((_dat['fade']) && (_dat['fade'] == 'ON')) updateInfo.addField('#fade','ON',true);

			else updateInfo.addField('#fade','OFF',true);

				

			var _snapshot = updateInfo.isSnapshot();	// Comprobar si es snapshot o actualización

			if (_snapshot){	// Snapshot

				updateInfo.addField('#snaphost', true);		

			}

			else{	// Actualización

				updateInfo.addField('#snaphost', false);			

				updateInfo.addField('#do_fx', true);			

							

				// Definición de efectos de tendencia

				if (_dat['fields_fx_trend']){

								

					// Para cada campo, se genera su efecto

					for (var i=_dat['fields_fx_trend'].length-1; i>=0; i--){

						var _field = _dat['fields_fx_trend'][i];

						

						// Se comprueba si el efecto debe aplicarse sobre toda la fila

						// Si es así, para definir el efecto se toma como referencia 'key_fx'

						if (_field == 'all'){	

							if (_dat['key_fx']) _field = _dat['key_fx'];

							else _field = 'nd';

						}

						

						if (updateInfo.isValueChanged(_field)){

							var _oldValue = updateInfo.getOldValue(_field) * 1;

							var _newValue = updateInfo.getNewValue(_field) * 1;					

							if (_oldValue > _newValue) {	// Bajada

								updateInfo.addField('#fx_trend' + _field, _dat['fx']['fx_down']);								

							} 

							else if (_oldValue < _newValue){	// Subida

								updateInfo.addField('#fx_trend' + _field, _dat['fx']['fx_up']);

							}

							else updateInfo.addField('#fx_trend' + _field, null);									

						}

						else updateInfo.addField('#fx_trend' + _field, null);

					}

					

				}

				

				// Definición de efectos de alerta

				if (_dat['fields_fx_alert']){		

							

					// Para cada campo, se genera su efecto						

					for (var i=_dat['fields_fx_alert'].length-1; i>=0; i--){

						var _field = _dat['fields_fx_alert'][i];

						

						// Se comprueba si el efecto debe aplicarse sobre toda la fila

						// Si es así, para definir el efecto se toma como referencia 'key_fx'

						if (_field == 'all'){	

							if (_dat['key_fx']) _field = _dat['key_fx'];

							else _field = 'nd';

						}

											

						if (updateInfo.isValueChanged(_field)){

							updateInfo.addField('#fx_alert' + _field, _dat['fx']['fx_alert']);

						}

						else updateInfo.addField('#fx_alert' + _field, null);	

					}

				}

			}

		

		}

		

		

		

		// Comprobar si hay que hacer modificaciones css

		updateInfo.addField('#do_css', false);	

		if (_dat['fields_css']){

			updateInfo.addField('#do_css', true);	

			// Para cada campo, se define su nueva clase					

			for (var i=_dat['fields_css'].length-1; i>=0; i--){

				var _field = _dat['fields_css'][i];

				

				if (_dat['fields'][_field]){	

					

					// Si el campo empieza por '__': NO es actualizado por LS, pero depende de otro campo SI actualizado por LS (Ej: __var_puntos, depende del campo 'var_puntos')

					if (_field.substring(0,2) == '__') {	// Gestión manual de clases	

						_fieldAux = _field.replace('__','');

						var val = updateInfo.getNewValue(_fieldAux) * 1;					

					}

					else	var val = updateInfo.getNewValue(_field) * 1;

							

					if (val < 0) var _accion = 'css_down';

					else if (val > 0) var _accion = 'css_up';

					else var _accion = 'css_equal';

							

					updateInfo.addField('#css' + _field, _accion);

												

				}			

				

			}

		

		}		

				

		// Funcionalidades externas

		if ((_dat['externalFunc']) && (_dat['externalFunc'] != '')){

			if (eval('window.' + _dat['externalFunc'])) 

				eval(_dat['externalFunc'] + '(item, updateInfo, itemName)'); 

		}	

	},



/**************************************************************

 Description:

	Formatea los datos y lanza los efectos definidos 

 

 Param:

 	- item: posición del elemento dentro del grupo

	- itemUpdate: objeto que contiene los nuevos valores y los nuevos valores formateados

	- itemName: nombre del elemento (campo 'item')	

**************************************************************/

	formatValues: function(item, itemUpdate, itemName) {					

		if (itemUpdate == null) {

			return;

		}

		var _table = itemUpdate.LS_QfY.LS_LSh;

		var _dat = _lsDataConf[_table];

	

		// Si hay paginación se fuerza el itemName para que se mantenga el de la tabla inicial

		if ((_dat['pagination']) && (_dat['pagination'] != false)) var itemName = 'item' + item;

		

		// Comprobar si hay transición de efectos

		if (itemUpdate.getServerValue('#fade') == 'ON') {

	        itemUpdate.setHotToColdTime(300);

	     }

		else itemUpdate.setHotTime(500);

		

		switch (_dat['table_type']){

			case "overwrite":

				if (itemUpdate.getServerValue('#do_fx')) WFG.LS.showFx(_dat, itemUpdate);		

				if (itemUpdate.getServerValue('#do_css')) WFG.LS.updateCss(_dat, itemUpdate, itemName);				

				WFG.LS.formatData(_dat, itemUpdate,itemName);

				break;

				

			case "dynaMetaPushTable":

				if (_dat['fx']) WFG.LS.showFx(_dat, itemUpdate);		

				break;

		}

	},



/**************************************************************

 Description:

	Lanza los efectos definidos. Se recorre cada uno de los campos con efectios definidos y se van activando 

 

 Param:

 	- confTable: datos de configuración de la tabla

	- itemUpdate: objeto que contiene los nuevos valores y los nuevos valores formateados	

**************************************************************/

	showFx: function(confTable, itemUpdate) {

	

		switch (confTable['table_type']){

			case "overwrite":

				var _snapshot = itemUpdate.getServerValue('#snapshot');

				if (_snapshot){

				

				}

				else{

				

					// Efectos de tendencia

					if (confTable['fields_fx_trend']){					

						for (var i=confTable['fields_fx_trend'].length-1; i>=0; i--){

							var _field = confTable['fields_fx_trend'][i];

							

							// Se comprueba si el efecto debe aplicarse sobre toda la fila

							// Si es así, para definir el efecto se toma como referencia 'key_fx'

							if (_field == 'all'){	

								if (confTable['key_fx']) _field = confTable['key_fx'];

								else _field = 'nd';

								

								var _fx = itemUpdate.getServerValue('#fx_trend' + _field);						

								if (_fx != null) itemUpdate.setRowAttribute(_fx,'',confTable['fx']['property']);				

							}

							else{

								var _fx = itemUpdate.getServerValue('#fx_trend' + _field);						

								if (_fx != null) itemUpdate.setAttribute(_field,_fx,'',confTable['fx']['property']);							

							}

														

			

						}

					}

					

					// Efectos de alerta

					if (confTable['fields_fx_alert']){	

						for (var i=confTable['fields_fx_alert'].length-1; i>=0; i--){

							var _field = confTable['fields_fx_alert'][i];	

							

							// Se comprueba si el efecto debe aplicarse sobre toda la fila

							// Si es así, para definir el efecto se toma como referencia 'key_fx'

							if (_field == 'all'){	

								if (confTable['key_fx']) _field = confTable['key_fx'];

								else _field = 'nd';

								

								var _fx = itemUpdate.getServerValue('#fx_alert' + _field);						

								if (_fx != null) itemUpdate.setRowAttribute(_fx,'',confTable['fx']['property']);				

							}

							else{

								var _fx = itemUpdate.getServerValue('#fx_alert' + _field);						

								if (_fx != null) itemUpdate.setAttribute(_field,_fx,'',confTable['fx']['property']);							

							}

				

						}				 	 

					}			

							

				}

				break;

			

			case "dynaMetaPushTable":

				itemUpdate.setRowAttribute(confTable['fx']['fx_alert'],'',confTable['fx']['property']);		

				break;

		}								

	},	



/**************************************************************

 Description:

	Modifica las clases css de los campos definidos en 'field_css'. Los campos que comienzan por '__', se refieren a campos NO actualizados por LS, pero que dependen de un campo SI actualizado por LS (Ej: __var_puntos --> var_puntos. El 'id' de este será: __var_puntos_item12301_55_df')

 

 Param:

 	- confTable: datos de configuración de la tabla

	- itemUpdate: objeto que contiene los nuevos valores y los nuevos valores formateados	

	- itemName: nombre del elemento (campo 'item')	

**************************************************************/

	updateCss: function(confTable, itemUpdate, itemName) {

			

		if (confTable['fields_css']){

			for (var i=confTable['fields_css'].length-1; i>=0; i--){												

				var _field = confTable['fields_css'][i];	

				if (confTable['fields'][_field] && confTable['fields'][_field]['css_set']){	

					var _cssSetName = confTable['fields'][_field]['css_set'];							

					var _cssSet = confTable['css_set'][_cssSetName];

					var _accion = 	itemUpdate.getServerValue('#css' + _field);	

			

					if (_field.substring(0,2) == '__') {	// Gestión manual de clases

	/* moo				var _itemActual = $(_field + '_' + itemName);					

						if ((_itemActual) && (_itemActual.hasClass(_cssSet[_accion]) == false)){										

							_itemActual.removeClass(_cssSet['css_up']).removeClass(_cssSet['css_equal']).removeClass(_cssSet['css_down']).addClass(_cssSet[_accion]);

						}

	*/					

						var _itemActual = '#' + _field + '_' + itemName;					

						if ($(_itemActual.length) && ($(_itemActual).hasClass(_cssSet[_accion])== false)){

							$(_itemActual).removeClass(_cssSet['css_up']).removeClass(_cssSet['css_equal']).removeClass(_cssSet['css_down']).addClass(_cssSet[_accion]);

						}

						

					}

					else	itemUpdate.setStyle(_field,_cssSet[_accion],_cssSet[_accion]);					

				}

			}				 	 

		 }				

	},		



/**************************************************************

 Description:

	Formatea los datos recibidos

 

 Param:

 	- confTable: datos de configuración de la tabla

	- itemUpdate: objeto que contiene los nuevos valores y los nuevos valores formateados	

**************************************************************/

	formatData: function(confTable, itemUpdate, itemName) {			

	

		var market = itemName.split ('_');

		market = market[2];

		for( var _el in confTable['fields'] ){

			var _newValue = itemUpdate.getFormattedValue(_el);

			if ((_newValue != null) && (_newValue != '') && (_newValue != ' ')){	

				switch(confTable['fields'][_el]['type']){

					case 'number':

						if (confTable['fields'][_el]['convert'])

							{

								

								if (WFG.LS.currencyConversion [market])

									{

										_newValue = _newValue*WFG.LS.currencyConversion [market];

									}

							}		

						if (confTable['fields'][_el]['base']) _newValue = _newValue/confTable['fields'][_el]['base'];	

						var _formattedVal = WFG.LS.numberFormat(_newValue, confTable['fields'][_el]['dec'], confTable['fields'][_el]['dec_sep'], confTable['fields'][_el]['ths_sep']);      

						if (confTable['fields'][_el]['extra']) _formattedVal += confTable['fields'][_el]['extra'];

						if ((_newValue > 0) && (confTable['fields'][_el]['sign'])) _formattedVal = "+" +  _formattedVal;						

						itemUpdate.setFormattedValue(_el,_formattedVal);

						break;

										

					case 'datetime':

						var _formattedVal = WFG.LS.dateTimeFormat(_newValue, confTable['fields'][_el]['view'],confTable['fields'][_el]['tvfp'],market);

						itemUpdate.setFormattedValue(_el,_formattedVal);

						break;

					default:	// Incluye el tipo 'string'

				}			

			}

			else itemUpdate.setFormattedValue(_el, null);	// No hay actualización		

		}

		

	},

	

//////////////// Funciones de formateo //////////////////////



/**************************************************************

 Description:

	Función que formatea la fecha y/o la hora

 

 Param:

 	- val: valor a formatear	

 	- dat: [d,t,dt,...] indica si se quiere obtener la fecha, la hora o ambas

**************************************************************/

	dateTimeFormat: function(val, dat, timeVariation,market) {

		val = val.replace(" ","");	// Eliminar espacios en blanco

		var _longVal = val.length;

		

		

		

			

		if (_longVal > 10){	// Llega un dato del tipo DD/MM/AAHH:MM:SS

		

			// CAMBIAMOS LA HORA para adamtarla al valor del site (variación horaria respecto a valor de la FEED.

			if (val.indexOf (':') != -1 && timeVariation != undefined && !WFG.LS.dateConversionExceptions [market] )

				{

					var _dateProvider = val.substring(0,8);

					var _timeProvider = val.substring(8,_longVal);

					var _hourPovider = parseInt(_timeProvider.substring (0,2));	

					if (_timeProvider.substring(0,1) == "0"){_hourPovider = parseInt(_timeProvider.substring (1,2));}

					var _minSecPovider = _timeProvider.substring(2,9);

					var _hourSite = (_hourPovider + parseFloat (timeVariation)).toString ();

					var _timeSite = _hourSite+_minSecPovider;

					if (_timeSite.length ==7 ) { _timeSite = "0"+_timeSite;} 

					val = _dateProvider+_timeSite;

				}

			

			switch(dat){

				case "d":		// DD/MM/AA

					var _dateTime = val.substring(0,8);

					break;

				case "d2":	// DD/MM

					var _dateTime = val.substring(0,5);

					break;

				case "d3":	// DD/MM/AAAA

					var _dateTime = val.substring(0,6) + '20' + val.substring(6,8);

					break;

				case "d4":	// AAAA/MM/DD

					var _dateTime = '20' + val.substring(6,8) + '/' + val.substring(3,6) + val.substring(0,2);

					break;

																	

				case "t":		//HH:MM:SS

					var _dateTime = val.substring(8,_longVal);				

					break;

				case "t2":	//HH:MM

					var _dateTime = val.substring(5,_longVal);

					break;	

											

				case "dt":	// DD/MM/AA HH:MM:SS

					var _dateTime = val.substring(0,8) + ' ' + val.substring(8,_longVal);

					break;	

				case "dt2":	// DD/MM HH:MM:SS

					var _dateTime = val.substring(0,6) + ' ' + val.substring(8,_longVal);

					break;

				case "dt3":	// DD/MM/AAAA HH:MM:SS

					var _dateTime = val.substring(0,6) + '20' + val.substring(6,8) + ' ' + val.substring(8,_longVal);

				case "dt4":	// AAAA/MM/DD HH:MM:SS

					var _dateTime = '20' + val.substring(6,8) + '/' + val.substring(3,6) + val.substring(0,2) + ' ' + val.substring(8,_longVal);				

					break;												

			}

		}

		else{	// Llega un dato del tipo DD/MM/AA, DD/MM/AAAA o HH:MM:SS

		

			// CAMBIAMOS LA HORA para adamtarla al valor del site (variación horaria respecto a valor de la FEED.

			if (val.indexOf (':') != -1 && timeVariation != undefined && !WFG.LS.dateConversionExceptions [market])

				{

					var _hourPovider = parseInt(val.substring (0,2));

					if (val.substring(0,1) == "0"){_hourPovider = parseInt(val.substring (1,2));}

					var _minSecPovider = val.substring(2,9);

					var _hourSite = (_hourPovider + parseFloat (timeVariation)).toString ();

					var _timeSite = _hourSite+_minSecPovider;

					val = _timeSite;

					if (val.length ==7 ) { val = "0"+val;} 

				}

		

		

			var _dateTime = val;	

		}

	

		return _dateTime;

	},



/**************************************************************

 Description:

	Función que formatea un número

 

 Param:

 	- number: número

	- decimales: nº de decimales

	- dec_point: caracter utilizado como separador decimal

	- thousands_sep: caracter utilizado como separador de miles

**************************************************************/

	numberFormat: function(number, decimals, dec_point, thousands_sep) {

	    // http://kevin.vanzonneveld.net

	    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)

	    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

	    // +     bugfix by: Michael White (http://getsprink.com)

	    // +     bugfix by: Benjamin Lupton

	    // +     bugfix by: Allan Jensen (http://www.winternet.no)

	    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)

	    // +     bugfix by: Howard Yeend

	    // +    revised by: Luke Smith (http://lucassmith.name)

	    // +     bugfix by: Diogo Resende

	    // +     bugfix by: Rival

	

	 	 /**************************************************************

		 Description:

			Función que corrije el funcionamiento del método toFixed()

		 

		 Param:

		 	- number: número

			- decimales: nº de decimales

		**************************************************************/

		var toFixedFixBug = function(number,decimals) {

			var d = Math.pow(10,decimals);

			var j = (Math.round(number*d)/d).toString().split('.');

			if (!isFinite(j[1])) {	// No hay decimales

				return parseFloat(j[0]).toFixed(decimals);

			}

			else{

				while(j[1].length < decimals) {j[1] += '0';} 

				return j[0]  + '.' + j[1];

			}			

		}

		

		var n = number, prec = decimals;

	//	n = !isFinite(+n) ? 0 : +n;

		if (isFinite(+n)){	// Si 'n' es finito

			prec = !isFinite(+prec) ? 0 : Math.abs(prec);

			var sep = (typeof thousands_sep == 'undefined') ? ',' : thousands_sep;

			var dec = (typeof dec_point == 'undefined') ? '.' : dec_point;

		 

		//   var s = (prec > 0) ? n.toFixed(prec) : Math.round(n).toFixed(prec); //fix for IE parseFloat(0.55).toFixed(0) = 0;

			var s = (prec > 0) ? toFixedFixBug(n,prec) : Math.round(n).toFixed(prec);

		

			var abs = Math.abs(n).toFixed(prec);

			var x, i;

			

			if (abs >= 1000) {

				x = abs.split(/\D/);

				i = x[0].length % 3 || 3;		

				x[0] = s.slice(0,i + (n < 0)) + x[0].slice(i).replace(/(\d{3})/g, sep+'$1');		

				s = x.join(dec);

			} else s = s.replace('.', dec);

		}

		else s = '.';

		

		return s;

	},

	

/**************************************************************

 Description:

	Lee una cookie

	

 Param:

 	- id: nombre de la cookie

 	

 Return:

 	Valor almacenado o 'false'

 	

 NOTA: document.cookie devuelve una cadena con todas las cookies concatenadas: 

 id1=valor1;id2=valor2;...

**************************************************************/

	readCookie: function(id){

		var _cookies = document.cookie; 

		if(!_cookies) return false;

		var _start = _cookies.indexOf(id);

		if(_start == -1) return false;

		_start = _start + id.length+1;

		var _long = _cookies.indexOf("; ", _start) - _start; 

		if (_long<=0) _long = _cookies.length;

		

		return _cookies.substr(_start, _long);

	}	

} 

