var melisDragnDrop = (function($, window) {
    var centerWindow,
        placeholderWidth,
        $body               = $("body"),
        scrollBool          = true,
        scrollH             = window.parent.$("body")[0].scrollHeight,
        currentFrame        = window.parent.$("iframe[data-iframe-id='"+melisActivePageId+"']");
        /* ==================================
         Binding Events
         ====================================*/
        $body.on("click", "#melisPluginBtn", showPluginMenu);
        $body.on("click", ".melis-cms-filter-btn", showPlugLists);
        $body.on("click", ".melis-cms-category-btn", showCatPlugLists);
        /* ==================================
         Drag & Drop
         ====================================*/
        $(".melis-cms-plugin-snippets").draggable({
            connectWith: ".melis-draggable",
            connectToSortable: ".melis-dragdropzone",
            revert: true,
            helper: "clone",
            start: function( event, ui ) {
                $(ui.helper).find('.melis-plugin-tooltip').hide();
                $(".melis-dragdropzone").addClass("highlight").removeClass("no-content");
                $(".ui-sortable-placeholder").css("background", "#fff");
            },
            stop: function( event, ui ) {
                $(".melis-dragdropzone").removeClass("highlight");
                melisPluginEdition.pluginDetector();
            }
        });
        $(".melis-dragdropzone").sortable({
            connectWith: ".melis-float-plugins, .melis-dragdropzone",
            connectToSortable: ".melis-float-plugins",
            handle: ".m-move-handle",
            cursor: "move",
            cursorAt: { top: 0, left: 0 },
            zIndex: 999999,
            placeholder: "ui-state-highlight",
            tolerance: "pointer",
            items: ".melis-ui-outlined",
            start: function(event, ui) {
                $(".melis-dragdropzone").sortable("refresh");
                // hide tinyMCE panel
                $(".mce-tinymce.mce-panel.mce-floatpanel").hide();
                // highlight dragdropzone
                $(".melis-dragdropzone").addClass("highlight");
                $(".ui-sortable-helper").css("z-index", "9999999");
                // get item percentage width
                var placeholderWidth = ( 100 * parseFloat($(ui.helper[0]).css("width")) / parseFloat($(ui.helper[0]).parent().css('width')) ) + '%';
                    $(ui.placeholder[0]).css("width", placeholderWidth);
                // change its css to fit for theme design specific for the melismenitemplate
                var ddn = $(ui.helper[0]).attr("data-module-name");
                    if ( ddn == "MelisMiniTemplate" ) {
                        $(ui.helper[0]).css({
                            "height" : "auto",
                            "padding-left" : "10px",
                            "padding-right" : "10px"
                        });
                    }
                // detect if browser is in desktop
                if( $(window).width() >= 768) {
                    $(window).mousemove(function (e) {
                        var top;
                        var frameTop = window.parent.$("#" + parent.activeTabId).find(".melis-iframe").offset().top + 10;
                        if (window.parent.$(".sticky-pageactions")) {
                            top = $(window.parent).scrollTop() - 130;
                        } else {
                            top = 0;
                        }
                        // check if there is a plugin being drag
                        if ($('.ui-sortable-helper') && $('.ui-sortable-helper').length > 0) {
                            var bottom = $(window.parent).height();
                            // hide plugin panel when dragging a plugin
                            if ($(".melis-cms-dnd-box").hasClass("show")) {
                                $(".melis-cms-dnd-box").removeClass("show");
                            }
                            if (e.clientY >= ($(window.parent).scrollTop() + $(window.parent).height() - frameTop)) {
                                // detect IE8 and above, and edge
                                if (document.documentMode || /Edge/.test(navigator.userAgent)) {
                                    // activate scrollTop on IE
                                    window.parent.$('html').css({'overflow': 'auto', 'height': 'auto'});
                                }
                                window.parent.$('html, body').animate({
                                    scrollTop: $(window.parent).scrollTop() + ($(window.parent).height() / 2)
                                }, 300);
                            }
                            else if (e.clientY <= top && $(window.parent).scrollTop() > 0) {
                                // detect IE8 and above, and edge
                                if (document.documentMode || /Edge/.test(navigator.userAgent)) {
                                    // activate scrollTop on IE
                                    window.parent.$('html').css({'overflow': 'auto', 'height': 'auto'});
                                }
                                window.parent.$('html, body').animate({
                                    scrollTop: $(window.parent).scrollTop() - ($(window.parent).height() / 2)
                                }, 300);
                            } else {
                                window.parent.$('html, body').stop();
                            }
                        } else {
                            // detect IE8 and above, and edge
                            if (document.documentMode || /Edge/.test(navigator.userAgent)) {
                                // activate scrollTop on IE
                                window.parent.$('html').css({'overflow': 'hidden', 'height': '100%'});
                            }
                        }
                    });
                } else {
                    $(".melis-cms-dnd-box").removeClass("show");
                }
            },
            receive: function( event, ui ) {
                var tabId;
                // check if ui is from pluginMenu
                if(ui.helper && $(ui.helper).hasClass('melis-cms-plugin-snippets')) {
                    // modal confirmation
                    window.parent.melisCoreTool.confirm(
                        translations.tr_meliscms_common_yes,
                        translations.tr_meliscms_common_no,
                        translations.tr_meliscms_drag_and_drop_modal_title, // title
                        translations.tr_meliscms_drag_and_drop_modal_content, // message
                        function() {
                            var moduleName = $(ui.helper[0]).data("module-name");
                            var pluginName = $(ui.helper[0]).data("plugin-name");
                            var siteModule = $(ui.helper[0]).data("plugin-site-module");
                            // get id of current dragzone
                            var dropzone = $(event.target).data("dragdropzone-id");
                            tabId = window.parent.$("#"+parent.activeTabId).find(".melis-iframe").data("iframe-id");
                            var dataKeysfromdragdropzone = $(ui.helper[0]).data("melis-fromdragdropzone");
                            var dropLocation = ui.helper[0];
                            // remove Clone
                            // ui.helper[0].remove();
                            setTimeout(function() {
                                if(moduleName !== undefined) {
                                    requestPlugin(moduleName, pluginName, dropzone, tabId, dropLocation, siteModule);
                                }
                            }, 300);
                        });
                    // bind on bootstrap hidden modal event
                    window.parent.$('body').on('hidden.bs.modal', window.parent.$('.modal.bootstrap-dialog.in'), function (e) {
                        // check if loader exists
                        if( !$(ui.helper[0]).parent().find('.overlay-loader').length ) {
                            // remove clone element
                            ui.helper[0].remove();
                        }
                    });
                }
                if(ui.sender[0]) {
                    var dragZoneSender = ui.sender[0];
                    var dragZoneSenderPluginId = $(dragZoneSender).data("plugin-id");
                    // send dragndrop list
                    melisPluginEdition.sendDragnDropList(dragZoneSenderPluginId, tabId)
                }
            },
            update: function( event, ui ) {
                $(".ui-sortable-helper").remove();
            },
            over: function( event, ui) {
                setPluginWidth(ui);
                melisPluginEdition.pluginDetector();
            },
            change: function( event, ui ) {
                setPluginWidth(ui);
            },
        });
        // set plugin container width by placeholder
        function setPluginWidth(ui) {
            var data = $(ui.item[0]).data();
                if ( data.pluginName == "MelisFrontBlockSectionPlugin" ) {
                    $(ui.placeholder[0]).css("width", "100%");
                }
            var prevSibling = $(".ui-sortable-placeholder.ui-state-highlight").prev();
                if ( $(".melis-dragdropzone .melis-ui-outlined").length == 0 ) {
                    $(ui.placeholder[0]).css("width", "100%");
                }
                if ( $(prevSibling).hasClass("melis-cms-plugin-snippets") ) {
                    prevSibling = $(prevSibling).prev();
                }
            var prevSiblingWidth = ( 100 * parseFloat($(prevSibling).css("width")) / parseFloat($(prevSibling).parent().css('width')) );
            var availableSpace;
                if ( $(ui.item[0]).hasClass("melis-cms-plugin-snippets") && prevSiblingWidth > 90 ) {
                    $(ui.placeholder[0]).css("width", "100%");
                }
                if ( $(ui.item[0]).hasClass("melis-cms-plugin-snippets") && prevSiblingWidth < 90 && data.pluginName != "MelisFrontBlockSectionPlugin" ) {
                    availableSpace = 100 - prevSiblingWidth - 2 ;
                    $(ui.placeholder[0]).css("width", availableSpace + "%");
                }
                placeholderWidth = $(ui.placeholder[0]);
        }
        // jQuery Tooltip @ https://jqueryui.com/tooltip/#custom-style
        $(".melis-cms-plugin-snippets").tooltip({
            position: {
                my: "left center",
                at: "left+115% center",
                using: function( position, feedback ) {
                    var $this = $(this);
                        $this.css( position );
                        $this
                            .addClass( "melis-plugin-tooltip" )
                            .addClass( feedback.vertical )
                            .addClass( feedback.horizontal )
                            .appendTo( this );
                }
            },
        });
        $(".melis-cms-plugin-snippets").hover(function() {
            var $this = $(this);
                $this.children(".melis-plugin-tooltip").fadeIn();
        });
        $body.on('click', ".melis-cms-filter-btn-sub-category", function(){
            var elem        = $(this),
                next        = elem.next(),
                textVal     = elem.text(),
                activeMenu  = elem.parent().find('.active');
                if ( activeMenu.length > 0 ) {
                    activeMenu.next().slideUp();
                    activeMenu.removeClass('active');
                    //activeMenu.find('.melis-plugins-icon-new-sub-child').removeClass('reverse-color');
                    if ( activeMenu.text() !== textVal ) {
                        next.slideDown();
                        elem.addClass('active');
                        //elem.find('.melis-plugins-icon-new-sub-child').addClass('reverse-color');
                    }
                } else {
                    // show menu
                    if ( elem.hasClass('active') ) {
                        next.slideUp();
                        elem.removeClass('active');
                        //elem.find('.melis-plugins-icon-new-sub-child').removeClass('reverse-color');
                    } else {
                        elem.addClass('active');
                        //elem.find('.melis-plugins-icon-new-sub-child').addClass('reverse-color');
                        next.slideDown();
                    }
                }
        });
        $body.on('click', ".melis-cms-filter-btn-mini-tpl-category", function() {
            var elem        = $(this),
                next        = elem.next(),
                textVal     = elem.text(),
                activeMenu  = elem.parent().find('.melis-cms-filter-btn-mini-tpl-category.active');
            if (activeMenu.length > 0) {
                activeMenu.next().slideUp();
                activeMenu.removeClass('active');
                //activeMenu.find('.melis-plugins-icon-new-sub-child').removeClass('reverse-color');
                if (activeMenu.text() !== textVal) {
                    next.slideDown();
                    elem.addClass('active');
                    //elem.find('.melis-plugins-icon-new-sub-child').addClass('reverse-color');
                }
            } else {
                // show menu
                if (elem.hasClass('active')) {
                    next.slideUp();
                    elem.removeClass('active');
                    //elem.find('.melis-plugins-icon-new-sub-child').removeClass('reverse-color');
                } else {
                    elem.addClass('active');
                    //elem.find('.melis-plugins-icon-new-sub-child').addClass('reverse-color');
                    next.slideDown();
                }
            }
        });
        // $( ".melis-editable" ).resizable({ disabled: true, handles: 'e' });
        function requestPlugin(module, plugin, dropzone, pageId, dropLocation, siteModule) {
            // locate plugin location
            var layout = $('div[data-dragdropzone-id='+ dropzone +']');
            // add the temp loader
            var tempLoader = '<div id="loader" class="overlay-loader"><img class="loader-icon spinning-cog" src="/MelisCore/assets/images/cog12.svg" data-cog="cog12"></div>';
                $(layout).addClass("melis-loader").prepend(tempLoader);
                $.ajax({
                    type: 'GET',
                    url: "/melispluginrenderer?module="+module+"&pluginName="+plugin+"&pageId="+pageId+"&fromDragDropZone=1&melisSite="+siteModule
                }).done(function(plugins) {
                    var loadedPlug  = false,
                        $link       = $("link"),
                        $script     = $("script"),
                        el,
                        elAttribute;
                        // hide the loader
                        $('.loader-icon').removeClass('spinning-cog').addClass('shrinking-cog');
                        if ( plugins.success ) {
                            var elType,
                                dataPluginID,
                                idPlugin,
                                jsUrl;
                            // iterate object
                            plugin = plugins.datas;
                            // get the html
                            var vhtml                       = plugin.html,
                                melisIdPage                 = window.parent.$("#"+ parent.activeTabId).find('iframe').data('iframe-id'),
                                pluginToolBox               = $(vhtml).find(".melis-plugin-tools-box"),
                                pluginData                  = pluginToolBox.data(),
                                pluginHardCodedConfigEl     = $(vhtml).find(".plugin-hardcoded-conf");
                            // extract the data keys
                            var melisPluginModuleName       = typeof pluginToolBox.data("module") != "undefined" ? pluginToolBox.data("module") : '',
                                melisPluginName             = typeof pluginToolBox.data("plugin") != "undefined" ? pluginToolBox.data("plugin") : '',
                                melisPluginID               = typeof pluginToolBox.data("plugin-id") != "undefined" ? pluginToolBox.data("plugin-id") : '',
                                melisPluginTag              = typeof pluginToolBox.data("melis-tag") != "undefined" ? pluginToolBox.data("melis-tag") : '',
                                melisSiteModule             = typeof pluginToolBox.data("site-module"),
                                melisPluginHardCodedConfig  = $.trim(pluginHardCodedConfigEl.text());
                            // dataPluginID = pluginToolBox.next().attr("id");
                            var pluginOutlined = pluginToolBox.closest(".melis-ui-outlined");
                                dataPluginID = pluginOutlined.find("[id*='"+melisPluginID+"']").attr("id");
                                if ( typeof dataPluginID !== "undefined" ) {
                                    // get plugin id
                                    idPlugin = dataPluginID;
                                }
                                // create array of objects
                                var datastring          = [],
                                    uiPlaceHolderWidth  = placeholderWidth.css('width');
                                // re set the plugin width
                                setTimeout(function() {
                                    var pluginId = "#" + $(plugin.html).attr('id');
                                    $(pluginId).removeClass(function(index, css) {
                                        return (css.match (/\bplugin-width\S+/g) || []).join(' '); // removes anything that starts with "plugin-width-"
                                    });
                                    var pluginClass = "." + $(pluginId).attr("class");
                                    uiPlaceHolderWidth = uiPlaceHolderWidth.slice(0, -1);
                                    var strPlaceholderWidth = parseFloat(uiPlaceHolderWidth).toFixed(2);
                                    // check if dragndrop mobile, tablet, desktop
                                    // check if resize in mobile
                                    if(currentFrame.width() <= 480) {
                                        $(pluginId).addClass(" plugin-width-md-100-00 plugin-width-lg-100-00 plugin-width-xs-100-00"); //uiPlaceHolderWidth
                                    }
                                    // check if resize in tablet
                                    if(currentFrame.width() > 490 && currentFrame.width() <= 980) {
                                        $(pluginId).addClass(" plugin-width-xs-100-00 plugin-width-lg-100-00 plugin-width-md-100-00"); //uiPlaceHolderWidth
                                    }
                                    // check if resize in desktop
                                    if(currentFrame.width() >= 981) {
                                        $(pluginId).addClass(" plugin-width-xs-100-00 plugin-width-md-100-00 plugin-width-lg-100-00"); //uiPlaceHolderWidth
                                    }
                                }, 100);
                                if ( melisPluginModuleName && melisPluginName && melisPluginID && melisPluginHardCodedConfig != "" ) {
                                    datastring.push({name: "melisIdPage", value: melisIdPage});
                                    datastring.push({name: "melisModule", value: melisPluginModuleName});
                                    datastring.push({name: "melisPluginName", value: melisPluginName});
                                    datastring.push({name: "melisPluginId", value: melisPluginID});
                                    datastring.push({name: "melisPluginTag", value: melisPluginTag});
                                    datastring.push({name: "melisPluginMobileWidth", value: 100 });
                                    datastring.push({name: "melisPluginTabletWidth", value: 100 });
                                    datastring.push({name: "melisPluginDesktopWidth", value: 100});
                                    // pass it in savePluginUpdate
                                    melisPluginEdition.savePluginUpdate(datastring, siteModule);
                                }
                                // adding plugin in dropzone
                                // $('div[data-dragdropzone-id='+ dropzone +']').append(plugin.html);
                                var dropPlugin = $(plugin.html).insertAfter(dropLocation);
                                    // Processing the plugin resources and initialization
                                    melisPluginEdition.processPluginResources(plugin.init, idPlugin);
                                    // Init Resizable
                                    if ( parent.pluginResizable == 1 ) {
                                        melisPluginEdition.initResizable();
                                    }
                                    // remove plugin
                                    $(dropLocation).remove();
                                    // send new plugin list
                                    melisPluginEdition.sendDragnDropList(dropzone, pageId);
                                    $(layout).removeClass("melis-loader");
                                    $("#loader").remove();
                                    melisPluginEdition.calcFrameHeight();
                                    melisPluginEdition.disableLinks('a');
                                    melisPluginEdition.pluginDetector();
                                    melisPluginEdition.moveResponsiveClass(); // disable for now
                        }
                }).fail(function(xhr, textStatus, errorThrown) {
                    alert( translations.tr_meliscore_error_message );
                });
        }
        function showPluginMenu() {
            $(this).parent().toggleClass("show");
        }
        function showPlugLists() {
            var $this = $(this);
                if ( $this.hasClass("active") ) {
                    $this.siblings('.melis-cms-plugin-snippets-box').find(".melis-cms-category-btn.active");
                    // $(this).find('.melis-plugins-icon-new-parent').removeClass('reverse-color');
                    $this.removeClass("active").siblings(".melis-cms-plugin-snippets-box").slideUp();
                    $this.siblings(".melis-cms-plugin-snippets-box").find(".melis-cms-category-btn.active").removeClass("active").siblings(".melis-cms-category-plugins-box").slideUp();
                } else {
                    //$(".melis-cms-filter-btn.active").find('.melis-plugins-icon-new-parent').removeClass('reverse-color');
                    $(".melis-cms-filter-btn.active").removeClass("active").siblings(".melis-cms-plugin-snippets-box").slideUp();
                    $this.addClass("active");
                    //$(this).find('.melis-plugins-icon-new-parent').addClass('reverse-color');
                    $(".melis-cms-filter-btn.active").siblings(".melis-cms-plugin-snippets-box").slideDown();
                }
        }
        function showCatPlugLists() {
            var $this = $(this);
                if ( $this.hasClass("active") ) {
                    $this.removeClass("active").siblings(".melis-cms-category-plugins-box").slideUp();
                    //$(this).find('.melis-plugins-icon-new-child').removeClass('reverse-color');
                } else {
                    //$(".melis-cms-category-btn.active").find('.melis-plugins-icon-new-child').removeClass('reverse-color');
                    $(".melis-cms-category-btn.active").removeClass("active").siblings(".melis-cms-category-plugins-box").slideUp();
                    $this.addClass("active");
                    //$(this).find('.melis-plugins-icon-new-child').addClass('reverse-color');
                    $(".melis-cms-category-btn.active").siblings(".melis-cms-category-plugins-box").slideDown();
                }
        }
        function pluginScrollPos() {
            // if( $(currentFrame).length ) {
                var dndHeight       = $(window.parent).height() - currentFrame.offset().top - 5,
                    stickyHead      = window.parent.$("#"+melisActivePageId+"_id_meliscms_page").find(".bg-white.innerAll"),
                    widgetHeight    = window.parent.$("#"+melisActivePageId+"_id_meliscms_page").find(".widget-head.nav");
                    $(".melis-cms-dnd-box").css("height", "100vh" ); // default height
                    // Chrome, Firefox etc browser
                    $(window.parent).scroll(function() {
                        if( (stickyHead.offset().top + stickyHead.height() + 30) >= currentFrame.offset().top ) {
                            $(".melis-cms-dnd-box").css("top", stickyHead.offset().top - currentFrame.offset().top + stickyHead.height() + 30);
                            dndHeight = $(window.parent).height() - stickyHead.height() - widgetHeight.height() - 15;
                            //console.log("dndHeight: ", dndHeight);
                            $(".melis-cms-dnd-box").height(dndHeight);
                        } else {
                            if( $(window).width() <= 767){
                                var mobileHeader =(mobileHeader !== 'undefined') ? window.parent.$('body').find("#id_meliscore_header") : '';
                                if( $(mobileHeader).length ) {
                                    $(".melis-cms-dnd-box").css("height", "100vh" );
                                    var topPosition = window.parent.$('body').find("#id_meliscore_header").offset().top - currentFrame.offset().top + window.parent.$('body').find("#id_meliscore_header").height() ;
                                    if(topPosition > 0) {
                                        $(".melis-cms-dnd-box").css("top", topPosition );
                                        $(".melis-cms-dnd-box").height($(window.parent).height() - window.parent.$('body').find("#id_meliscore_header").height() - 5);
                                    }
                                }
                            } else {
                                dndHeight = $(window.parent).height() - currentFrame.offset().top - 5;
                                $(".melis-cms-dnd-box").css("top", 0);
                                $(".melis-cms-dnd-box").height(dndHeight);
                            }
                        }
                    });
                    // For IE scroll giving different value
                    if (window.parent) {
                        window.parent.$("body").scroll(function() {
                            if( (stickyHead.offset().top + stickyHead.height() + 30) >= currentFrame.offset().top ) {
                                $(".melis-cms-dnd-box").css("top", stickyHead.offset().top - currentFrame.offset().top + stickyHead.height() + 30);
                            } else {
                                $(".melis-cms-dnd-box").css({"top": 0, "height": $(window.parent).height() - stickyHead.height() - widgetHeight.height() - 15});
                            }
                        });
                    }
                    $(".melis-cms-dnd-box").height(dndHeight);
        }
        if( $(currentFrame).length ) {
            pluginScrollPos();
        }
        return {
            requestPlugin           :       requestPlugin,
            showPluginMenu          :       showPluginMenu,
            pluginScrollPos         :       pluginScrollPos,
        }
})(jQuery, window); 
  |