PageSourceSearch

https://brainagency.ai/wp-content/plugins/orbius-core/elements/js/min/mk-widgets.min.js?ver=1.0.7

js brainagency.ai collected 2026-10-05 14:52:28 UTC 159,523 bytes, 3,446 lines download raw bytes

1(function ($) {
2
3    'use strict';
4
5    window.mkAddons       = {};
6    mkAddons.body         = $( 'body' );
7    mkAddons.html         = $( 'html' );
8    mkAddons.windowWidth  = $( window ).width();
9    mkAddons.windowHeight = $( window ).height();
10    mkAddons.scroll       = 0;
11    mkAddons.window       = $( window );
12    mkAddons.widgetsList   = {};
13
14    $( document ).ready( function () {
15        mkAddons.scroll = $( window ).scrollTop();
16        mkCustomCursor.init();
17        mkEyeCursor.init();
18        mkScrollLoad.init();
19    });
20
21    $( window ).resize(function () {
22        mkAddons.windowWidth  = $( window ).width();
23        mkAddons.windowHeight = $( window ).height();
24    });
25
26    $( window ).scroll( function () {
27        mkAddons.scroll = $( window ).scrollTop();
28    });
29
30    $( window ).on('load', function () {
31        mkScrollLoad.init();
32    });
33
34    var getElementSettings = function ( $element ) {
35        var elementSettings = {},
36            modelCID        = $element.data( 'model-cid' );
37
38        if ( elementorFrontend.isEditMode() && modelCID ) {
39            var settings     = elementorFrontend.config.elements.data[ modelCID ],
40                settingsKeys = elementorFrontend.config.elements.keys[ settings.attributes.widgetType || settings.attributes.elType ];
41
42            jQuery.each( settings.getActiveControls(), function( controlKey ) {
43                if ( -1 !== settingsKeys.indexOf( controlKey ) ) {
44                    elementSettings[ controlKey ] = settings.attributes[ controlKey ];
45                }
46            } );
47        } else {
48            elementSettings = $element.data('settings') || {};
49        }
50
51        return elementSettings;
52    }
53
54    function mkCursorSelectors($cursorHolder, dragSelectors) {
55        const resetCursorSelectors =
56                                '.mk--drag-cursor .swiper-button-prev,' +
57                                '.mk--drag-cursor .swiper-button-next,' +
58                                '.mk--drag-cursor .mk-slider-pn,' +
59                                '.mk--drag-cursor a:not(.mk-pf-slider-image-link),' +
60                                '.mk--drag-cursor .swiper-pagination',
61        $resetCursorSelectors = $(resetCursorSelectors);
62
63        $resetCursorSelectors.css({cursor: 'pointer'});
64
65        $(document).on('mouseenter', resetCursorSelectors, function () {
66            $cursorHolder.addClass('mk--hide');
67        }).on('mouseleave', resetCursorSelectors, function () {
68            $cursorHolder.removeClass('mk--hide');
69        });
70
71        $(document).on('mouseenter', dragSelectors, function () {
72            $cursorHolder.addClass('mk--show');
73        }).on('mouseleave', dragSelectors, function () {
74            $cursorHolder.removeClass('mk--show');
75        });
76    }
77
78    var mkCustomCursor = {
79        cursorApended: false,
80        init : function () {
81            const dragSelectors = '.mk--drag-cursor';
82            const $dragSelectors = $(dragSelectors);
83
84            if ($dragSelectors.length) {
85
86                $dragSelectors.each( function () {
87
88                    if (false === mkCustomCursor.cursorApended) {
89                        mkAddons.body.append('<div class="mk-custom-cursor mk-cursor-holder"><div class="mk-custom-cursor-inner"><svg enable-background="new 0 0 256 512" viewBox="0 0 256 512" xmlns="http://www.w3.org/2000/svg"><path d="m52.1 245.3 144-160c5.9-6.6 16-7.1 22.6-1.2 6.9 6.3 6.8 16.4 1.2 22.6l-134.4 149.3 134.4 149.3c5.9 6.6 5.4 16.7-1.2 22.6s-16.7 5.4-22.6-1.2l-144-160c-5.5-6.1-5.5-15.3 0-21.4z"/></svg><svg viewBox="0 0 256 512" xmlns="http://www.w3.org/2000/svg"><path d="m219.898 266.719-144.01 159.99c-5.906 6.562-16.031 7.094-22.593 1.187-6.918-6.271-6.784-16.394-1.188-22.625l134.367-149.271-134.367-149.271c-5.877-6.594-5.361-16.688 1.188-22.625 6.562-5.907 16.687-5.375 22.593 1.187l144.01 159.99c5.469 6.125 5.469 15.313 0 21.438z"/></svg></div></div>');
90                        mkCustomCursor.cursorApended = true;
91                    }
92
93                    const $cursorHolder = $('.mk-custom-cursor');
94
95                    if ( $(this).hasClass('mk--drag-cursor-light-skin') ) {
96                        $cursorHolder.addClass('mk-skin--light');
97                    }
98
99                    if (!mkAddons.html.hasClass('touchevents')) {
100
101                        function handleMoveCursor(event) {
102                            $cursorHolder.css({
103                                top : event.clientY - 45, // half of svg height
104                                left: event.clientX - 45, // half of svg width
105                            });
106                        }
107
108                        document.addEventListener('pointermove', handleMoveCursor);
109
110                        mkCursorSelectors($cursorHolder, dragSelectors);
111
112                    }
113
114                }); // for each
115
116            } // end if
117        },
118    };
119
120    mkAddons.body.mkCustomCursor = mkCustomCursor;
121
122    // cursor with eye icon
123    var mkEyeCursor = {
124        cursorApended: false,
125        init : function () {
126            const dragSelectors = '.mk--eye-cursor';
127            const $dragSelectors = $(dragSelectors);
128
129            if ($dragSelectors.length) {
130
131                $dragSelectors.each( function () {
132
133                    if (false === mkEyeCursor.cursorApended) {
134                        mkAddons.body.append( '<div class="mk-eye-cursor"><div class="mk-eye-cursor-inner"><span class="mk-eye-cursor-bg"></span><span class="mk-eye-cursor-icon"><svg height="512" viewBox="0 0 128 128" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m64 29.63c-34.76 0-62.36 31.72-63.52 33.07a2 2 0 0 0 0 2.6c1.16 1.35 28.76 33.07 63.52 33.07s62.36-31.72 63.52-33.07a2 2 0 0 0 0-2.6c-1.16-1.35-28.76-33.07-63.52-33.07zm0 64.74c-29 0-53.7-24.37-59.3-30.37 5.6-6 30.24-30.37 59.3-30.37s53.7 24.37 59.3 30.37c-5.6 6-30.24 30.37-59.3 30.37z"/><path d="m64 38.19a25.81 25.81 0 1 0 25.81 25.81 25.84 25.84 0 0 0 -25.81-25.81zm0 47.63a21.81 21.81 0 1 1 21.81-21.82 21.84 21.84 0 0 1 -21.81 21.81z"/></svg></span></div></div>' );
135                        mkEyeCursor.cursorApended = true;
136                    }
137
138                    const $cursorHolder = $('.mk-eye-cursor');
139
140                    if ( $(this).hasClass('mk--drag-cursor-light-skin') ) {
141                        $cursorHolder.addClass('mk-skin--light');
142                    }
143
144                    if (!mkAddons.html.hasClass('touchevents')) {
145
146                        let $bg = $cursorHolder.find('.mk-eye-cursor-bg'),
147                            $eye = $cursorHolder.find('.mk-eye-cursor-icon'),
148                            xMove = 0,
149                            yMove = 0;
150
151                        function handleMoveCursorOne( event ) {
152                            xMove = (event.clientX - 60).toFixed(2);
153                            yMove = (event.clientY - 60).toFixed(2);
154
155                            gsap.to( $bg, {x: xMove, y: yMove, duration: .39, }, );
156                            gsap.to( $eye, {x: xMove, y: yMove, duration: .45, }, );
157
158                            !$cursorHolder.hasClass( 'mk--show' ) && $cursorHolder.addClass( 'mk--show' );
159                        }
160
161                        $( document ).on('pointermove', dragSelectors, handleMoveCursorOne );
162
163                        mkCursorSelectors($cursorHolder, dragSelectors);
164
165                    }
166
167                }); // for each
168
169            } // end if
170        },
171    };
172
173    mkAddons.body.mkEyeCursor = mkEyeCursor;
174
175    // on scroll loading animation class
176    var mkScrollLoad = {
177        init: function () {
178            this.holder = $( '.mk-scroll--load:not(.mk--loaded)' );
179
180            if ( this.holder.length ) {
181                this.holder.each( function () {
182                    var holder    = $( this ),
183                        loadDelay = $( this ).attr( 'data-appear-delay' );
184
185                    if ( ! loadDelay ) {
186                        mkScrollLoad.viewPortStatus( holder, function () {
187                            holder.addClass( 'mk--loaded' );
188                        });
189                    } else {
190                        loadDelay = (loadDelay === 'random') ? Math.floor( Math.random() * (450 - 10) + 10 ) 
190: loadDelay;
191                        mkScrollLoad.viewPortStatus( holder, function () {
192                            setTimeout( function () { holder.addClass( 'mk--loaded' ); }, loadDelay );
193                        });
194                    }
195                });
196            }
197        },
198        viewPortStatus: function($item, callback, onlyOnce) {
199            if ( $item.length ) {
200                var offset   = typeof $item.data( 'viewport-offset' ) !== 'undefined' ? $item.data( 'viewport-offset' ) : 0.15;
201                var observer = new IntersectionObserver(
202                    function ( entries ) {
203                        if ( entries[0].isIntersecting === true ) {
204                            callback.call( $item );
205                            if ( onlyOnce !== false ) { observer.disconnect(); }
206                        }
207                    },
208                    { threshold: [offset] }
209                );
210                observer.observe( $item[0] );
211            }
212        },
213    };
214
215    // Get saved content for panel or popup or store it (if first open occured)
216    window.mk_prepare_popup_offcanvas_content = function(container, autoplay) {
217        var wrapper = jQuery(container);
218        // Store popup content to the data-param or restore it when popup open again (second time)
219        // if popup contains audio or video or iframe
220        if (wrapper.data('popup-content') === undefined) {
221            var iframe = wrapper.find('iframe');
222            if ( wrapper.find('audio').length
223                || wrapper.find('video').length
224                || ( iframe.length
225                    && ( ( iframe.data('src') && iframe.data('src').search(/(youtu|vimeo|daily|facebook)/i) > 0 )
226                        || iframe.attr('src').search(/(youtu|vimeo|daily|facebook)/i) > 0
227                        )
228                    )
229            ) {
230                wrapper.data( 'popup-content', wrapper.html() );
231            }
232        } else {
233            wrapper.html( wrapper.data('popup-content') );
234            // Remove class 'inited' to reinit elements
235            wrapper.find('.inited').removeClass('inited');
236        }
237        // Replace src with data-src
238        wrapper.find('[data-src]').each(function() {
239            jQuery(this).attr( 'src', jQuery(this).data('src') );
240        });
241
242        // If popup contain essential grid
243        var frame = wrapper.find('.esg-grid');
244        if ( frame.length > 0 ) {
245            var wrappers = [".esg-tc.eec", ".esg-lc.eec", ".esg-rc.eec", ".esg-cc.eec", ".esg-bc.eec"];
246            for (var i = 0; i < wrappers.length; i++) {
247                frame.find(wrappers[i]+'>'+wrappers[i]).unwrap();
248            }
249        }
250        // Call resize actions for the new content
251        mkAddons.window.trigger('resize');
252    };
253
254    // Wait element images to loaded
255    var mkWaitForImages = {
256        check: function ( $element, callback ) {
257            if ( $element.length ) {
258                var images = $element.find( 'img' );
259
260                if ( images.length ) {
261                    var counter = 0;
262
263                    for ( var index = 0; index < images.length; index++ ) {
264                        var img = images[index];
265
266                        if ( img.complete ) {
267                            counter++;
268                            if ( counter === images.length ) { callback.call( $element ); }
269                        } else {
270                            var image = new Image();
271
272                            image.addEventListener( 'load', function () {
273                                counter++;
274                                if ( counter === images.length ) {
275                                    callback.call( $element );
276                                    return false;
277                                }
278                            }, false );
279                            image.src = img.src;
280                        }
281                    }
282                } else {
283                    callback.call( $element );
284                }
285            }
286        },
287    };
288
289    // Parallax Scrolll Item
290    var mkItemParallaxEffect = {
291
292        init: function () {
293
294            if ( !$('.mk-parallax-scroll-item-on').length ) { return; }
295
296            var items = $('.mk-parallax-scroll-item-on .mk-parallax-item:nth-child(2n)'), // even
297                dirY = 25,
298                itemsOdd = $('.mk-parallax-scroll-item-on .mk-parallax-item:nth-child(2n+1)'), // odd
299                dirYOdd = 14;
300
301            var ease = function (a, b, n) {
302                return (1 - n) * a + n * b;
303            }
304
305            var inView = function (item) {
306                if (window.scrollY + window.innerHeight > item.offset().top &&
307                    window.scrollY < item.offset().top + item.outerHeight()) {
308                    return true
309                }
310                return false;
311            }
312
313            var itemsInView = function (items) {
314                return items.filter(function () {
315                    return inView($(this))
316                });
317            }
318
319            var move = function (items, dirY) {
320                items.each(function () {
321                    var item = $(this);
322                    item.data('y', 0);
323                    item.data('c', Math.random());
324                });
325
326                function loop() {
327
328                    itemsInView(items).each(function () {
329                        var item = $(this);
330                        var deltaY = (item.offset().top - window.scrollY) / window.innerHeight - 1;
331
332                        item.data('y', ease(item.data('y'), deltaY, item.data('c') * .1));
333                        item.css({
334                            'transform': 'translate3d(0,' + (dirY * item.data('y')).toFixed(2) + '%,0)',
335                        });
336                    });
337                    requestAnimationFrame(loop);
338                }
339
340                requestAnimationFrame(loop);
341            }
342
343            if (itemsOdd.length && !Modernizr.touch && mkAddons.windowWidth>=1024) move(itemsOdd, dirYOdd);
344            if (items.length && !Modernizr.touch && mkAddons.windowWidth>=1024) move(items, dirY);
345        }
346    };
347
348    $( document ).ready( function () {
349        mkItemParallaxEffect.init();
350    });
351
352
353    // ###########################################################
354    // Custom Widgets ############################################
355    // ###########################################################
356
357    var mkScrollLoadAnim = function ($scope, $) {
358        mkScrollLoad.init();
359    }
360
361    mkAddons.widgetsList.mk_title = {};
362    mkAddons.widgetsList.mk_title.mkScrollLoadAnim = mkScrollLoadAnim;
363
364    mkAddons.widgetsList.mk_section_heading = {};
365    mkAddons.widgetsList.mk_section_heading.mkScrollLoadAnim = mkScrollLoadAnim;
366
367    mkAddons.widgetsList.mk_page_titlebar = {};
368    mkAddons.widgetsList.mk_page_titlebar.mkScrollLoadAnim = mkScrollLoadAnim;
369
370    mkAddons.widgetsList.mk_dual_slider = {};
371    mkAddons.widgetsList.mk_dual_slider.mkScrollLoadAnim = mkScrollLoadAnim;
372
373
374    // ----------------------------------------------------------
375
376    var mkAccordion = function ($scope, $) {
377        var elementSettings     = getElementSettings( $scope ),
378            $accordion_title    = $scope.find(".mk-accordion-tab-title"),
379            $accordion_type     = elementSettings.accordion_type,
380            $accordion_speed    = elementSettings.toggle_speed;
381
382            // Open default actived tab
383            $accordion_title.each(function(){
384                if ( $(this).hasClass('mk-accordion-tab-active-default') ) {
385                    $(this).addClass('mk-accordion-tab-show mk-accordion-tab-active');
386                    $(this).parent().find('.mk-accordion-tab-content').slideDown($accordion_speed);
387                    $(this).parent().addClass('mk-accordion-item-active');
388                }
389            });
390
391            // Remove multiple click event for nested accordion
392            $accordion_title.unbind("click");
393
394            $accordion_title.click(function(e) {
395                e.preventDefault();
396
397                var $this = $(this);
398
399                if ( $accordion_type === 'accordion' ) {
400                    if ( $this.hasClass("mk-accordion-tab-show") ) {
401                        $this.removeClass("mk-accordion-tab-show mk-accordion-tab-active");
402                        $this.parent().parent().find(".mk-accordion-tab-title").removeClass("mk-accordion-tab-active-default");
403                        $this.parent().find('.mk-accordion-tab-content').slideUp($accordion_speed);
404                        $this.parent().removeClass("mk-accordion-item-active");
405                    } else {
406                        $this.parent().parent().find(".mk-accordion-tab-title").removeClass("mk-accordion-tab-show mk-accordion-tab-active");
407                        $this.parent().parent().find(".mk-accordion-tab-title").removeClass("mk-accordion-tab-active-default");
408                        $this.parent().parent().find(".mk-accordion-tab-content").slideUp($accordion_speed);
409                        $this.toggleClass("mk-accordion-tab-show mk-accordion-tab-active");
410                        $this.parent().find('.mk-accordion-tab-content').slideToggle($accordion_speed);
411                        $this.parent().parent().find(".mk-accordion-item").removeClass("mk-accordion-item-active");
412                        $this.parent().toggleClass('mk-accordion-item-active');
413                    }
414                } else {
415                    // For acccordion type 'toggle'
416                    if ( $this.hasClass("mk-accordion-tab-show") ) {
417                        $this.removeClass("mk-accordion-tab-show mk-accordion-tab-active");
418                        $this.parent().find('.mk-accordion-tab-content').slideUp($accordion_speed);
419                        $this.parent().removeClass("mk-accordion-item-active");
420                    } else {
421                        $this.addClass("mk-accordion-tab-show mk-accordion-tab-active");
422                        $this.parent().find('.mk-accordion-tab-content').slideDown($accordion_speed);
423                        $this.parent().addClass('mk-accordion-item-active');
424                    }
425                }
426            });
427    }
428
429    mkAddons.widgetsList.mk_accordion = {};
430    mkAddons.widgetsList.mk_accordion.mkAccordion = mkAccordion;
431
432    // ----------------------------------------------------------
433
434    var mkContactFormSevenStyler = function ($scope, $) {
435
436        if ( 'undefined' == typeof $scope )
437            return;
438
439        var cf7SelectFields = $scope.find('select:not([multiple])'),
440            cf7Loader = $scope.find('span.ajax-loader');
441
442        cf7SelectFields.wrap( "<span class='mk-cf7-select-custom'></span>" );
443
444        cf7Loader.wrap( "<div class='mk-cf7-loader-active'></div>" );
445
446        var wpcf7event = document.querySelector( '.wpcf7' );
447
448        if( null !== wpcf7event ) {
449            wpcf7event.addEventListener( 'wpcf7submit', function( event ) {
450                var cf7ErrorFields = $scope.find('.wpcf7-not-valid-tip');
451                cf7ErrorFields.wrap( "<span class='mk-cf7-alert'></span>" );
452            }, false );
453        }
454
455    }
456
457    mkAddons.widgetsList.mk_contact_form_styler = {};
458    mkAddons.widgetsList.mk_contact_form_styler.mkContactFormSevenStyler = mkContactFormSevenStyler;
459
460    // ----------------------------------------------------------
461
462    var mkGoogleMap = function ($scope, $) {
463
464            if ( 'undefined' == typeof $scope )
465                return;
466
467            var selector                = $scope.find( '.mk-google-map' ).eq(0),
468                locations               = selector.data( 'locations' ),
469                map_style               = ( selector.data( 'custom-style' ) != '' ) ? selector.data( 'custom-style' ) : '',
470                predefined_style        = ( selector.data( 'predefined-style' ) != '' ) ? selector.data( 'predefined-style' ) : '',
471                info_window_size        = ( selector.data( 'max-width' ) != '' ) ? selector.data( 'max-width' ) : '',
472                m_cluster               = ( selector.data( 'cluster' ) == 'yes' ) ? true : false,
473                animate                 = selector.data( 'animate' ),
474                auto_center             = selector.data( 'auto-center' ),
475                map_options             = selector.data( 'map_options' ),
476                i                       = '',
477                bounds                  = new google.maps.LatLngBounds(),
478                marker_cluster          = [],
479                device_size             = elementorFrontend.getCurrentDeviceMode();
480
481            if( 'drop' == animate ) {
482                var animation = google.maps.Animation.DROP;
483            } else if( 'bounce' == animate ) {
484                var animation = google.maps.Animation.BOUNCE;
485            }
486
487            var skins = {
488                "silver" : "[{\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#f5f5f5\"}]},{\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#616161\"}]},{\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#f5f5f5\"}]},{\"featureType\":\"administrative.land_parcel\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#bdbdbd\"}]},{\"featureType\":\"poi\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#eeeeee\"}]},{\"featureType\":\"poi\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#757575\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#e5e5e5\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#9e9e9e\"}]},{\"featureType\":\"road\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#ffffff\"}]},{\"featureType\":\"road.arterial\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#757575\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#dadada\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#616161\"}]},{\"featureType\":\"road.local\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#9e9e9e\"}]},{\"featureType\":\"transit.line\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#e5e5e5\"}]},{\"featureType\":\"transit.station\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#eeeeee\"}]},{\"featureType\":\"water\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#c9c9c9\"}]},{\"featureType\":\"water\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#9e9e9e\"}]}]",
489
490                "retro" : "[{\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#ebe3cd\"}]},{\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#523735\"}]},{\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#f5f1e6\"}]},{\"featureType\":\"administrative\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#c9b2a6\"}]},{\"featureType\":\"administrative.land_parcel\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#dcd2be\"}]},{\"featureType\":\"administrative.land_parcel\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#ae9e90\"}]},{\"featureType\":\"landscape.natural\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#dfd2ae\"}]},{\"featureType\":\"poi\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#dfd2ae\"}]},{\"featureType\":\"poi\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#93817c\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#a5b076\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#447530\"}]},{\"featureType\":\"road\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#f5f1e6\"}]},{\"featureType\":\"road.arterial\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#fdfcf8\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#f8c967\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#e9bc62\"}]},{\"featureType\":\"road.highway.controlled_access\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#e98d58\"}]},{\"featureType\":\"road.highway.controlled_access\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#db8555\"}]},{\"featureType\":\"road.local\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#806b63\"}]},{\"featureType\":\"transit.line\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#dfd2ae\"}]},{\"featureType\":\"transit.line\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#8f7d77\"}]},{\"featureType\":\"transit.line\",\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#ebe3cd\"}]},{\"featureType\":\"transit.station\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#dfd2ae\"}]},{\"featureType\":\"water\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#b9d3c2\"}]},{\"featureType\":\"water\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#92998d\"}]}]",
491
492                "dark" : "[{\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#212121\"}]},{\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#757575\"}]},{\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#212121\"}]},{\"featureType\":\"administrative\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#757575\"}]},{\"featureType\":\"administrative.country\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#9e9e9e\"}]},{\"featureType\":\"administrative.land_parcel\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"administrative.locality\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#bdbdbd\"}]},{\"featureType\":\"poi\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#757575\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#181818\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#616161\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#1b1b1b\"}]},{\"featureType\":\"road\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#2c2c2c\"}]},{\"featureType\":\"road\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#8a8a8a\"}]},{\"featureType\":\"road.arterial\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#373737\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#3c3c3c\"}]},{\"featureType\":\"road.highway.controlled_access\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#4e4e4e\"}]},{\"featureType\":\"road.local\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#616161\"}]},{\"featureType\":\"transit\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#757575\"}]},{\"featureType\":\"water\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#000000\"}]},{\"featureType\":\"water\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#3d3d3d\"}]}]",
493
494                "night" : "[{\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#242f3e\"}]},{\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#746855\"}]},{\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#242f3e\"}]},{\"featureType\":\"administrative.locality\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#d59563\"}]},{\"featureType\":\"poi\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#d59563\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#263c3f\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#6b9a76\"}]},{\"featureType\":\"road\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#38414e\"}]},{\"featureType\":\"road\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#212a37\"}]},{\"featureType\":\"road\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#9ca5b3\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#746855\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#1f2835\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#f3d19c\"}]},{\"featureType\":\"transit\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#2f3948\"}]},{\"featureType\":\"transit.station\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#d59563\"}]},{\"featureType\":\"water\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#17263c\"}]},{\"featureType\":\"water\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#515c6d\"}]},{\"featureType\":\"water\",\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#17263c\"}]}]",
495
496                "aubergine" : "[{\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#1d2
496c4d\"}]},{\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#8ec3b9\"}]},{\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#1a3646\"}]},{\"featureType\":\"administrative.country\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#4b6878\"}]},{\"featureType\":\"administrative.land_parcel\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#64779e\"}]},{\"featureType\":\"administrative.province\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#4b6878\"}]},{\"featureType\":\"landscape.man_made\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#334e87\"}]},{\"featureType\":\"landscape.natural\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#023e58\"}]},{\"featureType\":\"poi\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#283d6a\"}]},{\"featureType\":\"poi\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#6f9ba5\"}]},{\"featureType\":\"poi\",\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#1d2c4d\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#023e58\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#3C7680\"}]},{\"featureType\":\"road\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#304a7d\"}]},{\"featureType\":\"road\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#98a5be\"}]},{\"featureType\":\"road\",\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#1d2c4d\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#2c6675\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#255763\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#b0d5ce\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#023e58\"}]},{\"featureType\":\"transit\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#98a5be\"}]},{\"featureType\":\"transit\",\"elementType\":\"labels.text.stroke\",\"stylers\":[{\"color\":\"#1d2c4d\"}]},{\"featureType\":\"transit.line\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#283d6a\"}]},{\"featureType\":\"transit.station\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#3a4762\"}]},{\"featureType\":\"water\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#0e1626\"}]},{\"featureType\":\"water\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#4e6d70\"}]}]",
497
498                "magnesium" : "[{\"featureType\":\"all\",\"stylers\":[{\"saturation\":0},{\"hue\":\"#e7ecf0\"}]},{\"featureType\":\"road\",\"stylers\":[{\"saturation\":-70}]},{\"featureType\":\"transit\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"poi\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"water\",\"stylers\":[{\"visibility\":\"simplified\"},{\"saturation\":-60}]}]",
499
500                "classic_blue" : "[{\"featureType\":\"all\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"on\"}]},{\"featureType\":\"administrative.country\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"on\"}]},{\"featureType\":\"administrative.country\",\"elementType\":\"labels.text\",\"stylers\":[{\"visibility\":\"on\"}]},{\"featureType\":\"administrative.province\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"on\"}]},{\"featureType\":\"administrative.province\",\"elementType\":\"labels.text\",\"stylers\":[{\"visibility\":\"on\"}]},{\"featureType\":\"administrative.locality\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"on\"}]},{\"featureType\":\"administrative.neighborhood\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"administrative.land_parcel\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"landscape\",\"elementType\":\"all\",\"stylers\":[{\"hue\":\"#FFBB00\"},{\"saturation\":43.400000000000006},{\"lightness\":37.599999999999994},{\"gamma\":1}]},{\"featureType\":\"landscape\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"saturation\":\"-40\"},{\"lightness\":\"36\"}]},{\"featureType\":\"landscape.man_made\",\"elementType\":\"geometry\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"landscape.natural\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"saturation\":\"-77\"},{\"lightness\":\"28\"}]},{\"featureType\":\"landscape.natural\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"poi\",\"elementType\":\"all\",\"stylers\":[{\"hue\":\"#00FF6A\"}
500,{\"saturation\":-1.0989010989011234},{\"lightness\":11.200000000000017},{\"gamma\":1}]},{\"featureType\":\"poi\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"poi.attraction\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"saturation\":\"-24\"},{\"lightness\":\"61\"}]},{\"featureType\":\"road\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"on\"}]},{\"featureType\":\"road\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"visibility\":\"on\"}]},{\"featureType\":\"road\",\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"all\",\"stylers\":[{\"hue\":\"#FFC200\"},{\"saturation\":-61.8},{\"lightness\":45.599999999999994},{\"gamma\":1}]},{\"featureType\":\"road.highway\",\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"road.highway.controlled_access\",\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"road.arterial\",\"elementType\":\"all\",\"stylers\":[{\"hue\":\"#FF0300\"},{\"saturation\":-100},{\"lightness\":51.19999999999999},{\"gamma\":1}]},{\"featureType\":\"road.local\",\"elementType\":\"all\",\"stylers\":[{\"hue\":\"#ff0300\"},{\"saturation\":-100},{\"lightness\":52},{\"gamma\":1}]},{\"featureType\":\"road.local\",\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"transit\",\"elementType\":\"geometry\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"transit\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"transit\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"transit\",\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"transit.line\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"transit.station\",\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"water\",\"elementType\":\"all\",\"stylers\":[{\"hue\":\"#0078FF\"},{\"saturation\":-13.200000000000003},{\"lightness\":2.4000000000000057},{\"gamma\":1}]},{\"featureType\":\"water\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]}]",
501
502                "aqua" : "[{\"featureType\":\"administrative\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#444444\"}]},{\"featureType\":\"landscape\",\"elementType\":\"all\",\"stylers\":[{\"color\":\"#f2f2f2\"}]},{\"featureType\":\"poi\",\"elementType\":\"all\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"road\",\"elementType\":\"all\",\"stylers\":[{\"saturation\":-100},{\"lightness\":45}]},{\"featureType\":\"road.highway\",\"elementType\":\"all\",\"stylers\":[{\"visibility\":\"simplified\"}]},{\"featureType\":\"road.arterial\",\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"transit\",\"elementType\":\"all\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"water\",\"elementType\":\"all\",\"stylers\":[{\"color\":\"#46bcec\"},{\"visibility\":\"on\"}]}]",
503
504                "earth" : "[{\"featureType\":\"landscape.man_made\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#f7f1df\"}]},{\"featureType\":\"landscape.natural\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#d0e3b4\"}]},{\"featureType\":\"landscape.natural.terrain\",\"elementType\":\"geometry\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"poi\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"poi.business\",\"elementType\":\"all\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"poi.medical\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#fbd3da\"}]},{\"featureType\":\"poi.park\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#bde6ab\"}]},{\"featureType\":\"road\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"road\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#ffe15f\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#efd1
50451\"}]},{\"featureType\":\"road.arterial\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#ffffff\"}]},{\"featureType\":\"road.local\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"black\"}]},{\"featureType\":\"transit.station.airport\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#cfb2db\"}]},{\"featureType\":\"water\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#a2daf2\"}]}]"
505            };
506
507            if( 'undefined' != typeof skins[predefined_style] ) {
508                map_style = JSON.parse( skins[predefined_style] );
509            }
510
511
512            ( function initMap () {
513
514                var latlng = new google.maps.LatLng( locations[0][0], locations[0][1] );
515
516                map_options.center = latlng;
517                map_options.styles = map_style;
518
519                var map = new google.maps.Map( $scope.find( '.mk-google-map' )[0], map_options );
520                var infowindow = new google.maps.InfoWindow();
521
522                for ( i = 0; i < locations.length; i++ ) {
523
524                    var title = locations[i][3];
525                    var description = locations[i][4];
526                    var icon_size = parseInt( locations[i][7] );
527                    var icon_type = locations[i][5];
528                    var icon = '';
529                    var icon_url = locations[i][6];
530                    var enable_iw = locations[i][2];
531                    var click_open = locations[i][8];
532                    var lat = locations[i][0];
533                    var lng = locations[i][1];
534
535                    if( 'undefined' === typeof locations[i] ) {
536                        return;
537                    }
538
539                    if ( '' != lat.length && '' != lng.length ) {
540
541                        if ( 'custom' == icon_type ) {
542
543                            icon = {
544                                url: icon_url,
545                            };
546                            if( ! isNaN( icon_size ) ) {
547
548                                icon.scaledSize = new google.maps.Size( icon_size, icon_size );
549                                icon.origin = new google.maps.Point( 0, 0 );
550                                icon.anchor = new google.maps.Point( icon_size/2, icon_size );
551
552                            }
553                        }
554
555                        var marker = new google.maps.Marker( {
556                            position:       new google.maps.LatLng( lat, lng ),
557                            map:            map,
558                            title:          title,
559                            icon:           icon,
560                            animation:      animation
561                        });
562
563                        if( locations.length > 1 ) {
564
565                            // Extend the bounds to include each marker's position
566                            bounds.extend( marker.position );
567                        }
568
569                        marker_cluster[i] = marker;
570
571                        if ( enable_iw && 'iw_open' == click_open ) {
572
573                            var content_string = '<div class="mk-infowindow-content"><div class="mk-infowindow-title">' + title + '</div>';
574
575                            if ( '' != description.length ) {
576                                content_string += '<div class="mk-infowindow-description">' + description + '</div>';
577                            }
578                            content_string += '</div>';
579
580                            if ( '' != info_window_size  ) {
581                                var width_val = parseInt( info_window_size );
582                                var infowindow = new google.maps.InfoWindow( {
583                                    content: content_string,
584                                    maxWidth: width_val
585                                } );
586                            } else {
587                                var infowindow = new google.maps.InfoWindow( {
588                                    content: content_string,
589                                } );
590                            }
591
592                            infowindow.open( map, marker );
593                        }
594
595                        // Adding close event for info window
596                        google.maps.event.addListener( map, 'click', ( function ( infowindow ) {
597
598                            return function() {
599                                infowindow.close();
600                            }
601                        })( infowindow ));
602
603                        if ( enable_iw && '' != locations[i][3] ) {
604
605                            google.maps.event.addListener( marker, 'click', ( function( marker, i ) {
606                                return function() {
607                                    var infowindow = new google.maps.InfoWindow();
608                                    var content_string = '<div class="mk-infowindow-content"><div class="mk-infowindow-title">' + locations[i][3] + '</div>';
609
610                                    if ( '' != locations[i][4].length ) {
611                                        content_string += '<div class="mk-infowindow-description">' + locations[i][4] + '</div>';
612                                    }
613
614                                    content_string += '</div>';
615
616                                    infowindow.setContent( content_string );
617
618                                    if ( '' != info_window_size ) {
619                                        var width_val = parseInt( info_window_size );
620                                        var InfoWindowOptions = { maxWidth : width_val };
621                                        infowindow.setOptions( { options:InfoWindowOptions } );
622                                    }
623
624                                    infowindow.open( map, marker );
625                                }
626                            })( marker, i ));
627                        }
628                    }
629                }
630
631                if( locations.length > 1 ) {
632
633                    if ( 'center' == auto_center ) {
634
635                        // Now fit the map to the newly inclusive bounds.
636                        map.fitBounds( bounds );
637                    }
638
639                    // Restore the zoom level after the map is done scaling.
640                    var listener = google.maps.event.addListener( map, "idle", function () {
641                        map.setZoom( map_options.zoom );
642                        google.maps.event.removeListener( listener );
643                    });
644                }
645
646                var cluster_listener = google.maps.event.addListener( map, "idle", function () {
647
648                    if( 0 < marker_cluster.length && m_cluster ) {
649
650                        var markerCluster = new MarkerClusterer(
651                            map,
652                            marker_cluster,
653                            {
654                                imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'
655                            }
656                        );
657                    }
658                    google.maps.event.removeListener( cluster_listener );
659                });
660
661
662            })();
663        }
664
665    mkAddons.widgetsList.mk_google_map = {};
666    mkAddons.widgetsList.mk_google_map.mkGoogleMap = mkGoogleMap;
667
668    // ----------------------------------------------------------
669
670    var mkVideo = function ($scope, $) {
671
672        var shalPlayVideo = {
673
674            /* Auto Play Video */
675            _play: function( selector ) {
676
677                var iframe      = $( "<iframe/>" );
678                var vurl        = selector.data( 'src' );
679
680                if ( 0 == selector.find( 'iframe' ).length ) {
681
682                    iframe.attr( 'src', vurl );
683                    iframe.attr( 'frameborder', '0' );
684                    iframe.attr( 'allowfullscreen', '1' );
685                    iframe.attr( 'allow', 'autoplay;encrypted-media;' );
686
687                    selector.html( iframe );
688                }
689
690                selector.closest( '.mk-video-container' ).find( '.mk-video-vimeo-wrap' ).hide();
691            }
692        }
693
694        var video_container = $scope.find( '.mk-video-container' );
695        var video_holder = $scope.find( '.mk-video-holder' );
696
697        video_container.off( 'click' ).on( 'click', function( e ) {
698
699            var selector = $( this ).find( '.mk-video__play' );
700
701            shalPlayVideo._play( selector );
702        });
703
704        if( '1' == video_container.data( 'autoplay' ) || true == video_container.data( 'device' ) ) {
705
706            shalPlayVideo._play( $scope.find( '.mk-video__play' ) );
707        }
708
709    }
710
711    mkAddons.widgetsList.mk_video = {};
712    mkAddons.widgetsList.mk_video.mkVideo = mkVideo;
713
714    // ----------------------------------------------------------
715
716    var mkTeam = function ($scope, $) {
717        var $this = $scope.find('.mk-team'),
718            $isoGrid = $this.children('.mk-team-grid'),
719            $btns = $this.children('.mk-team-btns'),
720            is_rtl = $this.data('rtl') ? false : true,
721            layout = $this.data('layout');
722
723        $this.imagesLoaded( function() {
724            if ( 'masonry' == layout ) {
725                var $grid = $isoGrid.isotope({
726                    itemSelector: '.mk-team-item',
727                    percentPosition: true,
728                    originLeft: is_rtl,
729                    masonry: {
730                        columnWidth: '.mk-team-item',
731                    }
732                });
733            } else{
734                var $grid = $isoGrid.isotope({
735                    itemSelector: '.mk-team-item',
736                    layoutMode: 'fitRows',
737                    originLeft: is_rtl
738                });
739            }
740
741        });
742    }
743
744    mkAddons.widgetsList.mk_team = {};
745    mkAddons.widgetsList.mk_team.mkTeam = mkTeam;
746
747    // ----------------------------------------------------------
748
749    var mkVideoIcon = function ($scope, $) {
750        var $this = $scope.find('.mk-video-lightbox');
751        $this.magnificPopup({
752            disableOn: 700, // disable popup
753            type: 'iframe',
754            mainClass: 'mfp-fade',
755            removalDelay: 160,
756            preloader: false,
757            fixedContentPos: false
758        });
759    }
760
761    mkAddons.widgetsList.mk_video_icon = {};
762    mkAddons.widgetsList.mk_video_icon.mkVideoIcon = mkVideoIcon;
763
764    mkAddons.widgetsList.mk_circle_text = {};
765    mkAddons.widgetsList.mk_circle_text.mkVideoIcon = mkVideoIcon;
766
767    // ----------------------------------------------------------
768
769    var mkAwards = function ($scope, $) {
770       if ($(window).width() >= 1024) {
771
772           var thisHolder      = $scope.find( '.mk-awards' ),
773           articles            = thisHolder.find('.mk-awards-item'),
774           showcaseWallImages  = thisHolder.find('.mk-awards-images'),
775           showcaseWallImage   = thisHolder.find('.mk-awards-image');
776
777           $(articles.get().reverse()).each(function () {
778               if ($(this).hasClass('active-item')) {
779                   articles.removeClass('active-item');
780                   $(this).addClass('active-item');
781               }
782           });
783
784           $(showcaseWallImage.get().reverse()).each(function () {
785               if ($(this).hasClass('active-item')) {
786                   showcaseWallImage.removeClass('active-item');
787                   $(this).addClass('active-item');
788               }
789           });
790
791           articles.each(function () {
792               $(this).on({
793                   mouseenter: function () {
794                       articles.removeClass('active-item');
795                       $(this).addClass('active-item');
796                       showcaseWallImage.removeClass('active-item');
797                       showcaseWallImages.find('#' + $(this).data('index')).addClass('active-item');
798                   },
799                   mouseleave: function () {
800                   }
801               });
802           });
803
804       }
805
806    }
807
808    mkAddons.widgetsList.mk_awards = {};
809    mkAddons.widgetsList.mk_awards.mkAwards = mkAwards;
810
811    // ----------------------------------------------------------
812
813    var mkSearch = function ($scope, $) {
814
815        jQuery(".mk-search-icon").each(function() {
816            var iconInput = jQuery(this).find('a');
817
818            iconInput.bind('click', function () {
819                var openDiv = jQuery(this).attr('data-open');
820                jQuery('#'+openDiv).addClass('active');
821
822                jQuery('body').addClass('elementor-no-overflow');
823                jQuery('body').addClass('elementor-search-activate');
824
825            });
826        });
827
828        jQuery(".mk_search_form").each(function() {
829            var wrapper = jQuery(this).attr('data-open');
830            var formInput = jQuery(this).find('input[name="s"]');
831            var resultDiv = jQuery(this).attr('data-result');
832
833            formInput.bind('click', function () {
834                jQuery("#"+resultDiv).addClass('visible');
835                jQuery("#"+resultDiv).attr('data-mousedown', 'true');
836            });
837
838            formInput.bind('focus', function () {
839                jQuery("#"+resultDiv).addClass('visible');
840                formInput.addClass('visible');
841            });
842
843            formInput.bind('blur', function () {
844                jQuery("#"+resultDiv).removeClass('visible');
845                formInput.removeClass('visible');
846            });
847
848            jQuery("#"+wrapper).bind('click', function () {
849                if(!formInput.hasClass('visible')) {
850                    if(jQuery("#"+resultDiv).attr('data-mousedown') != 'true') {
851                        jQuery("#"+resultDiv).removeClass('visible');
852                    }
853                    jQuery('#'+wrapper).removeClass('active');
854                    jQuery('body').removeClass('elementor-no-overflow');
855                    jQuery('body').removeClass('elementor-search-activate');
856                }
857            });
858        });
859
860    }
861
862    mkAddons.widgetsList.mk_search = {};
863    mkAddons.widgetsList.mk_search.mkSearch = mkSearch;
864
865    // ----------------------------------------------------------
866
867    var mkPopup = function ($scope, $) {
868
869        var $window             = jQuery( window ),
870            $document           = jQuery( document ),
871            $html               = jQuery( 'html' ),
872            $body               = jQuery( 'body' ),
873            $adminbar           = jQuery( '#wpadminbar' ),
874            _adminbar_height    = $adminbar.length === 0 || $adminbar.css( 'display' ) == 'none' || $adminbar.css( 'position' ) == 'absolute' ? 0 : $adminbar.height();
875
876        window.mk_get_cookie = function(name) {
877            var defa = arguments[1] !== undefined ? arguments[1] : null;
878            var start = document.cookie.indexOf(name + '=');
879            var len = start + name.length + 1;
880            if ((!start) && (name != document.cookie.substring(0, name.length))) {
881                return defa;
882            }
883            if (start == -1) { return defa; }
884            var end = document.cookie.indexOf(';', len);
885            if (end == -1) { end = document.cookie.length; }
886            return decodeURIComponent(document.cookie.substring(len, end));
887        };
888
889        window.mk_set_cookie = function(name, value) {
890
891            var expires  = arguments[2] !== undefined ? arguments[2] : 24 * 60 * 60 * 1000; // 24 hours
892            var path     = arguments[3] !== undefined ? arguments[3] : '/';
893            var domain   = arguments[4] !== undefined ? arguments[4] : '';
894            var secure   = arguments[5] !== undefined ? arguments[5] : '';
895            var samesite = arguments[6] !== undefined ? arguments[6] : 'strict';    // strict | lax | none
896            var today    = new Date();
897            today.setTime(today.getTime());
898            var expires_date = new Date(today.getTime() + (expires * 1));
899            document.cookie = encodeURIComponent(name) + '='
900                    + encodeURIComponent(value)
901                    + (expires ? ';expires=' + expires_date.toGMTString() : '')
902                    + (path    ? ';path=' + path : '')
903                    + (domain  ? ';domain=' + domain : '')
904                    + (secure  ? ';secure' : '')
905                    + (samesite  ? ';samesite=' + samesite : '');
906        };
907
908        // popups & panels content
909
910        var on_leaving_site = [],
911            in_page_edit_mode = $body.hasClass('elementor-editor-active')
912                                || $body.hasClass('wp-admin')
913                                || $body.hasClass('block-editor-page');
914
915        // Init popups and panels links
916        $body.find('.mk_sections_popup:not(.inited)').each( function() {
917
918            var $self = jQuery(this),
919                id = $self.data('trigger-id'),
920                esckey = $self.data('esckey'),
921                show = false;
922            if (!id) return;
923
924            // add background color dark/light skin
925            var $bg_skin = $self.data('skin');
926            $body.addClass('popup-bg-skin-'+$bg_skin);
927
928            // close popup with escape key
929            if ( 'yes' == esckey ) {
930                jQuery(document).on('keydown', function (event) {
931                    if (27 === event.keyCode) {
932                        mk_close_popup($self);
933                    }
934                });
935            }
936
937            var link = jQuery('a[href="#'+id+'"],' + ( '.mk_popup_link[data-popup-id="'+id+'"]' ) );
938
939            if (link.length === 0) {
940                $body.append('<a href="#'+id+'" class="mk_hidden"></a>');
941                link = jQuery('a[href="#'+id+'"]');
942            }
943
944            if ($self.hasClass('mk_sections_show_on_page_load')) {
945                show = true;
946            } else if ($self.hasClass('mk_sections_show_on_page_load_once') && mk_get_cookie('mk_show_on_page_load_once_'+id) != '1') {
947                mk_set_cookie('mk_show_on_page_load_once_'+id, '1');
948                show = true;
949            } else if ($self.hasClass('mk_sections_show_on_page_close') && mk_get_cookie('mk_show_on_page_close_'+id) != '1') {
950                on_leaving_site.push({ link: link, id: id });
951            }
952
953            if (show) {
954                // Display popups on the page (site) load
955                if ( ! in_page_edit_mode ) {
956                    setTimeout( function() {
957                        link.trigger('click'); // on click -> mk_popup_link
958                    }, 0);
959                }
960            }
961
962            link.addClass('mk_popup_link')
963                .data('popup', $self);
964
965        }); // body.... .each
966
967        // Display popup when user leaving site
968        if ( on_leaving_site.length > 0 && ! in_page_edit_mode ) {
969            var showed = false;
970            $window.on( 'mousemove', function(e) {
971                if ( showed ) return;
972                var y = typeof e.clientY != 'undefined' ? e.clientY : 999;
973                if ( y < _adminbar_height + 15 ) {
974                    showed = true;
975                    on_leaving_site.forEach( function(item) {
976                        item.link.trigger('click');
977                        mk_set_cookie('mk_show_on_page_close_'+item.id, '1');
978                    });
979                }
980            } );
981        }
982
983        // Close popup
984        window.mk_close_popup = function(panel) {
985            if ( panel.hasClass('mk_sections_popup') ) {
986                // $document.trigger('action.close_popup_elements', [panel]);
987            }
988            setTimeout( function() {
989                panel.removeClass('mk_sections_popup_active');
990                if (panel.prev().hasClass('mk-off-canvas-overlay')) {
991                    panel.prev().removeClass('mk_sections_popup_active');
992                }
993
994                $body.removeClass('mk_sections_popup_active');
995
996                if ( panel.data('popup-content') !== undefined ) {
997                    setTimeout( function() { panel.empty(); }, 500 );
998                }
999            }, 0 );
1000        };
1001
1002        // Display lightbox on click on the popup link
1003        $body.find( '.mk_popup_link:not(.popup_inited)' )
1004            .addClass('popup_inited')
1005            .magnificPopup({
1006                type: 'inline',
1007                focus: 'input',
1008                removalDelay: 0,
1009                tLoading: 'Loading...',
1010                tClose: 'Close (Esc)',
1011                closeBtnInside: true,
1012                callbacks: {
1013                    // Will fire when this exact popup is opened this - is Magnific Popup object
1014                    open: function () {
1015                        // Get saved content or store it (if first open occured)
1016                        mk_prepare_popup_offcanvas_content(this.content, true);
1017                    },
1018                    close: function () {
1019                        var $mfp = this;
1020                        // Save and remove content before closing if its contain video, audio or iframe
1021                        mk_close_popup($mfp.content);
1022                    },
1023                    // resize event triggers only when height is changed or layout forced
1024                    resize: function () {
1025                        var $mfp = this;
1026                        // mk_resize_actions(jQuery($mfp.content));
1027                    }
1028                }
1029            });
1030
1031    };
1032
1033    mkAddons.widgetsList.mk_popup = {};
1034    mkAddons.widgetsList.mk_popup.mkPopup = mkPopup;
1035
1036    // ----------------------------------------------------------
1037
1038    var mkOffCanvas = function ($scope, $) {
1039
1040        var $window             = jQuery( window ),
1041            $document           = jQuery( document ),
1042            $html               = jQuery( 'html' ),
1043            $body               = jQuery( 'body' ),
1044            $adminbar           = jQuery( '#wpadminbar' ),
1045            _adminbar_height    = $adminbar.length === 0 || $adminbar.css( 'display' ) == 'none' || $adminbar.css( 'position' ) == 'absolute' ? 0 : $adminbar.height();
1046
1047        // Off-Canvas content
1048
1049        var on_leaving_site = [],
1050            in_page_edit_mode = $body.hasClass('elementor-editor-active')
1051                                || $body.hasClass('wp-admin')
1052                                || $body.hasClass('block-editor-page');
1053
1054        // Init Off-Canvas links
1055        $body.find('.mk-off-canvas:not(.inited)').each( function() {
1056
1057            var $self = jQuery(this),
1058                getOffCanvasId = $self.data('offcanvas-id'),
1059                esckey = $self.data('esckey'),
1060                show = false;
1061            if (!getOffCanvasId) return;
1062
1063            $self.attr( 'id', getOffCanvasId ); // add ID attribute
1064
1065            // close offcanvas with escape key
1066            if ( 'yes' == esckey ) {
1067                jQuery(document).on('keydown', function (event) {
1068                    if (27 === event.keyCode) {
1069                        mk_close_offcanvas($self);
1070                    }
1071                });
1072            }
1073
1074            var link = jQuery('a[href="#'+getOffCanvasId+'"],' + ( '.mk_off_canvas_link[data-offcanvas-id="'+getOffCanvasId+'"]' ) );
1075
1076            if (link.length === 0) {
1077                $body.append('<a href="#'+getOffCanvasId+'" class="mk_hidden"></a>');
1078                link = jQuery('a[href="#'+getOffCanvasId+'"]');
1079            }
1080
1081            link.addClass('mk_off_canvas_link')
1082                .data('offcanvas', $self);
1083
1084            $self.addClass('inited')
1085                 .on('click', '.mk-off-canvas-close', function(e) {
1086                    mk_close_offcanvas($self);
1087                    e.preventDefault();
1088                    return false;
1089                });
1090
1091        }); // body.... .each
1092
1093        // Open Off-Canvas on click on the off-canvas link
1094        $body.find( '.mk_off_canvas_link:not(.offcanvas_inited)' )
1095            .addClass('offcanvas_inited')
1096            .on('click', function(e) {
1097
1098                console.log(jQuery(this));
1099
1100
1101                var offCanvas = jQuery(this).data('offcanvas');
1102                if ( ! offCanvas.hasClass( 'mk-off-canvas-active' ) ) {
1103
1104                    mk_prepare_popup_offcanvas_content(offCanvas, true);
1105                    offCanvas.addClass('mk-off-canvas-active');
1106                    $document.trigger('action.opened_popup_elements', [offCanvas]);
1107
1108                    if (offCanvas.prev().hasClass('mk-off-canvas-overlay')) {
1109                        offCanvas.prev().addClass('mk-off-canvas-active');
1110                    }
1111
1112                    $body.addClass('mk-off-canvas-active');
1113                } else {
1114                    mk_close_offcanvas(offCanvas);
1115                }
1116                e.preventDefault();
1117                return false;
1118            });
1119
1120        // Close off-canvas on click on the modal cover
1121        $body.find('.mk-off-canvas-overlay:not(.inited)')
1122            .addClass('inited')
1123            .on('click', function(e) {
1124                mk_close_offcanvas(jQuery(this).next());
1125                e.preventDefault();
1126                return false;
1127            });
1128
1129        // Close off-canvas
1130        window.mk_close_offcanvas = function(offCanvas) {
1131            setTimeout( function() {
1132                offCanvas.removeClass('mk-off-canvas-active');
1133                if (offCanvas.prev().hasClass('mk-off-canvas-overlay')) {
1134                    offCanvas.prev().removeClass('mk-off-canvas-active');
1135                }
1136
1137                $body.removeClass('mk-off-canvas-active mk-off-canvas-active_left mk-off-canvas-active_right');
1138
1139                if ( offCanvas.data('off-canvas-content') !== undefined ) {
1140                    setTimeout( function() { offCanvas.empty(); }, 500 );
1141                }
1142            }, 0 );
1143        };
1144
1145    };
1146
1147    mkAddons.widgetsList.mk_off_canvas = {};
1148    mkAddons.widgetsList.mk_off_canvas.mkOffCanvas = mkOffCanvas;
1149
1150    // ----------------------------------------------------------
1151
1152    var mkCart = function ($scope, $) {
1153
1154        var $window             = jQuery( window ),
1155            $body               = jQuery( 'body' ),
1156            $adminbar           = jQuery( '#wpadminbar' );
1157
1158        // panels content
1159        var in_page_edit_mode = $body.hasClass('elementor-editor-active')
1160                                || $body.hasClass('wp-admin')
1161                                || $body.hasClass('block-editor-page');
1162
1163        // Init panels links
1164        $body.find('.mk-cart-panel:not(.inited)').each( function() {
1165
1166            var $self = jQuery(this),
1167                id = $self.data('trigger-id'),
1168                esckey = $self.data('esckey');
1169
1170            if (!id) return;
1171
1172            // close panel with escape key
1173            if ( 'yes' == esckey ) {
1174                jQuery(document).on('keydown', function (event) {
1175                    if (27 === event.keyCode) {
1176                        mk_close_cart_panel($self);
1177                    }
1178                });
1179            }
1180
1181            var link = jQuery('a[href="#'+id+'"],.mk-cart-panel-link[data-panel-id="'+id+'"]' );
1182
1183            if (link.length === 0) {
1184                $body.append('<a href="#'+id+'" class="mk-hidden"></a>');
1185                link = jQuery('a[href="#'+id+'"]');
1186            }
1187
1188            link.addClass('mk-cart-panel-link')
1189                .data('panel', $self);
1190
1191            $self.addClass('inited')
1192                 .on('click', '.mk-cart-panel-close', function(e) {
1193                    mk_close_cart_panel($self);
1194                    e.preventDefault();
1195                    return false;
1196                });
1197
1198        }); // body.... .each
1199
1200        // Open panel on click on the panel link
1201        $body.find( '.mk-cart-panel-link:not(.panel_inited)' )
1202            .addClass('panel_inited')
1203            .on('click', function(e) {
1204
1205                var panel = jQuery(this).data('panel');
1206                if ( ! panel.hasClass( 'mk-cart-panel-active' ) ) {
1207                    panel.addClass('mk-cart-panel-active');
1208                    if (panel.prev().hasClass('mk-cart-panel-overlay')) panel.prev().addClass('mk-cart-panel-active');
1209                    $body.addClass('mk-cart-panel-active mk-cart-panel-active-' + panel.data('panel-position'));
1210                } else {
1211                    mk_close_cart_panel(panel);
1212                }
1213                e.preventDefault();
1214                return false;
1215            });
1216
1217        // Close panel on click on the modal cover
1218        $body.find('.mk-cart-panel-overlay:not(.inited)')
1219            .addClass('inited')
1220            .on('click', function(e) {
1221                mk_close_cart_panel(jQuery(this).next());
1222                e.preventDefault();
1223                return false;
1224            });
1225
1226        // Close panel
1227        window.mk_close_cart_panel = function(panel) {
1228            setTimeout( function() {
1229                panel.removeClass('mk-cart-panel-active');
1230                if (panel.prev().hasClass('mk-cart-panel-overlay')) {
1231                    panel.prev().removeClass('mk-cart-panel-active');
1232                }
1233
1234                $body.removeClass('mk-cart-panel-active mk-cart-panel-active-left mk-cart-panel-active-right');
1235
1236            }, 0 );
1237        };
1238
1239    };
1240
1241    mkAddons.widgetsList.mk_cart = {};
1242    mkAddons.widgetsList.mk_cart.mkCart = mkCart;
1243
1244    // ----------------------------------------------------------
1245
1246    var mkImage = function ($scope, $) {
1247
1248        var mkImageFigureLink = $scope.find( '.mk-image figure a' ),
1249            cursonIcon          = mkImageFigureLink.data('cursor-icon') ? mkImageFigureLink.data('cursor-icon') : '';
1250        if (cursonIcon.length) {
1251            mkImageFigureLink.css('cursor','url(' + cursonIcon + '),auto');
1252        }
1253
1254        if ($scope.hasClass('mk-custom-image-appear-reveal')) {
1255            var mkImageFigure = $scope.find( '.mk-image figure' )[0];
1256
1257            if (mkImageFigure) {
1258
1259                var revealColor     = $(mkImageFigure).data('reveal-color'),
1260                    revealDirection = $(mkImageFigure).data('reveal-direction'),
1261                    revealDuration  = $(mkImageFigure).data('reveal-duration'),
1262                    revealDelay     = $(mkImageFigure).data('reveal-delay'),
1263                    revealViewport  = $(mkImageFigure).data('reveal-viewport'),
1264                    finalViewPort   = revealViewport * -1,
1265                    watcher_1       = scrollMonitor.create(mkImageFigure, finalViewPort);
1266
1267                var revealBlock = new RevealFx(mkImageFigure, {
1268                            revealSettings : {
1269                                bgColors: [revealColor],
1270                                delay: revealDelay,
1271                                direction:revealDirection,
1272                                duration: revealDuration,
1273                                onHalfway: function(contentEl, revealerEl) {
1274                                    contentEl.style.opacity = 1;
1275                                }
1276                            }
1277                        });
1278
1279                watcher_1.enterViewport(function() {
1280                    revealBlock.reveal();
1281                    watcher_1.destroy();
1282                });
1283            }
1284        }
1285
1286        mkScrollLoad.init();
1287
1288    }
1289
1290    mkAddons.widgetsList.mk_image = {};
1291    mkAddons.widgetsList.mk_image.mkImage = mkImage;
1292
1293    // ----------------------------------------------------------
1294
1295    var mkIconButton = function ($scope, $) {
1296        var mkIconButton = $scope.find('.mk-icon-button');
1297
1298        if ( mkIconButton.length > 0 ) {
1299            if ( mkIconButton.hasClass( 'mk-icon-button-type--icon-boxed' ) ) {
1300                var $buttonIcon = mkIconButton.find( '.mk-icon-button-icon' ),
1301                    height      = mkIconButton.find( '.mk-icon-button-text-holder' ).outerHeight();
1302                $buttonIcon.css('width', height );
1303            }
1304        }
1305    };
1306
1307    mkAddons.widgetsList.mk_icon_button = {};
1308    mkAddons.widgetsList.mk_icon_button.mkIconButton = mkIconButton;
1309
1310    // ----------------------------------------------------------
1311
1312    var mkMovingGallery = function ($scope, $) {
1313
1314        let $holder = $( '.mk-moving-gallery' );
1315
1316        if ( $holder.length ) {
1317
1318            gsap.defaults({overwrite: "auto"});
1319            gsap.registerPlugin(ScrollTrigger);
1320            gsap.config({nullTargetWarn: false});
1321
1322            $holder.each( function () {
1323
1324                let $thisHolder = $( this ),
1325                $holder_id = $thisHolder.find('ul').attr( 'id' );
1326
1327                gsap.utils.toArray(this).forEach((section, index) => {
1328                    const galleryList = section.querySelector('.mg-' + $holder_id);
1329                    const [x, xEnd] = (index % 2) ? [(section.offsetWidth - galleryList.scrollWidth), 0] : [0, section.offsetWidth - galleryList.scrollWidth];
1330                    gsap.fromTo(galleryList, {  x  }, {
1331                        x: xEnd,
1332                        scrollTrigger: {
1333                            trigger: section,
1334                            scrub: 0.5,
1335                        }
1336                    });
1337                });
1338
1339            });
1340        }
1341    };
1342
1343    mkAddons.widgetsList.mk_moving_gallery = {};
1344    mkAddons.widgetsList.mk_moving_gallery.mkMovingGallery = mkMovingGallery;
1345
1346    // ----------------------------------------------------------
1347
1348    var mkMovingProjects = function ($scope, $) {
1349
1350        var $holder = $scope.find( '.mk-moving-projects' );
1351
1352        if ( $holder.length && mkAddons.windowWidth > 1024 ) {
1353
1354            gsap.defaults({overwrite: "auto"});
1355            gsap.registerPlugin(ScrollTrigger);
1356            gsap.config({nullTargetWarn: false});
1357
1358            $holder.each( function () {
1359                let $thisHolder = $( this ),
1360                $holder_id = $thisHolder.attr( 'id' );
1361                initMovingPorjectItem($thisHolder,$holder_id);
1362            });
1363        }
1364
1365        function initMovingPorjectItem($holder, $holder_id) {
1366
1367            gsap.registerPlugin(ScrollTrigger);
1368
1369            $holder_id = '.mk-moving-projects-' + $holder_id;
1370
1371            const firstRow     = document.querySelector( $holder_id + ' .mk-moving-projects-holder .mk-moving-projects-images:first-of-type'),
1372                  secondRow    = document.querySelector( $holder_id + ' .mk-moving-projects-holder .mk-moving-projects-images:nth-of-type(2)'),
1373                  projectImage = document.querySelector( $holder_id + ' .mk-moving-projects-holder .mk-moving-projects-images:first-of-type .mk-moving-projects-other-img'),
1374                  allImages    = document.querySelectorAll( $holder_id + ' .mk-moving-projects-holder .mk-moving-projects-images');
1375
1376            let imageWidth     = projectImage.offsetWidth,
1377                firstRowWidth  = firstRow.getBoundingClientRect().left + imageWidth,
1378                secondRowRight = secondRow.getBoundingClientRect().right - imageWidth;
1379
1380            const movingProjectsAnim = gsap.timeline({
1381                        scrollTrigger: {
1382                            trigger: $holder_id + ' .mk-moving-projects-holder',
1383                            id: 'clientPin',
1384                            start: 'top 20%',
1385                            end: 'bottom top',
1386                            pin: $holder_id + '.mk-moving-projects',
1387                            scrub: 1
1388                        }
1389                    });
1390
1391              movingProjectsAnim.to(firstRow, { x: -firstRowWidth, ease: 'linear' }),
1392              movingProjectsAnim.to(secondRow, { x: secondRowRight, ease: 'linear' }, '<');
1393
1394              // hover circle text change
1395              const projectInfo  = document.querySelector($holder_id + ' .mk-moving-project-info'),
1396                    circleBg  = projectInfo.querySelector($holder_id + ' .mk-moving-project-info-bg'),
1397                    iconImage = projectInfo.querySelector($holder_id + ' .stat-main-title span'),
1398                    imageItem = gsap.utils.toArray($holder_id + ' .mk-moving-projects-img'),
1399                    gsapAnim  = gsap.timeline({ repeat: -1 });
1400
1401                    gsapAnim.to(iconImage, { duration: .3, scale: 1.3, delay: .5, ease: "power3.in" }),
1402                    gsapAnim.to(iconImage, { duration: .3, scale: 1, ease: "power3.out" }),
1403                    allImages.forEach((theImage => {
1404                            theImage.addEventListener('mouseenter', (function() { gsap.to(circleBg, { scale: 1.1, duration: 1, ease: 'elastic' }) })),
1405                            theImage.addEventListener('mouseleave', (function() { gsap.to(circleBg, { scale: 1,   duration: 1, ease: 'elastic' }) }))
1406                        })),
1407                    imageItem.forEach((imageElements => {
1408
1409                        imageElements.addEventListener('mouseenter', (function() {
1410                            const number = this.dataset.projectimage,
1411                                  dataStat = document.querySelector('[data-stat="' + number + '"]');
1412
1413                            gsapAnim.pause(),
1414                            gsap.to(dataStat, { yPercent: -50, opacity: 1, scale: 1, duration: .4, ease: "power4" }),
1415                            iconImage.classList.add('invisible') })),
1416
1417                        imageElements.addEventListener('mouseleave', (function() {
1418                            const number = this.dataset.projectimage,
1419                                  dataStat = document.querySelector('[data-stat="' + number + '"]');
1420
1421                            gsap.to(dataStat, { yPercent: -50, opacity: 0, scale: .5, duration: .4, ease: 'power4' }),
1422                            iconImage.classList.remove('invisible'),
1423                            gsapAnim.restart()
1424                        }));
1425
1426                    }));
1427        }
1428
1429    }
1430
1431    mkAddons.widgetsList.mk_moving_projects = {};
1432    mkAddons.widgetsList.mk_moving_projects.mkMovingProjects = mkMovingProjects;
1433
1434    // ----------------------------------------------------------
1435
1436    var mkMediaReveal = {
1437
1438        init: function () {
1439            let $holder = $( '.mk-reveal-image-wrapper' );
1440
1441            if ( $holder.length ) {
1442
1443                gsap.defaults({overwrite: "auto"});
1444                gsap.registerPlugin(ScrollTrigger);
1445                gsap.config({nullTargetWarn: false});
1446
1447                $holder.each( function () {
1448                    let $thisHolder = $( this );
1449                    mkMediaReveal.initItem($thisHolder);
1450                });
1451            }
1452        },
1453        initItem: function ($holder){
1454
1455            // Clipped Image
1456            gsap.utils.toArray($holder).forEach((revealMediaWrapper) => {
1457
1458                let $holder_id = $holder.attr( 'id' );
1459
1460                const revealMediaPin      = revealMediaWrapper.querySelector('#' + $holder_id + ' .mk-reveal-image-pin'),
1461                      revealMedia         = revealMediaWrapper.querySelector('#' + $holder_id + ' .mk-reveal-image'),
1462                      revealMediaContent  = revealMediaWrapper.querySelector('#' + $holder_id + ' .mk-reveal-image-content');
1463
1464                gsap.set(revealMediaContent, { paddingTop: (window.innerHeight/2) + revealMediaContent.offsetHeight});
1465
1466                function mkSetMediaRevealImages() {
1467                    gsap.set(revealMediaContent, { paddingTop:""});
1468                    gsap.set(revealMedia, { height: window.innerHeight, });
1469                    gsap.set(revealMediaContent, { paddingTop: (window.innerHeight/2) + revealMediaContent.offsetHeight});
1470                    gsap.set(revealMediaWrapper, { height: window.innerHeight + revealMediaContent.offsetHeight});
1471                }
1472
1473                imagesLoaded('body', function() {
1474                    mkSetMediaRevealImages();
1475                });
1476
1477                window.addEventListener('resize', mkSetMediaRevealImages);
1478
1479                var revealMediaAnimation = gsap.to(revealMedia, {
1480                    clipPath: 'inset(0% 0% 0%)',
1481                    scale: 1,
1482                    duration: 1,
1483                    ease: 'Linear.easeNone'
1484                });
1485
1486                var revealMediaScene = ScrollTrigger.create({
1487                    trigger: revealMediaPin,
1488                    start: function() {
1489                        const startPin = 0;
1490                        return "top +=" + startPin;
1491                      },
1492                    end: function() {
1493                        const endPin = revealMediaContent.offsetHeight;
1494                        return "+=" + endPin;
1495                    },
1496                    animation: revealMediaAnimation,
1497                    scrub: 1,
1498                    pin: true,
1499                    pinSpacing: false,
1500                });
1501
1502            });
1503
1504
1505            // Elements Animation
1506            var contentVideo = gsap.utils.toArray('.mk-media-reveal-video');
1507            contentVideo.forEach(function(videoPlay) {
1508                var video = videoPlay.querySelector("video");
1509
1510                var videoScene = ScrollTrigger.create({
1511                    trigger: videoPlay,
1512                    start: "top 100%",
1513                    end: () => `+=${videoPlay.offsetHeight + window.innerHeight*2}`,
1514                    onEnter: function() { video.play(); },
1515                    onLeave: function() { video.pause(); },
1516                    onEnterBack: function() { video.play(); },
1517                    onLeaveBack: function() { video.pause(); },
1518                });
1519            });
1520
1521            // Reinit All Scrolltrigger After Page Load
1522            imagesLoaded('body', function() {
1523                setTimeout(function() {
1524                    ScrollTrigger.refresh()
1525                }, 1000);
1526            });
1527
1528        }
1529    };
1530
1531    mkAddons.widgetsList.mk_media_reveal = {};
1532    mkAddons.widgetsList.mk_media_reveal.mkMediaReveal = mkMediaReveal;
1533
1534    $( document ).ready( function () {
1535        mkMediaReveal.init();
1536    });
1537
1538    // ----------------------------------------------------------
1539
1540    var mkMovingContent = function ($scope, $) {
1541
1542        if ($("body").hasClass("elementor-editor-active") ) {
1543            return;
1544        }
1545
1546        var $holder = $scope.find( '.mk-moving-content' );
1547
1548        if ( $holder.length && mkAddons.windowWidth > 1024 ) {
1549            var holderItems = $holder.find( '.mk-moving-content-item' );
1550
1551            gsap.defaults({overwrite: "auto"});
1552            gsap.registerPlugin(ScrollTrigger);
1553            gsap.config({nullTargetWarn: false});
1554
1555            holderItems.each( function () {
1556                let $thisHolder = $( this );
1557                initMovingContentItem($thisHolder);
1558            });
1559
1560            function initMovingContentItem($holder){
1561
1562                gsap.to($holder,{
1563                    scrollTrigger: {
1564                        trigger: $holder,
1565                        scrub: 1,
1566                        start:"top 100%",
1567                        end: "top 50%",
1568                        toggleActions: "restart play reverse play",
1569                        toggleClass:"activeMedia",
1570                    },
1571                    x:'-100vw',
1572                    duration:3
1573                });
1574
1575            }
1576
1577        }
1578
1579    }
1580
1581    mkAddons.widgetsList.mk_moving_content = {};
1582    mkAddons.widgetsList.mk_moving_content.mkMovingContent = mkMovingContent;
1583
1584    // ----------------------------------------------------------
1585
1586    var mkInteractivePortfolio = {
1587
1588        init: function () {
1589
1590            if ($("body").hasClass("elementor-editor-active")) {
1591                return;
1592            }
1593
1594            let $holder = $( '.mk-interactive-portfolio' );
1595
1596            if ( $holder.length ) {
1597
1598                // gsap.defaults({overwrite: "auto"});
1599                // gsap.registerPlugin(ScrollTrigger);
1600                // gsap.config({nullTargetWarn: false});
1601
1602                $holder.each( function () {
1603                    let $thisHolder = $( this );
1604                    mkInteractivePortfolio.initItem($thisHolder);
1605                });
1606            }
1607        },
1608        initItem: function ($holder){
1609
1610            var $thisHolder = $holder,
1611                slideSpeed = 1200,
1612                autoplay = { disableOnInteraction: false };
1613
1614                // title text split
1615                $($thisHolder).find('.mk-interactive-portfolio-split-text span').each(function() {
1616                    let splitText = new SplitText($(this), { type: "chars" });
1617                    var i = 1;
1618                    $(this).find('div').each(function() {
1619                        $(this).addClass('mk-ip--char');
1620                        $(this).get(0).style.setProperty("--mk-ip-i", i);
1621                        i = i + 1;
1622                    });
1623                });
1624
1625            var $swiper = new Swiper($thisHolder, {
1626                direction:'vertical',
1627                effect: 'fade',
1628                slidesPerView: 1,
1629                centeredSlides: true,
1630                spaceBetween: 0,
1631                mousewheel: true,
1632                loop: true,
1633                speed: slideSpeed,
1634                preventInteractionOnTransition: true,
1635                disableOnInteraction: false,
1636                on: {
1637                    init: function () {
1638                        setTimeout( function() { $thisHolder.addClass('mk-initialized'); }, 100);
1639                    },
1640                    slideChangeTransitionStart: function() {
1641                        var activeSlide = $thisHolder.find('.swiper-slide-active'),
1642                            notActive   = $thisHolder.find('.swiper-slide:not(".swiper-slide-active")'),
1643                            activeIndex = activeSlide.data('swiper-slide-index'),
1644                            container   = $thisHolder.find('.mk-interactive-portfolio-image-one, .mk-interactive-portfolio-image-two, .mk-interactive-portfolio-image-three, .mk-interactive-portfolio-image-four');
1645
1646                        activeSlide.removeClass('mk--non-active');
1647                        notActive.each( function () {
1648                            if ( $( this ).length ) {
1649                                $( this ).addClass('mk--non-active');
1650                            }
1651                        });
1652
1653                        container.each(function () {
1654                            if ( $( this ).length ) {
1655                                if (  $( this ).data('image-index') === activeIndex ) {
1656                                    $( this ).addClass('mk--active');
1657                                } else {
1658                                    $( this ).removeClass('mk--active');
1659                                }
1660                            }
1661                        });
1662                    },
1663                }
1664            });
1665
1666        }
1667    };
1668
1669    mkAddons.widgetsList.mk_interactive_portfolio = {};
1670    mkAddons.widgetsList.mk_interactive_portfolio.mkInteractivePortfolio = mkInteractivePortfolio;
1671
1672    $( document ).ready( function () {
1673        mkInteractivePortfolio.init();
1674    });
1675
1676    // ----------------------------------------------------------
1677
1678    var mkRevealServices = {
1679
1680        init: function () {
1681
1682            if ($("body").hasClass("elementor-editor-active") || mkAddons.windowWidth < 1024 ) {
1683                return;
1684            }
1685
1686            let $holder = $( '.mk-reveal-services-holder' );
1687
1688            if ( $holder.length ) {
1689
1690                gsap.defaults({overwrite: "auto"});
1691                gsap.registerPlugin(ScrollTrigger);
1692                gsap.config({nullTargetWarn: false});
1693
1694                $holder.each( function () {
1695                    let $thisHolder = $( this );
1696                    mkRevealServices.initItem($thisHolder);
1697                });
1698            }
1699        },
1700        initItem: function ($holder){
1701
1702            // 0 - Boxes Move right to left
1703            const tlBoxMove = gsap.timeline({
1704                scrollTrigger:{
1705                    trigger:'.mk-reveal-service-one',
1706                    start:'top 80%',
1707                    end:'top 30%',
1708                    scrub:1
1709                }
1710            });
1711
1712            tlBoxMove.to('.mk-reveal-service-one',  { x:'150vh', duration:50, delay:1, opacity:1 })
1713                    .to('.mk-reveal-service-two',   { x:'150vh', duration:50, delay:2, opacity:1 })
1714                    .to('.mk-reveal-service-three', { x:'150vh', duration:50, delay:3, opacity:1 })
1715                    .to('.mk-reveal-service-four',  { x:'150vh', duration:50, delay:4, opacity:1 });
1716
1717        }
1718    };
1719
1720    mkAddons.widgetsList.mk_reveal_services = {};
1721    mkAddons.widgetsList.mk_reveal_services.mkRevealServices = mkRevealServices;
1722
1723    $( document ).ready( function () {
1724        mkRevealServices.init();
1725    });
1726
1727    // ----------------------------------------------------------
1728
1729     var mkInteractiveServices = function ($scope, $) {
1730
1731        var thisHolder         = $scope.find( '.mk-interactive-services' ),
1732            articles           = thisHolder.find('.mk-itsr-item'),
1733            showcaseWallImages = thisHolder.find('.mk-itsr-images'),
1734            showcaseWallImage  = thisHolder.find('.mk-itsr-image');
1735
1736        if ($(window).width() >= 1024) {
1737
1738             $(articles.get().reverse()).each(function () {
1739                 if ($(this).hasClass('active-item')) {
1740                     articles.removeClass('active-item');
1741                     $(this).addClass('active-item');
1742                 }
1743             });
1744
1745             $(showcaseWallImage.get().reverse()).each(function () {
1746                 if ($(this).hasClass('active-item')) {
1747                     showcaseWallImage.removeClass('active-item');
1748                     $(this).addClass('active-item');
1749                 }
1750             });
1751
1752             articles.each(function () {
1753                 $(this).on({
1754                     mouseenter: function () {
1755                         articles.removeClass('active-item');
1756                         $(this).addClass('active-item');
1757                         showcaseWallImage.removeClass('active-item');
1758                         showcaseWallImages.find('#' + $(this).data('index')).addClass('active-item');
1759                     },
1760                     mouseleave: function () {
1761                     }
1762                 });
1763             });
1764
1765        } else {
1766            articles.removeClass('active-item');
1767        }
1768     }
1769
1770     mkAddons.widgetsList.mk_interactive_services = {};
1771     mkAddons.widgetsList.mk_interactive_services.mkInteractiveServices = mkInteractiveServices;
1772
1773    // ----------------------------------------------------------
1774
1775    var mkMovingServices = function ($scope, $) {
1776
1777        var $holder = $scope.find( '.mk-moving-services' );
1778
1779        if ( $holder.length ) {
1780
1781            gsap.defaults({overwrite: "auto"});
1782            gsap.registerPlugin(ScrollTrigger);
1783            gsap.config({nullTargetWarn: false});
1784
1785            $holder.each( function () {
1786                let $thisHolder = $( this );
1787                initMovingServicesItem($thisHolder);
1788            });
1789        }
1790
1791        function initMovingServicesItem($holder) {
1792
1793            gsap.registerPlugin(ScrollTrigger,SplitText);
1794
1795            if (mkAddons.windowWidth > 1024) {
1796
1797                let $holder_id = $holder.attr( 'id' );
1798
1799              const boxes = document.querySelector('#' + $holder_id + ' .mk-moving-services-items'),
1800                    boxesDiv = gsap.utils.toArray('#' + $holder_id + ' .mk-moving-services-items > div'),
1801                    boxesLeftDistance = boxes.getBoundingClientRect().left / 2;
1802
1803                let boxLeftDistance = boxesDiv[0].getBoundingClientRect().left,
1804                    i = 0;
1805
1806                for (let x = 0; x < boxesDiv.length; x++) {
1807                    i += boxesDiv[x].offsetWidth; // total width of all horizontal services items
1808                }
1809
1810                i += $($holder).data('extra-length'); //  add extra length to match background text and scroll item scroll animation
1811
1812              const holderDistance = -i + (window.innerWidth - 4 * boxesLeftDistance),
1813                    boxAnimation = function() {
1814                                                const firstBoxDistance = boxesDiv[0].getBoundingClientRect().left,
1815                                                      distance         = firstBoxDistance - boxLeftDistance,
1816                                                      finalDistance    = Math.abs(Math.round(1.75 * distance) / 100),
1817                                                      getDistance      = Math.min(Math.max(finalDistance, 0), 1);
1818                                                gsap.to(boxesDiv, {
1819                                                    scale: 1 - getDistance / 2
1820                                                }
1820), boxLeftDistance = firstBoxDistance, requestAnimationFrame(boxAnimation)
1821                                            };
1822                    boxAnimation(), gsap.to(boxesDiv, {
1823                                        scrollTrigger: {
1824                                            trigger: '.mk-moving-services',
1825                                            start: 'top top',
1826                                            end: 'bottom -=300%',
1827                                            toggleActions: 'play none reverse none',
1828                                            scrub: !0
1829                                        },
1830                                        x: holderDistance,
1831                                        ease: "linear"
1832                                    }),
1833                                    gsap.to('.mk-moving-services', {
1834                                        scrollTrigger: {
1835                                            trigger: '.mk-moving-services',
1836                                            id: 'attScroll',
1837                                            start: 'top top',
1838                                            end: 'bottom -=290%',
1839                                            toggleActions: 'play none reverse none',
1840                                            scrub: !0,
1841                                            pin: '.mk-moving-services'
1842                                        }
1843                                    });
1844
1845                const defaultText = document.querySelector('#' + $holder_id + '.mk-moving-services span:first-of-type'),
1846                         animText = document.querySelector('#' + $holder_id + '.mk-moving-services span:nth-of-type(2)');
1847
1848                let splitText = new SplitText(animText, { type: 'chars' }),
1849                    splitTextAnim = gsap.timeline({
1850                                                scrollTrigger: {
1851                                                    trigger: animText,
1852                                                    start: 'top 40%',
1853                                                    end: 'bottom -=280%',
1854                                                    toggleActions: 'play reverse play reverse',
1855                                                    scrub: .2
1856                                                }
1857                                            });
1858                splitTextAnim.from(splitText.chars, { y: e => 100 * e, duration: 1, ease: 'linear' }),
1859                splitTextAnim.to(defaultText, { webkitClipPath: 'inset(0% 0% 0% 0%)', duration:  3, ease: 'linear' }),
1860                splitTextAnim.to(defaultText, { webkitClipPath: 'inset(0% 100% 0% 0%)', duration: 5, ease: 'linear' }),
1861                splitTextAnim.to(splitText.chars, { y: e => -100 * e - 550, duration: 1, ease: "linear" });
1862            }
1863
1864        }
1865
1866    };
1867
1868     var mkMovingServicesX = {
1869
1870        init: function () {
1871
1872            if ($("body").hasClass("elementor-editor-active") ) {
1873                return;
1874            }
1875
1876            let $holder = $( '.mk-moving-services' );
1877
1878            if ( $holder.length ) {
1879
1880                gsap.defaults({overwrite: "auto"});
1881                gsap.registerPlugin(ScrollTrigger);
1882                gsap.config({nullTargetWarn: false});
1883
1884                $holder.each( function () {
1885                    let $thisHolder = $( this );
1886                    mkMovingServices.initItem($thisHolder);
1887                });
1888            }
1889        },
1890        initItem: function ($holder) {
1891
1892            gsap.registerPlugin(ScrollTrigger,SplitText);
1893
1894            if (mkAddons.windowWidth > 1024) {
1895
1896                let $holder_id = $holder.attr( 'id' );
1897
1898              const boxes = document.querySelector('#' + $holder_id + ' .mk-moving-services-items'),
1899                    boxesDiv = gsap.utils.toArray('#' + $holder_id + ' .mk-moving-services-items > div'),
1900                    boxesLeftDistance = boxes.getBoundingClientRect().left / 2;
1901
1902                let boxLeftDistance = boxesDiv[0].getBoundingClientRect().left,
1903                    i = 0;
1904
1905                for (let x = 0; x < boxesDiv.length; x++) {
1906                    i += boxesDiv[x].offsetWidth; // total width of all horizontal services items
1907                }
1908
1909                i += $($holder).data('extra-length'); //  add extra length to match background text and scroll item scroll animation
1910
1911              const holderDistance = -i + (window.innerWidth - 4 * boxesLeftDistance),
1912                    boxAnimation = function() {
1913                                                const firstBoxDistance = boxesDiv[0].getBoundingClientRect().left,
1914                                                      distance         = firstBoxDistance - boxLeftDistance,
1915                                                      finalDistance    = Math.abs(Math.round(1.75 * distance) / 100),
1916                                                      getDistance      = Math.min(Math.max(finalDistance, 0), 1);
1917                                                gsap.to(boxesDiv, {
1918                                                    scale: 1 - getDistance / 2
1919                                                }
1919), boxLeftDistance = firstBoxDistance, requestAnimationFrame(boxAnimation)
1920                                            };
1921                    boxAnimation(), gsap.to(boxesDiv, {
1922                                        scrollTrigger: {
1923                                            trigger: '.mk-moving-services',
1924                                            start: 'top top',
1925                                            end: 'bottom -=300%',
1926                                            toggleActions: 'play none reverse none',
1927                                            scrub: !0
1928                                        },
1929                                        x: holderDistance,
1930                                        ease: "linear"
1931                                    }),
1932                                    gsap.to('.mk-moving-services', {
1933                                        scrollTrigger: {
1934                                            trigger: '.mk-moving-services',
1935                                            id: 'attScroll',
1936                                            start: 'top top',
1937                                            end: 'bottom -=290%',
1938                                            toggleActions: 'play none reverse none',
1939                                            scrub: !0,
1940                                            pin: '.mk-moving-services'
1941                                        }
1942                                    });
1943
1944                const defaultText = document.querySelector('#' + $holder_id + '.mk-moving-services span:first-of-type'),
1945                         animText = document.querySelector('#' + $holder_id + '.mk-moving-services span:nth-of-type(2)');
1946
1947                let splitText = new SplitText(animText, { type: 'chars' }),
1948                    splitTextAnim = gsap.timeline({
1949                                                scrollTrigger: {
1950                                                    trigger: animText,
1951                                                    start: 'top 40%',
1952                                                    end: 'bottom -=280%',
1953                                                    toggleActions: 'play reverse play reverse',
1954                                                    scrub: .2
1955                                                }
1956                                            });
1957                splitTextAnim.from(splitText.chars, { y: e => 100 * e, duration: 1, ease: 'linear' }),
1958                splitTextAnim.to(defaultText, { webkitClipPath: 'inset(0% 0% 0% 0%)', duration:  3, ease: 'linear' }),
1959                splitTextAnim.to(defaultText, { webkitClipPath: 'inset(0% 100% 0% 0%)', duration: 5, ease: 'linear' }),
1960                splitTextAnim.to(splitText.chars, { y: e => -100 * e - 550, duration: 1, ease: "linear" });
1961            } else {
1962
1963                // mobile
1964                  const e = document.querySelector('#' + $holder_id + '.mk-moving-services'),
1965                    stackBox = gsap.utils.toArray('#' + $holder_id + ' .mk-moving-services-items .stack'),
1966                    theBox = gsap.utils.toArray('#' + $holder_id + ' .mk-moving-services-items article'),
1967                    a = document.querySelector('#' + $holder_id + '.mk-moving-services .about-link'),
1968                    i = stackBox[0].offsetHeight;
1969
1970                    // box bottom margin to adjust with next content section
1971                    var getBottomMargin = $($holder).data('box-margin') || 0;
1972                    e.style.marginBottom = getBottomMargin, gsap.set([stackBox, a], {
1973                        yPercent: 200 // distance from actual view to move bottom to top animation
1974                    });
1975                    let s = gsap.timeline({
1976                        scrollTrigger: {
1977                            trigger: e,
1978                            start: "top top",
1979                            end: () => "+=" + i * stackBox.length,
1980                            pin: !0,
1981                            scrub: !0
1982                        }
1983                    });
1984
1985                    // box bottom margin to adjust with next content section
1986                    var getVerticalMargin = $($holder).data('vertical-margin') || 0;
1987
1988                    s.to(stackBox, {
1989                        yPercent: (e, stackBox) => getVerticalMargin * e + 15,
1990                        stagger: 1,
1991                        duration: 1
1992                    }), s.to(theBox, {
1993                        duration: 1,
1994                        stagger: 1
1995                    }, "<");
1996
1997
1998                if (document.querySelector('#' + $holder_id + ' .mk-moving-services-heading-mobile')) {
1999
2000                  gsap.utils.toArray('#' + $holder_id + ' .mk-moving-services-heading-mobile').forEach((e => {
2001                    let t = new SplitText(e, { type: 'chars' });
2002
2003                    gsap.timeline({
2004                      scrollTrigger: {
2005                        trigger: e,
2006                        start: 'top 100%',
2007                        end: 'top center',
2008                        toggleActions: 'play reverse reverse none',
2009                        scrub: !0
2010                      }
2011                    }).from(t.chars, {
2012                      yPercent: 100,
2013                      scale: 2,
2014                      stagger: .1,
2015                      duration: 1,
2016                      ease: 'power2'
2017                    })
2018                  }))
2019                }
2020
2021            }
2022
2023        }
2024    };
2025
2026    mkAddons.widgetsList.mk_moving_services = {};
2027    mkAddons.widgetsList.mk_moving_services.mkMovingServices = mkMovingServices;
2028
2029    // ----------------------------------------------------------
2030
2031    var mkAnimatedContent = function ($scope, $) {
2032        var $currentItem = $scope.find('.mk-animated-content.mk--animated-by-letter');
2033        var $words = $currentItem.find( '.mk-ac-word-holder' );
2034
2035        mkScrollLoad.init();
2036
2037        $words.each(
2038            function () {
2039                let $word       = $( this ).text(),
2040                    $split_word = '';
2041
2042                for (var i = 0; i < $word.length; i++) {
2043                    $split_word += '<span class="mk-ac-character">' + $word.charAt( i ) + '</span>';
2044                }
2045
2046                $( this ).html( $split_word );
2047            }
2048        );
2049
2050        let $characters = $currentItem.find( '.mk-ac-character' );
2051
2052        $characters.each(
2053            function (index) {
2054                let $character         = $( this ),
2055                    transitionModifier = $currentItem.hasClass( 'mk--appear-from-left' ) ? 20 : 40,
2056                    transitionDelay    = (index * transitionModifier) + 'ms';
2057
2058                $character.css( 'transition-delay', transitionDelay );
2059            }
2060        );
2061    };
2062
2063    mkAddons.widgetsList.mk_animated_content = {};
2064    mkAddons.widgetsList.mk_animated_content.mkAnimatedContent = mkAnimatedContent;
2065
2066    // ----------------------------------------------------------
2067
2068    function mkDualSliderInit() {
2069        var holder = $( '.mk-dual-slider-swiper-container' );
2070
2071        if ( holder.length ) {
2072            holder.each(
2073                function () {
2074
2075                    var $holder    = $( this ),
2076                        settings   = $holder.data( 'settings' ) || {},
2077                        pagination = $holder.siblings( '.swiper-pagination' ).length ? $holder.siblings( '.swiper-pagination' )[0] : null;
2078
2079                    var swiperOptions = {
2080                        direction     : 'horizontal',
2081                        slidesPerView : 1,
2082                        loop          : true,
2083                        speed         : settings['speed'],
2084                        effect        : settings['effect'],
2085                        pagination    : { el: pagination, type: 'bullets', clickable: true }
2086                    };
2087
2088                    // autoplay
2089                    if ( 'yes' === settings['autoplay'] ) {
2090                        swiperOptions.autoplay = { delay: settings['autoplay_speed'], disableOnInteraction: false };
2091                    }
2092
2093                    var $swiper = new Swiper( $( this )[0], swiperOptions );
2094                }
2095            );
2096        }
2097    }
2098
2099    var mkDualSlider = function ($scope, $) {
2100            var $holder = $scope.find('.mk-dual-slider');
2101
2102            mkScrollLoad.init();
2103            mkDualSliderInit();
2104
2105            if ( $holder.length ) {
2106                $holder.each(function() {
2107                    mkDualSliderSyncSwipers( $( this ) );
2108                    mkDualSliderSyncInfo( $( this ) );
2109                });
2110            }
2111
2112            function mkDualSliderSyncSwipers( $thisHolder ) {
2113                var mkLeftSwiper = $thisHolder.find( '.mk-dual-slider-left' ),
2114                    mkRightSwiper = $thisHolder.find( '.mk-dual-slider-right' );
2115
2116                if ( mkLeftSwiper.length && mkRightSwiper.length ) {
2117                    var autoplay = $thisHolder.hasClass( 'mk-dual-slider-autoplay-yes' );
2118
2119                    mkRightSwiper[0].swiper.autoplay.stop();
2120                    mkLeftSwiper[0].swiper.autoplay.stop();
2121                    mkRightSwiper[0].swiper.controller.control = mkLeftSwiper[0].swiper;
2122                    mkRightSwiper[0].swiper.controller.by      = 'slide';
2123                    mkRightSwiper[0].swiper.controller.inverse = true;
2124                    mkLeftSwiper[0].swiper.controller.control = mkRightSwiper[0].swiper;
2125
2126                    if ( autoplay ) {
2127                        mkRightSwiper[0].swiper.autoplay.start();
2128                    }
2129                }
2130            }
2131
2132            function mkDualSliderSyncInfo( $thisHolder ) {
2133                var mkLeftSwiper      = $thisHolder.find( '.mk-dual-slider-left' ),
2134                    contentToPopulate = $thisHolder.find( '.mk-dual-slider-content-large' ),
2135                    contents          = mkLeftSwiper.find( '.mk-dual-slider-item .mk-dual-slider-content' );
2136
2137                mkDualSliderPopulateContent( mkLeftSwiper, contentToPopulate, contents );
2138
2139                mkLeftSwiper[0].swiper.on('slideChangeTransitionStart', function () {
2140                        //Timeout is safe here because it does not depend on anything apart from animation duration which is fixed value
2141                        setTimeout(function() {
2142                                mkDualSliderPopulateContent( mkLeftSwiper, contentToPopulate, contents );
2143                            }, 300 );
2144                    }
2145                );
2146            }
2147
2148            function mkDualSliderPopulateContent( mkLeftSwiper, contentToPopulate, contents ) {
2149                var activeIndex = mkLeftSwiper[0].swiper.activeIndex;
2150
2151                if ( contentToPopulate.length ) {
2152                    contentToPopulate.html( contents.eq( activeIndex ).html() );
2153                }
2154            }
2155
2156    }
2157
2158    mkAddons.widgetsList.mk_dual_slider = {};
2159    mkAddons.widgetsList.mk_dual_slider.mkDualSlider = mkDualSlider;
2160
2161    // ----------------------------------------------------------
2162
2163    var mkCountdown = function ($scope, $) {
2164        var $this = $scope.find('.mk-countdown'),
2165            year  = $this.find('.mk-cd-year'),
2166            month = $this.find('.mk-cd-month'),
2167            week  = $this.find('.mk-cd-week'),
2168            day   = $this.find('.mk-cd-day'),
2169            hour  = $this.find('.mk-cd-hour'),
2170            min   = $this.find('.mk-cd-minute'),
2171            sec   = $this.find('.mk-cd-second'),
2172            text  = $this.data('text'),
2173            standardCountdown  = $this.data('standard-countdown'),
2174            mesg  = $this.data('message'),
2175            link  = $this.data('link'),
2176            time  = $this.data('time'),
2177            data_text_year    = $this.data('text-year'),
2178            data_text_years   = $this.data('text-years'),
2179            data_text_month   = $this.data('text-month'),
2180            data_text_months  = $this.data('text-months'),
2181            data_text_week    = $this.data('text-week'),
2182            data_text_weeks   = $this.data('text-weeks'),
2183            data_text_day     = $this.data('text-day'),
2184            data_text_days    = $this.data('text-days'),
2185            data_text_hour    = $this.data('text-hour'),
2186            data_text_hours   = $this.data('text-hours'),
2187            data_text_minute  = $this.data('text-minute'),
2188            data_text_minutes = $this.data('text-minutes'),
2189            data_text_second  = $this.data('text-second'),
2190            data_text_seconds = $this.data('text-seconds');
2191
2192        $this.countdown( time ).on('update.countdown', function (e) {
2193            var m = e.strftime('%m'),
2194                w = e.strftime('%w'),
2195                Y = Math.floor(m / 12),
2196                m = m % 12,
2197                w = w % 4;
2198
2199            function addZero(val) {
2200                if ( val < 10 ) {
2201                    return '0'+val;
2202                }
2203                return val;
2204            }
2205
2206            if ( standardCountdown == 'yes' ) {
2207                day.html( e.strftime('%D') );
2208            } else {
2209                year.html( addZero(Y) );
2210                month.html( addZero(m) );
2211                week.html( '0'+w );
2212                day.html( e.strftime('%d') );
2213            }
2214
2215            hour.html( e.strftime('%H') );
2216            min.html( e.strftime('%M') );
2217            sec.html( e.strftime('%S') );
2218
2219            if ( text == 'yes' ) {
2220
2221                if ( standardCountdown == 'yes' ) {
2222                    day.next().html( e.strftime('%D') < 2 ? data_text_day : data_text_days );
2223                } else {
2224                    year.next().html( Y < 2 ? data_text_year : data_text_years );
2225                    month.next().html( m < 2 ? data_text_month : data_text_months );
2226                    week.next().html( w < 2 ? data_text_week : data_text_weeks );
2227                    day.next().html( e.strftime('%d') < 2 ? data_text_day : data_text_days );
2228                }
2229
2230                hour.next().html( e.strftime('%H') < 2 ? data_text_hour : data_text_hours );
2231                min.next().html( e.strftime('%M') < 2 ? data_text_minute : data_text_minutes );
2232                sec.next().html( e.strftime('%S') < 2 ? data_text_second : data_text_seconds );
2233            }
2234
2235        }).on('finish.countdown', function (e) {
2236            $this.children().remove();
2237            if ( mesg ) {
2238                $this.append('<div class="mk-cd-message">'+ mesg +'</div>');
2239            } else if( link && elementorFrontend.isEditMode() ){
2240                $this.append('<h2>You can\'t redirect url from elementor edit mode!!</h2>');
2241            } else if (link) {
2242                window.location.href = link;
2243            } else{
2244                $this.append('<h2>May be you don\'t enter a valid redirect url</h2>');
2245            }
2246        });
2247    }
2248
2249    mkAddons.widgetsList.mk_countdown = {};
2250    mkAddons.widgetsList.mk_countdown.mkCountdown = mkCountdown;
2251
2252    // ----------------------------------------------------------
2253
2254    // full screen menu
2255    var mkFullScreenMenu = function ($scope, $) {
2256        var $hamburgerIcon = $scope.find('.mk-fullscreen-menu-icon'),
2257            $dataID = '#' + $hamburgerIcon.attr('data-id'),
2258            overlayHolder = $('body').find($dataID),
2259            closeButton = overlayHolder.find('.mk-fs-menu-close'),
2260            menuHolder = overlayHolder.find('.mk-fullscreen-menu-holder'),
2261            subLinks = menuHolder.children().find("li");
2262
2263        $hamburgerIcon.bind('click touchstart', function () {
2264            var openDiv = '#' + $(this).attr('data-id');
2265            $(openDiv).removeClass('overlay-is--close');
2266            $(openDiv).addClass('overlay-is--open');
2267            $('body').addClass('elementor-no-overflow');
2268        });
2269
2270        closeButton.bind('click touchstart', function(e) {
2271            console.log('tes');
2272            e.stopPropagation();
2273            e.preventDefault();
2274            $(this).parent().parent().removeClass('overlay-is--open');
2275            $(this).parent().parent().addClass('overlay-is--close');
2276            $(menuHolder).find('.sub-menu').delay(0).slideUp(300);
2277        });
2278
2279        // indicator
2280        if ($(subLinks).find('.sub-menu').length > 0) {
2281            $(subLinks).find('.sub-menu').siblings("a").addClass('menu-indicator-icon');
2282        }
2283
2284        $(subLinks).bind('click touchstart', function(e) {
2285            e.stopPropagation();
2286            e.preventDefault();
2287
2288            var $item          = $(this),
2289                $subMenus      = $item.children('.sub-menu'),
2290                $allSubMenus   = $item.find('.sub-menu'),
2291                indicatorMinus = 'sub-menu-indicator-minus',
2292                activeClass    = 'mk-fs-active';
2293
2294            if ($subMenus.length > 0 ) {
2295
2296                $item.parents('.mk-fullscreen-menu-holder').find('li').removeClass(activeClass);
2297                $item.siblings('li').removeClass(activeClass);
2298                $item.addClass(activeClass);
2299
2300                if ($item.parents().hasClass('sub-menu')) {
2301                    $item.parents().addClass(activeClass);
2302                }
2303
2304                if ($subMenus.css("display") == "none") {
2305                    $subMenus.slideDown(300).siblings("a").addClass(indicatorMinus);
2306                    $item.siblings().find('.sub-menu').slideUp(300).end().find("a").removeClass(indicatorMinus);
2307                    return false;
2308                } else {
2309                    $item.find('.sub-menu').delay(0).slideUp(300);
2310                }
2311
2312                if ($allSubMenus.siblings("a").hasClass(indicatorMinus)) {
2313                    $allSubMenus.siblings("a").removeClass(indicatorMinus);
2314                }
2315            }
2316            window.location.href = $item.children("a").attr("href");
2317        });
2318    }
2319
2320    mkAddons.widgetsList.mk_full_screen_menu = {};
2321    mkAddons.widgetsList.mk_full_screen_menu.mkFullScreenMenu = mkFullScreenMenu;
2322
2323    // ----------------------------------------------------------
2324
2325    var mkCounter = function ($scope, $) {
2326        elementorFrontend.waypoint($scope.find('.mk-counter-number'), function () {
2327            var $this   = $(this),
2328                data    = $this.data(),
2329                digit   = data.toValue.toString().match(/\.(.*)/);
2330
2331            if (digit) {
2332                data.rounding = digit[1].length;
2333            }
2334
2335            $this.numerator(data);
2336        });
2337    }
2338
2339    mkAddons.widgetsList.mk_counter = {};
2340    mkAddons.widgetsList.mk_counter.mkCounter = mkCounter;
2341
2342    // ----------------------------------------------------------
2343
2344    var verticalMenu = function ($scope, $) {
2345
2346        var verMenu = $scope.find('.mk-ver-menu-wrap'),
2347            megaMenuDiv = verMenu.find('ul.mk-sections-megamenu');
2348
2349            megaMenuDiv.remove();
2350
2351        // add arrow icon
2352        verMenu.find('li ul').parent().addClass('mk-has-sub-menu');
2353        // verMenu.find(".mk-has-sub-menu").prepend('<span class="mk-mini-menu-arrow"></span>');
2354
2355        verMenu.find('.swm-svg-submenu-indicator').on('click', function(e) {
2356
2357            e.preventDefault();
2358
2359            var parentLi = $(this).parent('.menu-item');
2360
2361            if (parentLi.hasClass('mk-has-sub-active-menu')) {
2362                parentLi.removeClass('mk-has-sub-active-menu');
2363            } else {
2364                parentLi.addClass('mk-has-sub-active-menu');
2365            }
2366
2367            if ($(this).parent().siblings('ul').hasClass('open')) {
2368                $(this).parent().siblings('ul').removeClass('open').slideUp();
2369            } else {
2370                $(this).parent().siblings('ul').addClass('open').slideDown();
2371            }
2372
2373            if ($(this).hasClass('inactive')) {
2374                $(this).removeClass('inactive');
2375            } else {
2376                $(this).addClass('inactive');
2377            }
2378        });
2379
2380    }
2381
2382    mkAddons.widgetsList.mk_vertical_menu = {};
2383    mkAddons.widgetsList.mk_vertical_menu.verticalMenu = verticalMenu;
2384
2385    // ----------------------------------------------------------
2386
2387    var mkTestimonialsSlider = function ($scope, $) {
2388
2389        var testimonialsSlider   = $scope.find( '.mk-testimonials-slider-content' ).eq( 0 ),
2390            testimonialsSliderID = '#' + testimonialsSlider.attr( 'id' ),
2391            $target              = $(testimonialsSliderID).first();
2392
2393        var settings = $target.data( 'settings' ) || {};
2394
2395        var swiperOptions = {
2396            direction: 'horizontal',
2397            slidesPerView: 1,
2398            loop: 'yes' === settings['loop'],
2399            speed: settings['speed'],
2400            effect: 'slide',
2401            keyboard: { enabled: true, onlyInViewport: true },
2402            mousewheel: 'yes' === settings['mousewheel'],
2403            spaceBetween:50,
2404            on: {
2405                resize: function () {
2406                defaultswiperObj.update(); }
2407            }
2408        };
2409
2410        if ( 'yes' === settings['autoplay'] ) {
2411            swiperOptions.autoplay = { delay: settings['autoplay_speed'] };
2412            if ( settings['pause_on_hover'] ) {
2413                $( testimonialsSliderID ).on( 'mouseenter', function() { defaultswiperObj.autoplay.stop(); });
2414                $( testimonialsSliderID ).on( 'mouseleave', function() { defaultswiperObj.autoplay.start(); });
2415            }
2416        }
2417
2418        if ( 'yes' === settings['arrows_on'] ) {
2419            swiperOptions.navigation = { prevEl: settings['slider_prev'], nextEl: settings['slider_next'] };
2420        }
2421        if ( 'yes' === settings['dots'] ) {
2422            swiperOptions.pagination = {
2423                el: settings['slider_pagination'],
2424                type: 'bullets',
2425                clickable: true
2426            };
2427        }
2428
2429        var defaultswiperObj = new Swiper(testimonialsSliderID, swiperOptions);
2430    }
2431
2432    mkAddons.widgetsList.mk_testimonials_slider = {};
2433    mkAddons.widgetsList.mk_testimonials_slider.mkTestimonialsSlider = mkTestimonialsSlider;
2434
2435    // ------------------------------------------------------------
2436    // Custom Sliders ---------------------------------------------
2437    // ------------------------------------------------------------
2438
2439    function mkSwiperSlider($swiperContainer) {
2440
2441        if ( ! $swiperContainer ) { $swiperContainer = '.swiper-container'; }
2442
2443        var $target               = $($swiperContainer).first(),
2444            settings              = $target.data( 'settings' ) || {},
2445            thumbimage            = $target.data( 'thumbimage' ) || {},
2446            breakpointsSettings   = {},
2447            breakpoints           = elementorFrontend.config.breakpoints,
2448            fadeVerticalSwiperBg  = '';
2449
2450        if ( $target.length === 0 ) { return; }
2451
2452        var swiperOptions = {
2453            slidesPerView: settings['slides_to_show'],
2454            loop: 'yes' === settings['loop'],
2455            speed: settings['speed'],
2456            keyboard: { enabled: true, onlyInViewport: true },
2457            parallax: 'yes' === settings['parallax'],
2458            mousewheel: 'yes' === settings['mousewheel'],
2459            centeredSlides: 'yes' === settings['centered_slides'],
2460            on: {
2461                resize: function () {
2462                 defaultswiperObj.update(); }
2463            }
2464        };
2465
2466        if ( 'yes' === settings['video'] ) {
2467            swiperOptions.on.init = function () {
2468                $('.swiper-slide-active').find('video').each(function() { $(this).get(0).play(); });
2469            }
2470            swiperOptions.on.slideChangeTransitionStart = function () {
2471                $('.swiper-slide-active').find('video').each(function() { $(this).get(0).play(); });
2472            }
2473            swiperOptions.on.slideChangeTransitionEnd = function () {
2474                $('.swiper-slide-prev').find('video').each(function() { $(this).get(0).pause(); });
2475                $('.swiper-slide-next').find('video').each(function() { $(this).get(0).pause(); });
2476            }
2477        }
2478
2479        if ( settings['direction'] ) { swiperOptions.direction = settings['direction']; }
2480
2481        // effect
2482        if ( settings['effect'] ) {
2483            swiperOptions.effect = settings['effect'];
2484            if ( 'fade' === settings['effect'] ) { swiperOptions.fadeEffect = { crossFade: true }; }
2485        }
2486
2487        // autoplay
2488        if ( 'yes' === settings['autoplay'] ) {
2489            swiperOptions.autoplay = { delay: settings['autoplay_speed'] };
2490            if ( settings['pause_on_hover'] ) {
2491                $( $target ).on( 'mouseenter', function() { defaultswiperObj.autoplay.stop(); });
2492                $( $target ).on( 'mouseleave', function() { defaultswiperObj.autoplay.start(); });
2493            }
2494        }
2495
2496        // navigation
2497
2498        if ( 'yes' === settings['arrows_on'] ) {
2499            swiperOptions.navigation = { prevEl: settings['slider_prev'], nextEl: settings['slider_next'] };
2500        }
2501
2502        if ( 'yes' === settings['dots'] ) {
2503            swiperOptions.pagination = {
2504                el: settings['slider_pagination'],
2505                type: 'bullets',
2506                clickable: true,
2507            };
2508
2509            if ( $target.hasClass('mk-thumbnail-slider')) {
2510                swiperOptions.pagination.renderBullet = function(index, className) {
2511
2512                    var thumbimageHTML = '',
2513                        thumbURL = thumbimage[index + 1],
2514                        counter = index + 1;
2515
2516                    if ( counter < 10 ) {
2517                        counter = '0' + counter;
2518                    }
2519
2520                    if (thumbURL) {
2521                        thumbimageHTML = '<div class="mk-thumbnailslider-navImage"><span class="mk-thumbnailslider-overlay">' + counter + '</span><img src="' + thumbimage[index + 1] + '" /></div>';
2522                    }
2523
2524                    return '<div class="' + className + '">' + thumbimageHTML + '</div></div>';
2525                }
2526            }
2527
2528        }
2529
2530        var numberPagination = 1;
2531        if( numberPagination != '' && numberPagination != undefined ) {
2532
2533            swiperOptions['on']['slideChange'] = function () {
2534                if( $( '.swiper-pagination-current' ).length > 0 ) {
2535                    $( '.swiper-pagination-current' ).html( pad( this.realIndex + 1, 2 ) );
2536                }
2537                if( $( '.swiper-pagination-total' ).length > 0 ) {
2538                    $( '.swiper-pagination-total' ).html( pad( this.slides.length - 2, 2 ) );
2539                }
2540            };
2541        }
2542
2543        // image spacing
2544        if ( typeof( settings['image_spacing'] ) !== 'undefined' && settings['image_spacing']['size'] !== '' && settings['image_spacing']['size'] !== null ) {
2545            swiperOptions.spaceBetween = settings['image_spacing']['size']
2546        }
2547
2548        breakpointsSettings[ breakpoints.lg ] = { slidesPerView: settings['slides_to_show'] || 1 };
2549        breakpointsSettings[ breakpoints.md ] = { slidesPerView: settings['slides_to_show_tablet'] || 1 };
2550        breakpointsSettings[ breakpoints.xs ] = { slidesPerView: settings['slides_to_show_mobile'] || 1 };
2551
2552        if ( $target.hasClass('mk-carousel-slider')) {
2553            if ( !$target.parents().hasClass('mk-carousel-slider-st1') ) {
2554                breakpointsSettings[ breakpoints.md ] = { slidesPerView: 'auto' };
2555                breakpointsSettings[ breakpoints.xs ] = { slidesPerView: 'auto' };
2556            }
2557        }
2558
2559        swiperOptions.breakpoints = breakpointsSettings;
2560
2561        // Image slider
2562        if ( $target.hasClass('mk-preview-slider') ) {
2563
2564            var breakpointsTinySettings = {};
2565
2566            breakpointsTinySettings[ breakpoints.lg ] = { slidesPerView: $target.data( 'thumb-items' ) || 5 };
2567            breakpointsTinySettings[ breakpoints.md ] = { slidesPerView: $target.data( 'thumb-items-tablet' ) || 3 };
2568            breakpointsTinySettings[ breakpoints.xs ] = { slidesPerView: $target.data( 'thumb-items-mobile' ) || 2 };
2569
2570            var thumbSliderOptions = {
2571                loop: 'yes' === settings['loop'],
2572                speed: settings['speed'],
2573                spaceBetween: $target.data( 'thumb-space' ),
2574                effect:$target.data( 'thumb-effect' ),
2575                freeMode: true,
2576                watchSlidesProgress: true
2577            }
2578
2579            thumbSliderOptions.breakpoints = breakpointsTinySettings;
2580
2581            var imageSliderThumbs = new Swiper($target.data( 'thumb-slider-id' ), thumbSliderOptions);
2582
2583            swiperOptions.thumbs = { swiper: imageSliderThumbs };
2584        }
2585
2586        // call
2587        var defaultswiperObj = new Swiper( $swiperContainer, swiperOptions );
2588
2589    };
2590
2591    // if adminbar - reset slider height
2592    var mkGetCustomSlider = function ($scope, $) {
2593
2594        var customSliderHolder   = $scope.find( '.swiper-container' ).eq( 0 ),
2595            customSliderHolderID = '#' + customSliderHolder.attr( 'id' );
2596
2597        if ( ! customSliderHolder.length ) { return; }
2598        mkSwiperSlider(customSliderHolderID);
2599
2600        var customSliderHolderIDHeight = $(customSliderHolderID).height();
2601
2602        var $windowHeight = $(window).height();
2603
2604        if ( customSliderHolderIDHeight == $windowHeight && mkAddons.body.hasClass('admin-bar') ) {
2605
2606            var $adminbar = jQuery( '#wpadminbar' );
2607
2608            var adminbarHeight = $adminbar.length === 0 || $adminbar.css( 'display' ) == 'none' || $adminbar.css( 'position' ) == 'absolute' ? 0 : $adminbar.height();
2609
2610            var customSliderHolderIDHeight = $(customSliderHolderID).height();
2611            var finalHeight = customSliderHolderIDHeight - adminbarHeight;
2612
2613            $(customSliderHolderID).css( 'height', finalHeight );
2614        }
2615
2616        mkAddons.body.mkCustomCursor.init();
2617
2618    }
2619
2620    mkAddons.widgetsList.mk_basic_slider = {};
2621    mkAddons.widgetsList.mk_basic_slider.mkGetCustomSlider = mkGetCustomSlider;
2622
2623    mkAddons.widgetsList.mk_thumbnail_slider = {};
2624    mkAddons.widgetsList.mk_thumbnail_slider.mkGetCustomSlider = mkGetCustomSlider;
2625
2626    mkAddons.widgetsList.mk_carousel_slider = {};
2627    mkAddons.widgetsList.mk_carousel_slider.mkGetCustomSlider = mkGetCustomSlider;
2628
2629    mkAddons.widgetsList.mk_portfolio_slider = {};
2630    mkAddons.widgetsList.mk_portfolio_slider.mkGetCustomSlider = mkGetCustomSlider;
2631
2632    mkAddons.widgetsList.mk_image_carousel_slider = {};
2633    mkAddons.widgetsList.mk_image_carousel_slider.mkGetCustomSlider = mkGetCustomSlider;
2634
2635    mkAddons.widgetsList.mk_image_slider = {};
2636    mkAddons.widgetsList.mk_image_slider.mkGetCustomSlider = mkGetCustomSlider;
2637
2638    mkAddons.widgetsList.mk_testimonials = {};
2639    mkAddons.widgetsList.mk_testimonials.mkGetCustomSlider = mkGetCustomSlider;
2640
2641    mkAddons.widgetsList.mk_circle_slider = {};
2642    mkAddons.widgetsList.mk_circle_slider.mkGetCustomSlider = mkGetCustomSlider;
2643
2644    // End Custom Sliders ---------------------------------------------
2645
2646    // ------------------------------------------------------------
2647    // Post Grid --------------------------------------------------
2648    // ------------------------------------------------------------
2649
2650
2651    // Filter
2652
2653    var mkFilter = {
2654
2655        customListQuery: {},
2656        init: function ( settings ) {
2657            this.holder = $( '.mk-filter--on' );
2658
2659            if ( this.holder.length ) {
2660                this.holder.each(
2661                    function () {
2662                        var holder      = $( this ),
2663                            filterItems = holder.find( '.mk-m-filter-item' );
2664
2665                        // mkFilter.checkCustomListQuery( holder.data( 'options' ) );
2666                        mkFilter.clickEvent( holder, filterItems );
2667                    });
2668            }
2669        },
2670        clickEvent: function ( holder, filterItems ) {
2671            filterItems.on( 'click', function (e) {
2672                e.preventDefault();
2673                var thisItem = $( this );
2674
2675                if ( ! thisItem.hasClass( 'mk--active' ) ) {
2676                    holder.addClass( 'mk--filter-loading' );
2677                    filterItems.removeClass( 'mk--active' );
2678                    thisItem.addClass( 'mk--active' );
2679
2680                    mkFilter.setVisibility( holder, thisItem );
2681                }
2682            });
2683        },
2684        setVisibility: function ( holder, item ) {
2685            var filterTaxonomy  = item.data( 'taxonomy' ),
2686                filterValue     = item.data( 'filter' ),
2687                showAll         = filterValue === '*',
2688                options         = holder.data( 'options' ),
2689                taxQueryOptions = {};
2690
2691            if ( ! showAll ) {
2692                taxQueryOptions = {
2693                    0: {
2694                        taxonomy: filterTaxonomy,
2695                        field: 'slug',
2696                        terms: filterValue,
2697                    },
2698                };
2699            } else {
2700                taxQueryOptions = mkFilter.customListQuery;
2701            }
2702
2703            options.additional_query_args = { tax_query: taxQueryOptions };
2704            mkAddons.body.trigger( 'mk_trigger_load_more', [holder, 1] ); // param1 = holder, param2 = 1
2705        }
2706
2707    };
2708
2709    // Masonry Layout
2710
2711    var mkMasonryLayout = {
2712        init: function ( settings ) {
2713            this.holder = $( '.mk-p-masonry-on' );
2714
2715            if ( this.holder.length ) {
2716                this.holder.each( function () {
2717                        mkMasonryLayout.createMasonry( $( this ) );
2718                    }
2719                );
2720            }
2721        },
2722        reInit: function ( settings ) {
2723            this.holder = $( '.mk-p-masonry-on' );
2724
2725            if ( this.holder.length ) {
2726                this.holder.each( function () {
2727                    var masonryDiv = $( this ).find( '.mk-grid-inner' );
2728
2729                    if ( typeof masonryDiv.isotope === 'function' ) {
2730                        masonryDiv.isotope( 'layout' );
2731                    }
2732                });
2733            }
2734        },
2735        createMasonry: function ( holder ) {
2736            var masonryDiv   = holder.find( '.mk-grid-inner' ),
2737                $masonryItem = masonryDiv.find( '.mk-grid-item' );
2738
2739            mkAddons.mkWaitForImages.check( masonryDiv, function () {
2740                    if ( typeof masonryDiv.isotope === 'function' ) {
2741                        masonryDiv.isotope({
2742                                layoutMode: 'packery',
2743                                itemSelector: '.mk-grid-item',
2744                                percentPosition: true,
2745                                masonry: {
2746                                    columnWidth: '.mk-grid-masonry-sizer',
2747                                    gutter: '.mk-grid-masonry-gutter'
2748                                }
2749                        });
2750
2751                        if ( holder.hasClass( 'mk-items--packery' ) ) {
2752                            var size = mkMasonryLayout.getPackeryImageSize( masonryDiv, $masonryItem );
2753                            mkMasonryLayout.setPackeryImageProportionSize( masonryDiv, $masonryItem, size );
2754                        }
2755
2756                        masonryDiv.isotope( 'layout' );
2757                    }
2758
2759                    masonryDiv.addClass( 'mk--masonry-init' );
2760                }
2761            );
2762        },
2763        getPackeryImageSize: function ( $holder, $item ) {
2764            var $squareItem = $holder.find( '.mk-item--square' );
2765
2766            if ( $squareItem.length ) {
2767                var $squareItemImage      = $squareItem.find( 'img' ),
2768                    squareItemImageWidth  = $squareItemImage.width(),
2769                    squareItemImageHeight = $squareItemImage.height();
2770
2771                if ( squareItemImageWidth !== squareItemImageHeight ) {
2772                    return squareItemImageHeight;
2773                } else {
2774                    return squareItemImageWidth;
2775                }
2776            } else {
2777                var size    = $holder.find( '.mk-grid-masonry-sizer' ).width(),
2778                    padding = parseInt( $item.css( 'paddingLeft' ), 10 );
2779
2780                return (size - 2 * padding); // remove item side padding to get real item size
2781            }
2782        },
2783        setPackeryImageProportionSize: function ( $holder, $item, size ) {
2784            var padding          = parseInt( $item.css( 'paddingLeft' ), 10 ),
2785                $squareItem      = $holder.find( '.mk-item--square' ),
2786                $horizontalItem  = $holder.find( '.mk-item--horizontal' ),
2787                $verticalItem    = $holder.find( '.mk-item--vertical' ),
2788                $largeSquareItem = $holder.find( '.mk-item--large-square' ),
2789                isMobileScreen   = mkAddons.windowWidth <= 680;
2790
2791            $item.css( 'height', size );
2792
2793            if ( $horizontalItem.length ) {
2794                $horizontalItem.css( 'height', Math.round( size / 2 ) );
2795            }
2796
2797            if ( $verticalItem.length ) {
2798                $verticalItem.css( 'height', Math.round( 2 * (size + padding) ) );
2799            }
2800
2801            if ( ! isMobileScreen ) {
2802
2803                if ( $horizontalItem.length ) {
2804                    $horizontalItem.css( 'height', size );
2805                }
2806
2807                if ( $largeSquareItem.length ) {
2808                    $largeSquareItem.css( 'height', Math.round( 2 * (size + padding) ) );
2809                }
2810            }
2811        }
2812    };
2813
2814    // Pagination
2815
2816    var mkPagination = {
2817        init: function ( settings ) {
2818            this.holder = $( '.mk-pagination--on' );
2819
2820            if ( this.holder.length ) {
2821                this.holder.each( function () {
2822                    var holder = $( this );
2823                    mkPagination.initPaginationType( holder );
2824                });
2825            }
2826        },
2827        initPaginationType: function ( holder ) {
2828            if ( holder.hasClass( 'mk-pagination-type--standard' ) )               { mkPagination.initStandard( holder );
2829            } else if ( holder.hasClass( 'mk-pagination-type--load-more' ) )       { mkPagination.initLoadMore( holder );
2830            } else if ( holder.hasClass( 'mk-pagination-type--infinite-scroll' ) ) { mkPagination.initInfiniteScroll( holder );
2831            }
2832        },
2833        initStandard: function ( holder, nextPage ) {
2834            var paginationItems = holder.find( '.mk-m-pagination-items' ); // pagination div 1,2,3...
2835
2836            if ( paginationItems.length ) {
2837                var options      = holder.data( 'options' ),
2838                    current_page = typeof nextPage !== 'undefined' && nextPage !== '' ? parseInt( nextPage, 10 ) : 1;
2839
2840                mkPagination.changeStandardState( holder, options.max_pages_num, current_page );
2841
2842                paginationItems.children().each( function () {
2843                        var thisItem = $( this );
2844
2845                        thisItem.on( 'click', function (e) {
2846                            e.preventDefault();
2847                            if ( ! thisItem.hasClass( 'mk--active' ) ) {
2848                                mkPagination.getNewPosts( holder, thisItem.data( 'paged' ) );
2849                            }
2850                        });
2851                    }
2852                );
2853            }
2854        },
2855        changeStandardState: function ( holder, maxPagesNum, nextPage ) {
2856            if ( holder.hasClass( 'mk-pagination-type--standard' ) ) {
2857                var paginationNav = holder.find( '.mk-m-pagination-items' ),
2858                    numericItem   = paginationNav.children( '.mk--number' ),
2859                    prevItem      = paginationNav.children( '.mk--prev' ),
2860                    nextItem      = paginationNav.children( '.mk--next' );
2861
2862                mkPagination.standardPaginationVisibility( paginationNav, maxPagesNum );
2863
2864                numericItem.removeClass( 'mk--active' ).eq( nextPage - 1 ).addClass( 'mk--active' );
2865
2866                // show/hide next prev arrows
2867                prevItem.data( 'paged', nextPage - 1 );
2868                nextItem.data( 'paged', nextPage + 1 );
2869
2870                if ( nextPage > 1 ) {
2871                    prevItem.show();
2872                    prevItem.next().removeClass( 'mk-prev--hidden' );
2873                } else {
2874                    prevItem.hide();
2875                    prevItem.next().addClass( 'mk-prev--hidden' );
2876                }
2877
2878                if ( nextPage === maxPagesNum ) {
2879                    nextItem.hide();
2880                } else {
2881                    nextItem.show();
2882                }
2883            }
2884        },
2885        standardPaginationVisibility: function ( paginationNav, maxPagesNum ) {
2886            if ( maxPagesNum === 1 ) {
2887                paginationNav.hide();
2888            } else if ( maxPagesNum > 1 && ! paginationNav.is( ':visible' ) ) {
2889                paginationNav.show();
2890            }
2891        },
2892        initLoadMore: function ( holder ) {
2893            var loadMoreButton = holder.find( '.mk-load-more-button' );
2894
2895            loadMoreButton.on('click', function (e) {
2896                e.preventDefault();
2897                mkPagination.getNewPosts( holder );
2898            });
2899        },
2900        initInfiniteScroll: function ( holder ) {
2901            var holderEndPosition = holder.outerHeight() + holder.offset().top,
2902                scrollPosition    = mkAddons.scroll + mkAddons.windowHeight,
2903                options           = holder.data( 'options' );
2904
2905            if ( ! holder.hasClass( 'mk--loading' ) && scrollPosition > holderEndPosition && options.max_pages_num >= options.next_page ) {
2906                mkPagination.getNewPosts( holder );
2907            }
2908        },
2909        getNewPosts: function ( holder, nextPage ) {
2910            holder.addClass( 'mk--loading' );
2911
2912            var itemsHolder = holder.children( '.mk-grid-inner' );
2913            var options      = holder.data( 'options' );
2914
2915            mkPagination.setNextPageValue( options, nextPage, false );
2916
2917            // paginationRestRoute = mk/v1/get-posts
2918            // restUrl = http://localhost/mk/wp-json/
2919
2920            $.ajax({
2921                    type: 'GET',
2922                    url: mkWidgetsLocalize.restUrl + mkWidgetsLocalize.paginationRestRoute,
2923                    data: {
2924                        options: options
2925                    },
2926                    beforeSend: function ( request ) {
2927                        request.setRequestHeader( 'X-WP-Nonce', mkWidgetsLocalize.restNonce );
2928                    },
2929                    success: function ( response ) {
2930
2931                        if ( response.status === 'success' ) {
2932                            // Override max page numbers options
2933                            if ( options.max_pages_num !== response.data.max_pages_num ) {
2934                                options.max_pages_num = response.data.max_pages_num;
2935                            }
2936
2937                            mkPagination.setNextPageValue( options, nextPage, true );
2938                            mkPagination.changeStandardHtml( holder, options.max_pages_num, nextPage, response.data.pagination_html );
2939
2940                            mkPagination.addPosts( itemsHolder, response.data.html, nextPage );
2941                            mkPagination.reInitMasonryPosts( holder, itemsHolder );
2942
2943                            setTimeout( function () {
2944                                mkAddons.body.trigger( 'mk_trigger_get_new_posts', [holder, response.data, nextPage] );
2945                            }, 300 ); // 300ms is set in order to be after the masonry script initialize
2946
2947                            mkPagination.triggerStandardScrollAnimation( holder );
2948                            mkPagination.loadMoreButtonVisibility( holder, options );
2949                        } else {
2950                            console.log( response.message );
2951                        }
2952                    },
2953                    complete: function () {
2954                        holder.removeClass( 'mk--loading' );
2955                    }
2956            });
2957        },
2958        setNextPageValue: function ( options, nextPage, ajaxTrigger ) {
2959            if ( typeof nextPage !== 'undefined' && nextPage !== '' && ! ajaxTrigger ) {
2960                options.next_page = nextPage;
2961            } else if ( ajaxTrigger ) {
2962                options.next_page = parseInt( options.next_page, 10 ) + 1;
2963            }
2964        },
2965        changeStandardHtml: function ( holder, maxPagesNum, nextPage, pagination_html ) {
2966            if ( holder.hasClass( 'mk-pagination-type--standard' ) ) {
2967                var paginationNav     = holder.find( '.mk-m-pagination' ),
2968                    paginationSpinner = holder.find( '.mk-m-pagination-spinner' );
2969
2970                mkPagination.standardPaginationVisibility( paginationNav, maxPagesNum );
2971
2972                paginationNav.remove();
2973                paginationSpinner.remove();
2974
2975                holder.append( pagination_html );
2976                mkPagination.initStandard( holder, nextPage );
2977            }
2978        },
2979        addPosts: function ( itemsHolder, newItems, nextPage ) {
2980            if ( typeof nextPage !== 'undefined' && nextPage !== '' ) {
2981                itemsHolder.html( newItems );
2982            } else {
2983                itemsHolder.append( newItems );
2984            }
2985        },
2986        reInitMasonryPosts: function ( holder, itemsHolder ) {
2987            if ( holder.hasClass( 'mk-p-masonry-on' ) ) {
2988                itemsHolder.isotope( 'reloadItems' ).isotope( { sortBy: 'original-order' } );
2989                setTimeout( function () { itemsHolder.isotope( 'layout' ); }, 200 );
2990            }
2991        },
2992        triggerStandardScrollAnimation: function ( holder ) {
2993            if ( holder.hasClass( 'mk-pagination-type--standard' ) ) {
2994                $( 'html, body' ).animate( { scrollTop: holder.offset().top - 100 }, 500 ); // move to top after click on pagination link
2995            }
2996        },
2997        loadMoreButtonVisibility: function ( holder, options ) {
2998            if ( holder.hasClass( 'mk-pagination-type--load-more' ) ) {
2999
3000                if ( options.next_page > options.max_pages_num || options.max_pages_num === 1 ) {
3001                    holder.find( '.mk-load-more-button' ).hide();
3002                } else if ( options.max_pages_num > 1 && options.next_page <= options.max_pages_num ) {
3003                    holder.find( '.mk-load-more-button' ).show();
3004                }
3005            }
3006        },
3007        scroll: function ( settings ) {
3008            this.holder = $( '.mk-pagination--on' );
3009
3010            if ( this.holder.length ) {
3011                this.holder.each( function () {
3012                    var holder = $( this );
3013                    if ( holder.hasClass( 'mk-pagination-type--infinite-scroll' ) ) {
3014                        mkPagination.initInfiniteScroll( holder );
3015                    }
3016                });
3017            }
3018        },
3019        triggerLoadMore: function ( holder, nextPage ) {
3020            mkPagination.getNewPosts( holder, nextPage );
3021        },
3022
3023    };
3024
3025    // Portfolio Tooltip
3026
3027    var mkInfoFollow = {
3028        init: function() {
3029            var $portfolioTooltip = $('.mk-portfolio-tooltip');
3030            if ($portfolioTooltip.length) {
3031
3032                var getOptions = $portfolioTooltip.data( 'options' );
3033
3034                mkAddons.body.append('<div class="mk-portfolio-tooptip-box mk-pf-tooltip-subtitle-'+ getOptions.subtitle_type +' mk-portfolio-tooptip-box-'+ getOptions.data_id +'"><div class="mk-portfolio-tooltip-box-wrap"><div class="mk-portfolio-tooltip-box-title"></div><div class="mk-portfolio-tooltip-box-subtitle"></div></div></div>');
3035
3036                var $tooltipBox      = $('.mk-portfolio-tooptip-box'),
3037                    $tooltipTitle    = $tooltipBox.find('.mk-portfolio-tooltip-box-title'),
3038                    $tooltipSubtitle = $tooltipBox.find('.mk-portfolio-tooltip-box-subtitle');
3039
3040                $portfolioTooltip.each(function() {
3041
3042                    $portfolioTooltip.find('.mk-portfolio-wrap').each(function() {
3043                        var $this = $(this);
3044                        $this.on('mousemove', function(e) {
3045                            if (e.clientX + $tooltipBox.width() > mkAddons.windowWidth) {
3046                                $tooltipBox.addClass('mk-right');
3047                            } else {
3048                                $tooltipBox.removeClass('mk-right');
3049                            }
3050                            var x = e.clientX,
3051                                y = e.clientY;
3052                            TweenMax.to($tooltipBox, 0, {x: x, y: y});
3053                        });
3054                        $this.on('mouseenter', function() {
3055
3056                            var $getTitle    = $(this).find('.mk-portfolio-title'),
3057                                $getSubTitle = $(this).find('.mk-portfolio-subtitle');
3058
3059                            if ($getTitle.length)                        { $tooltipTitle.html($getTitle.clone()); }
3060                            if ($getSubTitle.length)                     { $tooltipSubtitle.html($getSubTitle.html()); }
3061                            if (!$tooltipBox.hasClass('mk-is-active')) { $tooltipBox.addClass('mk-is-active'); }
3062
3063                        }).on('mouseleave', function() {
3064                            if ($tooltipBox.hasClass('mk-is-active')) {
3065                                $tooltipBox.removeClass('mk-is-active');
3066                            }
3067                        });
3068                    });
3069                });
3070            }
3071        }
3072    };
3073
3074    // Appear Animation
3075    var mkGridItemLoad = {
3076        init: function() {
3077            this.holder = $( '.mk-grid--load:not(.mk-grid--loaded)' );
3078
3079            function swmRandomArbitrary( min, max ) { return Math.floor( Math.random() * (max - min) + min ); }
3080
3081            if ( this.holder.length ) {
3082                this.holder.each(
3083                    function () {
3084                        var holder      = $( this ),
3085                            randomNum   = swmRandomArbitrary(10, 400 ),
3086                            appearDelay = $( this ).attr( 'data-appear-delay' );
3087
3088                        if ( ! appearDelay ) {
3089                            mkGridItemLoad.GridItemViewPort( holder, function () {
3090                                holder.addClass( 'mk-grid--loaded' );
3091                            });
3092                        } else {
3093                            appearDelay = (appearDelay === 'random') ? randomNum : appearDelay;
3094                            mkGridItemLoad.GridItemViewPort( holder, function () {
3095                                setTimeout( function () { holder.addClass( 'mk-grid--loaded' ); }, appearDelay );
3096                            });
3097                        }
3098                    });
3099            }
3100        },
3101        GridItemViewPort:function($element, callback, onlyOnce) {
3102           if ( $element.length ) {
3103               var offset   = typeof $element.data( 'viewport-offset' ) !== 'undefined' ? $element.data( 'viewport-offset' ) : 0.15; // When item is 15% in the viewport
3104               var observer = new IntersectionObserver(
3105                   function ( entries ) {
3106                       // isIntersecting is true when element and viewport are overlapping
3107                       // isIntersecting is false when element and viewport don't overlap
3108                       if ( entries[0].isIntersecting === true ) {
3109                           callback.call( $element );
3110                           if ( onlyOnce !== false ) { observer.disconnect(); }  // Stop watching the element when it's initialize
3111                       }
3112                   },
3113                   { threshold: [offset] }
3114               );
3115               observer.observe( $element[0] );
3116           }
3117        }
3118
3119    };
3120
3121    var mkGridParallaxEffect = {
3122
3123        init: function () {
3124            let $holder = $( '.mk-p-grid.mk-parallax-scroll-on' );
3125
3126            if ( $holder.length ) {
3127                $holder.each( function (i) {
3128                    let $thisHolder = $( this );
3129                    mkGridParallaxEffect.initItem($thisHolder, i);
3130                });
3131            }
3132        },
3133        initItem: function ($holder, i){
3134            let $articles = $holder.find('.mk-grid-item');
3135
3136            $articles.each( function (i) {
3137                let $thisHolder = $( this ),
3138                    randomScrub = (1.5 + gsap.utils.random(0, .7, .15)).toFixed(2);//num beetween 1.5 and 2.2
3139                mkGridParallaxEffect.initParallax($thisHolder, i, randomScrub);
3140            });
3141
3142        },
3143        initParallax: function ($holder, i, randomScrub){
3144            let $image = $holder.find('.mk-post-grid-image img'),
3145                maxYMove = 6,
3146                yScrollModifier = gsap.utils.random([1, .86, .73]),
3147                moveY = i % 2 === 0 ? maxYMove * yScrollModifier : - maxYMove * yScrollModifier,
3148                scrub = Number.parseFloat(randomScrub);
3149
3150            const tl = gsap.timeline({
3151                scrollTrigger: {
3152                    trigger: $holder,
3153                    scrub: scrub,
3154                    start: () => { return "center bottom" },
3155                    end: () => { return "bottom top"; },
3156                    // markers: true,
3157                }
3158            });
3159
3160            tl.fromTo ( $image, { yPercent: moveY, }, { yPercent: "*=-1", } )
3161        }
3162    };
3163
3164    // --------------------------------------------------
3165
3166    mkAddons.mkFilter             = mkFilter;
3167    mkAddons.mkMasonryLayout      = mkMasonryLayout;
3168    mkAddons.mkPagination         = mkPagination;
3169    mkAddons.mkWaitForImages      = mkWaitForImages;
3170    mkAddons.mkInfoFollow         = mkInfoFollow;
3171    mkAddons.mkGridItemLoad       = mkGridItemLoad;
3172    mkAddons.mkGridParallaxEffect = mkGridParallaxEffect;
3173
3174    $(document).ready(function() {
3175        scroll = $( window ).scrollTop();
3176        mkGridItemLoad.init();
3177        mkPagination.init();
3178        mkFilter.init();
3179        mkMasonryLayout.init();
3180        mkInfoFollow.init();
3181        mkGridParallaxEffect.init();
3182
3183        $( window ).scroll( function () {
3184            mkAddons.scroll = $( window ).scrollTop();
3185            mkAddons.mkPagination.scroll();
3186        });
3187
3188        $( window ).resize( function () {
3189            mkAddons.windowWidth = $( window ).width();
3190            mkAddons.windowHeight = $( window ).height();
3191            if (!$("body").hasClass("elementor-editor-active")) {
3192                mkAddons.mkMasonryLayout.reInit();
3193            }
3194
3195        });
3196
3197        $( document ).on('mk_trigger_get_new_posts', function ( event, holder ) {
3198            if ( holder.hasClass( 'mk-filter--on' ) )   { holder.removeClass( 'mk--filter-loading' ); }
3199            if ( holder.hasClass( 'mk-p-masonry-on' ) ) { mkAddons.mkMasonryLayout.init(); }
3200            mkGridItemLoad.init();
3201        });
3202
3203        $( document ).on('mk_trigger_load_more', function ( event, holder, nextPage ) {
3204            mkAddons.mkPagination.triggerLoadMore( holder, nextPage );
3205        });
3206
3207    });
3208
3209    $( document ).on('mk_trigger_get_new_posts', function ( event, holder ) {
3210        if ( $('.mk-portfolio-tooptip-box').length ) {
3211            $('.mk-portfolio-tooptip-box').remove();
3212        }
3213         mkInfoFollow.init();
3214         mkGridItemLoad.init();
3215    });
3216
3217
3218    // Initiate functions
3219    var mkGridItems = function () {
3220        var isEditMode = Boolean( elementorFrontend.isEditMode() );
3221        if (isEditMode) {
3222            mkAddons.scroll = $( window ).scrollTop();
3223            mkAddons.mkPagination.init();
3224            mkAddons.mkFilter.init();
3225            mkAddons.mkMasonryLayout.init();
3226            mkAddons.mkInfoFollow.init();
3227            mkAddons.mkGridItemLoad.init();
3228            mkAddons.mkGridParallaxEffect.init();
3229            mkAddons.body.mkEyeCursor.init();
3230        }
3231    }
3232
3233    mkAddons.widgetsList.mk_blog_posts = {};
3234    mkAddons.widgetsList.mk_blog_posts.mkGridItems = mkGridItems;
3235
3236    mkAddons.widgetsList.mk_portfolio_modern = {};
3237    mkAddons.widgetsList.mk_portfolio_modern.mkGridItems = mkGridItems;
3238
3239    mkAddons.widgetsList.mk_portfolio_tooltip = {};
3240    mkAddons.widgetsList.mk_portfolio_tooltip.mkGridItems = mkGridItems;
3241
3242    // End Post Grid ---------------------------------------------
3243
3244    // ------------------------------------------------------------
3245    // Filterable Gallery --------------------------------------------------
3246    // ------------------------------------------------------------
3247
3248    var mkGallery = {
3249        init: function () {
3250
3251            var $galleryDiv = $('.mk-filterable-gallery');
3252
3253            if ( $galleryDiv.length ) {
3254                var $isoGrid    = $galleryDiv.children('.mk-filterable-gallery-grid'),
3255                    $btns       = $galleryDiv.children('.mk-filterable-gallery-btns'),
3256                    is_rtl      = $galleryDiv.data('rtl') ? false : true,
3257                    layout      = $galleryDiv.data('layout');
3258
3259                    $galleryDiv.imagesLoaded( function(is_rtl) {
3260                        if ( 'masonry' == layout ) {
3261
3262                            var holder = $galleryDiv.find('.mk-gal-masonry-on');
3263                            if ( holder.length ) {
3264                                holder.each( function () {
3265                                    mkGallery.createMasonry( $( holder ),$btns,is_rtl );
3266                                });
3267                            }
3268
3269                        } else {
3270                            var $grid = $isoGrid.isotope({
3271                                itemSelector: '.mk-filterable-gallery-item',
3272                                layoutMode: 'fitRows',
3273                                originLeft: is_rtl
3274                            });
3275                            mkAddons.mkGallery.itemsFilter($grid,$btns,is_rtl);
3276
3277                        }
3278
3279                    });
3280
3281                mkScrollLoad.init();
3282                mkItemParallaxEffect.init();
3283
3284            }
3285        },
3286        reInit: function () {
3287            var $holder = $('.mk-gal-masonry-on');
3288            if ( $holder.length ) {
3289                $holder.each( function () {
3290                    var masonryDiv = $( $holder ).find( '.mk-gallery-grid-inner' );
3291
3292                    if ( typeof masonryDiv.isotope === 'function' ) {
3293                        masonryDiv.isotope( 'layout' );
3294                    }
3295                });
3296            }
3297        },
3298        createMasonry: function ( holder,$btns,is_rtl ) {
3299            var masonryDiv   = holder.find( '.mk-gallery-grid-inner' ),
3300                $masonryItem = masonryDiv.find( '.mk-filterable-gallery-item' );
3301
3302            mkAddons.mkWaitForImages.check( masonryDiv, function () {
3303            // mkGallery.mkWaitForImages( masonryDiv, function () {
3304                    if ( typeof masonryDiv.isotope === 'function' ) {
3305                        var $grid = masonryDiv.isotope({
3306                            layoutMode: 'packery',
3307                            itemSelector: '.mk-filterable-gallery-item',
3308                            percentPosition: true,
3309                            // originLeft: $is_rtl,
3310                            masonry: {
3311                                columnWidth: '.mk-gallery-grid-masonry-sizer',
3312                                gutter: '.mk-gallery-grid-masonry-gutter'
3313                            }
3314                        });
3315
3316                        if ( holder.hasClass( 'mk-items--packery' ) ) {
3317                            var size = mkGallery.getPackeryImageSize( masonryDiv, $masonryItem );
3318                            mkGallery.setPackeryImageProportionSize( masonryDiv, $masonryItem, size );
3319                        }
3320
3321                        masonryDiv.isotope( 'layout' );
3322                        mkAddons.mkGallery.itemsFilter($grid,$btns,is_rtl);
3323                    }
3324
3325                    masonryDiv.addClass( 'mk-gal--masonry-init' );
3326            });
3327        },
3328        getPackeryImageSize: function ( $holder, $item ) {
3329            var $squareItem = $holder.find( '.mk-item--square' );
3330            if ( $squareItem.length ) {
3331
3332                var $squareItemImage      = $squareItem.find( 'img' ),
3333                    squareItemImageWidth  = $squareItemImage.width(),
3334                    squareItemImageHeight = $squareItemImage.height();
3335
3336                if ( squareItemImageWidth !== squareItemImageHeight ) {
3337                    return squareItemImageHeight;
3338                } else {
3339                    return squareItemImageWidth;
3340                }
3341            } else {
3342                var size    = $holder.find( '.mk-gallery-grid-masonry-sizer' ).width(),
3343                    padding = parseInt( $item.css( 'paddingLeft' ), 10 );
3344
3345                return (size - 2 * padding); // remove item side padding to get real item size
3346            }
3347        },
3348        setPackeryImageProportionSize: function ( $holder, $item, size ) {
3349            var padding          = parseInt( $item.css( 'paddingLeft' ), 10 ),
3350                $squareItem      = $holder.find( '.mk-item--square' ),
3351                $horizontalItem  = $holder.find( '.mk-item--horizontal' ),
3352                $verticalItem    = $holder.find( '.mk-item--vertical' ),
3353                $largeSquareItem = $holder.find( '.mk-item--large-square' ),
3354                isMobileScreen   = mkAddons.windowWidth <= 680;
3355
3356            $item.css( 'height', size );
3357
3358            if ( $horizontalItem.length ) {
3359                $horizontalItem.css( 'height', Math.round( size / 2 ) );
3360            }
3361
3362            if ( $verticalItem.length ) {
3363                $verticalItem.css( 'height', Math.round( 2 * (size + padding) ) );
3364            }
3365
3366            if ( ! isMobileScreen ) {
3367
3368                if ( $horizontalItem.length ) {
3369                    $horizontalItem.css( 'height', size );
3370                }
3371
3372                if ( $largeSquareItem.length ) {
3373                    $largeSquareItem.css( 'height', Math.round( 2 * (size + padding) ) );
3374                }
3375            }
3376        },
3377        itemsFilter: function( $grid, $btns, $is_rtl ) {
3378            $btns.on('click', 'a', function () {
3379                var filterValue = $(this).attr('data-filter');
3380                $grid.isotope({
3381                    filter: filterValue,
3382                    originLeft: $is_rtl
3383                });
3384
3385                window.swm_animation_display( $grid );
3386                return false;
3387            });
3388
3389            $btns.each(function (i, btns) {
3390                var btns = $(btns);
3391
3392                btns.on('click', '.mk-filterable-gallery-btn', function () {
3393                    btns.find('.is-checked').removeClass('is-checked');
3394                    $(this).addClass('is-checked');
3395                });
3396            });
3397        }
3398    };
3399
3400    mkAddons.mkGallery = mkGallery;
3401
3402    $( window ).resize(function () {
3403        if (!$("body").hasClass("elementor-editor-active")) {
3404            mkAddons.mkGallery.reInit();
3405        }
3406    });
3407
3408    $( document ).ready( function () {
3409        mkGallery.init();
3410    });
3411
3412    // Initiate functions
3413    var mkFilterableGallery = function () {
3414        var isEditMode = Boolean( elementorFrontend.isEditMode() );
3415        if (isEditMode) {
3416            mkAddons.scroll = $( window ).scrollTop();
3417            mkAddons.mkGallery.init();
3418        }
3419    }
3420
3421    mkAddons.widgetsList.mk_filterable_gallery = {};
3422    mkAddons.widgetsList.mk_filterable_gallery.mkFilterableGallery = mkFilterableGallery;
3423
3424    // ----------------------------------------------------------
3425
3426    // End Filterable Gallery ---------------------------------------------
3427
3428
3429    $(window).on('elementor/frontend/init', function () {
3430
3431        for ( var key in mkAddons.widgetsList ) {
3432            for ( var keyChild in mkAddons.widgetsList[key] ) {
3433                elementorFrontend.hooks.addAction('frontend/element_ready/' + key + '.default', mkAddons.widgetsList[key][keyChild]);
3434            }
3435        }
3436
3437        // Link 'Edit layout'
3438        jQuery( '.mk_section_editor_link:not(.inited)' )
3439            .addClass('inited')
3440            .on( 'click', function(e) {
3441                e.stopImmediatePropagation();
3442                return true;
3443            });
3444        });
3445
3446})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.