// Copyright (c) 2000-2017 Ericsson Telecom AB                                                       //
// All rights reserved. This program and the accompanying materials are made available under the     //
// terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at //
// http://www.eclipse.org/legal/epl-v10.html                                                         //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function CViewModel_Chart(p_viewmodel, p_options) {
    "use strict";

    /** constructor */
    
    var v_viewmodel = p_viewmodel;
    var v_options = p_options;
    
    var v_dataPaths = [];
    var v_visible = [];
        
    /** public functions - interface for parent */
    
    this.setSelectionToControl = function(p_selection) {};
    this.setBinder = function(p_binder) {};
    this.setReponseDataPath = function(p_index, p_path) {
        v_dataPaths[p_index] = p_path;
    };
	
    /** public functions - interface for views */
    
    this.getChartData = function() {
        return getDatasetsAndNavigationData();
    };
    
    this.toggleSeries = function(index) {
        if (v_visible[index] == undefined) {
            v_visible[index] = false;
        } else {
            v_visible[index] = !v_visible[index];
        }
    };
    
    this.isSeriesVisible = function(index) {
        return v_visible[index] == undefined || v_visible[index] == true;
    }
    
    /** private functions */
    
    function getTimelineContent(tp, stringContent) {
        if (tp == 1) {
            return parseInt(stringContent);
        } else if (tp == 2) {
            return parseFloat(stringContent);
        } else if (tp == 3) {
            return stringContent == "true";
        } else {
            return stringContent
        }
    }
    
    function addTimelineData(data, timeline) {
        try {
            timeline = JSON.parse(timeline);
            if (timeline.x.length != timeline.y.length) {
                return false
            } else {
                for (var i = 0; i < timeline.x.length; ++i) {
                    data.push([timeline.x[i] * 1000, getTimelineContent(timeline.tp, timeline.y[i])]);
                }
                return true;
            }
        } catch (e) {
            return false;
        }
    }
    
    function getDatasetsAndNavigationData() {
        var navigationData = {x: {pan: {min: -1, max: 1}, zoom: {min: 1, max: null}}, y: {pan: {min: -1, max: 1}, zoom: {min: 1, max: null}}};
        var dataSets = [];
        
        var counter = 0;
        for (var i = 0; i < v_dataPaths.length; ++i) {
            var response = v_viewmodel.getResponseElement(v_dataPaths[i]);
            if (response != undefined) {
                var request = v_viewmodel.getRequestFromPath(v_dataPaths[i]);
                if (request.getData.timeline != undefined && response.node != undefined) {
                    var dataSet = getEmptyDataSet(counter, request != undefined ? request.getData.element : "Series" + counter);
                    if (addTimelineData(dataSet.data, response.node.val)) {
                        dataSets.push(dataSet);
                        ++counter;
                    }
                } else if (response != undefined && response.list != undefined && request.getData.children != undefined) {
                    for (var j = 0; j < request.getData.children.length; ++j) {
                        if (request.getData.children[j].getData.timeline != undefined) {
                            for (var k = 0; k < response.list.length; ++k) {
                                if (response.list[k].node.childVals != undefined && response.list[k].node.childVals[j] != undefined) {
                                    var childResponse = response.list[k].node.childVals[j];
                                    var dataSet = getEmptyDataSet(counter, response.list[k].node.val);
                                    if (addTimelineData(dataSet.data, childResponse.node.val)) {
                                        dataSets.push(dataSet);
                                        ++counter;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        
        if (dataSets.length != 0 && dataSets[0].data[0] != undefined) {
            navigationData.x.pan.min = dataSets[0].data[0][0] + 1;
            navigationData.y.pan.min = dataSets[0].data[0][1] + 1;
        }
        
        for (var i = 0; i < dataSets.length; ++i) {
            for (var j = 0; j < dataSets[i].data.length; ++j) {
                navigationData.x.pan.max = Math.max(navigationData.x.pan.max, dataSets[i].data[j][0] + 1);
                navigationData.x.pan.min = Math.min(navigationData.x.pan.min, dataSets[i].data[j][0] - 1);
                navigationData.y.pan.max = Math.max(navigationData.y.pan.max, dataSets[i].data[j][1] + 1);
                navigationData.y.pan.min = Math.min(navigationData.y.pan.min, dataSets[i].data[j][1] - 1);
            }
        }
        
        return {
            "dataSets": dataSets,
            "navigationRanges": navigationData
        }
    }
    
    function getEmptyDataSet(counter, altLabel) {
        var data;
        if (v_options.dataSet == undefined || v_options.dataSet[counter] == undefined) {
            data = {
                "label": altLabel,
                "data": [],
                "lines": {
                    "show": v_visible[counter] == undefined || v_visible[counter] == true
                }
            }
        } else {
            data = {
                "label": v_options.dataSet[counter].label,
                "data": [],
                "color": v_options.dataSet[counter].color,
                "highlightColor": v_options.dataSet[counter].highlightColor,
                "lines": {
                    "show": v_visible[counter] == undefined || v_visible[counter] == true
                }
            }
        }
        
        return data;
    }
    
}

CViewModel_Chart.getHelp = function() {
    return "The viewmodel creates the data for a timeseries chart.";
};

CViewModel_Chart.providesInterface = function() {
    return ["getChartData", "toggleSeries", "isSeriesVisible"];
};

CViewModel_Chart.getCustomDataSchema = function() {
    return {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "Custom data for CViewModel_Chart",
        "type": "object",
        "properties": {
            "dataSet": {
                "type": "array",
                "format": "tabs",
                "items": {
                    "type": "object",
                    "properties": {
                        "label": {
                            "type": "string",
                            "description": "If present, it will be used as the label of the data."
                        },
                        "color": {
                            "type": "string",
                            "description": "If present, it will be used as the color of the data.",
                            "pattern": "^#(?:[0-9a-fA-F]{3}){1,2}$"
                        },
                        "highlightColor": {
                            "type": "string",
                            "description": "If present, it will be used as the highlight color of the data.",
                            "pattern": "^#(?:[0-9a-fA-F]{3}){1,2}$"
                        }
                    },
                    "additionalProperties": false,
                    "required": ["label"]
                }
            }
        },
        "additionalProperties": false
    };
};

//# sourceURL=CustomizableApp\ViewModels\ViewModel_Chart.js