mod-build 3.6.77 → 3.6.79-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/package.json +1 -1
  3. package/src/scripts/mod-form-contractor.js +66 -26
  4. package/src/templates/_partials/apt-block.html +0 -30
  5. package/src/templates/_partials/scripts/analytics.html +0 -4
  6. package/src/templates/_partials/scripts/deferred-styles.html +0 -16
  7. package/src/templates/_partials/scripts/go-page-hiding-snippet.html +0 -8
  8. package/src/templates/_partials/scripts/google-maps.html +0 -1
  9. package/src/templates/_partials/scripts/google-optimize.html +0 -12
  10. package/src/templates/_partials/scripts/gtm-editorials/body/google-tag-manager-body.html +0 -5
  11. package/src/templates/_partials/scripts/gtm-editorials/head/google-tag-manager-head.html +0 -10
  12. package/src/templates/_partials/scripts/gtm-hil/body/google-tag-manager-body.html +0 -5
  13. package/src/templates/_partials/scripts/gtm-hil/head/google-tag-manager-head.html +0 -10
  14. package/src/templates/_partials/scripts/gtm-pro/body/google-tag-manager-body.html +0 -5
  15. package/src/templates/_partials/scripts/gtm-pro/head/google-tag-manager-head.html +0 -10
  16. package/src/templates/_partials/scripts/gtm-quote/body/google-tag-manager-body.html +0 -5
  17. package/src/templates/_partials/scripts/gtm-quote/head/google-tag-manager-head.html +0 -9
  18. package/src/templates/_partials/scripts/gtm-whitelabel/body/mod-google-tag-manager-body.html +0 -5
  19. package/src/templates/_partials/scripts/gtm-whitelabel/body/non-mod-google-tag-manager-body.html +0 -5
  20. package/src/templates/_partials/scripts/gtm-whitelabel/head/mod-google-tag-manager-head.html +0 -10
  21. package/src/templates/_partials/scripts/gtm-whitelabel/head/non-mod-google-tag-manager-head.html +0 -9
  22. package/src/templates/_partials/scripts/gtm-wordpress/body/google-tag-manager-body.html +0 -5
  23. package/src/templates/_partials/scripts/gtm-wordpress/head/google-tag-manager-head.html +0 -9
  24. package/src/templates/_partials/scripts/heap-bundle.html +0 -7
  25. package/src/templates/_partials/scripts/heap.html +0 -4
  26. package/src/templates/_partials/scripts/utm-params.html +0 -9
  27. package/src/templates/_partials/scripts/visual-website-optimizer.html +0 -5
  28. package/src/templates/_partials/scripts/vwo-redirect-callback.html +0 -49
  29. package/src/templates/components/qs-footer.html +0 -55
  30. package/src/templates/components/quote-footer-v1.html +0 -148
  31. package/src/templates/components/quote-footer-v2.html +0 -169
  32. package/src/templates/index.html +0 -46
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.6.78
4
+
5
+ - Add functions to validate a contractor lead matches MQL criteria
6
+ - TY messages logic updates to match the new MQL criteria
7
+
3
8
  ## 3.6.76
4
9
 
5
10
  - Add EIN field to data for Mod endpoint
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mod-build",
3
- "version": "3.6.77",
3
+ "version": "3.6.79-beta.1",
4
4
  "description": "Share components for S3 sites.",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -295,22 +295,6 @@ modForm.submitContractorFormDataToApi = function(formData, successCallback, erro
295
295
  }
296
296
  };
297
297
 
298
- /**
299
- * Check if the submitted info qualifies as small business to show corresponding thank you block
300
- * @returns {Boolean} - true if small business
301
- */
302
- modForm.isSmallBusiness = function() {
303
- var $annualRevenue = this.opts.form.find('[name="annualRevenue"]').val(),
304
- smbRevenueAnswers = ['Under $250,000', 'I\'m a Sales Rep'],
305
- isSmallBus = false;
306
-
307
- if (smbRevenueAnswers.indexOf($annualRevenue) > -1) {
308
- isSmallBus = true;
309
- }
310
-
311
- return isSmallBus;
312
- };
313
-
314
298
  /**
315
299
  * Process data to the new API required format
316
300
  * @param {Object} formData - form data
@@ -325,6 +309,7 @@ modForm.formatContractorDataForModApi = function(formData, currentStep) {
325
309
  lastName: formData.lastName,
326
310
  primaryProjectClass: formData.primaryProjectClass,
327
311
  multipleTrades: formData.multipleTrades ? 1 : 0,
312
+ contractorNetwork: formData.contractorNetwork ? 1 : 0,
328
313
  companyName: formData.companyName,
329
314
  phone: formData.homePhone,
330
315
  email: formData.email,
@@ -356,6 +341,7 @@ modForm.formatContractorDataForModApi = function(formData, currentStep) {
356
341
  annualRevenue: formData.annualRevenue,
357
342
  buysLeads: formData.buysLeads,
358
343
  crmInUse: formData.crmInUse,
344
+ ein: formData.ein,
359
345
  whoCallsLeads: formData.whoCallsLeads,
360
346
  ein: formData.ein,
361
347
  websiteUrl: formData.websiteUrl,
@@ -413,6 +399,57 @@ modForm.initResubmitBtn = function() {
413
399
  });
414
400
  };
415
401
 
402
+ modForm.isSmallBusiness = function(annualRevenue) {
403
+ const smbRevenueAnswers = ['I\'m a sales rep', '$0 - $500K', '$500K - $1M'];
404
+ if (!annualRevenue) {
405
+ console.error('No annual revenue provided');
406
+ return false;
407
+ }
408
+
409
+ return smbRevenueAnswers.indexOf(annualRevenue) > -1;
410
+ }
411
+
412
+ /**
413
+ * Email
414
+ * @param {String} email - email address to validate
415
+ * @returns {Boolean} isFreeEmail
416
+ */
417
+ modForm.isFreeEmail = function(email) {
418
+ let isFreeEmail = false;
419
+ const freeDomains = ['gmail', 'hotmail', 'msn', 'aol', 'yahoo', 'ymail', 'comcast', 'icloud'];
420
+
421
+ if (email) {
422
+ const emailAddress = email.toLowerCase();
423
+ isFreeEmail = freeDomains.some(domain => emailAddress.includes(domain));
424
+ }
425
+
426
+ return isFreeEmail;
427
+ }
428
+
429
+ /**
430
+ * Check if data meets criteria to match with CXP
431
+ * @returns {Boolean} - true if meets CXP criteria
432
+ */
433
+ modForm.isSupportedByCxp = function(formData) {
434
+ if (formData.primaryProjectClass === 'Solar') {
435
+ return false;
436
+ }
437
+
438
+ return true;
439
+ };
440
+
441
+ /**
442
+ * Check if the submitted info meets the criteria of a Marketing Qualified Lead (MQL, a lead who is more likely to become a customer than other leads)
443
+ * @returns {Boolean} - true if meets MQL Criteria
444
+ */
445
+ modForm.meetsMQLCriteria = function(formData) {
446
+ if (this.isFreeEmail(formData.email) && formData.websiteUrl === '') {
447
+ return false;
448
+ }
449
+
450
+ return true;
451
+ };
452
+
416
453
  /**
417
454
  * Process form after succesful submit
418
455
  * @param {Object} response - response data
@@ -482,8 +519,9 @@ modForm.processContractorFormSubmitSuccess = function(response, currentStep, xhr
482
519
 
483
520
  // Thankyou blocks logic
484
521
  var $tyStateBlocks = _this.opts.form.find('.ty-state-block'),
485
- $otherTyp = _this.opts.form.find('.ty-state-block-other'),
486
- $sbssTyp = _this.opts.form.find('.ty-state-block-sbss'),
522
+ $cxpTyp = _this.opts.form.find('.ty-state-block-cxp'),
523
+ $noserviceTyp = _this.opts.form.find('.ty-state-block-noservice'),
524
+ $generalTyp = _this.opts.form.find('.ty-state-block-success'),
487
525
  $generalTyp = _this.opts.form.find('.ty-state-block-success'),
488
526
  $primaryProjectClass = _this.opts.form.find('select[name="primaryProjectClass"]'),
489
527
  tyStateGAName;
@@ -494,16 +532,18 @@ modForm.processContractorFormSubmitSuccess = function(response, currentStep, xhr
494
532
  // Check what type of TY page to show
495
533
  $tyStateBlocks.hide();
496
534
 
497
- if ($primaryProjectClass.val() === 'Other') {
498
- tyStateGAName = 'thankyou-other';
499
- $otherTyp.show();
500
- _this.initResubmitBtn();
501
- } else if (_this.isSmallBusiness()) { // if is small business
502
- tyStateGAName = 'thankyou-smallbusiness';
503
- $sbssTyp.show();
504
- } else {
535
+ const meetsModCriteria = _this.meetsMQLCriteria(_this.getFormData());
536
+ const meetsCxpCriteria = _this.isSupportedByCxp(_this.getFormData());
537
+
538
+ if (meetsModCriteria) {
505
539
  tyStateGAName = 'thankyou';
506
540
  $generalTyp.show();
541
+ } else if (meetsCxpCriteria) {
542
+ tyStateGAName = 'thankyou-cxp';
543
+ $cxpTyp.show();
544
+ } else {
545
+ tyStateGAName = 'thankyou-noservice';
546
+ $noserviceTyp.show();
507
547
  }
508
548
 
509
549
  // Track TY page in GA
@@ -1,30 +0,0 @@
1
- <div class="apt-block apt-block--instant" id="instant-apt-block" style="display: none">
2
- <div class="apt-block__suptitle">
3
- Next steps
4
- </div>
5
- <h2 class="apt-block__title">
6
- Set Appointments
7
- </h2>
8
- <div class="apt-block__subtitle">
9
- Request up to four appointments with contractors to receive free&nbsp;quotes.
10
- </div>
11
-
12
- <div class="apt-block__instant-matches" id="apt-block-instant-matches"> </div>
13
- </div>
14
-
15
- <div class="apt-block" id="apt-block" style="display: none">
16
- <h2 class="apt-block__title" id="apt-block-title">
17
- Loading matches...
18
- </h2>
19
-
20
- <div class="apt-block__matches" id="apt-block-matches"> </div>
21
-
22
- <div class="apt-block__loading" id="apt-block-loading">
23
- <span class="apt-block__spinner"></span>
24
- Searching for matches&hellip;
25
- </div>
26
- </div>
27
-
28
- <script>
29
- var aptBlockTCPA = '{{#x 'this.tcpa("Schedule", "Modernize")'}}{{/x}}';
30
- </script>
@@ -1,4 +0,0 @@
1
- <script>
2
- {{ fileInclude 'node_modules/mod-build/src/scripts/has-qs-params.js' }}
3
- {{ fileInclude 'node_modules/mod-build/src/scripts/url-cleaner.js' }}
4
- </script>
@@ -1,16 +0,0 @@
1
- <noscript id="deferred-styles">
2
- {{{deferredStyles deferredStyleUrls}}}
3
- </noscript>
4
- <script>
5
- var loadDeferredStyles = function() {
6
- var addStylesNode = document.getElementById("deferred-styles");
7
- var replacement = document.createElement("div");
8
- replacement.innerHTML = addStylesNode.textContent;
9
- document.body.appendChild(replacement)
10
- addStylesNode.parentElement.removeChild(addStylesNode);
11
- };
12
- var raf = requestAnimationFrame || mozRequestAnimationFrame ||
13
- webkitRequestAnimationFrame || msRequestAnimationFrame;
14
- if (raf) raf(function() { window.setTimeout(loadDeferredStyles, 0); });
15
- else window.addEventListener('load', loadDeferredStyles);
16
- </script>
@@ -1,8 +0,0 @@
1
- <!-- Google Optimize Page-hiding snippet -->
2
- <style>.async-hide { opacity: 0 !important} </style>
3
- <script>(function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date;
4
- h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')};
5
- (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c;
6
- })(window,document.documentElement,'async-hide','dataLayer',4000,
7
- {'{{optimize_GTM}}':true});</script>
8
- <!-- End Google Optimize Page-hiding snippet -->
@@ -1 +0,0 @@
1
- <script src="//maps.googleapis.com/maps/api/js?key=AIzaSyBf4HNrR12KgZeMNsdoNIjD57pwVUsZ6e4&language=en&libraries=places&callback=modForm.initAddressAutocomplete" async defer></script>
@@ -1,12 +0,0 @@
1
- <!-- Google Optimize -->
2
- <script>
3
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
4
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
5
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
6
- })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
7
-
8
- ga('create', '{{ga_tracking_ID}}', 'auto');
9
- ga('require', '{{optimize_GTM}}');
10
- </script>
11
- <!-- End Google Optimize -->
12
-
@@ -1,5 +0,0 @@
1
- <!-- Google Tag Manager (noscript) -->
2
- <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WPXKC8"
3
- height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
4
- <!-- End Google Tag Manager (noscript) -->
5
-
@@ -1,10 +0,0 @@
1
- <!-- Google Tag Manager -->
2
- <script>
3
- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
4
- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
5
- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6
- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
7
- })(window,document,'script','dataLayer','GTM-WPXKC8');
8
- </script>
9
- <!-- End Google Tag Manager -->
10
-
@@ -1,5 +0,0 @@
1
- <!-- Google Tag Manager (noscript) -->
2
- <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TDM5ZF6"
3
- height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
4
- <!-- End Google Tag Manager (noscript) -->
5
-
@@ -1,10 +0,0 @@
1
- <!-- Google Tag Manager -->
2
- <script>
3
- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
4
- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
5
- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6
- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
7
- })(window,document,'script','dataLayer','GTM-TDM5ZF6');
8
- </script>
9
- <!-- End Google Tag Manager -->
10
-
@@ -1,5 +0,0 @@
1
- <!-- Google Tag Manager (noscript) -->
2
- <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WPXKC8"
3
- height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
4
- <!-- End Google Tag Manager (noscript) -->
5
-
@@ -1,10 +0,0 @@
1
- <!-- Google Tag Manager -->
2
- <script>
3
- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
4
- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
5
- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6
- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
7
- })(window,document,'script','dataLayer','GTM-WPXKC8');
8
- </script>
9
- <!-- End Google Tag Manager -->
10
-
@@ -1,5 +0,0 @@
1
- <!-- Google Tag Manager (noscript) -->
2
- <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NVJQBK2"
3
- height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
4
- <!-- End Google Tag Manager (noscript) -->
5
-
@@ -1,9 +0,0 @@
1
- <!-- Google Tag Manager -->
2
- <script>
3
- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
4
- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
5
- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6
- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
7
- })(window,document,'script','dataLayer','GTM-NVJQBK2');
8
- </script>
9
- <!-- End Google Tag Manager -->
@@ -1,5 +0,0 @@
1
- <!-- Google Tag Manager (noscript) -->
2
- <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TJ8BFVQ"
3
- height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
4
- <!-- End Google Tag Manager (noscript) -->
5
-
@@ -1,5 +0,0 @@
1
- <!-- Google Tag Manager (noscript) -->
2
- <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TBC2FVC"
3
- height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
4
- <!-- End Google Tag Manager (noscript) -->
5
-
@@ -1,10 +0,0 @@
1
- <!-- Google Tag Manager -->
2
- <script>
3
- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
4
- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
5
- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6
- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
7
- })(window,document,'script','dataLayer','GTM-TJ8BFVQ');
8
- </script>
9
- <!-- End Google Tag Manager -->
10
-
@@ -1,9 +0,0 @@
1
- <!-- Google Tag Manager -->
2
- <script>
3
- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
4
- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
5
- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6
- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
7
- })(window,document,'script','dataLayer','GTM-TBC2FVC');
8
- </script>
9
- <!-- End Google Tag Manager -->
@@ -1,5 +0,0 @@
1
- <!-- Google Tag Manager (noscript) -->
2
- <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WPXKC8"
3
- height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
4
- <!-- End Google Tag Manager (noscript) -->
5
-
@@ -1,9 +0,0 @@
1
- <!-- Google Tag Manager -->
2
- <script>
3
- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
4
- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
5
- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6
- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
7
- })(window,document,'script','dataLayer','GTM-WPXKC8');
8
- </script>
9
- <!-- End Google Tag Manager -->
@@ -1,7 +0,0 @@
1
- <script>
2
- {{ fileInclude 'node_modules/mod-build/src/scripts/vendor/heap-tracking.js' }}
3
-
4
- {{ fileInclude 'node_modules/mod-build/src/scripts/vendor/heap-vwo.js' }}
5
-
6
- {{ fileInclude 'node_modules/mod-build/src/scripts/vendor/heap-addeventproperties-identify.js' }}
7
- </script>
@@ -1,4 +0,0 @@
1
- <script>
2
- window.heap=window.heap||[],heap.load=function(e,t){window.heap.appid=e,window.heap.config=t=t||{};var r=t.forceSSL||"https:"===document.location.protocol,a=document.createElement("script");a.type="text/javascript",a.async=!0,a.src=(r?"https:":"http:")+"//cdn.heapanalytics.com/js/heap-"+e+".js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(a,n);for(var o=function(e){return function(){heap.push([e].concat(Array.prototype.slice.call(arguments,0)))}},p=["addEventProperties","addUserProperties","clearEventProperties","identify","removeEventProperty","setEventProperties","track","unsetEventProperty"],c=0;c<p.length;c++)heap[p[c]]=o(p[c])};
3
- heap.load("3246578271");
4
- </script>
@@ -1,9 +0,0 @@
1
- <script type="text/javascript">
2
- (function () {
3
- var $networkLink = document.getElementById('join-network');
4
- var pageTrade = ($networkLink.getAttribute('data-trade') ? $networkLink.getAttribute('data-trade').toLowerCase() : "");
5
- var siteUrl = window.location.hostname + window.location.pathname;
6
-
7
- $networkLink.href = 'https://modernize.com/pro/register/leads/?trade=' + pageTrade + '&utm_medium=microsites&utm_source=' + siteUrl;
8
- })();
9
- </script>
@@ -1,5 +0,0 @@
1
- <!-- Start Visual Website Optimizer Asynchronous Code -->
2
- <script>
3
- {{ fileInclude 'node_modules/mod-build/src/scripts/vendor/visual-website-optimizer.js' }}
4
- </script>
5
- <!-- End Visual Website Optimizer Asynchronous Code -->
@@ -1,49 +0,0 @@
1
- <script>
2
- {{ fileInclude 'node_modules/mod-build/src/scripts/has-qs-params.js' }}
3
- {{ fileInclude 'node_modules/mod-build/src/scripts/url-cleaner.js' }}
4
- {{ fileInclude 'node_modules/mod-build/src/scripts/vendor/visual-website-optimizer.js' }}
5
-
6
- (function(VWO_HARD_TIMEOUT) {
7
- window._vwo_evq = window._vwo_evq || [];
8
- var queue = window._vwo_evq;
9
- for (var i = 0; i < queue.length; i++) {
10
- if (queue[i][0] === 'rD') {
11
- window.willRedirectionOccur = true;
12
- break;
13
- }
14
- }
15
- var _vwoOldPush = window._vwo_evq.push;
16
- window._vwo_evq.push = function() {
17
- var eventData = arguments[0],
18
- willRedirectionOccur;
19
- if (eventData[0] === 'rD') {
20
- willRedirectionOccur = eventData[1];
21
- // It will be set to true if a redirection is going to be done by VWO.
22
- window.willRedirectionOccurByVWO = willRedirectionOccur;
23
- }
24
- _vwoOldPush.apply(window._vwo_evq, [].slice.call(arguments));
25
- };
26
- var hardLimitTimedout = false;
27
-
28
- function tryNonVWOTracking() {
29
- if ((window._vwo_code && (window._vwo_code.finished() || window._vwo_code.libExecuted)) || hardLimitTimedout) {
30
- if (!window.willRedirectionOccurByVWO) {
31
- clearTimeout(hardLimitTimer);
32
- try {
33
- // flag to call Modalytics.initHeapVwo() method in site level js
34
- window.initHeapVwo = true;
35
- } catch (e) {}
36
- return;
37
- }
38
- }
39
- setTimeout(function() {
40
- tryNonVWOTracking()
41
- }, 500)
42
- }
43
-
44
- var hardLimitTimer = setTimeout(function() {
45
- hardLimitTimedout = true;
46
- }, VWO_HARD_TIMEOUT);
47
- tryNonVWOTracking();
48
- })(5000 /*MAXIMUM TIME IN SECONDS IN WHICH CODE WILL EXECUTE ANYWAY*/ );
49
- </script>
@@ -1,55 +0,0 @@
1
- <footer class="footer">
2
- <div class="container">
3
- <div class="footer__head-link">
4
- {{qsFooterData.contractor.text}}
5
- <a target="_blank" href="{{qsFooterData.contractor.link}}" rel="noopener noreferrer">
6
- {{qsFooterData.contractor.linkText}}
7
- </a>
8
- </div>
9
- <ul class="footer__links">
10
- {{#each qsFooterData.links}}
11
- <li>
12
- <a
13
- {{#xif "!this.modal" }}
14
- href="{{this.url}}"
15
- target="_blank"
16
- rel="noopener noreferrer"
17
- {{/xif}}
18
- {{#xif "this.modal" }}
19
- data-bind="modal-link"
20
- data-load="/modals{{this.url}}index.html"
21
- {{/xif}}
22
- >
23
- {{{this.name}}}{{#xif 'this.company === true'}}{{#if ../this.companyName}}&nbsp;{{{../this.companyName}}}{{/if}}{{/xif}}
24
- </a>
25
- </li>
26
- {{/each}}
27
- <!--
28
- - Define the customFooterLinks array of objects in template.js / siteconfig.js
29
- - e.g customFooterLinks: [{name: 'Test Link', url: '/test/', modal: true}]
30
- -->
31
- {{#if this.customFooterLinks}}
32
- {{#each this.customFooterLinks}}
33
- <li>
34
- <a
35
- {{#xif "!this.modal" }}
36
- href="{{this.url}}"
37
- target="_blank"
38
- rel="noopener noreferrer"
39
- {{/xif}}
40
- {{#xif "this.modal" }}
41
- data-bind="modal-link"
42
- data-load="/modals{{this.url}}index.html"
43
- {{/xif}}
44
- >
45
- {{{this.name}}}
46
- </a>
47
- </li>
48
- {{/each}}
49
- {{/if}}
50
- </ul>
51
- <p class="footer__copyright">
52
- Copyright &copy; {{year}} {{qsFooterData.copyright}}
53
- </p>
54
- </div>
55
- </footer>
@@ -1,148 +0,0 @@
1
- <div class="footer">
2
- <div class="container">
3
- {{#xif "this.hideBbb !== true" }}
4
- <img src="{{assetsPath}}/images/logos/misc/bbb.svg" alt="BBB Accredited Logo" class="footer__bbb-logo footer__bbb">
5
- {{/xif}}
6
- <div class="footer__links contractor-link">
7
- {{quoteFooterData.contractor.text}}
8
- <a target="_blank" href="{{quoteFooterData.contractor.link}}" rel="noopener noreferrer">
9
- {{quoteFooterData.contractor.linkText}}
10
- </a>
11
- </div>
12
- <div class="footer__content">
13
- {{#xif 'this.copyright === "top"'}}
14
- <div class="footer__copyright">
15
- &copy; Copyright {{year}} {{website_name}}.
16
- {{{quoteFooterData.copyright}}}
17
- <div class="footer__captcha-disclosure">
18
- {{quoteFooterData.capchaDisclosure.text}}
19
- <a href="{{quoteFooterData.capchaDisclosure.privacy.url}}" target="_blank">{{quoteFooterData.capchaDisclosure.privacy.text}}</a> and
20
- <a href="{{quoteFooterData.capchaDisclosure.terms.url}}" target="_blank">{{{quoteFooterData.capchaDisclosure.terms.text}}}</a>&nbsp;apply.
21
- </div>
22
- </div>
23
- {{/xif}}
24
- {{#xif "this.privacylinks === 'top'"}}
25
- <div class="footer__links">
26
- {{#each quoteFooterData.privacyLinks}}
27
- <a
28
- {{#xif "this.modal === true" }}
29
- href="{{../links.privacy}}"
30
- data-load="{{#if ../this.variation}}/modals/privacy/index.html{{else}}./modals/privacy/index.html{{/if}}"
31
- data-bind="modal-link"
32
- data-anchor="#{{this.anchor}}"
33
- {{/xif}}
34
- {{#xif "this.modal === false" }}
35
- href="{{this.anchor}}"
36
- target="_blank"
37
- rel="noopener noreferrer"
38
- {{/xif}}
39
- >{{{this.text}}}</a>
40
- {{/each}}
41
- <!--
42
- - Define the customPrivacyLinks array of objects in template.js / siteconfig.js
43
- - e.g customPrivacyLinks: [{ text: 'This is a custom link', anchor: 'ccpa' }]
44
- -->
45
- {{#if this.customPrivacyLinks}}
46
- {{#each this.customPrivacyLinks}}
47
- <a
48
- {{#xif "this.modal === true" }}
49
- href="{{../links.privacy}}"
50
- data-load="{{#if ../this.variation}}/modals/privacy/index.html{{else}}./modals/privacy/index.html{{/if}}"
51
- data-bind="modal-link"
52
- data-anchor="#{{this.anchor}}"
53
- {{/xif}}
54
- {{#xif "this.modal === false" }}
55
- href="{{this.anchor}}"
56
- target="_blank"
57
- rel="noopener noreferrer"
58
- {{/xif}}
59
- >{{{this.text}}}</a>
60
- {{/each}}
61
- {{/if}}
62
- </div>
63
- {{/xif}}
64
- {{#xif 'this.copyright === "middle"'}}
65
- <div class="footer__copyright">
66
- &copy; Copyright {{year}} {{website_name}}.
67
- {{{quoteFooterData.copyright}}}
68
- <div class="footer__captcha-disclosure">
69
- {{quoteFooterData.capchaDisclosure.text}}
70
- <a href="{{quoteFooterData.capchaDisclosure.privacy.url}}" target="_blank">{{quoteFooterData.capchaDisclosure.privacy.text}}</a> and
71
- <a href="{{quoteFooterData.capchaDisclosure.terms.url}}" target="_blank">{{{quoteFooterData.capchaDisclosure.terms.text}}}</a>&nbsp;apply.
72
- </div>
73
- </div>
74
- {{/xif}}
75
-
76
- <div class="footer__links">
77
- {{#each quoteFooterData.links}}
78
- <a href="{{#if this.modal}}/{{this.url}}{{else}}{{this.url}}{{/if}}" {{#xif "this.modal === true" }}
79
- data-load="{{#if ../this.variation}}/modals/{{this.url}}/index.html{{else}}./modals/{{this.url}}/index.html{{/if}}" data-bind="modal-link"{{/xif}} {{#if this.target}}target="{{this.target}}" {{#xif "this.target === '_blank'"}} rel="noopener noreferrer"{{/xif}} {{/if}}>
80
- {{{this.text}}}
81
- </a>
82
- {{/each}}
83
- <!--
84
- - Define the customFooterLinks array of objects in template.js / siteconfig.js
85
- - e.g customFooterLinks: [{url: '/test', text: 'Test Link'}]
86
- -->
87
- {{#if this.customFooterLinks}}
88
- {{#each this.customFooterLinks}}
89
- <a href="{{#if this.modal}}/{{this.url}}{{else}}{{this.url}}{{/if}}" {{#xif "this.modal === true" }}data-load="{{#if ../this.variation}}/modals/{{this.url}}/index.html{{else}}./modals/{{this.url}}/index.html{{/if}}" data-bind="modal-link"{{/xif}} {{#if this.target}}target="{{this.target}}" {{#xif "this.target === '_blank'"}} rel="noopener noreferrer"{{/xif}}{{/if}}>{{{this.text}}}</a>
90
- {{/each}}
91
- {{/if}}
92
- </div>
93
-
94
- {{#xif "this.privacylinks === 'bottom'"}}
95
- <div class="footer__links">
96
- {{#each quoteFooterData.privacyLinks}}
97
- <a
98
- {{#xif "this.modal === true" }}
99
- href="{{../links.privacy}}"
100
- data-load="{{#if ../this.variation}}/modals/privacy/index.html{{else}}./modals/privacy/index.html{{/if}}"
101
- data-bind="modal-link"
102
- data-anchor="#{{this.anchor}}"
103
- {{/xif}}
104
- {{#xif "this.modal === false" }}
105
- href="{{this.anchor}}"
106
- target="_blank"
107
- rel="noopener noreferrer"
108
- {{/xif}}
109
- >{{{this.text}}}</a>
110
- {{/each}}
111
- <!--
112
- - Define the customPrivacyLinks array of objects in template.js / siteconfig.js
113
- - e.g customPrivacyLinks: [{ text: 'This is a custom link', anchor: 'ccpa' }]
114
- -->
115
- {{#if this.customPrivacyLinks}}
116
- {{#each this.customPrivacyLinks}}
117
- <a
118
- {{#xif "this.modal === true" }}
119
- href="{{../links.privacy}}"
120
- data-load="{{#if ../this.variation}}/modals/privacy/index.html{{else}}./modals/privacy/index.html{{/if}}"
121
- data-bind="modal-link"
122
- data-anchor="#{{this.anchor}}"
123
- {{/xif}}
124
- {{#xif "this.modal === false" }}
125
- href="{{this.anchor}}"
126
- target="_blank"
127
- rel="noopener noreferrer"
128
- {{/xif}}
129
- >{{{this.text}}}</a>
130
- {{/each}}
131
- {{/if}}
132
- </div>
133
- {{/xif}}
134
-
135
- {{#xif 'this.copyright === "bottom"'}}
136
- <div class="footer__copyright">
137
- &copy; Copyright {{year}} {{website_name}}.
138
- {{{quoteFooterData.copyright}}}
139
- <div class="footer__captcha-disclosure">
140
- {{quoteFooterData.capchaDisclosure.text}}
141
- <a href="{{quoteFooterData.capchaDisclosure.privacy.url}}" target="_blank">{{quoteFooterData.capchaDisclosure.privacy.text}}</a> and
142
- <a href="{{quoteFooterData.capchaDisclosure.terms.url}}" target="_blank">{{{quoteFooterData.capchaDisclosure.terms.text}}}</a>&nbsp;apply.
143
- </div>
144
- </div>
145
- {{/xif}}
146
- </div>
147
- </div>
148
- </div>
@@ -1,169 +0,0 @@
1
- <div class="footer container">
2
- {{#xif "this.hideBbb !== true" }}
3
- <img src="{{assetsPath}}/images/logos/misc/bbb.svg" alt="BBB Accredited Logo" class="footer__bbb-logo footer__bbb">
4
- {{/xif}}
5
- <div class="footer__links contractor-link">
6
- {{quoteFooterData.contractor.text}}
7
- <a target="_blank" href="{{quoteFooterData.contractor.link}}" rel="noopener noreferrer">
8
- {{quoteFooterData.contractor.linkText}}
9
- </a>
10
- </div>
11
- {{#xif 'this.copyright === "top"'}}
12
- <div class="footer__row">
13
- <div class="footer__copyright">
14
- &copy; Copyright {{year}} {{company_name}}. {{{quoteFooterData.copyright}}}
15
- </div>
16
- <div class="footer__captcha-disclosure">
17
- {{quoteFooterData.capchaDisclosure.text}}
18
- <a href="{{quoteFooterData.capchaDisclosure.privacy.url}}" target="_blank">{{quoteFooterData.capchaDisclosure.privacy.text}}</a> and
19
- <a href="{{quoteFooterData.capchaDisclosure.terms.url}}" target="_blank">{{{quoteFooterData.capchaDisclosure.terms.text}}}</a>&nbsp;apply.
20
- </div>
21
- </div>
22
- {{/xif}}
23
- {{#xif "this.privacylinks === 'top'"}}
24
- <div class="footer__row">
25
- <ul class="footer__links">
26
- {{#each quoteFooterData.privacyLinks}}
27
- <li>
28
- <a
29
- {{#xif "this.modal === true" }}
30
- href="{{../links.privacy}}"
31
- data-load="{{#if ../this.variation}}/modals/privacy/index.html{{else}}./modals/privacy/index.html{{/if}}"
32
- data-bind="modal-link"
33
- data-anchor="#{{this.anchor}}"
34
- {{/xif}}
35
- {{#xif "this.modal === false" }}
36
- href="{{this.anchor}}"
37
- target="_blank"
38
- rel="noopener noreferrer"
39
- {{/xif}}
40
- >
41
- {{{this.text}}}
42
- </a>
43
- </li>
44
- {{/each}}
45
- <!--
46
- - Define the customPrivacyLinks array of objects in template.js / siteconfig.js
47
- - e.g customPrivacyLinks: [{ text: 'This is a custom link', anchor: 'ccpa' }]
48
- -->
49
- {{#if this.customPrivacyLinks}}
50
- {{#each this.customPrivacyLinks}}
51
- <li>
52
- <a
53
- {{#xif "this.modal === true" }}
54
- href="{{../links.privacy}}"
55
- data-load="{{#if ../this.variation}}/modals/privacy/index.html{{else}}./modals/privacy/index.html{{/if}}"
56
- data-bind="modal-link"
57
- data-anchor="#{{this.anchor}}"
58
- {{/xif}}
59
- {{#xif "this.modal === false" }}
60
- href="{{this.anchor}}"
61
- target="_blank"
62
- rel="noopener noreferrer"
63
- {{/xif}}
64
- >
65
- {{{this.text}}}
66
- </a>
67
- </li>
68
- {{/each}}
69
- {{/if}}
70
- </ul>
71
- </div>
72
- {{/xif}}
73
- <div class="footer__row">
74
- <ul class="footer__links">
75
- {{#each quoteFooterData.links}}
76
- <li>
77
- <a href="{{#if this.modal}}/{{this.url}}{{else}}{{this.url}}{{/if}}" {{#xif "this.modal === true" }}
78
- data-load="{{#if ../this.variation}}/modals/{{this.url}}/index.html{{else}}./modals/{{this.url}}/index.html{{/if}}" data-bind="modal-link"{{/xif}} {{#if this.target}}target="{{this.target}}"{{#xif "this.target === '_blank'"}} rel="noopener noreferrer"{{/xif}}{{/if}}>{{{this.text}}}</a>
79
- </li>
80
- {{/each}}
81
- <!--
82
- - Define the customFooterLinks array of objects in template.js / siteconfig.js
83
- - e.g customFooterLinks: [{url: 'test', text: 'Test Link'}]
84
- -->
85
- {{#if this.customFooterLinks}}
86
- {{#each this.customFooterLinks}}
87
- <li>
88
- <a href="{{#if this.modal}}/{{this.url}}{{else}}{{this.url}}{{/if}}" {{#xif "this.modal === true" }}
89
- data-load="{{#if ../this.variation}}/modals/{{this.url}}/index.html{{else}}./modals/{{this.url}}/index.html{{/if}}" data-bind="modal-link"{{/xif}} {{#if this.target}}target="{{this.target}}"{{#xif "this.target === '_blank'"}} rel="noopener noreferrer"{{/xif}}{{/if}}>{{{this.text}}}</a>
90
- </li>
91
- {{/each}}
92
- {{/if}}
93
- </ul>
94
- </div>
95
- {{#xif 'this.copyright === "middle"'}}
96
- <div class="footer__row">
97
- <div class="footer__copyright">
98
- &copy; Copyright {{year}} {{company_name}}. {{{quoteFooterData.copyright}}}
99
- </div>
100
- <div class="footer__captcha-disclosure">
101
- {{quoteFooterData.capchaDisclosure.text}}
102
- <a href="{{quoteFooterData.capchaDisclosure.privacy.url}}" target="_blank">{{quoteFooterData.capchaDisclosure.privacy.text}}</a> and
103
- <a href="{{quoteFooterData.capchaDisclosure.terms.url}}" target="_blank">{{{quoteFooterData.capchaDisclosure.terms.text}}}</a>&nbsp;apply.
104
- </div>
105
- </div>
106
- {{/xif}}
107
- {{#xif "this.privacylinks === 'bottom'"}}
108
- <div class="footer__row">
109
- <ul class="footer__links">
110
- {{#each quoteFooterData.privacyLinks}}
111
- <li>
112
- <a
113
- {{#xif "this.modal === true" }}
114
- href="{{../links.privacy}}"
115
- data-load="{{#if ../this.variation}}/modals/privacy/index.html{{else}}./modals/privacy/index.html{{/if}}"
116
- data-bind="modal-link"
117
- data-anchor="#{{this.anchor}}"
118
- {{/xif}}
119
- {{#xif "this.modal === false" }}
120
- href="{{this.anchor}}"
121
- target="_blank"
122
- rel="noopener noreferrer"
123
- {{/xif}}
124
- >
125
- {{{this.text}}}
126
- </a>
127
- </li>
128
- {{/each}}
129
- <!--
130
- - Define the customPrivacyLinks array of objects in template.js / siteconfig.js
131
- - e.g customPrivacyLinks: [{ text: 'This is a custom link', anchor: 'ccpa' }]
132
- -->
133
- {{#if this.customPrivacyLinks}}
134
- {{#each this.customPrivacyLinks}}
135
- <li>
136
- <a
137
- {{#xif "this.modal === true" }}
138
- href="{{../links.privacy}}"
139
- data-load="{{#if ../this.variation}}/modals/privacy/index.html{{else}}./modals/privacy/index.html{{/if}}"
140
- data-bind="modal-link"
141
- data-anchor="#{{this.anchor}}"
142
- {{/xif}}
143
- {{#xif "this.modal === false" }}
144
- href="{{this.anchor}}"
145
- target="_blank"
146
- rel="noopener noreferrer"
147
- {{/xif}}
148
- >
149
- {{{this.text}}}
150
- </a>
151
- </li>
152
- {{/each}}
153
- {{/if}}
154
- </ul>
155
- </div>
156
- {{/xif}}
157
- {{#xif 'this.copyright === "bottom"'}}
158
- <div class="footer__row">
159
- <div class="footer__copyright">
160
- &copy; Copyright {{year}} {{company_name}}. {{{quoteFooterData.copyright}}}
161
- </div>
162
- <div class="footer__captcha-disclosure">
163
- {{quoteFooterData.capchaDisclosure.text}}
164
- <a href="{{quoteFooterData.capchaDisclosure.privacy.url}}" target="_blank">{{quoteFooterData.capchaDisclosure.privacy.text}}</a> and
165
- <a href="{{quoteFooterData.capchaDisclosure.terms.url}}" target="_blank">{{{quoteFooterData.capchaDisclosure.terms.text}}}</a>&nbsp;apply.
166
- </div>
167
- </div>
168
- {{/xif}}
169
- </div>
@@ -1,46 +0,0 @@
1
- <!DOCTYPE html>
2
-
3
- <head lang="en">
4
- <script>
5
- </script>
6
-
7
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
8
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
- <meta name="viewport" content="initial-scale=1.0, width=device-width" />
10
- <title>modSite</title>
11
-
12
- <link href="/styles/home.css" rel="stylesheet" type="text/css" />
13
- </head>
14
-
15
- <body>
16
- <h1>
17
- It works!
18
- </h1>
19
-
20
- <form id="form" class="form" novalidate="novalidate">
21
- <div id="step1" class="step step--active" data-bind="step">
22
- <input type="tel" name="zip" placeholder="Zip" maxlength="5" />
23
- </div>
24
- </form>
25
-
26
- <!-- build:js /scripts/vendor/jquery.js -->
27
- <script src="/node_modules/jquery/dist/jquery.js"></script>
28
- <!-- endbuild -->
29
-
30
- <!-- build:js /scripts/vendor/jquery.mask.min.js -->
31
- <script src="/node_modules/jquery-mask-plugin/dist/jquery.mask.min.js"></script>
32
- <!-- endbuild -->
33
-
34
- <script src="/scripts/mod-utils.js"></script>
35
-
36
- <script src="/scripts/mod-form.js"></script>
37
-
38
- <script src="/scripts/compiled/home.js"></script>
39
-
40
- <!-- build:js(src) /scripts/es6.js -->
41
- <script src="/scripts/es6-1.js"></script>
42
- <script src="/scripts/es6-2.js"></script>
43
- <!-- endbuild -->
44
- </body>
45
-
46
- </html>