1(function ($) { 2 3 'use strict'; 4 5 window.BuddyBossThemeBbpScrubber = { 6 7 scrubbers : [], 8 9 init: function () { 10 var self = window.BuddyBossThemeBbpScrubber; 11 var $scrubbers = $('.scrubber'); 12 13 $scrubbers.each(function(i,scrubber){ 14 var scrubber_key = $(scrubber).data('key'); 15 var $bbpress_forums_elem = $(scrubber).closest('#bbpress-forums'); 16 var scrubber_height = $(scrubber).find('#reply-timeline-container').outerHeight(); 17 self.scrubbers[scrubber_key] = { 18 total: $bbpress_forums_elem.find('.scrubberpost').length, 19 onscroll_update: true, 20 scrubber_height_usable: scrubber_height - $(scrubber).find('#handle').outerHeight(), 21 scrubber_height: scrubber_height, 22 currentnum: 1, 23 scrolltimer: null, 24 handleani: null, // keep handle any end event. 25 draggie: null, 26 total_item: $( scrubber ).data( 'total-item' ), 27 total_page: parseInt( $( scrubber ).data( 'total-page' ), 10 ), 28 current_page: parseInt( $( scrubber ).data( 'current-page' ), 10 ), 29 from: parseInt( $( scrubber ).data( 'from' ), 10 ), 30 to: parseInt( $( scrubber ).data( 'to' ), 10 ), 31 }; 32 33 if ( self.scrubbers[ scrubber_key ].total >= 10 ) { 34 $( scrubber ).removeClass( 'light' ); 35 } 36 37 self.init_draggabilly(scrubber_key); 38 }); 39 40 window.addEventListener('scroll', self.onScrubberScroll); 41 42 $('.scrubber').on('click', '.firstpostbtn', function (e) { 43 e.preventDefault(); 44 var scrubber_key = $(e.target).closest('.scrubber').data('key'); 45 self.goToPost(1, 'first',scrubber_key); 46 }); 47 48 $('.scrubber').on('click', '.lastpostbtn', function (e) { 49 e.preventDefault(); 50 var scrubber_key = $(e.target).closest('.scrubber').data('key'); 51 self.goToPost(self.scrubbers[scrubber_key].total, 'last',scrubber_key); 52 }); 53 }, 54 55 init_draggabilly: function (scrubber_key) { 56 var self = window.BuddyBossThemeBbpScrubber; 57 var $scrubber = $('.scrubber[data-key="'+scrubber_key+'"]'); 58 59 if ( ! $scrubber.length ) { 60 return false; 61 } 62 63 self.scrubbers[scrubber_key].draggie = $scrubber.find('#handle').draggabilly({ 64 axis: 'y', 65 grid: [1, 1], 66 containment: $scrubber.find('#reply-timeline-container') 67 }); 68 69 self.scrubbers[scrubber_key].draggie.on('dragEnd', function () { 70 // make sure handle is not in animate mode. 71 $scrubber.find('#handle').removeClass('animate'); 72 73 var index = ''; 74 if (self.scrubbers[scrubber_key].currentnum === 1) { 75 index = 'first'; 76 } else if (self.scrubbers[scrubber_key].currentnum === self.scrubbers[scrubber_key].total) { 77 index = 'last'; 78 } 79 self.goToPost(self.scrubbers[scrubber_key].currentnum, index,scrubber_key); 80 81 }); 82 83 self.scrubbers[scrubber_key].draggie.on('dragMove', function () { 84 self.update_move(scrubber_key); 85 }); 86 87 self.scrubbers[scrubber_key].draggie.on('scroll', function () { 88 self.update_move(scrubber_key); 89 }); 90 91 self.updateDataOnFront(scrubber_key); 92 }, 93 94 updateDataOnFront: function ( scrubber_key ) { 95 var self = window.BuddyBossThemeBbpScrubber; 96 var $scrubber = $( '.scrubber[data-key="' + scrubber_key + '"]' ); 97 98 if ( ! $scrubber.length ) { 99 return false; 100 } 101 102 var list = []; 103 for ( var i = self.scrubbers[ scrubber_key ].from; i <= self.scrubbers[ scrubber_key ].to; i++ ) { 104 list.push( i.toLocaleString( 'en-US' ) ); 105 } 106 107 if ( self.scrubbers[ scrubber_key ].total_page > 1 ) { 108 if ( 1 === self.scrubbers[ scrubber_key ].current_page ) { 109 $( '.lastpostbtn svg' ).next().html( '' ); 110 } else if ( self.scrubbers[ scrubber_key ].current_page === self.scrubbers[ scrubber_key ].total_page ) { 111 $( '.firstpostbtn svg' ).next().html( '' ); 112 } else if ( self.scrubbers[ scrubber_key ].current_page > 1 && self.scrubbers[ scrubber_key ].current_page < self.scrubbers[ scrubber_key ].total_page ) { 113 $( '.firstpostbtn svg' ).next().html( '' ); 114 $( '.lastpostbtn svg' ).next().html( '' ); 115 } 116 } 117 118 self.scrubbers[ scrubber_key ].total = $scrubber.closest( '#bbpress-forums' ).find( '.scrubberpost' ).length; 119 $scrubber.find( '#currentpost' ).text( list[ self.scrubbers[ scrubber_key ].currentnum - 1 ] ); 120 $scrubber.find( '#totalposts' ).text( self.scrubbers[ scrubber_key ].total_item ); 121 122 var $current_element = $scrubber.closest( '#bbpress-forums' ).find( '.scrubberpost' ).eq( self.scrubbers[ scrubber_key ].currentnum - 1 ); 123 $scrubber.find( '#date' ).text( $current_element.data( 'date' ) ); 124 }, 125 126 goToPost: function (post, index, scrubber_key) { 127 var self = window.BuddyBossThemeBbpScrubber; 128 129 var $scrubber = $('.scrubber[data-key="'+scrubber_key+'"]'); 130 131 if ( ! $scrubber.length ) { 132 return false;
133 } 134 135 var elements = $scrubber.closest('#bbpress-forums').find('.scrubberpost'); 136 137 if (!elements.length) { 138 return false; 139 } 140 141 self.scrubbers[scrubber_key].total = elements.length; 142 self.scrubbers[scrubber_key].currentnum = post; 143 144 if ((post > elements.length) || self.scrubbers[scrubber_key].total !== 1 && post === self.scrubbers[scrubber_key].total) { 145 post = self.scrubbers[scrubber_key].total - 1; 146 index = 'last'; 147 } else if (post === 1 && index !== 'last') { 148 post = 0; 149 index = 'first'; 150 } else if (post === 1 && index === 'last') { 151 post = 0; 152 } else { 153 post = post - 1; 154 } 155 156 if (post === 0) { 157 self.scrubbers[scrubber_key].currentnum = post + 1; // update the num depending on last one index. 158 } else if (post === self.total) { 159 self.scrubbers[scrubber_key].currentnum = self.scrubbers[scrubber_key].total; 160 } 161 162 var force = false; 163 if (index === 'last') { 164 post = self.scrubbers[scrubber_key].total - 1; 165 } else if (index === 'first') { 166 post = 0; 167 force = true; 168 } 169 170 self.scrubbers[scrubber_key].onscroll_update = false; // disable on scroll update 171 172 var ele = 0; 173 if (typeof elements[post] === 'undefined') { 174 ele = elements[elements.length]; 175 } else { 176 ele = elements[post]; 177 178 // Highlight Post 179 $(ele).parent().addClass('highlight'); 180 } 181 182 self.update_handle(force,scrubber_key); 183 184 $('html, body').animate({ 185 scrollTop: $(ele).offset().top - (window.innerHeight / 2) 186 }, 600, function () { 187 188 // Remove Post Highlight 189 setTimeout(function () { 190 $(ele).parent().removeClass('highlight'); 191 self.scrubbers[scrubber_key].onscroll_update = true; // enable on scroll update 192 }, 200); 193 194 }); 195 196 }, 197 198 update_move: function (scrubber_key) { 199 var self = window.BuddyBossThemeBbpScrubber; 200 201 var $scrubber = $('.scrubber[data-key="'+scrubber_key+'"]'); 202 203 if ( ! $scrubber.length ) { 204 return false; 205 } 206 207 self.scrubbers[scrubber_key].total = $scrubber.closest('#bbpress-forums').find('.scrubberpost').length; 208 self.scrubbers[scrubber_key].scrubber_height_usable = self.scrubbers[scrubber_key].scrubber_height - $scrubber.find('#handle').outerHeight(); 209 210 // calculating correct y pos of handler. 211 var total_val = self.scrubbers[scrubber_key].scrubber_height_usable; 212 var transform_top = $scrubber.find('#handle')[0].style.transform.split(',')[1]; 213 transform_top = typeof transform_top !== 'undefined' ? transform_top : 0; 214 var correct_y = parseFloat($scrubber.find('#handle')[0].style.top) + parseFloat(transform_top); 215 var each_row_size = parseFloat(total_val / self.scrubbers[scrubber_key].total); 216 217 for (var i = 1; i <= self.scrubbers[scrubber_key].total; i++) { 218 219 if ( 220 (each_row_size * i) > correct_y && 221 (each_row_size * (i - 1)) < correct_y 222 ) { 223 self.scrubbers[scrubber_key].currentnum = i; // update current screen. 224 self.updateDataOnFront(scrubber_key); 225 } 226 227 } 228 229 }, 230 231 /** 232 * update position of handle depending on current num. 233 */ 234 update_handle: function (force,scrubber_key) { 235 236 var self = window.BuddyBossThemeBbpScrubber; 237 var $scrubber = $('.scrubber[data-key="'+scrubber_key+'"]'); 238 239 if ( ! $scrubber.length ) { 240 return false; 241 } 242 243 var handle = $scrubber.find('#handle'); 244 245 if (!handle.length) { 246 return false; 247 } 248 249 self.updateDataOnFront(scrubber_key); 250 self.scrubbers[scrubber_key].scrubber_height_usable = self.scrubbers[scrubber_key].scrubber_height - handle.outerHeight(); 251 252 var total_val = self.scrubbers[scrubber_key].scrubber_height_usable; 253 var each_row_size = total_val / self.scrubbers[scrubber_key].total; 254 if (self.scrubbers[scrubber_key].currentnum === 1 && (self.scrubbers[scrubber_key].total !== 1 || force)) { 255 each_row_size = 0; 256 } 257 258 handle.addClass('animate'); 259 handle.css('top', each_row_size * (self.scrubbers[scrubber_key].currentnum) + 'px'); 260 261 clearTimeout(self.scrubbers[scrubber_key].handleani); 262 self.scrubbers[scrubber_key].handleani = setTimeout(function () { 263 if (!handle.length) { 264 handle.removeClass('animate'); 265 } 266 }, 2000); 267 268 }, 269 270 onScrubberScroll: function () { 271 var self = window.BuddyBossThemeBbpScrubber; 272 273 var $scrubbers = $('.scrubber'); 274 275 $scrubbers.each(function(j,scrubber){ 276 var scrubber_key = $(scrubber).data('key'); 277 278 // if scroll update if false by force then don't do anything 279 if (!self.scrubbers[scrubber_key].onscroll_update) { 280 return false;
281 } 282 283 var elements = $(scrubber).closest('#bbpress-forums').find('.scrubberpost'); 284 285 if (!elements.length) { 286 return false; 287 } 288 289 // check if scroll is less than first element, set to first element 290 if ((window.scrollY + window.innerHeight.height / 2) < elements[0].getBoundingClientRect().y || window.scrollY === 0) { 291 self.scrubbers[scrubber_key].currentnum = 1; 292 self.update_handle(true,scrubber_key); 293 return false; 294 } 295 296 // check if document scroll height is matched with current scroll, set to last element 297 if ((window.scrollY + window.innerHeight) >= document.body.scrollHeight ) { 298 self.scrubbers[scrubber_key].currentnum = self.scrubbers[scrubber_key].total; 299 var force = self.scrubbers[scrubber_key].total === 1 ? false : true; 300 self.update_handle(force,scrubber_key); 301 return false; 302 } 303 304 // check all elements top position and return element which has top less than half of window height 305 var inViewLast = self.scrubbers[scrubber_key].currentnum; 306 var update = false; 307 for (var i = 0; i < elements.length; i++) { 308 if (elements[i].getBoundingClientRect().y < (window.innerHeight / 2)) { 309 update = true; 310 inViewLast = i; // always overwrite so store last. 311 } 312 } 313 314 // if return number is more than total element on page, return last 315 if ((inViewLast + 1) > self.scrubbers[scrubber_key].total) { 316 inViewLast = self.scrubbers[scrubber_key].total - 1; 317 } 318 319 if (update) { 320 self.scrubbers[scrubber_key].currentnum = inViewLast + 1; // update the num depending on last one index. 321 self.update_handle(false,scrubber_key); 322 } 323 }); 324 } 325 326 }; 327 328 $( function() { 329 window.BuddyBossThemeBbpScrubber.init(); 330 }); 331 332})(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.