<!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="E2J9lVgJBZhkEk5G7mEr" data-pageid="O08MKaa9EvHBRqJ6yZnj" 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":"KnPo1oEPd5S4E6lY5lbp","quantity":1},{"id":"6rBkndzkOjc0OyVL68vX","quantity":1}],"unique_request_id":"cart_obvlg8lucs0l9w"}}</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 = 'O08MKaa9EvHBRqJ6yZnj';
      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>