<div id="newMiniDashboard">
    <div class="hide" id="selectedMainNav">{{ opts.verbose_name_plural|capfirst }}</div>
    <div class="hide" id="currentOriginalNode">{{ original|truncatewords:"18" }}</div>
    <div class="miniDashPair">
        <button type="button" name="nodeCount" id="miniDashNodeCount" class="minidashbutton">--</button>
        <label for="nodeCount" id="miniDashNodeCountLabel">Node Count</label>
    </div>
    <div class="miniDashPair">
        <button type="button" name="avgLoad" id="miniDashAvgLoad" class="minidashbutton">--</button>
        <label for="avgLoad" id="miniDashAvgLoadLabel">Average Load</label>
    </div>
    <div class="miniDashPair">
        <button type="button" name="bandwidth" id="miniDashBandwidth" class="minidashbutton">--</button>
        <label for="bandwidth" id="miniDashBandwidthLabel">Bandwidth</label>
    </div>
    <div class="endDashPair">
    </div>
</div>

<div id="nodeCountDialog" class="miniDashModal" > 
<div id="nodeCountGraph" ></div>
</div>

<div id="bandwidthDialog" class="miniDashModal" > 
<div id="bandwidthGraph" ></div>
</div>

<div id="avgLoadDialog" class="miniDashModal" > 
<div id="avgLoadGraph" ></div>
</div>

<script>
/** If the analytics have already been set -- read them in on page load **/
if (typeof window != "undefined") {
    if (typeof window.pageAnalyticsData != "undefined") {
        updatePageAnalyticsData(window.pageAnalyticsData);
    }
}

var loadingDiv = '<div class="loading">Loading ...</div>';

$( "#nodeCountDialog" ).dialog({ title: "OpenCloud Node Count", modal: true, position: ['middle', 40], resizable: true, autoOpen: false, width: 527, height: 400});
$( "#miniDashNodeCount" ).click(function() {
    $( "#nodeCountGraph" ).html(loadingDiv);
    $( "#nodeCountDialog" ).dialog("open");
    var options = {"title": "Node Count", "vAxis": {"title": "Number of Nodes", "minValue": 0, "maxValue": 250}};
    console.log(window.pageAnalyticsUrl);
    renderChart(true,"#nodeCountDialog", "#nodeCountGraph", window.pageAnalyticsUrl, 0, 2, google.visualization.data.sum, options);
    });

$( "#bandwidthDialog" ).dialog({ title: "OpenCloud Bandwidth", modal: true, position: ['middle', 40], resizable: true, autoOpen: false, width: 527, height: 400});
$( "#miniDashBandwidth" ).click(function() {
    $("#bandwidthGraph").html(loadingDiv);
    $( "#bandwidthDialog" ).dialog("open");
    var options = {"title": "Total Bandwidth", "vAxis": {"title": "Total Bandwidth (Gbps)"}};
    renderChart(true,"#bandwidthDialog", "#bandwidthGraph", window.pageBandwidthUrl, 0, 1, agg_bandwidth, options);
    });

$( "#avgLoadDialog" ).dialog({ title: "OpenCloud Average Load", modal: true, position: ['middle', 40], resizable: true, autoOpen: false, width: 527, height: 400});
$( "#miniDashAvgLoad" ).click(function() {
    $("#avgLoadGraph").html(loadingDiv);
    $( "#avgLoadDialog" ).dialog("open");
    var options = {"title": "Average CPU Utilization", "vAxis": {"title": "CPU Utilization (%)"}};
    renderChart(true,"#avgLoadDialog", "#avgLoadGraph", window.pageAnalyticsUrl, 0, 1, google.visualization.data.sum, options);
    });

</script>

