{% extends "basebuildpage.html" %}
{% load projecttags %}

{% block localbreadcrumb %}
<li>{{title}}</li>
{% endblock %}

{% block nav-tasks %}
  {% if 'Tasks' == title %}
    <li class="active"><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
  {% else %}
    <li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
  {% endif %}
{% endblock %}
{% block nav-buildtime %}
  {% if 'Time' == title %}
    <li class="active"><a href="{% url 'buildtime' build.pk %}">Time</a></li>
  {% else %}
    <li><a href="{% url 'buildtime' build.pk %}">Time</a></li>
  {% endif %}
{% endblock %}
{% block nav-cpuusage %}
  {% if 'CPU usage' == title %}
    <li class="active"><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
  {% else %}
    <li><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
  {% endif %}
{% endblock %}
{% block nav-diskio %}
  {% if 'Disk I/O' == title %}
    <li class="active"><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
  {% else %}
    <li><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
  {% endif %}
{% endblock %}

{% block buildinfomain %}
<div class="span10">
{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
  <!-- Empty - no data in database -->
  <div class="page-header">
  <h1>{{title}}</h1>
  </div>
  <div class="alert alert-info lead">
  No data was recorded for this build.
  </div>

{% else %}

  <div class="page-header">
  <h1>
  {% if  request.GET.filter and objects.paginator.count >  0 or request.GET.search and objects.paginator.count >  0 %}
      {{objects.paginator.count}} task{{objects.paginator.count|pluralize}} found
  {%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
      No tasks found
  {%else%}
      {{title}}
  {%endif%}
  </h1>
  </div>

  {% if objects.paginator.count == 0 %}
  <div class="row-fluid">
      <div class="alert">
        <form class="no-results input-append" id="searchform">
            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
            <button class="btn" type="submit" value="Search">Search</button>
            <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all tasks</button>
        </form>
      </div>
  </div>


  {% else %}
  {% include "basetable_top.html" %}

    {% for task in objects %}
        <tr {{ task|task_color }} id="{{task.order}}">
            <td class="order">
                <a href="{%url "task" build.pk task.pk%}">{{task.order}}</a>
            </td>
            <td class="recipe_name" >
                <a href="{% url "recipe" build.pk task.recipe.pk %}">{{task.recipe.name}}</a>
            </td>
            <td class="recipe_version">
                <a href="{% url "recipe" build.pk task.recipe.pk %}">{{task.recipe.version}}</a>
            </td>
            <td class="task_name">
                <a href="{%url "task" build.pk task.pk%}">{{task.task_name}}</a> {% if task.get_description %}<i class="icon-question-sign get-help hover-help" title="{{task.get_description}}"></i> {% endif %}
            </td>
            <td class="executed">
                <a href="{%url "task" build.pk task.pk%}">{{task.get_executed_display}}</a>
            </td>
            <td class="outcome">
                <a href="{%url "task" build.pk task.pk%}">{{task.get_outcome_display}} </a>
                {% if task.outcome = task.OUTCOME_FAILED %}
                    <a href="{% url 'build_artifact' build.pk "tasklogfile" task.pk %}">
                        <i class="icon-download-alt" title="Download task log file"></i>
                    </a>
                {% endif %}
                <i class="icon-question-sign get-help hover-help" title="{{task.get_outcome_help}}"></i>
            </td>
            <td class="cache_attempt">
                <a href="{%url "task" build.pk task.pk%}">{{task.get_sstate_result_display|format_none_and_zero}}</a>
            </td>
            <td class="time_taken">
                {{task.elapsed_time|format_none_and_zero|floatformat:2}}
            </td>
            <td class="cpu_used">
                {{task.cpu_usage|format_none_and_zero|floatformat:2}}{% if task.cpu_usage %}%{% endif %}
            </td>
            <td class="disk_io">
                {{task.disk_io|format_none_and_zero}}
            </td>

        </tr>
    {% endfor %}

  {% include "basetable_bottom.html" %}
  {% endif %} {# objects.paginator.count #}
{% endif %} {# empty #}
</div>

<script type="text/javascript">

    $(document).ready(function() {
        // enable blue hightlight animation for the order link
        if (location.href.search('#') > -1) {
            var task_order = location.href.split('#')[1];
            $("#" + task_order).addClass("highlight");
        }
    });

</script>

{% endblock %}
