1/** 2 * Global variables 3 */ 4"use strict"; 5 6var userAgent = navigator.userAgent.toLowerCase(), 7 initialDate = new Date(), 8 9 $document = $(document), 10 $window = $(window), 11 $html = $("html"), 12 13 isDesktop = $html.hasClass("desktop"), 14 isIE = userAgent.indexOf("msie") != -1 ? parseInt(userAgent.split("msie")[1]) : userAgent.indexOf("trident") != -1 ? 11 : userAgent.indexOf("edge") != -1 ? 12 : false, 15 isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), 16 isTouch = "ontouchstart" in window, 17 18 plugins = { 19 pointerEvents: isIE < 11 ? "js/pointer-events.min.js" : false, 20 bootstrapTooltip: $("[data-toggle='tooltip']"), 21 bootstrapTabs: $(".tabs"), 22 bootstrapAccordions: $(".accordion"), 23 rdParallax: $(".rd-parallax"), 24 rdGoogleMaps: $(".rd-google-map"), 25 rdNavbar: $(".rd-navbar"), 26 mfp: $('[data-lightbox]').not('[data-lightbox="gallery"] [data-lightbox]'), 27 mfpGallery: $('[data-lightbox^="gallery"]'), 28 owl: $(".owl-carousel"), 29 swiper: $(".swiper-slider"), 30 counter: $(".counter"), 31 twitterfeed: $(".twitter"), 32 progressBar: $(".progress-bar-js"), 33 isotope: $(".isotope"), 34 countDown: $(".countdown"), 35 popover: $('[data-toggle="popover"]'), 36 dateCountdown: $('.DateCountdown'), 37 statefulButton: $('.btn-stateful'), 38 slick: $('.slick-slider'), 39 viewAnimate: $('.view-animate'), 40 selectFilter: $("select"), 41 rdInputLabel: $(".form-label"), 42 bootstrapDateTimePicker: $("[data-time-picker]"), 43 customWaypoints: $('[data-custom-scroll-to]'), 44 photoSwipeGallery: $("[data-photo-swipe-item]"), 45 stepper: $("input[type='number']"), 46 radio: $("input[type='radio']"), 47 checkbox: $("input[type='checkbox']"), 48 customToggle: $("[data-custom-toggle]"), 49 rdMailForm: $(".rd-mailform"), 50 regula: $("[data-constraints]"), 51 pageLoader: $(".page-loader"), 52 search: $(".rd-search"), 53 searchResults: $('.rd-search-results'), 54 imgZoom: $('[mag-thumb]'), 55 pageTitles: $('.page-title') 56 }; 57 58/** 59 * Initialize All Scripts 60 */ 61$document.ready(function () { 62 var isNoviBuilder = window.xMode; 63 64 /** 65 * Adjustments for Safari on Mac 66 */ 67 (function($){ 68 if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Mac') != -1 && navigator.userAgent.indexOf('Chrome') == -1) { 69 $('html').addClass('mac'); // provide a class for the safari-mac specific css to filter with 70 } 71 })(jQuery); 72 73 /** 74 * getSwiperHeight 75 * @description calculate the height of swiper slider basing on data attr 76 */ 77 function getSwiperHeight(object, attr) { 78 var val = object.attr("data-" + attr), 79 dim; 80 81 if (!val) { 82 return undefined; 83 } 84 85 dim = val.match(/(px)|(%)|(vh)$/i); 86 87 if (dim.length) { 88 switch (dim[0]) { 89 case "px": 90 return parseFloat(val); 91 case "vh": 92 return $(window).height() * (parseFloat(val) / 100); 93 case "%": 94 return object.width() * (parseFloat(val) / 100); 95 } 96 } else { 97 return undefined; 98 } 99 } 100 101 /** 102 * toggleSwiperInnerVideos 103 * @description toggle swiper videos on active slides 104 */ 105 function toggleSwiperInnerVideos(swiper) { 106 var prevSlide = $(swiper.slides[swiper.previousIndex]), 107 nextSlide = $(swiper.slides[swiper.activeIndex]), 108 videos; 109 110 prevSlide.find("video").each(function () { 111 this.pause(); 112 }); 113 114 videos = nextSlide.find("video"); 115 if (videos.length) { 116 videos.get(0).play(); 117 } 118 } 119 120 /** 121 * toggleSwiperCaptionAnimation 122 * @description toggle swiper animations on active slides 123 */ 124 function toggleSwiperCaptionAnimation(swiper) { 125 var prevSlide = $(swiper.container), 126 nextSlide = $(swiper.slides[swiper.activeIndex]); 127 128 prevSlide 129 .find("[data-caption-animate]") 130 .each(function () { 131 var $this = $(this); 132 $this 133 .removeClass("animated") 134 .removeClass($this.attr("data-caption-animate")) 135 .addClass("not-animated"); 136 }); 137 138 139 nextSlide 140 .find("[data-caption-animate]") 141 .each(function () { 142 var $this = $(this),
143 delay = $this.attr("data-caption-delay"); 144 145 if (!isNoviBuilder) { 146 setTimeout(function () { 147 $this 148 .removeClass("not-animated") 149 .addClass($this.attr("data-caption-animate")) 150 .addClass("animated"); 151 }, delay ? parseInt(delay) : 0); 152 }else{ 153 $this 154 .removeClass("not-animated") 155 } 156 }); 157 } 158 159 /** 160 * makeParallax 161 * @description create swiper parallax scrolling effect 162 */ 163 function makeParallax(el, speed, wrapper, prevScroll) { 164 var scrollY = window.scrollY || window.pageYOffset; 165 166 if (prevScroll != scrollY) { 167 prevScroll = scrollY; 168 el.addClass('no-transition'); 169 el[0].style['transform'] = 'translate3d(0,' + -scrollY * (1 - speed) + 'px,0)'; 170 el.height(); 171 el.removeClass('no-transition'); 172 173 if (el.attr('data-fade') === 'true') { 174 var bound = el[0].getBoundingClientRect(), 175 offsetTop = bound.top * 2 + scrollY, 176 sceneHeight = wrapper.outerHeight(), 177 sceneDevider = wrapper.offset().top + sceneHeight / 2.0, 178 layerDevider = offsetTop + el.outerHeight() / 2.0, 179 pos = sceneHeight / 6.0, 180 opacity; 181 if (sceneDevider + pos > layerDevider && sceneDevider - pos < layerDevider) { 182 el[0].style["opacity"] = 1; 183 } else { 184 if (sceneDevider - pos < layerDevider) { 185 opacity = 1 + ((sceneDevider + pos - layerDevider) / sceneHeight / 3.0 * 5); 186 } else { 187 opacity = 1 - ((sceneDevider - pos - layerDevider) / sceneHeight / 3.0 * 5); 188 } 189 el[0].style["opacity"] = opacity < 0 ? 0 : opacity > 1 ? 1 : opacity.toFixed(2); 190 } 191 } 192 } 193 194 requestAnimationFrame(function () { 195 makeParallax(el, speed, wrapper, prevScroll); 196 }); 197 } 198 199 /** 200 * isScrolledIntoView 201 * @description check the element whas been scrolled into the view 202 */ 203 function isScrolledIntoView(elem) { 204 var $window = $(window); 205 return elem.offset().top + elem.outerHeight() >= $window.scrollTop() && elem.offset().top <= $window.scrollTop() + $window.height(); 206 } 207 208 /** 209 * initOnView 210 * @description calls a function when element has been scrolled into the view 211 */ 212 function lazyInit(element, func) { 213 var $win = jQuery(window); 214 $win.on('load scroll', function () { 215 if ((!element.hasClass('lazy-loaded') && (isScrolledIntoView(element)))) { 216 func.call(); 217 element.addClass('lazy-loaded'); 218 } 219 }); 220 } 221 222 /** 223 * Live Search 224 * @description create live search results 225 */ 226 function liveSearch(options){ 227 $('#' + options.live).removeClass('cleared').html(); 228 options.current++; 229 options.spin.addClass('loading'); 230 $.get(handler, { 231 s: decodeURI(options.term), 232 liveSearch: options.live, 233 dataType: "html", 234 liveCount: options.liveCount, 235 filter: options.filter, 236 template: options.template 237 }, function (data) { 238 options.processed++; 239 var live = $('#' + options.live); 240 if (options.processed == options.current && !live.hasClass('cleared')){ 241 live.find('> #search-results').removeClass('active'); 242 live.html(data); 243 setTimeout(function () { 244 live.find('> #search-results').addClass('active'); 245 }, 50); 246 } 247 options.spin.parents('.rd-search').find('.input-group-addon').removeClass('loading'); 248 }) 249 } 250 251 /** 252 * attachFormValidator 253 * @description attach form validation to elements 254 */ 255 function attachFormValidator(elements) { 256 for (var i = 0; i < elements.length; i++) { 257 var o = $(elements[i]), v; 258 o.addClass("form-control-has-validation").after("<span class='form-validation'></span>"); 259 v = o.parent().find(".form-validation"); 260 if (v.is(":last-child")) { 261 o.addClass("form-control-last-child"); 262 } 263 } 264 265 elements 266 .on('input change propertychange blur', function (e) { 267 var $this = $(this), results; 268 269 if (e.type != "blur") { 270 if (!$this.parent().hasClass("has-error")) { 271 return; 272 } 273 } 274 275 if ($this.parents('.rd-mailform').hasClass('success')) { 276 return; 277 } 278 279 if ((results = $this.regula('validate')).length) { 280 for (i = 0; i < results.length; i++) { 281 $this.siblings(".form-validation").text(results[i].message).parent().addClass("has-error") 282 } 283 } else { 284 $this.siblings(".form-validation").text("").parent().removeClass("has-error") 285 } 286 }) 287 .regula('bind'); 288 } 289 290 /** 291 * isValidated 292 * @description check if all elemnts pass validation 293 */ 294 function isValidated(elements) { 295 var results, errors = 0; 296 if (elements.length) { 297 for (j = 0; j < elements.length; j++) { 298 299 var $input = $(elements[j]); 300 301 if ((results = $input.regula('validate')).length) { 302 for (k = 0; k < results.length; k++) { 303 errors++; 304 $input.siblings(".form-validation").text(results[k].message).parent().addClass("has-error"); 305 } 306 } else { 307 $input.siblings(".form-validation").text("").parent().removeClass("has-error") 308 } 309 } 310 311 return errors == 0; 312 } 313 return true; 314 } 315 316 /** 317 * Init Bootstrap tooltip 318 * @description calls a function when need to init bootstrap tooltips 319 */ 320 function initBootstrapTooltip(tooltipPlacement) { 321 if (window.innerWidth < 599) { 322 plugins.bootstrapTooltip.tooltip('destroy'); 323 plugins.bootstrapTooltip.tooltip({ 324 placement: 'bottom' 325 }); 326 } else { 327 plugins.bootstrapTooltip.tooltip('destroy'); 328 plugins.bootstrapTooltip.tooltipPlacement; 329 plugins.bootstrapTooltip.tooltip(); 330 } 331 } 332 333 /** 334 * ChangeExternalButtons 335 * @description Change active tab in responsive active tab by external buttons (next tab, prev tab) 336 */ 337 function changeExternalButtons(respTabItem, direction) { 338 var prev, 339 next, 340 activeItem; 341 342 respTabItem.find('.resp-tabs-extertal-list li').removeClass('active'); 343 344 activeItem = respTabItem.find('.resp-tab-item.resp-tab-active'); 345 346 next = activeItem.next(); 347 if (!next.length) { 348 next = respTabItem.find('.resp-tab-item:first-child()'); 349 } 350 351 prev = activeItem.prev(); 352 if (!prev.length) { 353 prev = respTabItem.find('.resp-tab-item:last-child()'); 354 } 355 356 if (direction) { 357 if (direction === 'next') { 358 next.trigger('click'); 359 } else { 360 prev.trigger('click'); 361 } 362 363 setTimeout(function () { 364 changeExternalButtons(respTabItem); 365 }, 10); 366 } 367 368 respTabItem.find('.resp-tab-external-prev li:nth-child(' + (prev.index() + 1) + ')').addClass('active'); 369 respTabItem.find('.resp-tab-external-next li:nth-child(' + (next.index() + 1) + ')').addClass('active'); 370 } 371 372 /** 373 * Copyright Year 374 * @description Evaluates correct copyright year 375 */ 376 var o = $("#copyright-year"); 377 if (o.length) { 378 o.text(initialDate.getFullYear()); 379 } 380 381 /** 382 * IE Polyfills 383 * @description Adds some loosing functionality to IE browsers 384 */ 385 if (isIE) { 386 if (isIE < 10) { 387 $html.addClass("lt-ie-10"); 388 } 389 390 if (isIE < 11) { 391 if (plugins.pointerEvents) { 392 $.getScript(plugins.pointerEvents) 393 .done(function () { 394 $html.addClass("ie-10"); 395 PointerEventsPolyfill.initialize({}); 396 }); 397 } 398 } 399 400 if (isIE === 11) { 401 $("html").addClass("ie-11"); 402 } 403 404 if (isIE === 12) { 405 $("html").addClass("ie-edge"); 406 } 407 } 408 409 /** 410 * Bootstrap Tooltips 411 * @description Activate Bootstrap Tooltips 412 */ 413 if (plugins.bootstrapTooltip.length) { 414 var tooltipPlacement = plugins.bootstrapTooltip.attr('data-placement'); 415 initBootstrapTooltip(tooltipPlacement); 416 $(window).on('resize orientationchange', function () { 417 initBootstrapTooltip(tooltipPlacement); 418 }) 419 } 420 421 /** 422 * @module Magnific Popup 423 * @author Dmitry Semenov
424 * @see http://dimsemenov.com/plugins/magnific-popup/ 425 * @version v1.0.0 426 */ 427 if (plugins.mfp.length > 0 || plugins.mfpGallery.length > 0 && isNoviBuilder != "designMode") { 428 if (plugins.mfp.length) { 429 for (i = 0; i < plugins.mfp.length; i++) { 430 var mfpItem = plugins.mfp[i]; 431 432 $(mfpItem).magnificPopup({ 433 type: mfpItem.getAttribute("data-lightbox") 434 }); 435 } 436 } 437 if (plugins.mfpGallery.length) { 438 for (i = 0; i < plugins.mfpGallery.length; i++) { 439 var mfpGalleryItem = $(plugins.mfpGallery[i]).find('[data-lightbox]'); 440 441 for (var c = 0; c < mfpGalleryItem.length; c++) { 442 $(mfpGalleryItem).addClass("mfp-" + $(mfpGalleryItem).attr("data-lightbox")); 443 } 444 445 mfpGalleryItem.end() 446 .magnificPopup({ 447 delegate: '[data-lightbox]', 448 type: "image", 449 gallery: { 450 enabled: true 451 } 452 }); 453 } 454 } 455 } 456 457 /** 458 * RD Google Maps 459 * @description Enables RD Google Maps plugin 460 */ 461 if (plugins.rdGoogleMaps.length) { 462 var i; 463 464 $.getScript("//maps.google.com/maps/api/js?key=AIzaSyAFeB0kVA6ou
464yJ_gEvFbMaefLy3cBCyRwo&sensor=false&libraries=geometry,places&v=3.7", function() { 465 var head = document.getElementsByTagName('head')[0], 466 insertBefore = head.insertBefore; 467 468 head.insertBefore = function(newElement, referenceElement) { 469 if (newElement.href && newElement.href.indexOf('//fonts.googleapis.com/css?family=Roboto') != -1 || newElement.innerHTML.indexOf('gm-style') != -1) { 470 return; 471 } 472 insertBefore.call(head, newElement, referenceElement); 473 }; 474 475 function initGoogleMap(){ 476 var $this = $(this), 477 styles = $this.attr("data-styles"); 478 479 $this.googleMap({ 480 styles: styles ? JSON.parse(styles) : [], 481 onInit: function(map) { 482 var inputAddress = $('#rd-google-map-address'); 483 484 if (inputAddress.length) { 485 var input = inputAddress; 486 var geocoder = new google.maps.Geocoder(); 487 var marker = new google.maps.Marker({ 488 map: map, 489 icon: "images/gmap_marker.png", 490 }); 491 var autocomplete = new google.maps.places.Autocomplete(inputAddress[0]); 492 autocomplete.bindTo('bounds', map); 493 inputAddress.attr('placeholder', ''); 494 inputAddress.on('change', function() { 495 $("#rd-google-map-address-submit").trigger('click'); 496 }); 497 inputAddress.on('keydown', function(e) { 498 if (e.keyCode == 13) { 499 $("#rd-google-map-address-submit").trigger('click'); 500 } 501 }); 502 503 504 $("#rd-google-map-address-submit").on('click', function(e) { 505 e.preventDefault(); 506 var address = input.val(); 507 geocoder.geocode({ 508 'address': address 509 }, function(results, status) { 510 if (status == google.maps.GeocoderStatus.OK) { 511 var latitude = results[0].geometry.location.lat(); 512 var longitude = results[0].geometry.location.lng(); 513 514 map.setCenter(new google.maps.LatLng( 515 parseFloat(latitude), 516 parseFloat(longitude) 517 )); 518 marker.setPosition(new google.maps.LatLng( 519 parseFloat(latitude), 520 parseFloat(longitude) 521 )) 522 } 523 }); 524 }); 525 } 526 } 527 }); 528 } 529 530 for (i = 0; i < plugins.rdGoogleMaps.length; i++) { 531 if (isNoviBuilder !== "designMode") { 532 lazyInit($(plugins.rdGoogleMaps[i]), initGoogleMap.bind(plugins.rdGoogleMaps[i])); 533 } else { 534 initGoogleMap.bind(plugins.rdGoogleMaps[i])(); 535 } 536 } 537 }); 538 } 539 540 /** 541 * Bootstrap Date time picker 542 */ 543 if (plugins.bootstrapDateTimePicker.length) { 544 var i; 545 for (i = 0; i < plugins.bootstrapDateTimePicker.length; i++) { 546 var $dateTimePicker = $(plugins.bootstrapDateTimePicker[i]); 547 var options = {}; 548 549 options['format'] = 'dddd DD MMMM YYYY - HH:mm'; 550 if ($dateTimePicker.attr("data-time-picker") == "date") { 551 options['format'] = 'dddd DD MMMM YYYY'; 552 options['minDate'] = new Date(); 553 } else if ($dateTimePicker.attr("data-time-picker") == "time") { 554 options['format'] = 'HH:mm'; 555 } 556 557 options["time"] = ($dateTimePicker.attr("data-time-picker") != "date"); 558 options["date"] = ($dateTimePicker.attr("data-time-picker") != "time"); 559 options["shortTime"] = true; 560 561 $dateTimePicker.bootstrapMaterialDatePicker(options); 562 } 563 } 564 565 /** 566 * RD Twitter Feed 567 * @description Enables RD Twitter Feed plugin 568 */ 569 if (plugins.twitterfeed.length > 0) { 570 var i; 571 for (i = 0; i < plugins.twitterfeed.length; i++) { 572 var twitterfeedItem = plugins.twitterfeed[i]; 573 $(twitterfeedItem).RDTwitter({}); 574 } 575 } 576 577 /** 578 * Select2 579 * @description Enables select2 plugin 580 */ 581 /** 582 if (plugins.selectFilter.length) { 583 var i; 584 for (i = 0; i < plugins.selectFilter.length; i++) { 585 var select = $(plugins.selectFilter[i]); 586 587 select.select2({ 588 theme: select.attr('data-custom-theme') ? select.attr('data-custom-theme') : "bootstrap" 589 }).next().addClass(select.attr("class").match(/(input-sm)|(input-lg)|($)/i).toString().replace(new RegExp(",", 'g'), " ")); 590 } 591 } 592 */ 593 594 /** 595 * Stepper
596 * @description Enables Stepper Plugin 597 */ 598 if (plugins.stepper.length) { 599 plugins.stepper.stepper({ 600 labels: { 601 up: "", 602 down: "" 603 } 604 }); 605 } 606 607 /** 608 * Radio 609 * @description Add custom styling options for input[type="radio"] 610 */ 611 if (plugins.radio.length) { 612 var i; 613 for (i = 0; i < plugins.radio.length; i++) { 614 var $this = $(plugins.radio[i]); 615 $this.addClass("radio-custom").after("<span class='radio-custom-dummy'></span>") 616 } 617 } 618 619 /** 620 * Checkbox 621 * @description Add custom styling options for input[type="checkbox"] 622 */ 623 if (plugins.checkbox.length) { 624 var i; 625 for (i = 0; i < plugins.checkbox.length; i++) { 626 var $this = $(plugins.checkbox[i]); 627 $this.addClass("checkbox-custom").after("<span class='checkbox-custom-dummy'></span>") 628 } 629 } 630 631 /** 632 * Popovers 633 * @description Enables Popovers plugin 634 */ 635 if (plugins.popover.length) { 636 if (window.innerWidth < 767) { 637 plugins.popover.attr('data-placement', 'bottom'); 638 plugins.popover.popover(); 639 } 640 else { 641 plugins.popover.popover(); 642 } 643 } 644 645 /** 646 * jQuery Countdown 647 * @description Enable countdown plugin 648 */ 649 if (plugins.countDown.length) { 650 var i; 651 for (i = 0; i < plugins.countDown.length; i++) { 652 var countDownItem = plugins.countDown[i], 653 d = new Date(), 654 type = countDownItem.getAttribute('data-type'), 655 time = countDownItem.getAttribute('data-time'), 656 format = countDownItem.getAttribute('data-format'), 657 settings = []; 658 659 d.setTime(Date.parse(time)).toLocaleString(); 660 settings[type] = d; 661 settings['format'] = format; 662 $(countDownItem).countdown(settings); 663 } 664 } 665 666 /** 667 * TimeCircles 668 * @description Enable TimeCircles plugin 669 */ 670 if (plugins.dateCountdown.length) { 671 var i; 672 for (i = 0; i < plugins.dateCountdown.length; i++) { 673 var dateCountdownItem = $(plugins.dateCountdown[i]), 674 time = { 675 "Days": { 676 "text": "Days", 677 "show": true, 678 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 679 }, 680 "Hours": { 681 "text": "Hours", 682 "show": true, 683 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 684 }, 685 "Minutes": { 686 "text": "Minutes", 687 "show": true, 688 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 689 }, 690 "Seconds": { 691 "text": "Seconds", 692 "show": true, 693 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 694 } 695 }; 696 697 dateCountdownItem.TimeCircles({ 698 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "rgba(247, 247, 247, 1)", 699 animation: "smooth", 700 bg_width: dateCountdownItem.attr("data-bg-width") ? dateCountdownItem.attr("data-bg-width") : 0.9, 701 circle_bg_color: dateCountdownItem.attr("data-bg") ? dateCountdownItem.attr("data-bg") : "rgba(0, 0, 0, 1)", 702 fg_width: dateCountdownItem.attr("data-width") ? dateCountdownItem.attr("data-width") : 0.03 703 }); 704 705 $(window).on('load resize orientationchange', function () { 706 if (window.innerWidth < 479) { 707 dateCountdownItem.TimeCircles({ 708 time: { 709 "Days": { 710 "text": "Days", 711 "show": true, 712 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 713 }, 714 "Hours": { 715 "text": "Hours", 716 "show": true, 717 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 718 }, 719 "Minutes": { 720 "text": "Minutes", 721 "show": true, 722 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 723 }, 724 Seconds: { 725 "text": "Seconds", 726 show: false, 727 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 728 } 729 } 730 }).rebuild(); 731 } else if (window.innerWidth < 767) { 732 dateCountdownItem.TimeCircles({ 733 time: { 734 "Days": { 735 "text": "Days", 736 "show": true, 737 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 738 }, 739 "Hours": { 740 "text": "Hours", 741 "show": true, 742 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 743 }, 744 "Minutes": { 745 "text": "Minutes", 746 "show": true, 747 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 748 }, 749 Seconds: { 750 text: '', 751 show: false, 752 color: dateCountdownItem.attr("data-color") ? dateCountdownItem.attr("data-color") : "#f9f9f9" 753 } 754 } 755 }).rebuild(); 756 } else { 757 dateCountdownItem.TimeCircles({time: time}).rebuild(); 758 } 759 }); 760 } 761 } 762 763 /** 764 * Bootstrap Buttons 765 * @description Enable Bootstrap Buttons plugin 766 */ 767 if (plugins.statefulButton.length) { 768 $(plugins.statefulButton).on('click', function () { 769 var statefulButtonLoading = $(this).button('loading'); 770 771 setTimeout(function () { 772 statefulButtonLoading.button('reset') 773 }, 2000); 774 }) 775 } 776 777 /** 778 * Progress bar 779 * @description Enable progress bar 780 */ 781 if (plugins.progressBar.length) { 782 var i, 783 bar, 784 type; 785 786 for (i = 0; i < plugins.progressBar.length; i++) { 787 var progressItem = plugins.progressBar[i]; 788 bar = null; 789 790 if (progressItem.className.indexOf("progress-bar-horizontal") > -1) { 791 type = 'Line'; 792 } 793 794 if (progressItem.className.indexOf("progress-bar-radial") > -1) {
795 type = 'Circle'; 796 } 797 798 if (progressItem.getAttribute("data-stroke") && progressItem.getAttribute("data-value") && type) { 799 bar = new ProgressBar[type](progressItem, { 800 strokeWidth: Math.round(parseFloat(progressItem.getAttribute("data-stroke")) / progressItem.offsetWidth * 100), 801 trailWidth: progressItem.getAttribute("data-trail") ? Math.round(parseFloat(progressItem.getAttribute("data-trail")) / progressItem.offsetWidth * 100) : 0, 802 text: { 803 value: progressItem.getAttribute("data-counter") === "true" ? '0' : null, 804 className: 'progress-bar__body', 805 style: null 806 } 807 }); 808 bar.svg.setAttribute('preserveAspectRatio', "none meet"); 809 if (type === 'Line') { 810 bar.svg.setAttributeNS(null, "height", progressItem.getAttribute("data-stroke")); 811 } 812 813 bar.path.removeAttribute("stroke"); 814 bar.path.className.baseVal = "progress-bar__stroke"; 815 if (bar.trail) { 816 bar.trail.removeAttribute("stroke"); 817 bar.trail.className.baseVal = "progress-bar__trail"; 818 } 819 820 if (progressItem.getAttribute("data-easing") && !isIE) { 821 $(document) 822 .on("scroll", {"barItem": bar}, $.proxy(function (event) { 823 var bar = event.data.barItem; 824 var $this = $(this); 825 826 if (isScrolledIntoView($this) && this.className.indexOf("progress-bar--animated") === -1) { 827 this.className += " progress-bar--animated"; 828 bar.animate(parseInt($this.attr("data-value")) / 100.0, { 829 easing: $this.attr("data-easing"), 830 duration: $this.attr("data-duration") ? parseInt($this.attr("data-duration")) : 800, 831 step: function (state, b) { 832 if (b._container.className.indexOf("progress-bar-horizontal") > -1 || 833 b._container.className.indexOf("progress-bar-vertical") > -1) { 834 b.text.style.width = Math.abs(b.value() * 100).toFixed(0) + "%" 835 } 836 b.setText(Math.abs(b.value() * 100).toFixed(0)); 837 } 838 }); 839 } 840 }, progressItem)) 841 .trigger("scroll"); 842 } else { 843 bar.set(parseInt($(progressItem).attr("data-value")) / 100.0); 844 bar.setText($(progressItem).attr("data-value")); 845 if (type === 'Line') { 846 bar.text.style.width = parseInt($(progressItem).attr("data-value")) + "%"; 847 } 848 } 849 } else { 850 console.error(progressItem.className + ": progress bar type is not defined"); 851 } 852 } 853 } 854 855 /** 856 * UI To Top 857 * @description Enables ToTop Button 858 */ 859 if (isDesktop && !isNoviBuilder) { 860 $().UItoTop({ 861 easingType: 'easeOutQuart', 862 containerClass: 'ui-to-top fa fa-angle-up' 863 }); 864 } 865 866 /** 867 * RD Navbar 868 * @description Enables RD Navbar plugin 869 */ 870 if (plugins.rdNavbar.length) { 871 plugins.rdNavbar.RDNavbar({ 872 stickUpClone: (plugins.rdNavbar.attr("data-stick-up-clone") && !isNoviBuilder) ? plugins.rdNavbar.attr("data-stick-up-clone") === 'true' : false, 873 responsive: { 874 0: { 875 stickUp: (!isNoviBuilder) ? plugins.rdNavbar.attr("data-stick-up") === 'true' : false 876 }, 877 768: { 878 stickUp: (!isNoviBuilder) ? plugins.rdNavbar.attr("data-sm-stick-up") === 'true' : false 879 }, 880 992: { 881 stickUp: (!isNoviBuilder) ? plugins.rdNavbar.attr("data-md-stick-up") === 'true' : false 882 }, 883 1200: { 884 stickUp: (!isNoviBuilder) ? plugins.rdNavbar.attr("data-lg-stick-up") === 'true' : false 885 } 886 } 887 }); 888 if (plugins.rdNavbar.attr("data-body-class")) { 889 document.body.className += ' ' + plugins.rdNavbar.attr("data-body-class"); 890 } 891 } 892 893 /** 894 * ViewPort Universal 895 * @description Add class in viewport 896 */ 897 if (plugins.viewAnimate.length) { 898 var i; 899 for (i = 0; i < plugins.viewAnimate.length; i++) { 900 var $view = $(plugins.viewAnimate[i]).not('.active'); 901 $document.on("scroll", $.proxy(function () { 902 if (isScrolledIntoView(this)) { 903 this.addClass("active"); 904 } 905 }, $view)) 906 .trigger("scroll"); 907 } 908 } 909 910 911 /** 912 * Swiper 3.1.7 913 * @description Enable Swiper Slider 914 */ 915 if (plugins.swiper.length) { 916 var i; 917 for (i = 0; i < plugins.swiper.length; i++) { 918 var s = $(plugins.swiper[i]); 919 var pag = s.find(".swiper-pagination"), 920 next = s.find(".swiper-button-next"), 921 prev = s.find(".swiper-button-prev"), 922 bar = s.find(".swiper-scrollbar"), 923 parallax = s.parents('.rd-parallax').length, 924 swiperSlide = s.find(".swiper-slide"); 925 926 for (j = 0; j < swiperSlide.length; j++) { 927 var $this = $(swiperSlide[j]), 928 url; 929
930 if (url = $this.attr("data-slide-bg")) { 931 $this.css({ 932 "background-image": "url(" + url + ")", 933 "background-size": "cover" 934 }) 935 } 936 } 937 938 swiperSlide.end() 939 .find("[data-caption-animate]") 940 .addClass("not-animated") 941 .end() 942 .swiper({ 943 autoplay: s.attr('data-autoplay') !== "false" && !isNoviBuilder ? s.attr('data-autoplay') : null, 944 direction: s.attr('data-direction') ? s.attr('data-direction') : "horizontal", 945 effect: s.attr('data-slide-effect') ? s.attr('data-slide-effect') : "slide", 946 speed: s.attr('data-slide-speed') ? s.attr('data-slide-speed') : 600, 947 keyboardControl: s.attr('data-keyboard') === "true", 948 mousewheelControl: s.attr('data-mousewheel') === "true", 949 mousewheelReleaseOnEdges: s.attr('data-mousewheel-release') === "true", 950 nextButton: next.length ? next.get(0) : null, 951 prevButton: prev.length ? prev.get(0) : null, 952 pagination: pag.length ? pag.get(0) : null, 953 paginationClickable: pag.length ? pag.attr("data-clickable") !== "false" : false, 954 paginationBulletRender: pag.length ? pag.attr("data-index-bullet") === "true" ? function (index, className) { 955 return '<span class="' + className + '">' + (index + 1) + '</span>'; 956 } : null : null, 957 scrollbar: bar.length ? bar.get(0) : null, 958 scrollbarDraggable: bar.length ? bar.attr("data-draggable") !== "false" : true, 959 scrollbarHide: bar.length ? bar.attr("data-draggable") === "false" : false, 960 loop: s.attr("data-loop") && !isNoviBuilder ? s.attr('data-loop') !== "false" : false, 961 simulateTouch: s.attr('data-simulate-touch') && !isNoviBuilder ? s.attr('data-simulate-touch') === "true" : false, 962 onTransitionStart: function (swiper) { 963 toggleSwiperInnerVideos(swiper); 964 }, 965 onTransitionEnd: function (swiper) { 966 toggleSwiperCaptionAnimation(swiper); 967 }, 968 onInit: function (swiper) { 969 toggleSwiperInnerVideos(swiper); 970 toggleSwiperCaptionAnimation(swiper); 971 972 var swiperParalax = s.find(".swiper-parallax"); 973 974 for (var k = 0; k < swiperParalax.length; k++) { 975 var $this = $(swiperParalax[k]), 976 speed; 977 978 if (parallax && !isIEBrows && !isMobile) { 979 if (speed = $this.attr("data-speed")) { 980 makeParallax($this, speed, s, false); 981 } 982 } 983 } 984 $(window).on('resize', function () { 985 swiper.update(true); 986 }) 987 } 988 }); 989 990 $(window) 991 .on("resize", function () { 992 var mh = getSwiperHeight(s, "min-height"), 993 h = getSwiperHeight(s, "height"); 994 if (h) { 995 s.css("height", mh ? mh > h ? mh : h : h); 996 } 997 }) 998 .trigger("resize"); 999 } 1000 } 1001 1002 /** 1003 * Page loader 1004 * @description Enables Page loader 1005 */ 1006 if (plugins.pageLoader.length > 0) { 1007 1008 $window.on("load", function () { 1009 var loader = setTimeout(function () { 1010 plugins.pageLoader.addClass("loaded"); 1011 $window.trigger("resize"); 1012 }, 200); 1013 }); 1014 1015 } 1016 1017 /** 1018 * RD Search 1019 * @description Enables search 1020 */ 1021 if (plugins.search.length || plugins.searchResults) { 1022 var handler = "bat/rd-search.php"; 1023 var defaultTemplate = '<h6 class="search_title"><a target="_top" href="#{href}" class="search_link">#{title}</a></h6>' + 1024 '<p>...#{token}...</p>' + 1025 '<p class="match"><em>Terms matched: #{count} - URL: #{href}</em></p>'; 1026 var defaultFilter = '*.html'; 1027 1028 if (plugins.search.length) { 1029 1030 for (i = 0; i < plugins.search.length; i++) { 1031 var searchItem = $(plugins.search[i]), 1032 options = { 1033 element: searchItem, 1034 filter: (searchItem.attr('data-search-filter')) ? searchItem.attr('data-search-filter') : defaultFilter, 1035 template: (searchItem.attr('data-search-template')) ? searchItem.attr('data-search-template') : defaultTemplate, 1036 live: (searchItem.attr('data-search-live')) ? searchItem.attr('data-search-live') : false, 1037 liveCount: (searchItem.attr('data-search-live-count')) ? parseInt(searchItem.attr('data-search-live-count')) : 4, 1038 current: 0, processed: 0, timer: {} 1039 }; 1040 1041 if ($('.rd-navbar-search-toggle').length) { 1042 var toggle = $('.rd-navbar-search-toggle'); 1043 toggle.on('click', function () { 1044 if (!($(this).hasClass('active'))) { 1045 searchItem.find('input').val('').trigger('propertychange'); 1046 } 1047 }); 1048 } 1049 1050 if (options.live) { 1051 var clearHandler = false;
1052 1053 searchItem.find('input').on("keyup input propertychange", $.proxy(function () { 1054 this.term = this.element.find('input').val().trim(); 1055 this.spin = this.element.find('.input-group-addon'); 1056 1057 clearTimeout(this.timer); 1058 1059 if (this.term.length > 2) { 1060 this.timer = setTimeout(liveSearch(this), 200); 1061 1062 if (clearHandler == false) { 1063 clearHandler = true; 1064 1065 $("body").on("click", function (e) { 1066 if ($(e.toElement).parents('.rd-search').length == 0) { 1067 $('#rd-search-results-live').addClass('cleared').html(''); 1068 } 1069 }) 1070 } 1071 1072 } else if (this.term.length == 0) { 1073 $('#' + this.live).addClass('cleared').html(''); 1074 } 1075 }, options, this)); 1076 } 1077 1078 searchItem.submit($.proxy(function () { 1079 $('<input />').attr('type', 'hidden') 1080 .attr('name', "filter") 1081 .attr('value', this.filter) 1082 .appendTo(this.element); 1083 return true; 1084 }, options, this)) 1085 } 1086 } 1087 1088 if (plugins.searchResults.length) { 1089 var regExp = /\?.*s=([^&]+)\&filter=([^&]+)/g; 1090 var match = regExp.exec(location.search); 1091 1092 if (match != null) { 1093 $.get(handler, { 1094 s: decodeURI(match[1]), 1095 dataType: "html", 1096 filter: match[2], 1097 template: defaultTemplate, 1098 live: '' 1099 }, function (data) { 1100 plugins.searchResults.html(data); 1101 }) 1102 } 1103 } 1104 } 1105 1106 /** 1107 * Slick carousel 1108 * @description Enable Slick carousel plugin 1109 */ 1110 if (plugins.slick.length) { 1111 var i; 1112 for (i = 0; i < plugins.slick.length; i++) { 1113 var $slickItem = $(plugins.slick[i]); 1114 1115 $slickItem.slick({ 1116 slidesToScroll: parseInt($slickItem.attr('data-slide-to-scroll')) || 1, 1117 asNavFor: $slickItem.attr('data-for') || false, 1118 dots: $slickItem.attr("data-dots") == "true", 1119 infinite: isNoviBuilder ? false : $slickItem.attr("data-loop") == "true", 1120 focusOnSelect: true, 1121 arrows: $slickItem.attr("data-arrows") == "true", 1122 swipe: $slickItem.attr("data-swipe") == "true", 1123 autoplay: $slickItem.attr("data-autoplay") == "true", 1124 vertical: $slickItem.attr("data-vertical") == "true", 1125 centerMode: $slickItem.attr("data-center-mode") == "true", 1126 centerPadding: $slickItem.attr("data-center-padding") ? $slickItem.attr("data-center-padding") : '0.50', 1127 mobileFirst: true, 1128 responsive: [ 1129 { 1130 breakpoint: 0, 1131 settings: { 1132 slidesToShow: parseInt($slickItem.attr('data-items')) || 1, 1133 } 1134 }, 1135 { 1136 breakpoint: 479, 1137 settings: { 1138 slidesToShow: parseInt($slickItem.attr('data-xs-items')) || 1, 1139 } 1140 }, 1141 { 1142 breakpoint: 767, 1143 settings: { 1144 slidesToShow: parseInt($slickItem.attr('data-sm-items')) || 1, 1145 } 1146 }, 1147 { 1148 breakpoint: 991, 1149 settings: { 1150 slidesToShow: parseInt($slickItem.attr('data-md-items')) || 1, 1151 } 1152 }, 1153 { 1154 breakpoint: 1199, 1155 settings: { 1156 slidesToShow: parseInt($slickItem.attr('data-lg-items')) || 1, 1157 } 1158 } 1159 ] 1160 }) 1161 .on('afterChange', function (event, slick, currentSlide, nextSlide) { 1162 var $this = $(this), 1163 childCarousel = $this.attr('data-child'); 1164 1165 if (childCarousel) { 1166 $(childCarousel + ' .slick-slide').removeClass('slick-current'); 1167 $(childCarousel + ' .slick-slide').eq(currentSlide).addClass('slick-current'); 1168 } 1169 }); 1170 } 1171 } 1172 1173 /** 1174 * Owl carousel
1175 * @description Enables Owl carousel plugin 1176 */ 1177 if (plugins.owl.length) { 1178 var i; 1179 for (i = 0; i < plugins.owl.length; i++) { 1180 var c = $(plugins.owl[i]), 1181 responsive = {}; 1182 1183 var aliaces = ["-", "-xs-", "-sm-", "-md-", "-lg-"], 1184 values = [0, 480, 768, 992, 1200], 1185 j, k; 1186 1187 for (j = 0; j < values.length; j++) { 1188 responsive[values[j]] = {}; 1189 for (k = j; k >= -1; k--) { 1190 if (!responsive[values[j]]["items"] && c.attr("data" + aliaces[k] + "items")) { 1191 responsive[values[j]]["items"] = k < 0 ? 1 : parseInt(c.attr("data" + aliaces[k] + "items")); 1192 } 1193 if (!responsive[values[j]]["stagePadding"] && responsive[values[j]]["stagePadding"] !== 0 && c.attr("data" + aliaces[k] + "stage-padding")) { 1194 responsive[values[j]]["stagePadding"] = k < 0 ? 0 : parseInt(c.attr("data" + aliaces[k] + "stage-padding")); 1195 } 1196 if (!responsive[values[j]]["margin"] && responsive[values[j]]["margin"] !== 0 && c.attr("data" + aliaces[k] + "margin")) { 1197 responsive[values[j]]["margin"] = k < 0 ? 30 : parseInt(c.attr("data" + aliaces[k] + "margin")); 1198 } 1199 } 1200 } 1201 1202 // Create custom Pagination 1203 if (c.attr('data-dots-custom')) { 1204 c.on("initialized.owl.carousel", function (event) { 1205 var carousel = $(event.currentTarget), 1206 customPag = $(carousel.attr("data-dots-custom")), 1207 active = 0; 1208 1209 if (carousel.attr('data-active')) { 1210 active = parseInt(carousel.attr('data-active')); 1211 } 1212 1213 carousel.trigger('to.owl.carousel', [active, 300, true]); 1214 customPag.find("[data-owl-item='" + active + "']").addClass("active"); 1215 1216 customPag.find("[data-owl-item]").on('click', function (e) { 1217 e.preventDefault(); 1218 carousel.trigger('to.owl.carousel', [parseInt(this.getAttribute("data-owl-item")), 300, true]); 1219 }); 1220 1221 carousel.on("translate.owl.carousel", function (event) { 1222 customPag.find(".active").removeClass("active"); 1223 customPag.find("[data-owl-item='" + event.item.index + "']").addClass("active") 1224 }); 1225 }); 1226 } 1227 1228 // Create custom Numbering 1229 if (typeof(c.attr("data-numbering")) !== 'undefined') { 1230 var numberingObject = $(c.attr("data-numbering")); 1231 1232 c.on('initialized.owl.carousel changed.owl.carousel', function (numberingObject) { 1233 return function (e) { 1234 if (!e.namespace) return; 1235 numberingObject.find('.numbering-current').text(e.item.index + 1); 1236 numberingObject.find('.numbering-count').text(e.item.count); 1237 }; 1238 }(numberingObject)); 1239 } 1240 1241 c.owlCarousel({ 1242 autoplay: c.attr("data-autoplay") === "true", 1243 loop: isNoviBuilder === "designMode" ? false : c.attr("data-loop") == 'true', 1244 items: 1, 1245 dotsContainer: c.attr("data-pagination-class") || false, 1246 navContainer: c.attr("data-navigation-class") || false, 1247 mouseDrag: isNoviBuilder === "designMode" ? false : c.attr("data-mouse-drag") !== "false", 1248 nav: c.attr("data-nav") === "true", 1249 dots: c.attr("data-dots") === "true", 1250 dotsEach: c.attr("data-dots-each") ? parseInt(c.attr("data-dots-each")) : false, 1251 animateIn: c.attr('data-animation-in') ? c.attr('data-animation-in') : 'slide', 1252 animateOut: c.attr('data-animation-out') ? c.attr('data-animation-out') : false, 1253 responsive: responsive, 1254 navText: [] 1255 }); 1256 } 1257 } 1258 1259 /** 1260 * jQuery Count To 1261 * @description Enables Count To plugin 1262 */ 1263 if (plugins.counter.length) { 1264 var i; 1265 1266 for (i = 0; i < plugins.counter.length; i++) { 1267 var $counterNotAnimated = $(plugins.counter[i]).not('.animated'); 1268 $document 1269 .on("scroll", $.proxy(function() { 1270 var $this = this; 1271 1272 if ((!$this.hasClass("animated")) && (isScrolledIntoView($this))) { 1273 $this.countTo({ 1274 refreshInterval: 40, 1275 from: 0, 1276 to: parseInt($this.text(),10), 1277 speed: $this.attr("data-speed") || 1000, 1278 formatter: function(value, options) { 1279 value = value.toFixed(options.decimals); 1280 if (value < 10) { 1281 return '0' + value; 1282 } 1283 return value; 1284 } 1285 }); 1286 $this.addClass('animated'); 1287 } 1288 }, $counterNotAnimated)) 1289 .trigger("scroll"); 1290 } 1291 } 1292 1293 /** 1294 * Isotope
1295 * @description Enables Isotope plugin 1296 */ 1297 if (plugins.isotope.length) { 1298 var i, j, isogroup = []; 1299 for (i = 0; i < plugins.isotope.length; i++) { 1300 var isotopeItem = plugins.isotope[i], 1301 filterItems = $(isotopeItem).closest('.isotope-wrap').find('[data-isotope-filter]'), 1302 iso; 1303 1304 iso = new Isotope(isotopeItem, { 1305 itemSelector: '.isotope-item', 1306 layoutMode: isotopeItem.getAttribute('data-isotope-layout') ? isotopeItem.getAttribute('data-isotope-layout') : 'masonry', 1307 filter: '*', 1308 masonry: { 1309 columnWidth: 0.42 1310 } 1311 }); 1312 1313 isogroup.push(iso); 1314 1315 filterItems.on("click", function (e) { 1316 e.preventDefault(); 1317 var filter = $(this), 1318 iso = $('.isotope[data-isotope-group="' + this.getAttribute("data-isotope-group") + '"]'), 1319 filtersContainer = filter.closest(".isotope-filters"); 1320 1321 filtersContainer 1322 .find('.active') 1323 .removeClass("active"); 1324 filter.addClass("active"); 1325 1326 iso.isotope({ 1327 itemSelector: '.isotope-item', 1328 layoutMode: iso.attr('data-isotope-layout') ? iso.attr('data-isotope-layout') : 'masonry', 1329 filter: this.getAttribute("data-isotope-filter") == '*' ? '*' : '[data-filter*="' + this.getAttribute("data-isotope-filter") + '"]', 1330 masonry: { 1331 columnWidth: 0.42 1332 } 1333 }); 1334 1335 $window.trigger('resize'); 1336 1337 }).eq(0).trigger("click"); 1338 } 1339 1340 $(window).on('load', function () { 1341 setTimeout(function () { 1342 var i; 1343 for (i = 0; i < isogroup.length; i++) { 1344 isogroup[i].element.className += " isotope--loaded"; 1345 isogroup[i].layout(); 1346 } 1347 }, 600); 1348 }); 1349 } 1350 1351 /** 1352 * WOW 1353 * @description Enables Wow animation plugin 1354 */ 1355 if (!isNoviBuilder) { 1356 if (isDesktop && $html.hasClass("wow-animation") && $(".wow").length) { 1357 new WOW().init(); 1358 } 1359 } 1360 1361 /** 1362 * Bootstrap tabs 1363 * @description Activate Bootstrap Tabs 1364 */ 1365 if (plugins.bootstrapTabs.length) { 1366 var i; 1367 for (i = 0; i < plugins.bootstrapTabs.length; i++) { 1368 var bootstrapTabsItem = $(plugins.bootstrapTabs[i]); 1369 1370 bootstrapTabsItem.on("click", "a", function (event) { 1371 event.preventDefault(); 1372 $(this).tab('show'); 1373 }); 1374 } 1375 } 1376 1377 /** 1378 * RD Input Label 1379 * @description Enables RD Input Label Plugin 1380 */ 1381 if (plugins.rdInputLabel.length) { 1382 plugins.rdInputLabel.RDInputLabel(); 1383 } 1384 1385 /** 1386 * Regula 1387 * @description Enables Regula plugin 1388 */ 1389 if (plugins.regula.length) { 1390 attachFormValidator(plugins.regula); 1391 } 1392 1393 /** 1394 * RD Mailform 1395 */ 1396 if (plugins.rdMailForm.length) { 1397 var i, j, k, 1398 msg = { 1399 'MF000': 'Successfully sent!', 1400 'MF001': 'Recipients are not set!', 1401 'MF002': 'Form will not work locally!', 1402 'MF003': 'Please, define email field in your form!', 1403 'MF004': 'Please, define type of your form!', 1404 'MF254': 'Something went wrong with PHPMailer!', 1405 'MF255': 'Aw, snap! Something went wrong.' 1406 }; 1407 for (i = 0; i < plugins.rdMailForm.length; i++) { 1408 var $form = $(plugins.rdMailForm[i]); 1409 1410 $form.attr('novalidate', 'novalidate').ajaxForm({ 1411 data: { 1412 "form-type": $form.attr("data-form-type") || "contact", 1413 "counter": i 1414 }, 1415 beforeSubmit: function () { 1416 if (!isNoviBuilder){ 1417 var form = $(plugins.rdMailForm[this.extraData.counter]); 1418 var inputs = form.find("[data-constraints]"); 1419 if (isValidated(inputs)){ 1420 var output = $("#" + form.attr("data-form-output")); 1421 1422 if (output.hasClass("snackbars")) { 1423 output.html('<p><span class="icon text-middle fa fa-circle-o-notch fa-spin icon-xs"></span><span>Sending</span></p>'); 1424 output.addClass("active"); 1425 } 1426 } else{ 1427 return false; 1428 } 1429 } 1430 1431 }, 1432 error: function (result) { 1433 if (!isNoviBuilder){ 1434 var output = $("#" + $(plugins.rdMailForm[this.extraData.counter]).attr("data-form-output")); 1435 output.text(msg[result]); 1436 } 1437 1438 }, 1439 success: function (result) { 1440 if (!isNoviBuilder){ 1441 var form = $(plugins.rdMailForm[this.extraData.counter]); 1442 var output = $("#" + form.attr("data-form-output")); 1443 form.addClass('success'); 1444 result = result.length == 5 ? result : 'MF255'; 1445 output.text(msg[result]); 1446 if (result === "MF000") { 1447 if (output.hasClass("snackbars")) { 1448 output.html('<p><span class="icon text-middle fa-check icon-xs"></span><span>' + msg[result] + '</span></p>'); 1449 } else { 1450 output.addClass("success"); 1451 output.addClass("active"); 1452 } 1453 } else { 1454 if (output.hasClass("snackbars")) { 1455 output.html(' <p class="snackbars-left"><span class="icon icon-xs fa-warning text-middle"></span><span>' + msg[result] + '</span></p>'); 1456 } else { 1457 output.addClass("error"); 1458 output.addClass("active"); 1459 } 1460 } 1461 form.clearForm(); 1462 form.find('input, textarea').blur(); 1463 1464 setTimeout(function () { 1465 output.removeClass("active"); 1466 form.removeClass('success'); 1467 }, 5000); 1468 } 1469 } 1470 }); 1471 } 1472 } 1473 1474 /** 1475 * PhotoSwipe Gallery
1476 * @description Enables PhotoSwipe Gallery plugin 1477 */ 1478 if (plugins.photoSwipeGallery.length && !isNoviBuilder) { 1479 1480 // init image click event 1481 $document.delegate("[data-photo-swipe-item]", "click", function (event) { 1482 event.preventDefault(); 1483 1484 var $el = $(this), 1485 $galleryItems = $el.parents("[data-photo-swipe-gallery]").find("a[data-photo-swipe-item]"), 1486 pswpElement = document.querySelectorAll('.pswp')[0], 1487 encounteredItems = {}, 1488 pswpItems = [], 1489 options, 1490 pswpIndex = 0, 1491 pswp; 1492 1493 if ($galleryItems.length == 0) { 1494 $galleryItems = $el; 1495 } 1496 1497 // loop over the gallery to build up the photoswipe items 1498 $galleryItems.each(function () { 1499 var $item = $(this), 1500 src = $item.attr('href'), 1501 size = $item.attr('data-size').split('x'), 1502 pswdItem; 1503 1504 if ($item.is(':visible')) { 1505 1506 // if we have this image the first time 1507 if (!encounteredItems[src]) { 1508 // build the photoswipe item 1509 pswdItem = { 1510 src: src, 1511 w: parseInt(size[0], 10), 1512 h: parseInt(size[1], 10), 1513 el: $item // save link to element for getThumbBoundsFn 1514 }; 1515 1516 // store that we already had this item 1517 encounteredItems[src] = { 1518 item: pswdItem, 1519 index: pswpIndex 1520 }; 1521 1522 // push the item to the photoswipe list 1523 pswpItems.push(pswdItem); 1524 pswpIndex++; 1525 } 1526 } 1527 }); 1528 1529 options = { 1530 index: encounteredItems[$el.attr('href')].index, 1531 1532 getThumbBoundsFn: function (index) { 1533 var $el = pswpItems[index].el, 1534 offset = $el.offset(); 1535 1536 return { 1537 x: offset.left, 1538 y: offset.top, 1539 w: $el.width() 1540 }; 1541 } 1542 }; 1543 1544 // open the photoswipe gallery 1545 pswp = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, pswpItems, options); 1546 pswp.init(); 1547 }); 1548 } 1549 1550 /** 1551 * Custom Toggles 1552 */ 1553 if (plugins.customToggle.length) { 1554 var i; 1555 1556 for (i = 0; i < plugins.customToggle.length; i++) { 1557 var $this = $(plugins.customToggle[i]); 1558 1559 $this.on('click', $.proxy(function (event) { 1560 event.preventDefault(); 1561 var $ctx = $(this); 1562 $($ctx.attr('data-custom-toggle')).add(this).toggleClass('active'); 1563 }, $this)); 1564 1565 if ($this.attr("data-custom-toggle-hide-on-blur") === "true") { 1566 $("body").on("click", $this, function (e) { 1567 if (e.target !== e.data[0] 1568 && $(e.data.attr('data-custom-toggle')).find($(e.target)).length 1569 && e.data.find($(e.target)).length == 0) { 1570 $(e.data.attr('data-custom-toggle')).add(e.data[0]).removeClass('active'); 1571 } 1572 }) 1573 } 1574 1575 if ($this.attr("data-custom-toggle-disable-on-blur") === "true") { 1576 $("body").on("click", $this, function (e) { 1577 if (e.target !== e.data[0] && $(e.data.attr('data-custom-toggle')).find($(e.target)).length == 0 && e.data.find($(e.target)).length == 0) { 1578 $(e.data.attr('data-custom-toggle')).add(e.data[0]).removeClass('active'); 1579 } 1580 }) 1581 } 1582 } 1583 } 1584 1585 /** 1586 * Magnificent image zoom 1587 */ 1588 if (plugins.imgZoom.length) { 1589 var i; 1590 for (i = 0; i < plugins.imgZoom.length; i++) { 1591 var $imgZoomItem = $(plugins.imgZoom[i]); 1592 $imgZoomItem.mag(); 1593 } 1594 } 1595 1596 /** 1597 * Custom Waypoints 1598 */ 1599 if (isNoviBuilder !== "designMode") { 1600 if (plugins.customWaypoints.length) { 1601 var i; 1602 for (i = 0; i < plugins.customWaypoints.length; i++) { 1603 var $this = $(plugins.customWaypoints[i]); 1604 1605 $this.on('click', function(e) { 1606 e.preventDefault(); 1607 $("body, html").stop().animate({ 1608 scrollTop: $("#" + $(this).attr('data-custom-scroll-to')).offset().top 1609 }, 1000, function() { 1610 $(window).trigger("resize"); 1611 }); 1612 }); 1613 } 1614 } 1615 } 1616 1617 1618 /** 1619 * RD Parallax 1620 * @description Enables RD Parallax plugin 1621 */ 1622 if (isNoviBuilder !== "designMode") { 1623 if (plugins.rdParallax.length && !isMobile) { 1624 var i; 1625 $.RDParallax(); 1626 1627 if (!isIE && !isMobile) { 1628 $(window).on("scroll", function() { 1629 for (i = 0; i < plugins.rdParallax.length; i++) { 1630 var parallax = $(plugins.rdParallax[i]); 1631 if (isScrolledIntoView(parallax)) { 1632 parallax.find(".rd-parallax-inner").css("position", "fixed"); 1633 } else { 1634 parallax.find(".rd-parallax-inner").css("position", "absolute"); 1635 } 1636 } 1637 }); 1638 } 1639 1640 $("a[href='#']").on("click", function(event) { 1641 setTimeout(function() { 1642 $(window).trigger("resize"); 1643 }, 300); 1644 }); 1645 } 1646 } 1647 1648 /** 1649 * Page title
1650 * @description Enables page-title plugin 1651 */ 1652 if (isNoviBuilder !== "designMode"){ 1653 if (plugins.pageTitles) { 1654 var varCount = 30; 1655 1656 for (var i = 0; i < plugins.pageTitles.length; i++) { 1657 var pageTitle = $(plugins.pageTitles[i]); 1658 1659 var header = pageTitle.children()[0]; 1660 var wrapper = $(document.createElement('div')); 1661 wrapper.addClass('page-title-inner'); 1662 1663 var pageTitleLeft = $(document.createElement('div')), 1664 pageTitleCenter = $(document.createElement('div')), 1665 pageTitleRight = $(document.createElement('div')); 1666 1667 pageTitleLeft.addClass('page-title-left'); 1668 pageTitleCenter.addClass('page-title-center'); 1669 pageTitleRight.addClass('page-title-right'); 1670 1671 for (var j = 0; j < varCount; j++) { 1672 pageTitleLeft.append(header.cloneNode(true)); 1673 pageTitleRight.append(header.cloneNode(true)); 1674 } 1675 1676 pageTitleCenter.append(header.cloneNode(true)); 1677 pageTitle.children(0).remove(); 1678 1679 wrapper.append(pageTitleLeft); 1680 wrapper.append(pageTitleCenter); 1681 wrapper.append(pageTitleRight); 1682 1683 pageTitle.append(wrapper); 1684 } 1685 } 1686 } 1687});
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.