1aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino/*
2e81fdcb135d0325e3bc22fae0583555d20aae280Brendan Jackman *    Copyright 2015-2017 ARM Limited
3aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino *
4aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino * Licensed under the Apache License, Version 2.0 (the "License");
5aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino * you may not use this file except in compliance with the License.
6aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino * You may obtain a copy of the License at
7aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino *
8aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino *     http://www.apache.org/licenses/LICENSE-2.0
9aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino *
10aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino * Unless required by applicable law or agreed to in writing, software
11aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino * distributed under the License is distributed on an "AS IS" BASIS,
12aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino * See the License for the specific language governing permissions and
14aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino * limitations under the License.
158741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh */
16aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino
17211860fe53efaa299db6ff6c9b28816bcb5902d4Kapileshwar Singhvar ILinePlot = ( function() {
1867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
1967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh   var graphs = new Array();
2067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh   var syncObjs = new Array();
2167527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
2267527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh    var purge = function() {
2367527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        for (var div_name in graphs) {
2467527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            if (document.getElementById(div_name) == null) {
2567527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                delete graphs[div_name];
2667527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            }
2767527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        }
2867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh    };
2967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
3067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh    var sync = function(group) {
3167527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
3267527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        var syncGraphs = Array();
3367527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        var xRange;
3467527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        var yRange;
3567527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        var syncZoom = true;
3667527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
3767527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        for (var div_name in graphs) {
3867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
3967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            if (graphs[div_name].group == group) {
4067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                syncGraphs.push(graphs[div_name].graph);
4167527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                syncZoom = syncZoom & graphs[div_name].syncZoom;
4267527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
4367527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                var xR = graphs[div_name].graph.xAxisRange();
4467527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                var yR = graphs[div_name].graph.yAxisRange();
4567527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
4667527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                if (xRange != undefined) {
4767527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    if (xR[0] < xRange[0])
4867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                        xRange[0] = xR[0];
4967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    if (xR[1] > xRange[1])
5067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                        xRange[1] = xR[1];
5167527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                } else
5267527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    xRange = xR;
5367527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
5467527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                if (yRange != undefined) {
5567527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    if (yR[0] < yRange[0])
5667527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                        yRange[0] = yR[0];
5767527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    if (yR[1] > yRange[1])
5867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                        yRange[1] = yR[1];
5967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                } else
6067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    yRange = yR;
6167527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            }
6267527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        }
6367527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
6467527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        if (syncGraphs.length >= 2) {
6567527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            if (syncZoom) {
6667527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                if (syncObjs[group] != undefined)
6767527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    syncObjs[group].detach();
6867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
6967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                syncObjs[group] = Dygraph.synchronize(syncGraphs, {
7067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    zoom: true,
7167527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    selection: false,
7267527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    range: true
7367527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                });
7467527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            }
7567527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
7667527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            $.each(syncGraphs, function(g) {
7767527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                var graph = syncGraphs[g];
7867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
7967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                graph.updateOptions({
8067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    valueRange: yRange,
8167527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    dateWindow: xRange
8267527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                });
8367527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
8467527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                if (graph.padFront_ == undefined) {
8567527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    graph.padFront_ = true;
8667527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    var _decoy_elem = new Array(graph.rawData_[0].length);
8767527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    graph.rawData_.unshift(_decoy_elem);
8867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                }
8967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                graph.rawData_[0][0] = xRange[0];
9067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
9167527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                if (graph.padBack_ == undefined) {
9267527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    graph.padBack_ = true;
9367527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    var _decoy_elem = new Array(graph.rawData_[0].length);
9467527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                    graph.rawData_.push(_decoy_elem);
9567527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                }
9667527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                graph.rawData_[graph.rawData_.length - 1][0] = xRange[1];
9767527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            });
9867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        }
9967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh    };
10067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
101f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino    var generate = function(data, colors) {
102f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino        create_graph(data, colors);
103535b3bd3ff699415798dbf1e9cf9e3bc3f56c3b2Javi Merino        purge();
104535b3bd3ff699415798dbf1e9cf9e3bc3f56c3b2Javi Merino        if (data.syncGroup != undefined)
105535b3bd3ff699415798dbf1e9cf9e3bc3f56c3b2Javi Merino            sync(data.syncGroup);
106211860fe53efaa299db6ff6c9b28816bcb5902d4Kapileshwar Singh    };
107211860fe53efaa299db6ff6c9b28816bcb5902d4Kapileshwar Singh
108f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino    var create_graph = function(t_info, colors) {
1095c53c1f76cb60be8cf1d6c43b54a3f04eae10d6cKapileshwar Singh        var tabular = t_info.data;
1105c53c1f76cb60be8cf1d6c43b54a3f04eae10d6cKapileshwar Singh
111f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino        var options = {
1128741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            legend: 'always',
1138741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            title: t_info.title,
1148741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            labels: tabular.labels,
1158741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            labelsDivStyles: {
1168741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh                'textAlign': 'right'
1178741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            },
1188741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            rollPeriod: 1,
1198741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            animatedZooms: true,
1208741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            connectSeparatedPoints: true,
1218741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            showRangeSelector: t_info.rangesel,
1228741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            rangeSelectorHeight: 50,
1238741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            stepPlot: t_info.step_plot,
1248741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            logscale: t_info.logscale,
125bd75d5c3abd977e41ce8c9f7e4740a552a239932Kapileshwar Singh            fillGraph: t_info.fill_graph,
1268741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh            labelsDiv: t_info.name + "_legend",
1274462468766dabe30a7c58c655807c4c2ede0fdccKapileshwar Singh            errorBars: false,
1289b4898aa3ea40f2af85157af65ab491e8aaa9b4cMichele Di Giorgio            labelsSeparateLines: true,
1297ab82627f892036d7eeb04af3d282a329f8d04cdKapileshwar Singh            valueRange: t_info.valueRange,
1307ab82627f892036d7eeb04af3d282a329f8d04cdKapileshwar Singh            drawPoints: t_info.drawPoints,
1317ab82627f892036d7eeb04af3d282a329f8d04cdKapileshwar Singh            strokeWidth: t_info.strokeWidth,
1327ab82627f892036d7eeb04af3d282a329f8d04cdKapileshwar Singh            pointSize: t_info.pointSize,
133c972b86eac3c41c14b4063f0a4c79b371ebe739cKapileshwar Singh            dateWindow: t_info.dateWindow
134f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino        };
135f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino
136e2ede1f52665ff9ca6ed5177528b2f150ef16a35Brendan Jackman        if (typeof t_info.fill_alpha !== 'undefined')
137e2ede1f52665ff9ca6ed5177528b2f150ef16a35Brendan Jackman            options.fillAlpha = t_info.fill_alpha;
138e2ede1f52665ff9ca6ed5177528b2f150ef16a35Brendan Jackman
139f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino        if (typeof colors !== 'undefined')
140f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino            options["colors"] = colors;
141f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino
142f4261b4fbb05ab7e27d89fa2f607773cdf4355b2Javi Merino        var graph = new Dygraph(document.getElementById(t_info.name), tabular.data, options);
143b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh
144b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh        var width = $("#" + t_info.name)
145b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh            .closest(".output_subarea").width() / t_info.per_line
146b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh
147094df31b5d420dfbd705cdfaa51f580522b0ad80Michele Di Giorgio        /*
148094df31b5d420dfbd705cdfaa51f580522b0ad80Michele Di Giorgio         * Remove 3 pixels from width to avoid unnecessary horizontal scrollbar
149094df31b5d420dfbd705cdfaa51f580522b0ad80Michele Di Giorgio         */
150094df31b5d420dfbd705cdfaa51f580522b0ad80Michele Di Giorgio        graph.resize(width - 3, t_info.height);
151b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh
152b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh        $(window).on("resize." + t_info.name, function() {
153b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh
154b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh            var width = $("#" + t_info.name)
155b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh                .closest(".output_subarea").width() / t_info.per_line
1568741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh
157b9e8f11cfd24c71e4634a3b23ba3704841e636d9Kapileshwar Singh            graph.resize(width, t_info.height);
15867527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        });
15967527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
16067527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh        graphs[t_info.name] =
16167527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            {
16267527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                graph: graph,
16367527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                group: t_info.syncGroup,
16467527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh                syncZoom: t_info.syncZoom
16567527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh            };
16667527ddea39e858c957997356a16bd8e3819f359Kapileshwar Singh
167211860fe53efaa299db6ff6c9b28816bcb5902d4Kapileshwar Singh    };
1688741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh
169211860fe53efaa299db6ff6c9b28816bcb5902d4Kapileshwar Singh    return {
170211860fe53efaa299db6ff6c9b28816bcb5902d4Kapileshwar Singh        generate: generate
171211860fe53efaa299db6ff6c9b28816bcb5902d4Kapileshwar Singh    };
1728741ef170bc7fcc772837fd2db3df2f8d74b6c10Kapileshwar Singh
173211860fe53efaa299db6ff6c9b28816bcb5902d4Kapileshwar Singh}());
174