// 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_Clients(p_viewmodel, p_options) {
    "use strict";

    /** constructor */
    
    var v_options = p_options;
    var base = new CViewModel_TableForLargeData(p_viewmodel, p_options);
    
    var v_flexAligner = new CViewModel_FlexAligner();
    
    var v_tableData = {
        "table": []
    };
    var v_header = [];
    var v_viewmodels = [];
    var v_firstSeparatorExists;
    
    /** public functions - interface for parent */ 

    this.setSelectionToControl = base.setSelectionToControl;
    this.setReponseDataPath = base.setReponseDataPath;
    this.setBinder = base.setBinder;
	
	/** public functions - interface for views */ 

    this.getViewmodelBundle = function() {
        var newTableData = base.getTable();
        var newHeader = base.getHeader();
        
        // in the check we use both v_tableData and newTableData
        var fullRefresh = checkIfFullRefreshNeeded(newTableData);
        v_tableData = newTableData;
        v_header = newHeader;
        updateViewmodels();
        
        return {
            "viewmodels": v_viewmodels,
            "fullRefresh": fullRefresh,
            "firstSeparatorExists": v_firstSeparatorExists
        };
    };
    
    this.getRange = base.getRange;
    this.getPosition = base.getPosition;
    this.setPosition = base.setPosition;
    this.getViewportSize = base.getViewportSize;
    this.isStreaming = base.isStreaming;

    /** private functions */
    
    function checkIfFullRefreshNeeded(newTableData) {
        if ((newTableData.separators == undefined && v_tableData.separators == undefined) || 
            (newTableData.separators != undefined && v_tableData.separators != undefined && newTableData.separators.length == v_tableData.separators.length)) {
            
            if (newTableData.separators != undefined && v_tableData.separators != undefined) {
                var columnIndexThatContainsTheSize = v_options.numberOfElementsInFirstAligner + v_options.numberOfElementsInSecondAligner;
                var limitForFirstSeparatorExistance;
                if (newTableData.separators.length > 1) {
                    limitForFirstSeparatorExistance = newTableData.separators[1].index;
                } else {
                    limitForFirstSeparatorExistance = newTableData.table.length;
                }
                var firstSeparatorExists = true;
                if (base.getPosition() != 0) {
                    for (var i = 0; i < limitForFirstSeparatorExistance; ++i) {
                        if (parseInt(newTableData.table[i][columnIndexThatContainsTheSize].val) != limitForFirstSeparatorExistance) {
                            firstSeparatorExists = false;
                            break;
                        }
                    }
                }
                if (firstSeparatorExists != v_firstSeparatorExists) {
                    v_firstSeparatorExists = firstSeparatorExists;
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else {
            return true;
        }
    }
    
    function updateViewmodels() {
        // create or delete viewmodels so we have the correct number of them
        var numberOfAdditionalViewmodels = v_tableData.separators.length - v_viewmodels.length;
        if (numberOfAdditionalViewmodels > 0) {
            for (var i = 0; i < numberOfAdditionalViewmodels; ++i) {
                v_viewmodels.push({
                    "aligner1": new AlignerViewmodel(),
                    "aligner2": new AlignerViewmodel(),
                    "table": new TableViewmodel()
                });
            }
        } else if (numberOfAdditionalViewmodels < 0) {
            for (var i = 0; i > numberOfAdditionalViewmodels; --i) {
                v_viewmodels.pop();
            }
        }
        
        // update the viewmodels, we now know that v_viewmodels.length == v_tableData.separators.length
        v_tableData.separators.push({"index": v_tableData.table.length}); // a small trick so we avoid conditions below
        for (var i = 0; i < v_viewmodels.length; ++i) {
            v_viewmodels[i].aligner1.setData(v_tableData.separators[i].index, 0, v_options.numberOfElementsInFirstAligner);
            v_viewmodels[i].aligner2.setData(v_tableData.separators[i].index, v_options.numberOfElementsInFirstAligner, v_options.numberOfElementsInSecondAligner);
            v_viewmodels[i].table.setData(v_tableData.separators[i].index, v_options.numberOfElementsInFirstAligner + v_options.numberOfElementsInSecondAligner + 1, v_tableData.separators[i + 1].index - v_tableData.separators[i].index);
        }
        v_tableData.separators.pop();
    }
    
    /** private Classes */
    
    // The mocked viewmodel for ElementRelay used in the element aligners
    function AlignerViewmodel() {
        var v_row;
        var v_col;
        var v_columnCount;
        
        this.setData = function(p_row, p_col, p_columnCount) {
            v_row = p_row;
            v_col = p_col;
            v_columnCount = p_columnCount;
        };
        
        this.select = function() {};
        
        this.getListWithElementInfo = function() {
            var list = [];
            for (var i = 0; i < v_columnCount; ++i) {
                list.push({
                    "element": v_header[v_col + i].heading,
                    "val": v_tableData.table[v_row][v_col + i].val,
                    "isWritable": v_tableData.table[v_row][v_col + i].isWritable,
                });
            }
            return {
                "values": list,
                "selections": []
            }
        };
        
        this.getList = function() {
            var list = [];
            for (var i = 0; i < v_columnCount; ++i) {
                list.push([
                    [v_tableData.table[v_row][v_col + i].val, undefined, v_tableData.table[v_row][v_col + i].isWritable]
                ]);
            }
            return list;
        };
        
        this.setValue = function(dataPathIndex, value) {
            base.setValue(v_row, v_col + dataPathIndex, value);
        };
        
        this.getChildPercentagesFromFlex = v_flexAligner.getChildPercentagesFromFlex;
    }
    
    // The mocked viewmodel for DynamicTable used in the tables
    function TableViewmodel() {
        var v_row;
        var v_col;
        var v_rowCount;
        
        this.setData = function(p_row, p_col, p_rowCount) {
            v_row = p_row;
            v_col = p_col;
            v_rowCount = p_rowCount;
        };
        
        this.select = function() {};
        
        this.getHeader = function() {
            var header = mcopy(v_header.slice(v_col));
            for (var i = 0; i < header.length; ++i) {
                header[i].elementIndex = i;
            }
            return header;
        };
        
        this.getName = function() {
            return v_header[v_col].heading;
        };
        
        this.getTable = function() {
            var tableData = [];
            for (var i = 0; i < v_rowCount; ++i) {
                tableData.push(v_tableData.table[v_row + i].slice(v_col));
            }
            return {"table": tableData};
        };
        
        this.setValue = function(row, col, value) {
            base.setValue(v_row + row, v_col + col, value);
        };
        
        this.getChildPercentagesFromFlex = v_flexAligner.getChildPercentagesFromFlex;
    }
}

CViewModel_Clients.getHelp = function() {
    return "Viewmodel for the clients tab. Will return a list whose elements contain 3 viewmodels: 2 for aligners and one for a table.\n" + 
        "A data connection for the possible size of the tables must precede the connection representing the 'iterator' of the table.";
};

CViewModel_Clients.providesInterface = function() {
    return ["getViewmodelBundle", "getRange", "getPosition", "setPosition", "getViewportSize", "isStreaming"];
};

CViewModel_Clients.getCustomDataSchema = function() {
    var outerTableSchema = CViewModel_TableForLargeData.getCustomDataSchema();
    
    outerTableSchema.title = "Custom data for CViewModel_Clients";
    outerTableSchema.properties["numberOfElementsInFirstAligner"] = {
        "type": "integer"
    };
    outerTableSchema.properties["numberOfElementsInSecondAligner"] = {
        "type": "integer"
    };
    // Why does outerTableSchema.properties.name = undefined not work???
    delete outerTableSchema.properties.name;
    
    if (outerTableSchema.required == undefined) {
        outerTableSchema.required = []
    }
    outerTableSchema.required.splice(0, 0, "separateBy", "numberOfElementsInFirstAligner", "numberOfElementsInSecondAligner");
    
    return outerTableSchema;
};

CViewModel_Clients.expectsConnection = function() {
    return CViewModel_TableForLargeData.expectsConnection();
};

//# sourceURL=CustomizableApp\ViewModels\ViewModel_Clients.js