// 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_ElementRelay(aViewModel, aOptions)
{
    "use strict";
    /** private members */
    var mViewModel;
    var mOptions;
    var mRq;
    var mBinder;
    var mReponseDataPaths;
    var mSelections = []; // mSelectionss is a list of references to objects, each containing a field named "selection"
    
    /** constructor */
    mViewModel = aViewModel;
    mRq = mViewModel.getRequest();
    mOptions = aOptions;
    mReponseDataPaths = [];

    /** public functions - Interface for parent */ 
    this.expectedReponseData = function() // TODO: might be put in prototype (without header info)
    {
        return[{type: "elementRelay"}, {type: "string"}];
    };

    this.setSelectionToControl = function(aSelection)
    {
        mSelections.push(aSelection);
    };
    
    this.setReponseDataPath = function(aDataPathIndex, aReponseDataPath)
    {
        mReponseDataPaths[aDataPathIndex] = aReponseDataPath;
    };
    
    this.setBinder = function(aBinder)
    {
        mBinder = aBinder;
    };
	
	/** public functions - Interface for views */ 
    this.select = function(aIndex)
    {
        for (var i = 0; i < mSelections.length; ++i)
            mViewModel.select(mSelections[i], aIndex);
        mBinder.notifyChange(true);
    };

    this.getOptions = function()
    {
        return mOptions;
    };
    
    this.getList = function()
    {
        return prepareResponse(getSimpleDataFromResponseElement);
    };
    
    this.getListWithElementInfo = function()
    {
        return prepareResponse(getDataFromResponseElement);
    };

    this.setValue = function(aDataPathIndex, aValue, aIndexInList, aLastSelectionIndexes, aDataHasBeenSet, aAdditionalData)
    {
        mViewModel.setResponseElement(mReponseDataPaths[aDataPathIndex], aValue, aIndexInList, aLastSelectionIndexes, aDataHasBeenSet, aAdditionalData);
    };

    /** private functions */

    function prepareResponse(aGetValueFunction)
    {
        var lValues = [];
        var lSelections = [];
        for (var i = 0; i < mReponseDataPaths.length; ++i)
        {
            lValues[i] = aGetValueFunction(mViewModel.getResponseElement(mReponseDataPaths[i]), mViewModel.getRequestFromPath(mReponseDataPaths[i]));
        }
        for (var i = 0; i < mSelections.length; ++i)
        {
            lSelections[i] = mSelections[i] ? mSelections[i].selection : undefined;
        }
        return {
            selections: lSelections,
            values: lValues
        };
    }

    
    function getRow(node)
    {
        var row = [];
        row.push(node.val);
        if (node.childVals)
        {
            var lChildren = [];
            for (var j = 0; j < node.childVals.length; ++j)
            {
                if (node.childVals[j].node)
                {
                    lChildren.push(node.childVals[j].node.val);
                }
                else if (node.childVals[j].list)
                {
                    var lList = [];
                    for (var i = 0; i < node.childVals[j].list.length; ++i)
                        lList.push(node.childVals[j].list[i].node.val);
                    lChildren.push(lList);
                    //console.log ("lListVM::", lList);
                }
            }
            row.push(lChildren);
        }
        return row;
    }
    
    function getSimpleDataFromResponseElement(lElement, aRq)
    {
        var lTable = [];
        if (lElement)
        {
            if (lElement.error)
                lTable.push([lElement.error]);
            else if (lElement.node)
                lTable.push(getRow(lElement.node));
            else if (lElement.list)
            {
                /*if (mSelections[0] && mSelections[0][0] >= lElement.list.length)
                    mSelections[0][0] = 0;*/
                if (mOptions.showOnlySelected != undefined && aRq.getData.selection != undefined) {
                    if (lElement.list.length > 0) {
                        if (aRq.getData.selectionValues != undefined) {
                            lTable.push(getRow(lElement.list[0].node));
                        } else {
                            lTable.push(getRow(lElement.list[aRq.getData.selection[0]].node));
                        }
                    }
                } else {
                    for (var i = 0; i < lElement.list.length; ++i) {
                        lTable.push(getRow(lElement.list[i].node));
                    }
                }
            }
            //else
                //console.log("something else lElement: ", lElement)
        }
        return lTable;
    }

    function getChildren(node)
    {
        var lChildren = [];
        if (node.childVals)
        {
            for (var j = 0; j < node.childVals.length; ++j)
            {
                if (node.childVals[j].node)
                {
                    lChildren.push(node.childVals[j].node.val);
                }
                else if (node.childVals[j].list)
                {
                    var lList = [];
                    for (var i = 0; i < node.childVals[j].list.length; ++i)
                        lList.push(node.childVals[j].list[i].node.val);
                    lChildren.push(lList);
                }
            }
        }
        return lChildren;
    }

    function getDataFromResponseElement(lElement, aRq)
    {
        var lData = {};
        if (lElement)
        {
            lData.element = aRq.getData.element;
            lData.selection = aRq.getData.selection;
            if (lElement.error)
                lData.error = lElement.error;
            else if (lElement.node)
            {
                lData.val = lElement.node.val;
                lData.isWritable = lElement.node.tp > 0;
                lData.children = getChildren(lElement.node, aRq.getData)[1];
            }
            else if (lElement.list)
            {

                if (mOptions.showOnlySelected != undefined && aRq.getData.selection != undefined) {
                    if (lElement.list.length > 0) {
                        var node;
                        var lChildList = [];
                        if (aRq.getData.selectionValues != undefined) {
                            node = lElement.list[0].node
                        } else {
                            
                            node = lElement.list[aRq.getData.selection[0]].node;
                        }
                        lData.val = node.val;
                        if (aRq.getData.children) {
                            var lChildren = getChildren(node);
                            if (aRq.getData.children) {
                                for (var j = 0; j < lChildren.length; ++j) {
                                    lChildList[j] = {
                                        element: aRq.getData.children[j].getData.element, 
                                        val:[lChildren[j]],
                                        selection: aRq.getData.children[j].getData.selection
                                    };
                                }
                            }
                        }
                        lData.children = lChildList;
                    } else {
                        lData.val = "";
                        lData.children = [];
                    }
                } else {
                    var lList = [];
                    var lChildList = [];
                    
                    for (var i = 0; i < lElement.list.length; ++i) {
                        lList.push(lElement.list[i].node.val);
                        var lChildren = getChildren(lElement.list[i].node);
                        if (aRq.getData.children)
                        {
                            if (lChildList.length == 0)
                            {
                                for (var j = 0; j < lChildren.length; ++j)
                                {
                                    lChildList[j] = {
                                        element: aRq.getData.children[j].getData.element, 
                                        val:[],
                                        selection: aRq.getData.children[j].getData.selection
                                    };
                                }
                            }
                            for (var j = 0; j < lChildren.length; ++j)
                            {
                                lChildList[j].val.push(lChildren[j]);
                            }
                        }
                    }
                    
                    lData.val = lList;
                    lData.children = lChildList;
                }
                

            }
        }
        return lData;
    }
}

CViewModel_ElementRelay.getHelp = function() {
    var help = 'Simple interface for views.\n';
    help += 'The function getList will return the following structure: {values: [[value, [children], isWritable]], selections: [[]]}\n';
    help += 'The function getListWithElementInfo will return the following structure: {values: [{val: "", element: "", isWritable: boolean, selection: [], children: []}], selections: [[]]}\n';
    return help;
}

CViewModel_ElementRelay.providesInterface = function() {
    return ["setValue", "getListWithElementInfo", "getList", "getOptions", "select"];
};

CViewModel_ElementRelay.getCustomDataSchema = function() {
    return {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "Custom data for CViewModel_ElementRelay",
        "type": "object",
        "properties": {
            "showOnlySelected": {
                "type": "boolean",
                "format": "checkbox",
                "description": "whther we only show the selected element from an iterator",
                "default": true
            }
        }
    };
};

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