3

This is a small part of a much longer form (the Pink, Green, and Yellow boxes/arrows have been added for clarity):

Original: enter image description here

Marked Up: enter image description here

Basically - As numbers are entered into quarters -> checks (the pink box), the values auto sum and auto populate the read only field "Total Cash" (this is already working). Then, once the "Refunds Paid in" Field has a value entered (including zero) it auto sums with "Total Cash" and populates the "final total" Field - this is all separate for each column. That works - but I wish I didn't have to force users to enter a value in Refunds Paid in unless there IS a value. Lastly - I also need "Final Totals" from the "Deposit" and "Manager Station" columns to Auto sum to "Total to Deposit" That doesn't seem to be working at all...

Lastly - I tried to implement a button to recalculate all totals before they click "submit" to turn this into a PDF - I'm also stumped there. that has the name and ID calc - I'm open to any best practices solutions on any of this though. I'd be more than happy to make heavy modifications - as a newbie, a lot of this employs "seat-of-my-pants" coding.

I'm VERY new to Javascript and JQuery - so please be gentle? Code below (the portions relevant to this question, anyway):

HTML

<tr>
    <td class="label" colspan="4">Deposit / Safe / Manager Station Count</td>
</tr>
<tr>
    <td class="null"></td>
    <td class="label">Deposit</td>
    <td class="label">Manager Station</td>
    <td class="label">Safe</td>
</tr>
<tr>
    <td class="label">Quarters</td>
    <td class="field"><input type="text" name="depQuarters" class="dep" tabindex="31" /></td>
    <td class="field"><input type="text" name="manQuarters" class="man" tabindex="41" /></td>
    <td class="field"><input type="text" name="safeQuarters" class="safe" tabindex="51" /></td>
</tr>
<tr>
    <td class="label">Coins</td>
    <td class="field"><input type="text" name="depCoins" class="dep" tabindex="32" /></td>
    <td class="field"><input type="text" name="manCoins" class="man" tabindex="42" /></td>
    <td class="field"><input type="text" name="safeCoins" class="safe" tabindex="52" /></td>
</tr>
<tr>
    <td class="label">$1 Bills</td>
    <td class="field"><input type="text" name="dep1Bills" class="dep" tabindex="33" /></td>
    <td class="field"><input type="text" name="man1Bills" class="man" tabindex="43" /></td>
    <td class="field"><input type="text" name="safe1Bills" class="safe" tabindex="53" /></td>
</tr>
<tr>
    <td class="label">$5 Bills</td>
    <td class="field"><input type="text" name="dep5Bills" class="dep" tabindex="34" /></td>
    <td class="field"><input type="text" name="man5Bills" class="man" tabindex="44" /></td>
    <td class="field"><input type="text" name="safe5Bills" class="safe" tabindex="54" /></td>
</tr>
<tr>
    <td class="label">$10 Bills</td>
    <td class="field"><input type="text" name="dep10Bills" class="dep" tabindex="35" /></td>
    <td class="field"><input type="text" name="man10Bills" class="man" tabindex="45" /></td>
    <td class="field"><input type="text" name="safe10Bills" class="safe" tabindex="55" /></td>
</tr>
<tr>
    <td class="label">$20 Bills</td>
    <td class="field"><input type="text" name="dep20Bills" class="dep" tabindex="36" /></td>
    <td class="field"><input type="text" name="man20Bills" class="man" tabindex="46" /></td>
    <td class="field"><input type="text" name="safe20Bills" class="safe" tabindex="56" /></td>
</tr>
<tr>
    <td class="label">$50 Bills</td>
    <td class="field"><input type="text" name="dep50Bills" class="dep" tabindex="37" /></td>
    <td class="field"><input type="text" name="man50Bills" class="man" tabindex="47" /></td>
    <td class="field"><input type="text" name="safe50Bills" class="safe" tabindex="57" /></td>
</tr>
<tr>
    <td class="label">$100 Bills</td>
    <td class="field"><input type="text" name="dep100Bills" class="dep" tabindex="38" /></td>
    <td class="field"><input type="text" name="man100Bills" class="man" tabindex="48" /></td>
    <td class="field"><input type="text" name="safe100Bills" class="safe" tabindex="58" /></td>
</tr>
<tr>
    <td class="label">Checks</td>
    <td class="field"><input type="text" name="depChecks" class="dep" tabindex="39" /></td>
    <td class="field"><input type="text" name="manChecks" class="man" tabindex="49" /></td>
    <td class="field"><input type="text" name="safeChecks" class="safe" tabindex="59" /></td>
</tr>
<tr>
    <td class="label">Total Cash</td>
    <td class="field"><input type="text" name="depTotal" id="depTotal" class="depFinalFactor" readonly /></td>
    <td class="field"><input type="text" id="manTotal" name="manTotal" class="manFinalFactor" readonly /></td>
    <td class="field"><input type="text" id="safeTotal" name="safeTotal" class="safeFinalFactor" readonly /></td>
</tr>
<tr>
    <td class="label">Refunds Paid In</td>
    <td class="field"><input type="text" name="depRefunds" id="depRef" class="depFinalFactor" tabindex="40" /></td>
    <td class="field"><input type="text" name="manRefunds" tabindex="50" class="manFinalFactor" /></td>
    <td class="field"><input type="text" name="safeRefunds" tabindex="60" class="safeFinalFactor" /></td>
</tr>
<tr>
    <td class="label">Final Total</td>
    <td class="field"><input type="text" name="depFinalTotal" id="depFinalTotal" readonly /></td>
    <td class="field"><input type="text" name="manFinalTotal" id="manFinalTotal" readonly /></td>
    <td class="field"><input type="text" name="safeFinalTotal" id="safeFinalTotal" readonly /></td>
</tr>
<tr>
    <td class="null" colspan="2"></td>
    <td class="label">Total to Deposit</td>
    <td class="field" id="totalToDeposit"></td>
</tr>
</table>
<input type="button" name="calc" id="calc" value="Recalculate Totals" />
<input style="float: right;" type="submit" name="btn_submit" />
</form>
</body>
</html>

Javascript/JQuery

$(document).ready(function(){

    //iterate through each textboxes and add keyup
    //handler to trigger sum event

    $(".accXPT1").each(function() {
        $(this).keyup(function(){
            calculateSumForInput(".accXPT1", "#accXPT1Total");
        });
    });
    $(".accXPT2").each(function() {
        $(this).keyup(function(){
            calculateSumForInput(".accXPT2", "#accXPT2Total");
        });
    });
    $(".accXPT3").each(function() {
        $(this).keyup(function(){
            calculateSumForInput(".accXPT3", "#accXPT3Total");
        });
    });


    $(".dispXPT1").each(function() {
        $(this).keyup(function(){
            calculateSumForInput(".dispXPT1", "#dispXPT1Total");
        });
    });
    $(".dispXPT2").each(function() {
        $(this).keyup(function(){
            calculateSumForInput(".dispXPT2", "#dispXPT2Total");
        });
    });
    $(".dispXPT3").each(function() {
        $(this).keyup(function(){
            calculateSumForInput(".dispXPT3", "#dispXPT3Total");
        });
    });


    $(".dep").each(function() {
        $(this).keyup(function(){
            calculateSumForInput(".dep", "#depTotal");
        });         
    });
    $(".man").each(function() {
        $(this).keyup(function(){
            calculateSumForInput(".man", "#manTotal");
        });
    });
    $(".safe").each(function() {
        $(this).keyup(function(){
            calculateSumForInput(".safe", "#safeTotal");
        });
    });


    $(".depFinalFactor").keyup(function() {
        var sum = 0;

        $(".depFinalFactor").each(function() {
        //add only if the value is number
            if(!isNaN(this.value) && this.value.length!=0) {
                sum += parseFloat(this.value);
            }
        });     


        mySum = sum.toFixed(2);

        if (mySum == $("#moneyAccountedFor").val()) {
            $("#totalToDeposit").css("color", "green");
        } else {
            $("#totalToDeposit").css("color", "red");
        }

        $("#depFinalTotal").val(mySum);
        $("#totalToDeposit").text(mySum);
    });

    $("#calc").on("click", function() {
        var sum = 0;

        $(".depFinalFactor").each(function() {
        //add only if the value is number
            if(!isNaN(this.value) && this.value.length!=0) {
                sum += parseFloat(this.value);
            }
        });     


        mySum = sum.toFixed(2);

        if (mySum == $("#moneyAccountedFor").val()) {
            $("#totalToDeposit").css("color", "green");
        } else {
            $("#totalToDeposit").css("color", "red");
        }

        $("#depFinalTotal").val(mySum);
        $("#totalToDeposit").text(mySum);
    });

    $(".manFinalFactor").keyup(function() {
        var sum = 0;

        $(".manFinalFactor").each(function() {
        //add only if the value is number
            if(!isNaN(this.value) && this.value.length!=0) {
                sum += parseFloat(this.value);
            }
        });     


        mySum = sum.toFixed(2);
        $("#manFinalTotal").val(mySum);
    });

    $(".safeFinalFactor").keyup(function() {
        var sum = 0;

        $(".safeFinalFactor").each(function() {
        //add only if the value is number
            if(!isNaN(this.value) && this.value.length!=0) {
                sum += parseFloat(this.value);
            }
        });     


        mySum = sum.toFixed(2);
        $("#safeFinalTotal").val(mySum);
    });

});

function calculateSum(myClass, myID) {

    var sum = 0;
    //iterate through each textboxes and add the values
    $(myClass).each(function() {

        //add only if the value is number
        if(!isNaN(this.value) && this.value.length!=0) {
            sum += parseFloat(this.value);
        }


    });
    //.toFixed() method will roundoff the final sum to 2 decimal places
    myTotal = sum.toFixed(2);
    $(myID).text(myTotal);
}

function calculateSumForInput(myClass, myID) {

    var sum = 0;
    //iterate through each textboxes and add the values
    $(myClass).each(function() {

        //add only if the value is number
        if(!isNaN(this.value) && this.value.length!=0) {
            sum += parseFloat(this.value);
        }


    });
    //.toFixed() method will roundoff the final sum to 2 decimal places
    myTotal = sum.toFixed(2);
    $(myID).val(myTotal);
}
1
  • 1
    Here is a fiddle if anyone wants to play around: jsfiddle.net/Mt9NX Commented Apr 11, 2013 at 15:56

1 Answer 1

1

That works - but I wish I didn't have to force users to enter a value in Refunds Paid in unless there IS a value.

Is it all what you want? Try out the below code

1/ Add this function

                function showAllTotal(){
                    var sum = 0;

                    $(".depFinalFactor").each(function() {
                    //add only if the value is number
                        if(!isNaN(this.value) && this.value.length!=0) {
                            sum += parseFloat(this.value);
                        }
                    });     


                    mySum = sum.toFixed(2);

                    if (mySum == $("#moneyAccountedFor").val()) {
                        $("#totalToDeposit").css("color", "green");
                    } else {
                        $("#totalToDeposit").css("color", "red");
                    }

                    $("#depFinalTotal").val(mySum);
                    $("#totalToDeposit").text(mySum);
                }

2/ Modify somewhere: add above function to each event

            $(".dep").each(function() {
                    $(this).keyup(function(){
                        calculateSumForInput(".dep", "#depTotal");
                        showAllTotal();
                    });         
                });
                $(".man").each(function() {
                    $(this).keyup(function(){
                        calculateSumForInput(".man", "#manTotal");
                        showAllTotal();
                    });
                });
                $(".safe").each(function() {
                    $(this).keyup(function(){
                        calculateSumForInput(".safe", "#safeTotal");
                        showAllTotal();
                    });
                });

3/ Replace the function at "$(".depFinalFactor").keyup(function()" with below

            $(".depFinalFactor").keyup(function() {
                    showAllTotal();
            });

What I did is moving the function that summarizes total value to a function, and I reuse it each time user begin enter the number on one of fields from table. All in your code, nothing more!

Edited: I updated your code on fiddle also.

Sign up to request clarification or add additional context in comments.

1 Comment

Fixed! You are a life saver!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.