// 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_Condition(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.getState = function() {
        var returnValue;
        var request = v_viewmodel.getRequestFromPath(v_dataPaths[0]);
        var response = v_viewmodel.getResponseElement(v_dataPaths[0]);
        if (response != undefined && response.node != undefined) {
            if (response.node.tp == 0) {
                returnValue = false;
            } else if (response.node.tp == 3 && request.getData.filter == undefined) {
                returnValue = response.node.val === "true";
            } else {
                returnValue = true;
            }
            if (v_options.negate) {
                returnValue = !returnValue;
            }
        } else if (response != undefined && response.list != undefined) {
            returnValue = response.list.length != 0;
            if (v_options.negate) {
                returnValue = !returnValue;
            }
        } else {
            returnValue = false;
        }
        
        return returnValue;
    };
}

CViewModel_Condition.getHelp = function() {
    return "This viewmodel can process a response element that can be used for conditions.\n" +
        "If the element was filtered, the returned value is false.\n" +
        "If the element does not contain a filter and it is a boolean value, the returned value will be the element's value.\n" +
        "If the element is an empty list, it will be false.\n" +
        "Otherwise, it is true";
}

CViewModel_Condition.providesInterface = function() {
    return ["getState"];
};

CViewModel_Condition.getCustomDataSchema = function() {
    return {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "Custom data for CViewModel_Condition",
        "type": "object",
        "properties": {
            "negate": {
                "description": "whether we want to negate the condition",
                "type": "boolean",
                "format": "checkbox",
                "default": true
            }
        },
        "additionalProperties": false
    };
};

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