1if ('serviceWorker' in navigator) { 2 window.addEventListener('load', function() { 3 navigator.serviceWorker.register(superpwa_sw.url) 4 .then(function(registration) { console.log('SuperPWA service worker ready'); 5 if(registration.active) 6 { 7 registration.update(); 8 } 9 if(typeof firebase !='undefined' && typeof pushnotification_load_messaging =='function'){ 10 const messaging = firebase.messaging(); 11 messaging.useServiceWorker(registration); 12 pushnotification_load_messaging(); 13 } 14 subOnlineOfflineIndicator(); 15 }) 16 .catch(function(error) { console.log('Registration failed with ' + error); }); 17 18 /****************** Start : Online/Offline Indicator ******************/ 19 20 // Variables & default values 21 const snackbarTimeToHide = 5000; // 5s 22 let isOffline = false, 23 snackbarTimeoutHide = null, 24 goOfflineMsg = superpwa_sw.offline_message_txt, 25 backOnlineMsg = superpwa_sw.online_message_txt; 26 27 /** 28 * Subscribe to online offline indicator 29 */ 30 function subOnlineOfflineIndicator() { 31 injectSnackbarHtml(); 32 injectSnackbarCss(); 33 runOnlineOfflineIndicator(); 34 } 35 36 /** 37 * Inject html of snackbar 38 */ 39 function injectSnackbarHtml() { 40 if (document.querySelector('.snackbar')) return; 41 42 const container = document.createElement('div'); 43 container.className = 'snackbar'; 44 45 const parag = document.createElement('p'); 46 parag.id = 'snackbar-msg'; 47 container.appendChild(parag); 48 49 const button = document.createElement('button'); 50 button.type = 'button'; 51 button.className = 'snackbar-close'; 52 button.setAttribute('aria-label', 'Close Ã'); 53 button.addEventListener('click', hideSnackbar); 54 button.innerHTML = '×'; 55 56 container.appendChild(button); 57 58 document.body.appendChild(container); 59 60 window.addEventListener('online', runOnlineOfflineIndicator); 61 window.addEventListener('offline', runOnlineOfflineIndicator); 62 63 window.addEventListener('fetch',() => console.log("fetch")); 64 65 // Clean snackbarTimeToHide varibale when user hover on the snackbar to prevent hide it 66 container.addEventListener('mouseover', function () { 67 if (snackbarTimeoutHide !== null) 68 clearTimeout(snackbarTimeoutHide); 69 }); 70 71 // Call setTimeout and set snackbarTimeToHide variable to hide snackbar 72 container.addEventListener('mouseout', function () { 73 if (snackbarTimeoutHide !== null) 74 snackbarTimeoutHide = setTimeout(hideSnackbar, snackbarTimeToHide / 2); 75 }); 76 } 77 78 /** 79 * Inject style css of snackbar 80 */ 81 function injectSnackbarCss() { 82 const css = `body.snackbar--show .snackbar { 83 -webkit-transform: translateY(0); 84 transform: translateY(0); 85 } 86 .snackbar { 87 box-sizing: border-box; 88 background-color: #121213; 89 color: #fff; 90 padding: 10px 55px 10px 10px; 91 position: fixed; 92 z-index: 9999999999999999; 93 left: 15px; 94 bottom: 15px; 95 border-radius: 5px 8px 8px 5px; 96 max-width: 90%; 97 min-height: 48px; 98 line-height: 28px; 99 font-size: 16px; 100 -webkit-transform: translateY(150%); 101 transform: translateY(150%); 102 will-change: transform; 103 -webkit-transition: -webkit-transform 200ms ease-in-out; 104 -webkit-transition-delay: 0s; 105 transition-delay: 0s; 106 -webkit-transition: -webkit-transform 200ms ease-in-out false; 107 transition: -webkit-transform 200ms ease-in-out false; 108 transition: transform 200ms ease-in-out false; 109 transition: transform 200ms ease-in-out false, -webkit-transform 200ms ease-in-out false; 110 } 111 .snackbar p { 112 margin: 0; 113 color: #fff; 114 text-align: center; 115 } 116 .snackbar .snackbar-close { 117 position: absolute; 118 top: 0; 119 right: 0; 120 width: 45px; 121 height: 100%; 122 padding: 0; 123 background: #2a2a2a; 124 border: none; 125 font-size: 28px; 126 font-weight: normal; 127 border-radius: 0 5px 5px 0; 128 color: #FFF; 129 font-family: Arial, Helvetica, sans-serif; 130 } 131 .snackbar .snackbar-close:hover, 132 .snackbar .snackbar-close:focus { 133 background: #3f3f3f; 134 } 135 .snackbar a { 136 color: #FFF; 137 font-weight: bold; 138 text-decoration: underline; 139 }`; 140 141 const head = document.head || document.getElementsByTagName('head')[0]; 142 const style = document.createElement('style'); 143 144 style.type = 'text/css'; 145 if (style.styleSheet) { 146 // This is required for IE8 and below. 147 style.styleSheet.cssText = css; 148 } else { 149 style.appendChild(document.createTextNode(css)); 150 } 151 152 head.appendChild(style); 153 } 154 155 /** 156 * Show the state of the mode of connectivity to the user : back onLine | go offLine 157 */ 158 function runOnlineOfflineIndicator() { 159 if (navigator.onLine) { 160 if (isOffline === true) { 161 showSnackbar(backOnlineMsg); 162 } 163 isOffline = false; 164 } else { 165 if (superpwa_sw.offline_message == 1) { 166 showSnackbar(goOfflineMsg); 167 isOffline = true; 168 } 169 } 170 } 171 172 /** 173 * Show with the given message in the snackbar 174 * @param {String} msg 175 */ 176 function showSnackbar(msg) { 177 document.getElementById('snackbar-msg').innerHTML = msg; 178 document.body.classList.add('snackbar--show'); 179 180 clearTimeout(snackbarTimeoutHide); 181 snackbarTimeoutHide = setTimeout(hideSnackbar, snackbarTimeToHide); 182 } 183 184 /** 185 * Hide snackbar 186 */ 187 function hideSnackbar() { 188 document.body.classList.remove('snackbar--show'); 189 } 190 191 /****************** End : Online/Offline Indicator ******************/ 192 193 var deferredPrompt; 194 window.addEventListener('beforeinstallprompt', function(e){
195 deferredPrompt = e; 196 if(deferredPrompt != null || deferredPrompt != undefined){ 197 if(superpwa_sw.disable_addtohome==1){ 198 deferredPrompt.preventDefault(); 199 } 200 201 var a2hsBanner = document.getElementsByClassName("superpwa-sticky-banner"); 202 if(a2hsBanner.length){ 203 deferredPrompt.preventDefault(); 204 //Disable on desktop 205 if(superpwa_sw.enableOnDesktop!=1 && !window.mobileCheck()){return ;} 206 if(typeof super_check_bar_closed_or_not == 'function' && !super_check_bar_closed_or_not()){return ;} 207 for (var i = 0; i < a2hsBanner.length; i++) { 208 var showbanner = a2hsBanner[i].getAttribute("data-show"); 209 a2hsBanner[i].style.display="flex"; 210 } 211 } 212 document.cookie = "hidecta=no"; 213 } 214 }) 215 216 window.addEventListener('appinstalled', function(evt){ 217 var a2hsBanner = document.getElementsByClassName("superpwa-sticky-banner"); 218 if(a2hsBanner.length){ 219 for (var i = 0; i < a2hsBanner.length; i++) { 220 var showbanner = a2hsBanner[i].getAttribute("data-show"); 221 document.cookie = "hidecta=yes"; 222 a2hsBanner[i].style.display="none"; 223 } 224 } 225 }); 226 227 var a2hsviaClass = document.getElementsByClassName("superpwa-add-via-class"); 228 if(a2hsviaClass !== null){ 229 for (var i = 0; i < a2hsviaClass.length; i++) { 230 a2hsviaClass[i].addEventListener("click", addToHome); 231 } 232 } 233 234 function addToHome(){ 235 if(!deferredPrompt){return ;} 236 deferredPrompt.prompt(); 237 deferredPrompt.userChoice.then(function(choiceResult) { 238 if (choiceResult.outcome === "accepted") { 239 var a2hsBanner = document.getElementsByClassName("superpwa-sticky-banner"); 240 if(a2hsBanner){ 241 for (var i = 0; i < a2hsBanner.length; i++) { 242 var showbanner = a2hsBanner[i].getAttribute("data-show"); 243 a2hsBanner[i].style.display="none"; 244 } 245 }//a2hsBanner if 246 console.log("User accepted the prompt"); 247 }else{ 248 console.log("User dismissed the prompt"); 249 } 250 deferredPrompt = null; 251 }); 252 } // function closed addToHome 253 254 255 }); 256 } 257 window.mobileCheck = function() { 258 let check = false; 259 (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check
259= true;})(navigator.userAgent||navigator.vendor||window.opera); 260 return check; 261 }; 262 263 window.addEventListener('load', function() { 264 let manifest_name = superpwa_sw.manifest_name ?? 'superpwa-manifest.json'; 265 var manifestLink = document.querySelectorAll("link[rel='manifest']"); 266 if(manifestLink.length > 1){ 267 for (var i = 0; i < manifestLink.length; i++) { 268 var href = manifestLink[i].getAttribute("href"); 269 if(href.indexOf(manifest_name) == -1){ 270 manifestLink[i].remove(); 271 } 272 } 273 } 274 // fix for href="#" in Ios safari standalone 275 var ua = window.navigator.userAgent; 276 var iOS = ua.match(/iPad/i) || ua.match(/iPhone/i); 277 var webkit = ua.match(/WebKit/i); 278 var iOSSafari = iOS && webkit && !ua.match(/CriOS/i); 279 280 if(iOSSafari && (window.matchMedia('(display-mode: standalone)').matches)){ 281 setTimeout(function(){ 282 const anchor_fix = document.querySelectorAll("a[href='#']"); 283 if(anchor_fix.length > 1){ 284 for (var i = 0; i < anchor_fix.length; i++) { 285 anchor_fix[i].setAttribute("href","javascript:void(0);"); 286 } 287 } 288 },600); 289 } 290 291 }); 292 293 document.addEventListener('DOMContentLoaded', function () { 294 if (typeof pnScriptSetting !== 'undefined' && pnScriptSetting.superpwa_apk_only !== undefined && pnScriptSetting.superpwa_apk_only == 1) { 295 const reffer = document.referrer; 296 if (reffer && reffer.includes('android-app://')) { 297 sessionStorage.setItem('superpwa_mode', 'apk'); 298 } 299 } 300 }); 301 302 303 if (superpwa_sw.offline_form_addon_active) { 304 navigator.serviceWorker.ready.then(function (registration) { 305 return registration.sync.register('superpwa_form_sendFormData') 306 }).then(function () { 307 console.log('sync event registered'); 308 }).catch(function () { 309 console.log('sync registration failed') 310 }); 311 312 313 314 function superpwa_formSubmitOptions(event) { 315 var finalData = {}; 316 var inputElements = document.querySelectorAll('input, textarea, select');/*closest('form')*/ 317 for (let elem of inputElements) { 318 if (elem.getAttribute('type') == 'radio') { 319 320 let chk_name_radio = elem.getAttribute('name'); 321 322 var parent_div = elem.closest('.frm_opt_container') 323 324 if (parent_div.getAttribute('aria-required') == 'true') { 325 326 let chk_value = parent_div.querySelectorAll('input[name=\"' + chk_name_radio + '\"]:checked'); 327 328 if (chk_value.length == 0) { 329 330 event.preventDefault(); 331 332 event.stopPropagation(); 333 334 alert('Please fill all mandatory fields'); 335 336 return; 337 } 338 } 339 } 340 341 342 if (!elem.value && ((elem.getAttribute('aria-required') == 'true' || elem.getAttribute('required')) && elem.offsetParent !== null)) { 343 event.preventDefault(); 344 event.stopPropagation(); 345 alert('Please fill all mandatory fields'); 346 return; 347 } 348 var name = elem.getAttribute('name'); 349 if (name) { 350 //name=name.replace(/[\[']/g, '_').replace(/[\]']/g, ''); 351 if (elem.getAttribute('type') == 'checkbox') { 352 if (elem.checked) { 353 finalData[name] = elem.value; 354 } 355 } else if (elem.getAttribute('type') == 'radio') { 356 if (elem.checked) { 357 finalData[name] = elem.value; 358 } 359 } else { 360 finalData[name] = elem.value; 361 } 362 } 363 } 364 365 366 if (JSON.stringify(finalData) !== '{}') { 367 var allData = { 368 'form_data': finalData, 369 'action': 'form_submit_data' 370 }; 371 /* send data in serviceWorker */ 372 navigator.serviceWorker.ready.then((registration) => { 373 registration.active.postMessage(allData); 374 event.stopPropagation(); 375 }); 376 } else { 377 event.preventDefault(); 378 event.stopPropagation(); 379 alert('Error occured during form submission, please try again'); 380 return; 381 } 382 } 383 384 function handleGravityMultistep(btn_type, event) { 385 let target_parent = event.parentNode.parentNode; 386 let go_next = false; 387 if (btn_type == 'previous') { 388 target_parent.style.display = 'none'; 389 let prev_id = target_parent.previousElementSibling.id; 390 let source_page = document.querySelector('input[name^=\"gform_source_page_number_\"]'); 391 let target_page = document.querySelector('input[name^=\"gform_target_page_number_\"]'); 392 source_page.value = parseInt(source_page.value) - 1; 393 target_page.value = parseInt(target_page.value) - 1; 394 if (prev_id) { 395 document.getElementById(prev_id).style.display = 'block'; 396 } 397 } else { 398 let inputs = target_parent.querySelectorAll('input, textarea, select'); 399 for (let elem of inputs) { 400 let req_flag = elem.getAttribute('aria-required'); 401 if (req_flag == 'true' && (elem.getAttribute('type') == 'checkbox' || elem.getAttribute('type') == 'radio')) { 402 let chk_name = elem.getAttribute('name'); 403 let chk_value = target_parent.querySelectorAll('input[name=\"' + chk_name + '\"]:checked'); 404 if (!chk_value.length) { 405 go_next = false; 406 break; 407 } else { 408 go_next = true; 409 } 410 } else { 411 if (!elem.value) { 412 go_next = false; 413 break; 414 } else { 415 go_next = true; 416 } 417 } 418 } 419 if (go_next == true) { 420 target_parent.style.display = 'none'; 421 let next_id = target_parent.nextElementSibling.id; 422 let source_page = document.querySelector('input[name^=\"gform_source_page_number_\"]'); 423 let target_page = document.querySelector('input[name^=\"gform_target_page_number_\"]'); 424 let gform_wrapper = document.querySelector('.gform_wrapper'); 425 let total_page = gform_wrapper.getAttribute('id').split('_')[2]; 426 source_page.value = parseInt(source_page.value) + 1; 427 if (target_page < total_page) { target_page.value = parseInt(target_page.value) + 1; } 428 else { target_page.value = 0; } 429 if (next_id) { 430 document.getElementById(next_id).style.display = 'block'; 431 } 432 } else { 433 alert('Please fill correct values in all mandatory fields'); 434 } 435 } 436 } 437 438 window.addEventListener('online', (e) => { updateOnlineStatus(e) }); 439 440 function updateOnlineStatus(event) { 441 setTimeout(window.location.reload(),3000); 442 } 443 window.onload = function (event) { 444 console.log('Page Load'); 445 if (!navigator.onLine) { 446 updateOfflineStatus(event); 447 superpwapro_woo_xtheme_compat(); 448 } 449 window.addEventListener('offline', (e) => { 450 updateOfflineStatus(e); 451 superpwapro_woo_xtheme_compat();
452 reRenderPage(); 453 }); 454 fallbackForIosSync(); 455 var our_db; 456 function fallbackForIosSync() { 457 var isSyncSupported = ('serviceWorker' in navigator && 'SyncManager' in window); 458 if (!isSyncSupported && navigator.onLine) { 459 var indexedDBOpenRequest = indexedDB.open('superpwaForm', 2); 460 indexedDBOpenRequest.onerror = function (error) { 461 console.error('IndexedDB error:', error) 462 } 463 indexedDBOpenRequest.onupgradeneeded = function () { 464 if (!this.result.objectStoreNames.contains('post_requests')) { 465 this.result.createObjectStore('post_requests', { autoIncrement: true, keyPath: 'id' }) 466 } 467 } 468 indexedDBOpenRequest.onsuccess = function () { 469 our_db = this.result; 470 sendPostToServerAjax(); 471 } 472 } 473 } 474 475 function reRenderPage() { 476 var condition = navigator.onLine ? 'online' : 'offline'; 477 if (condition == 'offline') { 478 var formElement = document.querySelector('form[method=\"post\"]'); 479 if (formElement && (formElement.classList.contains('frm-fluent-form') || formElement.querySelector('.frm_dropzone'))) { 480 // window.location.reload(); 481 } 482 } 483 } 484 485 function updateOfflineStatus(event) { 486 var condition = navigator.onLine ? 'online' : 'offline'; 487 if (condition == 'offline') { 488 setTimeout(() => { 489 var formElement = document.querySelectorAll('form[method=\"post\"]'); 490 if (formElement && formElement.length > 0) { 491 for (var i = 0; i < formElement.length; i++) { 492 // Fluent Form Compatibility 493 494 if (formElement[i].hasAttribute('data-form_instance') && formElement[i].classList.contains('frm-fluent-form')) { 495 var class_to_remove = formElement[i].getAttribute('data-form_instance'); 496 formElement[i].classList.remove(class_to_remove) 497 } 498 499 // Fix for Formidable form not adding data due to anti-spam javascript 500 501 if (formElement[i].hasAttribute('data-token')) { 502 const antispamInput = document.createElement('input'); 503 antispamInput.type = 'hidden'; 504 antispamInput.value = formElement[i].getAttribute('data-token'); 505 antispamInput.name = 'antispam_token'; 506 formElement[i].appendChild(antispamInput); 507 } 508 509 if (formElement[i].querySelector('button[type=\"submit\"]')) { let ourEle = formElement[i].querySelector('button[type=\"submit\"]'); ourEle.removeAttribute('onclick'); ourEle.removeAttribute('onkeypress'); ourEle.replaceWith(ourEle.cloneNode(true)); } 510 511 if (formElement[i].querySelector('button[type=\"button\"]')) { let ourEle = formElement[i].querySelector('button[type=\"button\"]'); ourEle.removeAttribute('onclick'); ourEle.removeAttribute('onkeypress'); ourEle.replaceWith(ourEle.cloneNode(true)); } 512 513 if (formElement[i].querySelector('input[type=\"submit\"]')) { let ourEle = formElement[i].querySelector('input[type=\"submit\"]'); ourEle.removeAttribute('onclick'); ourEle.removeAttribute('onkeypress'); ourEle.replaceWith(ourEle.cloneNode(true)); } 514 515 formElement[i].addEventListener('submit', superpwa_formSubmitOptions, true); 516 } 517 518 } 519 520 //For Formidable Form ajax upload field 521 var inputs = document.getElementsByTagName('input'); 522 if (inputs && inputs.length) { 523 for (var i = 0; i < inputs.length; i++) { 524 if (inputs[i].type.toLowerCase() == 'file') { 525 if (document.querySelector('.dz-error-message')) { 526 document.querySelector('.dz-error-message').remove(); 527 setTimeout( 528 function () { 529 document.querySelector('.dz-error-message').innerHTML = ''; 530 }, 531 500); 532 } 533 } 534 } 535 } 536 537 // Fix for Formidable Ajax uploads 538 539 var frm_dropzone_attrs = document.querySelectorAll('.frm_dropzone'); 540 if (frm_dropzone_attrs && frm_dropzone_attrs.length > 0) {
541 frm_dropzone_attrs.forEach(ele => { 542 var container_id = ele.id; 543 container_id = container_id.match(/\d+/); 544 const upload_input_parent = ele.closest('.frm_form_field'); 545 var upload_input = upload_input_parent.querySelector('.dz-hidden-input'); 546 if (upload_input) { 547 upload_input.setAttribute("data-containerid", container_id); 548 } 549 }); 550 } 551 552 var frm_dropzone_ele = document.querySelectorAll('.dz-hidden-input'); 553 if (frm_dropzone_ele && frm_dropzone_ele.length > 0) { 554 frm_dropzone_ele.forEach(ele => { 555 ele.addEventListener('change', (function (e) { 556 if (e.target.files[0] || e.target) { 557 var formElement = document.querySelector('form[method="post"]'); 558 var field_id = e.target.getAttribute("data-containerid"); 559 var field_id_label = 'file' + field_id; 560 var object1 = {}; 561 object1['action'] = 'frm_submit_dropzone'; 562 object1['field_id'] = field_id; 563 object1['form_id'] = document.querySelector('[name="form_id"]').value; 564 object1['nonce'] = frm_js.nonce; 565 object1['antispam_token'] = formElement.getAttribute('data-token'); 566 object1[field_id_label] = e.target.files[0]; 567 saveAddlAjaxSubmits(frm_js.ajax_url, object1); 568 } 569 })); 570 }); 571 } 572 573 574 575 // For Gravity Form multistep form 576 let gform_next_buttons = document.querySelectorAll('.gform_next_button'); 577 let gform_previous_button = document.querySelectorAll('.gform_previous_button'); 578 if (gform_next_buttons.length > 0) { 579 gform_next_buttons.forEach(button => { 580 button.setAttribute('onclick', 'handleGravityMultistep("next",this)'); 581 button.setAttribute('onkeypress', 'handleGravityMultistep("next",this)'); 582 button.setAttribute('type', 'button'); 583 }); 584 } 585 if (gform_previous_button.length > 0) { 586 gform_previous_button.forEach(button => { 587 button.setAttribute('onclick', 'handleGravityMultistep(\"previous\",this)'); 588 button.setAttribute('onkeypress', 'handleGravityMultistep(\"previous\",this)'); 589 button.setAttribute('type', 'button'); 590 }); 591 } 592 }, 500); 593 } 594 } 595 596 function sendPostToServerAjax() { 597 var savedRequests = []; 598 var objStore = getObjectStore('ajax_requests'); 599 if (!!objStore) { 600 var req = getObjectStore('ajax_requests').openCursor() // FOLDERNAME is 'ajax_requests' 601 req.onsuccess = async function (event) { 602 var cursor = event.target.result 603 if (cursor) { 604 // Keep moving the cursor forward and collecting saved requests. 605 savedRequests.push(cursor.value) 606 cursor.continue() 607 } else { 608 if (savedRequests && savedRequests.length) { 609 for (let savedRequest of savedRequests) { 610 var formData = new FormData(); 611 for (const [key, value] of Object.entries(savedRequest.payload)) { 612 formData.append(key, value); 613 } 614 var requestUrl = savedRequest.url 615 var payload = JSON.stringify(savedRequest.payload) 616 var method = savedRequest.method 617 /*request to forms*/ 618 var headers = { 619 'Accept': 'application/json, text/javascript, */*; q=0.01', 620 } // if you have any other headers put them here 621 fetch(superpwa_sw.ajax_url+'?action=superpwa_form_store_send', { 622 headers: headers, 623 method: method, 624 body: formData 625 }).then(function (response) { 626 if (response.status < 400) { 627 // If sending the POST request was successful, then remove it from the IndexedDB. 628 getObjectStore('ajax_requests', 'readwrite').delete(savedRequest.id); 629 return response.json(); 630 } 631 return false; 632 }).then(function (response) { 633 if (response) { 634 sendPostToServer([response[0], savedRequest.payload.field_id]); 635 console.log('Form Submitted with ajax fields : success'); 636 } else { 637 sendPostToServer(); 638 console.log('Form Submitted without ajax fields : ajax fields present but their saving failed to db'); 639 } 640 }); 641 } 642 } else { 643 sendPostToServer(); 644 console.log('Form Submitted without ajax fields : no values present in ajax_requests object'); 645 } 646 } 647 } 648 req.onerror = function (error) { 649 sendPostToServer(); 650 } 651 } else { 652 sendPostToServer(); 653 } 654 } 655 656 function sendPostToServer(ajax_params = null) { 657 var savedRequests = []; 658 var objStore = getObjectStore('post_requests'); 659 if (!!objStore) { 660 var req = getObjectStore('post_requests').openCursor(); 661 req.onsuccess = async function (event) { 662 var cursor = event.target.result; 663 if (cursor) { 664 // Keep moving the cursor forward and collecting saved requests. 665 savedRequests.push(cursor.value); 666 cursor.continue(); 667 } else { 668 // Process each saved request. 669 for (let savedRequest of savedRequests) { 670 var formData = new FormData(); 671 for (const [key, value] of Object.entries(savedRequest.payload)) { 672 formData.append(key, value); 673 } 674 if (ajax_params && ajax_params.length && ajax_params[0]) { 675 formData.set('item_meta[' + ajax_params[1] + ']', ajax_params[0]); 676 } 677 var requestUrl = savedRequest.url; 678 var method = savedRequest.method; 679 /* Request to admin-ajax.php */ 680 var headers = { 681 'Accept': 'application/json, text/javascript, */*; q=0.01', 682 // Add any other headers here if needed 683 };
684 try { 685 const response = await fetch(requestUrl, { 686 headers: headers, 687 method: method, 688 body: formData 689 }); 690 console.log('server response', response); 691 if (response.status < 400) { 692 // If sending the POST request was successful, then remove it from the IndexedDB. 693 try { 694 var forDataSave = {}; 695 formData.forEach(function (value, key) { 696 forDataSave[key] = value; 697 }); 698 var forDataSaveJson = JSON.stringify(forDataSave); 699 const response = await fetch(superpwa_sw.ajax_url+'?action=superpwa_form_store_send', { 700 headers: headers, 701 method: method, 702 body: forDataSaveJson, 703 }); 704 console.log('saved request', savedRequest); 705 if (response.status < 400) { 706 // If successful, remove the request from IndexedDB. 707 await getObjectStore('post_requests', 'readwrite').delete(savedRequest.id); 708 } 709 } catch (error) { 710 console.error('Send to Server failed:', error); 711 throw error; 712 } 713 } else { 714 console.error('Server responded with an error:', response.status); 715 // Handle the error as needed 716 } 717 } catch (error) { 718 console.error('Send to Server failed:', error); 719 // Handle the error as needed 720 throw error; // Rethrow the error if necessary 721 } 722 } 723 } 724 }; 725 } 726 } 727 728 function getObjectStore(storeName, mode) { 729 if (!our_db) { return null; } 730 // retrieve our object store 731 return our_db.transaction(storeName, mode).objectStore(storeName) 732 } 733 734 function saveAddlAjaxSubmits(submit_url, obj) { 735 /*send data in serviceWorker*/ 736 var indexedDBOpenRequest = indexedDB.open('superpwaForm', 2); 737 indexedDBOpenRequest.onerror = (event) => { 738 console.error('a post form request has been not added to IndexedDB'); 739 }; 740 indexedDBOpenRequest.onupgradeneeded = (event) => { 741 const db = event.target.result; 742 if (!db.objectStoreNames.contains('ajax_requests')) { 743 db.createObjectStore('ajax_requests', { autoIncrement: true, keyPath: 'id' }); 744 } 745 } 746 indexedDBOpenRequest.onsuccess = (event) => { 747 const db = event.target.result; 748 var request = db.transaction('ajax_requests', 'readwrite').objectStore('ajax_requests').add({ 749 url: submit_url, 750 payload: obj, 751 method: 'POST' 752 }) 753 request.onsuccess = function (event) { 754 console.log('a post form request has been added to indexedb') 755 } 756 request.onerror = function (error) { 757 console.error(error) 758 } 759 } 760 } 761 762 function superpwapro_woo_xtheme_compat(){ 763 if(document.querySelector('.add_to_cart_button')){ 764 document.addEventListener("click", function (event) { 765 if (event.target.closest(".add_to_cart_button")) { 766 event.preventDefault(); 767 event.stopPropagation(); 768 const button = event.target.closest(".add_to_cart_button"); 769 const parentele = button.parentNode; 770 const qty_wrapper = parentele.querySelector(".quantity-wrapper"); 771 const qty = qty_wrapper.querySelector(".qty"); 772 qty.value = 1; 773 if(qty_wrapper){ 774 qty_wrapper.classList.add('is-added'); 775 } 776 777 const addToCartUrl = location.href+'?wc-ajax=add_to_cart'; 778 var object_payload = {}; 779 object_payload['product_name'] = button.getAttribute("data-product_name"); 780 object_payload['success_message'] = button.getAttribute("data-success_message"); 781 object_payload['product_sku'] = button.getAttribute("data-product_sku"); 782 object_payload['product_id'] = button.getAttribute("data-product_id"); 783 object_payload['quantity'] = 1; 784 saveAddlAjaxSubmits(addToCartUrl, object_payload); 785 786 } 787 }); 788 }else{ 789 console.log('add_to_cart_button not found'); 790 } 791 792 if(document.querySelector('.quantity-wrapper .minus')){ 793 document.addEventListener('click', function (event) { 794 if (event.target.closest('.quantity-wrapper .minus')) { 795 event.preventDefault(); 796 event.stopPropagation(); 797 798 const minus = event.target.closest('.quantity-wrapper .minus'); 799 const minus_parent = minus.parentNode.parentNode.parentNode;
800 const button = minus_parent.querySelector('.add_to_cart_button'); 801 const qty_wrapper = minus_parent.querySelector('.quantity-wrapper'); 802 const qty_input = minus_parent.querySelector('.quantity-wrapper .qty'); 803 const product_id = button.getAttribute('data-product_id'); 804 805 //qty_input.value = qty_input.value < 2 ? 0 : parseInt(qty_input.value) - 1; 806 807 if(qty_input.value == 0){ 808 qty_wrapper.classList.remove('is-added'); 809 } 810 setTimeout( 811 function () { 812 qty_wrapper.querySelectorAll('.blockUI').forEach(el => el.remove()); 813 }, 814 5000); 815 816 const addToCartUrl = '/wp-admin/admin-ajax.php'; 817 var object_payload = {}; 818 object_payload['action'] = 'etheme_update_cart_item_quantity_by_id'; 819 object_payload['item_id'] = product_id; 820 object_payload['qty'] = qty_input.value; 821 saveAddlAjaxSubmits(addToCartUrl, object_payload); 822 823 } 824 }); 825 826 } 827 828 if(document.querySelector('.quantity-wrapper .plus')){ 829 document.addEventListener('click', function (event) { 830 if (event.target.closest('.quantity-wrapper .plus')) { 831 event.preventDefault(); 832 event.stopPropagation(); 833 834 const plus = event.target.closest('.quantity-wrapper .plus'); 835 836 const plus_parent =plus.parentNode.parentNode.parentNode; 837 const button = plus_parent.querySelector('.add_to_cart_button'); 838 const qty_wrapper = plus_parent.querySelector('.quantity-wrapper'); 839 const qty_input = plus_parent.querySelector('.quantity-wrapper .qty'); 840 const product_id = button.getAttribute('data-product_id'); 841 842 //qty_input.value = parseInt(qty_input.value) + 1; 843 844 setTimeout( 845 function () { 846 qty_wrapper.querySelectorAll('.blockUI').forEach(el => el.remove()); 847 }, 848 5000); 849 qty_wrapper.classList.add('is-added'); 850 851 const addToCartUrl = '/wp-admin/admin-ajax.php'; 852 var object_payload = {}; 853 object_payload['action'] = 'etheme_update_cart_item_quantity_by_id'; 854 object_payload['item_id'] = product_id; 855 object_payload['qty'] = qty_input.value; 856 857 saveAddlAjaxSubmits(addToCartUrl, object_payload); 858 859 } 860 }); 861 } 862 } 863 864 865 } 866 867 868 } 869
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.