PageSourceSearch

https://ericcarmen.com/js/main.js

js ericcarmen.com collected 2026-10-02 09:57:03 UTC 41,716 bytes, 1,315 lines download raw bytes

1"use strict";
2//Wrapping all JavaScript code into a IIFE function for prevent global variables creation
3(function(){
4
5var $body = jQuery('body');
6var $window = jQuery(window);
7
8//hidding menu elements that do not fit in menu width
9//processing center logo
10function menuHideExtraElements() {
11	
12	//cleaneng changed elements
13	jQuery('.sf-more-li, .sf-logo-li').remove();
14	var windowWidth = jQuery('body').innerWidth();
15	
16	jQuery('.sf-menu').each(function(){
17		var $thisMenu = jQuery(this);
18		var $menuWraper = $thisMenu.closest('.mainmenu_wrapper');
19		$menuWraper.attr('style', '');
20		if (windowWidth > 991) {
21			//grab all main menu first level items 
22			var $menuLis = $menuWraper.find('.sf-menu > li');
23			$menuLis.removeClass('sf-md-hidden');
24
25			var $headerLogoCenter = $thisMenu.closest('.header_logo_center');
26			var logoWidth = 0;
27			var summaryLiWidth = 0;
28			
29			if ( $headerLogoCenter.length ) {
30				var $logo = $headerLogoCenter.find('.logo');
31				// 30/2 - left and right margins
32				logoWidth = $logo.outerWidth(true) + 70;
33			}
34
35			// var wrapperWidth = jQuery('.sf-menu').width();
36			var wrapperWidth = $menuWraper.outerWidth(true);
37			$menuLis.each(function(index) {
38				var elementWidth = jQuery(this).outerWidth();
39				summaryLiWidth += elementWidth;
40				if(summaryLiWidth >= (wrapperWidth-logoWidth)) {
41					var $newLi = jQuery('<li class="sf-more-li"><a>...</a><ul></ul></li>');
42					jQuery($menuLis[index - 1 ]).before($newLi);
43					var newLiWidth = jQuery($newLi).outerWidth(true);
44					var $extraLiElements = $menuLis.filter(':gt('+ ( index - 2 ) +')');
45					$extraLiElements.clone().appendTo($newLi.find('ul'));
46					$extraLiElements.addClass('sf-md-hidden');
47					return false;
48				}
49			});
50
51			if ( $headerLogoCenter.length ) {
52				var $menuLisVisible = $headerLogoCenter.find('.sf-menu > li:not(.sf-md-hidden)');
53				var menuLength = $menuLisVisible.length;
54				var summaryLiVisibleWidth = 0;
55				$menuLisVisible.each(function(){
56					summaryLiVisibleWidth += jQuery(this).outerWidth();
57				});
58
59				var centerLi = Math.floor( menuLength / 2 );
60				if ( (menuLength % 2 === 0) ) {
61					centerLi--;
62				}
63				var $liLeftFromLogo = $menuLisVisible.eq(centerLi);
64				$liLeftFromLogo.after('<li class="sf-logo-li"></li>');
65				$headerLogoCenter.find('.sf-logo-li').width(logoWidth);
66				var liLeftRightDotX = $liLeftFromLogo.offset().left + $liLeftFromLogo.outerWidth();
67				var logoLeftDotX = windowWidth/2 - logoWidth/2;
68				var menuLeftOffset = liLeftRightDotX - logoLeftDotX;
69				$menuWraper.css({'left': -menuLeftOffset})
70			}
71			
72		}// > 991
73	}); //sf-menu each
74} //menuHideExtraElements
75
76function initMegaMenu() {
77	var $megaMenu = jQuery('.mainmenu_wrapper .mega-menu');
78	if($megaMenu.length) {
79		var windowWidth = jQuery('body').innerWidth();
80		if (windowWidth > 991) {
81			$megaMenu.each(function(){
82				var $thisMegaMenu = jQuery(this);
83				//temporary showing mega menu to propper size calc
84				$thisMegaMenu.css({'display': 'block', 'left': 'auto'});
85				var thisWidth = $thisMegaMenu.outerWidth();
86				var thisOffset = $thisMegaMenu.offset().left;
87				var thisLeft = (thisOffset + (thisWidth/2)) - windowWidth/2;
88				$thisMegaMenu.css({'left' : -thisLeft, 'display': 'none'});
89				if(!$thisMegaMenu.closest('ul').hasClass('nav')) {
90					$thisMegaMenu.css('left', '');
91				}
92			});
93		}
94	}
95}
96
97
98function affixSidebarInit() {
99	var $affixAside = jQuery('.affix-aside');
100	if ($affixAside.length) {
101		
102			//on stick and unstick event
103			$affixAside.on('affix.bs.affix', function(e) {
104				var affixWidth = $affixAside.width() - 1;
105				var affixLeft = $affixAside.offset().left;
106				$affixAside
107					.width(affixWidth)
108					.css("left", affixLeft);
109			}).on('affix-top.bs.affix affix-bottom.bs.affix', function(e) {
110				$affixAside.css({"width": "", "left": ""});
111			});
112			
113			//counting offset
114			var offsetTop = $affixAside.offset().top - jQuery('.page_header').height();
115			var offsetBottom = jQuery('.page_footer').outerHeight(true) + jQuery('.page_copyright').outerHeight(true);
116			
117			$affixAside.affix({
118				offset: {
119					top: offsetTop,
120					bottom: offsetBottom
121				},
122			});
123
124			jQuery(window).on('resize', function() {
125				$affixAside.css({"width": "", "left": ""});
126				
127				if( $affixAside.hasClass('affix')) {
128					//returning sidebar in top position if it is sticked because of unexpacted behavior
129					$affixAside.removeClass("affix").css("left", "").addClass("affix-top");
130				}
131
132				var offsetTop = jQuery('.page_topline').outerHeight(true) 
133								+ jQuery('.page_toplogo').outerHeight(true) 
134								+ jQuery('.page_header').outerHeight(true)
135								+ jQuery('.page_breadcrumbs').outerHeight(true) 
136								+ jQuery('.blog_slider').outerHeight(true);
137				var offsetBottom = jQuery('.page_footer').outerHeight(true) 
138								+ jQuery('.page_copyright').outerHeight(true);
139				
140				$affixAside.data('bs.affix').options.offset.top = offsetTop;
141				$affixAside.data('bs.affix').options.offset.bottom = offsetBottom;
142				
143				$affixAside.affix('checkPosition');
144
145			});
146
147	}//eof checking of affix sidebar existing
148}
149
150//helper functions to init elements only when they appears in viewport (jQUery.appear plugin)
151function initAnimateElement(self, index) {
152	var animationClass = !self.data('animation') ? 'fadeInUp' : self.data('animation');
153	var animationDelay = !self.data('delay') ? 150 : self.data('delay');
154	setTimeout(function(){
155		self.addClass("animated " + animationClass);
156	}, index * animationDelay);
157}
158function initCounter(self) {
159	if (self.hasClass('counted')) {
160		return;
161	} else {
162		self.countTo().addClass('counted');
163	}
164}
165function initProgressbar(el) {
166	el.progressbar({
167		transition_delay: 300
168	});
169}
170function initChart(el) {
171	var data = el.data();
172	var size = data.size ? data.size : 270;
173	var line = data.line ? data.line : 20;
174	var bgcolor = data.bgcolor ? data.bgcolor : '#ffffff';
175	var trackcolor = data.trackcolor ? data.trackcolor : '#c14240';
176	var speed = data.speed ? data.speed : 3000;
177
178	el.easyPieChart({
179		barColor: trackcolor,
180		trackColor: bgcolor,
181		scaleColor: false,
182		scaleLength: false,
183		lineCap: 'butt',
184		lineWidth: line,
185		size: size,
186		rotate: 0,
187		animate: speed,
188		onStep: function(from, to, percent) {
189			jQuery(this.el).find('.percent').text(Math.round(percent));
190		}
191	});
192}
193
194//wrap select element in select-group
195function wrapSelect() {
196	jQuery('.wrap-select-group, .cryptonatorwidget select').each(function() {
197		var $select = jQuery( this );
198		if ( $select.hasClass('select2-hidden-accessible') ) {
199			return;
200		}
201		$select.wrap('<div class="form-group select-group"></div>').after('<i class="fa fa-angle-down theme_button color1 no_bg_button" aria-hidden="true"></i>');
202		if ( $select.hasClass('wrap-select-group') ) {
203			$select.addClass('empty choice');
204		}
205	})
206}
207
208//equalize header side columns width
209function headerColumnsEqualize() {
210	var $header = jQuery('.page_header').first();
211	var $leftLogo = $header.find('.header_left_logo');
212	var $rightButtons = $header.find('.header_right_buttons');
213	if ( parseInt( $leftLogo.css( 'width' ) ) > parseInt( $rightButtons.css( 'width' ) ) ) {
214		$rightButtons.css( 'min-width', $leftLogo.css( 'width' ) );
215	} else {
216		$leftLogo.css( 'min-width', $rightButtons.css( 'width' ) );
217	}
218}
219
220//function that initiating template plugins on window.load event
221function windowLoadInit() {
222
223	////////////
224	//mainmenu//
225	////////////
226	if (jQuery().scrollbar) {
227		jQuery('[class*="scrollbar-"]').scrollbar();
228	}
229	if (jQuery().superfish) {
230		jQuery('ul.sf-menu').superfish({
231			popUpSelector: 'ul:not(.mega-menu ul), .mega-menu ',
232			delay:       700,
233			animation:   {opacity:'show', marginTop: 0},
234			animationOut: {opacity: 'hide',  marginTop: 5},
235			speed:       200,
236			speedOut:    200,
237			disableHI:   false,
238			cssArrows:   true,
239			autoArrows:  true
240
241		});
242		jQuery('ul.sf-menu-side').superfish({
243			popUpSelector: 'ul:not(.mega-menu ul), .mega-menu ',
244			delay:       500,
245			animation:   {opacity:'show', height: 100 +'%'},
246			animationOut: {opacity: 'hide',  height: 0},
247			speed:       400,
248			speedOut:    300,
249			disableHI:   false,
250			cssArrows:   true,
251			autoArrows:  true
252		});
253	}
254
255	
256	//toggle mobile menu
257	jQuery('.toggle_menu').on('click', function(){
258		jQuery(this)
259			.toggleClass('mobile-active')
260				.closest('.page_header')
261				.toggleClass('mobile-active')
262				.end()
263				.closest('.page_toplogo')
264				.next()
265				.find('.page_header')
266				.toggleClass('mobile-active');
267	});
268
269	jQuery('.mainmenu a').on('click', function(){
270		var $this = jQuery(this);
271		//If this is a local link or item with sumbenu - not toggling menu
272		if (($this.hasClass('sf-with-ul')) || !($this.attr('href').charAt(0) === '#')) {
273			return;
274		}
275		$this
276		.closest('.page_header')
277		.toggleClass('mobile-active')
278		.find('.toggle_menu')
279		.toggleClass('mobile-active');
280	});
281
282	//side header processing
283	var $sideHeader = jQuery('.page_header_side');
284	// toggle sub-menus visibility on menu-click
285	jQuery('ul.menu-side-click').find('li').each(function(){
286		var $thisLi = jQuery(this);
287		//toggle submenu only for menu items with submenu
288		if ($thisLi.find('ul').length)  {
289			$thisLi
290				.append('<span class="activate_submenu"></span>')
291				//adding anchor
292				.find('.activate_submenu, > a')
293				.on('click', function(e) {
294					var $thisSpanOrA = jQuery(this);
295					//if this is a link and it is already opened - going to link
296					if (($thisSpanOrA.attr('href') === '#') || !($thisSpanOrA.parent().hasClass('active-submenu'))) {
297						e.preventDefault();
298					}
299					if ($thisSpanOrA.parent().hasClass('active-submenu')) {
300						$thisSpanOrA.parent().removeClass('active-submenu');
301						return;
302					}
303					$thisLi.addClass('active-submenu').siblings().removeClass('active-submenu');
304				});
305		} //eof sumbenu check
306	});
307	if ($sideHeader.length) {
308		jQuery('.toggle_menu_side').on('click', function(){
309			var $thisToggler = jQuery(this);
310			if ($thisToggler.hasClass('header-slide')) {
311				$sideHeader.toggleClass('active-slide-side-header');
312			} else {
313				if($thisToggler.parent().hasClass('header_side_right')) {
314					$body.toggleClass('active-side-header slide-right');
315				} else {
316					$body.toggleClass('active-side-header');
317				}
318			}
319		});
320		//hidding side header on click outside header
321		$body.on('click', function( e ) {
322			if ( !(jQuery(e.target).closest('.page_header_side').length) && !($sideHeader.hasClass('page_header_side_sticked')) ) {
323				$sideHeader.removeClass('active-slide-side-header');
324				$body.removeClass('active-side-header slide-right');
325			}
326		});
327	} //sideHeader check
328
329	//1 and 2/3/4th level mainmenu offscreen fix
330	var MainWindowWidth = jQuery(window).width();
331	var boxWrapperWidth = jQuery('#box_wrapper').width();
332	jQuery(window).on('resize', function(){
333		MainWindowWidth = jQuery(window).width();
334		boxWrapperWidth = jQuery('#box_wrapper').width();
335	});
336	//2/3/4 levels
337	jQuery('.mainmenu_wrapper .sf-menu').on('mouseover', 'ul li', function(){
338	// jQuery('.mainmenu').on('mouseover', 'ul li', function(){
339		if(MainWindowWidth > 991) {
340			var $this = jQuery(this);
341			// checks if third level menu exist         
342			var subMenuExist = $this.find('ul').length;
343			if( subMenuExist > 0){
344				var subMenuWidth = $this.find('ul, div').first().width();
345				var subMenuOffset = $this.find('ul, div').first().parent().offset().left + subMenuWidth;
346				// if sub menu is off screen, give new position
347				if((subMenuOffset + subMenuWidth) > boxWrapperWidth){
348					var newSubMenuPosition = subMenuWidth + 0;
349					$this.find('ul, div').first().css({
350						left: -newSubMenuPosition,
351					});
352				} else {
353					$this.find('ul, div').first().css({
354						left: '100%',
355					});
356				}
357			}
358		}
359	//1st level
360	}).on('mouseover', '> li', function(){
361		if(MainWindowWidth > 991) {
362			var $this = jQuery(this);
363			var subMenuExist = $this.find('ul').length;
364			if( subMenuExist > 0){
365				var subMenuWidth = $this.find('ul').width();
366				var subMenuOffset = $this.find('ul').parent().offset().left - (jQuery(window).width() / 2 - boxWrapperWidth / 2);
367				// if sub menu is off screen, give new position
368				if((subMenuOffset + subMenuWidth) > boxWrapperWidth){
369					var newSubMenuPosition = boxWrapperWidth - (subMenuOffset + subMenuWidth);
370					$this.find('ul').first().css({
371						left: newSubMenuPosition,
372					});
373				} 
374			}
375		}
376	});
377	
378	/////////////////////////////////////////
379	//single page localscroll and scrollspy//
380	/////////////////////////////////////////
381	var navHeight = jQuery('.page_header').outerHeight(true);
382	//if sidebar nav exists - binding to it. Else - to main horizontal nav
383	if (jQuery('.mainmenu_side_wrapper').length) {
384		$body.scrollspy({
385			target: '.mainmenu_side_wrapper',
386			offset: navHeight
387		});
388	} else if (jQuery('.mainmenu_wrapper').length) {
389		$body.scrollspy({
390			target: '.mainmenu_wrapper',
391			offset: navHeight 
392		})
393	}
394	if (jQuery().localScroll) {
395		jQuery('.mainmenu_wrapper > ul, .mainmenu_side_wrapper > ul, #land, .scroll_button_wrap, .intro-layer').localScroll({
396			duration:900,
397			easing:'easeInOutQuart',
398			offset: -navHeight+40
399		});
400	}
401
402	//background image teaser and secitons with half image bg
403	//put this before prettyPhoto init because image may be wrapped in prettyPhoto link
404	jQuery(".bg_teaser, .image_cover").each(function(){
405		var $teaser = jQuery(this);
406		var $image = $teaser.find("img").first();
407		if (!$image.length) {
408			$image = $teaser.parent().find("img").first();
409		}
410		if (!$image.length) {
411			return;
412		}
413		var imagePath = $image.attr("src");
414		$teaser.css("background-image", "url(" + imagePath + ")");
415		var $imageParent = $image.parent();
416		//if image inside link - adding this link, removing gallery to preserve duplicating gallery items
417		if ($imageParent.is('a')) {
418			$teaser.prepend($image.parent().clone().html(''));
419			$imageParent.attr('data-gal', '');
420		}
421	});
422
423	//toTop
424	if (jQuery().UItoTop) {
425		jQuery().UItoTop({ easingType: 'easeInOutQuart' });
426	}
427
428	//parallax
429	if (jQuery().parallax) {
430		jQuery('.parallax').parallax("50%", 0.01);
431	}
432	
433	//prettyPhoto
434	if (jQuery().prettyPhoto) {
435		jQuery("a[data-gal^='prettyPhoto']").prettyPhoto({
436			hook: 'data-gal',
437			theme: 'facebook', /* light_rounded / dark_rounded / light_square / dark_square / facebook / pp_default*/
438			social_tools: false,
439			default_width: 1170,
440			default_height: 780
441		});
442	}
443	
444	////////////////////////////////////////
445	//init Bootstrap JS components//
446	////////////////////////////////////////
447	//bootstrap carousel
448	if (jQuery().carousel) {
449		jQuery('.carousel').carousel();
450	}
451	//bootstrap tab - show first tab 
452	jQuery('.nav-tabs').each(function() {
453		jQuery(this).find('a').first().tab('show');
454	});
455	jQuery('.tab-content').each(function() {
456		jQuery(this).find('.tab-pane').first().addClass('fade in');
457	});
458	//bootstrap collapse - show first tab 
459	jQuery('.panel-group').each(function() {
460		jQuery(this).find('a').first().filter('.collapsed').trigger('click');
461	});
462	//tooltip
463	if (jQuery().tooltip) {
464		jQuery('[data-toggle="tooltip"]').tooltip();
465	}
466
467	
468
469	//comingsoon counter
470	if (jQuery().countdown) {
471		//today date plus month for demo purpose
472		var demoDate = new Date();
473		demoDate.setMonth(demoDate.getMonth()+1);
474		jQuery('#comingsoon-countdown').countdown({until: demoDate});
475	}
476
477	/////////////////////////////////////////////////
478	//PHP widgets - contact form, search, MailChimp//
479	/////////////////////////////////////////////////
480
481	//contact form processing
482	jQuery('form.contact-form').on('submit', function( e ){
483		e.preventDefault();
484		var $form = jQuery(this);
485		jQuery($form).find('span.contact-form-respond').remove();
486
487		//checking on empty values
488		jQuery($form).find('[aria-required="true"], [required]').each(function(index) {
489			var $thisRequired = jQuery(this);
490			if (!$thisRequired.val().length) {
491				$thisRequired
492					.addClass('invalid')
493					.on('focus', function(){
494						$thisRequired
495							.removeClass('invalid');
496					});
497			}
498		});
499		//if one of form fields is empty - exit
500		if ($form.find('[aria-required="true"], [required]').hasClass('invalid')) {
501			return;
502		}
503
504		//sending form data to PHP server if fields are not empty
505		var request = $form.serialize();
506		var ajax = jQuery.post( "contact-form.php", request )
507		.done(function( data ) {
508			jQuery($form).find('[type="submit"]').attr('disabled', false).parent().append('<span class="contact-form-respond highlight">'+data+'</span>');
509			//cleaning form
510			var $formErrors = $form.find('.form-errors');
511			if ( !$formErrors.length ) {
512				$form[0].reset();
513			}
514		})
515		.fail(function( data ) {
516			jQuery($form).find('[type="submit"]').attr('disabled', false).parent().append('<span class="contact-form-respond highlight">Mail cannot be sent. You need PHP server to send mail.</span>');
517		})
518	});
519
520
521	//search modal
522	jQuery(".search_modal_button").on('click', function(e){
523		e.preventDefault();
524		jQuery('#search_modal').modal('show').find('input').first().focus();
525	});
526	//search form processing
527	jQuery('form.searchform').on('submit', function( e ){
528		
529		e.preventDefault();
530		var $form = jQuery(this);
531		var $searchModal = jQuery('#search_modal');
532		$searchModal.find('div.searchform-respond').remove();
533
534		//checking on empty values
535		jQuery($form).find('[type="text"]').each(function(index) {
536			var $thisField = jQuery(this);
537			if (!$thisField.val().length) {
538				$thisField
539					.addClass('invalid')
540					.on('focus', function(){
541						$thisField.removeClass('invalid')
542					});
543			}
544		});
545		//if one of form fields is empty - exit
546		if ($form.find('[type="text"]').hasClass('invalid')) {
547			return;
548		}
549
550		$searchModal.modal('show');
551		//sending form data to PHP server if fields are not empty
552		var request = $form.serialize();
553		var ajax = jQuery.post( "search.php", request )
554		.done(function( data ) {
555			$searchModal.append('<div class="searchform-respond">'+data+'</div>');
556		})
557		.fail(function( data ) {
558			$searchModal.append('<div class="searchform-respond">Search cannot be done. You need PHP server to search.</div>');
559			
560		})
561	});
562
563	//MailChimp subscribe form processing
564	jQuery('.signup').on('submit', function( e ) {
565		e.preventDefault();
566		var $form = jQuery(this);
567		// update user interface
568		$form.find('.response').html('Adding email address...');
569		// Prepare query string and send AJAX request
570		jQuery.ajax({
571			url: 'mailchimp/store-address.php',
572			data: 'ajax=true&email=' + escape($form.find('.mailchimp_email').val()) + '&fullname=' + escape($form.find('.mailchimp_fullname').val()),
573			success: function(msg) {
574				$form.find('.response').html(msg);
575			}
576		});
577	});
578	
579	//twitter
580	if (jQuery().tweet) {
581		jQuery('.twitter').tweet({
582			modpath: "./twitter/",
583			count: 2,
584			avatar_size: 48,
585			loading_text: 'loading twitter feed...',
586			join_text: 'auto',
587			username: 'michaeljackson', 
588			template: "<span class=\"tweet_text\">{tweet_text}</span><span class=\"greylinks black small-text\"> {time}</span>"
589		});
590	}
591
592
593	//adding CSS classes for elements that needs different styles depending on they widht width
594	//see 'plugins.js' file
595	jQuery('#mainteasers .col-lg-4').addWidthClass({
596		breakpoints: [500, 600]
597	});
598
599	// init timetable
600	var $timetable = jQuery('#timetable');
601	if ($timetable.length) {
602		// bind filter click
603		jQuery('#timetable_filter').on( 'click', 'a', function( e ) {
604			e.preventDefault();
605			e.stopPropagation();
606			var $thisA = jQuery(this);
607			if ( $thisA.hasClass('selected') ) {
608				// return false;
609				return;
610			}
611			var selector = $thisA.attr('data-filter');
612			$timetable
613				.find('tbody td')
614				.removeClass('current')
615				.end()
616				.find(selector)
617				.closest('td')
618				.addClass('current');
619			$thisA.closest('ul').find('a').removeClass('selected');
620			$thisA.addClass('selected');
621	  });
622	}
623
624	/////////
625	//SHOP///
626	/////////
627	jQuery('#toggle_shop_view').on('click', function( e ) {
628		e.preventDefault();
629		jQuery(this).toggleClass('grid-view');
630		jQuery('#products').toggleClass('grid-view list-view');
631	});
632	//zoom image
633	if (jQuery().elevateZoom) {
634		jQuery('#product-image').elevateZoom({
635			gallery: 'product-image-gallery',
636			cursor: 'pointer', 
637			galleryActiveClass: 'active', 
638			responsive:true, 
639			loadingIcon: 'img/AjaxLoader.gif'
640		});
641	}
642	
643	//add review button
644	jQuery('.review-link').on('click', function( e ) {
645		var $thisLink = jQuery(this);
646		var reviewTabLink = jQuery('a[href="#reviews_tab"]');
647		//show tab only if it's hidden
648		if (!reviewTabLink.parent().hasClass('active')) {
649			reviewTabLink
650			.tab('show')
651			.on('shown.bs.tab', function (e) {
652				$window.scrollTo($thisLink.attr('href'), 400);
653			})
654		}
655		$window.scrollTo($thisLink.attr('href'), 400);
656	});
657
658	//product counter
659	jQuery('.plus, .minus').on('click', function( e ) {
660		var numberField = jQuery(this).parent().find('[type="number"]');
661		var currentVal = numberField.val();
662		var sign = jQuery(this).val();
663		if (sign === '-') {
664			if (currentVal > 1) {
665				numberField.val(parseFloat(currentVal) - 1);
666			}
667		} else {
668			numberField.val(parseFloat(currentVal) + 1);
669		}
670	});
671	
672	//remove product from cart
673	jQuery('a.remove').on('click', function( e ) {
674		e.preventDefault();
675		jQuery(this).closest('tr, .media').remove();
676	});
677
678	//price filter - only for HTML
679	if (jQuery().slider) {
680		var $rangeSlider = jQuery(".slider-range-price");
681		if ($rangeSlider.length) {
682			var $priceMin = jQuery(".price_from");
683			var $priceMax = jQuery(".price_to");
684			$rangeSlider.slider({
685				range: true,
686				min: 0,
687				max: 200,
688				values: [ 30, 100 ],
689				slide: function( event, ui ) {
690					$priceMin.html( '$' + ui.values[ 0 ] );
691					$priceMax.html( '$' + ui.values[ 1 ] );
692				}
693			});
694			$priceMin.html('$' + $rangeSlider.slider("values", 0));
695			$priceMax.html('$' + $rangeSlider.slider("values", 1));
696		}
697	}
698
699	//color filter 
700	jQuery(".color-filters").find("a[data-background-color]").each(function() {
701		jQuery(this).css({"background-color" : jQuery(this).data("background-color")});
702	}); // end of SHOP
703	///eof docready
704
705	//////////////
706	//flexslider//
707	//////////////
708	if (jQuery().flexslider) {
709		var $introSlider = jQuery(".intro_section .flexslider");
710		$introSlider.each(function(index){
711			var $currentSlider = jQuery(this);
712			var data = $currentSlider.data();
713			var nav = (data.nav !== 'undefined') ? data.nav : true;
714			var dots = (data.dots !== 'undefined') ? data.dots : true;
715
716			$currentSlider.flexslider({
717				animation: "fade",
718				pauseOnHover: true, 
719				useCSS: true,
720				controlNav: dots,   
721				directionNav: nav,
722				prevText: "",
723				nextText: "",
724				smoothHeight: false,
725				slideshowSpeed:10000,
726				animationSpeed:600,
727				start: function( slider ) {
728					slider.find('.slide_description').children().css({'visibility': 'hidden'});
729					slider.find('.flex-active-slide .slide_description').children().each(function(index){
730						var self = jQuery(this);
731						var animationClass = !self.data('animation') ? 'fadeInRight' : self.data('animation');
732						setTimeout(function(){
733							self.addClass("animated "+animationClass);
734						}, index*200);
735					});
736					slider.find('.flex-control-nav').find('a').each(function() {
737						jQuery( this ).html('0' + jQuery( this ).html());
738					})
739				},
740				after: function( slider ){
741					slider.find('.flex-active-slide .slide_description').children().each(function(index){
742						var self = jQuery(this);
743						var animationClass = !self.data('animation') ? 'fadeInRight' : self.data('animation');
744						setTimeout(function(){
745							self.addClass("animated "+animationClass);
746						}, index*200);
747					});
748				},
749				end :function( slider ){
750					slider.find('.slide_description').children().each(function() {
751						var self = jQuery(this);
752						var animationClass = !self.data('animation') ? 'fadeInRight' : self.data('animation');
753						self.removeClass('animated ' + animationClass).css({'visibility': 'hidden'});
754							// jQuery(this).attr('class', '');
755					});
756				},
757
758			})
759			//wrapping nav with container - uncomment if need
760			.find('.flex-control-nav')
761			.wrap('<div class="container-fluid nav-container"/>')
762		}); //intro_section flex slider
763
764		jQuery(".flexslider").each(function(index){
765			var $currentSlider = jQuery(this);
766			//exit if intro slider already activated 
767			if ($currentSlider.find('.flex-active-slide').length) {
768				return;
769			}
770
771			var data = $currentSlider.data();
772			var nav = (data.nav !== 'undefined') ? data.nav : true;
773			var dots = (data.dots !== 'undefined') ? data.dots : true;
774			var autoplay = (data.autoplay !== 'undefined') ? data.autoplay : true;
775			$currentSlider.flexslider({
776				animation: "slide",
777				useCSS: true,
778				controlNav: dots,   
779				directionNav: nav,
780				prevText: "",
781				nextText: "",
782				smoothHeight: false,
783				slideshow: autoplay,
784				slideshowSpeed:5000,
785				animationSpeed:400,
786				start: function( slider ) {
787					slider.find('.flex-control-nav').find('a').each(function() {
788						jQuery( this ).html('0' + jQuery( this ).html());
789					})
790				},
791			})
792			.find('.flex-control-nav')
793			.wrap('<div class="container-fluid nav-container"/>')
794		});
795	}
796
797	////////////////////
798	//header processing/
799	////////////////////
800	//stick header to top
801	//wrap header with div for smooth sticking
802	var $header = jQuery('.page_header').first();
803	var boxed = $header.closest('.boxed').length;
804	if ($header.length) {
805		//hiding main menu 1st levele elements that do not fit width
806		menuHideExtraElements();
807		//mega menu
808		initMegaMenu();
809		//wrap header for smooth stick and unstick
810		var headerHeight = $header.outerHeight();
811		$header.wrap('<div class="page_header_wrapper"></div>');
812		var $headerWrapper = $header.parent();
813		if (!boxed) {
814			$headerWrapper.css({height: $header.outerHeight()}); 
815		}
816
817		headerColumnsEqualize();
818
819		//headerWrapper background
820		if( $header.hasClass('header_white') ) {
821			$headerWrapper.addClass('header_white');
822		} else if ( $header.hasClass('header_darkgrey') ) {
823			$headerWrapper.addClass('header_darkgrey');
824			if ( $header.hasClass('bs') ) {
825				$headerWrapper.addClass('bs');
826			}
827
828		} else if ( $header.hasClass('header_gradient') ) {
829			$headerWrapper.addClass('header_gradient');
830		}
831
832		if ( $header.hasClass('header_transparent') ) {
833			$headerWrapper.addClass('header_transparent_wrap')
834		}
835
836		//get offset
837		var headerOffset = 0;
838		//check for sticked template headers
839		if (!boxed && !($headerWrapper.css('position') === 'fixed')) {
840			headerOffset = $header.offset().top;
841
842			if ($header.css('padding-top') === '65px') {
843				headerOffset += 65;
844			}
845		}
846
847		//for boxed layout - show or hide main menu elements if width has been changed on affix
848		jQuery($header).on('affixed-top.bs.affix affixed.bs.affix affixed-bottom.bs.affix', function ( e ) {
849			if( $header.hasClass('affix-top') ) {
850				$headerWrapper.removeClass('affix-wrapper affix-bottom-wrapper').addClass('affix-top-wrapper');
851			} else if ( $header.hasClass('affix') ) {
852				$headerWrapper.removeClass('affix-top-wrapper affix-bottom-wrapper').addClass('affix-wrapper');
853			} else if ( $header.hasClass('affix-bottom') ) {
854				$headerWrapper.removeClass('affix-wrapper affix-top-wrapper').addClass('affix-bottom-wrapper');
855			} else {
856				$headerWrapper.removeClass('affix-wrapper affix-top-wrapper affix-bottom-wrapper');
857			}
858			menuHideExtraElements();
859			initMegaMenu();
860		});
861
862		//if header has different height on afixed and affixed-top positions - correcting wrapper height
863		jQuery($header).on('affixed-top.bs.affix', function () {
864			// $headerWrapper.css({height: $header.outerHeight()});
865		});
866
867		jQuery($header).affix({
868			offset: {
869				top: headerOffset,
870				bottom: 0
871			}
872		});
873
874	}
875
876	////////////////////
877	//triggered search//
878	////////////////////
879	jQuery('.search_form_trigger').on('click', function($e) {
880		$e.preventDefault();
881		jQuery( '.search_form_trigger, .search_form_wrapper' ).toggleClass('active');
882	});
883
884	////////////////
885	//owl carousel//
886	////////////////
887	if (jQuery().owlCarousel) {
888		jQuery('.owl-carousel').each(function() {
889			var $carousel = jQuery(this);
890			var data = $carousel.data();
891
892			var loop = data.loop ? data.loop : false;
893			var margin = (data.margin || data.margin === 0) ? data.margin : 30;
894			var nav = data.nav ? data.nav : false;
895			var dots = data.dots ? data.dots : false;
896			var themeClass = data.themeclass ? data.themeclass : 'owl-theme';
897			var center = data.center ? data.center : false;
898			var items = data.items ? data.items : 4;
899			var autoplay = data.autoplay ? data.autoplay : false;
900			var responsiveXs = data.responsiveXs ? data.responsiveXs : 1;
901			var responsiveXxs = data.responsiveXxs ? data.responsiveXxs : 1;
902			var responsiveSm = data.responsiveSm ? data.responsiveSm : 2;
903			var responsiveMd = data.responsiveMd ? data.responsiveMd : 3;
904			var responsiveLg = data.responsiveLg ? data.responsiveLg : 4;
905			var responsiveXlg = data.responsiveXlg ? data.responsiveXlg : responsiveLg;
906			var filters = data.filters ? data.filters : false;
907			var mouseDrag = $carousel.data('mouse-drag') === false ? false : true;
908			var touchDrag = $carousel.data('touch-drag') === false ? false : true;
909
910			if (filters) {
911				// $carousel.clone().appendTo($carousel.parent()).addClass( filters.substring(1) + '-carousel-original' );
912				$carousel.after($carousel.clone().addClass('owl-carousel-filter-cloned'));
913				jQuery(filters).on('click', 'a', function( e ) {
914					//processing filter link
915					e.preventDefault();
916					var $thisA = jQuery(this);
917					if ($thisA.hasClass('selected')) {
918						return;
919					}
920					var filterValue = $thisA.attr('data-filter');
921					$thisA.siblings().removeClass('selected active');
922					$thisA.addClass('selected active');
923					
924					//removing old items
925					$carousel.find('.owl-item').length;
926					for (var i = $carousel.find('.owl-item').length - 1; i >= 0; i--) {
927						$carousel.trigger('remove.owl.carousel', [1]);
928					};
929
930					//adding new items
931					var $filteredItems = jQuery($carousel.next().find(' > ' +filterValue).clone());
932					$filteredItems.each(function() {
933						$carousel.trigger('add.owl.carousel', jQuery(this));
934						jQuery(this).addClass('scaleAppear');						
935					});
936					
937					$carousel.trigger('refresh.owl.carousel');
938
939					//reinit prettyPhoto in filtered OWL carousel
940					if (jQuery().prettyPhoto) {
941						$carousel.find("a[data-gal^='prettyPhoto']").prettyPhoto({
942							hook: 'data-gal',
943							theme: 'facebook' /* light_rounded / dark_rounded / light_square / dark_square / facebook / pp_default*/
944						});
945					}
946				});
947				
948			} //filters
949
950			$carousel.owlCarousel({
951				loop: loop,
952				margin: margin,
953				nav: nav,
954				navText: ['<span>prev</span>', '<span>next</span>'],
955				autoplay: autoplay,
956				dots: dots,
957				themeClass: themeClass,
958				center: center,
959				items: items,
960				smartSpeed: 400,
961				mouseDrag: mouseDrag,
962				touchDrag: touchDrag,
963				responsive: {
964					0:{
965						items: responsiveXxs
966					},
967					500:{
968						items: responsiveXs
969					},
970					768:{
971						items: responsiveSm
972					},
973					992:{
974						items: responsiveMd
975					},
976					1200:{
977						items: responsiveLg
978					},
979					1600:{
980						items: responsiveXlg
981					}
982				},
983			})
984			.addClass(themeClass);
985			if(center) {
986				$carousel.addClass('owl-center');
987			}
988
989			$window.on('resize', function() {
990				$carousel.trigger('refresh.owl.carousel');
991			});
992
993			$carousel.on('changed.owl.carousel', function() {
994				if (jQuery().prettyPhoto) {
995					jQuery("a[data-gal^='prettyPhoto']").prettyPhoto({
996						hook: 'data-gal',
997						theme: 'facebook', /* light_rounded / dark_rounded / light_square / dark_square / facebook / pp_default*/
998						social_tools: false
999					});
1000				}
1001			})
1002		});
1003
1004	} //eof owl-carousel
1005
1006	//aside affix
1007	affixSidebarInit();
1008
1009	$body.scrollspy('refresh');
1010
1011	//appear plugin is used to elements animation, counter, pieChart, bootstrap progressbar
1012	if (jQuery().appear) {
1013		//animation to elements on scroll
1014		jQuery('.to_animate').appear();
1015
1016		jQuery('.to_animate').filter(':appeared').each(function(index){
1017			initAnimateElement(jQuery(this), index);
1018		});
1019
1020		$body.on('appear', '.to_animate', function(e, $affected ) {
1021			jQuery($affected).each(function(index){
1022				initAnimateElement(jQuery(this), index);
1023			});
1024		});
1025
1026		//counters init on scroll
1027		if (jQuery().countTo) {
1028			jQuery('.counter').appear();
1029			
1030			jQuery('.counter').filter(':appeared').each(function(){
1031				initCounter(jQuery(this));
1032			});
1033			$body.on('appear', '.counter', function(e, $affected ) {
1034				jQuery($affected).each(function(){
1035					initCounter(jQuery(this));
1036				});
1037			});
1038		}
1039	
1040		//bootstrap animated progressbar
1041		if (jQuery().progressbar) {
1042			jQuery('.progress .progress-bar').appear();
1043
1044			jQuery('.progress .progress-bar').filter(':appeared').each(function(){
1045				initProgressbar(jQuery(this));
1046			});
1047			$body.on('appear', '.progress .progress-bar', function(e, $affected ) {
1048				jQuery($affected).each(function(){
1049					initProgressbar(jQuery(this));
1050				});
1051			});
1052			//animate progress bar inside bootstrap tab
1053			jQuery('a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
1054				initProgressbar(jQuery(jQuery(e.target).attr('href')).find('.progress .progress-bar'));
1055			});
1056			//animate progress bar inside bootstrap dropdown
1057			jQuery('.dropdown').on('shown.bs.dropdown', function(e) {
1058				initProgressbar(jQuery(this).find('.progress .progress-bar'));
1059			});
1060		}
1061
1062		//circle progress bar
1063		if (jQuery().easyPieChart) {
1064
1065			jQuery('.chart').appear();
1066			
1067			jQuery('.chart').filter(':appeared').each(function(){
1068				initChart(jQuery(this));
1069			});
1070			$body.on('appear', '.chart', function(e, $affected ) {
1071				jQuery($affected).each(function(){
1072					initChart(jQuery(this));
1073				});
1074			});
1075
1076		}
1077
1078	} //appear check
1079
1080	//Flickr widget
1081	// use http://idgettr.com/ to find your ID
1082	if (jQuery().jflickrfeed) {
1083		var $flickr = jQuery("#flickr, .flickr_ul");
1084		if ( $flickr.length ) {
1085			if ( ! ( $flickr.hasClass('flickr_loaded') ) ) {
1086				$flickr.jflickrfeed({
1087					flickrbase: "http://api.flickr.com/services/feeds/",
1088					limit: 4,
1089					qstrings: {
1090						id: "131791558@N04"
1091					},
1092					itemTemplate: '<a href="{{image_b}}" data-gal="prettyPhoto[pp_gal]"><li><img alt="{{title}}" src="{{image_m}}" /></li></a>'
1093				}, function(data) {
1094					$flickr.find('a').prettyPhoto({
1095						hook: 'data-gal',
1096						theme: 'facebook'
1097					});
1098				}).addClass('flickr_loaded');
1099			}
1100		}
1101	}
1102
1103	// Instagram widget
1104	if(jQuery().spectragram) {
1105		var Spectra = {
1106			instaToken: '3905738328.60c782d.b65ed3f058d64e6ab32c110c6ac12d9b',
1107			instaID: '60c782dfecaf4050b59ff4c159246641',
1108
1109			init: function () {
1110				jQuery.fn.spectragram.accessData = {
1111					accessToken: this.instaToken,
1112					clientID: this.instaID
1113				};
1114
1115				//available methods: getUserFeed, getRecentTagged
1116				jQuery('.instafeed').each(function(){
1117					var $this = jQuery(this);
1118					if ($this.find('img').length) {
1119						return;
1120					}
1121					$this.spectragram('getRecentTagged',{
1122						max: 4,
1123						//pass username if you are using getUserFeed method
1124						query: 'grey',
1125						wrapEachWith: '<div class="photo">'
1126					});
1127				});
1128			}
1129		}
1130
1131		Spectra.init();
1132	}
1133
1134	//video images preview - from WP
1135	jQuery('.embed-placeholder').each(function(){
1136		jQuery(this).on('click', function(e) {
1137			var $thisLink = jQuery(this);
1138			// if prettyPhoto popup with YouTube - return
1139			if ($thisLink.attr('data-gal')) {
1140				return;
1141			}
1142			e.preventDefault();
1143			if ($thisLink.attr('href') === '' || $thisLink.attr('href') === '#') {
1144				$thisLink.replaceWith($thisLink.data('iframe').replace(/&amp/g, '&').replace(/$lt;/g, '<').replace(/&gt;/g, '>').replace(/$quot;/g, '"')).trigger('click');
1145			} else {
1146				$thisLink.replaceWith('<iframe class="embed-responsive-item" src="'+ $thisLink.attr('href') + '?rel=0&autoplay=1'+ '"></iframe>');
1147			}
1148		});
1149	});
1150
1151	// init Isotope
1152	jQuery('.isotope_container').each(function(index) {
1153		var $container = jQuery(this);
1154		var layoutMode = ($container.hasClass('masonry-layout')) ? 'masonry' : 'fitRows';
1155		var columnWidth = ($container.find('.col-lg-20').length) ? '.col-lg-20' : '';
1156		$container.isotope({
1157			percentPosition: true,
1158			layoutMode: layoutMode,
1159			masonry: {
1160				//for big first element in grid - giving smaller element to use as grid
1161				columnWidth: columnWidth
1162			}
1163		});
1164
1165		var $filters = jQuery(this).attr('data-filters') ? jQuery(jQuery(this).attr('data-filters')) : $container.prev().find('.filters');
1166		// bind filter click
1167		if ($filters.length) {
1168			$filters.on( 'click', 'a', function( e ) {
1169				e.preventDefault();
1170				var $thisA = jQuery(this);
1171				var filterValue = $thisA.attr('data-filter');
1172				$container.isotope({ filter: filterValue });
1173				$thisA.siblings().removeClass('selected active');
1174				$thisA.addClass('selected active');
1175			});
1176			//for works on select
1177			$filters.on( 'change', 'select', function( e ) {
1178				e.preventDefault();
1179				var filterValue = jQuery(this).val();
1180				$container.isotope({ filter: filterValue });
1181			});
1182		}
1183	});
1184
1185	//Unyson or other messages modal
1186	var $messagesModal = jQuery('#messages_modal');
1187	if ($messagesModal.find('ul').length) {
1188		$messagesModal.modal('show');
1189	}
1190
1191	// prevent search form trigger from scrolling to top
1192	jQuery('.search_form_trigger').on( 'click', function($e) {
1193	    $e.preventDefault();
1194	});
1195
1196	//prevent default action of # links
1197	jQuery("[href='#0']").on( 'click', function($e) {
1198		$e.preventDefault();
1199	});
1200
1201	//wrap select elements in .select-group
1202	wrapSelect();
1203
1204	if (jQuery().cuePlaylist) {
1205		cue.initialize();
1206	}
1207
1208	//page preloader
1209	jQuery(".preloaderimg").fadeOut(150);
1210	jQuery(".preloader").fadeOut(350).delay(200, function(){
1211		jQuery(this).remove();
1212	});
1213	
1214}//eof windowLoadInit
1215
1216$window.ready(function() {
1217	if (window.cue) {
1218		cue.initialize();
1219	}
1220})
1221
1222
1223
1224$window.on('load', function(){
1225	windowLoadInit();
1226
1227	//Google Map script
1228	var $googleMaps = jQuery('#map, .page_map');
1229	if ( $googleMaps.length ) {
1230		$googleMaps.each(function() {
1231			var $map = jQuery(this);
1232
1233			var lat;
1234			var lng;
1235			var map;
1236
1237			//map styles. You can grab different styles on https://snazzymaps.com/
1238			var styles = [{"featureType": "all","elementType": "labels.text.fill","stylers": [{"saturation": 36},{"color": "#000000"},{"lightness": 40}]},{"featureType": "all","elementType": "labels.text.stroke","stylers": [{"visibility": "on"},{"color": "#000000"},{"lightness": 16}]},{"featureType": "all","elementType": "labels.icon","stylers": [{"visibility": "off"}]},{"featureType": "administrative","elementType": "geometry.fill","stylers": [{"color": "#000000"},{"lightness": 20}]},{"featureType": "administrative","elementType": "geometry.stroke","stylers": [{"color": "#000000"},{"lightness": 17},{"weight": 1.2}]},{"featureType": "landscape","elementType": "geometry","stylers": [{"color": "#000000"},{"lightness": 20}]},{"featureType": "poi","elementType": "geometry","stylers": [{"color": "#000000"},{"lightness": 21}]},{"featureType": "road.highway","elementType": "geometry.fill","stylers": [{"color": "#000000"},{"lightness": 17}]},{"featureType": "road.highway","elementType": "geometry.stroke","stylers": [{"color": "#000000"},{"lightness": 29},{"weight": 0.2}]},{"featureType": "road.arterial","elementType": "geometry","stylers": [{"color": "#000000"},{"lightness": 18}]},{"featureType": "road.local","elementType": "geometry","stylers": [{"color": "#000000"},{"lightness": 16}]},{"featureType": "transit","elementType": "geometry","stylers": [{"color": "#000000"},{"lightness": 19}]},{"featureType": "water","elementType": "geometry","stylers": [{"color": "#000000"},{"lightness": 17}]}];
1239			
1240			//map settings
1241			var address = $map.data('address') ? $map.data('address') : 'london, baker street, 221b';
1242			var markerDescription = $map.find('.map_marker_description').prop('outerHTML');
1243
1244			//if you do not provide map title inside #map (.page_map) section inside H3 tag - default titile (Map Title) goes here:
1245			var markerTitle = $map.find('h3').first().text() ? $map.find('h3').first().text() : 'Map Title';
1246			var markerIconSrc = $map.find('.map_marker_icon').first().attr('src');
1247
1248			//type your address after "address="
1249			jQuery.getJSON('http://maps.googleapis.com/maps/api/geocode/json?address=' + address, function(data) {
1250				
1251				lat = data.results[0].geometry.location.lat;
1252				lng = data.results[0].geometry.location.lng;
1253
1254			}).complete(function(){
1255				
1256				var center = new google.maps.LatLng(lat, lng);
1257				var settings = {
1258					mapTypeId: google.maps.MapTypeId.ROADMAP,
1259					zoom: 14,
1260					draggable: true,
1261					scrollwheel: false,
1262					center: center,
1263					styles: styles 
1264				};
1265				map = new google.maps.Map($map[0], settings);
1266
1267				var marker = new google.maps.Marker({
1268					position: center,
1269					title: markerTitle,
1270					map: map,
1271					icon: markerIconSrc,
1272				});
1273
1274				var infowindow = new google.maps.InfoWindow({ 
1275					content: markerDescription
1276				});
1277				
1278				google.maps.event.addListener(marker, 'click', function() {
1279					infowindow.open(map,marker);
1280				});
1281
1282			});
1283		}); //each
1284	}//google map length
1285
1286	// color for placeholder of select elements
1287	jQuery(".choice").on('change', function () {
1288		if(jQuery(this).val() === "") jQuery(this).addClass("empty");
1289		else jQuery(this).removeClass("empty")
1290	});
1291
1292}); //end of "window load" event
1293
1294$window.on('resize', function(){
1295
1296	$body.scrollspy('refresh');
1297
1298	//header processing
1299	headerColumnsEqualize();
1300	menuHideExtraElements();
1301	initMegaMenu();
1302	var $header = jQuery('.page_header').first();
1303		//checking document scrolling position
1304		if ($header.length && !jQuery(document).scrollTop() && $header.first().data('bs.affix')) {
1305			$header.first().data('bs.affix').options.offset.top = $header.offset().top;
1306		}
1307	if (!$header.closest('.boxed').length) {
1308		jQuery(".page_header_wrapper").css({height: $header.first().outerHeight()}); //editing header wrapper height for smooth stick and unstick
1309	}
1310	
1311});
1312//end of IIFE function
1313
1314})();
1315

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.