// 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_FlexAligner(p_viewModel, p_options) {
    "use strict";
    
    /** constructor */
    
    var v_viewmodel = p_viewModel;
    var v_options = p_options;
    var v_binder;
    
    var v_this = this;
    
    /** public functions - interface for parent */ 
    
    this.setBinder = function(p_binder) {
        v_binder = p_binder;
    };
    
    /** public functions - interface for views */ 
    
    this.getChildPercentages = function(p_ids) {
        var total = 0;
        var flexes = [];
        for (var i = 0; i < p_ids.length; ++i) {
            flexes.push(1);
        }
        
        var descriptors = v_viewmodel.getViewDescriptors();
        for (var i = 0; i < descriptors.length; ++i) {
            var index = p_ids.indexOf(descriptors[i].parentID);
            if (index != -1) {
                var flex = descriptors[i].customData.flex;
                if (flex != undefined) {
                    flexes[index] = flex;
                    total += flex;
                } else {
                    total += 1;
                }
            }
        }
        
        v_this.getChildPercentagesFromFlex(flexes, total);
        
        return flexes;
    };
    
    this.getChildPercentagesFromFlex = function(flexes, total) {
        for (var i = 0; i < flexes.length; ++i) {
            flexes[i] = "" + ((flexes[i] / total) * 100) + "%";
        }
    };
    
    this.getChildSizes = function(p_ids) {
        var totalFlex = 0;
        var totalPx = 0;
        var sizes = [];
        for (var i = 0; i < p_ids.length; ++i) {
            sizes.push(1);
        }
        
        var descriptors = v_viewmodel.getViewDescriptors();
        for (var i = 0; i < descriptors.length; ++i) {
            var index = p_ids.indexOf(descriptors[i].parentID);
            if (index != -1) {
                var flex = descriptors[i].customData.flex;
                if (flex != undefined) {
                    sizes[index] = flex;
                    if (Number.isInteger(flex)) {
                        totalFlex += flex;
                    } else {
                        totalPx += parseInt(flex.substring(0, flex.length - 2));
                    }
                } else {
                    totalFlex += 1;
                }
            }
        }
        
        for (var i = 0; i < sizes.length; ++i) {
            if (Number.isInteger(sizes[i])) {
                sizes[i] = "calc(" + (100 * sizes[i] / totalFlex) + "% - " + totalPx + "px)";
            }
        }
        
        return sizes;
    };
}

CViewModel_FlexAligner.getHelp = function() {
    return "A viewmodel that can calculate percentages from the flex of subviews.";
}

CViewModel_FlexAligner.providesInterface = function() {
    return ["getChildPercentages", "getChildPercentagesFromFlex", "getChildSizes"];
};

CViewModel_FlexAligner.getCustomDataSchema = function() {
    return {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "Custom data for CViewModel_FlexAligner",
        "type": "object",
        "properties": {},
        "additionalProperties": false
    };
};

CViewModel_FlexAligner.expectsConnection = function() {
    return {
        "dataConnections": [],
        "selectionConnections": []
    };
};

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