]> arthur.barton.de Git - netdata.git/commitdiff
new resizable dashboard; all charts can now have relative width; more code cleanups
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Wed, 2 Dec 2015 00:14:03 +0000 (02:14 +0200)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Wed, 2 Dec 2015 00:14:03 +0000 (02:14 +0200)
web/dashboard.html
web/dashboard.js

index 4c8842b2d5b620e8b030a560e2f416f408b44fb0..023292b9ac99619c8a8f75b12e8854110d861881 100755 (executable)
@@ -1,6 +1,16 @@
-<html>
+<!DOCTYPE html>
+<html lang="en">
 <head>
        <title>NetData Dashboard</title>
+
+       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+       <meta charset="utf-8">
+       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+       <meta name="viewport" content="width=device-width, initial-scale=1">
+       <meta name="apple-mobile-web-app-capable" content="yes">
+       <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+       <meta name="author" content="costa@tsaousis.gr">
+
        <style type="text/css">
                html{font-family:sans-serif;}
        </style>
 This is a template for building custom dashboards. To build a dashboard you just do this:
 
 <pre>
-&lt;html>
+&lt;!DOCTYPE html>
+&lt;html lang="en">
+&lt;head>
+       &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+       &lt;meta charset="utf-8">
+       &lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+       &lt;meta name="viewport" content="width=device-width, initial-scale=1">
+       &lt;meta name="apple-mobile-web-app-capable" content="yes">
+       &lt;meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+&lt;/head>
 &lt;body>
        &lt;div data-netdata="system.processes"
                data-chart-library="dygraph"
@@ -35,246 +54,244 @@ This is a template for building custom dashboards. To build a dashboard you just
        <li>Depending on the width of the chart and <b>data-after</b> attribute, netdata will automatically refresh the chart when it needs to be updated. For example giving 600 pixels for width for -600 seconds of data, using a chart library that needs 3 pixels per point, will yeld in a chart updated once every 3 seconds.</li>
 </ul>
 
-       <table border="0" cellpadding="5" cellspacing="5">
-       <tr>
-               <th width="600">
-               System Processes - Line Chart
-               </th>
-               <th width="600">
-               System ipv4 - Area Chart
-               </th>
-               <th width="600">
-               System CPU - Stacked Area Chart
-               </th>
-       </tr>
-       <tr><td colspan="3">&nbsp;</td></tr>
-       <tr><th colspan="3"><hr>Peity Charts</th></tr>
-       <tr><td colspan="3">
-               Peity charts do not support 'NULL' values, so the charts cannot indicate that values are missing.
-               Peity charts cannot have multiple dimensions on the charts - so netdata will use 'min2max' to show
-               the total of all dimensions.
-               </td></tr>
-       <tr>
-               <td width="600">
-                       <div data-netdata="system.processes"
-                               data-chart-library="peity"
-                               data-width="600"
-                               data-height="30"
-                               data-after="-600"
-                               data-dt-element-name="time11"
-                               </div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.ipv4"
-                               data-chart-library="peity"
-                               data-width="600"
-                               data-height="30"
-                               data-after="-600"
-                               data-dt-element-name="time12"
-                               </div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.cpu"
-                               data-chart-library="peity"
-                               data-width="600"
-                               data-height="30"
-                               data-after="-600"
-                               data-dt-element-name="time13"
-                               </div>
-               </td>
-       </tr>
-       <tr>
-               <td>rendered in <span id="time11">X</span> ms</td>
-               <td>rendered in <span id="time12">X</span> ms</td>
-               <td>rendered in <span id="time13">X</span> ms</td>
-       </tr>
-       <tr><td colspan="3">&nbsp;</td></tr>
-       <tr><th colspan="3"><hr>Sparkline Charts</th></tr>
-       <tr><td colspan="3">
-               Sparkline charts support 'NULL' values, so the charts can indicate that values are missing.
-               Sparkline charts stretch the values to show the variations between values in more detail.
-               They also have mouse-hover support.
-               <br/>
-               Sparklines are fantastic. You can inline charts in text. For example this
-                       <div    data-netdata="system.cpu"
-                                       data-chart-library="sparkline"
-                                       data-width="60"
-                                       data-height="20"
-                                       data-after="-30"
-                                       ></div> is my current cpu usage,
-                       <br/>
-                       while this
-                       <div    data-netdata="netdata.net"
-                                       data-dimensions="out"
-                                       data-chart-library="sparkline"
-                                       data-width="60"
-                                       data-height="20"
-                                       data-after="-30"
-                                       ></div> is the bandwidth my netdata server is currently transmitting and this
-
-                       <div    data-netdata="netdata.requests"
-                                       data-chart-library="sparkline"
-                                       data-width="360"
-                                       data-height="20"
-                                       data-after="-180"
-                                       ></div> is the requests/sec it serves.
-               </td></tr>
-       <tr>
-               <td width="600">
-                       <div data-netdata="system.processes"
-                               data-chart-library="sparkline"
-                               data-width="600"
-                               data-height="30"
-                               data-after="-600"
-                               data-dt-element-name="time21"
-                               ></div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.ipv4"
-                               data-chart-library="sparkline"
-                               data-width="600"
-                               data-height="30"
-                               data-after="-600"
-                               data-dt-element-name="time22"
-                               ></div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.cpu"
-                               data-chart-library="sparkline"
-                               data-width="600"
-                               data-height="30"
-                               data-after="-600"
-                               data-dt-element-name="time23"
-                               ></div>
-               </td>
-       </tr>
-       <tr>
-               <td>rendered in <span id="time21">X</span> ms</td>
-               <td>rendered in <span id="time22">X</span> ms</td>
-               <td>rendered in <span id="time23">X</span> ms</td>
-       </tr>
-       <tr><td colspan="3">&nbsp;</td></tr>
-       <tr><th colspan="3"><hr>Dygraph Charts</th></tr>
-       <tr><td colspan="3">
-               The fastest charting engine that can chart complete charts (not just sparklines).
-               The charts are zoomable (drag their contents to zoom-in, double click to zoom-out).
-               For the moment zooming is just on the presentation layer (the data do not become more detailed when you zoom).
-               </td></tr>
-       <tr>
-               <td width="600">
-                       <div data-netdata="system.processes"
-                               data-chart-library="dygraph"
-                               data-width="600"
-                               data-height="200"
-                               data-after="-600"
-                               data-dt-element-name="time31"
-                               ></div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.ipv4"
-                               data-chart-library="dygraph"
-                               data-width="600"
-                               data-height="200"
-                               data-after="-600"
-                               data-dt-element-name="time32"
-                               ></div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.cpu"
-                               data-chart-library="dygraph"
-                               data-width="600"
-                               data-height="200"
-                               data-after="-600"
-                               data-dt-element-name="time33"
-                               ></div>
-               </td>
-       </tr>
-       <tr>
-               <td>rendered in <span id="time31">X</span> ms</td>
-               <td>rendered in <span id="time32">X</span> ms</td>
-               <td>rendered in <span id="time33">X</span> ms</td>
-       </tr>
-       <tr><td colspan="3">&nbsp;</td></tr>
-       <tr><th colspan="3"><hr>Google Charts</th></tr>
-       <tr><td colspan="3">
-               NetData was originaly developed with Google Charts.
-               NetData is a complete Google Visualization API provider.
-               </td></tr>
-       <tr>
-               <td width="600">
-                       <div data-netdata="system.processes"
-                               data-chart-library="google"
-                               data-width="600"
-                               data-height="200"
-                               data-after="-600"
-                               data-dt-element-name="time51"
-                               ></div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.ipv4"
-                               data-chart-library="google"
-                               data-width="600"
-                               data-height="200"
-                               data-after="-600"
-                               data-dt-element-name="time52"
-                               ></div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.cpu"
-                               data-chart-library="google"
-                               data-width="600"
-                               data-height="200"
-                               data-after="-600"
-                               data-dt-element-name="time53"
-                               ></div>
-               </td>
-       </tr>
-       <tr>
-               <td>rendered in <span id="time51">X</span> ms</td>
-               <td>rendered in <span id="time52">X</span> ms</td>
-               <td>rendered in <span id="time53">X</span> ms</td>
-       </tr>
-       <tr><td colspan="3">&nbsp;</td></tr>
-       <tr><th colspan="3"><hr>Morris Charts</th></tr>
-       <tr><td colspan="3">
-               Unfortunatelly, Morris Charts are veeeeeeeeeeeeeeeery slow! We force them to lower their detail to get acceptable results.
-               And they have issues with negative numbers in area charts...
-               </td></tr>
-       <tr>
-               <td width="600">
-                       <div data-netdata="system.processes"
-                               data-chart-library="morris"
-                               data-width="600"
-                               data-height="200"
-                               data-after="-600"
-                               data-dt-element-name="time41"
-                               ></div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.ipv4"
-                               data-chart-library="morris"
-                               data-width="600"
-                               data-height="200"
-                               data-after="-600"
-                               data-dt-element-name="time42"
-                               ></div>
-               </td>
-               <td width="600">
-                       <div data-netdata="system.cpu"
-                               data-chart-library="morris"
-                               data-width="600"
-                               data-height="200"
-                               data-after="-600"
-                               data-dt-element-name="time43"
-                               ></div>
-               </td>
-       </tr>
-       <tr>
-               <td>rendered in <span id="time41">X</span> ms</td>
-               <td>rendered in <span id="time42">X</span> ms</td>
-               <td>rendered in <span id="time43">X</span> ms</td>
-       </tr>
-       </table>
+
+<hr>
+<h1>Sparkline Charts</h1>
+Sparkline charts support 'NULL' values, so the charts can indicate that values are missing.
+Sparkline charts stretch the values to show the variations between values in more detail.
+They also have mouse-hover support.
+<br/>
+<b>Sparklines are fantastic</b>. You can inline charts in text. For example this
+       <div    data-netdata="system.cpu"
+                       data-chart-library="sparkline"
+                       data-width="5%"
+                       data-height="20"
+                       data-after="-30"
+                       ></div> is my current cpu usage (last 30 seconds),
+       while this
+       <div    data-netdata="netdata.net"
+                       data-dimensions="out"
+                       data-chart-library="sparkline"
+                       data-width="10%"
+                       data-height="20"
+                       data-after="-60"
+                       ></div> is the bandwidth my netdata server is currently transmitting (last minute)
+       and this
+       <div    data-netdata="netdata.requests"
+                       data-chart-library="sparkline"
+                       data-width="20%"
+                       data-height="20"
+                       data-after="-180"
+                       ></div> is the requests/sec it serves (last 3 minutes).
+
+<br/>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.processes"
+               data-chart-library="sparkline"
+               data-width="100%"
+               data-height="30"
+               data-after="-600"
+               data-dt-element-name="time101"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time101">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.ipv4"
+               data-chart-library="sparkline"
+               data-width="100%"
+               data-height="30"
+               data-after="-600"
+               data-dt-element-name="time102"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time102">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.cpu"
+               data-chart-library="sparkline"
+               data-width="100%"
+               data-height="30"
+               data-after="-600"
+               data-dt-element-name="time103"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time103">X</span> ms</small>
+</div>
+
+
+
+<hr>
+<h1>Peity Charts</h1>
+Peity charts do not support 'NULL' values, so the charts cannot indicate that values are missing.
+Peity charts cannot have multiple dimensions on the charts - so netdata will use 'min2max' to show
+the total of all dimensions.
+<br/>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.processes"
+               data-chart-library="peity"
+               data-width="100%"
+               data-height="30"
+               data-after="-600"
+               data-dt-element-name="time001"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time001">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.ipv4"
+               data-chart-library="peity"
+               data-width="100%"
+               data-height="30"
+               data-after="-600"
+               data-dt-element-name="time002"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time002">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.cpu"
+               data-chart-library="peity"
+               data-width="100%"
+               data-height="30"
+               data-after="-600"
+               data-dt-element-name="time003"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time003">X</span> ms</small>
+</div>
+
+
+
+
+<hr>
+<h1>Dygraph Charts</h1>
+The fastest charting engine that can chart complete charts (not just sparklines).
+The charts are zoomable (drag their contents to zoom-in, double click to zoom-out).
+For the moment zooming is just on the presentation layer (the data do not become more detailed when you zoom).
+<br/>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.processes"
+               data-chart-library="dygraph"
+               data-width="100%"
+               data-height="200"
+               data-after="-600"
+               data-dt-element-name="time201"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time201">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.ipv4"
+               data-chart-library="dygraph"
+               data-width="100%"
+               data-height="200"
+               data-after="-600"
+               data-dt-element-name="time202"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time202">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.cpu"
+               data-chart-library="dygraph"
+               data-width="100%"
+               data-height="200"
+               data-after="-600"
+               data-dt-element-name="time203"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time203">X</span> ms</small>
+</div>
+
+
+
+
+<hr>
+<h1>Google Charts</h1>
+NetData was originaly developed with Google Charts.
+NetData is a complete Google Visualization API provider.
+<br/>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.processes"
+               data-chart-library="google"
+               data-width="100%"
+               data-height="200"
+               data-after="-600"
+               data-dt-element-name="time301"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time301">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.ipv4"
+               data-chart-library="google"
+               data-width="100%"
+               data-height="200"
+               data-after="-600"
+               data-dt-element-name="time302"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time302">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.cpu"
+               data-chart-library="google"
+               data-width="100%"
+               data-height="200"
+               data-after="-600"
+               data-dt-element-name="time303"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time303">X</span> ms</small>
+</div>
+
+
+
+
+
+
+<hr>
+<h1>Morris Charts</h1>
+Unfortunatelly, Morris Charts are veeeeeeeeeeeeeeeery slow! We force them to lower their detail to get acceptable results.
+<br/>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.processes"
+               data-chart-library="morris"
+               data-width="100%"
+               data-height="200"
+               data-after="-600"
+               data-dt-element-name="time401"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time401">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.ipv4"
+               data-chart-library="morris"
+               data-width="100%"
+               data-height="200"
+               data-after="-600"
+               data-dt-element-name="time402"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time402">X</span> ms</small>
+</div>
+<div style="width: 32%; display: inline-block;">
+       <div data-netdata="system.cpu"
+               data-chart-library="morris"
+               data-width="100%"
+               data-height="200"
+               data-after="-600"
+               data-dt-element-name="time403"
+               ></div>
+       <br/>
+       <small>rendered in <span id="time403">X</span> ms</small>
+</div>
+
+
+
+
 
 </body>
 </html>
index 2639418980120801387595e3ab514f9a04fc5272..fbb8b2fe89934825ad5abf8e308c38e994d3870f 100755 (executable)
@@ -16,6 +16,9 @@
 
 (function(window)
 {
+       // fix IE bug with console
+       if(!window.console){ window.console = {log: function(){} }; }
+
        var NETDATA = window.NETDATA || {};
 
        // ----------------------------------------------------------------------------------------------------------------
 
        NETDATA.chartDefaults = {
                host: NETDATA.serverDefault,    // the server to get data from
-               width: 100,                                             // the chart width
-               height: 20,                                             // the chart height
-               library: 'peity',                               // the graphing library to use
+               width: '100%',                                  // the chart width
+               height: '100%',                                 // the chart height
+               library: 'dygraph',                             // the graphing library to use
                method: 'average',                              // the grouping method
                before: 0,                                              // panning
                after: -600,                                    // panning
-               pixels_per_point: 1,                                    // the detail of the chart
+               pixels_per_point: 1                             // the detail of the chart
        }
 
        NETDATA.options = {
-               targets: null,
+               targets: null,                          
                updated_dom: 1,
                debug: 1,
+               last_paused: 0,
 
                current: {
                        pixels_per_point: 1,
-                       idle_between_charts: 50,
-                       idle_between_loops: 100,
-                       debug: 1
+                       idle_between_charts: 100,
+                       idle_between_loops: 500,
+                       fast_render_timeframe: 200 // render continously for these many ms
                }
        }
 
                100: { message: "Cannot load chart library", alert: true },
                101: { message: "Cannot load jQuery", alert: true },
                402: { message: "Chart library not found", alert: false },
-               404: { message: "Chart not found", alert: false },
+               404: { message: "Chart not found", alert: false }
        };
        NETDATA.errorLast = {
                code: 0,
                message: "",
-               datetime: 0,
+               datetime: 0
        };
 
        NETDATA.error = function(code, msg) {
                NETDATA.errorLast.datetime = 0;
        }
 
-       NETDATA.chartContainer = function(element, width, height) {
+       NETDATA.messageInABox = function(element, message) {
                self = $(element);
-               self.css('width', width)
-                       .css('height', height)
-                       .css('display', 'inline-block')
-                       .css('overflow', 'hidden');
-       }
 
-       NETDATA.messageInABox = function(element, width, height, message) {
-               NETDATA.chartContainer(element, width, height);
-               element.innerHTML = '<div style="overflow: hidden; border: 0px; background-color: lightgrey; width: ' + width + '; height: ' + height + ';"><small>'
+               bgcolor = ""
+               if(NETDATA.options.debug)
+                       bgcolor = " background-color: lightgrey;";
+
+               element.innerHTML = '<div style="overflow: hidden;' + bgcolor + ' width: 100%; height: 100%;"><small>'
                        + message
                        + '</small></div>';
+
+               self.data('created', false);
        }
 
        // ----------------------------------------------------------------------------------------------------------------
                        callback();
        }
 
-       NETDATA.generateChartDataURL = function(options) {
+       NETDATA.generateChartDataURL = function() {
+               self = $(this);
+
+               var chart = self.data('chart');
+               var host = self.data('host') || NETDATA.chartDefaults.host;
+               var width = self.width();
+               var height = self.height();
+               var method = self.data('method') || NETDATA.chartDefaults.method;
+               var after = self.data('after') || NETDATA.chartDefaults.after;
+               var before = self.data('before') || NETDATA.chartDefaults.before;
+               var library = self.data('chart-library') || NETDATA.chartDefaults.library;
+               var dimensions = self.data('dimensions') || null;
+               var pixels_per_point = self.data('pixels-per-point') || NETDATA.chartLibraries[library].pixels_per_point;
+
+               // force an options provided detail
+               if(pixels_per_point < NETDATA.options.current.pixels_per_point)
+                       pixels_per_point = NETDATA.options.current.pixels_per_point
+
+               var points = self.data('points') || Math.round(width / pixels_per_point);
+
                // build the data URL
-               var url = options.host + options.url;
-               url += "&points=";
-               url += options.points.toString();
-               url += "&group=";
-               url += options.method;
-               url += "&after=";
-               url += options.after || "0";
-               url += "&before=";
-               url += options.before || "0";
-               url += "&options=" + NETDATA.chartLibraries[options.library].options + '|';
-               url += (options.non_zero)?"nonzero":"";
-               url += "&format=" + NETDATA.chartLibraries[options.library].format;
-
-               if(options.dimensions)
-                       url += "&dimensions=" + options.dimensions;
-
-               if(NETDATA.options.debug) console.log('generateChartDataURL(' + options + ') = ' + url );
+               var url = host + chart.data_url;
+               url += "&format="  + NETDATA.chartLibraries[library].format;
+               url += "&points="  + points.toString();
+               url += "&options=" + NETDATA.chartLibraries[library].options;
+               url += "&group="   + method;
+
+               if(after)
+                       url += "&after="  + after.toString();
+
+               if(before)
+                       url += "&before=" + before.toString();
+
+               if(dimensions)
+                       url += "&dimensions=" + dimensions;
+
+               self.data('calculated-width', width)
+                       .data('calculated-height', height)
+                       .data('calculated-points', points)
+                       .data('calculated-url', url);
+
+               if(NETDATA.options.debug) console.log('generateChartDataURL(): ' + url + ' WxH:' + width + 'x' + height + ' points: ' + points + ' library: ' + library);
                return url;
        }
 
-       NETDATA.parseDomCharts = function(targets, index, callback) {
-               if(NETDATA.options.debug) console.log('parseDomCharts() working on ' + index);
+       NETDATA.validateDomCharts = function(targets, index, callback) {
+               if(NETDATA.options.debug) console.log('validateDomCharts() working on ' + index);
 
                var target = targets.get(index);
                if(target == null) {
-                       if(NETDATA.options.debug) console.log('parseDomCharts(): all ' + (index - 1) + ' charts parsed.');
+                       if(NETDATA.options.debug) console.log('validateDomCharts(): all ' + (index - 1) + ' charts parsed.');
                        if(typeof callback == 'function') callback();
                }
                else {
                        var self = $(target);
                        if(!self.data('prepared')) {
-                               self.data('prepared', true);
+                               self.data('prepared', true)
+                                       .data('updated', 0)
+                                       .data('created', false)
+                                       .data('enabled', false);
 
                                var id = self.data('netdata');
                                var host = self.data('host') || NETDATA.chartDefaults.host;
-                               var width = self.data('width') || NETDATA.chartDefaults.width;
-                               var height = self.data('height') || NETDATA.chartDefaults.height;
-                               var method = self.data('method') || NETDATA.chartDefaults.method;
-                               var after = self.data('after') || NETDATA.chartDefaults.after;
-                               var before = self.data('before') || NETDATA.chartDefaults.before;
                                var library = self.data('chart-library') || NETDATA.chartDefaults.library;
-                               var dimensions = self.data('dimensions') || null;
 
-                               NETDATA.chartContainer(target, width, height);
-                               if(NETDATA.options.debug) console.log('parseDomCharts() parsing ' + id + ' of type ' + library);
+                               if(NETDATA.options.debug) console.log('validateDomCharts() parsing ' + id + ' of type ' + library);
 
                                if(typeof NETDATA.chartLibraries[library] == 'undefined') {
-                                       self.data('created', false)
-                                               .data('updated', 0)
-                                               .data('enabled', false);
-
                                        NETDATA.error(402, library);
-                                       NETDATA.messageInABox(target, width, height, 'chart library "' + library + '" is not found');
-
-                                       NETDATA.parseDomCharts(targets, ++index, callback);
+                                       NETDATA.messageInABox(target, 'chart library "' + library + '" is not found');
+                                       NETDATA.validateDomCharts(targets, ++index, callback);
                                }
                                else {
                                        var url = host + "/api/v1/chart?chart=" + id;
                                                crossDomain: true
                                        })
                                        .done(function(chart) {
-                                               var pixels_per_point = self.data('point-width') || NETDATA.chartLibraries[library].pixels_per_point;
-                                               var points = self.data('points') || Math.round(width / pixels_per_point);
-
-                                               var url = NETDATA.generateChartDataURL({
-                                                       host: host,
-                                                       url: chart.data_url,
-                                                       dimensions: dimensions,
-                                                       library: library,
-                                                       method: method,
-                                                       before: before,
-                                                       points: points,
-                                                       after: after,
-                                                       non_zero: null
-                                               });
-
-                                               // done processing of this DIV
-                                               // store the processing result, in
-                                               // 'data' sections in the DIV
                                                self.data('chart', chart)
-                                                       .data('chart-url', url)
                                                        .data('update-every', chart.update_every * 1000)
-                                                       .data('created', false)
-                                                       .data('updated', 0)
                                                        .data('enabled', true)
                                                        .data('host', host)
-                                                       .data('width', width)
-                                                       .data('height', height)
-                                                       .data('method', method)
-                                                       .data('after', after)
-                                                       .data('before', before)
-                                                       .data('chart-library', library)
-                                                       .data('dimensions', dimensions)
-                                                       ;
-                                               
-                                               NETDATA.messageInABox(target, width, height, 'chart "' + id + '" is loading...');
+                                                       .data('chart-library', library);
                                        })
                                        .fail(function() {
-                                               self.data('created', false)
-                                                       .data('enabled', false);
-
                                                NETDATA.error(404, url);
-                                               NETDATA.messageInABox(target, width, height, 'chart "' + id + '" not found on url "' + url + '"');
+                                               NETDATA.messageInABox(target, 'chart "' + id + '" not found on url "' + url + '"');
                                        })
                                        .always(function() {
-                                               self.data('updated', 0);
-                                               NETDATA.parseDomCharts(targets, ++index, callback);
+                                               NETDATA.validateDomCharts(targets, ++index, callback);
                                        });
                                }
                        }
                }
        }
 
+       NETDATA.sizeDomCharts = function(targets, index, callback) {
+               // this is used to quickly size all charts to their size
+
+               if(NETDATA.options.debug) console.log('sizeDomCharts() working on ' + index);
+
+               var target = targets.get(index);
+               if(target == null) {
+                       if(NETDATA.options.debug) console.log('sizeDomCharts(): all ' + (index - 1) + ' charts sized.');
+                       if(typeof callback == 'function') callback();
+               }
+               else {
+                       var self = $(target);
+
+                       var id = self.data('netdata');
+                       var width = self.data('width') || NETDATA.chartDefaults.width;
+                       var height = self.data('height') || NETDATA.chartDefaults.height;
+
+                       self.css('width', width)
+                               .css('height', height)
+                               .css('display', 'inline-block')
+                               .css('overflow', 'hidden');
+
+                       NETDATA.messageInABox(target, 'chart "' + id + '" is loading...');
+                       NETDATA.sizeDomCharts(targets, ++index, callback);
+               }
+       }
+
        NETDATA.domUpdated = function(callback) {
                NETDATA.options.updated_dom = 0;
 
-               NETDATA.options.targets = $('div[data-netdata]') // .filter(':visible')
+               NETDATA.options.targets = $('div[data-netdata]').filter(':visible')
                        .bind('create', function(event, data) {
                                var self = $(this);
-                               try {
+                               
+                               if(NETDATA.options.debug)
                                        NETDATA.chartLibraries[self.data('chart-library')].create(this, data);
-                               }
-                               catch(err) {
-                                       NETDATA.messageInABox(this, self.data('width'), self.data('height'), 'chart "' + id + '" failed to be created as ' + self.data('chart-library'));
+                               else {
+                                       try {
+                                               NETDATA.chartLibraries[self.data('chart-library')].create(this, data);
+                                       }
+                                       catch(err) {
+                                               NETDATA.messageInABox(this, 'chart "' + self.data('netdata') + '" failed to be created as ' + self.data('chart-library'));
+                                               self.data('created', false);
+                                       }
                                }
                        })
                        .bind('update', function(event, data) {
                                var self = $(this);
-                               try {
+                               if(NETDATA.options.debug)
                                        NETDATA.chartLibraries[self.data('chart-library')].update(this, data);
-                               }
-                               catch(err) {
-                                       NETDATA.messageInABox(this, self.data('width'), self.data('height'), 'chart "' + id + '" failed to be updated as ' + self.data('chart-library'));
+                               else {
+                                       try {
+                                               NETDATA.chartLibraries[self.data('chart-library')].update(this, data);
+                                       }
+                                       catch(err) {
+                                               NETDATA.messageInABox(this, 'chart "' + self.data('netdata') + '" failed to be updated as ' + self.data('chart-library'));
+                                               self.data('created', false);
+                                       }
                                }
                        });
 
                if(NETDATA.options.debug)
                        console.log('DOM updated - there are ' + NETDATA.options.targets.length + ' charts on page.');
 
-               NETDATA.parseDomCharts(NETDATA.options.targets, 0, callback);
+               NETDATA.sizeDomCharts(NETDATA.options.targets, 0, function() {
+                       NETDATA.validateDomCharts(NETDATA.options.targets, 0, callback);
+               });
        }
 
        NETDATA.init = function() {
+               // this should be called only once
                NETDATA.domUpdated(function() {
-                       // done processing all netdata DIVs in this page
-                       // call the refresh handler
-
-                       // FIXME
                        NETDATA.chartRefresher(0);
                });
        }
                else {
                        console.log(self.data('netdata') + ' is visible, downloading data...');
                        $.ajax( {
-                               url: self.data('chart-url'),
+                               url: NETDATA.generateChartDataURL.call(element), // self.data('chart-url'),
                                crossDomain: true
                        })
                        .then(function(data) {
                                }
                        })
                        .fail(function() {
-                               NETDATA.messageInABox(element, self.data('width'), self.data('height'), 'cannot download chart "' + self.data('netdata') + '" values from url "' + self.data('chart-url') + '"');
+                               NETDATA.messageInABox(element, 'cannot download chart "' + self.data('netdata') + '" values from url "' + self.data('chart-url') + '"');
                        })
                        .always(function() {
                                if(typeof callback == 'function') callback();
        NETDATA.chartRefresher = function(index) {
                // if(NETDATA.options.debug) console.log('NETDATA.chartRefresher(<targets, ' + index + ')');
 
+               now = new Date().getTime();
+
                if(NETDATA.options.updated_dom) {
                        NETDATA.domUpdated(function() {
                                NETDATA.chartRefresher(0);
                else {
                        var target = NETDATA.options.targets.get(index);
                        if(target == null) {
-                               console.log('waiting to restart main loop...');
+                               if(NETDATA.options.debug) console.log('waiting to restart main loop...');
+                               NETDATA.options.last_paused = now;
 
-                               // finished, restart
                                setTimeout(function() {
                                        NETDATA.chartRefresher(0);
                                }, NETDATA.options.current.idle_between_loops);
                                        NETDATA.chartRefresher(++index);
                                }
                                else {
-                                       setTimeout(function() {
+                                       if(now - NETDATA.options.last_paused < NETDATA.options.current.fast_render_timeframe) {
+                                               if(NETDATA.options.debug) console.log('fast rendering...');
+
                                                NETDATA.chartValuesDownloader(target, function() {
                                                        NETDATA.chartRefresher(++index);
                                                });
-                                       }, NETDATA.options.current.idle_between_charts);
+                                       }
+                                       else {
+                                               if(NETDATA.options.debug) console.log('waiting for next refresh...');
+                                               NETDATA.options.last_paused = now;
+
+                                               setTimeout(function() {
+                                                       NETDATA.chartValuesDownloader(target, function() {
+                                                               NETDATA.chartRefresher(++index);
+                                                       });
+                                               }, NETDATA.options.current.idle_between_charts);
+                                       }
                                }
                        }
                }
 
        NETDATA.peityChartUpdate = function(element, data) {
                var self = $(element);
-               var instance = self.html(data).not('[data-created]');
-               instance.change();
+               var instance = self.data('peity-instance');
+               var ins = $(instance);
+               ins.html(data);
+
+               // peity.change() does not accept options
+               // to pass width and height
+               //ins.change();
+               ins.peity('line', { width: self.data('calculated-width'), height: self.data('calculated-height') })
        }
 
        NETDATA.peityChartCreate = function(element, data) {
                var self = $(element);
-               var width = self.data('width') || NETDATA.chartDefaults.width;
-               var height = self.data('height') || NETDATA.chartDefaults.height;
-               var instance = self.html(data).not('[data-created]');
 
-               instance.peity('line', {
-                       width: width,
-                       height: height
-               })
-               .data('created', true);
+               if(!NETDATA.chartLibraries.peity.initialized) {
+                       if(!NETDATA.chartLibraries.peity.enabled) {
+                               NETDATA.messageInABox(element, 'peity is disabled.');
+                       }
+                       else {
+                               NETDATA.messageInABox(element, 'peity is initializing...');
+
+                       }
+               }
+
+               var uuid = NETDATA.guid();
+               element.innerHTML = '<div id="' + uuid + '">' + data + '</div>';
+               var instance = document.getElementById(uuid);
+               var ins = $(instance);
+
+               ins.peity('line', { width: self.data('calculated-width'), height: self.data('calculated-height') })
+
+               self.data('peity-uuid', uuid)
+                       .data('peity-instance', instance)
+                       .data('created', true);
        }
 
        // ----------------------------------------------------------------------------------------------------------------
        NETDATA.sparklineChartUpdate = function(element, data) {
                var self = $(element);
                var options = self.data('sparkline-options');
+               options.width = self.data('calculated-width');
+               options.height = self.data('calculated-height');
                self.sparkline(data, options);
        }
 
        NETDATA.sparklineChartCreate = function(element, data) {
                var self = $(element);
                var chart = self.data('chart');
-               var width = self.data('width') || NETDATA.chartDefaults.width;
-               var height = self.data('height') || NETDATA.chartDefaults.height;
                var type = self.data('sparkline-type') || 'line';
                var lineColor = self.data('sparkline-lineColor') || undefined;
                var fillColor = self.data('sparkline-fillColor') || (chart.chart_type == 'line')?'#FFF':undefined;
                        numberDecimalMark: numberDecimalMark,
                        numberDigitGroupCount: numberDigitGroupCount,
                        animatedZooms: animatedZooms,
-                       width: width,
-                       height: height
+                       width: self.data('calculated-width'),
+                       height: self.data('calculated-height')
                };
 
                var uuid = NETDATA.guid();
 
                if(dygraph != null) {
                        console.log('updating dygraphs');
-                       dygraph.updateOptions( { 'file': data.data, 'labels': data.labels } );
+                       dygraph.updateOptions({
+                               file: data.data,
+                               labels: data.labels,
+                               labelsDivWidth: self.width() - 70
+                       });
                }
                else
                        console.log('not updating dygraphs');
 
        NETDATA.dygraphChartCreate = function(element, data) {
                var self = $(element);
-               var width = self.data('width') || NETDATA.chartDefaults.width;
-               var height = self.data('height') || NETDATA.chartDefaults.height;
                var chart = self.data('chart');
                var title = self.data('dygraph-title') || chart.title;
                var titleHeight = self.data('dygraph-titleHeight') || 20;
                var hideOverlayOnMouseOut = self.data('dygraph-hideOverlayOnMouseOut') || true;
                var fillGraph = self.data('dygraph-fillGraph') || (chart.chart_type == 'area')?true:false;
                var drawPoints = self.data('dygraph-drawPoints') || false;
-               var labelsDivStyles = self.data('dygraph-labelsDivStyles') || { 'fontSize':'10' };
-               var labelsDivWidth = self.data('dygraph-labelsDivWidth') || 250;
+               var labelsDivStyles = self.data('dygraph-labelsDivStyles') || { 'fontSize':'10px' };
+               // var labelsDivWidth = self.data('dygraph-labelsDivWidth') || 250;
+               var labelsDivWidth = self.width() - 70;
                var labelsSeparateLines = self.data('dygraph-labelsSeparateLines') || false;
                var labelsShowZeroValues = self.data('dygraph-labelsShowZeroValues') || true;
                var legend = self.data('dygraph-legend') || 'onmouseover';
                        showRoller: showRoller,
                        valueFormatter: valueFormatter,
                        rightGap: rightGap,
-                       width: width,
-                       height: height,
                        labels: data.labels,
                        axes: {
                                x: {
                                        }
                                },
                                y: {
-                                       pixelsPerLabel: 15,
+                                       pixelsPerLabel: 15
                                }
                        }
                };
 
                var uuid = NETDATA.guid();
-               self.html('<div id="' + uuid + '"></div>');
+               self.html('<div id="' + uuid + '" style="width: 100%; height: 100%;"></div>');
 
                var dchart = new Dygraph(document.getElementById(uuid),
                        data.data, options);
 
                self.data('dygraph-instance', dchart)
-               .data('dygraph-options', options)
-               .data('uuid', uuid)
-               .data('created', true);
+                       .data('dygraph-options', options)
+                       .data('uuid', uuid)
+                       .data('created', true);
 
                //NETDATA.dygraphAllCharts.push(dchart);
                //if(NETDATA.dygraphAllCharts.length > 1)
 
        NETDATA.morrisChartUpdate = function(element, data) {
                var self = $(element);
-               var width = self.data('width') || NETDATA.chartDefaults.width;
-               var height = self.data('height') || NETDATA.chartDefaults.height;
                var morris = self.data('morris-instance');
 
                if(typeof data.update_every != 'undefined')
 
        NETDATA.morrisChartCreate = function(element, data) {
                var self = $(element);
-               var width = self.data('width') || NETDATA.chartDefaults.width;
-               var height = self.data('height') || NETDATA.chartDefaults.height;
                var chart = self.data('chart');
 
-               self.html('<div id="morris-' + chart.id + '" style="width: ' + width + 'px; height: ' + height + 'px;"></div>');
+               var uuid = NETDATA.guid();
+               self.html('<div id="' + uuid + '" style="width: ' + self.data('calculated-width') + 'px; height: ' + self.data('calculated-height') + 'px;"></div>');
 
                // remove the 'time' element from the labels
                data.labels.splice(0, 1);
 
                var options = {
-                               element: 'morris-' + chart.id,
+                               element: uuid,
                                data: data.data,
                                xkey: 'time',
                                ykeys: data.labels,
                                hideHover: 'auto',
                                parseTime: true,
                                continuousLine: false,
-                               behaveLikeLine: false,
-                               width: width,
-                               height: height
+                               behaveLikeLine: false
                };
 
                var morris;
 
        NETDATA.raphaelChartUpdate = function(element, data) {
                var self = $(element);
-               var width = self.data('width') || NETDATA.chartDefaults.width;
-               var height = self.data('height') || NETDATA.chartDefaults.height;
 
                self.raphael(data, {
-                       width: width,
-                       height: height
+                       width: self.data('calculated-width'),
+                       height: self.data('calculated-height')
                })
        };
 
        NETDATA.raphaelChartCreate = function(element, data) {
                var self = $(element);
-               var width = self.data('width') || NETDATA.chartDefaults.width;
-               var height = self.data('height') || NETDATA.chartDefaults.height;
 
                self.raphael(data, {
-                       width: width,
-                       height: height
+                       width: self.data('calculated-width'),
+                       height: self.data('calculated-height')
                })
                .data('created', true);
        };
 
        NETDATA.googleChartUpdate = function(element, data) {
                var self = $(element);
-               var width = self.data('width') || NETDATA.chartDefaults.width;
-               var height = self.data('height') || NETDATA.chartDefaults.height;
                var gchart = self.data('google-instance');
                var options = self.data('google-options');
 
 
        NETDATA.googleChartCreate = function(element, data) {
                var self = $(element);
-               var width = self.data('width') || NETDATA.chartDefaults.width;
-               var height = self.data('height') || NETDATA.chartDefaults.height;
                var chart = self.data('chart');
 
                var datatable = new google.visualization.DataTable(data);
                var gchart;
 
                var options = {
-                       width: width,
-                       height: height,
+                       // do not set width, height - the chart resizes itself
+                       //width: self.data('calculated-width'),
+                       //height: self.data('calculated-height'),
                        lineWidth: 1,
                        title: chart.title,
                        fontSize: 11,
                        isStacked: false
                };
 
+               var uuid = NETDATA.guid();
+               self.html('<div id="' + uuid + '" style="width: 100%; height: 100%;"></div>');
+
                switch(chart.chart_type) {
                        case "area":
                                options.vAxis.viewWindowMode = 'maximized';
-                               gchart = new google.visualization.AreaChart(element);
+                               gchart = new google.visualization.AreaChart(document.getElementById(uuid));
                                break;
 
                        case "stacked":
                                options.vAxis.viewWindowMode = 'maximized';
                                options.vAxis.minValue = null;
                                options.vAxis.maxValue = null;
-                               gchart = new google.visualization.AreaChart(element);
+                               gchart = new google.visualization.AreaChart(document.getElementById(uuid));
                                break;
 
                        default:
                        case "line":
                                options.lineWidth = 2;
-                               gchart = new google.visualization.LineChart(element);
+                               gchart = new google.visualization.LineChart(document.getElementById(uuid));
                                break;
                }
 
                gchart.draw(datatable, options);
 
                self.data('google-instance', gchart)
-               .data('google-options', options)
-               .data('created', true);
+                       .data('google-options', options)
+                       .data('uuid', uuid)
+                       .data('created', true);
        };
 
        // ----------------------------------------------------------------------------------------------------------------