(function(factory) { factory(jQuery); })(function($) { /* Custom Easing */ $.fn.extend($.easing,{ def:"easeInOutExpo", easeInOutExpo:function(e,f,a,h,g){if(f===0){return a;}if(f===g){return a+h;}if((f/=g/2)<1){return h/2*Math.pow(2,10*(f-1))+a;}return h/2*(-Math.pow(2,-10*--f)+2)+a;} }); /* KEYPRESS LEFT & RIGHT ARROW */ /* This will work only if a current gridder is opened. */ $(document).keydown(function(e) { var keycode = e.keyCode; var $current_gridder = $(".currentGridder"); var $current_target = $current_gridder.find(".gridder-show"); if($current_gridder.length){ if ( keycode === 37 ) { //console.log("Pressed Left Arrow"); $current_target.prev().prev().trigger("click"); e.preventDefault(); } if ( keycode === 39 ) { //console.log("Pressed Right Arrow"); $current_target.next().trigger("click"); e.preventDefault(); } }else{ //console.log("No active gridder."); } }); $.fn.gridderExpander = function(options) { /* GET DEFAULT OPTIONS OR USE THE ONE PASSED IN THE FUNCTION */ var settings = $.extend( {}, $.fn.gridderExpander.defaults, options ); return this.each(function() { var mybloc; var _this = $(this); var visible = false; // START CALLBACK settings.onStart(_this); // CLOSE FUNCTION function closeExpander(base) { // SCROLL TO CORRECT POSITION FIRST if(settings.scroll && base.find(".selectedItem").length){ $("html, body").animate({ scrollTop: base.find(".selectedItem").offset().top - settings.scrollOffset }, { duration: 200, easing: settings.animationEasing }); } _this.removeClass("hasSelectedItem"); // REMOVES GRIDDER EXPAND AREA visible = false; base.find(".selectedItem").removeClass("selectedItem"); base.find(".gridder-show").slideUp(settings.animationSpeed, settings.animationEasing, function() { base.find(".gridder-show").remove(); settings.onClosed(base); }); /* REMOVE CURRENT ACTIVE GRIDDER */ $(".currentGridder").removeClass("currentGridder"); // swiperG.destroy(deleteInstance, cleanStyles); // swiperT.destroy(deleteInstance, cleanStyles) } // OPEN EXPANDER function openExpander(myself) { /* CURRENT ACTIVE GRIDDER */ $(".currentGridder").removeClass("currentGridder"); _this.addClass("currentGridder"); /* ENSURES THE CORRECT BLOC IS ACTIVE */ if (!myself.hasClass("selectedItem")) { _this.find(".selectedItem").removeClass("selectedItem"); myself.addClass("selectedItem"); } else { // THE SAME IS ALREADY OPEN, LET"S CLOSE IT closeExpander(_this, settings); return; } /* REMOVES PREVIOUS BLOC */ _this.find(".gridder-show").remove(); /* ADD CLASS TO THE GRIDDER CONTAINER * So you can apply global style when item selected. */ if (!_this.hasClass("hasSelectedItem")) { _this.addClass("hasSelectedItem"); } /* ADD LOADING BLOC */ var $htmlcontent = $("
"); mybloc = $htmlcontent.insertAfter(myself); /* GET CONTENT VIA AJAX OR #ID*/ var thecontent = ""; if( myself.data("griddercontent").indexOf("#") === 0 ) { // Load #ID Content thecontent = $(myself.data("griddercontent")).html(); processContent(myself, thecontent); }else{ // Load AJAX Content $.ajax({ type: "GET", url: myself.data("griddercontent"), success: function(data) { thecontent = data; processContent(myself, thecontent); }, error: function (request) { thecontent = request.responseText; processContent(myself, thecontent); } }); } } // PROCESS CONTENT function processContent(myself, thecontent){ /* FORMAT OUTPUT */ var htmlcontent = "
"; if(settings.showNav){ /* CHECK IF PREV AND NEXT BUTTON HAVE ITEMS */ var prevItem = ($(".selectedItem").prev()); var nextItem = ($(".selectedItem").next().next()); htmlcontent += "
"; htmlcontent += ""+settings.closeText+""; htmlcontent += ""+settings.prevText+""; htmlcontent += ""+settings.nextText+""; htmlcontent += "
"; } htmlcontent += "
"; htmlcontent += thecontent; htmlcontent += "
"; htmlcontent += "
"; // IF EXPANDER IS ALREADY EXPANDED if (!visible) { mybloc.hide().append(htmlcontent).slideDown(settings.animationSpeed, settings.animationEasing, function () { visible = true; /* AFTER EXPAND CALLBACK */ if (typeof(settings.onContent) === "function") { settings.onContent(mybloc); } }); } else { mybloc.html(htmlcontent); mybloc.find(".gridder-padding").fadeIn(settings.animationSpeed, settings.animationEasing, function () { visible = true; /* CHANGED CALLBACK */ if (typeof(settings.onContent) === "function") { settings.onContent(mybloc); } }); } /* SCROLL TO CORRECT POSITION AFTER */ if (settings.scroll) { var offset = (settings.scrollTo === "panel" ? myself.offset().top + myself.height() - settings.scrollOffset : myself.offset().top - settings.scrollOffset); $("html, body").animate({ scrollTop: offset }, { duration: settings.animationSpeed, easing: settings.animationEasing }); } /* REMOVE LOADING CLASS */ mybloc.removeClass("loading"); if ($(".w-gridder").length) { // init sliders inside gridder clone var swiperT = new Swiper(".gridder-show .l-slider-nav", { spaceBetween: 18, direction: "vertical", slidesPerView: 'auto', freeMode: true, threshold: 10, watchSlidesProgress: true, wrapperClass: 'c-slider-nav', }); var swiperG = new Swiper(".gridder-show .js-test", { effect: 'fade', thumbs: { swiper: swiperT, }, }); //auto scroll for first slide const swipingImg = $('.gridder-show .swiping-img'); const scrollingImage = $('.gridder-show .swiping-img img'); let isScrolling = true; // Disable automatic scrolling on swipe or mouse wheel events swipingImg.on('wheel', function() { isScrolling = false; swipingImg.stop(); // Stop ongoing animation }); // Handle swipe events using jQuery's mobile swipe event handler swipingImg.on('touchstart', function() { isScrolling = false; swipingImg.stop(); // Stop ongoing animation }); // Function to perform smooth scrolling animation function animateScroll() { var speed = scrollingImage.height(); if (!isScrolling) return; const scrollDurationDown = speed * 3; // Scroll down duration in milliseconds const scrollDurationUp = speed / 3; // Scroll back up duration in milliseconds const scrollDistance = scrollingImage.height() - swipingImg.height(); // Scroll down swipingImg.animate({ scrollTop: scrollDistance }, scrollDurationDown, 'linear', function() { // Scroll back up swipingImg.animate({ scrollTop: 0 }, scrollDurationUp, 'linear', function() { // Reset isScrolling to stop further scrolling isScrolling = false; }); isScrolling = false; }); } // function animateUp(){ // } // Start the scrolling animation setTimeout(() => { animateScroll(); }, "1000"); } } $(".js-load-more-solutions").click(function () { closeExpander(_this); }) /* CLICK EVENT */ _this.on("click", ".gridder-list", function (e) { e.preventDefault(); var myself = $(this); openExpander(myself); }); /* NEXT BUTTON */ _this.on("click", ".gridder-nav.next", function(e) { e.preventDefault(); $(this).parents(".gridder-show").next().trigger("click"); }); /* PREVIOUS BUTTON */ _this.on("click", ".gridder-nav.prev", function(e) { e.preventDefault(); $(this).parents(".gridder-show").prev().prev().trigger("click"); }); /* CLOSE BUTTON */ _this.on("click", ".gridder-close", function(e) { e.preventDefault(); closeExpander(_this); }); }); }; // Default Options $.fn.gridderExpander.defaults = { scroll: true, scrollOffset: 30, scrollTo: "panel", // panel or listitem animationSpeed: 400, animationEasing: "easeInOutExpo", showNav: true, nextText: "Next", prevText: "Previous", closeText: "Close", onStart: function(){}, onContent: function(){}, onClosed: function(){} }; });