<!DOCTYPE HTML>
<html>
<body>
<h2>Deployment</h2>

<section>
<p>Deployment ID <span id="id">Loading...</span></p>

<p>Status <span id="status">Loading...</span></p>

<p>Actions Completed <span id="actions">Loading...</span></p>

<p><div id="progress"></div></p>
<form class="form">
  <p>
    <button id="expand" onClick="return showHide()">More details...</button>
    <button id="abort" onClick="return confirmAbort()">Abort</button>
  </p>
</form>

</section>

<div id="details" style="display:none;"></div>

<script type="text/javascript">
  function showHide() {
    var style = $('#details').is(':visible');
    if(style == false) {
      $('#expand').html('Less details...');
    } else {
      $('#expand').html('More details...');
    }
    $('#details').toggle();
    return false;
  }

  function render(command) {
    var cmd = $.getUrlVar('cmd');
    $('#id').text(cmd);
    $('#status').text(command['status']);
    var buffer = [];
    var i = 0;
    buffer[i++]=command['completedActions'];
    buffer[i++]=' of ';
    buffer[i++]=command['totalActions'];
    $('#actions').text(buffer.join(""));
    var progress = command['completedActions']/command['totalActions']*100;
    $('#progress').progressbar({ value: progress });
    buffer = [];
    i = 0;
    var actionEntries;
    try {
      if(command['actionEntries'].constructor.toString().indexOf('Array') == -1) {
        actionEntries = [];
        actionEntries[0] = command['actionEntries'];
      } else {
        actionEntries = command['actionEntries'];
      }
      for(var action in actionEntries) {
        buffer[i++]=renderAction(actionEntries[action]['action']);
        try {
          buffer[i++]=renderHostStatus(actionEntries[action]['hostStatus']);
        } catch(err) {
          // Protect rendering code from missing data.
        }
      }
    } catch(err2) {
      // Protect rendering code from missing data.
    }
    $('#details').html(buffer.join(""));
  }

  function renderAction(action) {
  
    var buffer = [];
    var i = 0;
    if(action['@type']=='scriptAction') {
      buffer[i++] = renderScriptAction(action);
    } else if(action['@type']=='packageAction') {
      buffer[i++] = renderPackageAction(action);
    } else if(action['@type']=='daemonAction') {
      buffer[i++] = renderDaemonAction(action);
    }
    return buffer.join("");
  }

  function renderScriptAction(action) {
    var buffer = [];
    var i = 0;
    buffer[i++] = "<p>Action: ";
    buffer[i++] = action['script'];
    buffer[i++] = " ";
    if (action['parameters'].constructor.toString().indexOf('Array') == -1) {
      buffer[i++] = action['parameters'];
    } else {
      buffer[i++] = action['parameters'].join(" ");
    }
    buffer[i++] = "</p>";
    return buffer.join("");
  }

  function renderPackageAction(action) {
    var buffer = [];
    var i = 0;
    buffer[i++] = "<p>Action: ";
    buffer[i++] = action['actionType'];
    buffer[i++] = " ";
    var list = action['packages'];
    if(list.constructor.toString().indexOf('Array') == -1) {
      buffer[i++] = action['packages']['name'];
    } else {
      for(var x in list) {
        buffer[i++] = list[x]['name'];
        buffer[i++] = " ";
      }
    }
    buffer[i++] = "</p>";
    return buffer.join("");
  }

  function renderDaemonAction(action) {
    console.log(action);
    var buffer = [];
    var i = 0;
    buffer[i++] = "<p>Action: ";
    buffer[i++] = action['actionType'];
    buffer[i++] = " ";
    buffer[i++] = action['daemon'];
    buffer[i++] = "</p>";
    return buffer.join("");
  }

  function renderHostStatus(hostStatus) {
    var buffer = [];
    var i = 0;
    if (hostStatus.constructor.toString().indexOf('Array') == -1) {
      buffer[i++] = "<span class='block'>"+hostStatus['host']+" "+hostStatus['status']+"</span> ";
    } else {
      for(var hs in hostStatus) {
        buffer[i++] = "<span class='block'>"+hostStatus[hs]['host']+" "+hostStatus[hs]['status']+"</span> ";
      }
    }
    return buffer.join("");
  }

  function checkStatus() {
    var cmd = $.getUrlVar('cmd');
    jQuery.getJSON('/v1/command/status/'+cmd,
      function(command) {
        render(command);
        if(command['status']!='SUCCEEDED' &&
           command['status']!='FAILED') {
          var timeout = setTimeout("checkStatus()",3000);
        }
      }
    )
    .error(
      function() {
        var command = [];
        command['status'] = "Unknown";
        command['completedActions'] = "0";
        command['totalActions'] = "0";
        render(command);
        var timeout = setTimeout("checkStatus()",3000);
      }
    );
  }

  function confirmAbort() {
    var question = "Abort deployment "+$.getUrlVar('cmd')+"?";
    if(confirm(question)) {
      abortCommand($.getUrlVar('cmd'));
    }
    return false;
  }

  function abortCommand(cmd) {
    $.ajax({
      type: 'DELETE',
      url: '/v1/controller/abort/'+cmd,
      success: function(data) {
        console.log(data);
      },
      dataType:'json'
    });
  }

  $.extend({
    getUrlVars: function(){
      var vars = [], hash;
      var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
      for(var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
      }
      return vars;
    },
    getUrlVar: function(name){
      return $.getUrlVars()[name];
    }
  });

  $(document).ready(function() {
    checkStatus();
  });
</script>
</body>
</html>
