"use strict";
(function () {
  // Global variables
  var userAgent = navigator.userAgent.toLowerCase(),
    initialDate = new Date(),
    $document = $(document),
    $window = $(window),
    $html = $("html"),
    $body = $("body"),
    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,
    livedemo = true,
    plugins = {
      captcha: $(".recaptcha "),
      copyrightYear: $(".copyright-year "),
      owl: $(".owl-carousel "),
      preloader: $(".preloader "),
      rdNavbar: $(".rd-navbar "),
      rdMailForm: $(".rd-mailform "),
      rdInputLabel: $(".form-label "),
      regula: $("[data-constraints] "),
      wow: $(".wow "),
      counter: document.querySelectorAll(".counter "),
      buttonNuka: $(".button-nuka "),
    };

  // 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 * 0.75);
        },
        onReady: function () {
          plugins.preloader.addClass("loaded");
          windowReady = true;
        },
      });
    }

    // Counter
    if (plugins.counter) {
      for (let i = 0; i < plugins.counter.length; i++) {
        let node = plugins.counter[i],
          counter = aCounter({
            node: node,
            duration: node.getAttribute("data-duration") || 1000,
            formatter: node.hasAttribute("data-formatter")
              ? function (value) {
                  return Number(value.toFixed()).toLocaleString(
                    node.getAttribute("data-formatter")
                  );
                }
              : null,
          }),
          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);
        }
      }
    }
  });

  // Initialize scripts that require a finished document
  $(function () {
    isNoviBuilder = window.xMode;

    /**
     * @desc Initialize owl carousel plugin
     * @param {object} carousel - carousel jQuery object
     */
    function initOwlCarousel(carousel) {
      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"] &&
            carousel.attr("data" + aliaces[k] + "items")
          ) {
            responsive[values[j]]["items"] =
              k < 0
                ? 1
                : parseInt(carousel.attr("data" + aliaces[k] + "items"), 10);
          }
          if (
            !responsive[values[j]]["stagePadding"] &&
            responsive[values[j]]["stagePadding"] !== 0 &&
            carousel.attr("data" + aliaces[k] + "stage-padding")
          ) {
            responsive[values[j]]["stagePadding"] =
              k < 0
                ? 0
                : parseInt(
                    carousel.attr("data" + aliaces[k] + "stage-padding"),
                    10
                  );
          }
          if (
            !responsive[values[j]]["margin"] &&
            responsive[values[j]]["margin"] !== 0 &&
            carousel.attr("data" + aliaces[k] + "margin")
          ) {
            responsive[values[j]]["margin"] =
              k < 0
                ? 30
                : parseInt(carousel.attr("data" + aliaces[k] + "margin"), 10);
          }
        }
      }

      // Initialize lightgallery items in cloned owl items
      carousel.on("initialized.owl.carousel", function () {
        initLightGalleryItem(
          carousel.find('[data-lightgallery="item"]'),
          "lightGallery-in-carousel"
        );
      });

      carousel.owlCarousel({
        autoplay: isNoviBuilder
          ? false
          : carousel.attr("data-autoplay") !== "false",
        autoplayTimeout: carousel.attr("data-autoplay-time-out")
          ? Number(carousel.attr("data-autoplay-time-out"))
          : 3000,
        smartSpeed: carousel.attr("data-smart-speed")
          ? Number(carousel.attr("data-smart-speed"))
          : 250,
        autoplayHoverPause:
          carousel.attr("data-autoplay-hover-pause") === "true",
        URLhashListener:
          carousel.attr("data-hash-navigation") === "true" || false,
        startPosition: "URLHash",
        slideTransition: carousel.attr("data-slide-transition")
          ? carousel.attr("data-slide-transition")
          : "",
        loop: isNoviBuilder ? false : carousel.attr("data-loop") !== "false",
        items: 1,
        autoHeight: carousel.attr("data-auto-height") === "true",
        center: carousel.attr("data-center") === "true",
        dotsContainer: carousel.attr("data-pagination-class") || false,
        navContainer: carousel.attr("data-navigation-class") || false,
        mouseDrag: isNoviBuilder
          ? false
          : carousel.attr("data-mouse-drag") !== "false",
        nav: carousel.attr("data-nav") === "true",
        dots: carousel.attr("data-dots") === "true",
        dotsEach: carousel.attr("data-dots-each")
          ? parseInt(carousel.attr("data-dots-each"), 10)
          : false,
        animateIn: carousel.attr("data-animation-in")
          ? carousel.attr("data-animation-in")
          : false,
        animateOut: carousel.attr("data-animation-out")
          ? carousel.attr("data-animation-out")
          : false,
        responsive: responsive,
        navText: carousel.attr("data-nav-text")
          ? $.parseJSON(carousel.attr("data-nav-text"))
          : [],
        navClass: carousel.attr("data-nav-class")
          ? $.parseJSON(carousel.attr("data-nav-class"))
          : ["owl-prev", "owl-next"],
      });
    }

    /**
     * @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(
          "<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,
        });
      }
    }

    /**
     * @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 (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("<span class='form-validation'></span>");

        if (plugins.captcha[i].hasAttribute("data-auto-size")) {
          resizeHandler();
          window.addEventListener("resize", resizeHandler);
        }
      }
    };

    /**
     * @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,
          },
        });
      }
    }

    // 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");
    }

    // Copyright Year (Evaluates correct copyright year)
    if (plugins.copyrightYear.length) {
      plugins.copyrightYear.text(initialDate.getFullYear());
    }

    // UI To Top
    if (isDesktop && !isNoviBuilder) {
      $().UItoTop({
        easingType: "easeOutQuad",
        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");
            }
          },
        },
      });
    }

    // Owl carousel
    if (plugins.owl.length) {
      for (var i = 0; i < plugins.owl.length; i++) {
        var carousel = $(plugins.owl[i]);
        plugins.owl[i].owl = carousel;
        initOwlCarousel(carousel);
      }
    }

    // WOW
    if (
      $html.hasClass("wow-animation") &&
      plugins.wow.length &&
      !isNoviBuilder &&
      isDesktop
    ) {
      new WOW().init();
    }

    // RD Input Label
    if (plugins.rdInputLabel.length) {
      plugins.rdInputLabel.RDInputLabel();
    }

    // Regula
    if (plugins.regula.length) {
      attachFormValidator(plugins.regula);
    }

    // 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(
                        '<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);
          },
        });
      }
    }

    // lightGallery
    plugins.lightGallery = $('[data-lightgallery="group"]');
    if (plugins.lightGallery.length) {
      for (var i = 0; i < plugins.lightGallery.length; i++) {
        initLightGallery(plugins.lightGallery[i]);
      }
    }

    // lightGallery item
    plugins.lightGalleryItem = $('[data-lightgallery="item"]');
    if (plugins.lightGalleryItem.length) {
      for (var i = 0; i < plugins.lightGalleryItem.length; i++) {
        initLightGalleryItem(plugins.lightGalleryItem[i]);
      }
    }

    // Dynamic lightGallery
    plugins.lightDynamicGalleryItem = $('[data-lightgallery="dynamic"]');
    if (plugins.lightDynamicGalleryItem.length) {
      for (var i = 0; i < plugins.lightDynamicGalleryItem.length; i++) {
        initDynamicLightGallery(plugins.lightDynamicGalleryItem[i]);
      }
    }

    // Button Nuka
    if (plugins.buttonNuka.length) {
      plugins.buttonNuka
        .on("mouseenter", function (e) {
          var parentOffset = $(this).offset(),
            relX = e.pageX - parentOffset.left,
            relY = e.pageY - parentOffset.top;
          $(this).find(".button-overlay").css({ top: relY, left: relX });
        })
        .on("mouseout", function (e) {
          var parentOffset = $(this).offset(),
            relX = e.pageX - parentOffset.left,
            relY = e.pageY - parentOffset.top;
          $(this).find(".button-overlay").css({ top: relY, left: relX });
        });
    }
  });
})();
