"use strict"; (function () { // global variables let useragent = navigator.useragent.tolowercase(), isie = useragent.indexof("msie") !== -1 ? parseint(useragent.split("msie")[1], 10) : useragent.indexof("trident") !== -1 ? 11 : useragent.indexof("edge") !== -1 ? 12 : false; // unsupported browsers if (isie !== false && isie < 12) { console.warn("[core] detected ie" + isie + ", load alert"); var script = document.createelement("script"); script.src = "./js/support.js"; document.queryselector("head").appendchild(script); } var initialdate = new date(), $document = $(document), $window = $(window), $html = $("html"), $body = $("body"), isdesktop = $html.hasclass("desktop"), ismobile = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.useragent), windowready = false, isnovibuilder = false, livedemo = true, plugins = { bootstraptooltip: $('[data-bs-toggle="tooltip"]'), bootstrapmodal: $('.modal'), bootstraptabs: $('.tabs-custom'), bootstrapaccordion: $(".accordion-item"), customtoggle: $('[data-custom-toggle]'), captcha: $('.recaptcha'), campaignmonitor: $('.campaign-mailform'), copyrightyear: $('.copyright-year'), checkbox: $('input[type="checkbox"]'), isotope: $('.isotope-wrap'), lightgallery: $('[data-lightgallery="group"]'), lightgalleryitem: $('[data-lightgallery="item"]'), lightdynamicgalleryitem: $('[data-lightgallery="dynamic"]'), materialparallax: $('.parallax-container'), mailchimp: $('.mailchimp-mailform'), owl: $('.owl-carousel'), popover: $('[data-bs-toggle="popover"]'), preloader: $('.preloader'), rdnavbar: $('.rd-navbar'), rdmailform: $('.rd-mailform'), rdinputlabel: $('.form-label'), regula: $('[data-constraints]'), radio: $('input[type="radio"]'), swiper: $('.swiper-container'), search: $('.rd-search'), searchresults: $('.rd-search-results'), statefulbutton: $('.btn-stateful'), viewanimate: $('.view-animate'), wow: $('.wow'), maps: $('.google-map-container'), counter: document.queryselectorall('.count'), progresslinear: document.queryselectorall('.progress-linear'), progresscircle: document.queryselectorall('.progress-circle'), countdown: document.queryselectorall('.countdown') }; /** * @desc check the element was been scrolled into the view * @param {object} elem - jquery object * @return {boolean} */ function isscrolledintoview(elem) { if (isnovibuilder) return true; return elem.offset().top + elem.outerheight() >= $window.scrolltop() && elem.offset().top <= $window.scrolltop() + $window.height(); } /** * @desc calls a function when element has been scrolled into the view * @param {object} element - jquery object * @param {function} func - init function */ function lazyinit(element, func) { var scrollhandler = function () { if ((!element.hasclass('lazy-loaded') && (isscrolledintoview(element)))) { func.call(element); element.addclass('lazy-loaded'); } }; scrollhandler(); $window.on('scroll', scrollhandler); } // initialize scripts that require a loaded window $window.on('load', function () { // page loader & page transition // if (plugins.preloader.length && !isnovibuilder) { // pagetransition({ // target: document.queryselector('.page'), // delay: 0, // duration: 500, // classin: 'fadein', // classout: 'fadeout', // classactive: 'animated', // conditions: function (event, link) { // return link && !/(\#|javascript:void\(0\)|callto:|tel:|mailto:|:\/\/)/.test(link) && !event.currenttarget.hasattribute('data-lightgallery'); // }, // ontransitionstart: function (options) { // settimeout(function () { // plugins.preloader.removeclass('loaded'); // }, options.duration * .75); // }, // onready: function () { // plugins.preloader.addclass('loaded'); // windowready = true; // } // }); // } // counter if (plugins.counter) { for (var i = 0; i < plugins.counter.length; i++) { var node = plugins.counter[i], counter = acounter({ node: node, duration: node.getattribute('data-duration') || 1000 }), scrollhandler = (function () { if (util.inviewport(this) && !this.classlist.contains('animated-first')) { this.counter.run(); this.classlist.add('animated-first'); } }).bind(node), blurhandler = (function () { this.counter.params.to = parseint(this.textcontent, 10); this.counter.run(); }).bind(node); if (isnovibuilder) { node.counter.run(); node.addeventlistener('blur', blurhandler); } else { scrollhandler(); window.addeventlistener('scroll', scrollhandler); } } } // progress bar if (plugins.progresslinear) { for (var i = 0; i < plugins.progresslinear.length; i++) { var container = plugins.progresslinear[i], counter = acounter({ node: container.queryselector('.progress-linear-counter'), duration: container.getattribute('data-duration') || 1000, onstart: function () { this.custom.bar.style.width = this.params.to + '%'; } }); counter.custom = { container: container, bar: container.queryselector('.progress-linear-bar'), onscroll: (function () { if ((util.inviewport(this.custom.container) && !this.custom.container.classlist.contains('animated')) || isnovibuilder) { this.run(); this.custom.container.classlist.add('animated'); } }).bind(counter), onblur: (function () { this.params.to = parseint(this.params.node.textcontent, 10); this.run(); }).bind(counter) }; if (isnovibuilder) { counter.run(); counter.params.node.addeventlistener('blur', counter.custom.onblur); } else { counter.custom.onscroll(); document.addeventlistener('scroll', counter.custom.onscroll); } } } // progress circle if (plugins.progresscircle) { for (var i = 0; i < plugins.progresscircle.length; i++) { var container = plugins.progresscircle[i], counter = acounter({ node: container.queryselector('.progress-circle-counter'), duration: 500, onupdate: function (value) { this.custom.bar.render(value * 3.6); } }); counter.params.oncompvare = counter.params.onupdate; counter.custom = { container: container, bar: aprogresscircle({node: container.queryselector('.progress-circle-bar')}), onscroll: (function () { if (util.inviewport(this.custom.container) && !this.custom.container.classlist.contains('animated')) { this.run(); this.custom.container.classlist.add('animated'); } }).bind(counter), onblur: (function () { this.params.to = parseint(this.params.node.textcontent, 10); this.run(); }).bind(counter) }; if (isnovibuilder) { counter.run(); counter.params.node.addeventlistener('blur', counter.custom.onblur); } else { counter.custom.onscroll(); window.addeventlistener('scroll', counter.custom.onscroll); } } } // isotope if (plugins.isotope.length) { for (var i = 0; i < plugins.isotope.length; i++) { var wrap = plugins.isotope[i], filterhandler = function (event) { event.preventdefault(); for (var n = 0; n < this.isogroup.filters.length; n++) this.isogroup.filters[n].classlist.remove('active'); this.classlist.add('active'); this.isogroup.isotope.arrange({filter: this.getattribute("data-isotope-filter") !== '*' ? '[data-filter*="' + this.getattribute("data-isotope-filter") + '"]' : '*'}); }, resizehandler = function () { this.isogroup.isotope.layout(); }; wrap.isogroup = {}; wrap.isogroup.filters = wrap.queryselectorall('[data-isotope-filter]'); wrap.isogroup.node = wrap.queryselector('.isotope'); wrap.isogroup.layout = wrap.isogroup.node.getattribute('data-isotope-layout') ? wrap.isogroup.node.getattribute('data-isotope-layout') : 'masonry'; wrap.isogroup.isotope = new isotope(wrap.isogroup.node, { itemselector: '.isotope-item', layoutmode: wrap.isogroup.layout, filter: '*', columnwidth: (function () { if (wrap.isogroup.node.hasattribute('data-column-class')) return wrap.isogroup.node.getattribute('data-column-class'); if (wrap.isogroup.node.hasattribute('data-column-width')) return parsefloat(wrap.isogroup.node.getattribute('data-column-width')); }()) }); for (var n = 0; n < wrap.isogroup.filters.length; n++) { var filter = wrap.isogroup.filters[n]; filter.isogroup = wrap.isogroup; filter.addeventlistener('click', filterhandler); } window.addeventlistener('resize', resizehandler.bind(wrap)); } } // material parallax if (plugins.materialparallax.length) { if (!isnovibuilder && !isie && !ismobile) { plugins.materialparallax.parallax(); } else { for (var i = 0; i < plugins.materialparallax.length; i++) { var $parallax = $(plugins.materialparallax[i]); $parallax.addclass('parallax-disabled'); $parallax.css({"background-image": 'url(' + $parallax.data("parallax-img") + ')'}); } } } }); // initialize scripts that require a finished document $(function () { isnovibuilder = window.xmode; /** * wrapper to eliminate json errors * @param {string} str - json string * @returns {object} - parsed or empty object */ function parsejson ( str ) { try { if ( str ) return json.parse( str ); else return {}; } catch ( error ) { console.warn( error ); return {}; } } /** * @desc sets the actual previous index based on the position of the slide in the markup. should be the most recent action. * @param {object} swiper - swiper instance */ function setrealprevious(swiper) { var element = swiper.$wrapperel[0].children[swiper.activeindex]; swiper.realprevious = array.prototype.indexof.call(element.parentnode.children, element); } /** * @desc sets slides background images from attribute 'data-slide-bg' * @param {object} swiper - swiper instance */ function setbackgrounds(swiper) { var swipersbg = swiper.el.queryselectorall('[data-slide-bg]'); for (var i = 0; i < swipersbg.length; i++) { var swiperbg = swipersbg[i]; swiperbg.style.backgroundimage = 'url(' + swiperbg.getattribute('data-slide-bg') + ')'; } } /** * @desc animate captions on active slides * @param {object} swiper - swiper instance */ function initcaptionanimate(swiper) { var animate = function (caption) { return function () { var duration; if (duration = caption.getattribute('data-caption-duration')) caption.style.animationduration = duration + 'ms'; caption.classlist.remove('not-animated'); caption.classlist.add(caption.getattribute('data-caption-animate')); caption.classlist.add('animated'); }; }, initializeanimation = function (captions) { for (var i = 0; i < captions.length; i++) { var caption = captions[i]; caption.classlist.remove('animated'); caption.classlist.remove(caption.getattribute('data-caption-animate')); caption.classlist.add('not-animated'); } }, finalizeanimation = function (captions) { for (var i = 0; i < captions.length; i++) { var caption = captions[i]; if (caption.getattribute('data-caption-delay')) { settimeout(animate(caption), number(caption.getattribute('data-caption-delay'))); } else { animate(caption)(); } } }; // caption parameters swiper.params.caption = { animationevent: 'slidechangetransitionend' }; initializeanimation(swiper.$wrapperel[0].queryselectorall('[data-caption-animate]')); finalizeanimation(swiper.$wrapperel[0].children[swiper.activeindex].queryselectorall('[data-caption-animate]')); if (swiper.params.caption.animationevent === 'slidechangetransitionend') { swiper.on(swiper.params.caption.animationevent, function () { initializeanimation(swiper.$wrapperel[0].children[swiper.previousindex].queryselectorall('[data-caption-animate]')); finalizeanimation(swiper.$wrapperel[0].children[swiper.activeindex].queryselectorall('[data-caption-animate]')); }); } else { swiper.on('slidechangetransitionend', function () { initializeanimation(swiper.$wrapperel[0].children[swiper.previousindex].queryselectorall('[data-caption-animate]')); }); swiper.on(swiper.params.caption.animationevent, function () { finalizeanimation(swiper.$wrapperel[0].children[swiper.activeindex].queryselectorall('[data-caption-animate]')); }); } } /** * @desc create live search results * @param {object} options */ function livesearch(options, handler) { $('#' + options.live).removeclass('cleared').html(); options.current++; options.spin.addclass('loading'); $.get(handler, { s: decodeuri(options.term), livesearch: options.live, datatype: "html", livecount: options.livecount, filter: options.filter, template: options.template }, function (data) { options.processed++; var live = $('#' + options.live); if ((options.processed === options.current) && !live.hasclass('cleared')) { live.find('> #search-results').removeclass('active'); live.html(data); settimeout(function () { live.find('> #search-results').addclass('active'); }, 50); } options.spin.parents('.rd-search').find('.input-group-addon').removeclass('loading'); }) } /** * @desc attach form validation to elements * @param {object} elements - jquery object */ function attachformvalidator(elements) { // custom validator - phone number regula.custom({ name: 'phonenumber', defaultmessage: 'invalid phone number format', validator: function () { if (this.value === '') return true; else return /^(\+\d)?[0-9\-\(\) ]{5,}$/i.test(this.value); } }); for (var i = 0; i < elements.length; i++) { var o = $(elements[i]), v; o.addclass("form-control-has-validation").after(""); v = o.parent().find(".form-validation"); if (v.is(":last-child")) o.addclass("form-control-last-child"); } elements.on('input change propertychange blur', function (e) { var $this = $(this), results; if (e.type !== "blur") if (!$this.parent().hasclass("has-error")) return; if ($this.parents('.rd-mailform').hasclass('success')) return; if ((results = $this.regula('validate')).length) { for (var i = 0; i < results.length; i++) { $this.siblings(".form-validation").text(results[i].message).parent().addclass("has-error"); } } else { $this.siblings(".form-validation").text("").parent().removeclass("has-error") } }).regula('bind'); var regularconstraintsmessages = [ { type: regula.constraint.required, newmessage: "the text field is required." }, { type: regula.constraint.email, newmessage: "the email is not a valid email." }, { type: regula.constraint.numeric, newmessage: "only numbers are required" }, { type: regula.constraint.selected, newmessage: "please choose an option." } ]; for (var i = 0; i < regularconstraintsmessages.length; i++) { var regularconstraint = regularconstraintsmessages[i]; regula.override({ constrainttype: regularconstraint.type, defaultmessage: regularconstraint.newmessage }); } } /** * @desc check if all elements pass validation * @param {object} elements - object of items for validation * @param {object} captcha - captcha object for validation * @return {boolean} */ function isvalidated(elements, captcha) { var results, errors = 0; if (elements.length) { for (var j = 0; j < elements.length; j++) { var $input = $(elements[j]); if ((results = $input.regula('validate')).length) { for (var k = 0; k < results.length; k++) { errors++; $input.siblings(".form-validation").text(results[k].message).parent().addclass("has-error"); } } else { $input.siblings(".form-validation").text("").parent().removeclass("has-error") } } if (captcha) { if (captcha.length) { return validaterecaptcha(captcha) && errors === 0 } } return errors === 0; } return true; } /** * @desc validate google recaptcha * @param {object} captcha - captcha object for validation * @return {boolean} */ function validaterecaptcha(captcha) { var captchatoken = captcha.find('.g-recaptcha-response').val(); if (captchatoken.length === 0) { captcha .siblings('.form-validation') .html('please, prove that you are not robot.') .addclass('active'); captcha .closest('.form-wrap') .addclass('has-error'); captcha.on('propertychange', function () { var $this = $(this), captchatoken = $this.find('.g-recaptcha-response').val(); if (captchatoken.length > 0) { $this .closest('.form-wrap') .removeclass('has-error'); $this .siblings('.form-validation') .removeclass('active') .html(''); $this.off('propertychange'); } }); return false; } return true; } /** * @desc initialize google recaptcha */ window.onloadcaptchacallback = function () { for (var i = 0; i < plugins.captcha.length; i++) { var $captcha = $(plugins.captcha[i]), resizehandler = (function () { var frame = this.queryselector('iframe'), inner = this.firstelementchild, inner2 = inner.firstelementchild, containerrect = null, framerect = null, scale = null; inner2.style.transform = ''; inner.style.height = 'auto'; inner.style.width = 'auto'; containerrect = this.getboundingclientrect(); framerect = frame.getboundingclientrect(); scale = containerrect.width / framerect.width; if (scale < 1) { inner2.style.transform = 'scale(' + scale + ')'; inner.style.height = (framerect.height * scale) + 'px'; inner.style.width = (framerect.width * scale) + 'px'; } }).bind(plugins.captcha[i]); grecaptcha.render( $captcha.attr('id'), { sitekey: $captcha.attr('data-sitekey'), size: $captcha.attr('data-size') ? $captcha.attr('data-size') : 'normal', theme: $captcha.attr('data-theme') ? $captcha.attr('data-theme') : 'light', callback: function () { $('.recaptcha').trigger('propertychange'); } } ); $captcha.after(""); if (plugins.captcha[i].hasattribute('data-auto-size')) { resizehandler(); window.addeventlistener('resize', resizehandler); } } }; /** * @desc initialize bootstrap tooltip with required placement * @param {string} tooltipplacement */ function initbootstraptooltip(tooltipplacement) { plugins.bootstraptooltip.tooltip('dispose'); if (window.innerwidth < 576) { plugins.bootstraptooltip.tooltip({placement: 'bottom'}); } else { plugins.bootstraptooltip.tooltip({placement: tooltipplacement}); } } /** * @desc initialize the gallery with set of images * @param {object} itemstoinit - jquery object * @param {string} [addclass] - additional gallery class */ function initlightgallery(itemstoinit, addclass) { if (!isnovibuilder) { $(itemstoinit).lightgallery({ thumbnail: $(itemstoinit).attr("data-lg-thumbnail") !== "false", selector: "[data-lightgallery='item']", autoplay: $(itemstoinit).attr("data-lg-autoplay") === "true", pause: parseint($(itemstoinit).attr("data-lg-autoplay-delay")) || 5000, addclass: addclass, mode: $(itemstoinit).attr("data-lg-animation") || "lg-slide", loop: $(itemstoinit).attr("data-lg-loop") !== "false" }); } } /** * @desc initialize the gallery with dynamic addition of images * @param {object} itemstoinit - jquery object * @param {string} [addclass] - additional gallery class */ function initdynamiclightgallery(itemstoinit, addclass) { if (!isnovibuilder) { $(itemstoinit).on("click", function () { $(itemstoinit).lightgallery({ thumbnail: $(itemstoinit).attr("data-lg-thumbnail") !== "false", selector: "[data-lightgallery='item']", autoplay: $(itemstoinit).attr("data-lg-autoplay") === "true", pause: parseint($(itemstoinit).attr("data-lg-autoplay-delay")) || 5000, addclass: addclass, mode: $(itemstoinit).attr("data-lg-animation") || "lg-slide", loop: $(itemstoinit).attr("data-lg-loop") !== "false", dynamic: true, dynamicel: json.parse($(itemstoinit).attr("data-lg-dynamic-elements")) || [] }); }); } } /** * @desc initialize the gallery with one image * @param {object} itemtoinit - jquery object * @param {string} [addclass] - additional gallery class */ function initlightgalleryitem(itemtoinit, addclass) { if (!isnovibuilder) { $(itemtoinit).lightgallery({ selector: "this", addclass: addclass, counter: false, youtubeplayerparams: { modestbranding: 1, showinfo: 0, rel: 0, controls: 0 }, vimeoplayerparams: { byline: 0, portrait: 0 } }); } } /** * @desc google map function for getting latitude and longitude */ function getlatlngobject(str, marker, map, callback) { var coordinates = {}; try { coordinates = json.parse(str); callback(new google.maps.latlng( coordinates.lat, coordinates.lng ), marker, map) } catch (e) { map.geocoder.geocode({'address': str}, function (results, status) { if (status === google.maps.geocoderstatus.ok) { var latitude = results[0].geometry.location.lat(); var longitude = results[0].geometry.location.lng(); callback(new google.maps.latlng( parsefloat(latitude), parsefloat(longitude) ), marker, map) } }) } } /** * @desc initialize google maps */ function initmaps() { var key; for (var i = 0; i < plugins.maps.length; i++) { if (plugins.maps[i].hasattribute("data-key")) { key = plugins.maps[i].getattribute("data-key"); break; } } $.getscript('//maps.google.com/maps/api/js?' + (key ? 'key=' + key + '&' : '') + 'libraries=geometry,places&v=quarterly', function () { var head = document.getelementsbytagname('head')[0], insertbefore = head.insertbefore; head.insertbefore = function (newelement, referenceelement) { if (newelement.href && newelement.href.indexof('//fonts.googleapis.com/css?family=roboto') !== -1 || newelement.innerhtml.indexof('gm-style') !== -1) { return; } insertbefore.call(head, newelement, referenceelement); }; var geocoder = new google.maps.geocoder; for (var i = 0; i < plugins.maps.length; i++) { var zoom = parseint(plugins.maps[i].getattribute("data-zoom"), 10) || 11; var styles = plugins.maps[i].hasattribute('data-styles') ? json.parse(plugins.maps[i].getattribute("data-styles")) : []; var center = plugins.maps[i].getattribute("data-center") || "new york"; // initialize map var map = new google.maps.map(plugins.maps[i].queryselectorall(".google-map")[0], { zoom: zoom, styles: styles, scrollwheel: false, center: { lat: 0, lng: 0 } }); // add map object to map node plugins.maps[i].map = map; plugins.maps[i].geocoder = geocoder; plugins.maps[i].keysupported = true; plugins.maps[i].google = google; // get center coordinates from attribute getlatlngobject(center, null, plugins.maps[i], function (location, markerelement, mapelement) { mapelement.map.setcenter(location); }); // add markers from google-map-markers array var markeritems = plugins.maps[i].queryselectorall(".google-map-markers li"); if (markeritems.length) { var markers = []; for (var j = 0; j < markeritems.length; j++) { var markerelement = markeritems[j]; getlatlngobject(markerelement.getattribute("data-location"), markerelement, plugins.maps[i], function (location, markerelement, mapelement) { var icon = markerelement.getattribute("data-icon") || mapelement.getattribute("data-icon"); var activeicon = markerelement.getattribute("data-icon-active") || mapelement.getattribute("data-icon-active"); var info = markerelement.getattribute("data-description") || ""; var infowindow = new google.maps.infowindow({ content: info }); markerelement.infowindow = infowindow; var markerdata = { position: location, map: mapelement.map } if (icon) { markerdata.icon = icon; } var marker = new google.maps.marker(markerdata); markerelement.gmarker = marker; markers.push({ markerelement: markerelement, infowindow: infowindow }); marker.isactive = false; // handle infowindow close click google.maps.event.addlistener(infowindow, 'closeclick', (function (markerelement, mapelement) { var markericon = null; markerelement.gmarker.isactive = false; markericon = markerelement.getattribute("data-icon") || mapelement.getattribute("data-icon"); markerelement.gmarker.seticon(markericon); }).bind(this, markerelement, mapelement)); // set marker active on click and open infowindow google.maps.event.addlistener(marker, 'click', (function (markerelement, mapelement) { var markericon; if (markerelement.infowindow.getcontent().length === 0) return; var gmarker, currentmarker = markerelement.gmarker, currentinfowindow; for (var k = 0; k < markers.length; k++) { if (markers[k].markerelement === markerelement) { currentinfowindow = markers[k].infowindow; } gmarker = markers[k].markerelement.gmarker; if (gmarker.isactive && markers[k].markerelement !== markerelement) { gmarker.isactive = false; markericon = markers[k].markerelement.getattribute("data-icon") || mapelement.getattribute("data-icon") gmarker.seticon(markericon); markers[k].infowindow.close(); } } currentmarker.isactive = !currentmarker.isactive; if (currentmarker.isactive) { if (markericon = markerelement.getattribute("data-icon-active") || mapelement.getattribute("data-icon-active")) { currentmarker.seticon(markericon); } currentinfowindow.open(map, marker); } else { if (markericon = markerelement.getattribute("data-icon") || mapelement.getattribute("data-icon")) { currentmarker.seticon(markericon); } currentinfowindow.close(); } }).bind(this, markerelement, mapelement)) }) } } } }); } // google recaptcha if (plugins.captcha.length) { $.getscript("//www.google.com/recaptcha/api.js?onload=onloadcaptchacallback&render=explicit&hl=en"); } // additional class on html if mac os. if (navigator.platform.match(/(mac)/i)) { $html.addclass("mac-os"); } // adds some loosing functionality to ie browsers (ie polyfills) if (isie) { if (isie === 12) $html.addclass("ie-edge"); if (isie === 11) $html.addclass("ie-11"); if (isie < 10) $html.addclass("lt-ie-10"); if (isie < 11) $html.addclass("ie-10"); } // bootstrap tooltips if (plugins.bootstraptooltip.length) { var tooltipplacement = plugins.bootstraptooltip.attr('data-bs-placement'); initbootstraptooltip(tooltipplacement); $window.on('resize orientationchange', function () { initbootstraptooltip(tooltipplacement); }) } // bootstrap modal if (plugins.bootstrapmodal.length) { for (var i = 0; i < plugins.bootstrapmodal.length; i++) { var modalitem = $(plugins.bootstrapmodal[i]); modalitem.on('hidden.bs.modal', $.proxy(function () { var activemodal = $(this), rdvideoinside = activemodal.find('video'), youtubevideoinside = activemodal.find('iframe'); if (rdvideoinside.length) { rdvideoinside[0].pause(); } if (youtubevideoinside.length) { var videourl = youtubevideoinside.attr('src'); youtubevideoinside .attr('src', '') .attr('src', videourl); } }, modalitem)) } } // popovers if (plugins.popover.length) { if (window.innerwidth < 767) { plugins.popover.attr('data-bs-placement', 'bottom'); plugins.popover.popover(); } else { plugins.popover.popover(); } } // bootstrap buttons if (plugins.statefulbutton.length) { $(plugins.statefulbutton).on('click', function () { var statefulbuttonloading = $(this).button('loading'); settimeout(function () { statefulbuttonloading.button('reset') }, 2000); }) } // bootstrap tabs if (plugins.bootstraptabs.length) { for (var i = 0; i < plugins.bootstraptabs.length; i++) { var bootstraptab = $(plugins.bootstraptabs[i]); //if have slick carousel inside tab - resize slick carousel on click if (bootstraptab.find('.slick-slider').length) { bootstraptab.find('.tabs-custom-list > li > a').on('click', $.proxy(function () { var $this = $(this); var settimeouttime = isnovibuilder ? 1500 : 300; settimeout(function () { $this.find('.tab-content .tab-pane.active .slick-slider').slick('setposition'); }, settimeouttime); }, bootstraptab)); } var tabs = plugins.bootstraptabs[i].queryselectorall('.nav li a'); for (var t = 0; t < tabs.length; t++) { var tab = tabs[t]; if (t === 0) { tab.parentelement.classlist.remove('active'); $(tab).tab('show'); } tab.addeventlistener('click', function (event) { event.preventdefault(); $(this).tab('show'); }); } } } // copyright year (evaluates correct copyright year) if (plugins.copyrightyear.length) { plugins.copyrightyear.text(initialdate.getfullyear()); } // google maps if (plugins.maps.length) { lazyinit(plugins.maps, initmaps); } // add custom styling options for input[type="radio"] if (plugins.radio.length) { for (var i = 0; i < plugins.radio.length; i++) { $(plugins.radio[i]).addclass("radio-custom").after("") } } // add custom styling options for input[type="checkbox"] if (plugins.checkbox.length) { for (var i = 0; i < plugins.checkbox.length; i++) { $(plugins.checkbox[i]).addclass("checkbox-custom").after("") } } // ui to top if (isdesktop && !isnovibuilder) { $().uitotop({ easingtype: 'easeoutquad', containerclass: 'ui-to-top fa fa-angle-up', scrollspeed: 100 }); } // rd navbar if (plugins.rdnavbar.length) { var navbar = plugins.rdnavbar, aliases = { '-': 0, '-sm-': 576, '-md-': 768, '-lg-': 992, '-xl-': 1200, '-xxl-': 1600 }, responsive = {}; for (var alias in aliases) { var link = responsive[aliases[alias]] = {}; if (navbar.attr('data' + alias + 'layout')) link.layout = navbar.attr('data' + alias + 'layout'); if (navbar.attr('data' + alias + 'device-layout')) link.devicelayout = navbar.attr('data' + alias + 'device-layout'); if (navbar.attr('data' + alias + 'hover-on')) link.focusonhover = navbar.attr('data' + alias + 'hover-on') === 'true'; if (navbar.attr('data' + alias + 'auto-height')) link.autoheight = navbar.attr('data' + alias + 'auto-height') === 'true'; if (navbar.attr('data' + alias + 'stick-up-offset')) link.stickupoffset = navbar.attr('data' + alias + 'stick-up-offset'); if (navbar.attr('data' + alias + 'stick-up')) link.stickup = navbar.attr('data' + alias + 'stick-up') === 'true'; if (isnovibuilder) link.stickup = false; else if (navbar.attr('data' + alias + 'stick-up')) link.stickup = navbar.attr('data' + alias + 'stick-up') === 'true'; } plugins.rdnavbar.rdnavbar({ anchornav: !isnovibuilder, stickupclone: (plugins.rdnavbar.attr("data-stick-up-clone") && !isnovibuilder) ? plugins.rdnavbar.attr("data-stick-up-clone") === 'true' : false, responsive: responsive, callbacks: { onstuck: function () { var navbarsearch = this.$element.find('.rd-search input'); if (navbarsearch) { navbarsearch.val('').trigger('propertychange'); } }, ondropdownover: function () { return !isnovibuilder; }, onunstuck: function () { if (this.$clone === null) return; var navbarsearch = this.$clone.find('.rd-search input'); if (navbarsearch) { navbarsearch.val('').trigger('propertychange'); navbarsearch.trigger('blur'); } } } }); } // rd search if (plugins.search.length || plugins.searchresults) { var handler = "bat/rd-search.php"; var defaulttemplate = '
#{title}
' + '

...#{token}...

' + '

terms matched: #{count} - url: #{href}

'; var defaultfilter = '*.html'; if (plugins.search.length) { for (var i = 0; i < plugins.search.length; i++) { var searchitem = $(plugins.search[i]), options = { element: searchitem, filter: (searchitem.attr('data-search-filter')) ? searchitem.attr('data-search-filter') : defaultfilter, template: (searchitem.attr('data-search-template')) ? searchitem.attr('data-search-template') : defaulttemplate, live: (searchitem.attr('data-search-live')) ? searchitem.attr('data-search-live') : false, livecount: (searchitem.attr('data-search-live-count')) ? parseint(searchitem.attr('data-search-live'), 10) : 4, current: 0, processed: 0, timer: {} }; var $toggle = $('.rd-navbar-search-toggle'); if ($toggle.length) { $toggle.on('click', (function (searchitem) { return function () { if (!($(this).hasclass('active'))) { searchitem.find('input').val('').trigger('propertychange'); } } })(searchitem)); } if (options.live) { var clearhandler = false; searchitem.find('input').on("input propertychange", $.proxy(function () { this.term = this.element.find('input').val().trim(); this.spin = this.element.find('.input-group-addon'); cleartimeout(this.timer); if (this.term.length > 2) { this.timer = settimeout(livesearch(this, handler), 200); if (clearhandler === false) { clearhandler = true; $body.on("click", function (e) { if ($(e.toelement).parents('.rd-search').length === 0) { $('#rd-search-results-live').addclass('cleared').html(''); } }) } } else if (this.term.length === 0) { $('#' + this.live).addclass('cleared').html(''); } }, options, this)); } searchitem.submit($.proxy(function () { $('').attr('type', 'hidden') .attr('name', "filter") .attr('value', this.filter) .appendto(this.element); return true; }, options, this)) } } if (plugins.searchresults.length) { var regexp = /\?.*s=([^&]+)\&filter=([^&]+)/g; var match = regexp.exec(location.search); if (match !== null) { $.get(handler, { s: decodeuri(match[1]), datatype: "html", filter: match[2], template: defaulttemplate, live: '' }, function (data) { plugins.searchresults.html(data); }) } } } // add class in viewport if (plugins.viewanimate.length) { for (var i = 0; i < plugins.viewanimate.length; i++) { var $view = $(plugins.viewanimate[i]).not('.active'); $document.on("scroll", $.proxy(function () { if (isscrolledintoview(this)) { this.addclass("active"); } }, $view)) .trigger("scroll"); } } // swiper if (plugins.swiper.length) { for (var i = 0; i < plugins.swiper.length; i++) { var node = plugins.swiper[i], params = parsejson(node.getattribute('data-swiper')), defaults = { speed: 1000, loop: true, pagination: { el: '.swiper-pagination', clickable: true }, navigation: { nextel: '.swiper-button-next', prevel: '.swiper-button-prev' }, autoplay: { delay: 5000 } }, xmode = { autoplay: false, loop: false, simulatetouch: false }; params.on = { init: function () { setbackgrounds(this); setrealprevious(this); initcaptionanimate(this); // real previous index must be set recent this.on('slidechangetransitionend', function () { setrealprevious(this); }); } }; new swiper( node, util.merge( isnovibuilder ? [ defaults, params, xmode ] : [ defaults, params ] ) ); } } // owl carousel if (plugins.owl.length) { for (var i = 0; i < plugins.owl.length; i++) { var node = plugins.owl[i], params = parsejson( node.getattribute( 'data-owl' ) ), defaults = { items: 1, margin: 30, loop: true, mousedrag: true, stagepadding: 0, nav: false, navtext: [], dots: false, autoplay: true, autoplaytimeout: 3000, autoplayhoverpause: true }, xmode = { autoplay: false, loop: false, mousedrag: false }, generated = { autoplay: node.getattribute( 'data-autoplay' ) !== 'false', loop: node.getattribute( 'data-loop' ) !== 'false', mousedrag: node.getattribute( 'data-mouse-drag' ) !== 'false', responsive: {} }, aliases = [ '-', '-sm-', '-md-', '-lg-', '-xl-', '-xxl-' ], values = [ 0, 576, 768, 992, 1200, 1600 ], responsive = generated.responsive; for ( var j = 0; j < values.length; j++ ) { responsive[ values[ j ] ] = {}; for ( var k = j; k >= -1; k-- ) { if ( !responsive[ values[ j ] ][ 'items' ] && node.getattribute( 'data' + aliases[ k ] + 'items' ) ) { responsive[ values[ j ] ][ 'items' ] = k < 0 ? 1 : parseint( node.getattribute( 'data' + aliases[ k ] + 'items' ), 10 ); } if ( !responsive[ values[ j ] ][ 'stagepadding' ] && responsive[ values[ j ] ][ 'stagepadding' ] !== 0 && node.getattribute( 'data' + aliases[ k ] + 'stage-padding' ) ) { responsive[ values[ j ] ][ 'stagepadding' ] = k < 0 ? 0 : parseint( node.getattribute( 'data' + aliases[ k ] + 'stage-padding' ), 10 ); } if ( !responsive[ values[ j ] ][ 'margin' ] && responsive[ values[ j ] ][ 'margin' ] !== 0 && node.getattribute( 'data' + aliases[ k ] + 'margin' ) ) { responsive[ values[ j ] ][ 'margin' ] = k < 0 ? 30 : parseint( node.getattribute( 'data' + aliases[ k ] + 'margin' ), 10 ); } } } // initialize lightgallery items in cloned owl items $(node).on('initialized.owl.carousel', function () { initlightgalleryitem($(node).find('[data-lightgallery="item"]'), 'lightgallery-in-carousel'); }); node.owl = $( node ); $( node ).owlcarousel( util.merge( isnovibuilder ? [ defaults, params, generated, xmode ] : [ defaults, params, generated ] ) ); } } // wow if ($html.hasclass("wow-animation") && plugins.wow.length && !isnovibuilder && isdesktop) { new wow().init(); } // bootstrap accordion if (plugins.bootstrapaccordion.length) { for (let i = 0; i < plugins.bootstrapaccordion.length; i++) { let accordionitem = plugins.bootstrapaccordion[i]; let accordionhead = accordionitem.queryselector('.accordion-button'); if (accordionhead.getattribute('aria-expanded')!=='true') { accordionhead.classlist.add('collapsed') accordionhead.setattribute('aria-expanded', 'false') } } } // rd input label if (plugins.rdinputlabel.length) { plugins.rdinputlabel.rdinputlabel(); } // regula if (plugins.regula.length) { attachformvalidator(plugins.regula); } // mailchimp ajax subscription if (plugins.mailchimp.length) { for (var i = 0; i < plugins.mailchimp.length; i++) { var $mailchimpitem = $(plugins.mailchimp[i]), $email = $mailchimpitem.find('input[type="email"]'); // required by mailchimp $mailchimpitem.attr('novalidate', 'true'); $email.attr('name', 'email'); $mailchimpitem.on('submit', $.proxy(function ($email, event) { event.preventdefault(); var $this = this; var data = {}, url = $this.attr('action').replace('/post?', '/post-json?').concat('&c=?'), dataarray = $this.serializearray(), $output = $("#" + $this.attr("data-form-output")); for (i = 0; i < dataarray.length; i++) { data[dataarray[i].name] = dataarray[i].value; } $.ajax({ data: data, url: url, datatype: 'jsonp', error: function (resp, text) { $output.html('server error: ' + text); settimeout(function () { $output.removeclass("active"); }, 4000); }, success: function (resp) { $output.html(resp.msg).addclass('active'); $email[0].value = ''; var $label = $('[for="' + $email.attr('id') + '"]'); if ($label.length) $label.removeclass('focus not-empty'); settimeout(function () { $output.removeclass("active"); }, 6000); }, beforesend: function (data) { var isnovibuilder = window.xmode; var isvalidated = (function () { var results, errors = 0; var elements = $this.find('[data-constraints]'); var captcha = null; if (elements.length) { for (var j = 0; j < elements.length; j++) { var $input = $(elements[j]); if ((results = $input.regula('validate')).length) { for (var k = 0; k < results.length; k++) { errors++; $input.siblings(".form-validation").text(results[k].message).parent().addclass("has-error"); } } else { $input.siblings(".form-validation").text("").parent().removeclass("has-error") } } if (captcha) { if (captcha.length) { return validaterecaptcha(captcha) && errors === 0 } } return errors === 0; } return true; })(); // stop request if builder or inputs are invalide if (isnovibuilder || !isvalidated) return false; $output.html('submitting...').addclass('active'); } }); return false; }, $mailchimpitem, $email)); } } // campaign monitor ajax subscription if (plugins.campaignmonitor.length) { for (var i = 0; i < plugins.campaignmonitor.length; i++) { var $campaignitem = $(plugins.campaignmonitor[i]); $campaignitem.on('submit', $.proxy(function (e) { var data = {}, url = this.attr('action'), dataarray = this.serializearray(), $output = $("#" + plugins.campaignmonitor.attr("data-form-output")), $this = $(this); for (i = 0; i < dataarray.length; i++) { data[dataarray[i].name] = dataarray[i].value; } $.ajax({ data: data, url: url, datatype: 'jsonp', error: function (resp, text) { $output.html('server error: ' + text); settimeout(function () { $output.removeclass("active"); }, 4000); }, success: function (resp) { $output.html(resp.message).addclass('active'); settimeout(function () { $output.removeclass("active"); }, 6000); }, beforesend: function (data) { // stop request if builder or inputs are invalide if (isnovibuilder || !isvalidated($this.find('[data-constraints]'))) return false; $output.html('submitting...').addclass('active'); } }); // clear inputs after submit var inputs = $this[0].getelementsbytagname('input'); for (var i = 0; i < inputs.length; i++) { inputs[i].value = ''; var label = document.queryselector('[for="' + inputs[i].getattribute('id') + '"]'); if (label) label.classlist.remove('focus', 'not-empty'); } return false; }, $campaignitem)); } } // rd mailform if (plugins.rdmailform.length) { var i, j, k, msg = { 'mf000': 'successfully sent!', 'mf001': 'recipients are not set!', 'mf002': 'form will not work locally!', 'mf003': 'please, define email field in your form!', 'mf004': 'please, define type of your form!', 'mf254': 'something went wrong with phpmailer!', 'mf255': 'aw, snap! something went wrong.' }; for (i = 0; i < plugins.rdmailform.length; i++) { var $form = $(plugins.rdmailform[i]), formhascaptcha = false; $form.attr('novalidate', 'novalidate').ajaxform({ data: { "form-type": $form.attr("data-form-type") || "contact", "counter": i }, beforesubmit: function (arr, $form, options) { if (isnovibuilder) return; var form = $(plugins.rdmailform[this.extradata.counter]), inputs = form.find("[data-constraints]"), output = $("#" + form.attr("data-form-output")), captcha = form.find('.recaptcha'), captchaflag = true; output.removeclass("active error success"); if (isvalidated(inputs, captcha)) { // veify recaptcha if (captcha.length) { var captchatoken = captcha.find('.g-recaptcha-response').val(), captchamsg = { 'cpt001': 'please, setup you "site key" and "secret key" of recaptcha', 'cpt002': 'something wrong with google recaptcha' }; formhascaptcha = true; $.ajax({ method: "post", url: "bat/recaptcha.php", data: {'g-recaptcha-response': captchatoken}, async: false }) .done(function (responcecode) { if (responcecode !== 'cpt000') { if (output.hasclass("snackbars")) { output.html('

' + captchamsg[responcecode] + '

') settimeout(function () { output.removeclass("active"); }, 3500); captchaflag = false; } else { output.html(captchamsg[responcecode]); } output.addclass("active"); } }); } if (!captchaflag) { return false; } form.addclass('form-in-process'); if (output.hasclass("snackbars")) { output.html('

sending

'); output.addclass("active"); } } else { return false; } }, error: function (result) { if (isnovibuilder) return; var output = $("#" + $(plugins.rdmailform[this.extradata.counter]).attr("data-form-output")), form = $(plugins.rdmailform[this.extradata.counter]); output.text(msg[result]); form.removeclass('form-in-process'); if (formhascaptcha) { grecaptcha.reset(); window.dispatchevent( new event( 'resize' ) ); } }, success: function (result) { if (isnovibuilder) return; var form = $(plugins.rdmailform[this.extradata.counter]), output = $("#" + form.attr("data-form-output")), select = form.find('select'); form .addclass('success') .removeclass('form-in-process'); if (formhascaptcha) { grecaptcha.reset(); window.dispatchevent( new event( 'resize' ) ); } result = result.length === 5 ? result : 'mf255'; output.text(msg[result]); if (result === "mf000") { if (output.hasclass("snackbars")) { output.html('

' + msg[result] + '

'); } else { output.addclass("active success"); } } else { if (output.hasclass("snackbars")) { output.html('

' + msg[result] + '

'); } else { output.addclass("active error"); } } form.clearform(); if (select.length) { select.select2("val", ""); } form.find('input, textarea').trigger('blur'); settimeout(function () { output.removeclass("active error success"); form.removeclass('success'); }, 3500); } }); } } // lightgallery if (plugins.lightgallery.length) { for (var i = 0; i < plugins.lightgallery.length; i++) { initlightgallery(plugins.lightgallery[i]); } } // lightgallery item if (plugins.lightgalleryitem.length) { // filter carousel items var notcarouselitems = []; for (var z = 0; z < plugins.lightgalleryitem.length; z++) { if (!$(plugins.lightgalleryitem[z]).parents('.owl-carousel').length && !$(plugins.lightgalleryitem[z]).parents('.swiper-slider').length && !$(plugins.lightgalleryitem[z]).parents('.slick-slider').length) { notcarouselitems.push(plugins.lightgalleryitem[z]); } } plugins.lightgalleryitem = notcarouselitems; for (var i = 0; i < plugins.lightgalleryitem.length; i++) { initlightgalleryitem(plugins.lightgalleryitem[i]); } } // dynamic lightgallery if (plugins.lightdynamicgalleryitem.length) { for (var i = 0; i < plugins.lightdynamicgalleryitem.length; i++) { initdynamiclightgallery(plugins.lightdynamicgalleryitem[i]); } } // custom toggles if (plugins.customtoggle.length) { for (var i = 0; i < plugins.customtoggle.length; i++) { var $this = $(plugins.customtoggle[i]); $this.on('click', $.proxy(function (event) { event.preventdefault(); var $ctx = $(this); $($ctx.attr('data-custom-toggle')).add(this).toggleclass('active'); }, $this)); if ($this.attr("data-custom-toggle-hide-on-blur") === "true") { $body.on("click", $this, function (e) { if (e.target !== e.data[0] && $(e.data.attr('data-custom-toggle')).find($(e.target)).length && e.data.find($(e.target)).length === 0) { $(e.data.attr('data-custom-toggle')).add(e.data[0]).removeclass('active'); } }) } if ($this.attr("data-custom-toggle-disable-on-blur") === "true") { $body.on("click", $this, function (e) { if (e.target !== e.data[0] && $(e.data.attr('data-custom-toggle')).find($(e.target)).length === 0 && e.data.find($(e.target)).length === 0) { $(e.data.attr('data-custom-toggle')).add(e.data[0]).removeclass('active'); } }) } } } // countdown if (plugins.countdown.length) { for (var i = 0; i < plugins.countdown.length; i++) { var node = plugins.countdown[i], countdown = acountdown({ node: node, from: node.getattribute('data-from'), to: node.getattribute('data-to'), count: node.getattribute('data-count'), tick: 100, }); } } }); $(function(){ var nav = $('.rd-navbar-nav'), logo = $('.rd-navbar-brand'), doc = $(document), win = $(window); win.scroll(function() { if (doc.scrolltop() > 80) { nav.addclass('scrolled'); logo.addclass('scrolled'); } else { nav.removeclass('scrolled'); logo.removeclass('scrolled'); } }); win.scroll(); }); }());