PageSourceSearch

https://hackinggrouporg.github.io/assets/js/tooltip-extend.js

js hackinggrouporg.github.io collected 2026-10-03 09:16:12 UTC 22,045 bytes, 767 lines download raw bytes

1/*! Hugo版WebStack主题 - v2.0.0
2* https://github.com/iplaycode/webstack-hugo/ */
3var public_vars = public_vars || {};
4jQuery.extend(public_vars, {
5	breakpoints: {
6		largescreen: 	[991, -1],
7		tabletscreen: 	[768, 990],
8		devicescreen: 	[420, 767],
9		sdevicescreen:	[0, 419]
10	},
11	lastBreakpoint: null
12});
13/* Main Function that will be called each time when the screen breakpoint changes */
14function resizable(breakpoint)
15{
16	var sb_with_animation;
17	// Large Screen Specific Script
18	if(is('largescreen'))
19	{
20	}
21	// Tablet or larger screen
22	if(ismdxl())
23	{
24	}
25	// Tablet Screen Specific Script
26	if(is('tabletscreen'))
27	{
28	}
29	// Tablet device screen
30	if(is('tabletscreen'))
31	{
32		public_vars.$sidebarMenu.addClass('collapsed');
33		ps_destroy();
34	}
35	// Tablet Screen Specific Script
36	if(isxs())
37	{
38	}
39	// Trigger Event
40	jQuery(window).trigger('xenon.resize');
41}
42// Get current breakpoint
43function get_current_breakpoint()
44{
45	var width = jQuery(window).width(),
46		breakpoints = public_vars.breakpoints;
47	for(var breakpont_label in breakpoints)
48	{
49		var bp_arr = breakpoints[breakpont_label],
50			min = bp_arr[0],
51			max = bp_arr[1];
52		if(max == -1)
53			max = width;
54		if(min <= width && max >= width)
55		{
56			return breakpont_label;
57		}
58	}
59	return null;
60}
61// Check current screen breakpoint
62function is(screen_label)
63{
64	return get_current_breakpoint() == screen_label;
65}
66// Is xs device
67function isxs()
68{
69	return is('devicescreen') || is('sdevicescreen');
70}
71// Is md or xl
72function ismdxl()
73{
74	return is('tabletscreen') || is('largescreen');
75}
76// Trigger Resizable Function
77function trigger_resizable()
78{
79	if(public_vars.lastBreakpoint != get_current_breakpoint())
80	{
81		public_vars.lastBreakpoint = get_current_breakpoint();
82		resizable(public_vars.lastBreakpoint);
83	}
84	// Trigger Event (Repeated)
85	jQuery(window).trigger('xenon.resized');
86}
87
88;(function($, window, undefined)
89{
90	"use strict";
91	$(document).ready(function()
92	{
93		// Chat Toggler
94		$('a[data-toggle="chat"]').each(function(i, el)
95		{
96			$(el).on('click', function(ev)
97			{
98				ev.preventDefault();
99				public_vars.$body.toggleClass('chat-open');
100				if($.isFunction($.fn.perfectScrollbar))
101				{
102					setTimeout(function()
103					{
104						public_vars.$chat.find('.chat_inner').perfectScrollbar('update');
105						$(window).trigger('xenon.resize');
106					}, 1);
107				}
108			});
109		});
110		// Settings Pane Toggler
111		$('a[data-toggle="settings-pane"]').each(function(i, el)
112		{
113			$(el).on('click', function(ev)
114			{
115				ev.preventDefault();
116				var use_animation = attrDefault($(el), 'animate', false) && ! isxs();
117				var scroll = {
118					top: $(document).scrollTop(),
119					toTop: 0
120				};
121				if(public_vars.$body.hasClass('settings-pane-open'))
122				{
123					scroll.toTop = scroll.top;
124				}
125				TweenMax.to(scroll, (use_animation ? .1 : 0), {top: scroll.toTop, roundProps: ['top'], ease: scroll.toTop < 10 ? null : Sine.easeOut, onUpdate: function()
126					{
127						$(window).scrollTop( scroll.top );
128					},
129					onComplete: function()
130					{
131						if(use_animation)
132						{
133							// With Animation
134							public_vars.$settingsPaneIn.addClass('with-animation');
135							// Opening
136							if( ! public_vars.$settingsPane.is(':visible'))
137							{
138								public_vars.$body.addClass('settings-pane-open');
139								var height = public_vars.$settingsPane.outerHeight(true);
140								public_vars.$settingsPane.css({
141									height: 0
142								});
143								TweenMax.to(public_vars.$settingsPane, .25, {css: {height: height}, ease: Circ.easeInOut, onComplete: function()
144								{
145									public_vars.$settingsPane.css({height: ''});
146								}});
147								public_vars.$settingsPaneIn.addClass('visible');
148							}
149							// Closing
150							else
151							{
152								public_vars.$settingsPaneIn.addClass('closing');
153								TweenMax.to(public_vars.$settingsPane, .25, {css: {height: 0}, delay: .15, ease: Power1.easeInOut, onComplete: function()
154								{
155									public_vars.$body.removeClass('settings-pane-open');
156									public_vars.$settingsPane.css({height: ''});
157									public_vars.$settingsPaneIn.removeClass('closing visible');
158								}});
159							}
160						}
161						else
162						{
163							// Without Animation
164							public_vars.$body.toggleClass('settings-pane-open');
165							public_vars.$settingsPaneIn.removeClass('visible');
166							public_vars.$settingsPaneIn.removeClass('with-animation');
167						}
168					}
169				});
170			});
171		});
172		// Sidebar Toggle
173		$('a[data-toggle="sidebar"]').each(function(i, el)
174		{
175			$(el).on('click', function(ev)
176			{
177				ev.preventDefault();
178				if(public_vars.$sidebarMenu.hasClass('collapsed'))
179				{
180					public_vars.$sidebarMenu.removeClass('collapsed');
181					ps_init();
182				}
183				else
184				{
185					public_vars.$sidebarMenu.addClass('collapsed');
186					ps_destroy();
187				}
188				$(window).trigger('xenon.resize');
189			});
190		});
191		// Mobile Menu Trigger
192		$('a[data-toggle="mobile-menu"]').on('click', function(ev)
193		{
194			ev.preventDefault();
195			public_vars.$mainMenu.add(public_vars.$sidebarProfile).toggleClass('mobile-is-visible');
196            if($("#main-menu").hasClass('mobile-is-visible') === true){
197				public_vars.$sidebarMenu.removeClass('collapsed');
198                $(".sidebar-menu-inner").css("max-height",window.innerHeight);
199                ps_init();
200            }
201            else{
202                ps_destroy();
203            }
204		});
205		// Mobile Menu Trigger for Horizontal Menu
206		$('a[data-toggle="mobile-menu-horizontal"]').on('click', function(ev)
207		{
208			ev.preventDefault();
209			public_vars.$horizontalMenu.toggleClass('mobile-is-visible');
210		});
211		// Mobile Menu Trigger for Sidebar & Horizontal Menu
212		$('a[data-toggle="mobile-menu-both"]').on('click', function(ev)
213		{
214			ev.preventDefault();
215			public_vars.$mainMenu.toggleClass('mobile-is-visible both-menus-visible');
216			public_vars.$horizontalMenu.toggleClass('mobile-is-visible both-menus-visible');
217		});
218		// Mobile User Info Menu Trigger
219		$('a[data-toggle="user-info-menu"]').on('click', function(ev)
220		{
221			ev.preventDefault();
222			public_vars.$userInfoMenu.toggleClass('mobile-is-visible');
223		});
224		// Mobile User Info Menu Trigger for Horizontal Menu
225		$('a[data-toggle="user-info-menu-horizontal"]').on('click', function(ev)
226		{
227			ev.preventDefault();
228			public_vars.$userInfoMenuHor.find('.nav.nav-userinfo').toggleClass('mobile-is-visible');
229		});
230		// Panel Close
231		$('body').on('click', '.panel a[data-toggle="remove"]', function(ev)
232		{
233			ev.preventDefault();
234			var $panel = $(this).closest('.panel'),
235				$panel_parent = $panel.parent();
236			$panel.remove();
237			if($panel_parent.children().length == 0)
238			{
239				$panel_parent.remove();
240			}
241		});
242		// Panel Reload
243		$('body').on('click', '.panel a[data-toggle="reload"]', function(ev)
244		{
245			ev.preventDefault();
246			var $panel = $(this).closest('.panel');
247			// This is just a simulation, nothing is going to be reloaded
248			$panel.append('<div class="panel-disabled"><div class="loader-1"></div></div>');
249			var $pd = $panel.find('.panel-disabled');
250			setTimeout(function()
251			{
252				$pd.fadeOut('fast', function()
253				{
254					$pd.remove();
255				});
256			}, 500 + 300 * (Math.random() * 5));
257		});
258		// Panel Expand/Collapse Toggle
259		$('body').on('click', '.panel a[data-toggle="panel"]', function(ev)
260		{
261			ev.preventDefault();
262			var $panel = $(this).closest('.panel');
263			$panel.toggleClass('collapsed');
264		});
265		// Loading Text toggle
266		$('[data-loading-text]').each(function(i, el) // Temporary for demo purpose only
267		{
268			var $this = $(el);
269			$this.on('click', function(ev)
270			{
271				$this.button('loading');
272				setTimeout(function(){ $this.button('reset'); }, 1800);
273			});
274		});
275		// Popovers and tooltips
276		$('[data-toggle="popover"]').each(function(i, el)
277		{
278			var $this = $(el),
279				placement = attrDefault($this, 'placement', 'right'),
280				trigger = attrDefault($this, 'trigger', 'click'),
281				popover_class = $this.get(0).className.match(/(popover-[a-z0-9]+)/i);
282			$this.popover({
283				placement: placement,
284				trigger: trigger
285			});
286			if(popover_class)
287			{
288				$this.removeClass(popover_class[1]);
289				$this.on('show.bs.popover', function(ev)
290				{
291					setTimeout(function()
292					{
293						var $popover = $this.next();
294						$popover.addClass(popover_class[1]);
295					}, 0);
296				});
297			}
298		});
299		$('[data-toggle="tooltip"]').each(function(i, el)
300		{
301			var $this = $(el),
302				placement = attrDefault($this, 'placement', 'top'),
303				trigger = attrDefault($this, 'trigger', 'hover'),
304				tooltip_class = $this.get(0).className.match(/(tooltip-[a-z0-9]+)/i);
305			$this.tooltip({
306				placement: placement,
307				trigger: trigger
308			});
309			if(tooltip_class)
310			{
311				$this.removeClass(tooltip_class[1]);
312				$this.on('show.bs.tooltip', function(ev)
313				{
314					setTimeout(function()
315					{
316						var $tooltip = $this.next();
317						$tooltip.addClass(tooltip_class[1]);
318					}, 0);
319				});
320			}
321		});
322	});
323})(jQuery, window);
324
325/**
326 *	Xenon Main
327 *
328 **/
329var public_vars = public_vars || {};
330;(function($, window, undefined){
331	"use strict";
332	$(document).ready(function()
333	{
334		// Main Vars
335		public_vars.$body                 = $("body");
336		public_vars.$pageContainer        = public_vars.$body.find(".page-container");
337		public_vars.$chat                 = public_vars.$pageContainer.find("#chat");
338		public_vars.$sidebarMenu          = public_vars.$pageContainer.find('.sidebar-menu');
339		public_vars.$sidebarProfile       = public_vars.$sidebarMenu.find('.sidebar-user-info');
340		public_vars.$mainMenu             = public_vars.$sidebarMenu.find('.main-menu');
341		public_vars.$horizontalNavbar     = public_vars.$body.find('.navbar.horizontal-menu');
342		public_vars.$horizontalMenu       = public_vars.$horizontalNavbar.find('.navbar-nav');
343		public_vars.$mainContent          = public_vars.$pageContainer.find('.main-content');
344		public_vars.$mainFooter           = public_vars.$body.find('footer.main-footer');
345		public_vars.$userInfoMenuHor      = public_vars.$body.find('.navbar.horizontal-menu');
346		public_vars.$userInfoMenu         = public_vars.$body.find('nav.navbar.user-info-navbar');
347		public_vars.$settingsPane         = public_vars.$body.find('.settings-pane');
348		public_vars.$settingsPaneIn       = public_vars.$settingsPane.find('.settings-pane-inner');
349		public_vars.wheelPropagation      = true; // used in Main menu (sidebar)
350		public_vars.$pageLoadingOverlay   = public_vars.$body.find('.page-loading-overlay');
351		public_vars.defaultColorsPalette = ['#68b828','#7c38bc','#0e62c7','#fcd036','#4fcdfc','#00b19d','#ff6264','#f7aa47'];
352		// Setup Sidebar Menu
353		setup_sidebar_menu();
354		// Setup Horizontal Menu
355		setup_horizontal_menu();
356		// Sticky Footer
357		if(public_vars.$mainFooter.hasClass('sticky'))
358		{
359			stickFooterToBottom();
360			$(window).on('xenon.resized', stickFooterToBottom);
361		}
362		// Perfect Scrollbar
363		if($.isFunction($.fn.perfectScrollbar))
364		{
365			if(public_vars.$sidebarMenu.hasClass('fixed'))
366				ps_init();
367			$(".ps-scrollbar").each(function(i, el)
368			{
369				var $el = $(el);
370				if($el.hasClass('ps-scroll-down'))
371				{
372					$el.scrollTop($el.prop('scrollHeight'));
373				}
374				$el.perfectScrollbar({
375					wheelPropagation: false
376				});
377			});
378			// Chat Scrollbar
379			var $chat_inner = public_vars.$pageContainer.find('#chat .chat-inner');
380			if($chat_inner.parent().hasClass('fixed'))
381				$chat_inner.css({maxHeight: $(window).height()}).perfectScrollbar();
382			// User info opening dropdown trigger PS update
383			$(".dropdown:has(.ps-scrollbar)").each(function(i, el)
384			{
385				var $scrollbar = $(this).find('.ps-scrollbar');
386				$(this).on('click', '[data-toggle="dropdown"]', function(ev)
387				{
388					ev.preventDefault();
389					setTimeout(function()
390					{
391						$scrollbar.perfectScrollbar('update');
392					}, 1);
393				});
394			});
395			// Scrollable
396			$("div.scrollable").each(function(i, el)
397			{
398				var $this = $(el),
399					max_height = parseInt(attrDefault($this, 'max-height', 200), 10);
400				max_height = max_height < 0 ? 200 : max_height;
401				$this.css({maxHeight: max_height}).perfectScrollbar({
402					wheelPropagation: true
403				});
404			});
405		}
406		// Go to top links
407		$('body').on('click', 'a[rel="go-top"]', function(ev)
408		{
409			ev.preventDefault();
410			var obj = {pos: $(window).scrollTop()};
411			TweenLite.to(obj, .3, {pos: 0, ease:Power4.easeOut, onUpdate: function()
412			{
413				$(window).scrollTop(obj.pos);
414			}});
415		});
416		// Auto hidden breadcrumbs
417		$(".breadcrumb.auto-hidden").each(function(i, el)
418		{
419			var $bc = $(el),
420				$as = $bc.find('li a'),
421				collapsed_width = $as.width(),
422				expanded_width = 0;
423			$as.each(function(i, el)
424			{
425				var $a = $(el);
426				expanded_width = $a.outerWidth(true) + 5;
427				$a.addClass('collapsed').width(expanded_width);
428				$a.hover(function()
429				{
430					$a.removeClass('collapsed');
431				},
432				function()
433				{
434					$a.addClass('collapsed');
435				});
436			});
437		});
438	});
439	// Enable/Disable Resizable Event
440	var wid = 0;
441	$(window).resize(function() {
442		clearTimeout(wid);
443		wid = setTimeout(trigger_resizable, 200);
444	});
445})(jQuery, window);
446// Sideber Menu Setup function
447var sm_duration = .2,
448	sm_transition_delay = 150;
449function setup_sidebar_menu()
450{
451	if(public_vars.$sidebarMenu.length)
452	{
453		var $items_with_subs = public_vars.$sidebarMenu.find('li:has(> ul)'),
454			toggle_others = public_vars.$sidebarMenu.hasClass('toggle-others');
455		$items_with_subs.filter('.active').addClass('expanded');
456		// On larger screens collapse sidebar when the window is tablet screen
457		if(is('largescreen') && public_vars.$sidebarMenu.hasClass('collapsed') == false)
458		{
459			$(window).on('resize', function()
460			{
461				if(is('tabletscreen'))
462				{
463					public_vars.$sidebarMenu.addClass('collapsed');
464					ps_destroy();
465				}
466				else
467				if(is('largescreen'))
468				{
469					public_vars.$sidebarMenu.removeClass('collapsed');
470					ps_init();
471				}
472			});
473		}
474		$items_with_subs.each(function(i, el)
475		{
476			var $li = jQuery(el),
477				$a = $li.children('a'),
478				$sub = $li.children('ul');
479			$li.addClass('has-sub');
480			$a.on('click', function(ev)
481			{
482				ev.preventDefault();
483				if(toggle_others)
484				{
485					sidebar_menu_close_items_siblings($li);
486				}
487				if($li.hasClass('expanded') || $li.hasClass('opened'))
488					sidebar_menu_item_collapse($li, $sub);
489				else
490					sidebar_menu_item_expand($li, $sub);
491			});
492		});
493	}
494}
495function sidebar_menu_item_expand($li, $sub)
496{
497	/* 修复左侧栏不展开时点击图标显示异常 - shenweiyan.2022.09.30 - start
498	if($li.data('is-busy') || ($li.parent('.main-menu').length && public_vars.$sidebarMenu.hasClass('collapsed')))
499		return;
500	$li.addClass('expanded').data('is-busy', true);
501	$sub.show();
502	var $sub_items 	  = $sub.children(),
503		sub_height	= $sub.outerHeight(),
504		win_y			 = jQuery(window).height(),
505		total_height	  = $li.outerHeight(),
506		current_y		 = public_vars.$sidebarMenu.scrollTop(),
507		item_max_y		= $li.position().top + current_y,
508		fit_to_viewpport  = public_vars.$sidebarMenu.hasClass('fit-in-viewport');
509	$sub_items.addClass('is-hidden');
510	$sub.height(0);
511	TweenMax.to($sub, sm_duration, {css: {height: sub_height}, onUpdate: ps_update, onComplete: function(){
512		$sub.height('');
513	}});
514	var interval_1 = $li.data('sub_i_1'),
515		interval_2 = $li.data('sub_i_2');
516	window.clearTimeout(interval_1);
517	interval_1 = setTimeout(function()
518	{
519		$sub_items.each(function(i, el)
520		{
521			var $sub_item = jQuery(el);
522			$sub_item.addClass('is-shown');
523		});
524		var finish_on = sm_transition_delay * $sub_items.length,
525			t_duration = parseFloat($sub_items.eq(0).css('transition-duration')),
526			t_delay = parseFloat($sub_items.last().css('transition-delay'));
527		if(t_duration && t_delay)
528		{
529			finish_on = (t_duration + t_delay) * 1000;
530		}
531		// In the end
532		window.clearTimeout(interval_2);
533		interval_2 = setTimeout(function()
534		{
535			$sub_items.removeClass('is-hidden is-shown');
536		}, finish_on);
537		$li.data('is-busy', false);
538	}, 0);
539	$li.data('sub_i_1', interval_1),
540	$li.data('sub_i_2', interval_2);
541	// 修复左侧栏不展开时点击图标显示异常 - shenweiyan.2022.09.30 - end
542        */
543}
544function sidebar_menu_item_collapse($li, $sub)
545{
546	if($li.data('is-busy'))
547		return;
548	var $sub_items = $sub.children();
549	$li.removeClass('expanded').data('is-busy', true);
550	$sub_items.addClass('hidden-item');
551	TweenMax.to($sub, sm_duration, {css: {height: 0}, onUpdate: ps_update, onComplete: function()
552	{
553		$li.data('is-busy', false).removeClass('opened');
554		$sub.attr('style', '').hide();
555		$sub_items.removeClass('hidden-item');
556		$li.find('li.expanded ul').attr('style', '').hide().parent().removeClass('expanded');
557		ps_update(true);
558	}});
559}
560function sidebar_menu_close_items_siblings($li)
561{
562	$li.siblings().not($li).filter('.expanded, .opened').each(function(i, el)
563	{
564		var $_li = jQuery(el),
565			$_sub = $_li.children('ul');
566		sidebar_menu_item_collapse($_li, $_sub);
567	});
568}
569// Horizontal Menu
570function setup_horizontal_menu()
571{
572	if(public_vars.$horizontalMenu.length)
573	{
574		var $items_with_subs = public_vars.$horizontalMenu.find('li:has(> ul)'),
575			click_to_expand = public_vars.$horizontalMenu.hasClass('click-to-expand');
576		if(click_to_expand)
577		{
578			public_vars.$mainContent.add( public_vars.$sidebarMenu ).on('click', function(ev)
579			{
580				$items_with_subs.removeClass('hover');
581			});
582		}
583		$items_with_subs.each(function(i, el)
584		{
585			var $li = jQuery(el),
586				$a = $li.children('a'),
587				$sub = $li.children('ul'),
588				is_root_element = $li.parent().is('.navbar-nav');
589			$li.addClass('has-sub');
590			// Mobile Only
591			$a.on('click', function(ev)
592			{
593				if(isxs())
594				{
595					ev.preventDefault();
596					// Automatically will toggle other menu items in mobile view
597					if(true)
598					{
599						sidebar_menu_close_items_siblings($li);
600					}
601					if($li.hasClass('expanded') || $li.hasClass('opened'))
602						sidebar_menu_item_collapse($li, $sub);
603					else
604						sidebar_menu_item_expand($li, $sub);
605				}
606			});
607			// Click To Expand
608			if(click_to_expand)
609			{
610				$a.on('click', function(ev)
611				{
612					ev.preventDefault();
613					if(isxs())
614						return;
615					// For parents only
616					if(is_root_element)
617					{
618						$items_with_subs.filter(function(i, el){ return jQuery(el).parent().is('.navbar-nav'); }).not($li).removeClass('hover');
619						$li.toggleClass('hover');
620					}
621					// Sub menus
622					else
623					{
624						var sub_height;
625						// To Expand
626						if($li.hasClass('expanded') == false)
627						{
628							$li.addClass('expanded');
629							$sub.addClass('is-visible');
630							sub_height = $sub.outerHeight();
631							$sub.height(0);
632							TweenLite.to($sub, .15, {css: {height: sub_height}, ease: Sine.easeInOut, onComplete: function(){ $sub.attr('style', ''); }});
633							// Hide Existing in the list
634							$li.siblings().find('> ul.is-visible').not($sub).each(function(i, el)
635							{
636								var $el = jQuery(el);
637								sub_height = $el.outerHeight();
638								$el.removeClass('is-visible').height(sub_height);
639								$el.parent().removeClass('expanded');
640								TweenLite.to($el, .15, {css: {height: 0}, onComplete: function(){ $el.attr('style', ''); }});
641							});
642						}
643						// To Collapse
644						else
645						{
646							sub_height = $sub.outerHeight();
647							$li.removeClass('expanded');
648							$sub.removeClass('is-visible').height(sub_height);
649							TweenLite.to($sub, .15, {css: {height: 0}, onComplete: function(){ $sub.attr('style', ''); }});
650						}
651					}
652				});
653			}
654			// Hover To Expand
655			else
656			{
657				$li.hoverIntent({
658					over: function()
659					{
660						if(isxs())
661							return;
662						if(is_root_element)
663						{
664							$li.addClass('hover');
665						}
666						else
667						{
668							$sub.addClass('is-visible');
669							sub_height = $sub.outerHeight();
670							$sub.height(0);
671							TweenLite.to($sub, .25, {css: {height: sub_height}, ease: Sine.easeInOut, onComplete: function(){ $sub.attr('style', ''); }});
672						}
673					},
674					out: function()
675					{
676						if(isxs())
677							return;
678						if(is_root_element)
679						{
680							$li.removeClass('hover');
681						}
682						else
683						{
684							sub_height = $sub.outerHeight();
685							$li.removeClass('expanded');
686							$sub.removeClass('is-visible').height(sub_height);
687							TweenLite.to($sub, .25, {css: {height: 0}, onComplete: function(){ $sub.attr('style', ''); }});
688						}
689					},
690					timeout: 200,
691					interval: is_root_element ? 10 : 100
692				});
693			}
694		});
695	}
696}
697function stickFooterToBottom()
698{
699	public_vars.$mainFooter.add( public_vars.$mainContent ).add( public_vars.$sidebarMenu ).attr('style', '');
700	if(isxs())
701		return false;
702	if(public_vars.$mainFooter.hasClass('sticky'))
703	{
704		var win_height				 = jQuery(window).height(),
705			footer_height			= public_vars.$mainFooter.outerHeight(true),
706			main_content_height	  = public_vars.$mainFooter.position().top + footer_height,
707			main_content_height_only = main_content_height - footer_height,
708			extra_height			 = public_vars.$horizontalNavbar.outerHeight();
709		if(win_height > main_content_height - parseInt(public_vars.$mainFooter.css('marginTop'), 10))
710		{
711			public_vars.$mainFooter.css({
712				marginTop: win_height - main_content_height - extra_height
713			});
714		}
715	}
716}
717// Perfect scroll bar functions by Arlind Nushi
718function ps_update(destroy_init)
719{
720	//if(isxs())
721	//	return;
722	if(jQuery.isFunction(jQuery.fn.perfectScrollbar))
723	{
724		if(public_vars.$sidebarMenu.hasClass('collapsed'))
725		{
726			return;
727		}
728		public_vars.$sidebarMenu.find('.sidebar-menu-inner').perfectScrollbar('update');
729		if(destroy_init)
730		{
731			ps_destroy();
732			ps_init();
733		}
734	}
735}
736function ps_init()
737{
738	//if(isxs())
739	//	return;
740	if(jQuery.isFunction(jQuery.fn.perfectScrollbar))
741	{
742		if(public_vars.$sidebarMenu.hasClass('collapsed') || ! public_vars.$sidebarMenu.hasClass('fixed'))
743		{
744			return;
745		}
746		public_vars.$sidebarMenu.find('.sidebar-menu-inner').perfectScrollbar({
747			wheelSpeed: 1,
748			wheelPropagation: public_vars.wheelPropagation
749		});
750	}
751}
752function ps_destroy()
753{
754	if(jQuery.isFunction(jQuery.fn.perfectScrollbar))
755	{
756		public_vars.$sidebarMenu.find('.sidebar-menu-inner').perfectScrollbar('destroy');
757	}
758}
759// Element Attribute Helper
760function attrDefault($el, data_var, default_val)
761{
762	if(typeof $el.data(data_var) != 'undefined')
763	{
764		return $el.data(data_var);
765	}
766	return default_val;
767}

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.