function validate_null_fields() {
  errors = 0;
  $(':input.required').each(function(index) {
    if ($(this).val() == '') {
      errors++;
      $('.error#e_'+$(this).attr('id')).fadeIn('fast');
    } else{
      $('.error#e_'+$(this).attr('id')).hide();
    };
  });
  if (errors == 0) {return true};
}

$(document).ready(
 function (){
   // update the plug-in version
   $("#idPluginVersion").text($.Calculation.version);

/*     
   $.Calculation.setDefaults({
     onParseError: function(){
       this.css("backgroundColor", "#cc0000")
     }
     , onParseClear: function (){
       this.css("backgroundColor", "");
     }
   });
*/
   
   // bind the recalc function to the quantity fields
   $("input[@name^=qty_item_]").bind("keyup", recalc);
   // run the calculation function now
   recalc();

   // automatically update the "#totalSum" field every time
   // the values are changes via the keyup event
   $("input[@name^=sum]").sum("keyup", "#totalSum");
   
   // automatically update the "#totalAvg" field every time
   // the values are changes via the keyup event
   $("input[@name^=avg]").avg({
     bind:"keyup"
     , selector: "#totalAvg"
     // if an invalid character is found, change the background color
     , onParseError: function(){
       this.css("backgroundColor", "#cc0000")
     }
     // if the error has been cleared, reset the bgcolor
     , onParseClear: function (){
       this.css("backgroundColor", "");
     }
   });

   // automatically update the "#minNumber" field every time
   // the values are changes via the keyup event
   $("input[@name^=min]").min("keyup", "#numberMin");

   // automatically update the "#minNumber" field every time
   // the values are changes via the keyup event
   $("input[@name^=max]").max("keyup", "#numberMax");

   // this calculates the sum for some text nodes
   $("#idTotalTextSum").click(
     function (){
       // get the sum of the elements
       var sum = $(".textSum").sum();

       // update the total
       $("#totalTextSum").text("$" + sum.toString());
     }
   );

   // this calculates the average for some text nodes
   $("#idTotalTextAvg").click(
     function (){
       // get the average of the elements
       var avg = $(".textAvg").avg();

       // update the total
       $("#totalTextAvg").text(avg.toString());
     }
   );

 }
);

function recalc(){
 $("[@id^=total_item]").calc(
   // the equation to use for the calculation
   "qty * price",
   // define the variables used in the equation, these can be a jQuery object
   {
     qty: $("input[@name^=qty_item_]"),
     price: $("[@id^=price_item_]")
   },
   // define the formatting callback, the results of the calculation are passed to this function
   function (s){
     // return the number as a dollar amount
        // ADRIAN EDIT = CHANGED FUNCTION TO RETURN BLANK FIELD IF NO QUALITY SELECTED...

     if (s == 0) {return ""}
     else {return s.toFixed(2)}
     
        // OLD CODE
        // return "$" + s.toFixed(2)
   },
   // define the finish callback, this runs after the calculation has been complete
   function ($this){
     // sum the total of the $("[@id^=total_item]") selector
     var sum = $this.sum();
     
     $("#grandTotal").text(
       // round the results to 2 digits
       "$" + sum.toFixed(2)
     );
   }
 );
}