/// <reference path="jquery.js" />

/// <summary>
/// Set ups all the event handlers needed for 
/// the shopping basket.
/// </summary>
function SetUpBasketJavascriptEventHandlers()
{   
  // Registers 'CheckIsInt' function for keypress event on textbox, this function
  // makes sure only positive integers can be entered for quantity.
  $('.quantity_textbox').keypress(function(event) { CheckIsInt(event) });
    
  // Registers 'CalculateLineTotal' function for change event on textbox, 
  // this function calculates the line total.
  $('.quantity_textbox').change(function(event) { CalculateLineTotal(event) });
}

/// <summary>
/// Populates the line total for item i.e.
/// voucher value x quantity.
/// </summary>
/// <param name="event">
/// Event linking to textbox change event.
/// </param>
/// <example>
/// $('.quantity_textbox').change(function(event) { CalculateLineTotal(event) });
/// </example>
function CalculateLineTotal(event)
{
  var decLineTotal = 0.0;
  var parentTr = null;
  var intItemCost = 0;
  var intQuantity = 0;
  var spnTotal = null;
  
  try
  {
    // Get surrounding 'tr'.
    parentTr = $(event.target).parent().parent()[0];

    // Get item cost from 'lblItemCost'.
    intItemCost = parseFloat(parentTr.children[1].children[0].innerHTML);
  
    // Get user entered quantity from 'txtQuantity'.
    intQuantity = parentTr.children[2].children[0].value;
  
    // Get the line total text box.
    spnTotal = parentTr.children[3];
  
    // Calculate line total.
    decLineTotal = parseFloat(intItemCost * intQuantity);
    
    // If problem calculating line total, set to 0.
    if (isNaN(decLineTotal))
    {
      decLineTotal = 0.0;
    }
    
    // Update Grand Total.
    CalculateGrandTotal();
  }
  catch(error)
  {
    decLineTotal = 0.0;
  }
  finally
  {
    $(spnTotal).html("&#163;" + (decLineTotal.toFixed(2)));
  } 
}

/// <summary>
/// Populates the grand total.
/// </summary>
/// <param name="event">
/// Event linking to textbox change event.
/// </param>
/// <example>
/// $('.quantity_textbox').change(function(event) { CalculateLineTotal(event) });
/// </example>
function CalculateGrandTotal()
{
  var decGrandTotal = 0.0;
  var trItemRow = null;
  var spnGrandTotal = null;
  var intItemCost = 0;
  var intQuantity = 0;
  
  try
  {
    // Get basket item table rows i.e. '<tr class="item">'.
    trItemRow = $('.item');
    
    // Loop through each item row.
    $(trItemRow.each( function(){
        // Get item cost from 'lblItemCost'.
        intItemCost = parseFloat(this.children[1].children[0].innerHTML);
      
        // Get user entered quantity from 'txtQuantity'.
        intQuantity = parseInt(this.children[2].children[0].value);
      
        // Increment Grand Total.
        decGrandTotal += parseFloat(intItemCost * intQuantity);
    }));
    
    // Get Grand Total label.
    spnGrandTotal = $('#lblGrandTotal');
  }
  catch(error)
  {
    decGrandTotal = 0.0;
  }
  finally
  {
    $(spnGrandTotal).html((decGrandTotal.toFixed(2)));
  } 
}

/// <summary>
/// Reject input in quantity text box if not a positive integer.
/// </summary>
/// <param name="event">
/// Event linking to textbox keypress event.
/// </param>
/// <example>
/// $('.quantity_textbox').keypress(function(event) { CheckIsInt(event) });
/// </example>
function CheckIsInt(event)
{
  var asciicode = (event.charCode ? event.charCode : event.keyCode);
  
  if (asciicode && (asciicode < 48 || asciicode > 57))
  {
    event.preventDefault();
  }
}

// Register events needed by basket functionality.
$(document).ready(SetUpBasketJavascriptEventHandlers);




