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

    /** constructor */
    
    var v_viewmodel = p_viewmodel;
    var v_options = p_options;
    
    var v_binder;
    var v_dataPaths = [];
    var v_selections = [];
    
    /** public functions - interface for parent */
    
    this.setSelectionToControl = function(p_selection) {
        v_selections.push(p_selection);
    };
    
    this.setReponseDataPath = function(p_index, p_path) {
        v_dataPaths[p_index] = p_path;
    };
    
    this.setBinder = function(p_binder) {
        v_binder = p_binder;
    };
	
	/** public functions - interface for views */ 
    
    this.getSize = function() {
        var response = v_viewmodel.getResponseElement(v_dataPaths[0]);
        if (response != undefined && response.node != undefined) {
            return response.node.val;
        } else {
            return 0;
        }
    };
    
    this.getRangeFilter = function() {
        var size = this.getSize();
        var filter = v_viewmodel.getRequestFromPath(v_dataPaths[1]).getData.rangeFilter;
        
        if (filter == undefined) {
            return {
                "offset": 0,
                "count": size
            };
        } else {
            var offset = 0;
            if (filter.offset != undefined) {
                offset = filter.offset;
            }
            if (offset >= size) {
                offset = Math.max(0, size - 1);
            }
            
            var count;
            if (filter.count != undefined) {
                count = filter.count;
            } else {
                count = size - offset;
            }

            return {
                "offset": offset,
                "count": count
            }
        }
    };
    
    this.changeFilter = function(obj) {
        var getData = v_viewmodel.getRequestFromPath(v_dataPaths[1]).getData;
        var filter = getData.rangeFilter;;
        var size = this.getSize();
        
        if (obj == undefined) {
            getData.rangeFilter = undefined;
            return;
        } else if (filter == undefined) {
            filter = {};
            getData.rangeFilter = filter;
        }
        
        if (obj.offset != undefined) {
            if (obj.offset.to != undefined) {
                filter.offset = obj.offset.to;
            } else if (obj.offset.by != undefined) {
                if (filter.offset != undefined) {
                    filter.offset += obj.offset.by;
                } else {
                    filter.offset = obj.offset.by;
                }
            }
            if (filter.offset < 0) {
                filter.offset = 0;
            } else if (filter.count != undefined && v_options.allowScrollBelow == false && filter.offset > size - filter.count) {
                filter.offset = Math.max(size - filter.count, 0);
            } else if (filter.offset > size - 1) {
                filter.offset = Math.max(size - 1, 0);
            }
        }
        
        if (obj.count != undefined) {
            if (obj.count.to != undefined) {
                filter.count = obj.count.to;
            } else if (obj.count.by != undefined && filter.count != undefined) {
                filter.count += obj.count.by;
            }
            
            if (filter.count < 1) {
                filter.count = 1;
            }
        }
    };
    
    this.hasFilter = function() {
        return v_viewmodel.getRequestFromPath(v_dataPaths[1]).getData.rangeFilter != undefined;
    }
}

CViewModel_Paging.getHelp = function() {
    return "A viewmodel that can manipulate the rangeFilter of a request.";
}

CViewModel_Paging.providesInterface = function() {
    return ["getSize", "getRangeFilter", "changeFilter"];
};

CViewModel_Paging.getCustomDataSchema = function() {
    return {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "Custom data for CViewModel_Paging",
        "type": "object",
        "properties": {
            "allowScrollBelow": {
                "description": "Whether we want to allow paging to the very bottom (so that only one element remains unfiltered). Set it to false if the connected view can show every element.",
                "type": "boolean",
                "format": "checkbox",
                "default": false
            }
        },
        "additionalProperties": false
    };
};

CViewModel_Paging.expectsConnection = function() {
    var dataConnections = [
        {
            "source": "DataSource",
            "element": "sizeOf"
        },
        {
            "valueType": ["charstringlistType", "integerlistType", "floatlistType"]
        }
    ];
    
    return {
        "dataConnections": dataConnections,
        "selectionConnections": []
    };
};

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