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(/&/g, '&').replace(/$lt;/g, '<').replace(/>/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.