Henri Koivuneva | 7709300 | 2017-11-22 21:22:57 +0200 | [diff] [blame] | 1 | jQuery(document).ready(function($){ |
| 2 | //open/close lateral filter |
| 3 | $('.cd-filter-trigger').on('click', function(){ |
| 4 | triggerFilter(true); |
| 5 | }); |
| 6 | $('.cd-filter .cd-close').on('click', function(){ |
| 7 | triggerFilter(false); |
| 8 | }); |
| 9 | |
| 10 | function triggerFilter($bool) { |
| 11 | var elementsToTrigger = $([$('.cd-filter-trigger'), $('.cd-filter'), $('.cd-tab-filter'), $('.cd-gallery')]); |
| 12 | elementsToTrigger.each(function(){ |
| 13 | $(this).toggleClass('filter-is-visible', $bool); |
| 14 | }); |
| 15 | } |
| 16 | |
| 17 | //mobile version - detect click event on filters tab |
| 18 | var filter_tab_placeholder = $('.cd-tab-filter .placeholder a'), |
| 19 | filter_tab_placeholder_default_value = 'Select', |
| 20 | filter_tab_placeholder_text = filter_tab_placeholder.text(); |
| 21 | |
| 22 | $('.cd-tab-filter li').on('click', function(event){ |
| 23 | //detect which tab filter item was selected |
| 24 | var selected_filter = $(event.target).data('type'); |
| 25 | |
| 26 | //check if user has clicked the placeholder item |
| 27 | if( $(event.target).is(filter_tab_placeholder) ) { |
| 28 | (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) ; |
| 29 | $('.cd-tab-filter').toggleClass('is-open'); |
| 30 | |
| 31 | //check if user has clicked a filter already selected |
| 32 | } else if( filter_tab_placeholder.data('type') == selected_filter ) { |
| 33 | filter_tab_placeholder.text($(event.target).text()); |
| 34 | $('.cd-tab-filter').removeClass('is-open'); |
| 35 | |
| 36 | } else { |
| 37 | //close the dropdown and change placeholder text/data-type value |
| 38 | $('.cd-tab-filter').removeClass('is-open'); |
| 39 | filter_tab_placeholder.text($(event.target).text()).data('type', selected_filter); |
| 40 | filter_tab_placeholder_text = $(event.target).text(); |
| 41 | |
| 42 | //add class selected to the selected filter item |
| 43 | $('.cd-tab-filter .selected').removeClass('selected'); |
| 44 | $(event.target).addClass('selected'); |
| 45 | } |
| 46 | }); |
| 47 | |
| 48 | //close filter dropdown inside lateral .cd-filter |
| 49 | $('.cd-filter-block h4').on('click', function(){ |
| 50 | $(this).toggleClass('closed').siblings('.cd-filter-content').slideToggle(300); |
| 51 | }) |
| 52 | |
| 53 | //fix lateral filter and gallery on scrolling |
| 54 | $(window).on('scroll', function(){ |
| 55 | (!window.requestAnimationFrame) ? fixGallery() : window.requestAnimationFrame(fixGallery); |
| 56 | }); |
| 57 | |
| 58 | function fixGallery() { |
| 59 | var offsetTop = $('.cd-main-content').offset().top, |
| 60 | scrollTop = $(window).scrollTop(); |
| 61 | ( scrollTop >= offsetTop ) ? $('.cd-main-content').addClass('is-fixed') : $('.cd-main-content').removeClass('is-fixed'); |
| 62 | } |
| 63 | |
| 64 | /************************************ |
| 65 | MitItUp filter settings |
| 66 | More details: |
| 67 | https://mixitup.kunkalabs.com/ |
| 68 | or: |
| 69 | http://codepen.io/patrickkunka/ |
| 70 | *************************************/ |
| 71 | |
| 72 | buttonFilter.init(); |
| 73 | $('.cd-gallery ul').mixItUp({ |
| 74 | controls: { |
| 75 | enable: false |
| 76 | }, |
| 77 | callbacks: { |
| 78 | onMixStart: function(){ |
| 79 | $('.cd-fail-message').fadeOut(200); |
| 80 | }, |
| 81 | onMixFail: function(){ |
| 82 | $('.cd-fail-message').fadeIn(200); |
| 83 | } |
| 84 | } |
| 85 | }); |
| 86 | |
| 87 | //search filtering |
| 88 | //credits http://codepen.io/edprats/pen/pzAdg |
| 89 | var inputText; |
| 90 | var $matching = $(); |
| 91 | |
| 92 | var delay = (function(){ |
| 93 | var timer = 0; |
| 94 | return function(callback, ms){ |
| 95 | clearTimeout (timer); |
| 96 | timer = setTimeout(callback, ms); |
| 97 | }; |
| 98 | })(); |
| 99 | |
| 100 | $(".cd-filter-content input[type='search']").keyup(function(){ |
| 101 | // Delay function invoked to make sure user stopped typing |
| 102 | delay(function(){ |
| 103 | inputText = $(".cd-filter-content input[type='search']").val().toLowerCase(); |
| 104 | // Check to see if input field is empty |
| 105 | if ((inputText.length) > 0) { |
| 106 | $('.mix').each(function() { |
| 107 | var $this = $(this); |
| 108 | |
| 109 | // add item to be filtered out if input text matches items inside the title |
| 110 | if($this.attr('class').toLowerCase().match(inputText)) { |
| 111 | $matching = $matching.add(this); |
| 112 | } else { |
| 113 | // removes any previously matched item |
| 114 | $matching = $matching.not(this); |
| 115 | } |
| 116 | }); |
| 117 | $('.cd-gallery ul').mixItUp('filter', $matching); |
| 118 | } else { |
| 119 | // resets the filter to show all item if input is empty |
| 120 | $('.cd-gallery ul').mixItUp('filter', 'all'); |
| 121 | } |
| 122 | }, 200 ); |
| 123 | }); |
| 124 | }); |
| 125 | |
| 126 | /***************************************************** |
| 127 | MixItUp - Define a single object literal |
| 128 | to contain all filter custom functionality |
| 129 | *****************************************************/ |
| 130 | var buttonFilter = { |
| 131 | // Declare any variables we will need as properties of the object |
| 132 | $filters: null, |
| 133 | groups: [], |
| 134 | outputArray: [], |
| 135 | outputString: '', |
| 136 | |
| 137 | // The "init" method will run on document ready and cache any jQuery objects we will need. |
| 138 | init: function(){ |
| 139 | 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. |
| 140 | |
| 141 | self.$filters = $('.cd-main-content'); |
| 142 | self.$container = $('.cd-gallery ul'); |
| 143 | |
| 144 | self.$filters.find('.cd-filters').each(function(){ |
| 145 | var $this = $(this); |
| 146 | |
| 147 | self.groups.push({ |
| 148 | $inputs: $this.find('.filter'), |
| 149 | active: '', |
| 150 | tracker: false |
| 151 | }); |
| 152 | }); |
| 153 | |
| 154 | self.bindHandlers(); |
| 155 | }, |
| 156 | |
| 157 | // The "bindHandlers" method will listen for whenever a button is clicked. |
| 158 | bindHandlers: function(){ |
| 159 | var self = this; |
| 160 | |
| 161 | self.$filters.on('click', 'a', function(e){ |
| 162 | self.parseFilters(); |
| 163 | }); |
| 164 | self.$filters.on('change', function(){ |
| 165 | self.parseFilters(); |
| 166 | }); |
| 167 | }, |
| 168 | |
| 169 | parseFilters: function(){ |
| 170 | var self = this; |
| 171 | |
| 172 | // loop through each filter group and grap the active filter from each one. |
| 173 | for(var i = 0, group; group = self.groups[i]; i++){ |
| 174 | group.active = []; |
| 175 | group.$inputs.each(function(){ |
| 176 | var $this = $(this); |
| 177 | if($this.is('input[type="radio"]') || $this.is('input[type="checkbox"]')) { |
| 178 | if($this.is(':checked') ) { |
| 179 | group.active.push($this.attr('data-filter')); |
| 180 | } |
| 181 | } else if($this.is('select')){ |
| 182 | group.active.push($this.val()); |
| 183 | } else if( $this.find('.selected').length > 0 ) { |
| 184 | group.active.push($this.attr('data-filter')); |
| 185 | } |
| 186 | }); |
| 187 | } |
| 188 | self.concatenate(); |
| 189 | }, |
| 190 | |
| 191 | concatenate: function(){ |
| 192 | var self = this; |
| 193 | |
| 194 | self.outputString = ''; // Reset output string |
| 195 | |
| 196 | for(var i = 0, group; group = self.groups[i]; i++){ |
| 197 | self.outputString += group.active; |
| 198 | } |
| 199 | |
| 200 | // If the output string is empty, show all rather than none: |
| 201 | !self.outputString.length && (self.outputString = 'all'); |
| 202 | |
| 203 | // Send the output string to MixItUp via the 'filter' method: |
| 204 | if(self.$container.mixItUp('isLoaded')){ |
| 205 | self.$container.mixItUp('filter', self.outputString); |
| 206 | } |
| 207 | } |
| 208 | }; |