1 // You can set the following variables before loading this script:
3 // var netdataStopDygraph = 1; // do not use dygraph
4 // var netdataStopSparkline = 1; // do not use sparkline
5 // var netdataStopPeity = 1; // do not use peity
6 // var netdataStopGoogleCharts = 1; // do not use google
7 // var netdataStopMorris = 1; // do not use morris
9 // You can also set the default netdata server, using the following.
10 // When this variable is not set, we assume the page is hosted on your
11 // netdata server already.
12 // var netdataServer = "http://yourhost:19999"; // set your NetData server
16 // fix IE bug with console
17 if(!window.console){ window.console = {log: function(){} }; }
19 var NETDATA = window.NETDATA || {};
21 // ----------------------------------------------------------------------------------------------------------------
22 // Detect the netdata server
24 // http://stackoverflow.com/questions/984510/what-is-my-script-src-url
25 // http://stackoverflow.com/questions/6941533/get-protocol-domain-and-port-from-url
26 NETDATA._scriptSource = function(scripts) {
27 var script = null, base = null;
29 if(typeof document.currentScript != 'undefined') {
30 script = document.currentScript;
33 var all_scripts = document.getElementsByTagName('script');
34 script = all_scripts[all_scripts.length - 1];
37 if (script.getAttribute.length != 'undefined')
40 script = script.getAttribute('src', -1);
42 var link = document.createElement('a');
43 link.setAttribute('href', script);
45 if(!link.protocol || !link.hostname) return null;
48 if(base) base += "//";
49 base += link.hostname;
51 if(link.port) base += ":" + link.port;
57 if(typeof netdataServer != 'undefined')
58 NETDATA.serverDefault = netdataServer + "/";
60 NETDATA.serverDefault = NETDATA._scriptSource();
62 NETDATA.jQuery = NETDATA.serverDefault + 'lib/jquery-1.11.3.min.js';
63 NETDATA.peity_js = NETDATA.serverDefault + 'lib/jquery.peity.min.js';
64 NETDATA.sparkline_js = NETDATA.serverDefault + 'lib/jquery.sparkline.min.js';
65 NETDATA.dygraph_js = NETDATA.serverDefault + 'lib/dygraph-combined.js';
66 NETDATA.raphael_js = NETDATA.serverDefault + 'lib/raphael-min.js';
67 NETDATA.morris_js = NETDATA.serverDefault + 'lib/morris.min.js';
68 NETDATA.morris_css = NETDATA.serverDefault + 'css/morris.css';
69 NETDATA.google_js = 'https://www.google.com/jsapi';
70 NETDATA.colors = [ '#3366CC', '#DC3912', '#FF9900', '#109618', '#990099', '#3B3EAC', '#0099C6',
71 '#DD4477', '#66AA00', '#B82E2E', '#316395', '#994499', '#22AA99', '#AAAA11',
72 '#6633CC', '#E67300', '#8B0707', '#329262', '#5574A6', '#3B3EAC' ];
74 // ----------------------------------------------------------------------------------------------------------------
75 // the defaults for all charts
77 NETDATA.chartDefaults = {
78 host: NETDATA.serverDefault, // the server to get data from
79 width: '100%', // the chart width
80 height: '100%', // the chart height
81 library: 'dygraph', // the graphing library to use
82 method: 'average', // the grouping method
84 after: -600, // panning
85 pixels_per_point: 1 // the detail of the chart
94 refreshed_stop_until: 0,
98 idle_between_charts: 100,
99 idle_between_loops: 500,
100 idle_lost_focus: 500,
101 fast_render_timeframe: 200 // render continously for these many ms
117 if(NETDATA.options.debug.main_loop) console.log('welcome to NETDATA');
120 // ----------------------------------------------------------------------------------------------------------------
123 NETDATA.errorCodes = {
124 100: { message: "Cannot load chart library", alert: true },
125 101: { message: "Cannot load jQuery", alert: true },
126 402: { message: "Chart library not found", alert: false },
127 403: { message: "Chart library not enabled/is failed", alert: false },
128 404: { message: "Chart not found", alert: false }
130 NETDATA.errorLast = {
136 NETDATA.error = function(code, msg) {
137 NETDATA.errorLast.code = code;
138 NETDATA.errorLast.message = msg;
139 NETDATA.errorLast.datetime = new Date().getTime();
141 console.log("ERROR " + code + ": " + NETDATA.errorCodes[code].message + ": " + msg);
143 if(NETDATA.errorCodes[code].alert)
144 alert("ERROR " + code + ": " + NETDATA.errorCodes[code].message + ": " + msg);
147 NETDATA.errorReset = function() {
148 NETDATA.errorLast.code = 0;
149 NETDATA.errorLast.message = "You are doing fine!";
150 NETDATA.errorLast.datetime = 0;
153 NETDATA.messageInABox = function(element, message) {
157 if(NETDATA.options.debug.show_boxes)
158 bgcolor = " background-color: lightgrey;";
160 element.innerHTML = '<div style="font-size: xx-small; overflow: hidden;' + bgcolor + ' width: 100%; height: 100%;"><small>'
164 self.data('chart-created', false);
167 // ----------------------------------------------------------------------------------------------------------------
170 // Load a script without jquery
171 // This is used to load jquery - after it is loaded, we use jquery
172 NETDATA._loadjQuery = function(callback) {
173 if(typeof jQuery == 'undefined') {
174 var script = document.createElement('script');
175 script.type = 'text/javascript';
177 script.src = NETDATA.jQuery;
179 // script.onabort = onError;
180 script.onerror = function(err, t) { NETDATA.error(101, NETDATA.jQuery); };
181 if(typeof callback == "function")
182 script.onload = callback;
184 var s = document.getElementsByTagName('script')[0];
185 s.parentNode.insertBefore(script, s);
187 else if(typeof callback == "function")
191 NETDATA.ColorLuminance = function(hex, lum) {
192 // validate hex string
193 hex = String(hex).replace(/[^0-9a-f]/gi, '');
195 hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
199 // convert to decimal and change luminosity
201 for (i = 0; i < 3; i++) {
202 c = parseInt(hex.substr(i*2,2), 16);
203 c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);
204 rgb += ("00"+c).substr(c.length);
210 NETDATA.guid = function() {
212 return Math.floor((1 + Math.random()) * 0x10000)
217 return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
220 // this is the main function - where everything starts
221 NETDATA.init = function() {
222 // this should be called only once
224 $(window).blur(function() {
225 NETDATA.options.page_is_visible = 0;
226 if(NETDATA.options.debug.focus) console.log('Lost Focus!');
229 $(window).focus(function() {
230 NETDATA.options.page_is_visible = 1;
231 if(NETDATA.options.debug.focus) console.log('Focus restored!');
234 NETDATA.getDomCharts(function() {
235 NETDATA.chartRefresher(0);
239 // user function to signal us the DOM has been
241 NETDATA.updatedDom = function() {
242 NETDATA.options.updated_dom = 1;
245 // ----------------------------------------------------------------------------------------------------------------
247 NETDATA.generateChartDataURL = function() {
250 var chart = self.data('chart');
251 var host = self.data('host') || NETDATA.chartDefaults.host;
252 var width = self.width();
253 var height = self.height();
254 var method = self.data('method') || NETDATA.chartDefaults.method;
255 var after = self.data('after') || NETDATA.chartDefaults.after;
256 var before = self.data('before') || NETDATA.chartDefaults.before;
257 var library = self.data('chart-library') || NETDATA.chartDefaults.library;
258 var dimensions = self.data('dimensions') || null;
259 var pixels_per_point = self.data('pixels-per-point') || NETDATA.chartLibraries[library].pixels_per_point;
261 if(self.data('chart-panning') || self.data('chart-zooming')) {
262 before = self.data('panning-before') || 0;
263 after = self.data('panning-after') || 0;
266 // force an options provided detail
267 if(pixels_per_point < NETDATA.options.current.pixels_per_point)
268 pixels_per_point = NETDATA.options.current.pixels_per_point
270 var points = self.data('points') || Math.round(width / pixels_per_point);
271 var format = self.data('format') || NETDATA.chartLibraries[library].format;
272 var options = self.data('options') || NETDATA.chartLibraries[library].options;
274 // build the data URL
275 var url = host + chart.data_url;
276 url += "&format=" + format;
277 url += "&points=" + points.toString();
278 url += "&group=" + method;
279 url += "&options=" + options;
280 if(NETDATA.chartLibraries[library].jsonWrapper) url += '|jsonwrap';
283 url += "&after=" + after.toString();
286 url += "&before=" + before.toString();
289 url += "&dimensions=" + dimensions;
291 self.data('calculated-width', width)
292 .data('calculated-height', height)
293 .data('calculated-points', points)
294 .data('calculated-options', options)
295 .data('calculated-url', url);
297 if(NETDATA.options.debug.chart_data_url) console.log('generateChartDataURL(): ' + url + ' WxH:' + width + 'x' + height + ' points: ' + points + ' library: ' + library);
301 NETDATA.validateDomCharts = function(targets, index, callback) {
302 if(NETDATA.options.debug.main_loop) console.log('validateDomCharts() working on ' + index);
304 var target = targets.get(index);
306 if(NETDATA.options.debug.main_loop) console.log('validateDomCharts(): all ' + (index - 1) + ' charts parsed.');
307 if(typeof callback == 'function') callback();
310 var self = $(target);
311 if(!self.data('prepared')) {
312 self.data('prepared', true)
314 .data('chart-created', false)
315 .data('refresher-enabled', false)
316 .data('chart-panning', false)
317 .data('chart-zooming', false)
318 .data('chart-paused', false)
319 .data('panning-before', 0)
320 .data('panning-after', 0);
322 var id = self.data('netdata');
323 var host = self.data('host') || NETDATA.chartDefaults.host;
324 var library = self.data('chart-library') || NETDATA.chartDefaults.library;
326 if(NETDATA.options.debug.main_loop) console.log('validateDomCharts() parsing ' + id + ' of type ' + library);
328 if(typeof NETDATA.chartLibraries[library] == 'undefined') {
329 NETDATA.error(402, library);
330 NETDATA.messageInABox(target, 'chart library "' + library + '" is not found');
331 NETDATA.validateDomCharts(targets, ++index, callback);
333 else if(!NETDATA.chartLibraries[library].enabled) {
334 NETDATA.error(403, library);
335 NETDATA.messageInABox(target, 'chart library "' + library + '" is not enabled');
336 NETDATA.validateDomCharts(targets, ++index, callback);
338 else if(!NETDATA.chartLibraries[library].initialized) {
339 self.data('prepared', false);
340 NETDATA.chartLibraries[library].initialize(function() {
341 NETDATA.validateDomCharts(targets, index, callback);
345 var url = host + "/api/v1/chart?chart=" + id;
351 .done(function(chart) {
352 self.data('chart', chart)
353 .data('update-every', chart.update_every * 1000)
354 .data('refresher-enabled', true)
356 .data('chart-library', library);
359 NETDATA.error(404, url);
360 NETDATA.messageInABox(target, 'chart "' + id + '" not found on url "' + url + '"');
363 NETDATA.validateDomCharts(targets, ++index, callback);
368 NETDATA.validateDomCharts(targets, ++index, callback);
373 NETDATA.sizeDomCharts = function(targets, index, callback) {
374 // this is used to quickly size all charts to their size
376 if(NETDATA.options.debug.main_loop) console.log('sizeDomCharts() working on ' + index);
378 var target = targets.get(index);
380 if(NETDATA.options.debug.main_loop) console.log('sizeDomCharts(): all ' + (index - 1) + ' charts sized.');
381 if(typeof callback == 'function') callback();
384 var self = $(target);
386 var id = self.data('netdata');
387 var width = self.data('width') || NETDATA.chartDefaults.width;
388 var height = self.data('height') || NETDATA.chartDefaults.height;
390 self.css('width', width)
391 .css('height', height)
392 .css('display', 'inline-block')
393 .css('overflow', 'hidden');
395 NETDATA.messageInABox(target, 'chart "' + id + '" is loading...');
396 NETDATA.sizeDomCharts(targets, ++index, callback);
400 NETDATA.getDomCharts = function(callback) {
401 NETDATA.options.updated_dom = 0;
403 NETDATA.options.targets = $('div[data-netdata]').filter(':visible')
404 .bind('create', function(event, data) {
407 if(NETDATA.options.debug.chart_errors) {
408 NETDATA.chartLibraries[self.data('chart-library')].create(this, data);
409 self.data('chart-created', true);
413 NETDATA.chartLibraries[self.data('chart-library')].create(this, data);
414 self.data('chart-created', true);
417 NETDATA.messageInABox(this, 'chart "' + self.data('netdata') + '" failed to be created as ' + self.data('chart-library'));
418 self.data('chart-created', false);
422 .bind('update', function(event, data) {
424 if(NETDATA.options.debug.chart_errors)
425 NETDATA.chartLibraries[self.data('chart-library')].update(this, data);
428 NETDATA.chartLibraries[self.data('chart-library')].update(this, data);
431 NETDATA.messageInABox(this, 'chart "' + self.data('netdata') + '" failed to be updated as ' + self.data('chart-library'));
432 self.data('chart-created', false);
437 if(NETDATA.options.debug.main_loop)
438 console.log('DOM updated - there are ' + NETDATA.options.targets.length + ' charts on page.');
440 NETDATA.sizeDomCharts(NETDATA.options.targets, 0, function() {
441 NETDATA.validateDomCharts(NETDATA.options.targets, 0, callback);
445 // ----------------------------------------------------------------------------------------------------------------
447 //var chart = function() {
450 //chart.prototype.color = function() {
454 //var c = new chart();
457 NETDATA.chartValuesDownloader = function(element, callback, panning) {
458 var self = $(element);
459 var last = self.data('updated') || 0;
460 var every = self.data('update-every') || 1;
462 // check if this chart has to be refreshed now
463 var now = new Date().getTime();
464 if(!panning && last + every > now) {
465 if(NETDATA.options.debug.chart_timing) console.log(self.data('netdata') + ' too soon - skipping.');
466 if(typeof callback == 'function') callback();
468 else if(!panning && !self.visible(true)) {
469 if(NETDATA.options.debug.visibility) console.log(self.data('netdata') + ' is NOT visible.');
470 if(typeof callback == 'function') callback();
473 if(NETDATA.options.debug.visibility) console.log(self.data('netdata') + ' is visible, downloading data...');
475 url: NETDATA.generateChartDataURL.call(element), // self.data('chart-url'),
478 .then(function(data) {
479 var started = new Date().getTime();
481 // if the result is JSON, find the latest update-every
482 if(NETDATA.chartLibraries[self.data('chart-library')].jsonWrapper) {
483 if(!panning && typeof data.update_every != 'undefined')
484 self.data('update-every', data.update_every * 1000);
486 if(typeof data.after != 'undefined')
487 self.data('panning-after', data.after);
489 if(typeof data.before != 'undefined')
490 self.data('panning-before', data.before);
493 if(self.data('chart-created')) {
494 if(NETDATA.options.debug.chart_calls) console.log('updating ' + self.data('chart-library') + ' chart ' + self.data('netdata'));
495 self.trigger('update', [data]);
496 // NETDATA.chartLibraries[self.data('chart-library')].update(element, data);
499 if(NETDATA.options.debug.chart_calls) console.log('creating ' + self.data('chart-library') + ' chart ' + self.data('netdata'));
500 self.trigger('create', [data]);
501 //NETDATA.chartLibraries[self.data('chart-library')].create(element, data);
504 var ended = new Date().getTime();
505 self.data('updated', ended);
507 var dt = ended - started;
509 self.data('refresh-dt', dt);
510 var element_name = self.data('dt-element-name') || null;
512 var element = document.getElementById(element_name) || null;
514 element.innerHTML = dt.toString();
519 NETDATA.messageInABox(element, 'cannot download chart "' + self.data('netdata') + '" values from url "' + self.data('chart-url') + '"');
522 if(typeof callback == 'function') callback();
527 NETDATA.chartRefresher = function(index) {
528 // if(NETDATA.options.debug.mail_loop) console.log('NETDATA.chartRefresher(<targets, ' + index + ')');
530 if(!NETDATA.options.page_is_visible) {
531 if(NETDATA.options.debug.main_loop) console.log('waiting focus...');
532 setTimeout(function() {
533 NETDATA.chartRefresher(index);
534 }, NETDATA.options.current.idle_lost_focus);
537 now = new Date().getTime();
539 if(now < NETDATA.options.refreshed_stop_until) {
540 if(NETDATA.options.debug.main_loop) console.log('refreshed stopped until...');
541 setTimeout(function() {
542 NETDATA.chartRefresher(index);
543 }, NETDATA.options.current.idle_between_loops);
545 else if(NETDATA.options.updated_dom) {
546 // the dom has been updated
547 // get the dom parts again
548 NETDATA.getDomCharts(function() {
549 NETDATA.chartRefresher(0);
553 var target = NETDATA.options.targets.get(index);
555 if(NETDATA.options.debug.main_loop) console.log('waiting to restart main loop...');
556 NETDATA.options.last_paused = now;
558 setTimeout(function() {
559 NETDATA.chartRefresher(0);
560 }, NETDATA.options.current.idle_between_loops);
563 var self = $(target);
564 if(!self.data('refresher-enabled')) {
565 if(NETDATA.options.debug.main_loop) console.log('chart has refresher disabled...');
566 NETDATA.chartRefresher(++index);
568 else if(self.data('chart-panning')) {
569 if(NETDATA.options.debug.main_loop) console.log('chart is panning...');
570 NETDATA.chartRefresher(++index);
572 else if(self.data('chart-zooming')) {
573 if(NETDATA.options.debug.main_loop) console.log('chart is zooming...');
574 NETDATA.chartRefresher(++index);
576 else if(self.data('chart-paused')) {
577 if(NETDATA.options.debug.main_loop) console.log('chart is paused...');
578 NETDATA.chartRefresher(++index);
581 if(now - NETDATA.options.last_paused < NETDATA.options.current.fast_render_timeframe) {
582 if(NETDATA.options.debug.main_loop) console.log('fast rendering...');
584 NETDATA.chartValuesDownloader(target, function() {
585 NETDATA.chartRefresher(++index);
589 if(NETDATA.options.debug.main_loop) console.log('waiting for next refresh...');
590 NETDATA.options.last_paused = now;
592 setTimeout(function() {
593 NETDATA.chartValuesDownloader(target, function() {
594 NETDATA.chartRefresher(++index);
596 }, NETDATA.options.current.idle_between_charts);
604 // ----------------------------------------------------------------------------------------------------------------
607 NETDATA.peityInitialize = function(callback) {
608 if(typeof netdataStopPeity == 'undefined') {
609 $.getScript(NETDATA.peity_js)
611 NETDATA.registerChartLibrary('peity', NETDATA.peity_js);
614 NETDATA.error(100, NETDATA.peity_js);
617 if(typeof callback == "function")
622 NETDATA.chartLibraries.peity.enabled = false;
623 if(typeof callback == "function")
628 NETDATA.peityChartUpdate = function(element, data) {
629 var self = $(element);
630 var instance = self.data('peity-instance');
631 var ins = $(instance);
632 ins.html(data.result);
634 // peity.change() does not accept options
635 // to pass width and height
637 ins.peity('line', { width: self.data('calculated-width'), height: self.data('calculated-height') })
640 NETDATA.peityChartCreate = function(element, data) {
641 var self = $(element);
643 var uuid = NETDATA.guid();
644 element.innerHTML = '<div id="' + uuid + '">' + data.result + '</div>';
645 var instance = document.getElementById(uuid);
646 var ins = $(instance);
648 ins.peity('line', { width: self.data('calculated-width'), height: self.data('calculated-height') })
650 self.data('peity-uuid', uuid)
651 .data('peity-instance', instance)
652 .data('chart-created', true);
655 // ----------------------------------------------------------------------------------------------------------------
658 NETDATA.sparklineInitialize = function(callback) {
659 if(typeof netdataStopSparkline == 'undefined') {
660 $.getScript(NETDATA.sparkline_js)
662 NETDATA.registerChartLibrary('sparkline', NETDATA.sparkline_js);
665 NETDATA.error(100, NETDATA.sparkline_js);
668 if(typeof callback == "function")
673 NETDATA.chartLibraries.sparkline.enabled = false;
674 if(typeof callback == "function")
679 NETDATA.sparklineChartUpdate = function(element, data) {
680 var self = $(element);
681 var options = self.data('sparkline-options');
682 options.width = self.data('calculated-width');
683 options.height = self.data('calculated-height');
684 self.sparkline(data.result, options);
687 NETDATA.sparklineChartCreate = function(element, data) {
688 var self = $(element);
689 var chart = self.data('chart');
690 var type = self.data('sparkline-type') || 'line';
691 var lineColor = self.data('sparkline-linecolor') || NETDATA.colors[0];
692 var fillColor = self.data('sparkline-fillcolor') || (chart.chart_type == 'line')?'#FFF':NETDATA.ColorLuminance(lineColor, 0.8);
693 var chartRangeMin = self.data('sparkline-chartrangemin') || undefined;
694 var chartRangeMax = self.data('sparkline-chartrangemax') || undefined;
695 var composite = self.data('sparkline-composite') || undefined;
696 var enableTagOptions = self.data('sparkline-enabletagoptions') || undefined;
697 var tagOptionPrefix = self.data('sparkline-tagoptionprefix') || undefined;
698 var tagValuesAttribute = self.data('sparkline-tagvaluesattribute') || undefined;
699 var disableHiddenCheck = self.data('sparkline-disablehiddencheck') || undefined;
700 var defaultPixelsPerValue = self.data('sparkline-defaultpixelspervalue') || undefined;
701 var spotColor = self.data('sparkline-spotcolor') || undefined;
702 var minSpotColor = self.data('sparkline-minspotcolor') || undefined;
703 var maxSpotColor = self.data('sparkline-maxspotcolor') || undefined;
704 var spotRadius = self.data('sparkline-spotradius') || undefined;
705 var valueSpots = self.data('sparkline-valuespots') || undefined;
706 var highlightSpotColor = self.data('sparkline-highlightspotcolor') || undefined;
707 var highlightLineColor = self.data('sparkline-highlightlinecolor') || undefined;
708 var lineWidth = self.data('sparkline-linewidth') || undefined;
709 var normalRangeMin = self.data('sparkline-normalrangemin') || undefined;
710 var normalRangeMax = self.data('sparkline-normalrangemax') || undefined;
711 var drawNormalOnTop = self.data('sparkline-drawnormalontop') || undefined;
712 var xvalues = self.data('sparkline-xvalues') || undefined;
713 var chartRangeClip = self.data('sparkline-chartrangeclip') || undefined;
714 var xvalues = self.data('sparkline-xvalues') || undefined;
715 var chartRangeMinX = self.data('sparkline-chartrangeminx') || undefined;
716 var chartRangeMaxX = self.data('sparkline-chartrangemaxx') || undefined;
717 var disableInteraction = self.data('sparkline-disableinteraction') || false;
718 var disableTooltips = self.data('sparkline-disabletooltips') || false;
719 var disableHighlight = self.data('sparkline-disablehighlight') || false;
720 var highlightLighten = self.data('sparkline-highlightlighten') || 1.4;
721 var highlightColor = self.data('sparkline-highlightcolor') || undefined;
722 var tooltipContainer = self.data('sparkline-tooltipcontainer') || undefined;
723 var tooltipClassname = self.data('sparkline-tooltipclassname') || undefined;
724 var tooltipFormat = self.data('sparkline-tooltipformat') || undefined;
725 var tooltipPrefix = self.data('sparkline-tooltipprefix') || undefined;
726 var tooltipSuffix = self.data('sparkline-tooltipsuffix') || ' ' + chart.units;
727 var tooltipSkipNull = self.data('sparkline-tooltipskipnull') || true;
728 var tooltipValueLookups = self.data('sparkline-tooltipvaluelookups') || undefined;
729 var tooltipFormatFieldlist = self.data('sparkline-tooltipformatfieldlist') || undefined;
730 var tooltipFormatFieldlistKey = self.data('sparkline-tooltipformatfieldlistkey') || undefined;
731 var numberFormatter = self.data('sparkline-numberformatter') || function(n){ return n.toFixed(2); };
732 var numberDigitGroupSep = self.data('sparkline-numberdigitgroupsep') || undefined;
733 var numberDecimalMark = self.data('sparkline-numberdecimalmark') || undefined;
734 var numberDigitGroupCount = self.data('sparkline-numberdigitgroupcount') || undefined;
735 var animatedZooms = self.data('sparkline-animatedzooms') || false;
739 lineColor: lineColor,
740 fillColor: fillColor,
741 chartRangeMin: chartRangeMin,
742 chartRangeMax: chartRangeMax,
743 composite: composite,
744 enableTagOptions: enableTagOptions,
745 tagOptionPrefix: tagOptionPrefix,
746 tagValuesAttribute: tagValuesAttribute,
747 disableHiddenCheck: disableHiddenCheck,
748 defaultPixelsPerValue: defaultPixelsPerValue,
749 spotColor: spotColor,
750 minSpotColor: minSpotColor,
751 maxSpotColor: maxSpotColor,
752 spotRadius: spotRadius,
753 valueSpots: valueSpots,
754 highlightSpotColor: highlightSpotColor,
755 highlightLineColor: highlightLineColor,
756 lineWidth: lineWidth,
757 normalRangeMin: normalRangeMin,
758 normalRangeMax: normalRangeMax,
759 drawNormalOnTop: drawNormalOnTop,
761 chartRangeClip: chartRangeClip,
762 chartRangeMinX: chartRangeMinX,
763 chartRangeMaxX: chartRangeMaxX,
764 disableInteraction: disableInteraction,
765 disableTooltips: disableTooltips,
766 disableHighlight: disableHighlight,
767 highlightLighten: highlightLighten,
768 highlightColor: highlightColor,
769 tooltipContainer: tooltipContainer,
770 tooltipClassname: tooltipClassname,
771 tooltipChartTitle: chart.title,
772 tooltipFormat: tooltipFormat,
773 tooltipPrefix: tooltipPrefix,
774 tooltipSuffix: tooltipSuffix,
775 tooltipSkipNull: tooltipSkipNull,
776 tooltipValueLookups: tooltipValueLookups,
777 tooltipFormatFieldlist: tooltipFormatFieldlist,
778 tooltipFormatFieldlistKey: tooltipFormatFieldlistKey,
779 numberFormatter: numberFormatter,
780 numberDigitGroupSep: numberDigitGroupSep,
781 numberDecimalMark: numberDecimalMark,
782 numberDigitGroupCount: numberDigitGroupCount,
783 animatedZooms: animatedZooms,
784 width: self.data('calculated-width'),
785 height: self.data('calculated-height')
788 var uuid = NETDATA.guid();
789 element.innerHTML = '<div style="display: inline-block; position: relative;" id="' + uuid + '"></div>';
790 var div = document.getElementById(uuid);
792 self.sparkline(data.result, options);
793 self.data('sparkline-options', options)
795 .data('chart-created', true);
798 // ----------------------------------------------------------------------------------------------------------------
801 NETDATA.dygraphAllCharts = [];
802 NETDATA.dygraphInitSync = function(callback) {
803 //$.getScript(NETDATA.serverDefault + 'dygraph-synchronizer.js')
804 // .always(function() {
805 if(typeof callback == "function")
810 NETDATA.dygraphSync = null;
811 NETDATA.dygraphSyncAll = function() {
812 if(NETDATA.dygraphSync) {
813 NETDATA.dygraphSync.detach();
814 NETDATA.dygraphSync = null;
817 NETDATA.dygraphSync = Dygraph.synchronize(NETDATA.dygraphAllCharts, {
823 NETDATA.dygraphInitialize = function(callback) {
824 if(typeof netdataStopDygraph == 'undefined') {
825 $.getScript(NETDATA.dygraph_js)
827 NETDATA.registerChartLibrary('dygraph', NETDATA.dygraph_js);
830 NETDATA.error(100, NETDATA.dygraph_js);
833 NETDATA.dygraphInitSync(callback);
837 NETDATA.chartLibraries.dygraph.enabled = false;
838 if(typeof callback == "function")
843 NETDATA.dygraphClickCallback = function(element, dygraph, event, x, points) {
844 if(NETDATA.options.debug.dygraph) console.log('dygraphClickCallback()');
846 // NETDATA.dygraphDoubleClickDetect(element, dygraph);
847 NETDATA.dygraphReset(element, dygraph);
850 NETDATA.dygraphPointClickCallback = function(element, dygraph, event, point) {
851 if(NETDATA.options.debug.dygraph) console.log('dygraphPointClickCallback()');
853 // NETDATA.dygraphDoubleClickDetect(element, dygraph);
854 NETDATA.dygraphReset(element, dygraph);
857 NETDATA.dygraphDrawCallback = function(element, dygraph, is_initial) {
858 if(NETDATA.options.debug.dygraph) console.log('dygraphDrawCallback()');
860 var x_range = dygraph.xAxisRange();
861 var after = Math.round(x_range[0] / 1000);
862 var before = Math.round(x_range[1] / 1000);
864 NETDATA.dygraphZoomOrPan(element, dygraph, after, before, false, true);
867 NETDATA.dygraphZoomCallback = function(element, dygraph, minDate, maxDate, yRanges) {
868 if(NETDATA.options.debug.dygraph) console.log('dygraphZoomCallback()');
870 NETDATA.dygraphZoomOrPan(element, dygraph, Math.round(minDate / 1000), Math.round(maxDate / 1000), false, true);
873 NETDATA.dygraphHighlightCallback = function(element, dygraph, event, x, points, row, seriesName) {
874 if(NETDATA.options.debug.dygraph) console.log('dygraphHighlightCallback()');
878 self.data('chart-paused', true);
881 NETDATA.dygraphUnhighlightCallback = function(element, dygraph) {
882 if(NETDATA.options.debug.dygraph) console.log('dygraphUnhighlightCallback()');
886 self.data('chart-paused', false);
889 NETDATA.dygraphMouseDown = function(element, dygraph, event, context) {
890 if(NETDATA.options.debug.dygraph) console.log('dygraphMouseDown()');
892 context.initializeMouseDown(event, dygraph, context);
893 if (event.altKey || event.shiftKey)
894 Dygraph.startZoom(event, dygraph, context);
896 Dygraph.startPan(event, dygraph, context);
899 NETDATA.dygraphMouseMove = function(element, dygraph, event, context) {
900 if(NETDATA.options.debug.dygraph) console.log('dygraphMouseMove()');
902 if (context.isPanning)
903 Dygraph.movePan(event, dygraph, context);
904 else if (context.isZooming)
905 Dygraph.moveZoom(event, dygraph, context);
908 NETDATA.dygraphMouseUp = function(element, dygraph, event, context) {
909 if(NETDATA.options.debug.dygraph) console.log('dygraphMouseUp()');
911 if (context.isPanning)
912 Dygraph.endPan(event, dygraph, context);
913 else if (context.isZooming)
914 Dygraph.endZoom(event, dygraph, context);
917 NETDATA.dygraphMouseClick = function(element, dygraph, event, context) {
918 if(NETDATA.options.debug.dygraph) console.log('dygraphMouseClick()');
922 NETDATA.dygraphMouseDoubleClick = function(element, dygraph, event, context) {
923 if(NETDATA.options.debug.dygraph) console.log('dygraphMouseDoubleClick()');
924 NETDATA.dygraphReset(element, dygraph);
927 NETDATA.dygraphMouseWheel = function(element, dygraph, event, context) {
928 if(NETDATA.options.debug.dygraph) console.log('dygraphMouseWheel()');
930 if(event.altKey || event.shiftKey) {
931 // http://dygraphs.com/gallery/interaction-api.js
932 var normal = (event.detail) ? event.detail * -1 : event.wheelDelta / 40;
933 var percentage = normal / 10;
936 var before_old = self.data('panning-before');
937 var after_old = self.data('panning-after');
938 var range_old = before_old - after_old;
940 var range = range_old * ( 1 - percentage );
941 var dt = Math.round((range_old - range) / 2);
942 before = before_old - dt;
943 after = after_old + dt;
945 if(NETDATA.options.debug.dygraph) console.log('percent: ' + percentage + ' from ' + after_old + ' - ' + before_old + ' to ' + after + ' - ' + before + ', range from ' + (before_old - after_old).toString() + ' to ' + (before - after).toString());
947 NETDATA.dygraphZoomOrPan(element, dygraph, after, before, true);
951 NETDATA.dygraphReset = function(element, dygraph) {
952 if(NETDATA.options.debug.dygraph) console.log('dygraphReset()');
956 if(self.data('chart-panning') || self.data('chart-paused')) {
957 self.data('chart-panning', false)
958 .data('chart-zooming', false)
959 .data('chart-paused', false)
960 .data('panning-before', 0)
961 .data('panning-after', 0)
963 .data('panning-before-max', 0);
965 NETDATA.options.refreshed_stop_until = 0;
966 NETDATA.chartValuesDownloader(element, null, false);
970 NETDATA.dygraphZoomOrPan = function(element, dygraph, after, before, zoom) {
971 if(NETDATA.options.debug.dygraph) console.log('dygraphZoomOrPan()');
975 var before_old = self.data('panning-before');
976 var after_old = self.data('panning-after');
977 var range_old = before_old - after_old;
979 var shift = Math.abs(before_old - before);
981 var range = before - after;
983 if((shift > range_old / 20 || zoom) && range > 10) {
984 // the user is panning
985 if(NETDATA.options.debug.dygraph) console.log('dygraphZoomOrPan() ' + after_old + ' - ' + before_old + ', NEW: ' + after + ' - ' + before + ', shift by: ' + shift + ' old range: ' + (before_old - after_old).toString() + ' new range: ' + (before - after).toString());
987 if(!self.data('chart-panning') && !self.data('chart-zooming')) {
988 self.data('chart-panning', true)
989 .data('panning-before-max', before);
992 var before_max = self.data('panning-before-max');
993 if(zoom || before <= before_max) {
994 NETDATA.options.refreshed_stop_until = now + 2000;
996 console.log('dygraphZoomOrPan() rendering.......................................................................................................');
999 self.data('chart-panning', false)
1000 .data('chart-zooming', true);
1003 self.data('chart-panning', true)
1004 .data('chart-zooming', false);
1007 self.data('chart-paused', true)
1008 .data('panning-before', before)
1009 .data('panning-after', after)
1010 .data('updated', 0);
1012 NETDATA.chartValuesDownloader(element, null, true);
1017 NETDATA.dygraphChartUpdate = function(element, data) {
1018 if(NETDATA.options.debug.dygraph) console.log('dygraphChartUpdate()');
1020 var self = $(element);
1021 var dygraph = self.data('dygraph-instance');
1023 if(self.data('chart-panning')) {
1024 dygraph.updateOptions({
1025 file: data.result.data,
1026 labels: data.result.labels,
1027 labelsDivWidth: self.width() - 70
1031 dygraph.updateOptions({
1032 file: data.result.data,
1033 labels: data.result.labels,
1034 labelsDivWidth: self.width() - 70,
1041 NETDATA.dygraphChartCreate = function(element, data) {
1042 if(NETDATA.options.debug.dygraph) console.log('dygraphChartCreate()');
1044 var self = $(element);
1045 var chart = self.data('chart');
1046 var title = self.data('dygraph-title') || chart.title;
1047 var titleHeight = self.data('dygraph-titleheight') || 20;
1048 var labelsDiv = self.data('dygraph-labelsdiv') || undefined;
1049 var connectSeparatedPoints = self.data('dygraph-connectseparatedpoints') || false;
1050 var yLabelWidth = self.data('dygraph-ylabelwidth') || 12;
1051 var stackedGraph = self.data('dygraph-stackedgraph') || (chart.chart_type == 'stacked')?true:false;
1052 var stackedGraphNaNFill = self.data('dygraph-stackedgraphnanfill') || 'none';
1053 var hideOverlayOnMouseOut = self.data('dygraph-hideoverlayonmouseout') || true;
1054 var fillGraph = self.data('dygraph-fillgraph') || (chart.chart_type == 'area')?true:false;
1055 var drawPoints = self.data('dygraph-drawpoints') || false;
1056 var labelsDivStyles = self.data('dygraph-labelsdivstyles') || { 'fontSize':'10px' };
1057 var labelsDivWidth = self.data('dygraph-labelsdivwidth') || self.width() - 70;
1058 var labelsSeparateLines = self.data('dygraph-labelsseparatelines') || false;
1059 var labelsShowZeroValues = self.data('dygraph-labelsshowzerovalues') || true;
1060 var legend = self.data('dygraph-legend') || 'onmouseover';
1061 var showLabelsOnHighlight = self.data('dygraph-showlabelsonhighlight') || true;
1062 var gridLineColor = self.data('dygraph-gridlinecolor') || '#EEE';
1063 var axisLineColor = self.data('dygraph-axislinecolor') || '#EEE';
1064 var maxNumberWidth = self.data('dygraph-maxnumberwidth') || 8;
1065 var sigFigs = self.data('dygraph-sigfigs') || null;
1066 var digitsAfterDecimal = self.data('dygraph-digitsafterdecimal') || 2;
1067 var axisLabelFontSize = self.data('dygraph-axislabelfontsize') || 10;
1068 var axisLineWidth = self.data('dygraph-axislinewidth') || 0.3;
1069 var drawAxis = self.data('dygraph-drawaxis') || true;
1070 var strokeWidth = self.data('dygraph-strokewidth') || 1.0;
1071 var drawGapEdgePoints = self.data('dygraph-drawgapedgepoints') || true;
1072 var colors = self.data('dygraph-colors') || NETDATA.colors;
1073 var pointSize = self.data('dygraph-pointsize') || 1;
1074 var stepPlot = self.data('dygraph-stepplot') || false;
1075 var strokeBorderColor = self.data('dygraph-strokebordercolor') || 'white';
1076 var strokeBorderWidth = self.data('dygraph-strokeborderwidth') || (chart.chart_type == 'stacked')?1.0:0.0;
1077 var strokePattern = self.data('dygraph-strokepattern') || undefined;
1078 var highlightCircleSize = self.data('dygraph-highlightcirclesize') || 3;
1079 var highlightSeriesOpts = self.data('dygraph-highlightseriesopts') || { strokeWidth: 1.5 };
1080 var highlightSeriesBackgroundAlpha = self.data('dygraph-highlightseriesbackgroundalpha') || (chart.chart_type == 'stacked')?0.7:0.5;
1081 var pointClickCallback = self.data('dygraph-pointclickcallback') || undefined;
1082 var showRangeSelector = self.data('dygraph-showrangeselector') || false;
1083 var showRoller = self.data('dygraph-showroller') || false;
1084 var valueFormatter = self.data('dygraph-valueformatter') || undefined; //function(x){ return x.toFixed(2); };
1085 var rightGap = self.data('dygraph-rightgap') || 5;
1086 var drawGrid = self.data('dygraph-drawgrid') || true;
1087 var drawXGrid = self.data('dygraph-drawxgrid') || undefined;
1088 var drawYGrid = self.data('dygraph-drawygrid') || undefined;
1089 var gridLinePattern = self.data('dygraph-gridlinepattern') || null;
1090 var gridLineWidth = self.data('dygraph-gridlinewidth') || 0.3;
1094 titleHeight: titleHeight,
1095 ylabel: chart.units,
1096 yLabelWidth: yLabelWidth,
1097 connectSeparatedPoints: connectSeparatedPoints,
1098 drawPoints: drawPoints,
1099 fillGraph: fillGraph,
1100 stackedGraph: stackedGraph,
1101 stackedGraphNaNFill: stackedGraphNaNFill,
1103 drawXGrid: drawXGrid,
1104 drawYGrid: drawYGrid,
1105 gridLinePattern: gridLinePattern,
1106 gridLineWidth: gridLineWidth,
1107 gridLineColor: gridLineColor,
1108 axisLineColor: axisLineColor,
1109 axisLineWidth: axisLineWidth,
1111 hideOverlayOnMouseOut: hideOverlayOnMouseOut,
1112 labelsDiv: labelsDiv,
1113 labelsDivStyles: labelsDivStyles,
1114 labelsDivWidth: labelsDivWidth,
1115 labelsSeparateLines: labelsSeparateLines,
1116 labelsShowZeroValues: labelsShowZeroValues,
1120 showLabelsOnHighlight: showLabelsOnHighlight,
1121 maxNumberWidth: maxNumberWidth,
1123 digitsAfterDecimal: digitsAfterDecimal,
1124 axisLabelFontSize: axisLabelFontSize,
1126 strokeWidth: strokeWidth,
1127 drawGapEdgePoints: drawGapEdgePoints,
1128 pointSize: pointSize,
1130 strokeBorderColor: strokeBorderColor,
1131 strokeBorderWidth: strokeBorderWidth,
1132 strokePattern: strokePattern,
1133 highlightCircleSize: highlightCircleSize,
1134 highlightSeriesOpts: highlightSeriesOpts,
1135 highlightSeriesBackgroundAlpha: highlightSeriesBackgroundAlpha,
1136 pointClickCallback: pointClickCallback,
1137 showRangeSelector: showRangeSelector,
1138 showRoller: showRoller,
1139 valueFormatter: valueFormatter,
1141 labels: data.result.labels,
1145 ticker: Dygraph.dateTicker,
1146 axisLabelFormatter: function (d, gran) {
1147 return Dygraph.zeropad(d.getHours()) + ":" + Dygraph.zeropad(d.getMinutes()) + ":" + Dygraph.zeropad(d.getSeconds());
1149 valueFormatter :function (ms) {
1150 var d = new Date(ms);
1151 return Dygraph.zeropad(d.getHours()) + ":" + Dygraph.zeropad(d.getMinutes()) + ":" + Dygraph.zeropad(d.getSeconds());
1158 //clickCallback: function(e, x, points) { NETDATA.dygraphClickCallback(element, this, e, x, points); },
1159 //pointClickCallback: function(e, point) { NETDATA.dygraphPointClickCallback(element, this, e, point); },
1160 drawCallback: function(dygraph, is_initial) { NETDATA.dygraphDrawCallback(element, dygraph, is_initial); },
1161 zoomCallback: function(minDate, maxDate, yRanges) { NETDATA.dygraphZoomCallback(element, this, minDate, maxDate, yRanges); },
1162 highlightCallback: function(event, x, points, row, seriesName) { NETDATA.dygraphHighlightCallback(element, this, event, x, points, row, seriesName); },
1163 unhighlightCallback: function(event) { NETDATA.dygraphUnhighlightCallback(element, this, event); },
1164 interactionModel : {
1165 mousedown: function(event, dygraph, context) { NETDATA.dygraphMouseDown(element, dygraph, event, context); },
1166 mousemove: function(event, dygraph, context) { NETDATA.dygraphMouseMove(element, dygraph, event, context); },
1167 mouseup: function(event, dygraph, context) { NETDATA.dygraphMouseUp(element, dygraph, event, context); },
1168 click: function(event, dygraph, context) { NETDATA.dygraphMouseClick(element, dygraph, event, context); },
1169 dblclick: function(event, dygraph, context) { NETDATA.dygraphMouseDoubleClick(element, dygraph, event, context); },
1170 mousewheel: function(event, dygraph, context) { NETDATA.dygraphMouseWheel(element, dygraph, event, context); }
1174 var uuid = NETDATA.guid();
1175 self.html('<div id="' + uuid + '" style="width: 100%; height: 100%;"></div>');
1177 var dchart = new Dygraph(document.getElementById(uuid),
1178 data.result.data, options);
1180 self.data('dygraph-instance', dchart)
1181 .data('dygraph-options', options)
1183 .data('chart-created', true);
1185 //NETDATA.dygraphAllCharts.push(dchart);
1186 //if(NETDATA.dygraphAllCharts.length > 1)
1187 // NETDATA.dygraphSyncAll();
1190 // ----------------------------------------------------------------------------------------------------------------
1193 NETDATA.morrisInitialize = function(callback) {
1194 if(typeof netdataStopMorris == 'undefined') {
1196 // morris requires raphael
1197 if(!NETDATA.chartLibraries.raphael.initialized) {
1198 if(NETDATA.chartLibraries.raphael.enabled) {
1199 NETDATA.raphaelInitialize(function() {
1200 NETDATA.morrisInitialize(callback);
1204 NETDATA.chartLibraries.morris.enabled = false;
1205 if(typeof callback == "function")
1210 var fileref = document.createElement("link");
1211 fileref.setAttribute("rel", "stylesheet");
1212 fileref.setAttribute("type", "text/css");
1213 fileref.setAttribute("href", NETDATA.morris_css);
1215 if (typeof fileref != "undefined")
1216 document.getElementsByTagName("head")[0].appendChild(fileref);
1218 $.getScript(NETDATA.morris_js)
1220 NETDATA.registerChartLibrary('morris', NETDATA.morris_js);
1223 NETDATA.error(100, NETDATA.morris_js);
1225 .always(function() {
1226 if(typeof callback == "function")
1231 NETDATA.chartLibraries.morris.enabled = false;
1232 if(typeof callback == "function")
1237 NETDATA.morrisChartUpdate = function(element, data) {
1238 var self = $(element);
1239 var morris = self.data('morris-instance');
1241 if(morris != null) {
1242 console.log('updating morris');
1243 morris.setData(data.result.data);
1246 console.log('not updating morris');
1249 NETDATA.morrisChartCreate = function(element, data) {
1250 var self = $(element);
1251 var chart = self.data('chart');
1253 var uuid = NETDATA.guid();
1254 self.html('<div id="' + uuid + '" style="width: ' + self.data('calculated-width') + 'px; height: ' + self.data('calculated-height') + 'px;"></div>');
1258 data: data.result.data,
1260 ykeys: data.dimension_names,
1261 labels: data.dimension_names,
1267 continuousLine: false,
1268 behaveLikeLine: false
1272 if(chart.chart_type == 'line')
1273 morris = new Morris.Line(options);
1275 else if(chart.chart_type == 'area') {
1276 options.behaveLikeLine = true;
1277 morris = new Morris.Area(options);
1280 morris = new Morris.Area(options);
1282 self.data('morris-instance', morris)
1283 .data('chart-created', true);
1286 // ----------------------------------------------------------------------------------------------------------------
1289 NETDATA.raphaelInitialize = function(callback) {
1290 if(typeof netdataStopRaphael == 'undefined') {
1291 $.getScript(NETDATA.raphael_js)
1293 NETDATA.registerChartLibrary('raphael', NETDATA.raphael_js);
1296 NETDATA.error(100, NETDATA.raphael_js);
1298 .always(function() {
1299 if(typeof callback == "function")
1304 NETDATA.chartLibraries.raphael.enabled = false;
1305 if(typeof callback == "function")
1310 NETDATA.raphaelChartUpdate = function(element, data) {
1311 var self = $(element);
1313 self.raphael(data, {
1314 width: self.data('calculated-width'),
1315 height: self.data('calculated-height')
1319 NETDATA.raphaelChartCreate = function(element, data) {
1320 var self = $(element);
1322 self.raphael(data, {
1323 width: self.data('calculated-width'),
1324 height: self.data('calculated-height')
1326 .data('chart-created', true);
1329 // ----------------------------------------------------------------------------------------------------------------
1332 NETDATA.googleInitialize = function(callback) {
1333 if(typeof netdataStopGoogleCharts == 'undefined') {
1334 $.getScript(NETDATA.google_js)
1336 NETDATA.registerChartLibrary('google', NETDATA.google_js);
1338 google.load('visualization', '1.1', {
1339 'packages': ['corechart', 'controls'],
1340 'callback': callback
1344 NETDATA.error(100, NETDATA.google_js);
1345 if(typeof callback == "function")
1350 NETDATA.chartLibraries.google.enabled = false;
1351 if(typeof callback == "function")
1356 NETDATA.googleChartUpdate = function(element, data) {
1357 var self = $(element);
1358 var gchart = self.data('google-instance');
1359 var options = self.data('google-options');
1361 var datatable = new google.visualization.DataTable(data.result);
1363 gchart.draw(datatable, options);
1366 NETDATA.googleChartCreate = function(element, data) {
1367 var self = $(element);
1368 var chart = self.data('chart');
1370 var datatable = new google.visualization.DataTable(data.result);
1374 // do not set width, height - the chart resizes itself
1375 //width: self.data('calculated-width'),
1376 //height: self.data('calculated-height'),
1381 // title: "Time of Day",
1382 // format:'HH:mm:ss',
1383 viewWindowMode: 'maximized',
1395 viewWindowMode: 'pretty',
1410 focusTarget: 'category',
1417 titlePosition: 'out',
1428 curveType: 'function',
1433 var uuid = NETDATA.guid();
1434 self.html('<div id="' + uuid + '" style="width: 100%; height: 100%;"></div>');
1436 switch(chart.chart_type) {
1438 options.vAxis.viewWindowMode = 'maximized';
1439 gchart = new google.visualization.AreaChart(document.getElementById(uuid));
1443 options.isStacked = true;
1444 options.areaOpacity = 0.85;
1445 options.vAxis.viewWindowMode = 'maximized';
1446 options.vAxis.minValue = null;
1447 options.vAxis.maxValue = null;
1448 gchart = new google.visualization.AreaChart(document.getElementById(uuid));
1453 options.lineWidth = 2;
1454 gchart = new google.visualization.LineChart(document.getElementById(uuid));
1458 gchart.draw(datatable, options);
1460 self.data('google-instance', gchart)
1461 .data('google-options', options)
1463 .data('chart-created', true);
1466 // ----------------------------------------------------------------------------------------------------------------
1467 // Charts Libraries Registration
1469 NETDATA.chartLibraries = {
1471 initialize: NETDATA.dygraphInitialize,
1472 create: NETDATA.dygraphChartCreate,
1473 update: NETDATA.dygraphChartUpdate,
1479 pixels_per_point: 2,
1480 detects_dimensions_on_update: false
1483 initialize: NETDATA.sparklineInitialize,
1484 create: NETDATA.sparklineChartCreate,
1485 update: NETDATA.sparklineChartUpdate,
1489 options: 'flip|abs',
1491 pixels_per_point: 2,
1492 detects_dimensions_on_update: false
1495 initialize: NETDATA.peityInitialize,
1496 create: NETDATA.peityChartCreate,
1497 update: NETDATA.peityChartUpdate,
1501 options: 'null2zero|flip|abs',
1503 pixels_per_point: 2,
1504 detects_dimensions_on_update: false
1507 initialize: NETDATA.morrisInitialize,
1508 create: NETDATA.morrisChartCreate,
1509 update: NETDATA.morrisChartUpdate,
1513 options: 'objectrows|ms',
1515 pixels_per_point: 10,
1516 detects_dimensions_on_update: false
1519 initialize: NETDATA.googleInitialize,
1520 create: NETDATA.googleChartCreate,
1521 update: NETDATA.googleChartUpdate,
1524 format: 'datatable',
1527 pixels_per_point: 2,
1528 detects_dimensions_on_update: true
1531 initialize: NETDATA.raphaelInitialize,
1532 create: NETDATA.raphaelChartCreate,
1533 update: NETDATA.raphaelChartUpdate,
1539 pixels_per_point: 1,
1540 detects_dimensions_on_update: false
1544 NETDATA.registerChartLibrary = function(library, url) {
1545 console.log("registering chart library: " + library);
1547 NETDATA.chartLibraries[library].url = url;
1548 NETDATA.chartLibraries[library].initialized = true;
1549 NETDATA.chartLibraries[library].enabled = true;
1551 console.log(NETDATA.chartLibraries);
1554 // ----------------------------------------------------------------------------------------------------------------
1555 // load all libraries and initialize
1557 NETDATA.errorReset();
1559 NETDATA._loadjQuery(function() {
1560 $.getScript(NETDATA.serverDefault + 'lib/visible.js').then(function() {