// 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 PlaylistEditor_EditorContainer_View(p_viewModel, p_parent) {
    "use strict";

    var v_this = this;

    var v_viewmodel = p_viewModel;
    var v_parent = p_parent;
    var v_dataSourceUtils = new DataSourceUtils();

    var v_filterEditor;
    var v_helpTree;
    var v_views = {};
    var v_connectionsView = new GuiEditor_Connections_View("PlaylistEditor_Playground", v_this);

    this.ctrlToggle = false;
    this.altToggle = false;

    ///////////////////// GENERAL VIEW FUNCTIONS //////////////////////////////

    this.applicationCreated = function() {
        $("#PlaylistEditor_RequestEditorSplit").split({
            orientation: "vertical",
            limit: 100,
            position: "20%"
        });

        v_helpTree = $("#PlaylistEditor_HelpTree");
        createHelpJSTree(v_viewmodel.getHelp());

        setupCallback();
    };

    this.setFocusedObj = function(obj) {
        v_parent.setFocusedObj(obj);
        v_connectionsView.refreshConnections();
    };

    this.fullRefresh = function() {
        for (var id in v_views) {
            v_views[id].destroy();
        }
        var editorViewmodels = v_viewmodel.getEditorViewmodels();
        for (var id in editorViewmodels) {
            v_views[id] = new PlaylistEditor_PlaylistItem_View(id, editorViewmodels[id], v_this, v_helpTree);
            v_views[id].applicationCreated();
        }

        v_connectionsView.fullRebuild();
        v_connectionsView.refreshConnections();
    };

    this.destroy = function() {
        $("#PlaylistEditor_ElementEditor").off("remove");
        $("#PlaylistEditor_ElementEditor").remove();
        $("#PlaylistEditor_FilterElementEditor").off("remove");
        $("#PlaylistEditor_FilterElementEditor").remove();
        v_connectionsView.destroy();
        $(document).off("keydown", toggle);
        $(document).off("keyup", toggle);
    };

    ///////////////////// CREATING VIEW ELEMENTS AND INTERACTIONS //////////////////////////////

    function createHelpJSTree(help) {
        var data = v_dataSourceUtils.convertHelpToTreeDataArray(help.sources);
        v_helpTree.jstree("destroy");
        v_helpTree = v_helpTree.jstree({
            "core": {
                "data": data,
                "check_callback" : function(operation, node, node_parent, node_position, more) {
                     if (operation === "copy_node" || operation === "move_node") {
                         return false;
                     } else {
                         return true;
                     }
                },
                "multiple" : false,
                "animation": false,
                "worker": false
            },
            "plugins" : ["search", "dnd"],
            "search" : {
                "show_only_matches": true
            },
            "dnd": {
                "always_copy": true
            }
        });

        v_helpTree.bind("hover_node.jstree", function(e, data) {
            $("#"+data.node.id).prop("title", data.node.data);
        });
    }

    function createEditorView() {
        var viewmodelObject = v_viewmodel.createEditorViewmodel();
        v_views[viewmodelObject.id] = new PlaylistEditor_PlaylistItem_View(viewmodelObject.id, viewmodelObject.viewmodel, v_this, v_helpTree);
        v_views[viewmodelObject.id].applicationCreated();
    }

    this.deleteEditorView = function(id) {
        v_views[id].destroy();
        delete v_views[id];
        v_viewmodel.deleteEditorViewmodel(id);
        v_connectionsView.fullRebuild();
        v_connectionsView.refreshConnections();
    };

    function setupCallback() {
        $("#PlaylistEditor_HelpSearch").on("input", function() {
            v_helpTree.jstree("search", $(this).val());
        });

        $("#PlaylistEditor_Button_Add").click(createEditorView);

        $(document).on("keydown", toggle);
        $(document).on("keyup", toggle);
    }

    function toggle(event) {
        if (event.keyCode == 17) {
            if (event.type == "keydown") {
                v_this.ctrlToggle = true;
            } else {
                v_this.ctrlToggle = false;
            }
        } else if (event.keyCode == 18) {
            if (event.type == "keydown") {
                v_this.altToggle = true;
            } else {
                v_this.altToggle = false;
            }
            event.preventDefault();
            event.stopPropagation();
        }
    }

    this.relativeToEvent = function(nodeId, to) {
        for (var id in v_views) {
            if (v_views[id].isNodeFromTree(nodeId)) {
                v_viewmodel.playlistConnection(id, to);
                break;
            }
        }
        v_connectionsView.fullRebuild();
        v_connectionsView.refreshConnections();
    };

    this.openElementEditor = function(request, offset, refresh) {
        v_viewmodel.elementEditorViewmodel.setRequest(request);
        $("#PlaylistEditor_ElementEditor").remove();
        var customData = {
            "headerText": "Edit request",
            "closeable": true,
            "draggable": true,
            "offset": offset,
            "editorOptions": {
                "disable_array_reorder": true,
                "disable_edit_json": true,
                "disable_collapse": true,
                "no_additional_properties": true
            },
            "css": {
                "width": "600px",
                "height": "506px",
                "z-index": 2000
            }
        }
        var editor = new CView_JSONEditor([v_viewmodel.elementEditorViewmodel], "PlaylistEditor_ElementEditor", "PlaylistEditor_Playground", customData);
        editor.applicationCreated();
        ViewUtils.applyCss(customData, "PlaylistEditor_ElementEditor");
        editor.refresh(true);
        ViewUtils.jumpToEditor("PlaylistEditor_ElementEditor");

        $("#PlaylistEditor_ElementEditor").one("remove", refresh);
    };

    this.openFilterElementEditor = function(filter, offset, refresh) {
        v_viewmodel.filterElementEditorViewmodel.setFilter(filter);
        $("#PlaylistEditor_FilterElementEditor").remove();
        var customData = {
            "headerText": "Edit filter",
            "closeable": true,
            "draggable": true,
            "offset": offset,
            "editorOptions": {
                "disable_array_reorder": true,
                "disable_edit_json": true,
                "disable_collapse": true,
                "no_additional_properties": true
            },
            "css": {
                "width": "600px",
                "height": "506px",
                "z-index": 2000
            }
        }
        var editor = new CView_JSONEditor([v_viewmodel.filterElementEditorViewmodel], "PlaylistEditor_FilterElementEditor", "PlaylistEditor_Playground", customData);
        editor.applicationCreated();
        ViewUtils.applyCss(customData, "PlaylistEditor_FilterElementEditor");
        editor.refresh(true);
        ViewUtils.jumpToEditor("PlaylistEditor_FilterElementEditor");

        $("#PlaylistEditor_FilterElementEditor").one("remove", refresh);
    };

    this.openFilterEditor = function(viewmodel, requestPath, requestTree, offset, refresh) {
        if (v_filterEditor != undefined) {
            v_filterEditor.destroy();
        }
        v_filterEditor = new PlaylistEditor_FilterEditor_View(viewmodel, v_this, requestPath, requestTree, v_helpTree, offset);
        v_filterEditor.applicationCreated();
        $("#PlaylistEditor_FilterEditor").one("remove", refresh);
    };

    this.getObjectsToConnect = function() {
        var list = [];
        for (var id in v_views) {
            list.push(v_views[id]);
        }
        return list;
    };

    this.getEndpoint = function(connectionType, identifier) {
        for (var id in v_views) {
            var endpoint = v_views[id].getEndpoint(identifier);
            if (endpoint != undefined) {
                return endpoint;
            }
        }
        alert("No endpoint found for " + identifier);
    };

    this.refreshConnections = v_connectionsView.refreshConnections;
}
