PluginProbe
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster / 2.7.0
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster v2.7.0
2.7.0 2.6.0 trunk 1.1.0 1.1.4 1.2.1 1.2.2 1.2.3 1.2.5 1.2.9 1.3.1 1.3.2 1.5.0 1.5.1 1.5.4 1.5.7 1.5.8 1.5.9 1.6.2 1.6.5 1.6.8 1.7.2 1.7.4 1.7.5 1.7.9 All 43 releases
← All changes | assets/dist/js/elementor-init.js +2736 -127 1.1.02.7.0 View file →
@@ -3,18 +3,83 @@
3 3
4 4 Object.defineProperty(exports, "__esModule", {
5 5 value: true
6 6 });
7 +exports["default"] = void 0;
8 +var CheckoutSettings = elementorModules.frontend.handlers.Base.extend({
9 + getDefaultSettings: function getDefaultSettings() {
10 + return {
11 + selectors: {
12 + sticky: '.sellkit-multistep-checkout-sidebar-sticky'
13 + }
14 + };
15 + },
16 + getDefaultElements: function getDefaultElements() {
17 + var selectors = this.getSettings('selectors');
18 + return {
19 + $stickyContainer: this.$element.find(selectors.sticky)
20 + };
21 + },
22 + onInit: function onInit() {
23 + elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
24 + this.setOffset();
25 + },
26 + setOffset: function setOffset() {
27 + if (this.getElementSettings('show_sticky_cart_details') !== 'yes') {
28 + return;
29 + }
30 +
31 + var offset = this.getElementSettings('sticky_cart_offset') || 0;
32 +
33 + if (offset === 0) {
34 + return;
35 + }
36 +
37 + var adminbar = document.getElementById('wpadminbar');
38 +
39 + if (!_.isNull(adminbar)) {
40 + offset += adminbar.offsetHeight;
41 + }
42 +
43 + this.elements.$stickyContainer.css('top', "".concat(offset, "px"));
44 + }
45 +});
46 +var _default = CheckoutSettings;
7 47 exports["default"] = _default;
8 48
49 +},{}],2:[function(require,module,exports){
50 +"use strict";
51 +
52 +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
53 +
54 +Object.defineProperty(exports, "__esModule", {
55 + value: true
56 +});
57 +exports["default"] = _default;
58 +
9 59 var _i18n = require("@wordpress/i18n");
10 60
61 +var _checkoutSettings = _interopRequireDefault(require("./checkout-settings"));
62 +
11 63 /* eslint no-undef: 0 */
12 64 // Temporary turned off no undefined variable for localStorage
13 65 var $ = jQuery;
14 66 var wcCountries = JSON.parse(wc_country_select_params.countries);
67 +/**
68 + * When batching "same as shipping" billing sync, skip duplicate sellkit address AJAX
69 + * (avoids racing update_checkout / fragment refresh against hidden country/state fields).
70 + *
71 + * @type {boolean}
72 + */
15 73
16 -function _default() {
74 +window.sellkitSuppressBillingAddressAjax = false;
75 +
76 +function _default($scope) {
77 + new _checkoutSettings["default"]({
78 + $element: $scope
79 + });
80 + $('body').addClass('contains-sellkit-checkout'); // General class to handle compatibility with other themes.
81 +
17 82 var parent = $('#sellkit-checkout-multistep-inner-wrap');
18 83 var sidebar = $('.sellkit-checkout-right-column');
19 84 var first = $('.sellkit-multistep-checkout-first');
20 85 var second = $('.sellkit-multistep-checkout-second');
@@ -19,22 +84,34 @@
19 84 var first = $('.sellkit-multistep-checkout-first');
20 85 var second = $('.sellkit-multistep-checkout-second');
21 86 var third = $('.sellkit-multistep-checkout-third');
22 87 var breadcrumb = $('.sellkit-checkout-widget-breadcrumb-desktop, .sellkit-checkout-widget-breadcrumb-mobile');
88 + var billingMethodA = $('[name="billing-method"].sellkit-billing-method-a');
89 +
90 + if (billingMethodA.length > 0 && billingMethodA[0].checked) {
91 + billingMethodA[0].click();
92 + }
93 +
94 + if ('1' !== sellkit_elementor.wcNeedShipping || typeof sellkitCheckoutShipping !== 'undefined' && true === sellkitCheckoutShipping) {
95 + third.show();
96 + $('.sellkit-one-page-checkout-place-order').css('justify-content', 'flex-end');
97 + }
98 +
23 99 $('.go-to-shipping').on('click', function () {
100 + // Checks if required fields are filled.
101 + var requiredFieldsError = checkRequiredFields();
102 +
103 + if (true === requiredFieldsError) {
104 + return;
105 + }
106 +
24 107 secondStepHeader();
25 - var secondTrigger = true;
26 108 first.hide();
27 109
28 - if ($('.sellkit-one-page-shipping-methods').length > 0) {
110 + if ($('.sellkit-one-page-shipping-methods').children().length > 0) {
29 111 second.show();
30 112 } else {
31 113 third.show();
32 - secondTrigger = false;
33 - }
34 -
35 - if ($(window).width() > 600 && secondTrigger) {
36 - sidebar.css('background-color', '#effdf5');
37 114 } //Fix Header & wrapper height.
38 115
39 116
40 117 parent.css('height', 'auto');
@@ -43,8 +120,11 @@
43 120 $('.multistep-headers').css('height', 'auto'); // Manage Breadcrumb.
44 121
45 122 breadcrumb.find('.information').removeClass('current').addClass('blue-line');
46 123 breadcrumb.find('.shipping').addClass('current').removeClass('inactive');
124 + $('html, body').animate({
125 + scrollTop: $('.sellkit-checkout-left-column').offset().top
126 + }, 500);
47 127 });
48 128 $('.go-to-first').on('click', function () {
49 129 first.show();
50 130 third.hide();
@@ -50,20 +130,30 @@
50 130 third.hide();
51 131 second.hide();
52 132 parent.css('height', 'auto');
53 133 first.css('height', 'auto');
54 - sidebar.css('background-color', '#ffffff'); // Manage Breadcrumb.
134 + sidebar.css('background-color', 'transparent'); // Manage Breadcrumb.
55 135
56 136 breadcrumb.find('.information').removeClass('blue-line').addClass('current');
57 137 breadcrumb.find('.shipping, .payment').removeClass('current').removeClass('blue-line').addClass('inactive');
138 + $('html, body').animate({
139 + scrollTop: $('.sellkit-checkout-left-column').offset().top
140 + }, 500);
58 141 });
59 142 $('.go-to-payment').on('click', function () {
143 + // Checks if required fields are filled.
144 + var requiredFieldsError = checkRequiredFields();
145 +
146 + if (true === requiredFieldsError) {
147 + return;
148 + }
149 +
60 150 secondStepHeader();
61 151 second.hide();
62 152 first.hide();
63 153 third.show();
64 154 $('.sellkit-one-page-checkout-payment-heading').css('margin-top', '0px');
65 - sidebar.css('background-color', '#ffffff'); //Fix Header & wrapper height.
155 + sidebar.css('background-color', 'transparent'); //Fix Header & wrapper height.
66 156
67 157 parent.css('height', 'auto');
68 158 third.css('height', 'auto');
69 159 $('.multistep-headers').css('height', 'auto'); // Manage Breadcrumb.
@@ -69,19 +159,26 @@
69 159 $('.multistep-headers').css('height', 'auto'); // Manage Breadcrumb.
70 160
71 161 breadcrumb.find('.shipping').addClass('blue-line').removeClass('current');
72 162 breadcrumb.find('.payment').addClass('current').removeClass('inactive');
163 + $('html, body').animate({
164 + scrollTop: $('.sellkit-checkout-left-column').offset().top
165 + }, 500);
73 166 });
74 167 $('.go-to-second , .go-to-second-header').on('click', function () {
75 - var secondTrigger = true;
168 + // Checks if required fields are filled.
169 + var requiredFieldsError = checkRequiredFields();
76 170
77 - if ($('.sellkit-one-page-shipping-methods').length > 0) {
171 + if (true === requiredFieldsError) {
172 + return;
173 + }
174 +
175 + if ($('.sellkit-one-page-shipping-methods').children().length > 0) {
78 176 second.show();
79 177 first.hide();
80 178 } else {
81 179 second.hide();
82 180 first.show();
83 - secondTrigger = false;
84 181 }
85 182
86 183 third.hide();
87 184 parent.css('height', 'auto');
@@ -86,17 +183,15 @@
86 183 third.hide();
87 184 parent.css('height', 'auto');
88 185 second.css('height', 'auto');
89 186 second.css('height', $('.sellkit-checkout-left-column').height());
90 - $('.multistep-headers').css('height', 'auto');
187 + $('.multistep-headers').css('height', 'auto'); // Manage Breadcrumb.
91 188
92 - if ($(window).width() > 600 && secondTrigger) {
93 - sidebar.css('background-color', '#effdf5');
94 - } // Manage Breadcrumb.
95 -
96 -
97 189 breadcrumb.find('.shipping').addClass('current').removeClass('blue-line');
98 190 breadcrumb.find('.payment').removeClass('current').addClass('inactive');
191 + $('html, body').animate({
192 + scrollTop: $('.sellkit-checkout-left-column').offset().top
193 + }, 500);
99 194 }); //Inject login wrapper & functionality.
100 195
101 196 emailProcess();
102 197 LoginProcess(); // Billing method toggle.
@@ -115,10 +210,14 @@
115 210 // Run after ajax
116 211 sellkitCheckoutUpdateCartItem();
117 212 applyCoupon();
118 213 couponToggle();
119 - }); //Run when page loads.
214 + fixGatewayListUi();
215 + sellkitDetectShippingMethodChange();
216 + }); // Fix the payment gateways divider issue.
120 217
218 + fixGatewayListUi(); //Run when page loads.
219 +
121 220 sellkitCheckoutUpdateCartItem(); // Apply coupon.
122 221
123 222 applyCoupon(); // Coupon toggle.
124 223
@@ -125,17 +224,33 @@
125 224 couponToggle(); // Postal code autocomplete.
126 225
127 226 sellkitPostalCodeAutocomplete(); // Klarma checkout integration.
128 227
129 - sellkitKlarmaIntegration(); // Shipping & billing country & state update on change
228 + sellkitKlarmaIntegration(); // Fix state change issue on load.
130 229
131 - fixClientCountryOnReload(); // Fix state change issue on load.
230 + fixStateIssueOnLoad(); // Shipping & billing country & state update on change
132 231
133 - fixStateIssueOnLoad(); // Configure bundled products.
232 + fixClientCountryOnReload(); // Configure bundled products.
134 233
135 234 sellkitCheckoutConfigureBundleProducts(); // Order bump.
136 235
137 - sellkitCheckoutOrderBump();
236 + sellkitCheckoutOrderBump(); // Sellkit after ajax call is completed.
237 +
238 + sellkitAfterAjaxComplete(); // Load upsell steps with popup.
239 +
240 + sellkitLoadUpsellSteps(); // send shipping method to backend after changed
241 +
242 + sellkitDetectShippingMethodChange(); // Run some functions on page load when WooCommerce doing early ajax.
243 +
244 + window.sellkitCheckoutMakeSureJsWorks = function () {
245 + sellkitCheckoutUpdateCartItem();
246 + applyCoupon();
247 + couponToggle();
248 + fixGatewayListUi();
249 + }; // Toggle order notes.
250 +
251 +
252 + orderNotesToggle();
138 253 }
139 254
140 255 var emailProcess = function emailProcess() {
141 256 var emailField = $('#billing_email');
@@ -148,14 +263,26 @@
148 263 var usernameField = usernameWrap.find('input');
149 264 var loginBtn = $('.login-wrapper');
150 265 var createBox = $('.create-desc');
151 266 var createCheck = $('#createaccount');
152 - emailField.on('keyup', function () {
153 - var _this = this;
267 + var emailCheckTimer = null;
268 + var usernameCheckTimer = null;
154 269
155 - setTimeout(function () {
156 - var emailAddress = $(_this).val();
270 + var getCurrentEmailValue = function getCurrentEmailValue() {
271 + return $('#billing_email').val();
272 + };
157 273
274 + var getCurrentUsernameValue = function getCurrentUsernameValue() {
275 + return $('.sellkit-checkout-widget-username-field').find('input').val();
276 + }; // Use input/change (not keyup): iOS Safari soft keyboard often omits or mishandles keyup.
277 +
278 +
279 + emailField.on('input change', function () {
280 + var inputEl = this;
281 + clearTimeout(emailCheckTimer);
282 + emailCheckTimer = setTimeout(function () {
283 + var emailAddress = $(inputEl).val();
284 +
158 285 if (_.isEmpty(emailAddress)) {
159 286 emptyError.show().css('display', 'inline-block');
160 287 errorText.hide();
161 288 createBox.css('display', 'none');
@@ -189,19 +316,27 @@
189 316 email: emailAddress,
190 317 dataType: 'json',
191 318 nonce: sellkit_elementor.nonce
192 319 }).done(function () {
320 + if (emailAddress !== getCurrentEmailValue()) {
321 + return;
322 + }
323 +
193 324 successResultEmailCheck();
194 325 }).fail(function () {
326 + if (emailAddress !== getCurrentEmailValue()) {
327 + return;
328 + }
329 +
195 330 errorResultEmailCheck();
196 331 });
197 332 }, 500);
198 333 });
199 - usernameField.on('keyup', function () {
200 - var _this2 = this;
201 -
202 - setTimeout(function () {
203 - var userValue = $(_this2).val();
334 + usernameField.on('input change', function () {
335 + var inputEl = this;
336 + clearTimeout(usernameCheckTimer);
337 + usernameCheckTimer = setTimeout(function () {
338 + var userValue = $(inputEl).val();
204 339 wp.ajax.post({
205 340 action: 'sellkit_checkout_ajax_handler',
206 341 sub_action: 'search_for_username',
207 342 user: userValue,
@@ -207,10 +342,18 @@
207 342 user: userValue,
208 343 dataType: 'json',
209 344 nonce: sellkit_elementor.nonce
210 345 }).done(function () {
346 + if (userValue !== getCurrentUsernameValue()) {
347 + return;
348 + }
349 +
211 350 $('.sellkit-checkout-widget-username-error').hide();
212 351 }).fail(function () {
352 + if (userValue !== getCurrentUsernameValue()) {
353 + return;
354 + }
355 +
213 356 $('.sellkit-checkout-widget-username-error').show();
214 357 });
215 358 }, 500);
216 359 }); // If user is going to create account show password and username fields if exists.
@@ -287,14 +430,14 @@
287 430
288 431 var secondStepHeader = function secondStepHeader() {
289 432 var email = $('#billing_email');
290 433 $('.multistep-headers > .info-a > div > .mail').text(email.val());
291 - var countryValue = $('#shipping_country option:selected').text();
292 - var state = $('#sellkit-shipping_state');
293 - var postcode = $('#shipping_postcode');
294 - var city = $('#shipping_city');
295 - var addressA = $('#shipping_address_1');
296 - var addressB = $('#shipping_address_2');
434 + var countryValue = $('#shipping_country option:selected').text() ? $('#shipping_country option:selected').text() : $('#billing_country option:selected').text();
435 + var state = $('#sellkit-shipping_state').val() ? $('#sellkit-shipping_state') : $('#sellkit-billing_state');
436 + var postcode = $('#shipping_postcode').val() ? $('#shipping_postcode') : $('#billing_postcode');
437 + var city = $('#shipping_city').val() ? $('#shipping_city') : $('#billing_city');
438 + var addressA = $('#shipping_address_1').val() ? $('#shipping_address_1') : $('#billing_address_1');
439 + var addressB = $('#shipping_address_2').val() ? $('#shipping_address_2') : $('#billing_address_2');
297 440 var finalAddress = postcode.val() ? ', ' + postcode.val() : '';
298 441 finalAddress += addressB.val() ? ', ' + addressB.val() : '';
299 442 finalAddress += addressA.val() ? ', ' + addressA.val() : '';
300 443 finalAddress += city.val() ? ', ' + city.val() : '';
@@ -306,39 +449,89 @@
306 449 }
307 450
308 451 $('.multistep-headers > .info-b > div > .address').text(finalAddress);
309 452 var method = $('#shipping_method').find('input[type=radio]:checked');
310 - var methodTxt = method.siblings('label').text();
453 + var methodTxt = method.siblings('.labels').text();
311 454 $('.multistep-headers > .info-c > div > .method').text(methodTxt);
312 455 };
313 456
314 457 var manageBillingMethod = function manageBillingMethod() {
315 - var billingWrap = $('.sellkit-one-page-checkout-billing');
316 - var methodA = billingWrap.find('.method-a');
317 - var methodB = billingWrap.find('.method-b'); // Get shipping values.
458 + // Hide outer #wrapper-billing_* rows — not inner #billing_*_field <p> tags. Labels (.mini-title) sit
459 + // outside those <p> tags; hiding only the <p> left floating labels with no inputs.
460 + var mirroredSelectors = '#wrapper-billing_first_name, #wrapper-billing_last_name, #wrapper-billing_address_1, #wrapper-billing_address_2, #wrapper-billing_country, #wrapper-billing_state, #wrapper-billing_postcode, #wrapper-billing_city, #wrapper-billing_phone';
461 + /**
462 + * Always re-query the DOM. Checkout fragments replace nodes after update_checkout;
463 + * cached jQuery sets would point at detached elements and .hide() would not affect the live form.
464 + *
465 + * @param {boolean} shouldUseShippingAddress - Whether to use shipping address for billing
466 + *
467 + */
318 468
319 - var name = $('#shipping_first_name');
320 - var last = $('#shipping_last_name');
321 - var addressA = $('#shipping_address_1');
322 - var addressB = $('#shipping_address_2');
323 - var country = $('#shipping_country');
324 - var state = $('#sellkit-shipping_state');
325 - var postcode = $('#shipping_postcode');
326 - var city = $('#shipping_city');
327 - methodA.on('click', function () {
328 - billingWrap.find('.woocommerce-billing-fields__field-wrapper').hide();
329 - $('#billing_first_name').val(name.val());
330 - $('#billing_last_name').val(last.val());
331 - $('#billing_address_1').val(addressA.val());
332 - $('#billing_address_2').val(addressB.val());
333 - $('#billing_country').val(country.val()).trigger('change');
334 - $('#sellkit-billing_state').val(state.val()).trigger('change');
335 - $('#billing_postcode').val(postcode.val());
336 - $('#billing_city').val(city.val());
469 + var toggleBillingFields = function toggleBillingFields(shouldUseShippingAddress) {
470 + var billingWrap = $('.sellkit-one-page-checkout-billing');
471 +
472 + if (!billingWrap.length) {
473 + return;
474 + }
475 +
476 + var billingFieldWrapper = billingWrap.find('.woocommerce-billing-fields__field-wrapper');
477 + var mirroredBillingFields = billingFieldWrapper.find(mirroredSelectors);
478 + var billingOnlyFields = billingFieldWrapper.children().not(mirroredBillingFields);
479 +
480 + if (shouldUseShippingAddress) {
481 + mirroredBillingFields.hide();
482 +
483 + if (billingOnlyFields.length) {
484 + billingOnlyFields.show();
485 + billingFieldWrapper.show().css('display', 'inline-table');
486 + } else {
487 + billingFieldWrapper.hide();
488 + }
489 +
490 + return;
491 + }
492 +
493 + billingFieldWrapper.show().css('display', 'inline-table');
494 + mirroredBillingFields.show();
495 + billingOnlyFields.show();
496 + };
497 +
498 + var syncBillingFieldsFromShipping = function syncBillingFieldsFromShipping() {
499 + window.sellkitSuppressBillingAddressAjax = true;
500 + $('#billing_first_name').val($('#shipping_first_name').val());
501 + $('#billing_last_name').val($('#shipping_last_name').val());
502 + $('#billing_address_1').val($('#shipping_address_1').val());
503 + $('#billing_address_2').val($('#shipping_address_2').val());
504 + $('#billing_country').val($('#shipping_country').val()).trigger('change');
505 + $('#sellkit-billing_state').val($('#sellkit-shipping_state').val()).trigger('change');
506 + $('#billing_postcode').val($('#shipping_postcode').val());
507 + $('#billing_city').val($('#shipping_city').val());
508 +
509 + if ($('#billing_phone').length && $('#shipping_phone').length) {
510 + $('#billing_phone').val($('#shipping_phone').val());
511 + }
512 +
513 + window.sellkitSuppressBillingAddressAjax = false;
514 + }; // Delegated: billing markup can be replaced by WooCommerce checkout AJAX.
515 +
516 +
517 + $(document.body).off('click.sellkitBillMethod', '.sellkit-one-page-checkout-billing .method-a').on('click.sellkitBillMethod', '.sellkit-one-page-checkout-billing .method-a', function () {
518 + syncBillingFieldsFromShipping();
519 + toggleBillingFields(true);
520 + sellkitSetAddressDetails();
337 521 });
338 - methodB.on('click', function () {
522 + $(document.body).off('click.sellkitBillMethodDiff', '.sellkit-one-page-checkout-billing .method-b').on('click.sellkitBillMethodDiff', '.sellkit-one-page-checkout-billing .method-b', function () {
339 523 $('.inner_wrapper').css('height', 'auto');
340 - billingWrap.find('.woocommerce-billing-fields__field-wrapper').show();
524 + toggleBillingFields(false);
525 + }); // After fragments refresh, re-apply hide/show — otherwise mirrored rows show again and layout breaks.
526 +
527 + $(document.body).off('updated_checkout.sellkitBillingVis').on('updated_checkout.sellkitBillingVis', function () {
528 + if (!$('.sellkit-one-page-checkout-billing').length) {
529 + return;
530 + }
531 +
532 + var useSame = $('.sellkit-one-page-checkout-billing input[name="billing-method"]:checked').val() === 'same';
533 + toggleBillingFields(useSame);
341 534 });
342 535 };
343 536
344 537 var mobileSummary = function mobileSummary() {
@@ -345,20 +538,22 @@
345 538 if ($(window).width() < 600) {
346 539 $('#order_review').addClass('sellkit-mobile-multistep-order-summary');
347 540 }
348 541
349 - var toggleBtn = $('.summary_toggle > .title, .summary_toggle > i, .summary_toggle > .icon');
542 + var toggleBtn = $('.summary_toggle > .summery_toggle_link_wrapper > .title, .summary_toggle > .summery_toggle_link_wrapper > .sellkit-checkout-summary-toggle-up, .summary_toggle > .summery_toggle_link_wrapper > .icon, .summary_toggle > .summery_toggle_link_wrapper > .sellkit-checkout-summary-toggle-down');
350 543 var wrap = $('.summary_toggle');
351 544 toggleBtn.on('click', function () {
352 545 $('#order_review').toggle();
353 546
354 - if ('Hide order summary' === toggleBtn.text()) {
547 + if ('Hide order summary' === wrap.find('.title').text()) {
355 548 wrap.find('.title').text((0, _i18n.__)('Show order summary', 'sellkit'));
356 - wrap.find('i').addClass('fa-chevron-down').removeClass('fa-chevron-up');
549 + wrap.find('.sellkit-checkout-summary-toggle-up').hide();
550 + wrap.find('.sellkit-checkout-summary-toggle-down').show();
357 551 wrap.css('border-bottom-width', '0px');
358 552 } else {
359 553 wrap.find('.title').text((0, _i18n.__)('Hide order summary', 'sellkit'));
360 - wrap.find('i').addClass('fa-chevron-up').removeClass('fa-chevron-down');
554 + wrap.find('.sellkit-checkout-summary-toggle-up').show();
555 + wrap.find('.sellkit-checkout-summary-toggle-down').hide();
361 556 wrap.css('border-bottom-width', '1px');
362 557 }
363 558
364 559 var parent = $('#sellkit-checkout-multistep-inner-wrap');
@@ -368,9 +563,9 @@
368 563
369 564 var fieldFocus = function fieldFocus() {
370 565 var $fields = $('.sellkit-checkout-local-fields').find('input, select, hidden, textarea, #sellkit-billing_state ,#sellkit-shipping_state, .validate-email');
371 566 $fields.each(function () {
372 - var _this3 = this;
567 + var _this = this;
373 568
374 569 var miniTitle = $(this).parent().parent().parent().find('.mini-title');
375 570 var $thisValue = $(this).val(); // On load.
376 571
@@ -382,34 +577,34 @@
382 577 } // On change/focusOut
383 578
384 579
385 580 $(this).on('change input focusout', function (e) {
386 - var changedValue = $(_this3).val();
581 + var changedValue = $(_this).val();
387 582
388 - if (changedValue || $(_this3).find('option').length) {
389 - $(_this3).addClass('filled');
390 - $(_this3).removeClass('empty');
391 - $(_this3).parents('.sellkit-widget-checkout-fields').find('.mini-title').css('display', 'flex');
583 + if (changedValue || $(_this).find('option').length) {
584 + $(_this).addClass('filled');
585 + $(_this).removeClass('empty');
586 + $(_this).parents('.sellkit-widget-checkout-fields').find('.mini-title').css('display', 'flex');
392 587 } else {
393 - $(_this3).addClass('empty');
394 - $(_this3).removeClass('filled');
395 - $(_this3).parents('.sellkit-widget-checkout-fields').find('.mini-title').hide();
588 + $(_this).addClass('empty');
589 + $(_this).removeClass('filled');
590 + $(_this).parents('.sellkit-widget-checkout-fields').find('.mini-title').hide();
396 591 } // On focusout validate fields.
397 592
398 593
399 594 if ('focusout' === e.type) {
400 - FieldsMiniTitles($(_this3), 'focusout');
401 - var parent = $(_this3).parent().parent().parent(); // Required validation. return if required field rule is not followed.
595 + FieldsMiniTitles($(_this), 'focusout');
596 + var parent = $(_this).parent().parent().parent(); // Required validation. return if required field rule is not followed.
402 597
403 598 if (parent.hasClass('validate-required')) {
404 - if ('INPUT' === _this3.nodeName && 'checkbox' === $(_this3).attr('type')) {
405 - if (!_this3.checked) {
599 + if ('INPUT' === _this.nodeName && 'checkbox' === $(_this).attr('type')) {
600 + if (!_this.checked) {
406 601 parent.find('.sellkit-required-validation').css('display', 'inline-flex');
407 602 return;
408 603 }
409 604 }
410 605
411 - if (_.isEmpty($(_this3).val())) {
606 + if (_.isEmpty($(_this).val())) {
412 607 parent.find('.sellkit-required-validation').css('display', 'inline-flex');
413 608 return;
414 609 }
415 610
@@ -417,9 +612,9 @@
417 612 } // Required validation of this field if exists, passed successfully. now postcode validation.
418 613
419 614
420 615 if (parent.hasClass('sellkit-checkout-fields-validation-postcode')) {
421 - var postcodeVal = $(_this3).val();
616 + var postcodeVal = $(_this).val();
422 617
423 618 if (_.isEmpty(postcodeVal)) {
424 619 return;
425 620 } // Check field type to get related country value. we can't validate without country code.
@@ -424,9 +619,9 @@
424 619 return;
425 620 } // Check field type to get related country value. we can't validate without country code.
426 621
427 622
428 - var postcodeName = $(_this3).attr('name');
623 + var postcodeName = $(_this).attr('name');
429 624 var postcodeCountry = $('#billing_country');
430 625
431 626 if (postcodeName.includes('shipping')) {
432 627 postcodeCountry = $('#shipping_country');
@@ -447,34 +642,43 @@
447 642 parent.find('.sellkit-checkout-field-global-errors').hide().text('');
448 643 }
449 644
450 645 parent.find('.sellkit-checkout-field-global-errors').hide().text('');
451 - postcodeValidation(postcodeVal, countryCode, $(_this3));
646 + postcodeValidation(postcodeVal, countryCode, $(_this));
452 647 } // Phone validation using woocommerce way.
453 648
454 649
455 650 if (parent.hasClass('sellkit-checkout-fields-validation-phone')) {
456 - var phone = $(_this3).val();
651 + var phone = $(_this).val();
457 652
458 653 if (_.isEmpty(phone)) {
459 654 return;
460 655 }
461 656
462 - phoneNumberValidation(phone, $(_this3));
657 + phoneNumberValidation(phone, $(_this));
463 658 }
464 659 }
465 660
466 - if ('change' === e.type && ('billing_country' === $(_this3).attr('id') || 'shipping_country' === $(_this3).attr('id'))) {
467 - var _countryCode = $(_this3).val();
661 + if ('change' === e.type && ('billing_country' === $(_this).attr('id') || 'shipping_country' === $(_this).attr('id'))) {
662 + var _countryCode = $(_this).val();
468 663
469 664 var states = wcCountries[_countryCode];
470 665 var state = 'sellkit-shipping_state';
471 666
472 - if ('billing_country' === $(_this3).attr('id')) {
667 + if ('billing_country' === $(_this).attr('id')) {
473 668 state = 'sellkit-billing_state';
474 669 }
475 670
476 671 var stateField = document.getElementById(state);
672 +
673 + if (_.isNull(stateField)) {
674 + return;
675 + }
676 +
677 + if (!_.isObject(states)) {
678 + return;
679 + }
680 +
477 681 $(stateField).empty();
478 682
479 683 for (var keys in states) {
480 684 var option = document.createElement('option');
@@ -583,9 +787,9 @@
583 787
584 788 if ('billing_country' === field.attr('id')) {
585 789 var $state = document.getElementById('sellkit-billing_state');
586 790
587 - if ('SELECT' === $state.nodeName && $('#sellkit-billing_state option').length < 1) {
791 + if (!_.isNull($state) && 'SELECT' === $state.nodeName && $('#sellkit-billing_state option').length < 1) {
588 792 var stateField = $('#sellkit-billing_state');
589 793 var parent = stateField.parent().parent().parent();
590 794 parent.removeClass('sellkit-checkout-field-select');
591 795 var placeholder = stateField.attr('placeholder');
@@ -601,9 +805,9 @@
601 805
602 806 var countryCode = field.val();
603 807 var states = wcCountries[countryCode];
604 808
605 - if ('INPUT' === $state.nodeName && !_.isEmpty(states)) {
809 + if (!_.isNull($state) && 'INPUT' === $state.nodeName && !_.isEmpty(states)) {
606 810 var _stateField = $('#sellkit-billing_state');
607 811
608 812 var _placeholder = _stateField.attr('placeholder');
609 813
@@ -640,9 +844,9 @@
640 844
641 845 if ('shipping_country' === field.attr('id')) {
642 846 var _$state = document.getElementById('sellkit-shipping_state');
643 847
644 - if ('SELECT' === _$state.nodeName && $('#sellkit-shipping_state option').length < 1) {
848 + if (!_.isNull(_$state) && 'SELECT' === _$state.nodeName && $('#sellkit-shipping_state option').length < 1) {
645 849 var _stateField2 = $('#sellkit-shipping_state');
646 850
647 851 var _parent2 = _stateField2.parent().parent().parent();
648 852
@@ -669,9 +873,9 @@
669 873 var _countryCode2 = field.val();
670 874
671 875 var _states = wcCountries[_countryCode2];
672 876
673 - if ('INPUT' === _$state.nodeName && !_.isEmpty(_states)) {
877 + if (!_.isNull(_$state) && 'INPUT' === _$state.nodeName && !_.isEmpty(_states)) {
674 878 var _stateField3 = $('#sellkit-shipping_state');
675 879
676 880 var _placeholder3 = _stateField3.attr('placeholder');
677 881
@@ -710,9 +914,15 @@
710 914 _parent3.find('.woocommerce-input-wrapper').append(_stateSelect);
711 915 }
712 916 }
713 917 };
918 +/**
919 + * Change cart item quantity.
920 + *
921 + * @since 1.2.5
922 + */
714 923
924 +
715 925 var sellkitCheckoutUpdateCartItem = function sellkitCheckoutUpdateCartItem() {
716 926 $('.sellkit-one-page-checkout-product-qty').off('change').on('change', function () {
717 927 $(this).attr('readonly', true);
718 928 wp.ajax.post({
@@ -720,8 +930,9 @@
720 930 sub_action: 'change_cart_item_qty',
721 931 qty: $(this).val(),
722 932 id: $(this).attr('data-id'),
723 933 mode: 'edit',
934 + related_checkout: $('#sellkit_current_page_id').val(),
724 935 nonce: sellkit_elementor.nonce
725 936 }).always(function () {
726 937 $(document.body).trigger('update_checkout');
727 938 $('.sellkit-one-page-checkout-product-qty').attr('readonly', false);
@@ -726,8 +937,10 @@
726 937 $(document.body).trigger('update_checkout');
727 938 $('.sellkit-one-page-checkout-product-qty').attr('readonly', false);
728 939 });
729 940 });
941 + var paymentMethod = $('.sellkit-one-page-checkout-payment-methods').find('input[name=payment_method]:checked');
942 + paymentMethod.parent().parent().next().show();
730 943 $('.sellkit-one-page-pay-method').on('click', function () {
731 944 $('.sellkit_payment_box').hide();
732 945 $(this).parent().parent().next().show();
733 946 });
@@ -737,9 +950,15 @@
737 950 $('.cart-subtotal td').css('padding-bottom', '8px');
738 951 $('.cart-subtotal th').css('padding-bottom', '8px');
739 952 }
740 953 };
954 +/**
955 + * Apply a coupon.
956 + *
957 + * @since 1.2.5
958 + */
741 959
960 +
742 961 var applyCoupon = function applyCoupon() {
743 962 $('.sellkit-apply-coupon').off('click').on('click', function () {
744 963 wp.ajax.post({
745 964 beforeSend: function beforeSend() {
@@ -756,9 +975,37 @@
756 975 $('.jx-apply-coupon').css('opacity', 1);
757 976 });
758 977 });
759 978 };
979 +/**
980 + * Send shipping method id to backend
981 + *
982 + * The click event used because change event, send shipping method id on page load to backend and make an issue.
983 + *
984 + * @since 2.6.0
985 + */
760 986
987 +
988 +var sellkitDetectShippingMethodChange = function sellkitDetectShippingMethodChange() {
989 + $('input.shipping_method').off('click').on('click', function () {
990 + var selectedMethod = $(this).val();
991 + wp.ajax.post({
992 + action: 'shipping_method_selected',
993 + nonce: sellkit_elementor.nonce,
994 + shipping_method: selectedMethod
995 + }).fail(function (data) {
996 + // eslint-disable-next-line
997 + console.error(data);
998 + });
999 + });
1000 +};
1001 +/**
1002 + * Toggle coupon form on click event.
1003 + *
1004 + * @since 1.2.5
1005 + */
1006 +
1007 +
761 1008 var couponToggle = function couponToggle() {
762 1009 if ($('.sellkit-coupon-toggle').length) {
763 1010 $('.sellkit-custom-coupon-form').css('display', 'none');
764 1011 }
@@ -783,9 +1030,17 @@
783 1030 flexDirection: direction
784 1031 });
785 1032 });
786 1033 };
1034 +/**
1035 + * Validate postcode in WooCommerce way.
1036 + *
1037 + * @param {string} postcode
1038 + * @param {string} country
1039 + * @param {Object} element
1040 + */
787 1041
1042 +
788 1043 var postcodeValidation = function postcodeValidation(postcode, country, element) {
789 1044 var parentElement = element.attr('id');
790 1045 wp.ajax.post({
791 1046 action: 'sellkit_checkout_ajax_handler',
@@ -803,9 +1058,16 @@
803 1058 var parent = field.parent().parent().parent();
804 1059 parent.find('.sellkit-checkout-field-global-errors').show().text((0, _i18n.__)('Postcode is not valid.', 'sellkit'));
805 1060 });
806 1061 };
1062 +/**
1063 + * Validate phone number in WooCommerce way.
1064 + *
1065 + * @param {string} phone
1066 + * @param {Object} element
1067 + */
807 1068
1069 +
808 1070 var phoneNumberValidation = function phoneNumberValidation(phone, element) {
809 1071 var parentElement = element.attr('id');
810 1072 wp.ajax.post({
811 1073 action: 'sellkit_checkout_ajax_handler',
@@ -822,9 +1084,15 @@
822 1084 var parent = field.parent().parent().parent();
823 1085 parent.find('.sellkit-checkout-field-global-errors').show().text((0, _i18n.__)('Phone number is not valid.', 'sellkit'));
824 1086 });
825 1087 };
1088 +/**
1089 + * Auto populate city and state fields using postcode by getting information from third api : https://api.zippopotam.us/.
1090 + *
1091 + * @since 1.2.5
1092 + */
826 1093
1094 +
827 1095 var sellkitPostalCodeAutocomplete = function sellkitPostalCodeAutocomplete() {
828 1096 $('.post_code_autocomplete').find('input').on('paste focusout', function () {
829 1097 var postcode = $(this).val();
830 1098 var country = $('#shipping_country').val();
@@ -848,12 +1116,24 @@
848 1116 country_value: country,
849 1117 postcode_value: postcode,
850 1118 nonce: sellkit_elementor.nonce
851 1119 }).done(function (response) {
852 - var body = response.body;
853 - body = JSON.parse(body);
1120 + setError('');
1121 + var body = response;
854 1122 var placeCity = body.places[0]['place name'];
855 1123 var placeState = body.places[0]['state abbreviation'];
1124 + var countryResponse = body['country abbreviation'];
1125 +
1126 + if (_.isEmpty(placeState)) {
1127 + placeState = body.places[0].state;
1128 + }
1129 +
1130 + var countries = ['DE', 'TR', 'BD', 'DO', 'GB', 'GT', 'JP', 'TH', 'ZA'];
1131 +
1132 + if (countries.includes(countryResponse)) {
1133 + placeState = fixConflictWooCommerceStatesWithApi(countryResponse, placeState, body);
1134 + }
1135 +
856 1136 setFields(placeCity, placeState);
857 1137 }).fail(function (response) {
858 1138 setError(response);
859 1139 });
@@ -860,8 +1140,12 @@
860 1140
861 1141 var setFields = function setFields(placeCity, placeState) {
862 1142 state.val(placeState).addClass('filled');
863 1143 city.val(placeCity).addClass('filled');
1144 +
1145 + if (null === state.val() && 'SELECT' === state[0].nodeName) {
1146 + state.prop('selectedIndex', 0);
1147 + }
864 1148 };
865 1149
866 1150 var setError = function setError(response) {
867 1151 parent.find('.sellkit-checkout-field-global-errors').text(response);
@@ -867,9 +1151,78 @@
867 1151 parent.find('.sellkit-checkout-field-global-errors').text(response);
868 1152 };
869 1153 });
870 1154 };
1155 +/**
1156 + * Fix some countries states conflict between WooCommerce and https://api.zippopotam.us/.
1157 + *
1158 + * @param {string} country response country.
1159 + * @param {string} state response state.
1160 + * @param {Object} body response body.
1161 + * @return {string} state.
1162 + */
871 1163
1164 +
1165 +var fixConflictWooCommerceStatesWithApi = function fixConflictWooCommerceStatesWithApi(country, state, body) {
1166 + switch (country) {
1167 + case 'TR':
1168 + // Turkey.
1169 + state = 'TR' + state;
1170 + break;
1171 +
1172 + case 'DE':
1173 + // Germany.
1174 + state = 'DE-' + state;
1175 + break;
1176 +
1177 + case 'BD':
1178 + // Bangladesh.
1179 + state = sellkitCheckoutCountryFixAutoPopulate(state, country, body);
1180 + break;
1181 +
1182 + case 'DO':
1183 + // Dominican Republic. Api has no proper response. we select first option
1184 + state = 'DO-01';
1185 + break;
1186 +
1187 + case 'GB':
1188 + // United kingdom.
1189 + state = body.places[0].state;
1190 + break;
1191 +
1192 + case 'GT':
1193 + // Guatemala.
1194 + state = 'GT-AV';
1195 + break;
1196 +
1197 + case 'JP':
1198 + // Japan.
1199 + state = sellkitCheckoutCountryFixAutoPopulate(state, country, body);
1200 + break;
1201 +
1202 + case 'TH':
1203 + // Thailand.
1204 + state = sellkitCheckoutCountryFixAutoPopulate(state, country, body);
1205 + break;
1206 +
1207 + case 'ZA':
1208 + // South Africa. API has no proper response. we select first option.
1209 + state = 'EC';
1210 + break;
1211 +
1212 + default:
1213 + return state;
1214 + }
1215 +
1216 + return state;
1217 +};
1218 +/**
1219 + * Integration with Klarma checkout gateway.
1220 + *
1221 + * @since 1.2.5
1222 + */
1223 +
1224 +
872 1225 var sellkitKlarmaIntegration = function sellkitKlarmaIntegration() {
873 1226 $(document).ready(function () {
874 1227 $('#sellkit-klarna-pay-button').on('click', function () {
875 1228 $('#payment_method_kco').trigger('click');
@@ -874,56 +1227,102 @@
874 1227 $('#sellkit-klarna-pay-button').on('click', function () {
875 1228 $('#payment_method_kco').trigger('click');
876 1229 });
877 1230 });
878 -}; // This also is supposed to update shipping method.
1231 +};
1232 +/**
1233 + * Save client state and country on change event.
1234 + *
1235 + * @since 1.2.5
1236 + */
879 1237
880 1238
881 1239 var fixClientCountryOnReload = function fixClientCountryOnReload() {
882 - $('#shipping_country, #billing_country, #sellkit-shipping_state, #sellkit-billing_state').change(function () {
1240 + $('#shipping_country, #billing_country, #sellkit-shipping_state, #sellkit-billing_state').on('change', function () {
883 1241 sellkitSetAddressDetails();
884 1242 });
885 1243 };
1244 +/**
1245 + * Ajax to save user state and country for both shipping and billing section if those fields are present.
1246 + *
1247 + * @since 1.2.5
1248 + */
886 1249
1250 +
887 1251 var sellkitSetAddressDetails = function sellkitSetAddressDetails() {
1252 + if (window.sellkitSuppressBillingAddressAjax) {
1253 + return;
1254 + }
1255 +
888 1256 wp.ajax.post({
889 1257 action: 'sellkit_checkout_ajax_handler',
890 1258 sub_action: 'set_customer_details_ajax',
891 - country: document.getElementById('billing_country').value,
892 - state: document.getElementById('sellkit-billing_state').value,
893 - shipping_country: document.getElementById('shipping_country').value,
894 - shipping_state: document.getElementById('sellkit-shipping_state').value,
1259 + country: document.querySelector('#billing_country') ? document.getElementById('billing_country').value : '',
1260 + state: document.querySelector('#sellkit-billing_state') ? document.getElementById('sellkit-billing_state').value : '',
1261 + shipping_country: document.querySelector('#shipping_country') ? document.getElementById('shipping_country').value : '',
1262 + shipping_state: document.querySelector('#sellkit-shipping_state') ? document.getElementById('sellkit-shipping_state').value : '',
895 1263 nonce: sellkit_elementor.nonce
896 1264 }).always(function () {
897 1265 $(document.body).trigger('update_checkout');
898 1266 });
899 1267 };
1268 +/**
1269 + * On page load set shipping and billing state & country values.
1270 + *
1271 + * @since 1.2.5
1272 + */
900 1273
1274 +
901 1275 var fixStateIssueOnLoad = function fixStateIssueOnLoad() {
902 - var primaryValue = $('#shipping_country').val();
903 - $('#shipping_country').val($('#shipping_country option:eq(1)').val());
904 - $('#shipping_country').val(primaryValue).trigger('change');
905 - primaryValue = $('#billing_country').val();
906 - $('#billing_country').val($('#billing_country option:eq(1)').val());
907 - $('#billing_country').val(primaryValue).trigger('change');
1276 + var primaryValue = '';
1277 +
1278 + if (document.querySelector('#shipping_country')) {
1279 + primaryValue = $('#shipping_country').val();
1280 + $('#shipping_country').val($('#shipping_country option:eq(1)').val());
1281 + $('#shipping_country').val(primaryValue).trigger('change');
1282 + }
1283 +
1284 + if (document.querySelector('#billing_country')) {
1285 + primaryValue = $('#billing_country').val();
1286 + $('#billing_country').val($('#billing_country option:eq(1)').val());
1287 + $('#billing_country').val(primaryValue).trigger('change');
1288 + }
908 1289 };
1290 +/**
1291 + * Modify cart items when bundle products are present.
1292 + *
1293 + * @since 1.2.5
1294 + */
909 1295
1296 +
910 1297 var sellkitCheckoutConfigureBundleProducts = function sellkitCheckoutConfigureBundleProducts() {
1298 + bundleProductOnQuantityChange();
911 1299 var radioProducts = $('.sellkit-checkout-bundle-item');
912 1300 radioProducts.off('change').on('change', function () {
1301 + var addType = $(this).attr('type'); // On bundle product change, modify bump too.
1302 +
913 1303 $('.sellkit-checkout-bump-order-products').each(function () {
914 - if ($(this).is(':checked')) {
1304 + if ($(this).is(':checked') && 'radio' === addType) {
915 1305 $(this).trigger('click');
916 1306 }
917 1307 });
918 1308 var product = $(this).val();
919 1309 var quantity = $(this).parent().parent().find('.sellkit-checkout-single-bundle-item-quantity').val();
1310 + var checkout = $('#sellkit_current_page_id').val();
1311 + var modifyType = 'add';
1312 +
1313 + if (false === $(this).is(':checked')) {
1314 + modifyType = 'remove';
1315 + }
1316 +
920 1317 wp.ajax.post({
921 1318 action: 'sellkit_checkout_ajax_handler',
922 1319 sub_action: 'sellkit_checkout_modify_cart_by_bundle_products',
923 1320 id: product,
924 1321 qty: quantity,
925 - type: 'radio',
1322 + checkout_id: checkout,
1323 + type: addType,
1324 + modify: modifyType,
926 1325 nonce: sellkit_elementor.nonce
927 1326 }).always(function () {
928 1327 $(document.body).trigger('update_checkout');
929 1328 });
@@ -928,9 +1327,42 @@
928 1327 $(document.body).trigger('update_checkout');
929 1328 });
930 1329 });
931 1330 };
1331 +/**
1332 + * Change cart item quantity on bundle product quantity change.
1333 + *
1334 + * @since 1.3.1
1335 + */
932 1336
1337 +
1338 +var bundleProductOnQuantityChange = function bundleProductOnQuantityChange() {
1339 + $('.sellkit-checkout-single-bundle-item-quantity').on('change', function () {
1340 + var productCartKey = $(this).attr('data-id');
1341 + var quantity = $(this).val();
1342 +
1343 + if (false === $(this).parent().parent().find('.sellkit-checkout-bundle-item').is(':checked')) {
1344 + return;
1345 + }
1346 +
1347 + wp.ajax.post({
1348 + action: 'sellkit_checkout_ajax_handler',
1349 + sub_action: 'sellkit_checkout_modify_cart_by_bundle_products',
1350 + key: productCartKey,
1351 + qty: quantity,
1352 + nonce: sellkit_elementor.nonce
1353 + }).always(function () {
1354 + $(document.body).trigger('update_checkout');
1355 + });
1356 + });
1357 +};
1358 +/**
1359 + * Manage to add or remove a bump product from cart.
1360 + *
1361 + * @since 1.2.5
1362 + */
1363 +
1364 +
933 1365 var sellkitCheckoutOrderBump = function sellkitCheckoutOrderBump() {
934 1366 $('.sellkit-checkout-bump-order-products').on('click', function () {
935 1367 var subAction;
936 1368
@@ -945,8 +1377,9 @@
945 1377 sub_action: 'change_cart_item_qty',
946 1378 qty: $(this).attr('data-qty'),
947 1379 id: $(this).val(),
948 1380 mode: subAction,
1381 + related_checkout: $('#sellkit_current_page_id').val(),
949 1382 nonce: sellkit_elementor.nonce
950 1383 }).always(function () {
951 1384 $(document.body).trigger('update_checkout');
952 1385 });
@@ -951,10 +1384,342 @@
951 1384 $(document.body).trigger('update_checkout');
952 1385 });
953 1386 });
954 1387 };
1388 +/**
1389 + * Checks if a required field is not filled.
1390 + *
1391 + * @return {boolean} state of error.
1392 + * @since 1.2.5
1393 + */
955 1394
956 -},{"@wordpress/i18n":12}],2:[function(require,module,exports){
1395 +
1396 +var checkRequiredFields = function checkRequiredFields() {
1397 + var fields = document.querySelectorAll('#sellkit-checkout-widget-shipping-fields > .validate-required');
1398 + var error = false; // Let's check email field first.
1399 +
1400 + if (_.isEmpty($('#billing_email').val())) {
1401 + $('.sellkit-checkout-widget-email-empty').css('display', 'block');
1402 + return true;
1403 + } // Hide warning after filling email field.
1404 +
1405 +
1406 + $('.sellkit-checkout-widget-email-empty').css('display', 'none');
1407 +
1408 + if (fields.length < 1) {
1409 + return error;
1410 + }
1411 +
1412 + fields.forEach(function (item) {
1413 + var target = $(item).find('input, select, textarea').val();
1414 +
1415 + if ('' === target) {
1416 + error = true;
1417 + $(item).find('.sellkit-required-validation').css('display', 'inline-flex');
1418 + }
1419 + });
1420 + return error;
1421 +};
1422 +/**
1423 + * Loop through WooCommerce states and replace api returned value.
1424 + *
1425 + * @param {string} state
1426 + * @param {string} countryAbbreviated
1427 + * @param {Object} body
1428 + * @return {string} state value.
1429 + * @since 1.2.5
1430 + */
1431 +
1432 +
1433 +var sellkitCheckoutCountryFixAutoPopulate = function sellkitCheckoutCountryFixAutoPopulate(state, countryAbbreviated, body) {
1434 + var value = '';
1435 + var country = '';
1436 +
1437 + if ('BD' === countryAbbreviated) {
1438 + country = wcCountries.BD;
1439 + }
1440 +
1441 + if ('JP' === countryAbbreviated) {
1442 + country = wcCountries.JP;
1443 + state = state.substring(0, state.length - 3);
1444 + }
1445 +
1446 + if ('TH' === countryAbbreviated) {
1447 + value = 'TH-37';
1448 + country = wcCountries.TH;
1449 + state = body.places[0].state;
1450 + }
1451 +
1452 + for (var key in country) {
1453 + if (state === country[key]) {
1454 + value = key;
1455 + }
1456 + }
1457 +
1458 + return value;
1459 +};
1460 +
1461 +var sellkitAfterAjaxComplete = function sellkitAfterAjaxComplete() {
1462 + $('#place_order').on('click', function () {
1463 + var count = 0;
1464 + var transfer = setInterval(function () {
1465 + count += 1;
1466 +
1467 + if ($('.wc_payment_method > .woocommerce-NoticeGroup-checkout').length > 0) {
1468 + // Remove notice from payment area and move it to top of page( default error area ).
1469 + var notice = $('.wc_payment_method').find('.woocommerce-NoticeGroup-checkout').html();
1470 + $('.wc_payment_method').find('.woocommerce-NoticeGroup-checkout').remove();
1471 + $('.woocommerce-notices-wrapper').first().append(notice);
1472 + $(document.body).animate({
1473 + scrollTop: $('.woocommerce-notices-wrapper').offset().top - 100
1474 + }, 500); // Stop interval.
1475 +
1476 + clearInterval(transfer);
1477 + }
1478 +
1479 + if (count > 20) {
1480 + clearInterval(transfer);
1481 + }
1482 + }, 500);
1483 + });
1484 +};
1485 +/**
1486 + * Hide payment gateways <hr> divider properly after ajax calls.
1487 + * This could not be done with css.
1488 + *
1489 + * @since 1.5.4
1490 + */
1491 +
1492 +
1493 +var fixGatewayListUi = function fixGatewayListUi() {
1494 + $('.wc_payment_methods hr.sellkit-checkout-widget-divider').each(function (index, item) {
1495 + $(item).css('display', $(item).prevAll('li').first().css('display'));
1496 + });
1497 +};
1498 +/**
1499 + * Prevents checkout form from being submitted before checking upsell offers.
1500 + *
1501 + * @since 1.6.2
1502 + */
1503 +
1504 +
1505 +var sellkitLoadUpsellSteps = function sellkitLoadUpsellSteps() {
1506 + $('form.checkout').on('checkout_place_order', function () {
1507 + if ($('#sellkit_funnel_has_upsell').length > 0 && 'upsell' === $('#sellkit_funnel_has_upsell').val()) {
1508 + sellkitCallUpsell();
1509 + return false;
1510 + }
1511 +
1512 + return true;
1513 + });
1514 +};
1515 +/**
1516 + * After press place order button, call ajax to make decision for popups.
1517 + *
1518 + * @since 1.6.2
1519 + */
1520 +
1521 +
1522 +var sellkitCallUpsell = function sellkitCallUpsell() {
1523 + var loadingIcon = function loadingIcon() {
1524 + var icon = sellkit_elementor.url.assets + 'img/spinner.png',
1525 + img = document.createElement('img');
1526 + img.setAttribute('src', icon);
1527 + img.setAttribute('width', '35px');
1528 + img.setAttribute('class', 'sellkit-upsell-downsell-preloader');
1529 + return img;
1530 + };
1531 +
1532 + var onEmpty = function onEmpty() {
1533 + $('body').css('overflow', 'auto');
1534 + $('.sellkit_funnel_upsell_popup').css('display', 'none');
1535 + $('#sellkit_funnel_has_upsell').val('done');
1536 + $('#place_order').trigger('click');
1537 + };
1538 +
1539 + var loadNew = function loadNew(data) {
1540 + $('body').css('overflow', 'hidden');
1541 + $('.sellkit-upsell-popup').css('display', 'none');
1542 + $('#sellkit_funnel_popup_step_id').val(data.next_id);
1543 + $('.sellkit_funnel_upsell_popup').css({
1544 + 'z-index': '100',
1545 + display: 'none'
1546 + });
1547 + $('.sellkit_funnel_upsell_popup_' + data.next_id).css({
1548 + 'z-index': 101,
1549 + display: 'block'
1550 + });
1551 + };
1552 +
1553 + var onSuccess = function onSuccess(data) {
1554 + setTimeout(function () {
1555 + if ('thankyou' === data.next_type) {
1556 + onEmpty();
1557 + }
1558 +
1559 + if ('upsell' === data.next_type || 'downsell' === data.next_type) {
1560 + loadNew(data);
1561 + sellkitUpsellOperation();
1562 + }
1563 + }, 1000);
1564 + };
1565 +
1566 + var sellkitUpsellOperation = function sellkitUpsellOperation() {
1567 + $('.sellkit_funnel_upsell_popup .sellkit-upsell-accept-button').off().on('click', function () {
1568 + var parent = $(this).parents('.sellkit_funnel_upsell_popup'),
1569 + upsellId = parent.find('.identify').val(),
1570 + checkoutId = $('#sellkit_current_page_id').val();
1571 + $('.sellkit-upsell-popup').css('display', 'flex');
1572 + parent.find('.sellkit-upsell-updating').addClass('active');
1573 + wp.ajax.post({
1574 + action: 'sellkit_checkout_ajax_handler',
1575 + sub_action: 'perform_upsell_accept_button',
1576 + upsell_id: upsellId,
1577 + checkout_id: checkoutId,
1578 + nonce: sellkit_elementor.nonce
1579 + }).done(function (data) {
1580 + $(document.body).trigger('update_checkout');
1581 + parent.find('.sellkit-upsell-updating').removeClass('active');
1582 + parent.find('.sellkit-upsell-accepted').addClass('active');
1583 + updateSellkitPriceField(data.upsell_prices);
1584 + onSuccess(data);
1585 + }).fail(function (data) {
1586 + // eslint-disable-next-line no-console
1587 + console.error(data);
1588 + });
1589 + });
1590 + $('.sellkit_funnel_upsell_popup .sellkit-upsell-reject-button').off().on('click', function () {
1591 + var parent = $(this).parents('.sellkit_funnel_upsell_popup'),
1592 + upsellId = parent.find('.identify').val(),
1593 + icon = loadingIcon();
1594 + parent.find('.sellkit-upsell-downsell-preloader').remove();
1595 + $(icon).insertAfter(parent.find('.sellkit-accept-reject-button-widget .sellkit-upsell-reject-button'));
1596 + wp.ajax.post({
1597 + action: 'sellkit_checkout_ajax_handler',
1598 + sub_action: 'perform_upsell_reject_button',
1599 + upsell_id: upsellId,
1600 + nonce: sellkit_elementor.nonce
1601 + }).done(function (data) {
1602 + onSuccess(data);
1603 + }).fail(function (data) {
1604 + // eslint-disable-next-line no-console
1605 + console.error(data);
1606 + });
1607 + });
1608 + };
1609 +
1610 + var stepId = $('#sellkit_current_page_id').val(),
1611 + img = loadingIcon();
1612 + $('button[type=submit]').find('img').remove();
1613 + $('button[type=submit]').append(img);
1614 + wp.ajax.post({
1615 + action: 'sellkit_checkout_ajax_handler',
1616 + sub_action: 'call_funnel_popups',
1617 + step: stepId,
1618 + nonce: sellkit_elementor.nonce
1619 + }).done(function (data) {
1620 + onSuccess(data);
1621 + $('button[type=submit]').find('img').remove();
1622 + }).fail(function (data) {
1623 + // eslint-disable-next-line no-console
1624 + console.error(data);
1625 + $('button[type=submit]').find('img').remove();
1626 + });
1627 +};
1628 +
1629 +var updateSellkitPriceField = function updateSellkitPriceField(data) {
1630 + if (data === 'null' || data === null) {
1631 + return;
1632 + }
1633 +
1634 + var current_val = $('input#sellkit_product_prices').val();
1635 +
1636 + if (!current_val || current_val === '0') {
1637 + $('input#sellkit_product_prices').val(data);
1638 + } else {
1639 + var oldVal = JSON.parse(current_val);
1640 + var newVal = JSON.parse(data);
1641 + var val = JSON.stringify(Object.assign({}, oldVal, newVal));
1642 + $('input#sellkit_product_prices').val(val);
1643 + }
1644 +};
1645 +/**
1646 + * Toggle order notes.
1647 + *
1648 + * @since 1.8.9
1649 + */
1650 +
1651 +
1652 +var orderNotesToggle = function orderNotesToggle() {
1653 + $('#sellkit-add-notes-to-order-box').on('change', function () {
1654 + $(this).parent().next().toggle();
1655 + });
1656 +}; // --- Sellkit: Sync custom state fields to standard WooCommerce fields for gateway compatibility ---
1657 +
1658 +
1659 +var ensureStandardWooFields = function ensureStandardWooFields() {
1660 + try {
1661 + var form = document.querySelector('form.checkout');
1662 +
1663 + if (!form) {
1664 + return;
1665 + } // Billing state
1666 +
1667 +
1668 + var sellkitBillingState = document.getElementById('sellkit-billing_state');
1669 +
1670 + if (sellkitBillingState) {
1671 + var billingState = document.getElementById('billing_state');
1672 +
1673 + if (!billingState) {
1674 + billingState = document.createElement('input');
1675 + billingState.type = 'hidden';
1676 + billingState.id = 'billing_state';
1677 + billingState.name = 'billing_state';
1678 + form.appendChild(billingState);
1679 + }
1680 +
1681 + billingState.value = sellkitBillingState.value;
1682 + } // Shipping state
1683 +
1684 +
1685 + var sellkitShippingState = document.getElementById('sellkit-shipping_state');
1686 +
1687 + if (sellkitShippingState) {
1688 + var shippingState = document.getElementById('shipping_state');
1689 +
1690 + if (!shippingState) {
1691 + shippingState = document.createElement('input');
1692 + shippingState.type = 'hidden';
1693 + shippingState.id = 'shipping_state';
1694 + shippingState.name = 'shipping_state';
1695 + form.appendChild(shippingState);
1696 + }
1697 +
1698 + shippingState.value = sellkitShippingState.value;
1699 + }
1700 + } catch (e) {
1701 + // eslint-disable-next-line no-console
1702 + console.error('[Sellkit] Error syncing state fields for gateway compatibility:', e);
1703 + }
1704 +}; // Attach to form submit and on state field change
1705 +
1706 +
1707 +jQuery(document).ready(function (_$) {
1708 + var form = _$('form.checkout');
1709 +
1710 + if (form.length) {
1711 + form.on('submit', function () {
1712 + ensureStandardWooFields();
1713 + }); // Also update on state field change
1714 +
1715 + _$('#sellkit-billing_state, #sellkit-shipping_state').on('change input', function () {
1716 + ensureStandardWooFields();
1717 + });
1718 + }
1719 +});
1720 +
1721 +},{"./checkout-settings":1,"@babel/runtime/helpers/interopRequireDefault":9,"@wordpress/i18n":16}],3:[function(require,module,exports){
957 1722 "use strict";
958 1723
959 1724 (function ($) {
960 1725 var SellkitFrontend = function SellkitFrontend() {
@@ -959,9 +1724,10 @@
959 1724 (function ($) {
960 1725 var SellkitFrontend = function SellkitFrontend() {
961 1726 var widgets = {
962 1727 'sellkit-product-images.default': require('./product-images')["default"],
963 - 'sellkit-checkout.default': require('./checkout')["default"]
1728 + 'sellkit-checkout.default': require('./checkout')["default"],
1729 + 'sellkit-optin.default': require('./optin/optin')["default"]
964 1730 };
965 1731
966 1732 function elementorInit() {
967 1733 for (var widget in widgets) {
@@ -978,15 +1744,498 @@
978 1744
979 1745 window.sellkitFrontend = new SellkitFrontend();
980 1746 })(jQuery);
981 1747
982 -},{"./checkout":1,"./product-images":3}],3:[function(require,module,exports){
1748 +},{"./checkout":2,"./optin/optin":4,"./product-images":7}],4:[function(require,module,exports){
983 1749 "use strict";
984 1750
1751 +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
1752 +
985 1753 Object.defineProperty(exports, "__esModule", {
986 1754 value: true
987 1755 });
988 1756 exports["default"] = _default;
1757 +
1758 +var _intelligentTel = _interopRequireDefault(require("./submodules/intelligent-tel"));
1759 +
1760 +var _fieldValidation = _interopRequireDefault(require("./submodules/field-validation"));
1761 +
1762 +var _i18n = require("@wordpress/i18n");
1763 +
1764 +var Optin = elementorModules.frontend.handlers.Base.extend({
1765 + form: null,
1766 + onInit: function onInit() {
1767 + this.form = this.$element.find('form.sellkit-optin'); // Register submit listener.
1768 +
1769 + this.form.on('submit', this.onSubmit.bind(this)); // Initialize ITI for tel fields.
1770 +
1771 + _intelligentTel["default"].initializeITI(this.form); // AutoComplete address fields.
1772 +
1773 +
1774 + jQuery(document).ready(this.autoCompleteAddress.bind(this)); // Initialize flatpickr for data and time fields.
1775 +
1776 + this.initializeFlatpickr();
1777 + },
1778 + onSubmit: function onSubmit(event) {
1779 + var _this = this;
1780 +
1781 + event.preventDefault();
1782 +
1783 + if (!this.checkSaveState()) {
1784 + return;
1785 + }
1786 +
1787 + this.clearAllNotices();
1788 + this.form.css('opacity', 0.5);
1789 +
1790 + var validated = _fieldValidation["default"].validateFormFields(this.form);
1791 +
1792 + if (!validated) {
1793 + this.form.css('opacity', 1);
1794 + return;
1795 + }
1796 +
1797 + wp.ajax.send('sellkit_optin_frontend', {
1798 + data: this.prepareFormData(),
1799 + type: 'POST',
1800 + dataType: 'json',
1801 + processData: false,
1802 + contentType: false,
1803 + success: this.onSuccess,
1804 + error: this.onFailure,
1805 + complete: function complete() {
1806 + return _this.form.css('opacity', 1);
1807 + }
1808 + });
1809 + },
1810 + checkSaveState: function checkSaveState() {
1811 + if (!this.isEdit) {
1812 + return true;
1813 + }
1814 +
1815 + var btn = jQuery(elementor.panel.el).find('button#elementor-panel-saver-button-publish');
1816 +
1817 + if (!btn.length || btn.hasClass('elementor-disabled')) {
1818 + return true;
1819 + }
1820 +
1821 + var adminErrorsNode = "\n\t\t\t<div class=\"sellkit-optin-admin-alert\" role=\"alert\">\n\t\t\t\t<span class=\"title\">\n\t\t\t\t\tPlease first update/publish the changes.\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t";
1822 + this.form.before(adminErrorsNode);
1823 + return false;
1824 + },
1825 + clearAllNotices: function clearAllNotices() {
1826 + var form = this.form; // Reset everything.
1827 +
1828 + form.parent().find('.sellkit-optin-response').remove();
1829 + form.parent().find('.sellkit-optin-admin-alert').remove();
1830 + form.parent().removeClass('sellkit-optin-error');
1831 + form.parent().removeClass('sellkit-optin-success');
1832 + },
1833 + prepareFormData: function prepareFormData() {
1834 + _intelligentTel["default"].fixTelBeforeSubmit(this.form);
1835 +
1836 + var formData = new FormData(this.form[0]);
1837 + var entries = Array.from(formData.entries()); // Unify nonsingular formData entries ( happens for checkbox or multiselection select fields ) .
1838 +
1839 + entries.forEach(function (entry, i) {
1840 + var value = entry[1];
1841 + entries.forEach(function (_entry, _i) {
1842 + if (_i !== i && _entry[0] === entry[0]) {
1843 + value += ", ".concat(_entry[1]);
1844 + formData["delete"](_entry[0]);
1845 + }
1846 + });
1847 + formData.set(entry[0], value);
1848 + });
1849 + formData.append('referrer', location.toString());
1850 + formData.append('action', 'sellkit_optin_frontend');
1851 + formData.append('nonce', window.sellkit_elementor.nonce); // To make _POST content compatible with sellkit_funnel() functionality and let it find the funnel data.
1852 +
1853 + formData.append('sellkit_current_page_id', formData.get('post_id'));
1854 + return formData;
1855 + },
1856 + onSuccess: function onSuccess(response) {
1857 + var form = this.form; // Success Message.
1858 +
1859 + form.trigger('reset');
1860 + form.parent().addClass('sellkit-optin-success');
1861 + form.after("<div class=\"sellkit-optin-response\">".concat(response.message, "</div>")); // Admin Error Messages.
1862 +
1863 + this.printAdminErrors(response.admin_errors); // Download.
1864 +
1865 + if (response.downloadURL) {
1866 + window.open(response.downloadURL, '_blank');
1867 + } // Redirect.
1868 +
1869 +
1870 + if (!jQuery.isEmptyObject(response.redirectURL)) {
1871 + window.location.href = response.redirectURL;
1872 + }
1873 + },
1874 + onFailure: function onFailure(response) {
1875 + var form = this.form;
1876 + form.parent().removeClass('sellkit-optin-success');
1877 + form.parent().addClass('sellkit-optin-error'); // Handle user error messages.
1878 +
1879 + if (!_.isEmpty(response.errors)) {
1880 + _.each(response.errors, function (error) {
1881 + form.after("<div class=\"sellkit-optin-response\">".concat(error, "</div>"));
1882 + });
1883 + } // Admin Error Messages.
1884 +
1885 +
1886 + this.printAdminErrors(response.admin_errors);
1887 + },
1888 + printAdminErrors: function printAdminErrors(errors) {
1889 + if (_.isEmpty(errors)) {
1890 + return;
1891 + }
1892 +
1893 + var errorList = '';
1894 +
1895 + _.each(errors, function (error) {
1896 + errorList += "<li>".concat(error, "</li>");
1897 + });
1898 +
1899 + var adminErrorsNode = "\n\t\t\t<div class=\"sellkit-optin-admin-alert\" role=\"alert\">\n\t\t\t\t<span class=\"title\">\n\t\t\t\t\t".concat((0, _i18n.__)('Following messages are visible only for admin users.', 'sellkit'), "\n\t\t\t\t</span>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<ul> ").concat(errorList, " </ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t");
1900 + this.form.before(adminErrorsNode);
1901 + },
1902 + initializeFlatpickr: function initializeFlatpickr() {
1903 + var dateField = this.form.find('.flatpickr[type=text]');
1904 + var customLocale = dateField.data('locale');
1905 + var locale = {
1906 + firstDayOfWeek: 1
1907 + };
1908 +
1909 + if (!_.isUndefined(customLocale) && 'default' !== customLocale) {
1910 + locale = customLocale;
1911 + }
1912 +
1913 + dateField.flatpickr({
1914 + locale: locale,
1915 + minuteIncrement: 1
1916 + });
1917 + },
1918 + autoCompleteAddress: function autoCompleteAddress() {
1919 + var addressFields = this.form.find('input[data-type="address"]');
1920 + var google = this.isEdit ? window.parent.google : window.google;
1921 +
1922 + if (!addressFields.length || !google) {
1923 + return;
1924 + }
1925 +
1926 + _.each(addressFields, function (input) {
1927 + var autocomplete = new google.maps.places.Autocomplete(input, {
1928 + types: ['geocode'],
1929 + fields: ['address_components']
1930 + });
1931 + autocomplete.addListener('place_changed', function () {
1932 + var place = autocomplete.getPlace(); // Extract address components
1933 +
1934 + var address = {
1935 + street_number: '',
1936 + route: '',
1937 + locality: '',
1938 + administrative_area_level_1: '',
1939 + country: '',
1940 + postal_code: ''
1941 + }; // Map Google Maps address components to your address object
1942 +
1943 + place.address_components.forEach(function (component) {
1944 + var componentType = component.types[0];
1945 +
1946 + switch (componentType) {
1947 + case 'street_number':
1948 + address.street_number = component.long_name;
1949 + break;
1950 +
1951 + case 'route':
1952 + address.route = component.long_name;
1953 + break;
1954 +
1955 + case 'locality':
1956 + address.locality = component.long_name;
1957 + break;
1958 +
1959 + case 'administrative_area_level_1':
1960 + address.administrative_area_level_1 = component.long_name;
1961 + break;
1962 +
1963 + case 'country':
1964 + address.country = component.long_name;
1965 + break;
1966 +
1967 + case 'postal_code':
1968 + address.postal_code = component.long_name;
1969 + break;
1970 + }
1971 + }); // Combine street number and route for the full street address
1972 +
1973 + var addressString = JSON.stringify(address);
1974 + var addressHidenField = input.nextElementSibling;
1975 +
1976 + if (addressHidenField && addressHidenField.type === 'hidden') {
1977 + addressHidenField.value = addressString;
1978 + }
1979 + });
1980 + });
1981 + }
1982 +});
1983 +
1984 +function _default($scope) {
1985 + new Optin({
1986 + $element: $scope
1987 + });
1988 +}
1989 +
1990 +},{"./submodules/field-validation":5,"./submodules/intelligent-tel":6,"@babel/runtime/helpers/interopRequireDefault":9,"@wordpress/i18n":16}],5:[function(require,module,exports){
1991 +"use strict";
1992 +
1993 +Object.defineProperty(exports, "__esModule", {
1994 + value: true
1995 +});
1996 +exports["default"] = void 0;
1997 +var _default = {
1998 + messageRequired: '',
1999 + messageError: '',
2000 + validateFormFields: function validateFormFields(form) {
2001 + var _this = this;
2002 +
2003 + this.getCustomMessages(form);
2004 + var formData = form.find('[name^="fields"]');
2005 + var result = true;
2006 +
2007 + _.each(formData, function (field) {
2008 + var message = _this.getValidationMessage(field);
2009 +
2010 + if (!_.isEmpty(message)) {
2011 + result = false;
2012 + }
2013 +
2014 + _this.toggleFieldMessage(field, message);
2015 + });
2016 +
2017 + this.toggleFinalMessage(form, result);
2018 + return result;
2019 + },
2020 + getValidationMessage: function getValidationMessage(target) {
2021 + var type = target.dataset.type;
2022 + var validity = target.validity;
2023 + var i18n = window.sellkitOptinValidationsTranslations;
2024 + var message = '';
2025 +
2026 + if (validity.valueMissing || target.required && _.isEmpty(target.value)) {
2027 + message = this.messageRequired;
2028 + return message;
2029 + }
2030 +
2031 + switch (type) {
2032 + case 'email':
2033 + if (validity.typeMismatch || validity.patternMismatch) {
2034 + message = i18n.general.invalidEmail;
2035 + }
2036 +
2037 + break;
2038 +
2039 + case 'tel':
2040 + var isITI = target.hasAttribute('data-iti-tel');
2041 +
2042 + if (isITI) {
2043 + var validationMessages = i18n.itiValidation;
2044 + var inputItiInstance = window.intlTelInputGlobals.getInstance(target);
2045 + var itiValidationCode = inputItiInstance.getValidationError();
2046 + var areaCodeRequired = target.hasAttribute('data-iti-area-required');
2047 + var mustBeTelType = target.getAttribute('data-iti-tel-type');
2048 + var telType = "".concat(inputItiInstance.getNumberType());
2049 +
2050 + switch (itiValidationCode) {
2051 + case 1:
2052 + message = validationMessages.invalidCountryCode;
2053 + break;
2054 +
2055 + case 2:
2056 + message = validationMessages.tooShort;
2057 + break;
2058 +
2059 + case 3:
2060 + message = validationMessages.tooLong;
2061 + break;
2062 +
2063 + case 4:
2064 + message = areaCodeRequired ? validationMessages.areaCodeMissing : '';
2065 + break;
2066 +
2067 + case 5:
2068 + message = validationMessages.invalidLength;
2069 + break;
2070 +
2071 + case -99:
2072 + message = validationMessages.invalidGeneral;
2073 + break;
2074 +
2075 + case 0:
2076 + default:
2077 + if ('all' !== mustBeTelType && telType !== mustBeTelType) {
2078 + message = validationMessages.typeMismatch[mustBeTelType];
2079 + }
2080 +
2081 + }
2082 +
2083 + break;
2084 + }
2085 +
2086 + if (validity.typeMismatch || validity.patternMismatch) {
2087 + message = i18n.general.invalidPhone;
2088 + }
2089 +
2090 + break;
2091 +
2092 + case 'number':
2093 + if (validity.typeMismatch || validity.patternMismatch) {
2094 + message = i18n.general.invalidNumber;
2095 + break;
2096 + }
2097 +
2098 + if (validity.rangeOverflow) {
2099 + message = i18n.general.invalidMaxValue.replace('MAX_VALUE', target.max);
2100 + break;
2101 + }
2102 +
2103 + if (validity.rangeUnderflow) {
2104 + message = i18n.general.invalidMinValue.replace('MIN_VALUE', target.min);
2105 + }
2106 +
2107 + break;
2108 + }
2109 +
2110 + return message;
2111 + },
2112 + toggleFieldMessage: function toggleFieldMessage(field, message) {
2113 + var fieldGroup = jQuery(field).closest('.sellkit-field-group');
2114 + fieldGroup.removeClass('sellkit-field-invalid');
2115 + fieldGroup.find('small').remove();
2116 +
2117 + if (!_.isEmpty(message)) {
2118 + fieldGroup.addClass('sellkit-field-invalid');
2119 + fieldGroup.append("<small class=\"sellkit-optin-text\">".concat(message, "</small>"));
2120 + }
2121 + },
2122 + toggleFinalMessage: function toggleFinalMessage(form, validationResult) {
2123 + form.parent().toggleClass('sellkit-optin-error', !validationResult);
2124 + form.parent().toggleClass('sellkit-optin-success', validationResult);
2125 + form.parent().find('.sellkit-optin-response').remove();
2126 +
2127 + if (true === validationResult) {
2128 + return;
2129 + }
2130 +
2131 + form.after("<div class=\"sellkit-optin-response\">".concat(this.messageError, "</div>"));
2132 + },
2133 + getCustomMessages: function getCustomMessages(form) {
2134 + var messagesRaw = form.attr('data-messages');
2135 +
2136 + if (!_.isEmpty(messagesRaw)) {
2137 + var messages = JSON.parse(messagesRaw);
2138 + this.messageError = messages.error;
2139 + this.messageRequired = messages.required;
2140 + return;
2141 + }
2142 +
2143 + this.messageError = window.sellkitOptinValidationsTranslations.general.errorExists;
2144 + this.messageRequired = window.sellkitOptinValidationsTranslations.general.required;
2145 + }
2146 +};
2147 +exports["default"] = _default;
2148 +
2149 +},{}],6:[function(require,module,exports){
2150 +"use strict";
2151 +
2152 +Object.defineProperty(exports, "__esModule", {
2153 + value: true
2154 +});
2155 +exports["default"] = void 0;
2156 +var _default = {
2157 + initializeITI: function initializeITI(form) {
2158 + var _this = this;
2159 +
2160 + var itiTelFields = form.find('input[data-iti-tel]');
2161 +
2162 + if (!itiTelFields.length) {
2163 + return;
2164 + }
2165 +
2166 + if (!window.itiCountry) {
2167 + jQuery.get('https://ipwho.is/', function () {}, 'json').always(function (response) {
2168 + window.itiCountry = response && response.country_code ? response.country_code.toLowerCase() : 'us';
2169 +
2170 + _this.setupTelFields(itiTelFields);
2171 + });
2172 + } else {
2173 + this.setupTelFields(itiTelFields);
2174 + }
2175 + },
2176 + setupTelFields: function setupTelFields(itiTelFields) {
2177 + var iti = require('intl-tel-input');
2178 +
2179 + if (!iti) {
2180 + return;
2181 + }
2182 +
2183 + var allCountries = window.intlTelInputGlobals.getCountryData().map(function (item) {
2184 + return item.iso2;
2185 + });
2186 + var numberTypes = ['FIXED_LINE', 'MOBILE', 'FIXED_LINE_OR_MOBILE', 'TOLL_FREE', 'PREMIUM_RATE', 'SHARED_COST', 'VOIP', 'PERSONAL_NUMBER', 'PAGER', 'UAN', 'VOICEMAIL'];
2187 +
2188 + _.each(itiTelFields, function (input) {
2189 + var allowDropdown = input.hasAttribute('data-iti-allow-dropdown');
2190 + var countriesAttr = input.getAttribute('data-iti-country-include');
2191 + var countries = countriesAttr ? countriesAttr.split(' ') : null;
2192 + var isCountriesSet = countries && countries.length;
2193 + var ipDetect = input.hasAttribute('data-iti-ip-detect');
2194 + var placeHolderAttr = input.getAttribute('data-iti-tel-type');
2195 + var args = {
2196 + allowDropdown: allowDropdown,
2197 + utilsScript: 'https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.16/js/utils.min.js',
2198 + separateDialCode: true,
2199 + placeholderNumberType: 'all' === placeHolderAttr ? 'MOBILE' : numberTypes[+placeHolderAttr],
2200 + onlyCountries: isCountriesSet ? countries : allCountries,
2201 + initialCountry: '',
2202 + geoIpLookup: null
2203 + };
2204 +
2205 + if (ipDetect) {
2206 + args.initialCountry = isCountriesSet && !countries.includes(window.itiCountry) ? countries[0] : 'auto';
2207 +
2208 + args.geoIpLookup = function (success) {
2209 + return success(window.itiCountry);
2210 + };
2211 + }
2212 +
2213 + iti(input, args);
2214 + });
2215 + },
2216 + fixTelBeforeSubmit: function fixTelBeforeSubmit(form) {
2217 + var itiTelFields = form.find('input[data-iti-tel]');
2218 +
2219 + _.each(itiTelFields, function (input) {
2220 + var internationalize = input.hasAttribute('data-iti-internationalize');
2221 +
2222 + if (internationalize) {
2223 + var itiInstance = window.intlTelInputGlobals.getInstance(input);
2224 + input.value = itiInstance.getNumber();
2225 + }
2226 + });
2227 + }
2228 +};
2229 +exports["default"] = _default;
2230 +
2231 +},{"intl-tel-input":20}],7:[function(require,module,exports){
2232 +"use strict";
2233 +
2234 +Object.defineProperty(exports, "__esModule", {
2235 + value: true
2236 +});
2237 +exports["default"] = _default;
989 2238 var ProductImages = elementorModules.frontend.handlers.Base.extend({
990 2239 onInit: function onInit() {
991 2240 elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
992 2241
@@ -1030,9 +2279,9 @@
1030 2279 $element: $scope
1031 2280 });
1032 2281 }
1033 2282
1034 -},{}],4:[function(require,module,exports){
2283 +},{}],8:[function(require,module,exports){
1035 2284 function _defineProperty(obj, key, value) {
1036 2285 if (key in obj) {
1037 2286 Object.defineProperty(obj, key, {
1038 2287 value: value,
@@ -1047,9 +2296,9 @@
1047 2296 return obj;
1048 2297 }
1049 2298
1050 2299 module.exports = _defineProperty;
1051 -},{}],5:[function(require,module,exports){
2300 +},{}],9:[function(require,module,exports){
1052 2301 function _interopRequireDefault(obj) {
1053 2302 return obj && obj.__esModule ? obj : {
1054 2303 "default": obj
1055 2304 };
@@ -1055,9 +2304,9 @@
1055 2304 };
1056 2305 }
1057 2306
1058 2307 module.exports = _interopRequireDefault;
1059 -},{}],6:[function(require,module,exports){
2308 +},{}],10:[function(require,module,exports){
1060 2309 'use strict';
1061 2310
1062 2311 function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
1063 2312
@@ -1092,9 +2341,9 @@
1092 2341 }
1093 2342
1094 2343 module.exports = compile;
1095 2344
1096 -},{"@tannin/evaluate":7,"@tannin/postfix":9}],7:[function(require,module,exports){
2345 +},{"@tannin/evaluate":11,"@tannin/postfix":13}],11:[function(require,module,exports){
1097 2346 'use strict';
1098 2347
1099 2348 /**
1100 2349 * Operator callback functions.
@@ -1208,9 +2457,9 @@
1208 2457 }
1209 2458
1210 2459 module.exports = evaluate;
1211 2460
1212 -},{}],8:[function(require,module,exports){
2461 +},{}],12:[function(require,module,exports){
1213 2462 'use strict';
1214 2463
1215 2464 function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
1216 2465
@@ -1234,9 +2483,9 @@
1234 2483 }
1235 2484
1236 2485 module.exports = pluralForms;
1237 2486
1238 -},{"@tannin/compile":6}],9:[function(require,module,exports){
2487 +},{"@tannin/compile":10}],13:[function(require,module,exports){
1239 2488 'use strict';
1240 2489
1241 2490 var PRECEDENCE, OPENERS, TERMINATORS, PATTERN;
1242 2491
@@ -1364,9 +2613,9 @@
1364 2613 }
1365 2614
1366 2615 module.exports = postfix;
1367 2616
1368 -},{}],10:[function(require,module,exports){
2617 +},{}],14:[function(require,module,exports){
1369 2618 "use strict";
1370 2619
1371 2620 var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
1372 2621
@@ -1579,9 +2828,9 @@
1579 2828 };
1580 2829
1581 2830 exports.createI18n = createI18n;
1582 2831
1583 -},{"@babel/runtime/helpers/defineProperty":4,"@babel/runtime/helpers/interopRequireDefault":5,"tannin":17}],11:[function(require,module,exports){
2832 +},{"@babel/runtime/helpers/defineProperty":8,"@babel/runtime/helpers/interopRequireDefault":9,"tannin":23}],15:[function(require,module,exports){
1584 2833 "use strict";
1585 2834
1586 2835 Object.defineProperty(exports, "__esModule", {
1587 2836 value: true
@@ -1698,9 +2947,9 @@
1698 2947 exports._nx = _nx;
1699 2948 var isRTL = i18n.isRTL.bind(i18n);
1700 2949 exports.isRTL = isRTL;
1701 2950
1702 -},{"./create-i18n":10}],12:[function(require,module,exports){
2951 +},{"./create-i18n":14}],16:[function(require,module,exports){
1703 2952 "use strict";
1704 2953
1705 2954 Object.defineProperty(exports, "__esModule", {
1706 2955 value: true
@@ -1773,9 +3022,9 @@
1773 3022 });
1774 3023
1775 3024 var _defaultI18n = require("./default-i18n");
1776 3025
1777 -},{"./create-i18n":10,"./default-i18n":11,"./sprintf":13}],13:[function(require,module,exports){
3026 +},{"./create-i18n":14,"./default-i18n":15,"./sprintf":17}],17:[function(require,module,exports){
1778 3027 "use strict";
1779 3028
1780 3029 var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
1781 3030
@@ -1825,9 +3074,9 @@
1825 3074 return format;
1826 3075 }
1827 3076 }
1828 3077
1829 -},{"@babel/runtime/helpers/interopRequireDefault":5,"memize":15,"sprintf-js":14}],14:[function(require,module,exports){
3078 +},{"@babel/runtime/helpers/interopRequireDefault":9,"memize":21,"sprintf-js":18}],18:[function(require,module,exports){
1830 3079 /* global window, exports, define */
1831 3080
1832 3081 !function() {
1833 3082 'use strict'
@@ -2058,9 +3307,1369 @@
2058 3307 }
2059 3308 /* eslint-enable quote-props */
2060 3309 }(); // eslint-disable-line
2061 3310
2062 -},{}],15:[function(require,module,exports){
3311 +},{}],19:[function(require,module,exports){
3312 +/*
3313 + * International Telephone Input v17.0.16
3314 + * https://github.com/jackocnr/intl-tel-input.git
3315 + * Licensed under the MIT license
3316 + */
3317 +
3318 +// wrap in UMD
3319 +(function(factory) {
3320 + if (typeof module === "object" && module.exports) module.exports = factory(); else window.intlTelInput = factory();
3321 +})(function(undefined) {
3322 + "use strict";
3323 + return function() {
3324 + // Array of country objects for the flag dropdown.
3325 + // Here is the criteria for the plugin to support a given country/territory
3326 + // - It has an iso2 code: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
3327 + // - It has it's own country calling code (it is not a sub-region of another country): https://en.wikipedia.org/wiki/List_of_country_calling_codes
3328 + // - It has a flag in the region-flags project: https://github.com/behdad/region-flags/tree/gh-pages/png
3329 + // - It is supported by libphonenumber (it must be listed on this page): https://github.com/googlei18n/libphonenumber/blob/master/resources/ShortNumberMetadata.xml
3330 + // Each country array has the following information:
3331 + // [
3332 + // Country name,
3333 + // iso2 code,
3334 + // International dial code,
3335 + // Order (if >1 country with same dial code),
3336 + // Area codes
3337 + // ]
3338 + var allCountries = [ [ "Afghanistan (‫افغانستان‬‎)", "af", "93" ], [ "Albania (Shqipëri)", "al", "355" ], [ "Algeria (‫الجزائر‬‎)", "dz", "213" ], [ "American Samoa", "as", "1", 5, [ "684" ] ], [ "Andorra", "ad", "376" ], [ "Angola", "ao", "244" ], [ "Anguilla", "ai", "1", 6, [ "264" ] ], [ "Antigua and Barbuda", "ag", "1", 7, [ "268" ] ], [ "Argentina", "ar", "54" ], [ "Armenia (Հայաստան)", "am", "374" ], [ "Aruba", "aw", "297" ], [ "Ascension Island", "ac", "247" ], [ "Australia", "au", "61", 0 ], [ "Austria (Österreich)", "at", "43" ], [ "Azerbaijan (Azərbaycan)", "az", "994" ], [ "Bahamas", "bs", "1", 8, [ "242" ] ], [ "Bahrain (‫البحرين‬‎)", "bh", "973" ], [ "Bangladesh (বাংলাদেশ)", "bd", "880" ], [ "Barbados", "bb", "1", 9, [ "246" ] ], [ "Belarus (Беларусь)", "by", "375" ], [ "Belgium (België)", "be", "32" ], [ "Belize", "bz", "501" ], [ "Benin (Bénin)", "bj", "229" ], [ "Bermuda", "bm", "1", 10, [ "441" ] ], [ "Bhutan (འབྲུག)", "bt", "975" ], [ "Bolivia", "bo", "591" ], [ "Bosnia and Herzegovina (Босна и Херцеговина)", "ba", "387" ], [ "Botswana", "bw", "267" ], [ "Brazil (Brasil)", "br", "55" ], [ "British Indian Ocean Territory", "io", "246" ], [ "British Virgin Islands", "vg", "1", 11, [ "284" ] ], [ "Brunei", "bn", "673" ], [ "Bulgaria (България)", "bg", "359" ], [ "Burkina Faso", "bf", "226" ], [ "Burundi (Uburundi)", "bi", "257" ], [ "Cambodia (កម្ពុជា)", "kh", "855" ], [ "Cameroon (Cameroun)", "cm", "237" ], [ "Canada", "ca", "1", 1, [ "204", "226", "236", "249", "250", "289", "306", "343", "365", "387", "403", "416", "418", "431", "437", "438", "450", "506", "514", "519", "548", "579", "581", "587", "604", "613", "639", "647", "672", "705", "709", "742", "778", "780", "782", "807", "819", "825", "867", "873", "902", "905" ] ], [ "Cape Verde (Kabu Verdi)", "cv", "238" ], [ "Caribbean Netherlands", "bq", "599", 1, [ "3", "4", "7" ] ], [ "Cayman Islands", "ky", "1", 12, [ "345" ] ], [ "Central African Republic (République centrafricaine)", "cf", "236" ], [ "Chad (Tchad)", "td", "235" ], [ "Chile", "cl", "56" ], [ "China (中国)", "cn", "86" ], [ "Christmas Island", "cx", "61", 2, [ "89164" ] ], [ "Cocos (Keeling) Islands", "cc", "61", 1, [ "89162" ] ], [ "Colombia", "co", "57" ], [ "Comoros (‫جزر القمر‬‎)", "km", "269" ], [ "Congo (DRC) (Jamhuri ya Kidemokrasia ya Kongo)", "cd", "243" ], [ "Congo (Republic) (Congo-Brazzaville)", "cg", "242" ], [ "Cook Islands", "ck", "682" ], [ "Costa Rica", "cr", "506" ], [ "Côte d’Ivoire", "ci", "225" ], [ "Croatia (Hrvatska)", "hr", "385" ], [ "Cuba", "cu", "53" ], [ "Curaçao", "cw", "599", 0 ], [ "Cyprus (Κύπρος)", "cy", "357" ], [ "Czech Republic (Česká republika)", "cz", "420" ], [ "Denmark (Danmark)", "dk", "45" ], [ "Djibouti", "dj", "253" ], [ "Dominica", "dm", "1", 13, [ "767" ] ], [ "Dominican Republic (República Dominicana)", "do", "1", 2, [ "809", "829", "849" ] ], [ "Ecuador", "ec", "593" ], [ "Egypt (‫مصر‬‎)", "eg", "20" ], [ "El Salvador", "sv", "503" ], [ "Equatorial Guinea (Guinea Ecuatorial)", "gq", "240" ], [ "Eritrea", "er", "291" ], [ "Estonia (Eesti)", "ee", "372" ], [ "Eswatini", "sz", "268" ], [ "Ethiopia", "et", "251" ], [ "Falkland Islands (Islas Malvinas)", "fk", "500" ], [ "Faroe Islands (Føroyar)", "fo", "298" ], [ "Fiji", "fj", "679" ], [ "Finland (Suomi)", "fi", "358", 0 ], [ "France", "fr", "33" ], [ "French Guiana (Guyane française)", "gf", "594" ], [ "French Polynesia (Polynésie française)", "pf", "689" ], [ "Gabon", "ga", "241" ], [ "Gambia", "gm", "220" ], [ "Georgia (საქართველო)", "ge", "995" ], [ "Germany (Deutschland)", "de", "49" ], [ "Ghana (Gaana)", "gh", "233" ], [ "Gibraltar", "gi", "350" ], [ "Greece (Ελλάδα)", "gr", "30" ], [ "Greenland (Kalaallit Nunaat)", "gl", "299" ], [ "Grenada", "gd", "1", 14, [ "473" ] ], [ "Guadeloupe", "gp", "590", 0 ], [ "Guam", "gu", "1", 15, [ "671" ] ], [ "Guatemala", "gt", "502" ], [ "Guernsey", "gg", "44", 1, [ "1481", "7781", "7839", "7911" ] ], [ "Guinea (Guinée)", "gn", "224" ], [ "Guinea-Bissau (Guiné Bissau)", "gw", "245" ], [ "Guyana", "gy", "592" ], [ "Haiti", "ht", "509" ], [ "Honduras", "hn", "504" ], [ "Hong Kong (香港)", "hk", "852" ], [ "Hungary (Magyarország)", "hu", "36" ], [ "Iceland (Ísland)", "is", "354" ], [ "India (भारत)", "in", "91" ], [ "Indonesia", "id", "62" ], [ "Iran (‫ایران‬‎)", "ir", "98" ], [ "Iraq (‫العراق‬‎)", "iq", "964" ], [ "Ireland", "ie", "353" ], [ "Isle of Man", "im", "44", 2, [ "1624", "74576", "7524", "7924", "7624" ] ], [ "Israel (‫ישראל‬‎)", "il", "972" ], [ "Italy (Italia)", "it", "39", 0 ], [ "Jamaica", "jm", "1", 4, [ "876", "658" ] ], [ "Japan (日本)", "jp", "81" ], [ "Jersey", "je", "44", 3, [ "1534", "7509", "7700", "7797", "7829", "7937" ] ], [ "Jordan (‫الأردن‬‎)", "jo", "962" ], [ "Kazakhstan (Казахстан)", "kz", "7", 1, [ "33", "7" ] ], [ "Kenya", "ke", "254" ], [ "Kiribati", "ki", "686" ], [ "Kosovo", "xk", "383" ], [ "Kuwait (‫الكويت‬‎)", "kw", "965" ], [ "Kyrgyzstan (Кыргызстан)", "kg", "996" ], [ "Laos (ລາວ)", "la", "856" ], [ "Latvia (Latvija)", "lv", "371" ], [ "Lebanon (‫لبنان‬‎)", "lb", "961" ], [ "Lesotho", "ls", "266" ], [ "Liberia", "lr", "231" ], [ "Libya (‫ليبيا‬‎)", "ly", "218" ], [ "Liechtenstein", "li", "423" ], [ "Lithuania (Lietuva)", "lt", "370" ], [ "Luxembourg", "lu", "352" ], [ "Macau (澳門)", "mo", "853" ], [ "North Macedonia (Македонија)", "mk", "389" ], [ "Madagascar (Madagasikara)", "mg", "261" ], [ "Malawi", "mw", "265" ], [ "Malaysia", "my", "60" ], [ "Maldives", "mv", "960" ], [ "Mali", "ml", "223" ], [ "Malta", "mt", "356" ], [ "Marshall Islands", "mh", "692" ], [ "Martinique", "mq", "596" ], [ "Mauritania (‫موريتانيا‬‎)", "mr", "222" ], [ "Mauritius (Moris)", "mu", "230" ], [ "Mayotte", "yt", "262", 1, [ "269", "639" ] ], [ "Mexico (México)", "mx", "52" ], [ "Micronesia", "fm", "691" ], [ "Moldova (Republica Moldova)", "md", "373" ], [ "Monaco", "mc", "377" ], [ "Mongolia (Монгол)", "mn", "976" ], [ "Montenegro (Crna Gora)", "me", "382" ], [ "Montserrat", "ms", "1", 16, [ "664" ] ], [ "Morocco (‫المغرب‬‎)", "ma", "212", 0 ], [ "Mozambique (Moçambique)", "mz", "258" ], [ "Myanmar (Burma) (မြန်မာ)", "mm", "95" ], [ "Namibia (Namibië)", "na", "264" ], [ "Nauru", "nr", "674" ], [ "Nepal (नेपाल)", "np", "977" ], [ "Netherlands (Nederland)", "nl", "31" ], [ "New Caledonia (Nouvelle-Calédonie)", "nc", "687" ], [ "New Zealand", "nz", "64" ], [ "Nicaragua", "ni", "505" ], [ "Niger (Nijar)", "ne", "227" ], [ "Nigeria", "ng", "234" ], [ "Niue", "nu", "683" ], [ "Norfolk Island", "nf", "672" ], [ "North Korea (조선 민주주의 인민 공화국)", "kp", "850" ], [ "Northern Mariana Islands", "mp", "1", 17, [ "670" ] ], [ "Norway (Norge)", "no", "47", 0 ], [ "Oman (‫عُمان‬‎)", "om", "968" ], [ "Pakistan (‫پاکستان‬‎)", "pk", "92" ], [ "Palau", "pw", "680" ], [ "Palestine (‫فلسطين‬‎)", "ps", "970" ], [ "Panama (Panamá)", "pa", "507" ], [ "Papua New Guinea", "pg", "675" ], [ "Paraguay", "py", "595" ], [ "Peru (Perú)", "pe", "51" ], [ "Philippines", "ph", "63" ], [ "Poland (Polska)", "pl", "48" ], [ "Portugal", "pt", "351" ], [ "Puerto Rico", "pr", "1", 3, [ "787", "939" ] ], [ "Qatar (‫قطر‬‎)", "qa", "974" ], [ "Réunion (La Réunion)", "re", "262", 0 ], [ "Romania (România)", "ro", "40" ], [ "Russia (Россия)", "ru", "7", 0 ], [ "Rwanda", "rw", "250" ], [ "Saint Barthélemy", "bl", "590", 1 ], [ "Saint Helena", "sh", "290" ], [ "Saint Kitts and Nevis", "kn", "1", 18, [ "869" ] ], [ "Saint Lucia", "lc", "1", 19, [ "758" ] ], [ "Saint Martin (Saint-Martin (partie française))", "mf", "590", 2 ], [ "Saint Pierre and Miquelon (Saint-Pierre-et-Miquelon)", "pm", "508" ], [ "Saint Vincent and the Grenadines", "vc", "1", 20, [ "784" ] ], [ "Samoa", "ws", "685" ], [ "San Marino", "sm", "378" ], [ "São Tomé and Príncipe (São Tomé e Príncipe)", "st", "239" ], [ "Saudi Arabia (‫المملكة العربية السعودية‬‎)", "sa", "966" ], [ "Senegal (Sénégal)", "sn", "221" ], [ "Serbia (Србија)", "rs", "381" ], [ "Seychelles", "sc", "248" ], [ "Sierra Leone", "sl", "232" ], [ "Singapore", "sg", "65" ], [ "Sint Maarten", "sx", "1", 21, [ "721" ] ], [ "Slovakia (Slovensko)", "sk", "421" ], [ "Slovenia (Slovenija)", "si", "386" ], [ "Solomon Islands", "sb", "677" ], [ "Somalia (Soomaaliya)", "so", "252" ], [ "South Africa", "za", "27" ], [ "South Korea (대한민국)", "kr", "82" ], [ "South Sudan (‫جنوب السودان‬‎)", "ss", "211" ], [ "Spain (España)", "es", "34" ], [ "Sri Lanka (ශ්‍රී ලංකාව)", "lk", "94" ], [ "Sudan (‫السودان‬‎)", "sd", "249" ], [ "Suriname", "sr", "597" ], [ "Svalbard and Jan Mayen", "sj", "47", 1, [ "79" ] ], [ "Sweden (Sverige)", "se", "46" ], [ "Switzerland (Schweiz)", "ch", "41" ], [ "Syria (‫سوريا‬‎)", "sy", "963" ], [ "Taiwan (台灣)", "tw", "886" ], [ "Tajikistan", "tj", "992" ], [ "Tanzania", "tz", "255" ], [ "Thailand (ไทย)", "th", "66" ], [ "Timor-Leste", "tl", "670" ], [ "Togo", "tg", "228" ], [ "Tokelau", "tk", "690" ], [ "Tonga", "to", "676" ], [ "Trinidad and Tobago", "tt", "1", 22, [ "868" ] ], [ "Tunisia (‫تونس‬‎)", "tn", "216" ], [ "Turkey (Türkiye)", "tr", "90" ], [ "Turkmenistan", "tm", "993" ], [ "Turks and Caicos Islands", "tc", "1", 23, [ "649" ] ], [ "Tuvalu", "tv", "688" ], [ "U.S. Virgin Islands", "vi", "1", 24, [ "340" ] ], [ "Uganda", "ug", "256" ], [ "Ukraine (Україна)", "ua", "380" ], [ "United Arab Emirates (‫الإمارات العربية المتحدة‬‎)", "ae", "971" ], [ "United Kingdom", "gb", "44", 0 ], [ "United States", "us", "1", 0 ], [ "Uruguay", "uy", "598" ], [ "Uzbekistan (Oʻzbekiston)", "uz", "998" ], [ "Vanuatu", "vu", "678" ], [ "Vatican City (Città del Vaticano)", "va", "39", 1, [ "06698" ] ], [ "Venezuela", "ve", "58" ], [ "Vietnam (Việt Nam)", "vn", "84" ], [ "Wallis and Futuna (Wallis-et-Futuna)", "wf", "681" ], [ "Western Sahara (‫الصحراء الغربية‬‎)", "eh", "212", 1, [ "5288", "5289" ] ], [ "Yemen (‫اليمن‬‎)", "ye", "967" ], [ "Zambia", "zm", "260" ], [ "Zimbabwe", "zw", "263" ], [ "Åland Islands", "ax", "358", 1, [ "18" ] ] ];
3339 + // loop over all of the countries above, restructuring the data to be objects with named keys
3340 + for (var i = 0; i < allCountries.length; i++) {
3341 + var c = allCountries[i];
3342 + allCountries[i] = {
3343 + name: c[0],
3344 + iso2: c[1],
3345 + dialCode: c[2],
3346 + priority: c[3] || 0,
3347 + areaCodes: c[4] || null
3348 + };
3349 + }
3350 + "use strict";
3351 + function _classCallCheck(instance, Constructor) {
3352 + if (!(instance instanceof Constructor)) {
3353 + throw new TypeError("Cannot call a class as a function");
3354 + }
3355 + }
3356 + function _defineProperties(target, props) {
3357 + for (var i = 0; i < props.length; i++) {
3358 + var descriptor = props[i];
3359 + descriptor.enumerable = descriptor.enumerable || false;
3360 + descriptor.configurable = true;
3361 + if ("value" in descriptor) descriptor.writable = true;
3362 + Object.defineProperty(target, descriptor.key, descriptor);
3363 + }
3364 + }
3365 + function _createClass(Constructor, protoProps, staticProps) {
3366 + if (protoProps) _defineProperties(Constructor.prototype, protoProps);
3367 + if (staticProps) _defineProperties(Constructor, staticProps);
3368 + return Constructor;
3369 + }
3370 + var intlTelInputGlobals = {
3371 + getInstance: function getInstance(input) {
3372 + var id = input.getAttribute("data-intl-tel-input-id");
3373 + return window.intlTelInputGlobals.instances[id];
3374 + },
3375 + instances: {},
3376 + // using a global like this allows us to mock it in the tests
3377 + documentReady: function documentReady() {
3378 + return document.readyState === "complete";
3379 + }
3380 + };
3381 + if (typeof window === "object") window.intlTelInputGlobals = intlTelInputGlobals;
3382 + // these vars persist through all instances of the plugin
3383 + var id = 0;
3384 + var defaults = {
3385 + // whether or not to allow the dropdown
3386 + allowDropdown: true,
3387 + // if there is just a dial code in the input: remove it on blur
3388 + autoHideDialCode: true,
3389 + // add a placeholder in the input with an example number for the selected country
3390 + autoPlaceholder: "polite",
3391 + // modify the parentClass
3392 + customContainer: "",
3393 + // modify the auto placeholder
3394 + customPlaceholder: null,
3395 + // append menu to specified element
3396 + dropdownContainer: null,
3397 + // don't display these countries
3398 + excludeCountries: [],
3399 + // format the input value during initialisation and on setNumber
3400 + formatOnDisplay: true,
3401 + // geoIp lookup function
3402 + geoIpLookup: null,
3403 + // inject a hidden input with this name, and on submit, populate it with the result of getNumber
3404 + hiddenInput: "",
3405 + // initial country
3406 + initialCountry: "",
3407 + // localized country names e.g. { 'de': 'Deutschland' }
3408 + localizedCountries: null,
3409 + // don't insert international dial codes
3410 + nationalMode: true,
3411 + // display only these countries
3412 + onlyCountries: [],
3413 + // number type to use for placeholders
3414 + placeholderNumberType: "MOBILE",
3415 + // the countries at the top of the list. defaults to united states and united kingdom
3416 + preferredCountries: [ "us", "gb" ],
3417 + // display the country dial code next to the selected flag so it's not part of the typed number
3418 + separateDialCode: false,
3419 + // specify the path to the libphonenumber script to enable validation/formatting
3420 + utilsScript: ""
3421 + };
3422 + // https://en.wikipedia.org/wiki/List_of_North_American_Numbering_Plan_area_codes#Non-geographic_area_codes
3423 + var regionlessNanpNumbers = [ "800", "822", "833", "844", "855", "866", "877", "880", "881", "882", "883", "884", "885", "886", "887", "888", "889" ];
3424 + // utility function to iterate over an object. can't use Object.entries or native forEach because
3425 + // of IE11
3426 + var forEachProp = function forEachProp(obj, callback) {
3427 + var keys = Object.keys(obj);
3428 + for (var i = 0; i < keys.length; i++) {
3429 + callback(keys[i], obj[keys[i]]);
3430 + }
3431 + };
3432 + // run a method on each instance of the plugin
3433 + var forEachInstance = function forEachInstance(method) {
3434 + forEachProp(window.intlTelInputGlobals.instances, function(key) {
3435 + window.intlTelInputGlobals.instances[key][method]();
3436 + });
3437 + };
3438 + // this is our plugin class that we will create an instance of
3439 + // eslint-disable-next-line no-unused-vars
3440 + var Iti = /*#__PURE__*/
3441 + function() {
3442 + function Iti(input, options) {
3443 + var _this = this;
3444 + _classCallCheck(this, Iti);
3445 + this.id = id++;
3446 + this.telInput = input;
3447 + this.activeItem = null;
3448 + this.highlightedItem = null;
3449 + // process specified options / defaults
3450 + // alternative to Object.assign, which isn't supported by IE11
3451 + var customOptions = options || {};
3452 + this.options = {};
3453 + forEachProp(defaults, function(key, value) {
3454 + _this.options[key] = customOptions.hasOwnProperty(key) ? customOptions[key] : value;
3455 + });
3456 + this.hadInitialPlaceholder = Boolean(input.getAttribute("placeholder"));
3457 + }
3458 + _createClass(Iti, [ {
3459 + key: "_init",
3460 + value: function _init() {
3461 + var _this2 = this;
3462 + // if in nationalMode, disable options relating to dial codes
3463 + if (this.options.nationalMode) this.options.autoHideDialCode = false;
3464 + // if separateDialCode then doesn't make sense to A) insert dial code into input
3465 + // (autoHideDialCode), and B) display national numbers (because we're displaying the country
3466 + // dial code next to them)
3467 + if (this.options.separateDialCode) {
3468 + this.options.autoHideDialCode = this.options.nationalMode = false;
3469 + }
3470 + // we cannot just test screen size as some smartphones/website meta tags will report desktop
3471 + // resolutions
3472 + // Note: for some reason jasmine breaks if you put this in the main Plugin function with the
3473 + // rest of these declarations
3474 + // Note: to target Android Mobiles (and not Tablets), we must find 'Android' and 'Mobile'
3475 + this.isMobile = /Android.+Mobile|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
3476 + if (this.isMobile) {
3477 + // trigger the mobile dropdown css
3478 + document.body.classList.add("iti-mobile");
3479 + // on mobile, we want a full screen dropdown, so we must append it to the body
3480 + if (!this.options.dropdownContainer) this.options.dropdownContainer = document.body;
3481 + }
3482 + // these promises get resolved when their individual requests complete
3483 + // this way the dev can do something like iti.promise.then(...) to know when all requests are
3484 + // complete
3485 + if (typeof Promise !== "undefined") {
3486 + var autoCountryPromise = new Promise(function(resolve, reject) {
3487 + _this2.resolveAutoCountryPromise = resolve;
3488 + _this2.rejectAutoCountryPromise = reject;
3489 + });
3490 + var utilsScriptPromise = new Promise(function(resolve, reject) {
3491 + _this2.resolveUtilsScriptPromise = resolve;
3492 + _this2.rejectUtilsScriptPromise = reject;
3493 + });
3494 + this.promise = Promise.all([ autoCountryPromise, utilsScriptPromise ]);
3495 + } else {
3496 + // prevent errors when Promise doesn't exist
3497 + this.resolveAutoCountryPromise = this.rejectAutoCountryPromise = function() {};
3498 + this.resolveUtilsScriptPromise = this.rejectUtilsScriptPromise = function() {};
3499 + }
3500 + // in various situations there could be no country selected initially, but we need to be able
3501 + // to assume this variable exists
3502 + this.selectedCountryData = {};
3503 + // process all the data: onlyCountries, excludeCountries, preferredCountries etc
3504 + this._processCountryData();
3505 + // generate the markup
3506 + this._generateMarkup();
3507 + // set the initial state of the input value and the selected flag
3508 + this._setInitialState();
3509 + // start all of the event listeners: autoHideDialCode, input keydown, selectedFlag click
3510 + this._initListeners();
3511 + // utils script, and auto country
3512 + this._initRequests();
3513 + }
3514 + }, {
3515 + key: "_processCountryData",
3516 + value: function _processCountryData() {
3517 + // process onlyCountries or excludeCountries array if present
3518 + this._processAllCountries();
3519 + // process the countryCodes map
3520 + this._processCountryCodes();
3521 + // process the preferredCountries
3522 + this._processPreferredCountries();
3523 + // translate countries according to localizedCountries option
3524 + if (this.options.localizedCountries) this._translateCountriesByLocale();
3525 + // sort countries by name
3526 + if (this.options.onlyCountries.length || this.options.localizedCountries) {
3527 + this.countries.sort(this._countryNameSort);
3528 + }
3529 + }
3530 + }, {
3531 + key: "_addCountryCode",
3532 + value: function _addCountryCode(iso2, countryCode, priority) {
3533 + if (countryCode.length > this.countryCodeMaxLen) {
3534 + this.countryCodeMaxLen = countryCode.length;
3535 + }
3536 + if (!this.countryCodes.hasOwnProperty(countryCode)) {
3537 + this.countryCodes[countryCode] = [];
3538 + }
3539 + // bail if we already have this country for this countryCode
3540 + for (var i = 0; i < this.countryCodes[countryCode].length; i++) {
3541 + if (this.countryCodes[countryCode][i] === iso2) return;
3542 + }
3543 + // check for undefined as 0 is falsy
3544 + var index = priority !== undefined ? priority : this.countryCodes[countryCode].length;
3545 + this.countryCodes[countryCode][index] = iso2;
3546 + }
3547 + }, {
3548 + key: "_processAllCountries",
3549 + value: function _processAllCountries() {
3550 + if (this.options.onlyCountries.length) {
3551 + var lowerCaseOnlyCountries = this.options.onlyCountries.map(function(country) {
3552 + return country.toLowerCase();
3553 + });
3554 + this.countries = allCountries.filter(function(country) {
3555 + return lowerCaseOnlyCountries.indexOf(country.iso2) > -1;
3556 + });
3557 + } else if (this.options.excludeCountries.length) {
3558 + var lowerCaseExcludeCountries = this.options.excludeCountries.map(function(country) {
3559 + return country.toLowerCase();
3560 + });
3561 + this.countries = allCountries.filter(function(country) {
3562 + return lowerCaseExcludeCountries.indexOf(country.iso2) === -1;
3563 + });
3564 + } else {
3565 + this.countries = allCountries;
3566 + }
3567 + }
3568 + }, {
3569 + key: "_translateCountriesByLocale",
3570 + value: function _translateCountriesByLocale() {
3571 + for (var i = 0; i < this.countries.length; i++) {
3572 + var iso = this.countries[i].iso2.toLowerCase();
3573 + if (this.options.localizedCountries.hasOwnProperty(iso)) {
3574 + this.countries[i].name = this.options.localizedCountries[iso];
3575 + }
3576 + }
3577 + }
3578 + }, {
3579 + key: "_countryNameSort",
3580 + value: function _countryNameSort(a, b) {
3581 + return a.name.localeCompare(b.name);
3582 + }
3583 + }, {
3584 + key: "_processCountryCodes",
3585 + value: function _processCountryCodes() {
3586 + this.countryCodeMaxLen = 0;
3587 + // here we store just dial codes
3588 + this.dialCodes = {};
3589 + // here we store "country codes" (both dial codes and their area codes)
3590 + this.countryCodes = {};
3591 + // first: add dial codes
3592 + for (var i = 0; i < this.countries.length; i++) {
3593 + var c = this.countries[i];
3594 + if (!this.dialCodes[c.dialCode]) this.dialCodes[c.dialCode] = true;
3595 + this._addCountryCode(c.iso2, c.dialCode, c.priority);
3596 + }
3597 + // next: add area codes
3598 + // this is a second loop over countries, to make sure we have all of the "root" countries
3599 + // already in the map, so that we can access them, as each time we add an area code substring
3600 + // to the map, we also need to include the "root" country's code, as that also matches
3601 + for (var _i = 0; _i < this.countries.length; _i++) {
3602 + var _c = this.countries[_i];
3603 + // area codes
3604 + if (_c.areaCodes) {
3605 + var rootCountryCode = this.countryCodes[_c.dialCode][0];
3606 + // for each area code
3607 + for (var j = 0; j < _c.areaCodes.length; j++) {
3608 + var areaCode = _c.areaCodes[j];
3609 + // for each digit in the area code to add all partial matches as well
3610 + for (var k = 1; k < areaCode.length; k++) {
3611 + var partialDialCode = _c.dialCode + areaCode.substr(0, k);
3612 + // start with the root country, as that also matches this dial code
3613 + this._addCountryCode(rootCountryCode, partialDialCode);
3614 + this._addCountryCode(_c.iso2, partialDialCode);
3615 + }
3616 + // add the full area code
3617 + this._addCountryCode(_c.iso2, _c.dialCode + areaCode);
3618 + }
3619 + }
3620 + }
3621 + }
3622 + }, {
3623 + key: "_processPreferredCountries",
3624 + value: function _processPreferredCountries() {
3625 + this.preferredCountries = [];
3626 + for (var i = 0; i < this.options.preferredCountries.length; i++) {
3627 + var countryCode = this.options.preferredCountries[i].toLowerCase();
3628 + var countryData = this._getCountryData(countryCode, false, true);
3629 + if (countryData) this.preferredCountries.push(countryData);
3630 + }
3631 + }
3632 + }, {
3633 + key: "_createEl",
3634 + value: function _createEl(name, attrs, container) {
3635 + var el = document.createElement(name);
3636 + if (attrs) forEachProp(attrs, function(key, value) {
3637 + return el.setAttribute(key, value);
3638 + });
3639 + if (container) container.appendChild(el);
3640 + return el;
3641 + }
3642 + }, {
3643 + key: "_generateMarkup",
3644 + value: function _generateMarkup() {
3645 + // if autocomplete does not exist on the element and its form, then
3646 + // prevent autocomplete as there's no safe, cross-browser event we can react to, so it can
3647 + // easily put the plugin in an inconsistent state e.g. the wrong flag selected for the
3648 + // autocompleted number, which on submit could mean wrong number is saved (esp in nationalMode)
3649 + if (!this.telInput.hasAttribute("autocomplete") && !(this.telInput.form && this.telInput.form.hasAttribute("autocomplete"))) {
3650 + this.telInput.setAttribute("autocomplete", "off");
3651 + }
3652 + // containers (mostly for positioning)
3653 + var parentClass = "iti";
3654 + if (this.options.allowDropdown) parentClass += " iti--allow-dropdown";
3655 + if (this.options.separateDialCode) parentClass += " iti--separate-dial-code";
3656 + if (this.options.customContainer) {
3657 + parentClass += " ";
3658 + parentClass += this.options.customContainer;
3659 + }
3660 + var wrapper = this._createEl("div", {
3661 + "class": parentClass
3662 + });
3663 + this.telInput.parentNode.insertBefore(wrapper, this.telInput);
3664 + this.flagsContainer = this._createEl("div", {
3665 + "class": "iti__flag-container"
3666 + }, wrapper);
3667 + wrapper.appendChild(this.telInput);
3668 + // selected flag (displayed to left of input)
3669 + this.selectedFlag = this._createEl("div", {
3670 + "class": "iti__selected-flag",
3671 + role: "combobox",
3672 + "aria-controls": "iti-".concat(this.id, "__country-listbox"),
3673 + "aria-owns": "iti-".concat(this.id, "__country-listbox"),
3674 + "aria-expanded": "false"
3675 + }, this.flagsContainer);
3676 + this.selectedFlagInner = this._createEl("div", {
3677 + "class": "iti__flag"
3678 + }, this.selectedFlag);
3679 + if (this.options.separateDialCode) {
3680 + this.selectedDialCode = this._createEl("div", {
3681 + "class": "iti__selected-dial-code"
3682 + }, this.selectedFlag);
3683 + }
3684 + if (this.options.allowDropdown) {
3685 + // make element focusable and tab navigable
3686 + this.selectedFlag.setAttribute("tabindex", "0");
3687 + this.dropdownArrow = this._createEl("div", {
3688 + "class": "iti__arrow"
3689 + }, this.selectedFlag);
3690 + // country dropdown: preferred countries, then divider, then all countries
3691 + this.countryList = this._createEl("ul", {
3692 + "class": "iti__country-list iti__hide",
3693 + id: "iti-".concat(this.id, "__country-listbox"),
3694 + role: "listbox",
3695 + "aria-label": "List of countries"
3696 + });
3697 + if (this.preferredCountries.length) {
3698 + this._appendListItems(this.preferredCountries, "iti__preferred", true);
3699 + this._createEl("li", {
3700 + "class": "iti__divider",
3701 + role: "separator",
3702 + "aria-disabled": "true"
3703 + }, this.countryList);
3704 + }
3705 + this._appendListItems(this.countries, "iti__standard");
3706 + // create dropdownContainer markup
3707 + if (this.options.dropdownContainer) {
3708 + this.dropdown = this._createEl("div", {
3709 + "class": "iti iti--container"
3710 + });
3711 + this.dropdown.appendChild(this.countryList);
3712 + } else {
3713 + this.flagsContainer.appendChild(this.countryList);
3714 + }
3715 + }
3716 + if (this.options.hiddenInput) {
3717 + var hiddenInputName = this.options.hiddenInput;
3718 + var name = this.telInput.getAttribute("name");
3719 + if (name) {
3720 + var i = name.lastIndexOf("[");
3721 + // if input name contains square brackets, then give the hidden input the same name,
3722 + // replacing the contents of the last set of brackets with the given hiddenInput name
3723 + if (i !== -1) hiddenInputName = "".concat(name.substr(0, i), "[").concat(hiddenInputName, "]");
3724 + }
3725 + this.hiddenInput = this._createEl("input", {
3726 + type: "hidden",
3727 + name: hiddenInputName
3728 + });
3729 + wrapper.appendChild(this.hiddenInput);
3730 + }
3731 + }
3732 + }, {
3733 + key: "_appendListItems",
3734 + value: function _appendListItems(countries, className, preferred) {
3735 + // we create so many DOM elements, it is faster to build a temp string
3736 + // and then add everything to the DOM in one go at the end
3737 + var tmp = "";
3738 + // for each country
3739 + for (var i = 0; i < countries.length; i++) {
3740 + var c = countries[i];
3741 + var idSuffix = preferred ? "-preferred" : "";
3742 + // open the list item
3743 + tmp += "<li class='iti__country ".concat(className, "' tabIndex='-1' id='iti-").concat(this.id, "__item-").concat(c.iso2).concat(idSuffix, "' role='option' data-dial-code='").concat(c.dialCode, "' data-country-code='").concat(c.iso2, "' aria-selected='false'>");
3744 + // add the flag
3745 + tmp += "<div class='iti__flag-box'><div class='iti__flag iti__".concat(c.iso2, "'></div></div>");
3746 + // and the country name and dial code
3747 + tmp += "<span class='iti__country-name'>".concat(c.name, "</span>");
3748 + tmp += "<span class='iti__dial-code'>+".concat(c.dialCode, "</span>");
3749 + // close the list item
3750 + tmp += "</li>";
3751 + }
3752 + this.countryList.insertAdjacentHTML("beforeend", tmp);
3753 + }
3754 + }, {
3755 + key: "_setInitialState",
3756 + value: function _setInitialState() {
3757 + // fix firefox bug: when first load page (with input with value set to number with intl dial
3758 + // code) and initialising plugin removes the dial code from the input, then refresh page,
3759 + // and we try to init plugin again but this time on number without dial code so get grey flag
3760 + var attributeValue = this.telInput.getAttribute("value");
3761 + var inputValue = this.telInput.value;
3762 + var useAttribute = attributeValue && attributeValue.charAt(0) === "+" && (!inputValue || inputValue.charAt(0) !== "+");
3763 + var val = useAttribute ? attributeValue : inputValue;
3764 + var dialCode = this._getDialCode(val);
3765 + var isRegionlessNanp = this._isRegionlessNanp(val);
3766 + var _this$options = this.options, initialCountry = _this$options.initialCountry, nationalMode = _this$options.nationalMode, autoHideDialCode = _this$options.autoHideDialCode, separateDialCode = _this$options.separateDialCode;
3767 + // if we already have a dial code, and it's not a regionlessNanp, we can go ahead and set the
3768 + // flag, else fall back to the default country
3769 + if (dialCode && !isRegionlessNanp) {
3770 + this._updateFlagFromNumber(val);
3771 + } else if (initialCountry !== "auto") {
3772 + // see if we should select a flag
3773 + if (initialCountry) {
3774 + this._setFlag(initialCountry.toLowerCase());
3775 + } else {
3776 + if (dialCode && isRegionlessNanp) {
3777 + // has intl dial code, is regionless nanp, and no initialCountry, so default to US
3778 + this._setFlag("us");
3779 + } else {
3780 + // no dial code and no initialCountry, so default to first in list
3781 + this.defaultCountry = this.preferredCountries.length ? this.preferredCountries[0].iso2 : this.countries[0].iso2;
3782 + if (!val) {
3783 + this._setFlag(this.defaultCountry);
3784 + }
3785 + }
3786 + }
3787 + // if empty and no nationalMode and no autoHideDialCode then insert the default dial code
3788 + if (!val && !nationalMode && !autoHideDialCode && !separateDialCode) {
3789 + this.telInput.value = "+".concat(this.selectedCountryData.dialCode);
3790 + }
3791 + }
3792 + // NOTE: if initialCountry is set to auto, that will be handled separately
3793 + // format - note this wont be run after _updateDialCode as that's only called if no val
3794 + if (val) this._updateValFromNumber(val);
3795 + }
3796 + }, {
3797 + key: "_initListeners",
3798 + value: function _initListeners() {
3799 + this._initKeyListeners();
3800 + if (this.options.autoHideDialCode) this._initBlurListeners();
3801 + if (this.options.allowDropdown) this._initDropdownListeners();
3802 + if (this.hiddenInput) this._initHiddenInputListener();
3803 + }
3804 + }, {
3805 + key: "_initHiddenInputListener",
3806 + value: function _initHiddenInputListener() {
3807 + var _this3 = this;
3808 + this._handleHiddenInputSubmit = function() {
3809 + _this3.hiddenInput.value = _this3.getNumber();
3810 + };
3811 + if (this.telInput.form) this.telInput.form.addEventListener("submit", this._handleHiddenInputSubmit);
3812 + }
3813 + }, {
3814 + key: "_getClosestLabel",
3815 + value: function _getClosestLabel() {
3816 + var el = this.telInput;
3817 + while (el && el.tagName !== "LABEL") {
3818 + el = el.parentNode;
3819 + }
3820 + return el;
3821 + }
3822 + }, {
3823 + key: "_initDropdownListeners",
3824 + value: function _initDropdownListeners() {
3825 + var _this4 = this;
3826 + // hack for input nested inside label (which is valid markup): clicking the selected-flag to
3827 + // open the dropdown would then automatically trigger a 2nd click on the input which would
3828 + // close it again
3829 + this._handleLabelClick = function(e) {
3830 + // if the dropdown is closed, then focus the input, else ignore the click
3831 + if (_this4.countryList.classList.contains("iti__hide")) _this4.telInput.focus(); else e.preventDefault();
3832 + };
3833 + var label = this._getClosestLabel();
3834 + if (label) label.addEventListener("click", this._handleLabelClick);
3835 + // toggle country dropdown on click
3836 + this._handleClickSelectedFlag = function() {
3837 + // only intercept this event if we're opening the dropdown
3838 + // else let it bubble up to the top ("click-off-to-close" listener)
3839 + // we cannot just stopPropagation as it may be needed to close another instance
3840 + if (_this4.countryList.classList.contains("iti__hide") && !_this4.telInput.disabled && !_this4.telInput.readOnly) {
3841 + _this4._showDropdown();
3842 + }
3843 + };
3844 + this.selectedFlag.addEventListener("click", this._handleClickSelectedFlag);
3845 + // open dropdown list if currently focused
3846 + this._handleFlagsContainerKeydown = function(e) {
3847 + var isDropdownHidden = _this4.countryList.classList.contains("iti__hide");
3848 + if (isDropdownHidden && [ "ArrowUp", "Up", "ArrowDown", "Down", " ", "Enter" ].indexOf(e.key) !== -1) {
3849 + // prevent form from being submitted if "ENTER" was pressed
3850 + e.preventDefault();
3851 + // prevent event from being handled again by document
3852 + e.stopPropagation();
3853 + _this4._showDropdown();
3854 + }
3855 + // allow navigation from dropdown to input on TAB
3856 + if (e.key === "Tab") _this4._closeDropdown();
3857 + };
3858 + this.flagsContainer.addEventListener("keydown", this._handleFlagsContainerKeydown);
3859 + }
3860 + }, {
3861 + key: "_initRequests",
3862 + value: function _initRequests() {
3863 + var _this5 = this;
3864 + // if the user has specified the path to the utils script, fetch it on window.load, else resolve
3865 + if (this.options.utilsScript && !window.intlTelInputUtils) {
3866 + // if the plugin is being initialised after the window.load event has already been fired
3867 + if (window.intlTelInputGlobals.documentReady()) {
3868 + window.intlTelInputGlobals.loadUtils(this.options.utilsScript);
3869 + } else {
3870 + // wait until the load event so we don't block any other requests e.g. the flags image
3871 + window.addEventListener("load", function() {
3872 + window.intlTelInputGlobals.loadUtils(_this5.options.utilsScript);
3873 + });
3874 + }
3875 + } else this.resolveUtilsScriptPromise();
3876 + if (this.options.initialCountry === "auto") this._loadAutoCountry(); else this.resolveAutoCountryPromise();
3877 + }
3878 + }, {
3879 + key: "_loadAutoCountry",
3880 + value: function _loadAutoCountry() {
3881 + // 3 options:
3882 + // 1) already loaded (we're done)
3883 + // 2) not already started loading (start)
3884 + // 3) already started loading (do nothing - just wait for loading callback to fire)
3885 + if (window.intlTelInputGlobals.autoCountry) {
3886 + this.handleAutoCountry();
3887 + } else if (!window.intlTelInputGlobals.startedLoadingAutoCountry) {
3888 + // don't do this twice!
3889 + window.intlTelInputGlobals.startedLoadingAutoCountry = true;
3890 + if (typeof this.options.geoIpLookup === "function") {
3891 + this.options.geoIpLookup(function(countryCode) {
3892 + window.intlTelInputGlobals.autoCountry = countryCode.toLowerCase();
3893 + // tell all instances the auto country is ready
3894 + // TODO: this should just be the current instances
3895 + // UPDATE: use setTimeout in case their geoIpLookup function calls this callback straight
3896 + // away (e.g. if they have already done the geo ip lookup somewhere else). Using
3897 + // setTimeout means that the current thread of execution will finish before executing
3898 + // this, which allows the plugin to finish initialising.
3899 + setTimeout(function() {
3900 + return forEachInstance("handleAutoCountry");
3901 + });
3902 + }, function() {
3903 + return forEachInstance("rejectAutoCountryPromise");
3904 + });
3905 + }
3906 + }
3907 + }
3908 + }, {
3909 + key: "_initKeyListeners",
3910 + value: function _initKeyListeners() {
3911 + var _this6 = this;
3912 + // update flag on keyup
3913 + this._handleKeyupEvent = function() {
3914 + if (_this6._updateFlagFromNumber(_this6.telInput.value)) {
3915 + _this6._triggerCountryChange();
3916 + }
3917 + };
3918 + this.telInput.addEventListener("keyup", this._handleKeyupEvent);
3919 + // update flag on cut/paste events (now supported in all major browsers)
3920 + this._handleClipboardEvent = function() {
3921 + // hack because "paste" event is fired before input is updated
3922 + setTimeout(_this6._handleKeyupEvent);
3923 + };
3924 + this.telInput.addEventListener("cut", this._handleClipboardEvent);
3925 + this.telInput.addEventListener("paste", this._handleClipboardEvent);
3926 + }
3927 + }, {
3928 + key: "_cap",
3929 + value: function _cap(number) {
3930 + var max = this.telInput.getAttribute("maxlength");
3931 + return max && number.length > max ? number.substr(0, max) : number;
3932 + }
3933 + }, {
3934 + key: "_initBlurListeners",
3935 + value: function _initBlurListeners() {
3936 + var _this7 = this;
3937 + // on blur or form submit: if just a dial code then remove it
3938 + this._handleSubmitOrBlurEvent = function() {
3939 + _this7._removeEmptyDialCode();
3940 + };
3941 + if (this.telInput.form) this.telInput.form.addEventListener("submit", this._handleSubmitOrBlurEvent);
3942 + this.telInput.addEventListener("blur", this._handleSubmitOrBlurEvent);
3943 + }
3944 + }, {
3945 + key: "_removeEmptyDialCode",
3946 + value: function _removeEmptyDialCode() {
3947 + if (this.telInput.value.charAt(0) === "+") {
3948 + var numeric = this._getNumeric(this.telInput.value);
3949 + // if just a plus, or if just a dial code
3950 + if (!numeric || this.selectedCountryData.dialCode === numeric) {
3951 + this.telInput.value = "";
3952 + }
3953 + }
3954 + }
3955 + }, {
3956 + key: "_getNumeric",
3957 + value: function _getNumeric(s) {
3958 + return s.replace(/\D/g, "");
3959 + }
3960 + }, {
3961 + key: "_trigger",
3962 + value: function _trigger(name) {
3963 + // have to use old school document.createEvent as IE11 doesn't support `new Event()` syntax
3964 + var e = document.createEvent("Event");
3965 + e.initEvent(name, true, true);
3966 + // can bubble, and is cancellable
3967 + this.telInput.dispatchEvent(e);
3968 + }
3969 + }, {
3970 + key: "_showDropdown",
3971 + value: function _showDropdown() {
3972 + this.countryList.classList.remove("iti__hide");
3973 + this.selectedFlag.setAttribute("aria-expanded", "true");
3974 + this._setDropdownPosition();
3975 + // update highlighting and scroll to active list item
3976 + if (this.activeItem) {
3977 + this._highlightListItem(this.activeItem, false);
3978 + this._scrollTo(this.activeItem, true);
3979 + }
3980 + // bind all the dropdown-related listeners: mouseover, click, click-off, keydown
3981 + this._bindDropdownListeners();
3982 + // update the arrow
3983 + this.dropdownArrow.classList.add("iti__arrow--up");
3984 + this._trigger("open:countrydropdown");
3985 + }
3986 + }, {
3987 + key: "_toggleClass",
3988 + value: function _toggleClass(el, className, shouldHaveClass) {
3989 + if (shouldHaveClass && !el.classList.contains(className)) el.classList.add(className); else if (!shouldHaveClass && el.classList.contains(className)) el.classList.remove(className);
3990 + }
3991 + }, {
3992 + key: "_setDropdownPosition",
3993 + value: function _setDropdownPosition() {
3994 + var _this8 = this;
3995 + if (this.options.dropdownContainer) {
3996 + this.options.dropdownContainer.appendChild(this.dropdown);
3997 + }
3998 + if (!this.isMobile) {
3999 + var pos = this.telInput.getBoundingClientRect();
4000 + // windowTop from https://stackoverflow.com/a/14384091/217866
4001 + var windowTop = window.pageYOffset || document.documentElement.scrollTop;
4002 + var inputTop = pos.top + windowTop;
4003 + var dropdownHeight = this.countryList.offsetHeight;
4004 + // dropdownFitsBelow = (dropdownBottom < windowBottom)
4005 + var dropdownFitsBelow = inputTop + this.telInput.offsetHeight + dropdownHeight < windowTop + window.innerHeight;
4006 + var dropdownFitsAbove = inputTop - dropdownHeight > windowTop;
4007 + // by default, the dropdown will be below the input. If we want to position it above the
4008 + // input, we add the dropup class.
4009 + this._toggleClass(this.countryList, "iti__country-list--dropup", !dropdownFitsBelow && dropdownFitsAbove);
4010 + // if dropdownContainer is enabled, calculate postion
4011 + if (this.options.dropdownContainer) {
4012 + // by default the dropdown will be directly over the input because it's not in the flow.
4013 + // If we want to position it below, we need to add some extra top value.
4014 + var extraTop = !dropdownFitsBelow && dropdownFitsAbove ? 0 : this.telInput.offsetHeight;
4015 + // calculate placement
4016 + this.dropdown.style.top = "".concat(inputTop + extraTop, "px");
4017 + this.dropdown.style.left = "".concat(pos.left + document.body.scrollLeft, "px");
4018 + // close menu on window scroll
4019 + this._handleWindowScroll = function() {
4020 + return _this8._closeDropdown();
4021 + };
4022 + window.addEventListener("scroll", this._handleWindowScroll);
4023 + }
4024 + }
4025 + }
4026 + }, {
4027 + key: "_getClosestListItem",
4028 + value: function _getClosestListItem(target) {
4029 + var el = target;
4030 + while (el && el !== this.countryList && !el.classList.contains("iti__country")) {
4031 + el = el.parentNode;
4032 + }
4033 + // if we reached the countryList element, then return null
4034 + return el === this.countryList ? null : el;
4035 + }
4036 + }, {
4037 + key: "_bindDropdownListeners",
4038 + value: function _bindDropdownListeners() {
4039 + var _this9 = this;
4040 + // when mouse over a list item, just highlight that one
4041 + // we add the class "highlight", so if they hit "enter" we know which one to select
4042 + this._handleMouseoverCountryList = function(e) {
4043 + // handle event delegation, as we're listening for this event on the countryList
4044 + var listItem = _this9._getClosestListItem(e.target);
4045 + if (listItem) _this9._highlightListItem(listItem, false);
4046 + };
4047 + this.countryList.addEventListener("mouseover", this._handleMouseoverCountryList);
4048 + // listen for country selection
4049 + this._handleClickCountryList = function(e) {
4050 + var listItem = _this9._getClosestListItem(e.target);
4051 + if (listItem) _this9._selectListItem(listItem);
4052 + };
4053 + this.countryList.addEventListener("click", this._handleClickCountryList);
4054 + // click off to close
4055 + // (except when this initial opening click is bubbling up)
4056 + // we cannot just stopPropagation as it may be needed to close another instance
4057 + var isOpening = true;
4058 + this._handleClickOffToClose = function() {
4059 + if (!isOpening) _this9._closeDropdown();
4060 + isOpening = false;
4061 + };
4062 + document.documentElement.addEventListener("click", this._handleClickOffToClose);
4063 + // listen for up/down scrolling, enter to select, or letters to jump to country name.
4064 + // use keydown as keypress doesn't fire for non-char keys and we want to catch if they
4065 + // just hit down and hold it to scroll down (no keyup event).
4066 + // listen on the document because that's where key events are triggered if no input has focus
4067 + var query = "";
4068 + var queryTimer = null;
4069 + this._handleKeydownOnDropdown = function(e) {
4070 + // prevent down key from scrolling the whole page,
4071 + // and enter key from submitting a form etc
4072 + e.preventDefault();
4073 + // up and down to navigate
4074 + if (e.key === "ArrowUp" || e.key === "Up" || e.key === "ArrowDown" || e.key === "Down") _this9._handleUpDownKey(e.key); else if (e.key === "Enter") _this9._handleEnterKey(); else if (e.key === "Escape") _this9._closeDropdown(); else if (/^[a-zA-ZÀ-ÿа-яА-Я ]$/.test(e.key)) {
4075 + // jump to countries that start with the query string
4076 + if (queryTimer) clearTimeout(queryTimer);
4077 + query += e.key.toLowerCase();
4078 + _this9._searchForCountry(query);
4079 + // if the timer hits 1 second, reset the query
4080 + queryTimer = setTimeout(function() {
4081 + query = "";
4082 + }, 1e3);
4083 + }
4084 + };
4085 + document.addEventListener("keydown", this._handleKeydownOnDropdown);
4086 + }
4087 + }, {
4088 + key: "_handleUpDownKey",
4089 + value: function _handleUpDownKey(key) {
4090 + var next = key === "ArrowUp" || key === "Up" ? this.highlightedItem.previousElementSibling : this.highlightedItem.nextElementSibling;
4091 + if (next) {
4092 + // skip the divider
4093 + if (next.classList.contains("iti__divider")) {
4094 + next = key === "ArrowUp" || key === "Up" ? next.previousElementSibling : next.nextElementSibling;
4095 + }
4096 + this._highlightListItem(next, true);
4097 + }
4098 + }
4099 + }, {
4100 + key: "_handleEnterKey",
4101 + value: function _handleEnterKey() {
4102 + if (this.highlightedItem) this._selectListItem(this.highlightedItem);
4103 + }
4104 + }, {
4105 + key: "_searchForCountry",
4106 + value: function _searchForCountry(query) {
4107 + for (var i = 0; i < this.countries.length; i++) {
4108 + if (this._startsWith(this.countries[i].name, query)) {
4109 + var listItem = this.countryList.querySelector("#iti-".concat(this.id, "__item-").concat(this.countries[i].iso2));
4110 + // update highlighting and scroll
4111 + this._highlightListItem(listItem, false);
4112 + this._scrollTo(listItem, true);
4113 + break;
4114 + }
4115 + }
4116 + }
4117 + }, {
4118 + key: "_startsWith",
4119 + value: function _startsWith(a, b) {
4120 + return a.substr(0, b.length).toLowerCase() === b;
4121 + }
4122 + }, {
4123 + key: "_updateValFromNumber",
4124 + value: function _updateValFromNumber(originalNumber) {
4125 + var number = originalNumber;
4126 + if (this.options.formatOnDisplay && window.intlTelInputUtils && this.selectedCountryData) {
4127 + var useNational = !this.options.separateDialCode && (this.options.nationalMode || number.charAt(0) !== "+");
4128 + var _intlTelInputUtils$nu = intlTelInputUtils.numberFormat, NATIONAL = _intlTelInputUtils$nu.NATIONAL, INTERNATIONAL = _intlTelInputUtils$nu.INTERNATIONAL;
4129 + var format = useNational ? NATIONAL : INTERNATIONAL;
4130 + number = intlTelInputUtils.formatNumber(number, this.selectedCountryData.iso2, format);
4131 + }
4132 + number = this._beforeSetNumber(number);
4133 + this.telInput.value = number;
4134 + }
4135 + }, {
4136 + key: "_updateFlagFromNumber",
4137 + value: function _updateFlagFromNumber(originalNumber) {
4138 + // if we're in nationalMode and we already have US/Canada selected, make sure the number starts
4139 + // with a +1 so _getDialCode will be able to extract the area code
4140 + // update: if we dont yet have selectedCountryData, but we're here (trying to update the flag
4141 + // from the number), that means we're initialising the plugin with a number that already has a
4142 + // dial code, so fine to ignore this bit
4143 + var number = originalNumber;
4144 + var selectedDialCode = this.selectedCountryData.dialCode;
4145 + var isNanp = selectedDialCode === "1";
4146 + if (number && this.options.nationalMode && isNanp && number.charAt(0) !== "+") {
4147 + if (number.charAt(0) !== "1") number = "1".concat(number);
4148 + number = "+".concat(number);
4149 + }
4150 + // update flag if user types area code for another country
4151 + if (this.options.separateDialCode && selectedDialCode && number.charAt(0) !== "+") {
4152 + number = "+".concat(selectedDialCode).concat(number);
4153 + }
4154 + // try and extract valid dial code from input
4155 + var dialCode = this._getDialCode(number, true);
4156 + var numeric = this._getNumeric(number);
4157 + var countryCode = null;
4158 + if (dialCode) {
4159 + var countryCodes = this.countryCodes[this._getNumeric(dialCode)];
4160 + // check if the right country is already selected. this should be false if the number is
4161 + // longer than the matched dial code because in this case we need to make sure that if
4162 + // there are multiple country matches, that the first one is selected (note: we could
4163 + // just check that here, but it requires the same loop that we already have later)
4164 + var alreadySelected = countryCodes.indexOf(this.selectedCountryData.iso2) !== -1 && numeric.length <= dialCode.length - 1;
4165 + var isRegionlessNanpNumber = selectedDialCode === "1" && this._isRegionlessNanp(numeric);
4166 + // only update the flag if:
4167 + // A) NOT (we currently have a NANP flag selected, and the number is a regionlessNanp)
4168 + // AND
4169 + // B) the right country is not already selected
4170 + if (!isRegionlessNanpNumber && !alreadySelected) {
4171 + // if using onlyCountries option, countryCodes[0] may be empty, so we must find the first
4172 + // non-empty index
4173 + for (var j = 0; j < countryCodes.length; j++) {
4174 + if (countryCodes[j]) {
4175 + countryCode = countryCodes[j];
4176 + break;
4177 + }
4178 + }
4179 + }
4180 + } else if (number.charAt(0) === "+" && numeric.length) {
4181 + // invalid dial code, so empty
4182 + // Note: use getNumeric here because the number has not been formatted yet, so could contain
4183 + // bad chars
4184 + countryCode = "";
4185 + } else if (!number || number === "+") {
4186 + // empty, or just a plus, so default
4187 + countryCode = this.defaultCountry;
4188 + }
4189 + if (countryCode !== null) {
4190 + return this._setFlag(countryCode);
4191 + }
4192 + return false;
4193 + }
4194 + }, {
4195 + key: "_isRegionlessNanp",
4196 + value: function _isRegionlessNanp(number) {
4197 + var numeric = this._getNumeric(number);
4198 + if (numeric.charAt(0) === "1") {
4199 + var areaCode = numeric.substr(1, 3);
4200 + return regionlessNanpNumbers.indexOf(areaCode) !== -1;
4201 + }
4202 + return false;
4203 + }
4204 + }, {
4205 + key: "_highlightListItem",
4206 + value: function _highlightListItem(listItem, shouldFocus) {
4207 + var prevItem = this.highlightedItem;
4208 + if (prevItem) prevItem.classList.remove("iti__highlight");
4209 + this.highlightedItem = listItem;
4210 + this.highlightedItem.classList.add("iti__highlight");
4211 + if (shouldFocus) this.highlightedItem.focus();
4212 + }
4213 + }, {
4214 + key: "_getCountryData",
4215 + value: function _getCountryData(countryCode, ignoreOnlyCountriesOption, allowFail) {
4216 + var countryList = ignoreOnlyCountriesOption ? allCountries : this.countries;
4217 + for (var i = 0; i < countryList.length; i++) {
4218 + if (countryList[i].iso2 === countryCode) {
4219 + return countryList[i];
4220 + }
4221 + }
4222 + if (allowFail) {
4223 + return null;
4224 + }
4225 + throw new Error("No country data for '".concat(countryCode, "'"));
4226 + }
4227 + }, {
4228 + key: "_setFlag",
4229 + value: function _setFlag(countryCode) {
4230 + var prevCountry = this.selectedCountryData.iso2 ? this.selectedCountryData : {};
4231 + // do this first as it will throw an error and stop if countryCode is invalid
4232 + this.selectedCountryData = countryCode ? this._getCountryData(countryCode, false, false) : {};
4233 + // update the defaultCountry - we only need the iso2 from now on, so just store that
4234 + if (this.selectedCountryData.iso2) {
4235 + this.defaultCountry = this.selectedCountryData.iso2;
4236 + }
4237 + this.selectedFlagInner.setAttribute("class", "iti__flag iti__".concat(countryCode));
4238 + // update the selected country's title attribute
4239 + var title = countryCode ? "".concat(this.selectedCountryData.name, ": +").concat(this.selectedCountryData.dialCode) : "Unknown";
4240 + this.selectedFlag.setAttribute("title", title);
4241 + if (this.options.separateDialCode) {
4242 + var dialCode = this.selectedCountryData.dialCode ? "+".concat(this.selectedCountryData.dialCode) : "";
4243 + this.selectedDialCode.innerHTML = dialCode;
4244 + // offsetWidth is zero if input is in a hidden container during initialisation
4245 + var selectedFlagWidth = this.selectedFlag.offsetWidth || this._getHiddenSelectedFlagWidth();
4246 + // add 6px of padding after the grey selected-dial-code box, as this is what we use in the css
4247 + this.telInput.style.paddingLeft = "".concat(selectedFlagWidth + 6, "px");
4248 + }
4249 + // and the input's placeholder
4250 + this._updatePlaceholder();
4251 + // update the active list item
4252 + if (this.options.allowDropdown) {
4253 + var prevItem = this.activeItem;
4254 + if (prevItem) {
4255 + prevItem.classList.remove("iti__active");
4256 + prevItem.setAttribute("aria-selected", "false");
4257 + }
4258 + if (countryCode) {
4259 + // check if there is a preferred item first, else fall back to standard
4260 + var nextItem = this.countryList.querySelector("#iti-".concat(this.id, "__item-").concat(countryCode, "-preferred")) || this.countryList.querySelector("#iti-".concat(this.id, "__item-").concat(countryCode));
4261 + nextItem.setAttribute("aria-selected", "true");
4262 + nextItem.classList.add("iti__active");
4263 + this.activeItem = nextItem;
4264 + this.selectedFlag.setAttribute("aria-activedescendant", nextItem.getAttribute("id"));
4265 + }
4266 + }
4267 + // return if the flag has changed or not
4268 + return prevCountry.iso2 !== countryCode;
4269 + }
4270 + }, {
4271 + key: "_getHiddenSelectedFlagWidth",
4272 + value: function _getHiddenSelectedFlagWidth() {
4273 + // to get the right styling to apply, all we need is a shallow clone of the container,
4274 + // and then to inject a deep clone of the selectedFlag element
4275 + var containerClone = this.telInput.parentNode.cloneNode();
4276 + containerClone.style.visibility = "hidden";
4277 + document.body.appendChild(containerClone);
4278 + var flagsContainerClone = this.flagsContainer.cloneNode();
4279 + containerClone.appendChild(flagsContainerClone);
4280 + var selectedFlagClone = this.selectedFlag.cloneNode(true);
4281 + flagsContainerClone.appendChild(selectedFlagClone);
4282 + var width = selectedFlagClone.offsetWidth;
4283 + containerClone.parentNode.removeChild(containerClone);
4284 + return width;
4285 + }
4286 + }, {
4287 + key: "_updatePlaceholder",
4288 + value: function _updatePlaceholder() {
4289 + var shouldSetPlaceholder = this.options.autoPlaceholder === "aggressive" || !this.hadInitialPlaceholder && this.options.autoPlaceholder === "polite";
4290 + if (window.intlTelInputUtils && shouldSetPlaceholder) {
4291 + var numberType = intlTelInputUtils.numberType[this.options.placeholderNumberType];
4292 + var placeholder = this.selectedCountryData.iso2 ? intlTelInputUtils.getExampleNumber(this.selectedCountryData.iso2, this.options.nationalMode, numberType) : "";
4293 + placeholder = this._beforeSetNumber(placeholder);
4294 + if (typeof this.options.customPlaceholder === "function") {
4295 + placeholder = this.options.customPlaceholder(placeholder, this.selectedCountryData);
4296 + }
4297 + this.telInput.setAttribute("placeholder", placeholder);
4298 + }
4299 + }
4300 + }, {
4301 + key: "_selectListItem",
4302 + value: function _selectListItem(listItem) {
4303 + // update selected flag and active list item
4304 + var flagChanged = this._setFlag(listItem.getAttribute("data-country-code"));
4305 + this._closeDropdown();
4306 + this._updateDialCode(listItem.getAttribute("data-dial-code"), true);
4307 + // focus the input
4308 + this.telInput.focus();
4309 + // put cursor at end - this fix is required for FF and IE11 (with nationalMode=false i.e. auto
4310 + // inserting dial code), who try to put the cursor at the beginning the first time
4311 + var len = this.telInput.value.length;
4312 + this.telInput.setSelectionRange(len, len);
4313 + if (flagChanged) {
4314 + this._triggerCountryChange();
4315 + }
4316 + }
4317 + }, {
4318 + key: "_closeDropdown",
4319 + value: function _closeDropdown() {
4320 + this.countryList.classList.add("iti__hide");
4321 + this.selectedFlag.setAttribute("aria-expanded", "false");
4322 + // update the arrow
4323 + this.dropdownArrow.classList.remove("iti__arrow--up");
4324 + // unbind key events
4325 + document.removeEventListener("keydown", this._handleKeydownOnDropdown);
4326 + document.documentElement.removeEventListener("click", this._handleClickOffToClose);
4327 + this.countryList.removeEventListener("mouseover", this._handleMouseoverCountryList);
4328 + this.countryList.removeEventListener("click", this._handleClickCountryList);
4329 + // remove menu from container
4330 + if (this.options.dropdownContainer) {
4331 + if (!this.isMobile) window.removeEventListener("scroll", this._handleWindowScroll);
4332 + if (this.dropdown.parentNode) this.dropdown.parentNode.removeChild(this.dropdown);
4333 + }
4334 + this._trigger("close:countrydropdown");
4335 + }
4336 + }, {
4337 + key: "_scrollTo",
4338 + value: function _scrollTo(element, middle) {
4339 + var container = this.countryList;
4340 + // windowTop from https://stackoverflow.com/a/14384091/217866
4341 + var windowTop = window.pageYOffset || document.documentElement.scrollTop;
4342 + var containerHeight = container.offsetHeight;
4343 + var containerTop = container.getBoundingClientRect().top + windowTop;
4344 + var containerBottom = containerTop + containerHeight;
4345 + var elementHeight = element.offsetHeight;
4346 + var elementTop = element.getBoundingClientRect().top + windowTop;
4347 + var elementBottom = elementTop + elementHeight;
4348 + var newScrollTop = elementTop - containerTop + container.scrollTop;
4349 + var middleOffset = containerHeight / 2 - elementHeight / 2;
4350 + if (elementTop < containerTop) {
4351 + // scroll up
4352 + if (middle) newScrollTop -= middleOffset;
4353 + container.scrollTop = newScrollTop;
4354 + } else if (elementBottom > containerBottom) {
4355 + // scroll down
4356 + if (middle) newScrollTop += middleOffset;
4357 + var heightDifference = containerHeight - elementHeight;
4358 + container.scrollTop = newScrollTop - heightDifference;
4359 + }
4360 + }
4361 + }, {
4362 + key: "_updateDialCode",
4363 + value: function _updateDialCode(newDialCodeBare, hasSelectedListItem) {
4364 + var inputVal = this.telInput.value;
4365 + // save having to pass this every time
4366 + var newDialCode = "+".concat(newDialCodeBare);
4367 + var newNumber;
4368 + if (inputVal.charAt(0) === "+") {
4369 + // there's a plus so we're dealing with a replacement (doesn't matter if nationalMode or not)
4370 + var prevDialCode = this._getDialCode(inputVal);
4371 + if (prevDialCode) {
4372 + // current number contains a valid dial code, so replace it
4373 + newNumber = inputVal.replace(prevDialCode, newDialCode);
4374 + } else {
4375 + // current number contains an invalid dial code, so ditch it
4376 + // (no way to determine where the invalid dial code ends and the rest of the number begins)
4377 + newNumber = newDialCode;
4378 + }
4379 + } else if (this.options.nationalMode || this.options.separateDialCode) {
4380 + // don't do anything
4381 + return;
4382 + } else {
4383 + // nationalMode is disabled
4384 + if (inputVal) {
4385 + // there is an existing value with no dial code: prefix the new dial code
4386 + newNumber = newDialCode + inputVal;
4387 + } else if (hasSelectedListItem || !this.options.autoHideDialCode) {
4388 + // no existing value and either they've just selected a list item, or autoHideDialCode is
4389 + // disabled: insert new dial code
4390 + newNumber = newDialCode;
4391 + } else {
4392 + return;
4393 + }
4394 + }
4395 + this.telInput.value = newNumber;
4396 + }
4397 + }, {
4398 + key: "_getDialCode",
4399 + value: function _getDialCode(number, includeAreaCode) {
4400 + var dialCode = "";
4401 + // only interested in international numbers (starting with a plus)
4402 + if (number.charAt(0) === "+") {
4403 + var numericChars = "";
4404 + // iterate over chars
4405 + for (var i = 0; i < number.length; i++) {
4406 + var c = number.charAt(i);
4407 + // if char is number (https://stackoverflow.com/a/8935649/217866)
4408 + if (!isNaN(parseInt(c, 10))) {
4409 + numericChars += c;
4410 + // if current numericChars make a valid dial code
4411 + if (includeAreaCode) {
4412 + if (this.countryCodes[numericChars]) {
4413 + // store the actual raw string (useful for matching later)
4414 + dialCode = number.substr(0, i + 1);
4415 + }
4416 + } else {
4417 + if (this.dialCodes[numericChars]) {
4418 + dialCode = number.substr(0, i + 1);
4419 + // if we're just looking for a dial code, we can break as soon as we find one
4420 + break;
4421 + }
4422 + }
4423 + // stop searching as soon as we can - in this case when we hit max len
4424 + if (numericChars.length === this.countryCodeMaxLen) {
4425 + break;
4426 + }
4427 + }
4428 + }
4429 + }
4430 + return dialCode;
4431 + }
4432 + }, {
4433 + key: "_getFullNumber",
4434 + value: function _getFullNumber() {
4435 + var val = this.telInput.value.trim();
4436 + var dialCode = this.selectedCountryData.dialCode;
4437 + var prefix;
4438 + var numericVal = this._getNumeric(val);
4439 + if (this.options.separateDialCode && val.charAt(0) !== "+" && dialCode && numericVal) {
4440 + // when using separateDialCode, it is visible so is effectively part of the typed number
4441 + prefix = "+".concat(dialCode);
4442 + } else {
4443 + prefix = "";
4444 + }
4445 + return prefix + val;
4446 + }
4447 + }, {
4448 + key: "_beforeSetNumber",
4449 + value: function _beforeSetNumber(originalNumber) {
4450 + var number = originalNumber;
4451 + if (this.options.separateDialCode) {
4452 + var dialCode = this._getDialCode(number);
4453 + // if there is a valid dial code
4454 + if (dialCode) {
4455 + // in case _getDialCode returned an area code as well
4456 + dialCode = "+".concat(this.selectedCountryData.dialCode);
4457 + // a lot of numbers will have a space separating the dial code and the main number, and
4458 + // some NANP numbers will have a hyphen e.g. +1 684-733-1234 - in both cases we want to get
4459 + // rid of it
4460 + // NOTE: don't just trim all non-numerics as may want to preserve an open parenthesis etc
4461 + var start = number[dialCode.length] === " " || number[dialCode.length] === "-" ? dialCode.length + 1 : dialCode.length;
4462 + number = number.substr(start);
4463 + }
4464 + }
4465 + return this._cap(number);
4466 + }
4467 + }, {
4468 + key: "_triggerCountryChange",
4469 + value: function _triggerCountryChange() {
4470 + this._trigger("countrychange");
4471 + }
4472 + }, {
4473 + key: "handleAutoCountry",
4474 + value: function handleAutoCountry() {
4475 + if (this.options.initialCountry === "auto") {
4476 + // we must set this even if there is an initial val in the input: in case the initial val is
4477 + // invalid and they delete it - they should see their auto country
4478 + this.defaultCountry = window.intlTelInputGlobals.autoCountry;
4479 + // if there's no initial value in the input, then update the flag
4480 + if (!this.telInput.value) {
4481 + this.setCountry(this.defaultCountry);
4482 + }
4483 + this.resolveAutoCountryPromise();
4484 + }
4485 + }
4486 + }, {
4487 + key: "handleUtils",
4488 + value: function handleUtils() {
4489 + // if the request was successful
4490 + if (window.intlTelInputUtils) {
4491 + // if there's an initial value in the input, then format it
4492 + if (this.telInput.value) {
4493 + this._updateValFromNumber(this.telInput.value);
4494 + }
4495 + this._updatePlaceholder();
4496 + }
4497 + this.resolveUtilsScriptPromise();
4498 + }
4499 + }, {
4500 + key: "destroy",
4501 + value: function destroy() {
4502 + var form = this.telInput.form;
4503 + if (this.options.allowDropdown) {
4504 + // make sure the dropdown is closed (and unbind listeners)
4505 + this._closeDropdown();
4506 + this.selectedFlag.removeEventListener("click", this._handleClickSelectedFlag);
4507 + this.flagsContainer.removeEventListener("keydown", this._handleFlagsContainerKeydown);
4508 + // label click hack
4509 + var label = this._getClosestLabel();
4510 + if (label) label.removeEventListener("click", this._handleLabelClick);
4511 + }
4512 + // unbind hiddenInput listeners
4513 + if (this.hiddenInput && form) form.removeEventListener("submit", this._handleHiddenInputSubmit);
4514 + // unbind autoHideDialCode listeners
4515 + if (this.options.autoHideDialCode) {
4516 + if (form) form.removeEventListener("submit", this._handleSubmitOrBlurEvent);
4517 + this.telInput.removeEventListener("blur", this._handleSubmitOrBlurEvent);
4518 + }
4519 + // unbind key events, and cut/paste events
4520 + this.telInput.removeEventListener("keyup", this._handleKeyupEvent);
4521 + this.telInput.removeEventListener("cut", this._handleClipboardEvent);
4522 + this.telInput.removeEventListener("paste", this._handleClipboardEvent);
4523 + // remove attribute of id instance: data-intl-tel-input-id
4524 + this.telInput.removeAttribute("data-intl-tel-input-id");
4525 + // remove markup (but leave the original input)
4526 + var wrapper = this.telInput.parentNode;
4527 + wrapper.parentNode.insertBefore(this.telInput, wrapper);
4528 + wrapper.parentNode.removeChild(wrapper);
4529 + delete window.intlTelInputGlobals.instances[this.id];
4530 + }
4531 + }, {
4532 + key: "getExtension",
4533 + value: function getExtension() {
4534 + if (window.intlTelInputUtils) {
4535 + return intlTelInputUtils.getExtension(this._getFullNumber(), this.selectedCountryData.iso2);
4536 + }
4537 + return "";
4538 + }
4539 + }, {
4540 + key: "getNumber",
4541 + value: function getNumber(format) {
4542 + if (window.intlTelInputUtils) {
4543 + var iso2 = this.selectedCountryData.iso2;
4544 + return intlTelInputUtils.formatNumber(this._getFullNumber(), iso2, format);
4545 + }
4546 + return "";
4547 + }
4548 + }, {
4549 + key: "getNumberType",
4550 + value: function getNumberType() {
4551 + if (window.intlTelInputUtils) {
4552 + return intlTelInputUtils.getNumberType(this._getFullNumber(), this.selectedCountryData.iso2);
4553 + }
4554 + return -99;
4555 + }
4556 + }, {
4557 + key: "getSelectedCountryData",
4558 + value: function getSelectedCountryData() {
4559 + return this.selectedCountryData;
4560 + }
4561 + }, {
4562 + key: "getValidationError",
4563 + value: function getValidationError() {
4564 + if (window.intlTelInputUtils) {
4565 + var iso2 = this.selectedCountryData.iso2;
4566 + return intlTelInputUtils.getValidationError(this._getFullNumber(), iso2);
4567 + }
4568 + return -99;
4569 + }
4570 + }, {
4571 + key: "isValidNumber",
4572 + value: function isValidNumber() {
4573 + var val = this._getFullNumber().trim();
4574 + var countryCode = this.options.nationalMode ? this.selectedCountryData.iso2 : "";
4575 + return window.intlTelInputUtils ? intlTelInputUtils.isValidNumber(val, countryCode) : null;
4576 + }
4577 + }, {
4578 + key: "setCountry",
4579 + value: function setCountry(originalCountryCode) {
4580 + var countryCode = originalCountryCode.toLowerCase();
4581 + // check if already selected
4582 + if (!this.selectedFlagInner.classList.contains("iti__".concat(countryCode))) {
4583 + this._setFlag(countryCode);
4584 + this._updateDialCode(this.selectedCountryData.dialCode, false);
4585 + this._triggerCountryChange();
4586 + }
4587 + }
4588 + }, {
4589 + key: "setNumber",
4590 + value: function setNumber(number) {
4591 + // we must update the flag first, which updates this.selectedCountryData, which is used for
4592 + // formatting the number before displaying it
4593 + var flagChanged = this._updateFlagFromNumber(number);
4594 + this._updateValFromNumber(number);
4595 + if (flagChanged) {
4596 + this._triggerCountryChange();
4597 + }
4598 + }
4599 + }, {
4600 + key: "setPlaceholderNumberType",
4601 + value: function setPlaceholderNumberType(type) {
4602 + this.options.placeholderNumberType = type;
4603 + this._updatePlaceholder();
4604 + }
4605 + } ]);
4606 + return Iti;
4607 + }();
4608 + /********************
4609 + * STATIC METHODS
4610 + ********************/
4611 + // get the country data object
4612 + intlTelInputGlobals.getCountryData = function() {
4613 + return allCountries;
4614 + };
4615 + // inject a <script> element to load utils.js
4616 + var injectScript = function injectScript(path, handleSuccess, handleFailure) {
4617 + // inject a new script element into the page
4618 + var script = document.createElement("script");
4619 + script.onload = function() {
4620 + forEachInstance("handleUtils");
4621 + if (handleSuccess) handleSuccess();
4622 + };
4623 + script.onerror = function() {
4624 + forEachInstance("rejectUtilsScriptPromise");
4625 + if (handleFailure) handleFailure();
4626 + };
4627 + script.className = "iti-load-utils";
4628 + script.async = true;
4629 + script.src = path;
4630 + document.body.appendChild(script);
4631 + };
4632 + // load the utils script
4633 + intlTelInputGlobals.loadUtils = function(path) {
4634 + // 2 options:
4635 + // 1) not already started loading (start)
4636 + // 2) already started loading (do nothing - just wait for the onload callback to fire, which will
4637 + // trigger handleUtils on all instances, invoking their resolveUtilsScriptPromise functions)
4638 + if (!window.intlTelInputUtils && !window.intlTelInputGlobals.startedLoadingUtilsScript) {
4639 + // only do this once
4640 + window.intlTelInputGlobals.startedLoadingUtilsScript = true;
4641 + // if we have promises, then return a promise
4642 + if (typeof Promise !== "undefined") {
4643 + return new Promise(function(resolve, reject) {
4644 + return injectScript(path, resolve, reject);
4645 + });
4646 + }
4647 + injectScript(path);
4648 + }
4649 + return null;
4650 + };
4651 + // default options
4652 + intlTelInputGlobals.defaults = defaults;
4653 + // version
4654 + intlTelInputGlobals.version = "17.0.16";
4655 + // convenience wrapper
4656 + return function(input, options) {
4657 + var iti = new Iti(input, options);
4658 + iti._init();
4659 + input.setAttribute("data-intl-tel-input-id", iti.id);
4660 + window.intlTelInputGlobals.instances[iti.id] = iti;
4661 + return iti;
4662 + };
4663 + }();
4664 +});
4665 +},{}],20:[function(require,module,exports){
4666 +/**
4667 + * Exposing intl-tel-input as a component
4668 + */
4669 +module.exports = require("./build/js/intlTelInput");
4670 +
4671 +},{"./build/js/intlTelInput":19}],21:[function(require,module,exports){
2063 4672 (function (process){
2064 4673 /**
2065 4674 * Memize options object.
2066 4675 *
@@ -2229,9 +4838,9 @@
2229 4838
2230 4839 module.exports = memize;
2231 4840
2232 4841 }).call(this,require('_process'))
2233 -},{"_process":16}],16:[function(require,module,exports){
4842 +},{"_process":22}],22:[function(require,module,exports){
2234 4843 // shim for using process in browser
2235 4844 var process = module.exports = {};
2236 4845
2237 4846 // cached from whatever global is present so that test runners that stub it
@@ -2415,9 +5024,9 @@
2415 5024 throw new Error('process.chdir is not supported');
2416 5025 };
2417 5026 process.umask = function() { return 0; };
2418 5027
2419 -},{}],17:[function(require,module,exports){
5028 +},{}],23:[function(require,module,exports){
2420 5029 'use strict';
2421 5030
2422 5031 function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
2423 5032
@@ -2636,5 +5245,5 @@
2636 5245 };
2637 5246
2638 5247 module.exports = Tannin;
2639 5248
2640 -},{"@tannin/plural-forms":8}]},{},[2]);
5249 +},{"@tannin/plural-forms":12}]},{},[3]);