PageSourceSearch

https://o2ocx.ai/js/script.js

js o2ocx.ai collected 2026-10-05 14:00:44 UTC 54,012 bytes, 1,687 lines download raw bytes

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.