summaryrefslogtreecommitdiff
path: root/src/main/resources/static/js/script.js
diff options
context:
space:
mode:
authorAlisaLinUwU <alisalinuwu@gmail.com>2025-01-26 11:41:45 +0500
committerAlisaLinUwU <alisalinuwu@gmail.com>2025-01-26 11:41:45 +0500
commit93fe6a825baa3c5141fb220256b2c0b1fc3da273 (patch)
treeb9cca4a0b970e8ee53a6465c1d2a572fb6dfb825 /src/main/resources/static/js/script.js
Initializemain
Diffstat (limited to 'src/main/resources/static/js/script.js')
-rw-r--r--src/main/resources/static/js/script.js1251
1 files changed, 1251 insertions, 0 deletions
diff --git a/src/main/resources/static/js/script.js b/src/main/resources/static/js/script.js
new file mode 100644
index 0000000..2bfa244
--- /dev/null
+++ b/src/main/resources/static/js/script.js
@@ -0,0 +1,1251 @@
+"use strict";
+
+(function () {
+ var userAgent = navigator.userAgent.toLowerCase(),
+ initialDate = new Date(),
+
+ $document = $(document),
+ $window = $(window),
+ $html = $("html"),
+ $body = $("body"),
+
+
+ isRtl = $html.attr("dir") === "rtl",
+ isDesktop = $html.hasClass("desktop"),
+ isIE = userAgent.indexOf("msie") !== -1 ? parseInt(userAgent.split("msie")[1], 10) : userAgent.indexOf("trident") !== -1 ? 11 : userAgent.indexOf("edge") !== -1 ? 12 : false,
+ isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
+ windowReady = false,
+ isNoviBuilder = false,
+
+ plugins = {
+ pointerEvents: isIE < 11 ? "js/pointer-events.min.js" : false,
+ bootstrapTooltip: $("[data-toggle='tooltip']"),
+ captcha: $('.recaptcha'),
+ maps: $(".google-map-container"),
+ rdNavbar: $(".rd-navbar"),
+ wow: $(".wow"),
+ owl: $(".owl-carousel"),
+ swiper: $(".swiper-slider"),
+ counter: $(".counter"),
+ progressBar: $(".progress-bar-js"),
+ selectFilter: $("select"),
+ rdInputLabel: $(".form-label"),
+ customToggle: $("[data-custom-toggle]"),
+ rdMailForm: $(".rd-mailform"),
+ regula: $("[data-constraints]"),
+ preloader: $(".preloader"),
+ pageTitles: $('.page-title'),
+ copyrightYear: $(".copyright-year"),
+ materialParallax: $(".parallax-container"),
+ };
+
+ /**
+ * Initialize All Scripts
+ */
+
+ // Initialize scripts that require a loaded page
+ $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 !/(\#|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;
+ }
+ });
+ }
+ });
+
+
+ $(function () {
+ var isNoviBuilder = window.xMode;
+
+ /**
+ * Is Mac os
+ * @description add additional class on html if mac os.
+ */
+ if (navigator.platform.match(/(Mac)/i)) $html.addClass("mac");
+
+ /**
+ * getSwiperHeight
+ * @description calculate the height of swiper slider basing on data attr
+ */
+ function getSwiperHeight(object, attr) {
+ var val = object.attr("data-" + attr),
+ dim;
+
+ if (!val) {
+ return undefined;
+ }
+
+ dim = val.match(/(px)|(%)|(vh)|(vw)$/i);
+
+ if (dim.length) {
+ switch (dim[0]) {
+ case "px":
+ return parseFloat(val);
+ case "vh":
+ return $window.height() * (parseFloat(val) / 100);
+ case "vw":
+ return $window.width() * (parseFloat(val) / 100);
+ case "%":
+ return object.width() * (parseFloat(val) / 100);
+ }
+ } else {
+ return undefined;
+ }
+ }
+
+ /**
+ * toggleSwiperInnerVideos
+ * @description toggle swiper videos on active slides
+ */
+ function toggleSwiperInnerVideos(swiper) {
+ var prevSlide = $(swiper.slides[swiper.previousIndex]),
+ nextSlide = $(swiper.slides[swiper.activeIndex]),
+ videos;
+
+ prevSlide.find("video").each(function () {
+ this.pause();
+ });
+
+ videos = nextSlide.find("video");
+ if (videos.length) {
+ videos.get(0).play();
+ }
+ }
+
+ /**
+ * toggleSwiperCaptionAnimation
+ * @description toggle swiper animations on active slides
+ */
+ function toggleSwiperCaptionAnimation(swiper) {
+ var prevSlide = $(swiper.container).find("[data-caption-animate]"),
+ nextSlide = $(swiper.slides[swiper.activeIndex]).find("[data-caption-animate]"),
+ delay,
+ duration,
+ nextSlideItem,
+ prevSlideItem;
+
+ for (var i = 0; i < prevSlide.length; i++) {
+ prevSlideItem = $(prevSlide[i]);
+
+ prevSlideItem.removeClass("animated")
+ .removeClass(prevSlideItem.attr("data-caption-animate"))
+ .addClass("not-animated");
+ }
+
+
+ var tempFunction = function (nextSlideItem, duration) {
+ return function () {
+ nextSlideItem
+ .removeClass("not-animated")
+ .addClass(nextSlideItem.attr("data-caption-animate"))
+ .addClass("animated");
+ if (duration) {
+ nextSlideItem.css('animation-duration', duration + 'ms');
+ }
+ };
+ };
+
+ for (var i = 0; i < nextSlide.length; i++) {
+ nextSlideItem = $(nextSlide[i]);
+ delay = nextSlideItem.attr("data-caption-delay");
+ duration = nextSlideItem.attr('data-caption-duration');
+ if (!isNoviBuilder) {
+ if (delay) {
+ setTimeout(tempFunction(nextSlideItem, duration), parseInt(delay, 10));
+ } else {
+ tempFunction(nextSlideItem, duration);
+ }
+
+ } else {
+ nextSlideItem.removeClass("not-animated")
+ }
+ }
+ }
+
+ /**
+ * isScrolledIntoView
+ * @description check the element whas been scrolled into the view
+ */
+ function isScrolledIntoView(elem) {
+ if (!isNoviBuilder) {
+ return elem.offset().top + elem.outerHeight() >= $window.scrollTop() && elem.offset().top <= $window.scrollTop() + $window.height();
+ }
+ else {
+ return true;
+ }
+ }
+
+ /**
+ * initOnView
+ * @description calls a function when element has been scrolled into the view
+ */
+ function lazyInit(element, func) {
+ $document.on('scroll', function () {
+ if ((!element.hasClass('lazy-loaded') && (isScrolledIntoView(element)))) {
+ func.call();
+ element.addClass('lazy-loaded');
+ }
+ }).trigger("scroll");
+ }
+
+
+ /**
+ * @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 + '&' : '' ) +'sensor=false&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) {
+ if (markerElement.infoWindow.getContent().length === 0) return;
+ var gMarker, currentMarker = markerElement.gmarker, currentInfoWindow;
+ for (var k =0; k < markers.length; k++){
+ var markerIcon;
+ 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))
+ })
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * attachFormValidator
+ * @description attach form validation to elements
+ */
+ function attachFormValidator(elements) {
+ for (var i = 0; i < elements.length; i++) {
+ var o = $(elements[i]), v;
+ o.addClass("form-control-has-validation").after("<span class='form-validation'></span>");
+ 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 (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
+ });
+ }
+ }
+
+ /**
+ * isValidated
+ * @description check if all elemnts pass validation
+ */
+ 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 (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;
+ }
+
+
+ /**
+ * validateReCaptcha
+ * @description validate google reCaptcha
+ */
+ 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;
+ }
+
+
+ /**
+ * onloadCaptchaCallback
+ * @description init google reCaptcha
+ */
+ window.onloadCaptchaCallback = function () {
+ for (var i = 0; i < plugins.captcha.length; i++) {
+ var $capthcaItem = $(plugins.captcha[i]);
+
+ grecaptcha.render(
+ $capthcaItem.attr('id'),
+ {
+ sitekey: $capthcaItem.attr('data-sitekey'),
+ size: $capthcaItem.attr('data-size') ? $capthcaItem.attr('data-size') : 'normal',
+ theme: $capthcaItem.attr('data-theme') ? $capthcaItem.attr('data-theme') : 'light',
+ callback: function (e) {
+ $('.recaptcha').trigger('propertychange');
+ }
+ }
+ );
+ $capthcaItem.after("<span class='form-validation'></span>");
+ }
+ };
+
+ /**
+ * Google ReCaptcha
+ * @description Enables Google ReCaptcha
+ */
+ if (plugins.captcha.length) {
+ $.getScript("//www.google.com/recaptcha/api.js?onload=onloadCaptchaCallback&render=explicit&hl=en");
+ }
+
+ /**
+ * Init Bootstrap tooltip
+ * @description calls a function when need to init bootstrap tooltips
+ */
+ function initBootstrapTooltip(tooltipPlacement) {
+ if (window.innerWidth < 576) {
+ plugins.bootstrapTooltip.tooltip('dispose');
+ plugins.bootstrapTooltip.tooltip({
+ placement: 'bottom'
+ });
+ } else {
+ plugins.bootstrapTooltip.tooltip('dispose');
+ plugins.bootstrapTooltip.tooltip({
+ placement: tooltipPlacement
+ });
+ }
+ }
+
+ /**
+ * Copyright Year
+ * @description Evaluates correct copyright year
+ */
+ if (plugins.copyrightYear.length) {
+ plugins.copyrightYear.text(initialDate.getFullYear());
+ }
+
+
+ // Google maps
+ if( plugins.maps.length ) {
+ lazyInit( plugins.maps, initMaps );
+ }
+
+ /**
+ * IE Polyfills
+ * @description Adds some loosing functionality to IE browsers
+ */
+ if (isIE) {
+ if (isIE < 10) {
+ $html.addClass("lt-ie-10");
+ }
+
+ if (isIE < 11) {
+ if (plugins.pointerEvents) {
+ $.getScript(plugins.pointerEvents)
+ .done(function () {
+ $html.addClass("ie-10");
+ PointerEventsPolyfill.initialize({});
+ });
+ }
+ }
+
+ if (isIE === 11) {
+ $("html").addClass("ie-11");
+ }
+
+ if (isIE === 12) {
+ $("html").addClass("ie-edge");
+ }
+ }
+
+ /**
+ * Bootstrap Tooltips
+ * @description Activate Bootstrap Tooltips
+ */
+ if (plugins.bootstrapTooltip.length) {
+ var tooltipPlacement = plugins.bootstrapTooltip.attr('data-placement');
+ initBootstrapTooltip(tooltipPlacement);
+
+ $window.on('resize orientationchange', function () {
+ initBootstrapTooltip(tooltipPlacement);
+ });
+ }
+
+ /**
+ * Select2
+ * @description Enables select2 plugin
+ */
+ if (plugins.selectFilter.length) {
+ for (var i = 0; i < plugins.selectFilter.length; i++) {
+ var select = $(plugins.selectFilter[i]);
+
+ select.select2({
+ theme: select.attr('data-custom-theme') ? select.attr('data-custom-theme') : "bootstrap"
+ }).next().addClass(select.attr("class").match(/(input-sm)|(input-lg)|($)/i).toString().replace(new RegExp(",", 'g'), " "));
+ }
+ }
+
+ /**
+ * Progress bar
+ * @description Enable progress bar
+ */
+ if (plugins.progressBar.length) {
+ var i,
+ bar,
+ type;
+
+ for (i = 0; i < plugins.progressBar.length; i++) {
+ var progressItem = plugins.progressBar[i];
+ bar = null;
+
+ if (progressItem.className.indexOf("progress-bar-horizontal") > -1) {
+ type = 'Line';
+ }
+
+ if (progressItem.className.indexOf("progress-bar-radial") > -1) {
+ type = 'Circle';
+ }
+
+ if (progressItem.getAttribute("data-stroke") && progressItem.getAttribute("data-value") && type) {
+ bar = new ProgressBar[type](progressItem, {
+ strokeWidth: Math.round(parseFloat(progressItem.getAttribute("data-stroke")) / progressItem.offsetWidth * 100),
+ trailWidth: progressItem.getAttribute("data-trail") ? Math.round(parseFloat(progressItem.getAttribute("data-trail")) / progressItem.offsetWidth * 100) : 0,
+ text: {
+ value: progressItem.getAttribute("data-counter") === "true" ? '0' : null,
+ className: 'progress-bar__body',
+ style: null
+ }
+ });
+ bar.svg.setAttribute('preserveAspectRatio', "none meet");
+ if (type === 'Line') {
+ bar.svg.setAttributeNS(null, "height", progressItem.getAttribute("data-stroke"));
+ }
+
+ bar.path.removeAttribute("stroke");
+ bar.path.className.baseVal = "progress-bar__stroke";
+ if (bar.trail) {
+ bar.trail.removeAttribute("stroke");
+ bar.trail.className.baseVal = "progress-bar__trail";
+ }
+
+ if (progressItem.getAttribute("data-easing") && !isIE) {
+ $(document)
+ .on("scroll", {"barItem": bar}, $.proxy(function (event) {
+ var bar = event.data.barItem;
+ var $this = $(this);
+
+ if (isScrolledIntoView($this) && this.className.indexOf("progress-bar--animated") === -1) {
+ this.className += " progress-bar--animated";
+ bar.animate(parseInt($this.attr("data-value")) / 100.0, {
+ easing: $this.attr("data-easing"),
+ duration: $this.attr("data-duration") ? parseInt($this.attr("data-duration")) : 800,
+ step: function (state, b) {
+ if (b._container.className.indexOf("progress-bar-horizontal") > -1 ||
+ b._container.className.indexOf("progress-bar-vertical") > -1) {
+ b.text.style.width = Math.abs(b.value() * 100).toFixed(0) + "%"
+ }
+ b.setText(Math.abs(b.value() * 100).toFixed(0));
+ }
+ });
+ }
+ }, progressItem))
+ .trigger("scroll");
+ } else {
+ bar.set(parseInt($(progressItem).attr("data-value")) / 100.0);
+ bar.setText($(progressItem).attr("data-value"));
+ if (type === 'Line') {
+ bar.text.style.width = parseInt($(progressItem).attr("data-value")) + "%";
+ }
+ }
+ } else {
+ console.error(progressItem.className + ": progress bar type is not defined");
+ }
+ }
+ }
+
+ /**
+ * UI To Top
+ * @description Enables ToTop Button
+ */
+ if (isDesktop && !isNoviBuilder) {
+ $().UItoTop({
+ easingType: 'easeOutQuart',
+ containerClass: 'ui-to-top fa fa-angle-up'
+ });
+ }
+
+ // 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');
+ }
+
+ }
+ }
+ });
+ }
+
+
+ /**
+ * Swiper
+ * @description Enable Swiper Slider
+ */
+ if (plugins.swiper.length) {
+ for (var i = 0; i < plugins.swiper.length; i++) {
+ var s = $(plugins.swiper[i]);
+ var pag = s.find(".swiper-pagination"),
+ next = s.find(".swiper-button-next"),
+ prev = s.find(".swiper-button-prev"),
+ bar = s.find(".swiper-scrollbar"),
+ swiperSlide = s.find(".swiper-slide"),
+ autoplay = false;
+
+ for (var j = 0; j < swiperSlide.length; j++) {
+ var $this = $(swiperSlide[j]),
+ url;
+
+ if (url = $this.attr("data-slide-bg")) {
+ $this.css({
+ "background-image": "url(" + url + ")",
+ "background-size": "cover"
+ })
+ }
+ }
+
+ swiperSlide.end()
+ .find("[data-caption-animate]")
+ .addClass("not-animated")
+ .end();
+
+ s.swiper({
+ autoplay: s.attr('data-autoplay') ? s.attr('data-autoplay') === "false" ? undefined : s.attr('data-autoplay') : 5000,
+ direction: s.attr('data-direction') ? s.attr('data-direction') : "horizontal",
+ effect: s.attr('data-slide-effect') ? s.attr('data-slide-effect') : "slide",
+ speed: s.attr('data-slide-speed') ? s.attr('data-slide-speed') : 600,
+ keyboardControl: s.attr('data-keyboard') === "true",
+ mousewheelControl: s.attr('data-mousewheel') === "true",
+ mousewheelReleaseOnEdges: s.attr('data-mousewheel-release') === "true",
+ nextButton: next.length ? next.get(0) : null,
+ prevButton: prev.length ? prev.get(0) : null,
+ pagination: pag.length ? pag.get(0) : null,
+ paginationClickable: pag.length ? pag.attr("data-clickable") !== "false" : false,
+ paginationBulletRender: pag.length ? pag.attr("data-index-bullet") === "true" ? function (swiper, index, className) {
+ return '<span class="' + className + '">' + (index + 1) + '</span>';
+ } : null : null,
+ scrollbar: bar.length ? bar.get(0) : null,
+ scrollbarDraggable: bar.length ? bar.attr("data-draggable") !== "false" : true,
+ scrollbarHide: bar.length ? bar.attr("data-draggable") === "false" : false,
+ loop: isNoviBuilder ? false : s.attr('data-loop') !== "false",
+ simulateTouch: s.attr('data-simulate-touch') && !isNoviBuilder ? s.attr('data-simulate-touch') === "true" : false,
+ onTransitionStart: function (swiper) {
+ toggleSwiperInnerVideos(swiper);
+ },
+ onTransitionEnd: function (swiper) {
+ toggleSwiperCaptionAnimation(swiper);
+ },
+ onInit: function (swiper) {
+ toggleSwiperInnerVideos(swiper);
+ toggleSwiperCaptionAnimation(swiper);
+
+ if (!isRtl) {
+ $window.on('resize', function () {
+ swiper.update(true);
+ });
+ }
+ }
+ });
+
+ $window.on("resize", (function (s) {
+ return function () {
+ var mh = getSwiperHeight(s, "min-height"),
+ h = getSwiperHeight(s, "height");
+ if (h) {
+ s.css("height", mh ? mh > h ? mh : h : h);
+ }
+ }
+ })(s)).trigger("resize");
+ }
+ }
+
+ /**
+ * Owl carousel
+ * @description Enables Owl carousel plugin
+ */
+ if (plugins.owl.length) {
+ for (var i = 0; i < plugins.owl.length; i++) {
+ var c = $(plugins.owl[i]);
+ plugins.owl[i] = c;
+
+ initOwlCarousel(c);
+ }
+ }
+
+ /**
+ * initOwlCarousel
+ * @description Init owl carousel plugin
+ */
+ function initOwlCarousel(c) {
+ var aliaces = ["-", "-sm-", "-md-", "-lg-", "-xl-", "-xxl-"],
+ values = [0, 576, 768, 992, 1200, 1600],
+ responsive = {};
+
+ for (var j = 0; j < values.length; j++) {
+ responsive[values[j]] = {};
+ for (var k = j; k >= -1; k--) {
+ if (!responsive[values[j]]["items"] && c.attr("data" + aliaces[k] + "items")) {
+ responsive[values[j]]["items"] = k < 0 ? 1 : parseInt(c.attr("data" + aliaces[k] + "items"), 10);
+ }
+ if (!responsive[values[j]]["stagePadding"] && responsive[values[j]]["stagePadding"] !== 0 && c.attr("data" + aliaces[k] + "stage-padding")) {
+ responsive[values[j]]["stagePadding"] = k < 0 ? 0 : parseInt(c.attr("data" + aliaces[k] + "stage-padding"), 10);
+ }
+ if (!responsive[values[j]]["margin"] && responsive[values[j]]["margin"] !== 0 && c.attr("data" + aliaces[k] + "margin")) {
+ responsive[values[j]]["margin"] = k < 0 ? 30 : parseInt(c.attr("data" + aliaces[k] + "margin"), 10);
+ }
+ }
+ }
+
+ // Create custom Pagination
+ if (c.attr('data-dots-custom')) {
+ c.on("initialized.owl.carousel", function (event) {
+ var carousel = $(event.currentTarget),
+ customPag = $(carousel.attr("data-dots-custom")),
+ active = 0;
+
+ if (carousel.attr('data-active')) {
+ active = parseInt(carousel.attr('data-active'));
+ }
+
+ carousel.trigger('to.owl.carousel', [active, 300, true]);
+ customPag.find("[data-owl-item='" + active + "']").addClass("active");
+
+ customPag.find("[data-owl-item]").on('click', function (e) {
+ e.preventDefault();
+ carousel.trigger('to.owl.carousel', [parseInt(this.getAttribute("data-owl-item")), 300, true]);
+ });
+
+ carousel.on("translate.owl.carousel", function (event) {
+ customPag.find(".active").removeClass("active");
+ customPag.find("[data-owl-item='" + event.item.index + "']").addClass("active")
+ });
+ });
+ }
+
+ // Create custom Numbering
+ if (typeof(c.attr("data-numbering")) !== 'undefined') {
+ var numberingObject = $(c.attr("data-numbering"));
+
+ c.on('initialized.owl.carousel changed.owl.carousel', function (numberingObject) {
+ return function (e) {
+ if (!e.namespace) return;
+ numberingObject.find('.numbering-current').text(e.item.index + 1);
+ numberingObject.find('.numbering-count').text(e.item.count);
+ };
+ }(numberingObject));
+ }
+
+ c.owlCarousel({
+ autoplay: isNoviBuilder ? false : c.attr("data-autoplay") === "true",
+ loop: isNoviBuilder ? false : c.attr("data-loop") !== "false",
+ items: 1,
+ rtl: isRtl,
+ center: c.attr("data-center") === "true",
+ dotsContainer: c.attr("data-pagination-class") || false,
+ navContainer: c.attr("data-navigation-class") || false,
+ mouseDrag: isNoviBuilder ? false : c.attr("data-mouse-drag") !== "false",
+ nav: c.attr("data-nav") === "true",
+ dots: c.attr("data-dots") === "true",
+ dotsEach: c.attr("data-dots-each") ? parseInt(c.attr("data-dots-each"), 10) : false,
+ animateIn: c.attr('data-animation-in') ? c.attr('data-animation-in') : false,
+ animateOut: c.attr('data-animation-out') ? c.attr('data-animation-out') : false,
+ responsive: responsive,
+ navText: function () {
+ try {
+ return JSON.parse(c.attr("data-nav-text"));
+ } catch (e) {
+ return [];
+ }
+ }(),
+ navClass: function () {
+ try {
+ return JSON.parse(c.attr("data-nav-class"));
+ } catch (e) {
+ return ['owl-prev', 'owl-next'];
+ }
+ }()
+ });
+ }
+
+
+ /**
+ * jQuery Count To
+ * @description Enables Count To plugin
+ */
+ if (plugins.counter.length) {
+ var i;
+
+ for (i = 0; i < plugins.counter.length; i++) {
+ var $counterNotAnimated = $(plugins.counter[i]).not('.animated');
+ $document
+ .on("scroll", $.proxy(function () {
+ var $this = this;
+
+ if ((!$this.hasClass("animated")) && (isScrolledIntoView($this))) {
+ $this.countTo({
+ refreshInterval: 40,
+ from: 0,
+ to: parseInt($this.text(), 10),
+ speed: $this.attr("data-speed") || 1000,
+ formatter: function (value, options) {
+ value = value.toFixed(options.decimals);
+ if (value < 10) {
+ return '0' + value;
+ }
+ return value;
+ }
+ });
+ $this.addClass('animated');
+ }
+ }, $counterNotAnimated))
+ .trigger("scroll");
+ }
+ }
+
+ /**
+ * RD Input Label
+ * @description Enables RD Input Label Plugin
+ */
+ if (plugins.rdInputLabel.length) {
+ plugins.rdInputLabel.RDInputLabel();
+ }
+
+ /**
+ * Regula
+ * @description Enables Regula plugin
+ */
+ if (plugins.regula.length) {
+ attachFormValidator(plugins.regula);
+ }
+
+ /**
+ * RD Mailform
+ * @version 3.2.0
+ */
+ 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('<p><span class="icon text-middle mdi mdi-check icon-xxs"></span><span>' + captchaMsg[responceCode] + '</span></p>')
+
+ 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('<p><span class="icon text-middle fa fa-circle-o-notch fa-spin icon-xxs"></span><span>Sending</span></p>');
+ 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();
+ }
+ },
+ 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();
+ }
+
+ result = result.length === 5 ? result : 'MF255';
+ output.text(msg[result]);
+
+ if (result === "MF000") {
+ if (output.hasClass("snackbars")) {
+ output.html('<p><span class="icon text-middle mdi mdi-check icon-xxs"></span><span>' + msg[result] + '</span></p>');
+ } else {
+ output.addClass("active success");
+ }
+ } else {
+ if (output.hasClass("snackbars")) {
+ output.html(' <p class="snackbars-left"><span class="icon icon-xxs mdi mdi-alert-outline text-middle"></span><span>' + msg[result] + '</span></p>');
+ } 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);
+ }
+ });
+ }
+ }
+
+ /**
+ * 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');
+ }
+ })
+ }
+ }
+ }
+
+ /**
+ * Page title
+ * @description Enables page-title plugin
+ */
+ if (plugins.pageTitles.length && !isNoviBuilder) {
+ var varCount = 30;
+
+ for (var i = 0; i < plugins.pageTitles.length; i++) {
+ var pageTitle = $(plugins.pageTitles[i]);
+
+ var header = pageTitle.children()[0];
+ var wrapper = $(document.createElement('div'));
+ wrapper.addClass('page-title-inner');
+
+ var pageTitleLeft = $(document.createElement('div')),
+ pageTitleCenter = $(document.createElement('div')),
+ pageTitleRight = $(document.createElement('div'));
+
+ pageTitleLeft.addClass('page-title-left');
+ pageTitleCenter.addClass('page-title-center');
+ pageTitleRight.addClass('page-title-right');
+
+ for (var j = 0; j < varCount; j++) {
+ pageTitleLeft.append(header.cloneNode(true));
+ pageTitleRight.append(header.cloneNode(true));
+ }
+
+ pageTitleCenter.append(header.cloneNode(true));
+ pageTitle.children(0).remove();
+
+ wrapper.append(pageTitleLeft);
+ wrapper.append(pageTitleCenter);
+ wrapper.append(pageTitleRight);
+
+ pageTitle.append(wrapper);
+ }
+ }
+
+ /**
+ * WOW
+ * @description Enables Wow animation plugin
+ */
+ if ($html.hasClass("wow-animation") && plugins.wow.length && !isNoviBuilder && isDesktop) {
+ new WOW().init();
+ }
+
+ // Material Parallax
+ if (plugins.materialParallax.length) {
+ if (!isNoviBuilder && !isIE && !isMobile) {
+ plugins.materialParallax.parallax();
+
+ // heavy pages fix
+ $window.on('load', function () {
+ setTimeout(function () {
+ $window.scroll();
+ }, 500);
+ });
+ } else {
+ for (var i = 0; i < plugins.materialParallax.length; i++) {
+ var parallax = $(plugins.materialParallax[i]),
+ imgPath = parallax.data("parallax-img");
+
+ parallax.css({
+ "background-image": 'url(' + imgPath + ')',
+ "background-size": "cover"
+ });
+ }
+ }
+ }
+ });
+})();