Search code examples
javascripthtmljquerysummultiplication

calculate price depend on selection without button


I want to add price and multiply with if statement to clarify here is some price for variable Private=100 for adults and 50 for children or shared=40 for adults and 30 for children with atv=100 for adult 80 for children or without atv=0

if the only adult is booking on the web I want the price to react like the sum of both selections multiply with the number of adult example the adult book shared with ATV so 40+100=140 * number of adult

if adults and children are booking shared with ATV then it should react like 40+100=140 * number of adults 30+80=110 * no of children the result should be summing (110 * number of children) + (140 * number of adults)

<!doctype html>
<html lang="en">

<head>
  <title>Title</title>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  <style>
    .small-img-group {
      display: flex;
      justify-content: space-between;
    }
    
    .small-img-col {
      flex-basis: 24%;
      cursor: pointer;
    }
    
    .counter1 {
      float: left;
      display: flex;
      justify-content: space-between;
      overflow-x: hidden;
      overflow-y: hidden;
    }
    
    .counter2 {
      float: left;
      display: flex;
      justify-content: space-between;
      overflow-x: hidden;
      overflow-y: hidden;
      padding-left: 15px;
    }
    
    .up,
    .down {
      display: inline-block;
      color: rgb(0, 0, 0);
      font-size: 20px;
      margin: 1px 1px;
      cursor: pointer;
      width: 15px;
      line-height: 14px;
      height: 16px;
      text-align: center;
      font-weight: bold;
      border: 1px solid #000;
      user-select: none;
    }
    
    .up:hover,
    .down:hover {
      color: #fd0b3f;
      text-align: center;
    }
    
    .adults {
      padding-right: 5px;
    }
    
    .children {
      padding-right: 5px;
    }
    
    input {
      appearance: none;
      height: 21px;
      text-align: center;
      width: 42px;
      line-height: 24px;
      font-size: 15px;
      border-radius: 5px;
    }
    
    .container {
      display: flex;
    }
    
    input[type="radio"] {
      display: none;
    }
    
    label[for=private] {
      position: relative;
      color: orangered;
      font-size: 20px;
      border: 2px solid orangered;
      border-radius: 5px;
      align-items: left;
      display: flex;
      cursor: pointer;
      margin-right: 10px;
    }
    
    label[for=shared] {
      position: relative;
      color: orangered;
      font-size: 20px;
      border: 2px solid orangered;
      border-radius: 5px;
      align-items: left;
      display: flex;
      cursor: pointer;
    }
    
    input[type="radio"]:checked+label {
      background-color: orangered;
      color: white;
    }
    
    input[type="radio"]:checked+label:before {
      height: 16px;
      width: 16px;
      border: 10px solid white;
      background-color: orangered;
    }
  </style>

</head>

<body>
  <section class="container sproduct my-5 pt-5">
    <div class="row mt-5">
      <div class="col-lg-5 col-md-12 col-12">
        <img class="img-fluid w-100 pb-1" src="https://skylandtourism.com/wp-content/uploads/2018/03/Morning-Safari.jpg" alt="" id="MainImg" width="450">

        <div class="small-img-group">
          <div class="small-img-col">
            <img src="https://media.tacdn.com/media/attractions-splice-spp-674x446/09/99/99/87.jpg" width="100%" class="small-img" alt="">
          </div>
          <div class="small-img-col">
            <img src="https://skylandtourism.com/wp-content/uploads/2018/03/Morning-Safari.jpg" width="100%" class="small-img" alt="">
          </div>
          <div class="small-img-col">
            <img src="https://skylandtourism.com/wp-content/uploads/2018/03/Morning-Safari.jpg" width="100%" class="small-img" alt="">
          </div>
          <div class="small-img-col">
            <img src="https://skylandtourism.com/wp-content/uploads/2018/03/Morning-Safari.jpg" width="100%" class="small-img" alt="">
          </div>
        </div>
      </div>
      <div class="col-lg-6 col-md-12 col-12">
        <h6>Home / Morning Safari</h6>
        <h3>Morning Safari</h3>
        <h2> <label> Total:</label><label class="total Price"></label> </h2>
        <div class="counter1">
          <Label class="Adults">Adults</Label>
          <div class='down' onclick='decreaseCount(event, this)'>-</div>
          <input type='text' value='1' readonly>
          <div class='up' onclick='increaseCount(event, this)'>+</div>
        </div>
        <div class="counter2">
          <Label class="Children">Children</Label>
          <div class='down' onclick='decreaseCount2(event, this)'>-</div>
          <input type='text' value='0' readonly>
          <div class='up' onclick='increaseCount(event, this)'>+</div>
        </div>
        <div class="container" style="padding-left: 0;padding-top: 5px;">
          <div>
            <input type="radio" name="occupancy" id="private" checked="checked">
            <label for="private">Private</label>
            <input type="radio" name="occupancy" id="shared">
            <label for="shared">Shared</label>
          </div>
          <div>
            <input type="radio" name="atv" id="withatv" checked="checked">
            <label for="withatv">With ATV</label>
            <input type="radio" name="atv" id="withoutatv">
            <label for="withoutatv">Without ATV</label>
          </div>

        </div>

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

  <!-- Optional JavaScript -->
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
  <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
  <script>
    function increaseCount(e, el) {
      var input = el.previousElementSibling;
      var value = parseInt(input.value, 10);
      value = isNaN(value) ? 0 : value;
      value++;
      input.value = value;
    }

    function decreaseCount(e, el) {
      var input = el.nextElementSibling;
      var value = parseInt(input.value, 10);
      if (value > 1) {
        value = isNaN(value) ? 0 : value;
        value--;
        input.value = value;
      }
    }

    function decreaseCount2(e, el) {
      var input = el.nextElementSibling;
      var value = parseInt(input.value, 10);
      if (value > 0) {
        value = isNaN(value) ? 0 : value;
        value--;
        input.value = value;
      }
    }

    var MainImg = document.getElementById('MainImg');
    var smallimg = document.getElementsByClassName('small-img');

    smallimg[0].onclick = function() {
      MainImg.src = smallimg[0].src;
    }
    smallimg[1].onclick = function() {
      MainImg.src = smallimg[1].src;
    }
    smallimg[2].onclick = function() {
      MainImg.src = smallimg[2].src;
    }
    smallimg[3].onclick = function() {
      MainImg.src = smallimg[3].src;
    }
  </script>
</body>

</html>


Solution

  • I did multiple changes to be able to work with this in an easier way:

    • Step 0 - HTML Include id in adults, children input (to be able to get those values)
    • Step 1 - HTML After every modification (change children/adult, atv/no atv, private/shared) render not total
    • Step 2 - JS Calculate new total and render

    The Plnkr with the example: https://plnkr.co/edit/XOebeFyHNXFswNI4

    Step 0 & 1: HTML:

                    onclick="updateTotal()"
                  />
                  <label for="withatv">With ATV</label>
                  <input
                    type="radio"
                    name="atv"
                    id="withoutatv"
                    onclick="updateTotal()"
                  />
                  <label for="withoutatv">Without ATV</label>
                </div>
              </div>
    

    Step 2:

          function calculateTotal() {
            // Define based Prices
            const privateAdultPrice = 100;
            const sharedAdultPrice = 40;
            const privateChildrenPrice = 50;
            const sharedChildrenPrice = 30;
    
            const withAtvAdultPrice = 100;
            const withAtvChildrenPrice = 80;
    
            const noAtvPrice = 0;
    
            // Get the amount of adults and guests
            const adults = +document.querySelector('#adults').value;
            const children = +document.querySelector('#children').value;
    
            // Get the type of trip
            const isPrivate = document.getElementById('private').checked;
            const isWithAtv = document.getElementById('withatv').checked;        
    
            // Calculate the specific charge per type of user and type of trip
            const adultTripPrice = isPrivate ? privateAdultPrice : sharedAdultPrice;
            const childrenTripPrice = isPrivate ? privateChildrenPrice : sharedChildrenPrice;
            // Calculate the specific charge per type of user and the vehicule\
            const adultVehiclePrice = isWithAtv ? withAtvAdultPrice : noAtvPrice;
            const childrenVehiclePrice = isWithAtv ? withAtvChildrenPrice : noAtvPrice;      
    
            // Finally, do the maths
            const adultPrice = adults * (adultTripPrice + adultVehiclePrice)
            const childrenPrice = children * (childrenTripPrice + childrenVehiclePrice)
    
            // return the value
            return adultPrice + childrenPrice;                  
          }
    
          function updateTotal() {
            const total = calculateTotal();
            console.log(total);
            document.querySelector('#totalPrice').innerHTML = total;
          }