# Calculate subtotals, totals and postage

• Jul 19, 2007, 04:21
Charlie99
Calculate subtotals, totals and postage
Hi All,

Wondering if anyone can help me out with modifying the below script:

Code:

```<script language="JavaScript" type="text/javascript"> <!-- /* This script is Copyright (c) Paul McFedries and Logophilia Limited (http://www.mcfedries.com/). Permission is granted to use this script as long as this Copyright notice remains in place.*/ function CalculateTotal(frm) {     var order_total = 0             // Run through all the form fields     for (var i=0; i < frm.elements.length; ++i) {         // Get the current field         form_field = frm.elements[i]         // Get the field's name         form_name = form_field.name         // Is it a "product" field?         if (form_name.substring(0,4) == "PROD") {             // If so, extract the price from the name             item_price = parseFloat(form_name.substring(form_name.lastIndexOf("_") + 1))             // Get the quantity             item_quantity = parseInt(form_field.value)             // Update the order total             if (item_quantity >= 0) {                                 order_total += item_quantity * item_price             }         }     }             // Display the total rounded to two decimal places     frm.TOTAL.value = round_decimals(order_total, 2) } function round_decimals(original_number, decimals) {     var result1 = original_number * Math.pow(10, decimals)     var result2 = Math.round(result1)     var result3 = result2 / Math.pow(10, decimals)     return pad_with_zeros(result3, decimals) } function pad_with_zeros(rounded_value, decimal_places) {     // Convert the number to a string     var value_string = rounded_value.toString()         // Locate the decimal point     var decimal_location = value_string.indexOf(".")     // Is there a decimal point?     if (decimal_location == -1) {                 // If no, then all decimal places will be padded with 0s         decimal_part_length = 0                 // If decimal_places is greater than zero, tack on a decimal point         value_string += decimal_places > 0 ? "." : ""     }     else {         // If yes, then only the extra decimal places will be padded with 0s         decimal_part_length = value_string.length - decimal_location - 1     }         // Calculate the number of decimal places that need to be padded with 0s     var pad_total = decimal_places - decimal_part_length         if (pad_total > 0) {                 // Pad the string with 0s         for (var counter = 1; counter <= pad_total; counter++)             value_string += "0"         }     return value_string } //--> </script>```
I got the script from this url:

http://www.mcfedries.com/JavaScript/OrderTotals.asp to see in action.

I need to modify it so that:
it will also calculate totals for individual product items as well as the total &

And also a postage value which is based on the total order quantities i.e. first item = \$7, then \$1 for each item after that.

Any help would be much appreciated.

Thank you.
• Jul 19, 2007, 05:53
Charlie99
So have got handling and grand total covered but wondering if there is an easy way to get individual item totals still...

Code:

```<script language="JavaScript" type="text/javascript"> <!-- /* This script is Copyright (c) Paul McFedries and Logophilia Limited (http://www.mcfedries.com/). Permission is granted to use this script as long as this Copyright notice remains in place.*/ function CalculateTotal(frm) {     var order_total = 0         var handling = 0     // Run through all the form fields     for (var i=0; i < frm.elements.length; ++i) {         // Get the current field         form_field = frm.elements[i]         // Get the field's name         form_name = form_field.name         // Is it a "product" field?         if (form_name.substring(0,4) == "PROD") {             // If so, extract the price from the name             item_price = parseFloat(form_name.substring(form_name.lastIndexOf("_") + 1))             // Get the quantity             item_quantity = parseInt(form_field.value)             // Update the order total             if (item_quantity >= 0) {                                 order_total += item_quantity * item_price                                 handling += item_quantity * 1             }         }     }             // Display the total rounded to two decimal places     frm.TOTAL.value = round_decimals(order_total, 2)         //Calculate handling and display         handling = handling + 7         frm.HANDLING.value = round_decimals(handling, 2)         //Calculate grand total and display         total_2 = order_total + handling         frm.TOTAL2.value = round_decimals(total_2, 2) } function round_decimals(original_number, decimals) {     var result1 = original_number * Math.pow(10, decimals)     var result2 = Math.round(result1)     var result3 = result2 / Math.pow(10, decimals)     return pad_with_zeros(result3, decimals) } function pad_with_zeros(rounded_value, decimal_places) {     // Convert the number to a string     var value_string = rounded_value.toString()         // Locate the decimal point     var decimal_location = value_string.indexOf(".")     // Is there a decimal point?     if (decimal_location == -1) {                 // If no, then all decimal places will be padded with 0s         decimal_part_length = 0                 // If decimal_places is greater than zero, tack on a decimal point         value_string += decimal_places > 0 ? "." : ""     }     else {         // If yes, then only the extra decimal places will be padded with 0s         decimal_part_length = value_string.length - decimal_location - 1     }         // Calculate the number of decimal places that need to be padded with 0s     var pad_total = decimal_places - decimal_part_length         if (pad_total > 0) {                 // Pad the string with 0s         for (var counter = 1; counter <= pad_total; counter++)             value_string += "0"         }     return value_string } //--> </script>```