<!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>Vitamatic 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;padding-top:20px;text-align:center;padding-bottom:20px;background-color:#f0fdff;}.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;}.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;}body{background-color:#f0fdff;}.fa-2x.fa.fa-cc-visa{color:#2092f4;}.fa-2x.fa.fa-cc-mastercard{color:#2092f4;}.fa-2x.fa.fa-cc-discover{color:#2092f4;}.fa-2x.fa.fa-cc-amex{color:#2092f4;}.fa-2x.fa.fa-cc-paypal{color:#17a2b8;}.custom-control.custom-radio{text-align:left;}.form-group{text-align:left;}.btn.btn-primary.btn-block.btn-lg.text-white.hosted-page-submission-btn{background-image:url(none);background-repeat:repeat;background-position:left top;background-attachment:scroll;background-size:auto;background-color:#2092f4;}.mb-3{text-align:left;}.custom-control.custom-checkbox{text-align:left;}#main-container-header-h1{margin-bottom:0px;color:#ffffff;}#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:#2092f4;}#main-forms-row-container{padding-left:10px;padding-right:10px;}#i6021f{color:black;width:300px;text-align:center;}@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="yRdq8Mob9NCOlWGYak79" data-pageid="AL8WnlYkWps05bqGKWdV" 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">
            <a href="https://vitamatic.com"><img src="https://vitamatic.com/wp-content/uploads/2017/12/good_vitamatic_logo.jpg" id="i6021f" /></a><div id="main-container" class="container"><div id="main-container-header-row" class="row"><div class="col"><h1 id="main-container-header-h1">Secure Checkout
	  </h1></div></div><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 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" id="ivcj6">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">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":{"product":[{"id":"VPQaN2XdGdIQmKGm5dE2","quantity":1}],"campaign":"gYoOg5JYVXIKnW20NVQ6","unique_request_id":"cart_1310a8lv22sgyo"}}</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 = 'AL8WnlYkWps05bqGKWdV';
      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://vitamatic.com/thank-you/","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"false","include_iframe_parameters":"false"},"action":"redirect","html":""},"code_2":{"redirect":{"url":"","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"true","include_iframe_parameters":"true"},"action":"html","html":"<h1><span style=\"color: rgb(255, 0, 0); font-weight: bold;\">Something Went Wrong with Your Payment.</span></h1><h2>Please try again.</h2>"},"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>
    






    


    
    <script>!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window, document,'script', 'https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '808096296371737'); fbq('track', 'PageView');</script><noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=808096296371737&ev=PageView&noscript=1"/></noscript>
</body>

</html>