|  var melisLinkTree = (function($, window){
    
    // cache DOM
    var $body = $('body');
    var dataUrl;
    // Binding Events =================================================================================================================
    //$body.on("click", "div[aria-label='Insert/edit link']", checkBtn);
    //$body.on("click", "div.mce-menu-item", checkBtn);
    // CreateTreeModal
    $body.on("click", "#mce-link-tree", createTreeModal);
    
    // Filter Search
    $(document).on("keyup", "input[name=tree_search]", function(event){
        var keycode = (event.keyCode ? event.keyCode : event.which);
        if(keycode == '13'){
            startTreeSearch();
        }
    }).focus();
    
    $body.on("click", "#searchTreeView", function(e){
        startTreeSearch();
    });
    
    $body.on("click", "#resetTreeView", function(e){
        melisHelper.loadingZone($('.page-evolution-content'));
        $("input[name=tree_search]").val('');
        var tree = $("#find-page-dynatree").fancytree("getTree");
        tree.clearFilter();
        $("#find-page-dynatree").fancytree("getRootNode").visit(function(node){
            node.setExpanded(false);
        });
        setTimeout(function(){
            melisHelper.removeLoadingZone($('.page-evolution-content'));
        }, 2000);
    });
        
    $body.on("click", "#generateTreePageLink", function(){
        melisCoreTool.pending('#generateTreePageLink');
        var id = $('#find-page-dynatree .fancytree-active').parent('li').attr('id').split("_")[1];
            $.ajax({
                type        : 'GET', 
                url         : 'melis/MelisCms/Page/getPageLink',
                data        : {'idPage': id},
                dataType    : 'json',
                encode      : true
            }).done(function(data) {
                dataUrl = data.link;
                showUrl(dataUrl);
                $("#id_meliscms_find_page_tree_container").modal("hide");
            }).fail(function(xhr, textStatus, errorThrown) {
                alert( translations.tr_meliscore_error_message );
            });
        melisCoreTool.done('#generateTreePageLink');
    });
    
    $body.on("click", "#generateTreePageId", function(){
        melisCoreTool.pending('#generateTreePageLink');
        var id      = $('#find-page-dynatree .fancytree-active').parent('li').attr('id').split("_")[1],
            inputId = $('#generateTreePageId').data('inputid');
        $(inputId).val(id);
        $('#id_meliscms_input_page_tree_container').modal("hide");
        melisCoreTool.done('#generateTreePageLink');
    });
    
    function startTreeSearch() {
        var match       = $("input[name=tree_search]").val(),
            tree        = $("#find-page-dynatree").fancytree("getTree"),
            filterFunc  = tree.filterNodes,
            opts        = {},
            tmp         = '';
            tree.clearFilter();
            $("#find-page-dynatree").fancytree("getRootNode").visit(function(node){
                node.resetLazy();
            });
            $("input[name=tree_search]").prop('disabled', true);
            var searchContainer = $("input[name=tree_search]").closest(".meliscms-search-box");
                searchContainer.addClass("searching");
                $.ajax({
                    type        : 'POST',
                    url         : 'melis/MelisCms/Page/searchTreePages',
                    data        : {name: 'value', value: match},
                    dataType    : 'json',
                    encode      : true
                }).done(function(data) {
                    if ( !$.trim(data) ) {
                        searchContainer.append("<div class='melis-search-overlay'>Not Found</div>").hide().fadeIn(600);
                        setTimeout(function() {
                            $(".melis-search-overlay").fadeOut(600, function() {
                                $(this).remove();
                            });
                            $("input[name=tree_search]").prop('disabled', false);
                            //$("input[name=tree_search]").focus();
                            $("input[name=tree_search]").trigger("focus");
                        }, 1000);
                    } else {
                        var arr = $.map(data, function(el) { return el });
                            tree.loadKeyPath(arr, function(node, status){
                                if ( !node.isVisible() ) {
                                    switch( status ) {
                                        case "loaded":
                                            node.makeVisible();
                                            break;
                                        case "ok":
                                            node.makeVisible();
                                            break;
                                        }
                                }
                                filterFunc.call(tree, match, opts);
                            }).done(function(){
                                $("input[name=tree_search]").prop('disabled', false);
                                searchContainer.removeClass("searching");
                            });
                    }
                }).fail(function(xhr, textStatus, errorThrown) {
                    alert( translations.tr_meliscore_error_message );
                });
    }
    
    function showUrl( dataUrl ) {
        var $body           = $("body"),
            $dialog         = $body.find(".tox-dialog"),
            $mceLinkTree    = $body.find("#mce-link-tree"),
            $iframe         = window.parent.$(".melis-iframe"),
            $idialog        = $iframe.contents().find(".tox-dialog"),
            $imceLinkTree   = $iframe.contents().find("#mce-link-tree");
            if ( $idialog.length ) {
                $imceLinkTree.parent().find("input").val(dataUrl);
            }
            if ( $dialog.length ) {
                $mceLinkTree.parent().find("input").val(dataUrl);
            }
    }
    // not used anymore on tinymce v5
    function checkBtn() {
        var urlBox      = $body.find('.mce-has-open').prev().text(),
            check       = $body.find('.mce-has-open')[0],
            urlLabel    = $body.find('.mce-widget.mce-label');
        
            urlLabel.each( function() {
                if( $(this).text() === "Url" ) {
                    var moxie       = $body.find('.mce-btn.mce-open'),
                        moxieWidth  = moxie.width() + 1,
                        urlInputBox = $(this).next(),
                        urlInput    = urlInputBox.children('.mce-textbox'),
                        cInput;
                        if ( moxie.length ) {
                            cInput = urlInput.width() - moxieWidth;
                            moxie.css({'left':'0'});
                            urlInput.css({'width': cInput})
                            addTreeBtnMoxie();
                        } else {
                            cInput = urlInput.width() - 32;
                            urlInput.css({'width': cInput});
                            urlInputBox.append('<div id="mce-link-tree" class="mce-btn mce-open" style="position: absolute; right: 0; width: 32px; height: 28px;"><button><i class="icon icon-sitemap fa fa-sitemap" style="font-family: FontAwesome; position: relative; top: 2px; font-size: 16px;"></i></button></div>');
                        }
                }
            });
    }
    // not used
    function addTreeBtnMoxie() {
        var box = $body.find('.mce-has-open');
            box.append('<div id="mce-link-tree" class="mce-btn mce-open" style="position: absolute; right: 0; width: 32px; height: 28px;"><button><i class="icon icon-sitemap fa fa-sitemap" style="font-family: FontAwesome; position: relative; top: 2px; font-size: 16px;"></i></button></div>');
    }
    function createTreeModal() {
        // initialation of local variable
        zoneId = 'id_meliscms_find_page_tree';
        melisKey = 'meliscms_find_page_tree';
        modalUrl = 'melis/MelisCms/Page/renderPageModal';
        // requesitng to create modal and display after
        if( $('#id_meliscms_find_page_tree_container').length ) {
            $('#id_meliscms_find_page_tree_container').parent().remove();
        }
        
        window.parent.melisHelper.createModal(zoneId, melisKey, false, {}, modalUrl, function() {
        });
        
        $("#mce-link-tree").closest('.tox-dialog').css('z-index', 1049);
        $(".tox-tinymce-aux").css('z-index', 1048);
        $(".tox-tinymce-aux").find(".tox-dialog-wrap__backdrop").css('z-index', 1047);
    }
    
    // used in regular form buttons
    function createInputTreeModal(id) {
        // initialation of local variable
        zoneId = 'id_meliscms_input_page_tree';
        melisKey = 'meliscms_input_page_tree';
        modalUrl = 'melis/MelisCms/Page/renderPageModal';
        // requesitng to create modal and display after
        if($('#id_meliscms_input_page_tree_container').length){
            $('#id_meliscms_input_page_tree_container').parent().remove();
        }
        window.parent.melisHelper.createModal(zoneId, melisKey, false, {'pageTreeInputId' : id}, modalUrl, function() {
        });
    }
    function selectedNodes() {
        var title = $(this).closest('li').attr('id');
            $('#statusLine').append(title);
    }
    function findPageMainTree() {
        $("#find-page-dynatree").fancytree({
            extensions: ["filter"],
            keyboard: true,
            generateIds: true, // Generate id attributes like <span id='fancytree-id-KEY'>
            idPrefix: "pageid_", // Used to generate node idīs like <span id='fancytree-id-<key>'>
            source: {
                url: '/melis/MelisCms/TreeSites/get-tree-pages-by-page-id',
                cache: true
            },
            lazyLoad: function(event, data) {
                // get the page ID and pass it to lazyload
                var pageId = data.node.data.melisData.page_id;
                    data.result = { 
                        url: '/melis/MelisCms/TreeSites/get-tree-pages-by-page-id?nodeId='+pageId,
                        data: {
                            mode: 'children',
                            parent: data.node.key
                        },
                        cache: false
                    }
            },
            renderNode: function (event, data) {
                // removed .fancytree-icon class and replace it with font-awesome icons
                $(data.node.span).find('.fancytree-icon').addClass(data.node.data.iconTab).removeClass('fancytree-icon');
                if ( data.node.statusNodeType !== 'loading' ) {
                    
                    /* if ( data.node.data.melisData.page_is_online === 0 ) {
                        $(data.node.span).find('.fancytree-title, .fa').css("color","#000");     
                    } */
                    
                    if ( data.node.data.melisData.page_has_saved_version === 1 ) {
                        //check if it has already 'unpublish' circle - avoid duplicate circle bug
                        if( $(data.node.span).children("span").hasClass("unpublish") == false  ){
                            $(data.node.span).find('.fancytree-title').before("<span class='unpublish'></span>");
                        }
                    } 
                }   
            },
            filter: {
                autoApply: true,   // Re-apply last filter if lazy data is loaded
                autoExpand: false, // Expand all branches that contain matches while filtered
                counter: true,     // Show a badge with number of matching child nodes near parent icons
                fuzzy: false,      // Match single characters in order, e.g. 'fb' will match 'FooBar'
                hideExpandedCounter: true,  // Hide counter badge if parent is expanded
                hideExpanders: false,       // Hide expanders if all child nodes are hidden by filter
                highlight: true,   // Highlight matches by wrapping inside <mark> tags
                leavesOnly: false, // Match end nodes only
                nodata: true,      // Display a 'no data' status node if result is empty
                /**
                 * Change mode option from "hide" to "dimm"
                 * To fix: https://mantis2.uat.melistechnology.fr/view.php?id=212
                 */
                mode: "dimm"       // Grayout unmatched nodes (pass "hide" to remove unmatched node instead)
            }
        });
    }
    return {
        createTreeModal         :       createTreeModal,
        createInputTreeModal    :       createInputTreeModal,
        findPageMainTree        :       findPageMainTree,
        checkBtn                :       checkBtn,
        showUrl                 :       showUrl,
    }
})(jQuery, window);
 |