var data_cotacoes;
var moedas_disp = [];

function atualizaCotacoes( json ) {
  $(document).ready(function() {
    cotacoesUpdate( cotacoesMakeObj( json ) );
		$('#tbl_cotacao th.tbl_bottom a').eq(0)
      .bind('click', cotacoesOutrasMoedas)
      .css('display', moedas_disp.length <= 5 ? 'none' : '' );
  });
}

function cotacoesOutrasMoedas() {
  if ( data_cotacoes == undefined ) return;
  var rows = $('#tbl_cotacao tr.cotacao_moeda');
  var ordl = [];
  var mpos = -1;
  var page = -1;
  for ( var i = 0; i < data_cotacoes.codes.cambio.length; i += 1 ) {
    var mcod = data_cotacoes.codes.cambio[i];
    var mkey = $.inArray( mcod, moedas_disp );
    if ( mkey < 0 ) { continue; }
    mpos += 1;
    ordl[mpos] = mcod;
    if ( mpos % 5 == 0 ) {
      if ( rows.eq(0).hasClass('xml_'+mcod) ) { 
        page = parseInt( mpos / 5 );
      }
    }
  }
  page = (page + 1) % ( parseInt( ordl.length / 5 ) + (ordl.length % 5 == 0 ? 0 : 1) );
  //console.debug( page+'/'+parseInt( ordl.length / 5 )+' - '+ordl.join(',') );
	rows.removeClass( $.map( data_cotacoes.codes.cambio, function(s) { return 'xml_'+s; } ).join(' ') );
  for ( i = 0; i < 5; i += 1 ) {
    if ( ordl[ page * 5 + i ] == undefined ) { continue; }
    rows.eq(i).addClass('xml_'+ordl[ page * 5 + i ]);
  }
  cotacoesUpdateCambio();
}

function cotacoesUpdate( obj ) {
  if ( data_cotacoes == undefined && obj == undefined ) { return; }
  if ( obj == undefined ) { obj = data_cotacoes; }
	else { data_cotacoes = obj; }

  cotacoesOutrasMoedas();
  cotacoesUpdateBolsas();
}

function cotacoesUpdateCambio() {
  var obj = data_cotacoes;
  //console.log( 'uc '+(typeof obj) );
  var moedas = $('#tbl_cotacao tr.cotacao_moeda');
  //console.debug( moedas );
  moedas.filter( function(i) {
	var cells = $('td', this);
  var rowEmpty = true;
	for ( var c = 0; c < obj.codes.cambio.length; c += 1 ) {
	  if ( $(this).hasClass('xml_'+obj.codes.cambio[c]) ) {
    rowEmpty = false;
		cells.eq(0).text(
			( obj.display[ obj.codes.cambio[c] ] )
			  ? obj.display[ obj.codes.cambio[c] ]
			  : obj.values[ obj.codes.cambio[c] ][ 'NOM' ] );
		cells.eq(1).text( obj.values[ obj.codes.cambio[c] ][ 'OCP' ] );
		cells.eq(2).text( obj.values[ obj.codes.cambio[c] ][ 'OVD' ] );
		var cVar = obj.values[ obj.codes.cambio[c] ][ 'VAR' ];
		cells.eq(3).removeClass('negativo positivo').addClass(
			Number( cVar ) > 0 ? 'positivo' : ( Number( cVar ) < 0 ? 'negativo' : '' ) );
		cells.eq(3).children('img:first').attr('src', Number(cVar) > 0
			? 'images/ico_alta.png'
			: ( Number(cVar) < 0
			  ? 'images/ico_baixa.png'
			  : 'images/ico_estavel.png' )
			).get(0).nextSibling.data = cVar ? ' '+obj.values[ obj.codes.cambio[c] ][ 'VAR' ]+'%' : '';
      //console.debug( obj.codes.cambio[c], cells );
    }
	}
  if ( rowEmpty ) {
    cells.eq(0).text('');
    cells.eq(1).text('');
    cells.eq(2).text('');
    cells.eq(3).removeClass('negativo positivo')
      .children('img:first').attr('src', 'images/ico_none.gif')
      .get(0).nextSibling.data = '';
  }
	return true;
  } );
}

function cotacoesUpdateBolsas() {
  var obj = data_cotacoes;
  //console.log( 'ub '+(typeof obj) );
  var bolsas = $('#box_indicafinanceiros table.tbl_indfin tr.cotacao_bolsa');
  //console.debug( bolsas );
  bolsas.filter( function(i) {
	var cells = $('td', this);
	for ( var c = 0; c < obj.codes.bolsas.length; c += 1 ) {
	  if ( $(this).hasClass('xml_'+obj.codes.bolsas[c]) ) {
		cells.eq(0).text(
			( obj.display[ obj.codes.bolsas[c] ] )
			  ? obj.display[ obj.codes.bolsas[c] ]
			  : obj.values[ obj.codes.bolsas[c] ][ 'NOM' ] );
		cells.eq(1).text( obj.values[ obj.codes.bolsas[c] ][ 'ULT' ] );
		var cVar = obj.values[ obj.codes.bolsas[c] ][ 'VAR' ];
		//while ( cVar.charAt(0) == '+' ) { cVar = cVar.substr( 1 ); }
		cells.eq(2).removeClass('negativo positivo').addClass(
			Number( cVar ) > 0 ? 'positivo' : ( Number( cVar ) < 0 ? 'negativo' : '' ) )
			.text( cVar == '' ? '-' : cVar );
		var cDat = obj.values[ obj.codes.bolsas[c] ][ 'DAT' ];
		cells.eq(3).text( /*cVar == '' ? '' :*/ cDat.substr( 0, cDat.length - 5 ) );
	  }
	}
  } );
}

function cotacoesMakeObj( input ) {
  var obj = {
	codes: {
	  cambio: [ 'AEUSCO', 'AEUSP1', 'AEUSTR', 'AEEUBC', 'AEGBBC',
		'AEARBC', 'AECLBC', 'AEMXBC', 'AEJPBC', 'AECNBC' ],
	  bolsas: [ 'IBOV', 'DJIA', 'MERVAL', 'NASDAQ', 'SP500' ]
	},
	display: {
	  'AEUSCO': 'Dólar comercial (R$)',
	  'AEUSP1': 'Dólar paralelo (R$)',
	  'AEUSTR': 'Dólar turismo (R$)',
	  'AEEUBC': 'Euro (R$)',
	  'AEGBBC': 'Libra (R$)',
	  'AEARBC': 'Peso argentino (R$)',
	  'AECLBC': 'Peso chileno (R$)',
	  'AEMXBC': 'Peso mexicano (R$)',
	  'AEJPBC': 'Iene (R$)',
	  'AECNBC': 'Iuan (R$)',
	  'IBOV': 'Ibovespa',
	  'DJIA': 'Dow Jones',
	  'MERVAL': 'Merval',
	  'NASDAQ': 'Nasdaq',
	  'SP500': 'S&P 500'
	},
	fields: [ 'COD', 'NOM', 'DAT', 'HOR', 'OCP', 'OVD', 'VAR', 'ULT' ],
//	fields_prefix: 'ns1:',
//	fields_prefix_jq: 'ns1\\:', // para o jQuery
	values: {}
  };
  /* // Out of XML
  var xmlNodes = $( obj.fields_prefix_jq + 'AtivoType', input );
  xmlNodes.filter( function() {
	var ativo = {};
    for ( var i = 0; i < this.childNodes.length; i += 1 ) {
	  if ( this.childNodes[i].nodeType == 1 ) {
		for ( var f = 0; f < obj.fields.length; f += 1 ) {
		  var actual_name = this.childNodes[i].nodeName;
		  var verify_name = obj.fields_prefix + obj.fields[f];
		  if ( verify_name == actual_name ) {
			ativo[ obj.fields[f] ] = this.childNodes[i].text == undefined
				? this.childNodes[i].textContent
				: this.childNodes[i].text;
			//break;
		  }
		}
		obj.values[ ativo[ 'COD' ] ] = ativo;
	  }
	}
	return true;
  });
  /*/ // Out of JSON
  for ( var k in input ) {
    obj.values[ input[k].COD ] = input[k];
    if ( $.inArray(input[k].COD, obj.codes.cambio) >= 0 ) {
      if ( parseFloat(input[k].OCP) && parseFloat(input[k].OVD) ) {
        moedas_disp.push( input[k].COD );
      }
    }
  }
  // */
  //console.debug( obj );
  return obj;
}