<!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="a2Wr5MQVQkhG02Z9Abj4" 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":"ajQLR0a2M4H7G0m60ENb","quantity":1}],"campaign":"gYoOg5JYVXIKnW20NVQ6","unique_request_id":"cart_euuxte8lv2si2bt"}}</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>