PageSourceSearch

https://cohousingalliance.org/wp-content/themes/buddyboss-theme/assets/js/plugins/bbp-scrubber.js?ver=2.20.0

js cohousingalliance.org collected 2026-10-02 16:52:04 UTC 10,881 bytes, 332 lines download raw bytes

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.