<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="https://cdn.revcent.com/img/securehost/favicon.png">
  <title>Secure Checkout</title>
  <meta name="description" content="" />
  

  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/bootstrap-4/bootstrap.min.css" type="text/css" />
  <link rel="stylesheet" href="https://cdn.revcent.com/css/revcent.css" type="text/css" />
  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/sweetalert/sweetalert.css" type="text/css" />
  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/bootstrap-select-4/bootstrap-select.min.css" type="text/css" />

  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/fontawesome-5/css/all.css">
  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/fontawesome-5/css/v4-shims.css"><style>
    .hidden {
        display: none;
    }

    .table-responsive {
        margin-top: 0px;
        border: 0px;
        padding-top: 0px;
    }

    .wrapper {
        padding: 0px;
    }

    .item-product-quantity-input {
        max-width: 60px;
        min-width: 30px;
        text-align: center;
        margin-left: auto;
        margin-right: auto;
    }

    .item-product-name-span {
        font-weight: 600;
    }

    .item-grand-total-tr {
        margin-bottom: 10px;
    }

    @media (max-width: 768px) {
        .checkout-form-items-tbody .col-xs-12 {
            text-align: left;
        }

        div.item-product-price-td,
        div.item-product-price-thead-td {
            display: none;
        }

        .item-product-quantity-input-no-table {
            max-width: 70px;
            text-align: center;
            margin-left: 0;
            margin-right: 0;
        }
    }

    div.dataTables_wrapper div.dataTables_paginate {
        float: right;
    }

    div.dataTables_wrapper div.dataTables_info {
        float: left;
        color: #777777;
        padding-top: 0px;
    }

    .customer-account-card-right .customer-account-card-email-wrap {
        text-align: center;
    }

    span.customer-account-card-email {
        font-size: 12px;
    }

    @media (min-width: 1600px) {
        .customer-account-card-top {
            display: none;
        }

        .customer-account-card-right {
            max-width: 240px;



            margin-top: 15px;


            z-index: 99999;
            position: fixed;
            right: 1%;
        }

        .customer-account-card-right .customer-account-view-account-btn-wrap {
            margin: 10px 0px;
        }

        .customer-account-card-right .customer-account-create-account-btn-wrap {
            margin: 10px 0px;
        }
    }

    @media (max-width: 1599px) {
        .customer-account-card-right {
            display: none;
        }
    }

    @media (max-width: 576px) {
        .customer-account-create-account-btn-wrap {
            margin: 10px 0px;
        }

        .customer-account-view-account-btn-wrap {
            margin: 10px 0px;
        }
    }
</style>


<style>
    * { box-sizing: border-box; } body {margin: 0;}*{box-sizing:border-box;}body{margin:0;}.shopping-cart .content{box-shadow:0px 2px 10px rgba(0, 0, 0, 0.075);background-color:white;}.shopping-cart .block-heading{padding-top:50px;margin-bottom:40px;text-align:center;}.shopping-cart .block-heading p{text-align:center;max-width:420px;margin:auto;opacity:0.7;}.shopping-cart .dark .block-heading p{opacity:0.8;}.shopping-cart .block-heading h1, .shopping-cart .block-heading h2, .shopping-cart .block-heading h3{margin-bottom:1.2rem;color:#3b99e0;}.shopping-cart .items{margin:auto;}.shopping-cart .items .product{margin-bottom:20px;padding-top:20px;padding-bottom:20px;}.shopping-cart .items .product .info{padding-top:0px;text-align:center;}.shopping-cart .items .product .info .product-name{font-weight:600;}.shopping-cart .items .product .info .product-name .product-info{font-size:14px;margin-top:15px;}.shopping-cart .items .product .info .product-name .product-info .value{font-weight:400;}.shopping-cart .items .product .info .quantity .quantity-input{margin:auto;width:80px;}.shopping-cart .items .product .info .price{margin-top:15px;font-weight:bold;font-size:22px;}.shopping-cart .summary{border-top:2px solid #5ea4f3;background-color:#f7fbff;height:100%;padding:30px;}.shopping-cart .summary h3{text-align:center;font-size:1.3em;font-weight:600;padding-top:20px;padding-bottom:20px;}.shopping-cart .summary .summary-item:not(:last-of-type){padding-bottom:10px;padding-top:10px;border-bottom:1px solid rgba(0, 0, 0, 0.1);}.shopping-cart .summary .text{font-size:1em;font-weight:600;}.shopping-cart .summary .price{font-size:1em;float:right;}.shopping-cart .summary button{margin-top:20px;}.container{font-family:Source Sans Pro, Helvetica, sans-serif;}.col.col-sm-6{padding:30px 30px 30px 30px;}.btn.btn-primary.btn-lg.btn-block{font-family:Montserrat, Helvetica, sans-serif;color:#ffffff;}.col-md-3.price{top:0;bottom:0;margin:0 0 0 0;position:static;}.btn.btn-primary.btn-block.btn-lg.text-white{font-family:Source Sans Pro, Helvetica, sans-serif;}.product-price-display{font-size:14px;font-family:Source Sans Pro, Helvetica, sans-serif;font-weight:400;margin:5px 0 0 0;width:20%;text-align:right;}.product-name-display{font-family:Source Sans Pro, Helvetica, sans-serif;position:static;margin:5px 0 0 0;font-size:14px;font-weight:400;width:60%;}.form-control.quantity-input.product-quantity-input.form-control-sm{margin:0 29.4375px 0 29.4375px;position:static;padding:4px 10px 4px 10px;text-align:center;width:20%;}.summary-item.summary-total-wrap{top:0;padding:10px 0 0 0;}.mb-4{margin:10px 0 10px 0;line-height:20px;margin-bottom:10px !important;}.list-group-item.d-flex.justify-content-between{font-weight:300;}.text-success{font-weight:300;font-family:Source Sans Pro, Helvetica, sans-serif;}.list-group-item:last-child{margin-bottom:-1px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;border-top-right-radius:0px;border-top-left-radius:0px;}.collapse{margin:0 0 0 0;}.col-md-7.order-md-1{margin:10px 0 0 0;}.paypal-button-container{top:10px;margin-top:10px;}.paypal-smart-button-row{margin-top:10px;}#main-container-header-h1{margin-bottom:0px;color:black;}#iavip{margin-top:10px;font-weight:400;}#ismk18{margin-top:20px;font-weight:400;}#iyscc{font-weight:400;}#il49{font-weight:400;}#main-container-header-row{padding-top:20px;text-align:center;padding-bottom:20px;background-color:#ffffff;}#main-forms-row-container{padding-left:10px;padding-right:10px;}#iyb1z8{color:black;}body{background-color:#f3eeee;}.fa-2x.fa.fa-cc-paypal{color:#000000;}.fa-2x.fa.fa-cc-amex{color:#000000;font-size:50px;}.fa-2x.fa.fa-cc-discover{color:black;font-size:50px;}.fa-2x.fa.fa-cc-mastercard{color:black;font-size:50px;}.fa-2x.fa.fa-cc-visa{color:black;font-size:50px;}.btn.btn-primary.btn-block.btn-lg.text-white.hosted-page-submission-btn{background-color:#209627;}.py-5{background-color:#ffffff;}#ip2le3{font-size:25px;color:#000000;}@media (max-width: 992px){.form-control.quantity-input.product-quantity-input.form-control-sm{text-align:center;}}@media (min-width: 768px){.shopping-cart .items .product .info{padding-top:25px;text-align:left;}.shopping-cart .items .product .info .price{font-weight:bold;font-size:22px;top:17px;}.shopping-cart .items .product .info .quantity{text-align:center;}.shopping-cart .items .product .info .quantity .quantity-input{padding:4px 10px;text-align:center;}}@media (max-width: 480px){.form-control.quantity-input.product-quantity-input.form-control-sm{text-align:center;}}@media (min-width: 480px){#main-container{box-shadow:0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);transition:all 0.3s cubic-bezier(.25,.8,.25,1);border-radius:4px;margin-top:20px;margin-bottom:20px;}#main-container-header-row{border:1px solid #d7faff;border-top-right-radius:4px;border-top-left-radius:4px;}}
</style>
<style>
    body.white-bg {
        background-color: #ffffff;
    }
</style>


<link rel="stylesheet" href="https://cdn.revcent.com/css/cart.css">


</head>

<body class="white-bg">


    <div class="wrapper wrapper-content hosted-page-wrapper hidden" id="hosted-page-wrapper" data-isprint="false" data-adwordsclick="" data-visitid="1RoMEpLY77TN8kwyQ2Rq" data-pageid="O08o1k1RaYFR44zV0jv8" data-submissiontype="sale" data-displaytype="page" data-paypalaccountid="" data-trackid="" data-entryid="" data-endpointcustomeraccountenabled="false" data-customeremail="" data-islogged="false" data-iscustomer="" data-accountcreateurl="" data-accountloginurl="" data-accountoverviewurl="">



        <div id="hosted-page-html-wrap">
            <div id="main-container" class="container"><div id="main-container-header-row" class="row"><img src="https://userimg.revcent.com/LYwQRE9j7OcaK7WBVdkz.png" id="iyb1z8" /><div class="col"><h1 id="main-container-header-h1">Secure Checkout
	  </h1></div></div><a href="https://septicdefender.com" id="ip2le3">&lt;&lt; Return to Shop</a><div id="main-forms-row-container" class="row py-5"><div class="col-md-5 order-md-2 mb-4"><h3 id="il49" class="d-flex justify-content-between align-items-center mb-3"><span id="icru">Your cart</span><span class="badge badge-secondary badge-pill product-count">0</span></h3><ul class="list-group mb-3"><span data-appendtype="li" class="items"><li class="list-group-item d-flex justify-content-between lh-condensed product-item-li"><span class="product-name-display">Name</span><input type="number" value="0" class="form-control quantity-input product-quantity-input form-control-sm" /><span class="product-price-display">0</span></li></span><li class="list-group-item d-flex justify-content-between summary-item summary-subtotal-wrap"><span>Subtotal</span><span class="summary-subtotal">0</span></li><li class="list-group-item d-flex justify-content-between summary-item bg-light summary-discount-wrap"><span class="text-success">Discount</span><span class="text-success summary-discount-total">0</span></li><li class="list-group-item d-flex justify-content-between summary-item summary-shipping-wrap"><span>Shipping</span><span class="summary-shipping-total">0</span></li><li class="list-group-item d-flex justify-content-between summary-item summary-tax-wrap"><span>Tax</span><span class="summary-tax-total">0</span></li><li class="list-group-item d-flex justify-content-between summary-item"><span>Total</span><span class="summary-final-total">0</span></li></ul><div class="payment-methods"><p class="pt-4 mb-2">Payment Options
		</p><hr /><ul class="list-inline d-flex"><li class="mx-1 text-info"><i class="fa-2x fa fa-cc-visa">
			</i></li><li class="mx-1 text-info"><i class="fa-2x fa fa-cc-mastercard">
			</i></li><li class="mx-1 text-info"><i class="fa-2x fa fa-cc-discover">
			</i></li><li class="mx-1 text-info"><i class="fa-2x fa fa-cc-amex">
			</i></li><li class="mx-1 text-info"></li></ul></div></div><div class="col-md-7 order-md-1 form-content-col"><h3 id="iyscc" class="mb-3">Bill To
	  </h3><form class="revcent-bill-to-form"><div class="row"><div class="col-md-6 mb-3"><label for="bill-to-first-name">First name</label><input type="text" placeholder="First Name" value required name="bill-to-first-name" class="form-control" /><div class="invalid-feedback">
			  Valid first name is required.
			</div></div><div class="col-md-6 mb-3"><label for="bill-to-last-name">Last name</label><input type="text" placeholder="Last Name" value required name="bill-to-last-name" class="form-control" /><div class="invalid-feedback">
			  Valid last name is required.
			</div></div></div><div class="mb-3"><label for="bill-to-address-line-1">Address Line 1</label><input type="text" placeholder="Address LIne 1" name="bill-to-address-line-1" class="form-control" /></div><div class="mb-3"><label for="bill-to-address-line-2">Address Line 2</label><input type="text" placeholder="Address Line 2" name="bill-to-address-line-2" class="form-control" /></div><div class="mb-3"><label for="bill-to-city">City</label><input type="text" placeholder="City" name="bill-to-city" class="form-control" /></div><div class="row"><div class="mb-3 col-sm-5"><label for="bill-to-state">State</label><input type="text" placeholder="State" name="bill-to-state" class="form-control" /></div><div class="mb-3 col-sm-4"><label for="bill-to-zip">Postal Code</label><input type="text" placeholder="Postal Code" name="bill-to-zip" required class="form-control" /></div><div class="col-md-3 mb-3"><label for="bill-to-country">Country</label><input type="text" placeholder="Country" name="bill-to-country" class="form-control" /></div></div><div class="mb-3"><label for="bill-to-email">Email</label><input type="email" placeholder="Email" name="bill-to-email" class="form-control" /></div><div class="mb-3"><label for="bill-to-phone">Phone</label><input type="text" placeholder="Phone" name="bill-to-phone" class="form-control" /></div><hr class="mb-4" /><div class="custom-control custom-checkbox"><input type="checkbox" role="button" data-target=".ship-to-collapse" data-toggle="collapse" class="form-check-input" /><label class="form-check-label">Ship to different address</label></div></form><div class="collapse ship-to-collapse"><h3 id="iavip" class="mb-3">Ship To
		</h3><form class="revcent-ship-to-form"><div class="row"><div class="col-md-6 mb-3"><label for="ship-to-first-name">First name</label><input type="text" placeholder="First Name" value name="ship-to-first-name" class="form-control" /></div><div class="col-md-6 mb-3"><label for="ship-to-last-name">Last name</label><input type="text" placeholder="Last Name" value name="ship-to-last-name" class="form-control" /></div></div><div class="mb-3"><label for="ship-to-address-line-1">Address Line 1</label><input type="text" placeholder="Address Line 1" name="ship-to-address-line-1" class="form-control" /></div><div class="mb-3"><label for="ship-to-address-line-2">Address Line 2</label><input type="text" placeholder="Address Line 2" name="ship-to-address-line-2" class="form-control" /></div><div class="mb-3"><label for="ship-to-city">City</label><input type="text" placeholder="City" name="ship-to-city" class="form-control" /></div><div class="row"><div class="mb-3 col-sm-5"><label for="ship-to-state">State</label><input type="text" placeholder="State" name="ship-to-state" class="form-control" /></div><div class="mb-3 col-sm-4"><label for="ship-to-zip">Postal Code</label><input type="text" placeholder="Postal Code" name="ship-to-zip" class="form-control" /></div><div class="col-md-3 mb-3"><label for="ship-to-country">Country</label><input type="text" placeholder="Country" name="ship-to-country" class="form-control" /></div></div><div class="mb-3"><label for="ship-to-email">Email</label><input type="email" placeholder="Email" name="ship-to-email" class="form-control" /></div><div class="mb-3"><label for="ship-to-phone">Phone</label><input type="text" placeholder="Phone" name="ship-to-phone" class="form-control" /></div></form></div><hr class="mb-4" /><h3 id="ismk18" class="mb-3">Payment Method
	  </h3><div class="d-block my-3"><div class="custom-control custom-radio"><input type="radio" id="payment-method-radio-credit" value="credit_card" name="payment-method-radio" checked class="custom-control-input" /><label for="payment-method-radio-credit" class="custom-control-label">Secure Credit Card</label></div></div><div id="payment-tabs" class="tab-content"><div id="credit-card-tab" class="tab-pane active"><form class="revcent-credit-card-form"><div class="row"><div class="col-sm-12"><div class="form-group"><label>Card Number</label><input type="text" name="card-number" placeholder="Card Number" value required class="form-control" /></div></div><div class="col-sm-4"><div class="form-group"><label>Exp Month</label><select name="expiry-month" class="form-control"> <option>Month</option> <option value="01">01</option><option value="02">02</option><option value="03">03</option><option value="04">04</option><option value="05">05</option><option value="06">06</option><option value="07">07</option><option value="08">08</option><option value="09">09</option><option value="10">10</option><option value="11">11</option><option value="12">12</option></select></div></div><div class="col-sm-4"><div class="form-group"><label>Exp Year</label><select name="expiry-year" class="form-control"> <option>Year</option> <option value="19">2019</option><option value="20">2020</option><option value="21">2021</option><option value="22">2022</option><option value="23">2023</option><option value="24">2024</option><option value="25">2025</option><option value="26">2026</option><option value="27">2027</option><option value="28">2028</option><option value="29">2029</option><option value="30">2030</option><option value="31">2031</option><option value="32">2032</option><option value="33">2033</option></select></div></div><div class="col-sm-4"><div class="form-group"><label>Code</label><input type="text" name="cvv" placeholder="Card CVV" value required class="form-control" /></div></div></div></form><div id="i38skg" class="row"><div class="col"><a role="button" class="btn btn-primary btn-block btn-lg text-white hosted-page-submission-btn">Pay Now</a></div></div></div><div id="paypal-tab" class="tab-pane"><div id="i8g9oe" class="row paypal-smart-button-row"><div class="col paypal-smart-button-col"><div class="paypal-button-container"><a role="button" href="#" class="btn btn-default btn-block btn-lg">PayPal Smart Payments Button</a></div></div></div></div></div></div></div></div>
        </div>
        <textarea style="display:none" class="hidden" name="checkout-request" id="checkout-request" rows="3">{"request":{"campaign":"pgYwjz6oVaFGEL88Wwow","product":[{"id":"JN4o8RKrq2Fm44jWBKA5","quantity":1}],"unique_request_id":"cart_1ianq8lvciai44"}}</textarea>


        <div id="sale-account-sign-up-modal" class="modal fade">

        </div>




        <div id="customer-account-cart-modal" data-backdrop="false" class="modal fade">
            <div class="modal-dialog ">
                <div class="modal-content">
                    <span><button type="button" data-dismiss="modal" class="close"> <span><i class="fad fa-times-circle"></i></span> </button></span>
                    <div id="customer-account-cart-modal-wrapper" class="modal-body">

                    </div>
                </div>
            </div>
        </div>




    </div>
    <script src="https://cdn.revcent.com/js/jquery.min.js"></script>


    
    <script src="https://cdn.revcent.com/js/plugins/bootstrap-4/bootstrap.bundle.min.js"></script>
    
    <script src="https://cdn.revcent.com/js/plugins/validation/jquery.validate.min.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/validation/additional-methods.min.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/bootstrap-select-4/bootstrap-select.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/moment/moment.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/moment/moment-timezone.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/sweetalert/sweetalert.min.js"></script>

    <script>
      $(document).ready(function() {
        
        $(function() {
          $('[data-toggle="popover"]').popover()
        })
        $(function() {
          $('[data-toggle="tooltip"]').tooltip()
        })
      });
    </script>



    <script>
      var hosted_page_id = 'O08o1k1RaYFR44zV0jv8';
      var hosted_page_wrapper = 'hosted-page-wrapper';
      var hosted_page_html_wrap = 'hosted-page-html-wrap';
      var hosted_page_actions = {"code_1":{"redirect":{"url":"https://septicdefender.com/thank-you-for-ordering/","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"true","include_iframe_parameters":"true"},"action":"redirect","html":""},"code_2":{"redirect":{"url":"","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"true","include_iframe_parameters":"true"},"action":"nothing","html":""},"code_3":{"redirect":{"url":"","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"true","include_iframe_parameters":"true"},"action":"nothing","html":""},"code_0":{"redirect":{"url":"","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"true","include_iframe_parameters":"true"},"action":"nothing","html":""}};
      var hosted_page_submission_type = 'sale';

      var $jscomp = $jscomp || {};
      $jscomp.scope = {};
      $jscomp.arrayIteratorImpl = function (b) {
        var a = 0;
        return function () {
          return a < b.length ? {
            done: !1,
            value: b[a++]
          } : {
            done: !0
          };
        };
      };
      $jscomp.arrayIterator = function (b) {
        return {
          next: $jscomp.arrayIteratorImpl(b)
        };
      };
      $jscomp.makeIterator = function (b) {
        var a = "undefined" != typeof Symbol && Symbol.iterator && b[Symbol.iterator];
        return a ? a.call(b) : $jscomp.arrayIterator(b);
      };
      $jscomp.arrayFromIterator = function (b) {
        for (var a, f = []; !(a = b.next()).done;) {
          f.push(a.value);
        }
        return f;
      };
      $jscomp.arrayFromIterable = function (b) {
        return b instanceof Array ? b : $jscomp.arrayFromIterator($jscomp.makeIterator(b));
      };

      function processRevCentResponse(b) {
        function a() {
          document.getElementById(hosted_page_wrapper).scrollIntoView();
        }
        var submission_btn = document.querySelectorAll('.hosted-page-submission-btn');
        

        function toggleSubmissionBtn(show) {
          if (typeof submission_btn !== 'undefined') {
            if (show === false) {
              submission_btn.forEach(a => a.classList.add('disabled'));
            }else{
              submission_btn.forEach(a => a.classList.remove('disabled'));
            }
          }
        }

        function f(a, c) {
          function f(a) {
            var b = [];
            a = new URL(a);
            a = new URLSearchParams(a.search);
            a = $jscomp.makeIterator(a);
            for (var d = a.next(); !d.done; d = a.next()) {
              d = d.value, "" !== d[0] && "" !== d[1] && b.push(m(d[0] + "=" + d[1]));
            }
            return b;
          }

          function m(a) {
            var b = "";
            null !== a && "undefined" !== typeof a && (a = a.split("="), 2 === a.length && "" !== a[0] && "undefined" !== typeof a[0] && "" !== a[1] && "undefined" !== typeof a[1] && (b = encodeURIComponent(a[0]) + "=" + encodeURIComponent(a[1])));
            return b;
          }
          var h = a.url.split("?")[0],
            g = [];
          if ("" !== a.fixed_parameters) {
            for (var k = a.fixed_parameters.split(","), e = 0; e < k.length; e++) {
              g.push(m(k[e]));
            }
          }
          if ("" !== a.dynamic_parameters) {
            for (k = a.dynamic_parameters.replace(/\{\{(.+?)\}\}/g, function (a, c) {
                return b[c] || "";
              }).split(","), e = 0; e < k.length; e++) {
              var l = k[e].split("=");
              2 === l.length && "undefined" !== typeof l[0] && "" !== l[0] && "undefined" !== typeof l[1] && "" !== l[1] && g.push(m(k[e]));
            }
          }
          "true" === a.include_parent_parameters && g.push.apply(g, $jscomp.arrayFromIterable(f(window.location.href)));
          h = h + "?" + g.join("&");
          c(null, h);
        }
        var n = document.getElementById(hosted_page_html_wrap);
        var swal_header = '';
        var swal_type = '';
        var swal_message = '';

        if ("code" in b && null !== b.code && "" !== b.code) {
          var c = b.code;
          if ("code_" + c in hosted_page_actions) {
            if (c !== 1) {
              toggleSubmissionBtn(true)
            }
            if ("redirect" === hosted_page_actions["code_" + c].action) {
              "redirect" in hosted_page_actions["code_" + c] && "url" in hosted_page_actions["code_" + c].redirect ? f(hosted_page_actions["code_" + c].redirect, function (b, c) {
                b ? a() : (n.style.display = "none", window.location.href = c);
              }) : a();
            } else if ("html" === hosted_page_actions["code_" + c].action) {
              n.style.display = "none";
              var h = document.createElement("div");
              h.id = "REVCENT_RESULT_HTML";
              c = hosted_page_actions["code_" + c].html.replace(/\{\{(.+?)\}\}/g, function (a, c) {
                return b[c] || "";
              });
              h.innerHTML = c;
              document.getElementById(hosted_page_wrapper).appendChild(h);
              document.getElementById("REVCENT_RESULT_HTML").scrollIntoView();
            } else if ("popup" === hosted_page_actions["code_" + c].action && typeof swal === "function") {
              if (c === 1) {
                swal_header = 'Success';
                swal_type = 'success';
                if (hosted_page_submission_type === 'sale') {
                  swal_message = 'Payment successfully processed!';
                } else if (hosted_page_submission_type === 'lead_only') {
                  swal_message = 'Thanks for signing up!';
                } else {
                  swal_message = 'Thanks for submission!';
                }
              } else {
                swal_header = 'Error';
                swal_type = 'error';
                if ('message' in b && b.message !== '') {
                  swal_message = b.message;
                } else {
                  swal_message = 'Unknown error occurred. Please contact support.';
                }
              }
              swal(swal_header, swal_message, swal_type);
            } else {
              a();
            }
          } else {
            a();
          }
        } else {
          processUnknownResult();
        }

        function processUnknownResult() {
          toggleSubmissionBtn(true)
          if (typeof swal === "function") {
            swal('Error', 'Unknown error occurred. Please contact support.', 'error');
          } else {
            a();
          }
        }
      };
    </script>
    
    

    <script src="https://cdn.revcent.com/js/plugins/jquery-ui/jquery-ui.min.js">
    </script>
    <script src="https://cdn.revcent.com/js/plugins/formbuilder/form-builder.min.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/formbuilder/form-render.min.js"></script>
    

    <script>
      window.addEventListener('message',function(event) {
        if('data' in event&&event.data!==null&&typeof event.data==='object'&&'event_id' in event.data&&'revcent_response' in event.data&&event.data.revcent_response!==null&&typeof event.data.revcent_response==='object') {
          if(event.data.event_id==='revcent_tracking'&&'revcent_track_id' in event.data.revcent_response&&event.data.revcent_response.revcent_track_id!==''&&'revcent_entry_id' in event.data.revcent_response&&event.data.revcent_response.revcent_entry_id!=='') {
            $('#hosted-page-wrapper').attr('data-trackid',event.data.revcent_response.revcent_track_id);
            $('#hosted-page-wrapper').attr('data-entryid',event.data.revcent_response.revcent_entry_id);
            updateVisitTrackEntry();
          }
        }
      });

      function updateVisitTrackEntry() {
        $.ajax({
          type: 'POST',
          url: 'https://securehost.revcent.com/securehost-tracking',
          dataType: "json",
          data: {
            visit_id: $('#hosted-page-wrapper').attr('data-visitid'),
            track_id: $('#hosted-page-wrapper').attr('data-trackid'),
            entry_id: $('#hosted-page-wrapper').attr('data-entryid')
          },
          success: function(x) {}
        });
      }

      function rlp(x) {
        window.setTimeout(function() {
          window.location.reload();
        },x);
      }

      function startPageLoader() {
        $('<div class="loading-page-wrapper revcent-page-loader"></div>').insertBefore('.wrapper.wrapper-content');
      }

      function stopPageLoader() {
        var uri=window.location.toString();
        if(uri.indexOf("?")>0&&uri.indexOf("invoice_id")===-1) {
          var clean_uri=uri.substring(0,uri.indexOf("?"));
          window.history.replaceState({},document.title,clean_uri);
        }
        if(uri.indexOf("?")>0&&uri.indexOf("invoice_id")>-1) {
          if($('#hosted-page-wrapper').attr('data-isprint')==='true') {
            $('.main-checkout-row').remove();
            $('section.shopping-cart').removeClass().addClass('print-view');
            try {
              var invoice_details=JSON.parse($('#invoice-details').text());
              if(typeof invoice_details.paid!=='undefined'&&invoice_details.paid===false&&typeof invoice_details.void!=='undefined'&&invoice_details.void===false) {
                $('section.print-view').append('<div class="text-center" target="_blank" id="invoice-footer-payment-link"><a href="'+uri+'">Pay Invoice</a></div>');
              }
            } catch(ex) {
              console.log(ex);
            }
          }
        }

        $('.wrapper.wrapper-content.hidden').removeClass('hidden');
        $('.loading-page-wrapper').addClass('hidden');
      }

      function setRevCentCartCookieValue(cookie_name,cookie_sub_value,is_json,is_uri,new_value,callback) {
        var cookie_val=new_value;
        if(cookie_sub_value&&cookie_sub_value!==null) {
          cookie_val=getCookieValue(cookie_name,null,is_json,is_uri);
          cookie_val[cookie_sub_value]=new_value;
        }

        if(is_json&&is_json===true) {
          cookie_val=JSON.stringify(cookie_val);
        }
        if(is_uri&&is_uri===true) {
          cookie_val=encodeURIComponent(cookie_val);
        }

        createLocalCookie(cookie_name,cookie_val,30,function(err,res) {
          if(err) {
            callback(err);
          } else {
            callback(null,'OK');
          }
        });
      }

      function createLocalCookie(name,value,days,callback) {
        if(create_revcent_cookie===true) {
          var expires='';
          if(days) {
            var date=new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            expires='; expires='+date.toUTCString();
          }
          document.cookie=name+'='+value+expires+'; path=/; SameSite=None; Secure';
        }
        callback(null,null);
      }

      function findLocalCookie(name) {
        var nameEQ=name+'=';
        var ca=document.cookie.split(';');
        for(var i=0;i<ca.length;i++) {
          var c=ca[i];
          while(c.charAt(0)===' ') c=c.substring(1,c.length);
          if(c.indexOf(nameEQ)===0) return c.substring(nameEQ.length,c.length);
        }
        return null;
      }
      
      function getCookieValue(cookie_name,cookie_sub_value,is_json,is_uri) {
        var cart_cookie=findLocalCookie(cookie_name);
        if(cart_cookie!==null&&cart_cookie!==''&&typeof cart_cookie!=='undefined') {
          if(is_json&&is_json===true) {
            var cookie_json;
            try {
              if(is_uri&&is_uri===true) {
                cookie_json=JSON.parse(decodeURIComponent(cart_cookie));
              } else {
                cookie_json=JSON.parse(cart_cookie);
              }
              if(cookie_sub_value&&cookie_sub_value!==null) {
                return cookie_json[cookie_sub_value];
              } else {
                return cookie_json;
              }
            } catch(ex) {
              console.log(ex);
              return null;
            }
          } else {
            return cart_cookie;
          }
        } else {
          return null;
        }
      }


      function fwp(x,y) {
        window.setTimeout(function() {
          window.location.replace(y);
        },x);
      }
    </script>

    <script>
      var updateCartProduct;
    </script>
    
    <style>
      .formbuilder-select .form-control.bootstrap-select {
        padding: 0;
      }

      .product-option-form {
        padding: 20px;
      }
    </style>
    <script>
      function propagateProductOption(product_id,option_id,product_option_submitted,form_json_string,callback) {
        var form_json=null;
        try {
          form_json=JSON.parse(form_json_string);
        } catch(ex) {
          console.log(ex);
          callback();
          return;
        }
        if(product_option_submitted!==null&&typeof product_option_submitted==='object'&&'id' in product_option_submitted&&product_option_submitted.id===option_id&&'options' in product_option_submitted&&product_option_submitted.options!==null&&typeof product_option_submitted.options==='object'&&Object.keys(product_option_submitted.options).length>0&&Array.isArray(form_json)&&form_json.length>0) {
          let options=product_option_submitted.options;
          let form_json_ctr=0;
          for(let i=0,len=form_json.length;i<len;i++) {
            if('name' in form_json[i]&&form_json[i].name in options) {
              let form_option=form_json[i];
              let submitted_option=options[form_json[i].name];
              if(form_option.type==='radio-group') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="radio"]').each(function() {
                  if($(this).val()===submitted_option) {
                    $(this).attr('checked','checked');
                  } else {
                    $(this).attr('checked',false);
                  }
                });
              } else if(form_option.type==='select') {
                let append_name='';
                if(form_option.multiple===true) {
                  append_name='[]'
                }
                $('#product-option-form-'+option_id+' select[name="'+form_json[i].name+append_name+'"] option').each(function() {
                  if(Array.isArray(submitted_option)) {
                    if(submitted_option.includes($(this).val())) {
                      $(this).attr("selected","selected");
                    }
                  } else if(typeof submitted_option==='string') {
                    if($(this).val()===submitted_option) {
                      $(this).attr("selected","selected");
                    }
                  }
                });
              } else if(form_option.type==='checkbox-group') {
                let append_name='[]';
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+append_name+'"][type="checkbox"]').each(function() {
                  if(Array.isArray(submitted_option)) {
                    if(submitted_option.includes($(this).val())) {
                      $(this).attr("checked","checked");
                    } else {
                      $(this).attr('checked',false);
                    }
                  } else if(typeof submitted_option==='string') {
                    if($(this).val()===submitted_option) {
                      $(this).attr("checked","checked");
                    } else {
                      $(this).attr('checked',false);
                    }
                  }
                });
              } else if(form_option.type==='text') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="text"]').val(submitted_option);
              } else if(form_option.type==='textarea') {
                $('#product-option-form-'+option_id+' textarea[name="'+form_json[i].name+'"][type="textarea"]').val(submitted_option);
              } else if(form_option.type==='number') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="number"]').val(submitted_option);
              } else if(form_option.type==='date') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="date"]').val(submitted_option);
              } else if(form_option.type==='hidden') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="hidden"]').val(form_option.value);
              }
              checkPropagateCtr();
            } else {
              checkPropagateCtr();
            }

            function checkPropagateCtr() {
              form_json_ctr++;
              if(form_json_ctr===form_json.length) {
                sendBack();
              }
            }
          }

        } else {
          sendBack();
        }

        function sendBack() {
          callback();
        }
      }

      function productOptionChange(product_id,option_id,callback) {

        $.fn.serializeObject=function() {
          var o={};
          var a=this.serializeArray();
          $.each(a,function() {
            if(o[this.name.replace('[]','')]) {
              if(!o[this.name.replace('[]','')].push) {
                o[this.name.replace('[]','')]=[o[this.name.replace('[]','')]];
              }
              o[this.name.replace('[]','')].push(this.value||'');
            } else {
              o[this.name.replace('[]','')]=this.value||'';
            }
          });
          return o;
        };
        var form_object=$('form#product-option-form-'+option_id).serializeObject();
        var product_option_object={};
        product_option_object.id=option_id;
        product_option_object.options=form_object;
        updateCartProduct(product_id,null,product_option_object,function(err,res) {
          callback(null,res);
        });
      }


      function buildItemsDisplay(x,item_html,callback) {
        var append_type=null;
        var append_wrap='div';
        var append_class='';
        if(item_html===null&&$('.items').length>0) {
          item_html=$('.items')[0].innerHTML;
          if($('.items').attr('data-appendtype')) {
            append_type=$('.items').attr('data-appendtype');
          }
          if(append_type!==null) {
            if(append_type==='li') {
              append_wrap='span';
              append_class='';
            }
          }
        }
        $('.coupon-code-wrap').removeClass('hidden');
        $('.items').empty();
        $.each(x.products,function(a,b) {
          var append_item='<'+append_wrap+' class="product-wrap '+append_class+' product-wrap-'+b.id+'" data-productid="'+b.id+'" data-pos="'+a+'">'+item_html+'</'+append_wrap+'>';
          $('.items').append(append_item);
          $('.product-wrap-'+b.id).find('.product-quantity-input').attr('value',b.quantity).attr('data-productid',b.id);
          $('.product-wrap-'+b.id).find('.product-name-display').html(b.name);
          if('is_trial' in b&&b.is_trial===true) {
            $('.product-wrap-'+b.id).find('.product-price-display').html(0);
          } else {
            $('.product-wrap-'+b.id).find('.product-price-display').html(b.price);
          }
          $('.product-wrap-'+b.id).find('.product-remove-wrap').empty().html('<a class="product-remove-btn" data-productid="'+b.id+'">remove</a>');
          if('max_quantity_allowed' in b&&b.max_quantity_allowed!==null&&!isNaN(parseInt(b.max_quantity_allowed))&&parseInt(b.max_quantity_allowed)>0) {
            $('.product-wrap-'+b.id).find('.product-quantity-input').attr('max',b.max_quantity_allowed);
            if(b.quantity>b.max_quantity_allowed) {
              $('.product-wrap-'+b.id).find('.product-quantity-input').attr('value',b.max_quantity_allowed);
            }
          }
          if('product_option' in b&&Array.isArray(b.product_option)&&b.product_option.length>0) {
            $('.product-wrap-'+b.id).append('<div class="product-options-wrap" id="product-options-wrap-'+b.id+'" data-productid="'+b.id+'"></div>');
            $.each(b.product_option,function(c,d) {
              if('form_json' in d&&d.enabled===true) {
                $('#product-options-wrap-'+b.id).append('<form class="product-option-form" id="product-option-form-'+d.id+'" data-productid="'+b.id+'" data-optionid="'+d.id+'"></form>');
                var form_wrap=$('#product-option-form-'+d.id);
                var form_options={
                  container: form_wrap,
                  formData: d.form_json,
                  dataType: 'json',
                  i18n: {
                    locale: 'en-US',
                    location: 'https://cdn.revcent.com/js/plugins/formbuilder/',
                    extension: '.lang'
                  },
                };
                $(form_wrap).formRender(form_options);
                $('.formbuilder-select select[multiple=false]').removeAttr('multiple');
                $('.formbuilder-select select').addClass('selectpicker');

                if('product_option_validated' in d&&d.product_option_validated!==null&&typeof d.product_option_validated==='object') {
                  var product_id=$('form#product-option-form-'+d.id).attr('data-productid');
                  var option_id=$('form#product-option-form-'+d.id).attr('data-optionid');
                  propagateProductOption(product_id,option_id,d.product_option_validated,d.form_json,function(err,res) {
                    $('.selectpicker').selectpicker('refresh');
                  });
                }

                $('.selectpicker').selectpicker('refresh');

                $('form#product-option-form-'+d.id+' :input').change(function() {
                  var product_id=$('form#product-option-form-'+d.id).attr('data-productid');
                  var option_id=$('form#product-option-form-'+d.id).attr('data-optionid');
                  productOptionChange(product_id,option_id,function(err,res) {
                    $('.selectpicker').selectpicker('refresh');
                  });
                });
              }
            });
          }
        });

        processProductCount();
        updateSummary();

        function processProductCount() {
          $('.product-count').text(x.products.length);
          if(x.products.length===0) {
            $('.form-content-col,.main-checkout-row').addClass('d-none');
            $('.product-count').removeClass('badge-primary');
            $('.product-count').addClass('badge-secondary');
          } else {
            $('.form-content-col,.main-checkout-row').removeClass('d-none');
            $('.product-count').addClass('badge-primary');
            $('.product-count').removeClass('badge-secondary');
          }
        }

        function updateSummary() {
          $('.summary-subtotal').html(x.totals.products.amount_bill_now.toFixed(2));
          $('.summary-discount-total').html(x.totals.discount.amount_total.toFixed(2));
          $('.summary-shipping-total').html(x.totals.shipping.amount_bill_now.toFixed(2));
          $('.summary-tax-total').html(x.totals.tax.amount_bill_now.toFixed(2));
          $('.summary-final-total').html(x.totals.amount_bill_now.toFixed(2));
          if(x.totals.discount.amount_total===0) {
            $('.summary-discount-wrap').attr('style','display: none !important');
          } else {
            $('.summary-discount-wrap').attr('style','display: block !important');
            $('.summary-discount-wrap').addClass('text-success');
            $('.summary-discount-total').html('- '+x.totals.discount.amount_total.toFixed(2));
          }
          if(x.totals.tax.amount_bill_now===0) {
            $('.summary-tax-wrap').attr('style','display: none !important');
          } else {
            $('.summary-tax-wrap').attr('style','display: block !important');
          }
          if(x.totals.shipping.amount_bill_now===0) {
            $('.summary-shipping-total').html('FREE');
          }
        }
        callback(null,item_html);
      }
    </script>
    

    

    <script>
      $(document).ready(function() {
        var visit_id=$('#hosted-page-wrapper').attr('data-visitid');
        var page_id=$('#hosted-page-wrapper').attr('data-pageid');
        var adwords_click=$('#hosted-page-wrapper').attr('data-adwordsclick');
        var display_type=$('#hosted-page-wrapper').attr('data-displaytype');
        var submission_type=$('#hosted-page-wrapper').attr('data-submissiontype');
        var submission_url='https://securehost.revcent.com/securehost-submission';
        var cart_url='https://securehost.revcent.com/securehost-cart';
        var currency_symbol='$';
        var checkout_request=null;
        var unique_request_id=null;
        var item_html=null;
        var amount_bill_now=null;
        var estimate_object=null;
        var sale_id=null;
        var pending_sale=null;
        var new_card=false;


        var submission_btn=document.querySelectorAll('.hosted-page-submission-btn');

        function checkSubmissionType() {
          checkLocalCookie();
        }

        function checkLocalCookie() {
          var cart_check=findLocalCookie('revcent_cart');
          if(cart_check!==null&&cart_check!==''&&typeof cart_check!=='undefined') {
            parseCookie();
          } else {
            loadBlankRequest();
          }
        }


        $(document).on('input','input.product-quantity-input',function() {
          updateCartProduct($(this).attr('data-productid'),$(this).val(),null,function(err,res) {});
        });


        $(document).on('click','.coupon-code-apply-btn',function(a) {
          validateCartCoupon($('#coupon-code-input').val(),function(err,res) {});
        });

        function validateCartCoupon(coupon_code,callback) {
          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: {
              sub_type: 'validate_cart_coupon',
              page_id: page_id,
              visit_id: visit_id,
              coupon_code: coupon_code
            },
            success: function(x) {
              if('code' in x&&x.code===1) {
                updateCartCoupon(coupon_code,function(err,res) {});
              } else {
                swal('Error',x.message,'error');
              }
            }
          });
        }

        function updateCartCoupon(coupon_code,callback) {
          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: {
              sub_type: 'update_cart_coupon',
              page_id: page_id,
              visit_id: visit_id,
              coupon_code: coupon_code
            },
            success: function(x) {
              if('code' in x&&x.code===1) {
                parseCookie();
              } else {
                swal('Error',x.message,'error');
              }
            }
          });
        }


        $(document).on('click','.product-remove-btn',function(a) {
          updateCartProduct($(this).attr('data-productid'),0,null,function(err,res) {});
        });

        updateCartProduct=function(product_id,product_quantity,product_option_object,callback) {

          var data_object={
            sub_type: 'update_cart_product',
            page_id: page_id,
            visit_id: visit_id,
            product_id: product_id,
          };

          if(product_option_object!==null&&typeof product_option_object==='object'&&'id' in product_option_object) {
            data_object.product_option=JSON.stringify(product_option_object);
          }
          if(product_quantity!==null) {
            data_object.product_quantity=product_quantity;
          }

          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: data_object,
            success: function(x) {
              if('code' in x&&x.code===1) {
                parseCookie();
              } else {
                swal('Error',x.message,'error');
              }
              callback(null,'OK');
            }
          });
        }

        function emptyCart(callback) {
          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: {
              sub_type: 'empty_cart',
              page_id: page_id,
              visit_id: visit_id
            },
            success: function(x) {
              $('#checkout-request').val('');
              callback(null,'OK');
            }
          });
        }


        function parseCookie() {
          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: {
              sub_type: 'parse_cart_cookie',
              page_id: page_id,
              visit_id: visit_id
            },
            success: function(x) {
              if('code' in x&&x.code===1) {
                parseUserCart(x.user_cart);
              } else if('code' in x&&x.code===4) {
                $('#checkout-request').val('');
                loadBlankRequest();
              } else {
                if('message' in x) {
                  swal('Error',x.message,'error');
                }
              }
            }
          });
        }

        function parseUserCart(user_cart) {
          if('unique_request_id' in user_cart) {
            unique_request_id=user_cart.unique_request_id;
          }
          if('request_object' in user_cart) {
            checkout_request=user_cart.request_object;
          }
          if(checkout_request!==null) {
            setCheckoutRequestValue();
            $('.main-checkout-row').show();
          } else {
            $('#checkout-request').val('');
            loadBlankRequest();
          }
        }


        function setCheckoutRequestValue() {
          $('#checkout-request').val(JSON.stringify(checkout_request));
          loadEstimate();
        }



        function loadBlankRequest() {
          $('.items').empty();
          $('.product-count').text('0');
          $('.product-count').removeClass('badge-primary');
          $('.product-count').addClass('badge-secondary');
          $('.summary-subtotal').html('0');
          $('.summary-shipping-total').html('0');
          $('.summary-discount-total').html('0');
          $('.summary-tax-total').html('0');
          $('.summary-final-total').html('0');
          $('.form-content-col,.main-checkout-row').addClass('d-none');
          $('.summary-discount-wrap').attr('style','display: none !important');
          $('.coupon-code-wrap').addClass('hidden');
          stopPageLoader();
        }

        function loadEstimate() {
          if(checkout_request===null) {
            if($('#checkout-request').val()&&$('#checkout-request').val().length>30) {
              try {
                checkout_request=JSON.parse($('#checkout-request').val());
                validateProducts();
              } catch(ex) {
                console.log(ex);
              }
            } else {
              loadBlankRequest();
            }
          } else {
            validateProducts();
          }

          function validateProducts() {
            if('request' in checkout_request&&'product' in checkout_request.request&&Array.isArray(checkout_request.request.product)&&checkout_request.request.product.length>0) {
              sendRequest();
            } else {
              loadBlankRequest();
            }
          }

          function sendRequest() {
            $('.summary-subtotal,.summary-discount-total,.summary-shipping-total,.summary-tax-total,.summary-final-total').html('<i class="fas fa-circle-notch fa-spin"></i>');
            $.ajax({
              type: 'POST',
              url: submission_url,
              dataType: "json",
              data: {
                request_type: 'estimate',
                page_id: page_id,
                visit_id: visit_id,
                adwords_click: $('#hosted-page-wrapper').attr('data-adwordsclick'),
                form_data: JSON.stringify(getFormData()),
                checkout_request: JSON.stringify(checkout_request)
              },
              success: function(x) {
                if(x&&x!==null&&typeof x==='object'&&'code' in x) {
                  if(x.code===1&&'products' in x&&Array.isArray(x.products)) {
                    estimate_object=x;
                    buildItemsDisplay(x,item_html,function(err,res) {
                      item_html=res;
                      // processProductCount(x.products.length);
                      // updateSummary(x);
                      amount_bill_now=x.totals.amount_bill_now;
                      stopPageLoader();
                    });
                  } else {
                    if('message' in x) {
                      swal('Error',x.message,'error');
                    }
                    emptyCart(function(err,res) {});
                    loadBlankRequest();
                  }
                } else {
                  loadBlankRequest();
                }
              }
            });
          }
        }


        $(document).on('change','input[name=customer-zip]',function() {
          buildCustomerObject(function(a) {
            if(a.code===1) {
              loadEstimate();
            }
          });
        });
        $(document).on('change','input[name=bill-to-zip]',function() {
          buildBillToObject(function(a) {
            if(a.code===1) {
              loadEstimate();
            }
          });
        });
        $(document).on('change','input[name=ship-to-zip]',function() {
          buildShipToObject(function(a) {
            if(a.code===1) {
              loadEstimate();
            }
          });
        });
        $(document).on('change','input[name=card-number]',function() {
          if($('input[name=card-number]').val().length>5) {
            new_card=true;
          }
        });

        $('[name="payment-method-radio"]').on('change',function() {
          if($(this).val()==="credit_card") {
            $('#credit-card-tab').show();
            $('#paypal-tab').hide();
          } else if($(this).val()==="paypal") {
            $('#credit-card-tab').hide();
            $('#paypal-tab').show();
          }
        });

        function buildCustomerObject(callback) {
          var res={};
          res.code=0;
          if($('input[name=customer-first-name]').val()!==''&&$('input[name=customer-last-name]').val()!=='') {
            res.code=1;
          }
          callback(res);
        }

        function buildBillToObject(callback) {
          var res={};
          res.code=0;
          if($('input[name=bill-to-first-name]').val()!==''&&$('input[name=bill-to-last-name]').val()!=='') {
            res.code=1;
          }
          callback(res);
        }

        function buildShipToObject(callback) {
          var res={};
          res.code=0;
          if($('input[name=ship-to-first-name]').val()!==''&&$('input[name=ship-to-last-name]').val()!=='') {
            res.code=1;
          }
          callback(res);
        }


        function getFormData() {
          var cc_form_data=$('.revcent-credit-card-form').serializeArray();
          var customer_form_data=$('.revcent-customer-form').serializeArray();
          var bill_to_form_data=$('.revcent-bill-to-form').serializeArray();
          var ship_to_form_data=$('.revcent-ship-to-form').serializeArray();
          var form_data=[].concat(cc_form_data,bill_to_form_data,ship_to_form_data,customer_form_data);
          return form_data;
        }

        function getCheckoutRequest() {
          try {
            return checkout_request=JSON.parse($('#checkout-request').val());
          } catch(ex) {
            console.log(ex);
            return null;
          }
        }

        function getPayPalOrderObject(pending_sale) {
          var paypal_order_obj={
            purchase_units: []
          };

          var purchase_unit_obj={
            custom_id: 'revcent_'+pending_sale.sale_id,
            amount: {
              value: estimate_object.totals.amount_bill_now,
              currency_code: 'USD',
              breakdown: {
                item_total: {
                  currency_code: 'USD',
                  value: estimate_object.totals.products.amount_bill_now
                },
                shipping: {
                  currency_code: 'USD',
                  value: estimate_object.totals.shipping.amount_bill_now
                },
                tax_total: {
                  currency_code: 'USD',
                  value: estimate_object.totals.tax.amount_bill_now
                }
              }
            }
          };

          if('products' in estimate_object&&Array.isArray(estimate_object.products)&&estimate_object.products.length>0) {
            purchase_unit_obj.items=[];
            for(var i=0,len=estimate_object.products.length;i<len;i++) {
              var item_obj={};
              item_obj.name=estimate_object.products[i].name;
              item_obj.sku=estimate_object.products[i].id;
              item_obj.unit_amount={
                currency_code: 'USD',
                value: estimate_object.products[i].price
              };
              item_obj.quantity=estimate_object.products[i].quantity;
              purchase_unit_obj.items.push(item_obj);
            }
          }

          if('shipping' in estimate_object&&Array.isArray(estimate_object.shipping)&&estimate_object.shipping.length>0) {
            purchase_unit_obj.shipping={};
            purchase_unit_obj.shipping.method=estimate_object.shipping[0].provider+' '+estimate_object.shipping[0].provider_method;
          }
          paypal_order_obj.purchase_units.push(purchase_unit_obj);

          return paypal_order_obj;
        }

        function validatePurchaseFields(is_paypal) {
          if(is_paypal&&is_paypal===true) {
            if($('.revcent-customer-form').length>0&&$('.revcent-customer-form').valid()) {
              return true
            } else if($('.revcent-bill-to-form').length>0&&$('.revcent-bill-to-form').valid()) {
              return true;
            } else {
              return false;
            }
          } else {
            if($('#hosted-page-wrapper').attr('data-iscustomer')===true||$('#hosted-page-wrapper').attr('data-iscustomer')==='true') {
              return true;
            } else {
              if($('.revcent-credit-card-form').valid()) {
                if($('.revcent-customer-form').length>0&&$('.revcent-customer-form').valid()) {
                  return true
                } else if($('.revcent-bill-to-form').length>0&&$('.revcent-bill-to-form').valid()) {
                  return true;
                } else {
                  return false;
                }
              } else {
                return false;
              }
            }
          }
        }


        $(document).on('click','.hosted-page-submission-btn',function(a) {
          if(validatePurchaseFields()===true) {
            submitSaleForm();
          } else {
            swal('Error','Please complete all required fields.','error');
          }
        });


        function toggleSubmissionBtn(show) {
          if(typeof submission_btn!=='undefined') {
            if(show===false) {
              submission_btn.forEach(a => a.classList.add('disabled'));
            } else {
              submission_btn.forEach(a => a.classList.remove('disabled'));
            }
          }
        }



        function submitSaleForm() {
          $('#checkout-form-payment-result-fieldset-result-wrap').empty();
          $('#checkout-form-payment-result-fieldset').addClass('hidden');
          toggleSubmissionBtn(false);
          $.ajax({
            type: 'POST',
            url: submission_url,
            dataType: "json",
            data: {
              request_type: 'create',
              page_id: page_id,
              visit_id: visit_id,
              adwords_click: $('#hosted-page-wrapper').attr('data-adwordsclick'),
              is_customer: $('#hosted-page-wrapper').attr('data-iscustomer'),
              form_data: JSON.stringify(getFormData()),
              checkout_request: JSON.stringify(getCheckoutRequest()),
              new_card: new_card
            },
            success: function(x) {
              if(x.code===1) {
                emptyCart(function(err,res) {});
              }
              if(typeof processRevCentResponse==="function") {
                processRevCentResponse(x);
              } else {
                processGenericResult(x);
              }
            }
          });
        }



        function processGenericResult(x) {
          var alert_class='warning';
          var payment_result='Unknown Error Occurred';
          var response_p='<p>Please contact customer support.</p>';
          var payment_icon='';
          if('code' in x) {
            response_p='';
            if('amount' in x) {
              response_p+='<p>Amount: $'+x.amount+' </p>';
            }
            if('transaction_id' in x) {
              response_p+='<p>Transaction ID: <strong>'+x.transaction_id+'</strong></p>';
            }
            if('sale_id' in x) {
              response_p+='<p>Sale ID: <strong>'+x.sale_id+'</strong></p>';
            }
            if('error_code' in x) {
              response_p+='<p>Error Code: '+x.error_code+' </p><p>Please contact customer support.</p>';
            }
            if('message' in x) {
              response_p+='<p>Message: '+x.message+' </p>';
            }

            if(x.code===1) {
              alert_class='success';
              payment_result='Payment Successful';
            } else if(x.code===0) {
              payment_result='Error';
            } else if(x.code===2) {
              alert_class='danger';
              payment_result='Payment Declined';
            } else if(x.code===3) {
              payment_result='Merchant Error';
            } else if(x.code===4) {
              payment_result='Merchant Hold';
              payment_icon='exclamation-triangle';
            }
          }

          if([0,2,3].includes(x.code)) {
            toggleSubmissionBtn(true);
            swal(payment_result,x.message,'warning');
          } else {
            $('#checkout-forms-row,.product-list-col').empty();
            if(x.code===1) {
              swal('Payment Success','Your payment was successfully processed.','success');
            } else if(x.code===4) {
              swal('Merchant Hold','The merchant placed a hold on the transaction.','warning');
            }
            var payment_result_html='<div class="col-12" style="margin-top:25px"><div class="alert alert-'+alert_class+'" style="text-align:center" role="alert"><p><strong><i class="fa fa-'+payment_icon+'"></i> '+payment_result+'</strong></p>'+response_p+'</div></div>';
            $('#checkout-forms-row').append(payment_result_html);
            document.getElementById("checkout-forms-row").scrollIntoView();
          }

          window.parent.postMessage({
            event_id: 'revcent_response',
            revcent_response: x
          },
            '*'
          );
        }



        if($('.paypal-button-container').length>0&&typeof $('#hosted-page-wrapper').attr('data-paypalaccountid')!=='undefined'&&$('#hosted-page-wrapper').attr('data-paypalaccountid')!==null&&$('#hosted-page-wrapper').attr('data-paypalaccountid')!=='') {
          $('.paypal-button-container').empty();
          paypal.Buttons({
            createOrder: function(data,actions) {
              try {
                if(validatePurchaseFields(true)) {
                  return fetch(submission_url,{
                    method: 'post',
                    headers: {
                      'content-type': 'application/json',
                      'accept': 'application/json, text/javascript, text/plain, */*; q=0.01'
                    },
                    body: JSON.stringify({
                      request_type: 'paypal_pending',
                      page_id: page_id,
                      visit_id: visit_id,
                      paypal_account_id: $('#hosted-page-wrapper').attr('data-paypalaccountid'),
                      adwords_click: $('#hosted-page-wrapper').attr('data-adwordsclick'),
                      form_data: JSON.stringify(getFormData()),
                      checkout_request: JSON.stringify(getCheckoutRequest())
                    })
                  })
                    .then(function(res) {
                      return res.json();
                    })
                    .then(function(sale_response) {
                      if('code' in sale_response&&sale_response.code===1&&'amount' in sale_response) {
                        pending_sale=sale_response;
                        sale_id=sale_response.sale_id;
                        return actions.order.create(getPayPalOrderObject(pending_sale));
                      } else {
                        throw sale_response.message;
                      }
                    }).catch(function(e) {
                      throw e;
                    });
                } else {
                  throw 'Please complete all required fields.';
                }
              } catch(ex) {
                swal('Error',ex,'error');
                //throw ex;
              }
            },
            onApprove: function(data,actions) {
              return actions.order.capture().then(function(details) {
                return fetch(submission_url,{
                  method: 'post',
                  headers: {
                    'content-type': 'application/json',
                    'accept': 'application/json, text/javascript, text/plain, */*; q=0.01'
                  },
                  body: JSON.stringify({
                    request_type: 'paypal_validate',
                    paypal_account_id: $('#hosted-page-wrapper').attr('data-paypalaccountid'),
                    paypal_transaction_id: data.orderID,
                    paypal_transaction_details: details,
                    sale_id: sale_id,
                    page_id: page_id,
                    visit_id: visit_id,
                    adwords_click: adwords_click,
                    form_data: JSON.stringify(getFormData()),
                    checkout_request: JSON.stringify(getCheckoutRequest())
                  })
                })
                  .then(function(res) {
                    return res.json();
                  })
                  .then(function(validate_response) {
                    if('code' in validate_response&&validate_response.code===1) {
                      emptyCart(function(err,res) {});
                      var main_response=null;
                      if('message' in validate_response&&validate_response.message==='paid') {
                        main_response=pending_sale;
                      } else {
                        main_response=validate_response;
                      }
                      main_response.amount=pending_sale.amount;
                      main_response.transaction_id=data.orderID;
                      if(typeof processRevCentResponse==="function") {
                        processRevCentResponse(main_response);
                      } else {
                        processGenericResult(main_response);
                      }
                    } else {
                      throw validate_response.message;
                    }
                  }).catch(function(e) {
                    throw e;
                  });
              });
            },
            onError: function(err) {
              //console.log(err);
            }
          }).render('.paypal-button-container');
        } else {
          $('.payment-method-radio-paypal-wrap').remove();
        }
        startPageLoader();
        checkSubmissionType();
      });
    </script>
    






    


    
</body>

</html>