// 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_DistributionChart(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() {
        var data = getDatasetsAndNavigationData();
        data.ticks = getTicks();
        return data;
    };
    
    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 getTicks() {
        var list = [];
        if (v_options.intervallimits != undefined) {
            list = v_options.intervallimits;
        } else {
            var response = v_viewmodel.getResponseElement(v_dataPaths[0]);
            if (response != undefined && response.list != undefined) {
                for (var i = 0; i < response.list.length; ++i) {
                    list[i] = response.list[i].node.val;
                }
            }
        }
        
        var listToReturn = [];
        if (list.length > 0) {
            listToReturn[0] = [1, "< " + list[0]];
            listToReturn[list.length] = [list.length + 1, list[list.length - 1] + " <"];
            for (var i = 0; i < list.length - 1; ++i) {
                listToReturn[i + 1] = [i + 2, list[i] + " - " + list[i + 1]];
            }
        }
        
        return listToReturn;
    }
    
    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 dataPathIndexOfValue = 0;
        if (v_options.intervallimits == undefined && v_dataPaths.length > 1) {
             dataPathIndexOfValue = 1;
        }
        
        var counter = 0;
        var response = v_viewmodel.getResponseElement(v_dataPaths[dataPathIndexOfValue]);
        if (response != undefined && response.list != undefined) {
            var request = v_viewmodel.getRequestFromPath(v_dataPaths[dataPathIndexOfValue]);
            var dataSet = getEmptyDataSet(counter, request != undefined ? request.getData.element : "Series" + counter);

            for (var j = 0; j < response.list.length; ++j) {
                dataSet.data.push([j + 1, response.list[j].node.val]);
            }
            dataSets.push(dataSet);
        }
        
        for (var i = 0; i < dataSets.length; ++i) {
            navigationData.x.pan.max = Math.max(navigationData.x.pan.max, dataSets[i].data.length + 1);
            for (var j = 0; j < dataSets[i].data.length; ++j) {
                navigationData.y.pan.max = Math.max(navigationData.y.pan.max, dataSets[i].data[j][1] + 1);
            }
            dataSets[i].bars.barWidth = 0.8 / dataSets.length;
        }
        
        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": false
                },
                "bars": {
                    "show": v_visible[counter] == undefined || v_visible[counter] == true,
                    "barWidth": 0
                }
            }
        } else {
            data = {
                "label": v_options.dataSet[counter].label,
                "data": [],
                "color": v_options.dataSet[counter].color,
                "highlightColor": v_options.dataSet[counter].highlightColor,
                "lines": {
                    "show": false
                },
                "bars": {
                    "show": v_visible[counter] == undefined || v_visible[counter] == true,
                    "barWidth": 0
                }
            }
        }
        
        return data;
    }
    
}

CViewModel_DistributionChart.getHelp = function() {
    return "The viewmodel creates the data and labels for a distribution chart.\n" +
        "Both the labels and values can come from a dataElement.\n" +
        "If the custom data does not contain the intervallimits, the first data connection will be used to determine them.";
};

CViewModel_DistributionChart.providesInterface = function() {
    return ["getChartData", "toggleSeries", "isSeriesVisible"];
};

CViewModel_DistributionChart.getCustomDataSchema = function() {
    return {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "Custom data for CViewModel_DistributionChart",
        "type": "object",
        "properties": {
            "intervallimits": {
                "description": "The predefined values for the interval limits of the distribution chart.",
                "type": "array",
                "format": "table",
                "items": {
                    "type": "number",
                    "title": "limit"
                }
            },
            "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_DistributionChart.js