jQuery(document).ready(function($){ //open/close lateral filter $('.cd-filter-trigger').on('click', function(){ triggerFilter(true); }); $('.cd-filter .cd-close').on('click', function(){ triggerFilter(false); }); triggerFilter(document.body.clientWidth >= 1170); $(window).on('resize', function() { triggerFilter(document.body.clientWidth >= 1170); }); function triggerFilter($bool) { var elementsToTrigger = $([$('.cd-filter-trigger'), $('.cd-filter'), $('.cd-tab-filter'), $('.cd-gallery')]); elementsToTrigger.each(function(){ $(this).toggleClass('filter-is-visible', $bool); }); } //mobile version - detect click event on filters tab var filter_tab_placeholder = $('.cd-tab-filter .placeholder a'), filter_tab_placeholder_default_value = 'Select', filter_tab_placeholder_text = filter_tab_placeholder.text(); $('.cd-tab-filter li').on('click', function(event){ //detect which tab filter item was selected var selected_filter = $(event.target).data('type'); //check if user has clicked the placeholder item if( $(event.target).is(filter_tab_placeholder) ) { (filter_tab_placeholder_default_value == filter_tab_placeholder.text()) ? filter_tab_placeholder.text(filter_tab_placeholder_text) : filter_tab_placeholder.text(filter_tab_placeholder_default_value) ; $('.cd-tab-filter').toggleClass('is-open'); //check if user has clicked a filter already selected } else if( filter_tab_placeholder.data('type') == selected_filter ) { filter_tab_placeholder.text($(event.target).text()); $('.cd-tab-filter').removeClass('is-open'); } else { //close the dropdown and change placeholder text/data-type value $('.cd-tab-filter').removeClass('is-open'); filter_tab_placeholder.text($(event.target).text()).data('type', selected_filter); filter_tab_placeholder_text = $(event.target).text(); //add class selected to the selected filter item $('.cd-tab-filter .selected').removeClass('selected'); $(event.target).addClass('selected'); } }); //close filter dropdown inside lateral .cd-filter $('.cd-filter-block h5').on('click', function(){ $(this).toggleClass('closed').siblings('.cd-filter-content').slideToggle(300); }) //fix lateral filter and gallery on scrolling $(window).on('scroll', function(){ (!window.requestAnimationFrame) ? fixGallery() : window.requestAnimationFrame(fixGallery); }); function fixGallery() { var offsetTop = $('.cd-main-content').offset().top, scrollTop = $(window).scrollTop(); ( scrollTop >= offsetTop ) ? $('.cd-main-content').addClass('is-fixed') : $('.cd-main-content').removeClass('is-fixed'); } /************************************ MitItUp filter settings More details: https://mixitup.kunkalabs.com/ or: http://codepen.io/patrickkunka/ *************************************/ buttonFilter.init(); $('.cd-gallery ul').mixItUp({ controls: { enable: false }, callbacks: { onMixStart: function(){ $('.cd-fail-message').fadeOut(200); }, onMixFail: function(){ $('.cd-fail-message').fadeIn(200); } } }); //search filtering //credits http://codepen.io/edprats/pen/pzAdg var inputText; var $matching = $(); var delay = (function(){ var timer = 0; return function(callback, ms){ clearTimeout (timer); timer = setTimeout(callback, ms); }; })(); $(".cd-filter-content input[type='search']").keyup(function(){ // Delay function invoked to make sure user stopped typing delay(function(){ inputText = $(".cd-filter-content input[type='search']").val().toLowerCase(); // Check to see if input field is empty if ((inputText.length) > 0) { $('.mix').each(function() { var $this = $(this); // add item to be filtered out if input text matches items inside the title if($this.attr('class').toLowerCase().match(inputText)) { $matching = $matching.add(this); } else { // removes any previously matched item $matching = $matching.not(this); } }); $('.cd-gallery ul').mixItUp('filter', $matching); } else { // resets the filter to show all item if input is empty $('.cd-gallery ul').mixItUp('filter', 'all'); } }, 200 ); }); }); /***************************************************** MixItUp - Define a single object literal to contain all filter custom functionality *****************************************************/ var buttonFilter = { // Declare any variables we will need as properties of the object $filters: null, groups: [], outputArray: [], outputString: '', // The "init" method will run on document ready and cache any jQuery objects we will need. init: function(){ var self = this; // As a best practice, in each method we will asign "this" to the variable "self" so that it remains scope-agnostic. We will use it to refer to the parent "buttonFilter" object so that we can share methods and properties between all parts of the object. self.$filters = $('.cd-main-content'); self.$container = $('.cd-gallery ul'); self.$filters.find('.cd-filters').each(function(){ var $this = $(this); self.groups.push({ $inputs: $this.find('.filter'), active: '', tracker: false }); }); self.bindHandlers(); }, // The "bindHandlers" method will listen for whenever a button is clicked. bindHandlers: function(){ var self = this; self.$filters.on('click', 'a', function(e){ self.parseFilters(); }); self.$filters.on('change', function(){ self.parseFilters(); }); }, parseFilters: function(){ var self = this; // loop through each filter group and grap the active filter from each one. for(var i = 0, group; group = self.groups[i]; i++){ group.active = []; group.$inputs.each(function(){ var $this = $(this); if($this.is('input[type="radio"]') || $this.is('input[type="checkbox"]')) { if($this.is(':checked') ) { group.active.push($this.attr('data-filter')); } } else if($this.is('select')){ group.active.push($this.val()); } else if( $this.find('.selected').length > 0 ) { group.active.push($this.attr('data-filter')); } }); } self.concatenate(); }, concatenate: function(){ var self = this; self.outputString = ''; // Reset output string for(var i = 0, group; group = self.groups[i]; i++){ self.outputString += group.active; } // If the output string is empty, show all rather than none: !self.outputString.length && (self.outputString = 'all'); // Send the output string to MixItUp via the 'filter' method: if(self.$container.mixItUp('isLoaded')){ self.$container.mixItUp('filter', self.outputString); } } };