<!doctype html>

<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->

<meta charset="utf-8">
<title>SAMZA Visualizer</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

<script src="js/d3.v3.min.js" charset="utf-8"></script>
<script type="text/javascript" src="js/dagre-d3.min.js"></script>
<script type="text/javascript" src="js/planToDagre.js"></script>
<script type="text/javascript" src="plan.json"></script>
<script type="text/javascript" src="../plan/plan.json"></script>

<h1>SAMZA Visualizer</h1>

<style id="css">
  body {
    font: 300 14px 'Helvetica Neue', Helvetica;
  }

  svg {
    margin-top: 30px;
  }

  .node rect {
    stroke: #999;
    fill: #E8E8EE;
    stroke-width: 1.5px;
  }

  .node ellipse {
    stroke: #999;
    fill: #fff;
    stroke-width: 1.5px;
  }

  .edgePath path {
    stroke: #333;
    stroke-width: 1.5px;
  }

  g.source > ellipse {
    fill: #BDEDFF;
  }

  g.sink > ellipse {
    fill: #BDEDFF;
  }

  g.intermediate > ellipse {
    fill: #C3FDB8;
  }

  .topbar {
    text-align: center;
    border-bottom: solid;
    border-bottom-color: #cdcfd2;
    border-bottom-width: 1px;
  }

  .detailBox{
    margin-top: -10px;
  }
</style>

<section>
  <p id="summary"/>
</section>

<svg id="svg-canvas" width=1920 height=1200><g/></svg>

<script id="js">
  var data = JSON.parse(plan);
  var g = planToDagre(data);

  var summary = "A visualization of application <b>" + data.applicationName + "-" + data.applicationId + "</b>";
  summary += ", which consists of " + data.jobs.length + " job(s), ";
  summary += Object.keys(data.sourceStreams).length + " input stream(s), and ";
  summary += Object.keys(data.sinkStreams).length + " output stream(s).";
  document.getElementById("summary").innerHTML = summary;

  // Set up an SVG group so that we can translate the final graph.
  var svg = d3.select("svg"),
      inner = svg.select("g");

  // Set up zoom support
  var zoom = d3.behavior.zoom().on("zoom", function() {
      inner.attr("transform", "translate(" + d3.event.translate + ")" +
                                  "scale(" + d3.event.scale + ")");
    });
  svg.call(zoom);

  // Create the renderer
  var render = new dagreD3.render();

  // Run the renderer. This is what draws the final graph.
  render(inner, g);

  var initialScale = 0.75;
  zoom.scale(initialScale).event(svg);
  svg.attr('height', g.graph().height * initialScale + 100);
</script>
