    // Init array
    var liste_blocks = {
      '21E8'        : '00000000000000000021e800c1e8df51b22c1588e5a624bea17e9faa34b2dc4a',
      'HURRICANE_1' : '0000000000000000000fe6d521a187a5523d5cef6f6c178923ff82ffe5a0f372',
      'SEGWIT'      : '000000000000000000cbeff0b533f8e1189cf09dfbebf57a8ebe349362811b80',
      'SEGWIT_LOCK' : '0000000000000000012e6060980c6475a9a8e62a1bf44b76c5d51f707d54522c',
      'BCC'         : '00000000000000000019f112ec0a9982926f1258cdcc558dd7c3b7e5dc7fa148',
      'BIP_91_LOCK' : '0000000000000000015411ca4b35f7b48ecab015b14de5627b647e262ba0ec40',
      'HALVING_2'   : '000000000000000002cce816c0ab2c5c269cb081896b7dcb34b8422d6b74ffa1',
      'HALVING_1'   : '000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e',
      'PIZZA'       : '00000000006de085dadb3ec413ef074022fe781121b467e98960280dd246bb00',
      'TOPISTO'     : '000000000a73e64735a2b75c97ea674950a9018da1420d01328a918c9ff9852c',
      'LEET'        : '000000008bf44a528a09d203203a6a97c165cf53a92ecc27aed0b49b86a19564',
      'LUCIFER'     : '00000000fc5b3c76f27f810ee775e480ae7fd604fd196b2d8da4257fcd39f4f9',
      'THE_ANSWER'  : '00000000314e90489514c787d615cea50003af2023796ccdd085b6bcc1fa28f5',
      'GENESIS'     : '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f', 
    };

    var flag_nav   = true;
    var classes    = ['bg-grey-even','bg-grey-odd'];
    var cur_class  = 0;
    var cur_height = [];

    function precisionRound(number) {
      var precision = 4;
      var factor = Math.pow(10, precision);
      return Math.round((number/100000000) * factor) / factor;
    }

    function addInfoForBlock(block)
    {
      var height = '300px';
      var contenu = '';
      var downloadingImage = new Image();

      cur_height.push(block.height);
      
      cur_class  = 1 - cur_class;
      
      contenu += '      <h2> <span style="font-size:12px">block</span> '+block.height+'</h2>';
      contenu += '      <table width="100%">';
      //contenu += '       <tr><td>hash</td><td align="right"><b>'+block.hash+'</b></td></tr>';
      //contenu += '       <tr><td>index</td><td align="right"><b>'+block.block_index+'</b></td></tr>';
      contenu += '        <tr><td>timestamp</td><td align="right"><b>'+block.time+'</b></td></tr>';
      contenu += '        <tr><td>nonce</td><td align="right"><b>'+block.nonce+'</b></td></tr>';
      contenu += '        <tr><td>nb tx</td><td align="right"><b>'+block.n_tx+'</b></td></tr>';
      contenu += '        <tr><td>outputs</td><td align="right"><b>'+precisionRound(block.topisto_outputs).toFixed(4)+'</b></td></tr>';
      contenu += '        <tr><td>inputs</td><td align="right"><b>'+precisionRound(block.topisto_inputs).toFixed(4)+'</b></td></tr>';
      contenu += '        <tr><td>fees</td><td align="right"><b>'+precisionRound(block.topisto_fees).toFixed(4)+'</b></td></tr>';
      contenu += '        <tr><td>reward</td><td align="right"><b>'+precisionRound(block.topisto_reward).toFixed(4)+'</b></td></tr>';
      contenu += '      </table>';

      $('#info_'+block.height).html(contenu);

      downloadingImage.onload = function(){
        $('#img_'+block.height).attr('src', this.src);   
        //$('#img_'+block.height).attr('height', height);
        //$('#img_'+block.height).attr('width','auto');
        flag_nav = true;
      };
      downloadingImage.src = 'images/block_image.php?methode=hasard&hash='+block.hash;

      return true;
    }

    function addDivForBlock(block_height)
    {
      var contenu = '';

      contenu += '<div id="block_'+block_height+'" class="container-fluid '+classes[cur_class]+'">';
      contenu += '  <div class="row">';
      contenu += '    <div class="col-sm-8" id="info_'+block_height+'">';
      contenu += '      <h2>COMPUTING ...</h2>';
      contenu += '    </div>';
      contenu += '    <div class="col-sm-4 text-right">';
      contenu += '      <div width="100%" class="text-center">';
      contenu += '        <img id="img_'+block_height+'" src="images/loading.gif" class="img-responsive"></img>';
      contenu += '      </div>';
      contenu += '    </div>';
      contenu += '  </div>';
      contenu += '</div>';

      $('#blockchain').append(contenu);

      return true;
    }

    function addDivForVoid()
    {
      var contenu = '';

      contenu += '<div id="the_void" class="container-fluid '+classes[cur_class]+'">';
      contenu += '  <div class="row">';
      contenu += '    <div class="col-sm-8">';
      contenu += '      <h2>the VOID ... </h2>';
      contenu += '    </div>';
      contenu += '    <div class="col-sm-4 text-right">';
      contenu += '      <div width="100%" class="text-center">';
      contenu += '        <img src="images/loading.gif" class="img-responsive"></img>';
      contenu += '      </div>';
      contenu += '    </div>';
      contenu += '  </div>';
      contenu += '</div>';

      $('#blockchain').append(contenu);

      return true;
    }

    function toggleForwardBtn()
    {
      if (cur_height.length < 3)
      {
        $('#fast_forward_btn').removeClass('btn-success');
        $('#fast_forward_btn').addClass('btn-secondary');
        $('#btn-forward').removeClass('btn-info');
        $('#btn-forward').addClass('btn-secondary');
      } else {
        $('#fast_forward_btn').removeClass('btn-secondary');
        $('#fast_forward_btn').addClass('btn-success');
        $('#btn-forward').removeClass('btn-secondary');
        $('#btn-forward').addClass('btn-info');
      }
      return true;      
    }


    function gotoBlock(block_name)
    {
      $(document).scrollTop( $("#explorer").offset().top );

      // Bloquer la navigation pendant le calcul
      if (!flag_nav)
      {
        window.alert('A block image is currently computed, please wait ...');
        return false;
      }
      flag_nav   = false;

      if (block_name == 'NEXT')
      {
        flag_nav   = true;

        // Supprimer un block
        if (cur_height.length < 3)
        {
          window.alert('No Next Block, you are at '+$('#blockSelector').val()+' block !');
          return false;
        }

        liste_blocks['PREVIOUS'] = liste_blocks['BLOCK_'+cur_height[cur_height.length-1]];
        cur_height.pop();
        
        toggleForwardBtn();

        $('#block_'+cur_height[cur_height.length-2]).slideDown(400, function() {
          // Animation complete.
          $('#blockchain').children('div:last').remove();
          cur_class = 1 - cur_class;
        });

      } else {
        // Ajouter un block
        addDivForBlock(cur_height[cur_height.length-1] - 1);

        // Décaler d'un block vers le haut
        if (cur_height.length > 1) $('#block_'+cur_height[cur_height.length-2]).slideUp();

        block_hash = '';
        if (block_name != 'LAST') block_hash = '?block_hash='+liste_blocks[block_name];
        $.getJSON('data/getBlockInfo.php'+block_hash, function( data ) {
          liste_blocks['PREVIOUS'] = data.prev;
          liste_blocks['BLOCK_'+data.height] = data.hash;
          addInfoForBlock(data);

          toggleForwardBtn();
        });
      }

      return true;
    }

    function initBlockchain(block_name)
    {
      $(document).scrollTop( $("#explorer").offset().top );

      $('#blockchain').html('');
      cur_height = [];
      cur_class  = 0;
      flag_nav   = true;

      block_hash = '';
      if (block_name != 'LAST') block_hash = '?block_hash='+liste_blocks[block_name];
      $.getJSON('data/getBlockInfo.php'+block_hash, function( data ) {
        addDivForBlock(data.height);        
        addInfoForBlock(data);

        liste_blocks['PREVIOUS'] = data.prev;
        if (data.prev != '0000000000000000000000000000000000000000000000000000000000000000')
          gotoBlock('PREVIOUS');
        else 
          addDivForVoid();
      });
      return true;
    }

    function blockSelectorChange()
    {
      initBlockchain($('#blockSelector').val());
      $('#fast_forward_btn').attr('data-original-title', $('#blockSelector').val());
    }

    function initBlockExplorer(leblock)
    {
      // Init the selector
      var select = $('#blockSelector');
        $.each(liste_blocks, function (key, text) {
          select.append(new Option(key, key));
      });
      
      if (cur_height.length == 0) initBlockchain('LAST');
    }

    $(document).ready(function(){
      last_block_hooks.push(initBlockExplorer);
    });

