{% macro status_counts(caller, status, node_name, events, current_env, unreported_time=False, report_hash=False) -%}
  {{ status|upper }}
  {% if status == 'unreported' %}
     {{ unreported_time|upper }} 
  {% else %}
    {% if events['failures'] %}{{events['failures']}}{% else %}0{% endif%}
    {% if events['successes'] %}{{events['successes']}}{% else %}0{% endif%}
    {% if events['skips'] %}{{events['skips']}}{% else %}0{% endif%}
    {% if events['noops'] %}{{events['noops']}}{% else %}0{% endif%}
  {% endif %}
{%- endmacro %}
{% macro report_status(caller, status, node_name, metrics, current_env, unreported_time=False, report_hash=False) -%}
  {{ status|upper }}
  {% if status == 'unreported' %}
     {{ unreported_time|upper }} 
  {% else %}
    {% for metric in config.DISPLAYED_METRICS %}
      {% set path = metric.split('.') %}
      {% set title = ' '.join(path) %}
      {% if metrics[path[0]] and metrics[path[0]][path[1]] %}
      {% set value = metrics[path[0]][path[1]] %}
      {% if value != 0 and value|int != value %}
        {% set format_str = '%.2f' %}
      {% else %}
        {% set format_str = '%s' %}
      {% endif %}
        {{ format_str|format(value) }}
      {% else %}
        0
      {% endif%}
    {% endfor %}
  {% endif %}
{%- endmacro %}
{% macro datatable_init(table_html_id, ajax_url, default_length, length_selector, extra_options=None) -%}
  // Init datatable
  $.fn.dataTable.ext.errMode = 'throw';
  var table = $('#{{ table_html_id }}').DataTable({
    // Permit flow auto-readjust (responsive)
    "autoWidth": false,
    // Activate "processing" message
    "processing": true,
    // Activate Ajax mode
    "serverSide": true,
    // Responsive
    "responsive": true,
    // Defer rendering out of screen lines (JIT)
    "deferRender": true,
    // Data loading URL
    "ajax": "{{ ajax_url }}",
    // Paging options
    "lengthMenu": {{ length_selector }},
    "pageLength": {{ default_length }},
    // Search as regex (does not apply if serverSide)
    "search": {"regex": true},
    {% if table_html_id == 'facts_table' -%}
    "order": [[ 0, "asc" ]],
    {% else -%}
    // Default sort
    "order": [[ 0, "desc" ]],
    {% endif -%}
   // Rendering - add rendering options for columns
    "columnDefs": [ {
      "targets": -1,
      "data:": null,
      "render": function (data, type, full, meta) {
       shorta = data.toString().replace(/[{},]/g, "
");
       shortb = shorta.replace(/u'/g, " "); 
       shortc = shortb.replace(/'/g, " "); 
       return shortc;
       }}],
      // Custom options
    {% if extra_options %}{% call extra_options() %}Callback to parent defined options{% endcall %}{% endif %}
  });
  table.on('error', function ( e, settings, json ) {
    table.clear().draw();
    $('#facts_table_processing').hide(); })
  table.on('draw.dt', function(){
    $('#{{ table_html_id }} [rel=utctimestamp]').each(
      function(index, timestamp){
        $(this).localise_timestamp();
    });
  });
  // Override Datatables search box events to delay Ajax call while writing
  var searchWait = 0;
  var searchWaitInterval;
  $('.dataTables_filter input')
  .unbind()
  .bind('input', function(e){
    var item = $(this);
    searchWait = 0;
    if(!searchWaitInterval) searchWaitInterval = setInterval(function(){
      if(searchWait>=3){
        clearInterval(searchWaitInterval);
        searchWaitInterval = '';
        searchTerm = $(item).val();
        table.search(searchTerm).draw();
        searchWait = 0;
      }
      searchWait++;
    },80);
  });
{%- endmacro %}