/* ***************************************************************************/
/*                                                                           */
/*        Adaptive Future Systems Limited Copyright 1999.                    */
/*                   England.                                                */
/*                                                                           */
/* orderscript.js                                                            */
/* by D. C. Jarman, Melissa WebMasters                                       */
/* Defines unit prices and global javascript functions.                      */
/*                                                                           */
/* Edit Record                                                               */
/* Date  Issue  Details.                                                     */
/* ------------------------------------------------------------------------- */
/*                                                                           */
/*                                                                           */
/* ***************************************************************************/
/* Note.                                                                     */
/* Security and password functions are not designed to be really secure      */
/* detering the user who can't be bothered to look at the source and figure  */
/* it out.                                                                   */
/*                                                                           */
/* ***************************************************************************/
// Decrement to actual count of fields

var DelRow;
var SingleBags = false;


function incCnt( RowNo )
{
  var QtyField = document.forms[0].elements[((RowNo-1)*3)+fldoffset]
  var Cnt = 0
  Cnt = parseInt( QtyField.value ) + 1
  QtyField.value = Cnt
  calcPrice( RowNo )
}

function calcPrice( RowNo )
{
  var QtyField   = document.forms[0].elements[((RowNo-1)*3)+fldoffset]
  var PriceField = document.forms[0].elements[((RowNo-1)*3)+fldoffset+1]
  var SubTotal = parseInt( QtyField.value ) * unitprice[RowNo] * packsize[RowNo]
  var SubTotalPrice = "£"+ ( Math.round( SubTotal ) / 100 )
  var Dp = ( SubTotalPrice.indexOf( "." ) )
  if ( Dp == -1 )
    PriceField.value = SubTotalPrice + ".00"
  else if ( Dp == SubTotalPrice.length - 2 )
    PriceField.value = SubTotalPrice + "0"
  else if ( Dp == SubTotalPrice.length - 3 )
    PriceField.value = SubTotalPrice
  else
    PriceField.value = "~" + SubTotalPrice.substring( 0, Dp + 2 )

  var Total = 0
  var PriceStr
  for (var i = 1; i <= maxFlds; i++ )
  {
    PriceField = document.forms[0].elements[((i-1)*3)+fldoffset+1]
    PriceStr = PriceField.value
    
    Total = Total + parseFloat( PriceStr.substr( 1, PriceStr.length ) )
  }

  var TotalPriceField = document.forms[0].TotalPrice
  var TotalPriceStr = "£" + Total
  Dp = ( TotalPriceStr.indexOf( "." ) )
  if ( Dp == -1 )
    TotalPriceField.value = TotalPriceStr + ".00"
  else if ( Dp == TotalPriceStr.length - 2 )
    TotalPriceField.value = TotalPriceStr + "0"
  else if ( Dp == TotalPriceStr.length - 3 )
    TotalPriceField.value = TotalPriceStr
  else
    // Help deal with dodgy divide rounding error, emphasis approxiamate +/- 1p
//    TotalPriceField.value = "~" + TotalPriceStr.substring( 0, Dp + 3 )
    TotalPriceField.value = TotalPriceStr.substring( 0, Dp + 3 )
  
  if ( ( DelRow > 0 ) && ( RowNo != DelRow ) )
  {
    calcPrice( DelRow );
    DelRow = 0;
  }
}

function GetPrice( RowNo, FldName, UnitSizeName )
{
  if ( packsize[RowNo] == 1 )
    document.write( '<td>1 ' + UnitSizeName )
  else
    document.write( '<td>1 ' + UnitSizeName + ' (' + packsize[RowNo] + ' units)' )

  if ( unitprice[RowNo] >= 100 )
    document.write( '<td>£' + unitprice[RowNo] / 100 + " per unit" )
  else
    document.write( '<td>' + unitprice[RowNo] + "p per unit" )

  if ( FldName == "Del" )
  {
    document.write( '<td><button disabled onClick="incCnt(' + RowNo + ')" title="Delivery charges are required unless special arrangements are made to collect. Phone for deatils" name=Btn' + FldName + '><IMG src="pics/mail.gif"  border=0></button>' )
    document.write( '<input readonly type=text value=1 size=2 name=Qty' + FldName + ' onChange="calcPrice(' + RowNo + ')">' )
    document.write( '<td><input readonly type=text value="' + unitprice[RowNo] / 100 + '" size=7 name=Price' + FldName + '>' )
    DelRow = RowNo;
  }
  else
  {
    document.write( '<td><button onClick="incCnt(' + RowNo + ')" title="Purchase 1 ' + UnitSizeName + '" name=Btn' + FldName + '><IMG src="pics/trolley.gif"  border=0></button>' )
    document.write( '<input type=text value=0 size=2 name=Qty' + FldName + ' onChange="calcPrice(' + RowNo + ')">' )
    document.write( '<td><input readonly type=text value="0.00" size=7 name=Price' + FldName + '>' )
  }
}




var CsUserName = new String( "" );
var CsUserEmail = new String( "" );
var CsUserDelAddr = new String( "" );
var CsUserTradePwd = new String( "" );
var expdate = new Date();

function GetGlobalData()
{
  // Set cookie to expire in 2 years
  //
  // 1000 milliseconds  (milliseconds per second)
  // * 60 milliseconds  (seconds per minute)
  // * 60 milliseconds  (minutes per hour)
  // * 24 milliseconds  (hours per day)
  // * 730 milliseconds  (days)
  // -----------------
  // = 730 days
  //
  expdate.setTime (expdate.getTime() + (1000*60*60*24*730));
  DelLim = "$";

  // Cookie does not exist processing
  if(getCookie("_CrazySand") == null)
  {
    // No cookie, default
    CsUserName = "";
    CsUserEmail = "";
    CsUserDelAddr = "";
    CsUserTradePwd = "";
  	SaveData = CsUserName + DelLim + CsUserEmail + DelLim + CsUserDelAddr + DelLim + CsUserTradePwd + DelLim + "*";
  	setCookie("_CrazySand", SaveData, expdate);
  }

  // Cookie exists processing
  else
  {
  	SaveData = getCookie("_CrazySand");
  	EndIndex = SaveData.indexOf( DelLim );
  	CsUserName = SaveData.substring(0,EndIndex);

  	StartIndex = EndIndex + 1;
  	EndIndex = SaveData.indexOf( DelLim, StartIndex );
  	CsUserEmail = SaveData.substring(StartIndex,EndIndex);

  	StartIndex = EndIndex + 1;
  	EndIndex = SaveData.indexOf( DelLim, StartIndex );
  	CsUserDelAddr = SaveData.substring(StartIndex,EndIndex);

  	StartIndex = EndIndex + 1;
  	EndIndex = SaveData.indexOf( DelLim, StartIndex );
  	CsUserTradePwd = SaveData.substring(StartIndex,EndIndex);

  }
}

var
  PWD1  = "sandy";

function checkPwd( Pwd, answer )
{
  if ( Pwd.toLowerCase() == PWD1 )
  {
    return true;
  }
  else
    return false;
}


function SetGlobalData()
{
  expdate.setTime (expdate.getTime() + (1000*60*60*24*10));
  DelLim = "$";
  SaveData = CsUserName + DelLim + CsUserEmail + DelLim + CsUserDelAddr + DelLim + CsUserTradePwd + DelLim + "*";
  setCookie("_CrazySand", SaveData, expdate);
}

function DelGlobalData()
{
  delCookie("_CrazySand");
  location.reload();
}

function DelCookieButton()
{
  if ( ( CsUserName ) && ( CsUserName != "" ) )
  {
    document.write( "<center>" );
    document.write( "<button onclick='DelGlobalData();'>I am not " + CsUserName + "</button>" );
    document.write( "</center>" );
  }
}








<!-- Begin
var Cards = new makeArray(8);
Cards[0] = new CardType("MasterCard", "51,52,53,54,55", "16");
var MasterCard = Cards[0];
Cards[1] = new CardType("VisaCard", "4", "13,16");
var VisaCard = Cards[1];
Cards[2] = new CardType("AmExCard", "34,37", "15");
var AmExCard = Cards[2];
Cards[3] = new CardType("DinersClubCard", "30,36,38", "14");
var DinersClubCard = Cards[3];
Cards[4] = new CardType("DiscoverCard", "6011", "16");
var DiscoverCard = Cards[4];
Cards[5] = new CardType("enRouteCard", "2014,2149", "15");
var enRouteCard = Cards[5];
Cards[6] = new CardType("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
var JCBCard = Cards[6];
var LuhnCheckSum = Cards[7] = new CardType();

/*************************************************************************\
CheckCardNumber(form)
function called when users click the "check" button.
\*************************************************************************/
function CheckCardNumber(form) {
  var tmpyear;
  if (form.CardNumber.value.length == 0) {
    alert("Please enter a Card Number.");
    form.CardNumber.focus();
    return false;
  }
  if (form.ExpYear.value.length == 0) {
    alert("Please enter the Expiration Year.");
    form.ExpYear.focus();
    return false;
  }
  if (form.ExpYear.value.length == 1) {
    form.ExpYear.value = '0' + form.ExpYear.value;
  }
  if (form.ExpYear.value > 96)
    tmpyear = "19" + form.ExpYear.value;
  else if (form.ExpYear.value < 21)
    tmpyear = "20" + form.ExpYear.value;
  else {
    alert("The Expiration Year is not valid.");
    return false;
  }
  tmpmonth = form.ExpMon.options[form.ExpMon.selectedIndex].value;
  // The following line doesn't work in IE3, you need to change it
  // to something like "(new CardType())...".
  // if (!CardType().isExpiryDate(tmpyear, tmpmonth)) {
  if (!(new CardType()).isExpiryDate(tmpyear, tmpmonth)) {
    alert("This card has already expired.");
    return  false;
  }
  card = form.CardType.options[form.CardType.selectedIndex].value;
  var retval = eval(card + ".checkCardNumber(\"" + form.CardNumber.value + "\", " + tmpyear + ", " + tmpmonth + ");");
  cardname = "";
  if (!retval)
  {
    // The cardnumber has the valid luhn checksum, but we want to know which
    // cardtype it belongs to.
    for (var n = 0; n < Cards.size; n++) {
      if (Cards[n].checkCardNumber(form.CardNumber.value, tmpyear, tmpmonth)) {
        cardname = Cards[n].getCardType();
        break;
      }
    }
    if (cardname.length > 0) {
      alert("This looks like a " + cardname + " number, not a " + card + " number.");
    }
    else {
      alert("This card number is not valid.");
    }
  }
  return retval;
}
/*************************************************************************\
Object CardType([String cardtype, String rules, String len, int year,
int month])
cardtype    : type of card, eg: MasterCard, Visa, etc.
rules       : rules of the cardnumber, eg: "4", "6011", "34,37".
len         : valid length of cardnumber, eg: "16,19", "13,16".
year        : year of expiry date.
month       : month of expiry date.
eg:
var VisaCard = new CardType("Visa", "4", "16");
var AmExCard = new CardType("AmEx", "34,37", "15");
\*************************************************************************/
function CardType() {
  var n;
  var argv = CardType.arguments;
  var argc = CardType.arguments.length;
  
  this.objname = "object CardType";
  
  var tmpcardtype = (argc > 0) ? argv[0] : "Unknown Card";
  var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
  var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";
  
  this.setCardNumber = setCardNumber;  // set CardNumber method.
  this.setCardType = setCardType;  // setCardType method.
  this.setLen = setLen;  // setLen method.
  this.setRules = setRules;  // setRules method.
  this.setExpiryDate = setExpiryDate;  // setExpiryDate method.
  
  this.setCardType(tmpcardtype);
  this.setLen(tmplen);
  this.setRules(tmprules);
  if (argc > 4)
    this.setExpiryDate(argv[3], argv[4]);
  
  this.checkCardNumber = checkCardNumber;  // checkCardNumber method.
  this.getExpiryDate = getExpiryDate;  // getExpiryDate method.
  this.getCardType = getCardType;  // getCardType method.
  this.isCardNumber = isCardNumber;  // isCardNumber method.
  this.isExpiryDate = isExpiryDate;  // isExpiryDate method.
  this.luhnCheck = luhnCheck;// luhnCheck method.
  return this;
}

/*************************************************************************\
boolean checkCardNumber([String cardnumber, int year, int month])
return true if cardnumber pass the luhncheck and the expiry date is
valid, else return false.
\*************************************************************************/
function checkCardNumber() {
  var argv = checkCardNumber.arguments;
  var argc = checkCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
  var year = (argc > 1) ? argv[1] : this.year;
  var month = (argc > 2) ? argv[2] : this.month;
  
  this.setCardNumber(cardnumber);
  this.setExpiryDate(year, month);
  
  if (!this.isCardNumber())
    return false;
  if (!this.isExpiryDate())
    return false;
  
  return true;
}
/*************************************************************************\
String getCardType()
return the cardtype.
\*************************************************************************/
function getCardType() {
  return this.cardtype;
}
/*************************************************************************\
String getExpiryDate()
return the expiry date.
\*************************************************************************/
function getExpiryDate() {
  return this.month + "/" + this.year;
}
/*************************************************************************\
boolean isCardNumber([String cardnumber])
return true if cardnumber pass the luhncheck and the rules, else return
false.
\*************************************************************************/
function isCardNumber() {
  var argv = isCardNumber.arguments;
  var argc = isCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
  if (!this.luhnCheck())
    return false;
  
  for (var n = 0; n < this.len.size; n++)
    if (cardnumber.toString().length == this.len[n]) {
      for (var m = 0; m < this.rules.size; m++) {
        var headdigit = cardnumber.substring(0, this.rules[m].toString().length);
        if (headdigit == this.rules[m])
          return true;
      }
      return false;
    }
    return false;
}

/*************************************************************************\
boolean isExpiryDate([int year, int month])
return true if the date is a valid expiry date,
else return false.
\*************************************************************************/
function isExpiryDate() {
  var argv = isExpiryDate.arguments;
  var argc = isExpiryDate.arguments.length;
  
  year = argc > 0 ? argv[0] : this.year;
  month = argc > 1 ? argv[1] : this.month;
  
  if (!isNum(year+""))
    return false;
  if (!isNum(month+""))
    return false;
  today = new Date();
  expiry = new Date(year, month);
  if (today.getTime() > expiry.getTime())
    return false;
  else
    return true;
}

/*************************************************************************\
boolean isNum(String argvalue)
return true if argvalue contains only numeric characters,
else return false.
\*************************************************************************/
function isNum(argvalue) {
  argvalue = argvalue.toString();
  
  if (argvalue.length == 0)
    return false;
  
  for (var n = 0; n < argvalue.length; n++)
    if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9")
      return false;
    
    return true;
}

/*************************************************************************\
boolean luhnCheck([String CardNumber])
return true if CardNumber pass the luhn check else return false.
Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck() {
  var argv = luhnCheck.arguments;
  var argc = luhnCheck.arguments.length;
  
  var CardNumber = argc > 0 ? argv[0] : this.cardnumber;
  
  if (! isNum(CardNumber)) {
    return false;
  }
  
  var no_digit = CardNumber.length;
  var oddoeven = no_digit & 1;
  var sum = 0;
  
  for (var count = 0; count < no_digit; count++) {
    var digit = parseInt(CardNumber.charAt(count));
    if (!((count & 1) ^ oddoeven)) {
      digit *= 2;
      if (digit > 9)
        digit -= 9;
    }
    sum += digit;
  }
  if (sum % 10 == 0)
    return true;
  else
    return false;
}

/*************************************************************************\
ArrayObject makeArray(int size)
return the array object in the size specified.
\*************************************************************************/
function makeArray(size) {
  this.size = size;
  return this;
}

/*************************************************************************\
CardType setCardNumber(cardnumber)
return the CardType object.
\*************************************************************************/
function setCardNumber(cardnumber) {
  this.cardnumber = cardnumber;
  return this;
}

/*************************************************************************\
CardType setCardType(cardtype)
return the CardType object.
\*************************************************************************/
function setCardType(cardtype) {
  this.cardtype = cardtype;
  return this;
}

/*************************************************************************\
CardType setExpiryDate(year, month)
return the CardType object.
\*************************************************************************/
function setExpiryDate(year, month) {
  this.year = year;
  this.month = month;
  return this;
}

/*************************************************************************\
CardType setLen(len)
return the CardType object.
\*************************************************************************/
function setLen(len) {
  // Create the len array.
  if (len.length == 0 || len == null)
    len = "13,14,15,16,19";
  
  var tmplen = len;
  n = 1;
  while (tmplen.indexOf(",") != -1) {
    tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
    n++;
  }
  this.len = new makeArray(n);
  n = 0;
  while (len.indexOf(",") != -1) {
    var tmpstr = len.substring(0, len.indexOf(","));
    this.len[n] = tmpstr;
    len = len.substring(len.indexOf(",") + 1, len.length);
    n++;
  }
  this.len[n] = len;
  return this;
}

/*************************************************************************\
CardType setRules()
return the CardType object.
\*************************************************************************/
function setRules(rules) {
  // Create the rules array.
  if (rules.length == 0 || rules == null)
    rules = "0,1,2,3,4,5,6,7,8,9";
  
  var tmprules = rules;
  n = 1;
  while (tmprules.indexOf(",") != -1) {
    tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
    n++;
  }
  this.rules = new makeArray(n);
  n = 0;
  while (rules.indexOf(",") != -1) {
    var tmpstr = rules.substring(0, rules.indexOf(","));
    this.rules[n] = tmpstr;
    rules = rules.substring(rules.indexOf(",") + 1, rules.length);
    n++;
  }
  this.rules[n] = rules;
  return this;
}





function WriteCCN()
{

  document.write( '<tr><td align=right valign=center>Credit Card Number' );
  document.write( '<td><input name="CardNumber" size="16" maxlength="19">' );
  document.write( '<tr><td align=right valign=center>Card Type:<td>' );
  document.write( '<select name="CardType">' );
  document.write( '<option value="MasterCard">MasterCard' );
  document.write( '<option value="VisaCard">Visa' );
  document.write( '<option value="AmExCard">American Express' );
  document.write( '<option value="DinersClubCard">Diners Club' );
  document.write( '<option value="DiscoverCard">Discover' );
  document.write( '<option value="enRouteCard">enRoute' );
  document.write( '<option value="JCBCard">JCB' );
  document.write( '</select>' );

  document.write( '<tr><td align=right valign=center>Expiration Date: Month<td>' );
  document.write( '  <select name="ExpMon">' );
  document.write( '<option value="1" selected>1' );
  document.write( '<option value="2">2' );
  document.write( '<option value="3">3' );
  document.write( '<option value="4">4' );
  document.write( '<option value="5">5' );
  document.write( '<option value="6">6' );
  document.write( '<option value="7">7' );
  document.write( '<option value="8">8' );
  document.write( '<option value="9">9' );
  document.write( '<option value="10">10' );
  document.write( '<option value="11">11' );
  document.write( '<option value="12">12' );
  document.write( '</select>' );
  document.write( 'Year <input name="ExpYear" size="2" maxlength="2">(Range: 1997~2020)<br>' );
  document.write( '<tr>' );
}



function FillKnownData( FormName )
{
  IsLoading = true;
  GetGlobalData();
  if ( ( CsUserName ) && ( CsUserName != "" ) )
    FormName.UserName.value = CsUserName;
  if ( ( CsUserEmail ) && ( CsUserEmail != "" ) )
    FormName.email.value = CsUserEmail;
  if ( ( CsUserDelAddr ) && ( CsUserDelAddr != "" ) )
    FormName.DelAddr.value = CsUserDelAddr;
  IsLoading = false;
}

function SaveGlobalData()
{
  if ( IsLoading )
    return;
  if ( document.Invoice_Form.UserName.value != "" )
    CsUserName = document.Invoice_Form.UserName.value;
  if ( document.Invoice_Form.email.value != "" )
    CsUserEmail = document.Invoice_Form.email.value;
  if ( document.Invoice_Form.DelAddr.value != "" )
    CsUserDelAddr = document.Invoice_Form.DelAddr.value;
  SetGlobalData();
  return true;
}

function ChangeOrderMechanism()
{
  CaseOrdering = !CaseOrdering;
  UpdateAllPrices( DisplayCat );
  
  if ( CaseOrdering )
    document.Order_Form.OrderMechBtn.innerHTML = "Press this button to Order by single units";
  else
    document.Order_Form.OrderMechBtn.innerHTML = "Press this button to Order by Whole Cases";
}

function Format( No, Dp )
{
  var Str = "" + Math.round( eval( No ) * Math.pow( 10, Dp ) );
  while ( Str.length <= Dp )
  {
    Str = "0" + Str;
  }
  
  var DecPoint = Str.length - Dp;
  return Str.substring( 0, DecPoint ) + '.' + Str.substring( DecPoint, Str.length );
}

function IncQty( FldName )
{
  Fld = eval( FldName );
  Cnt = parseInt( Fld.value ) + 1
  Fld.value = Cnt
}

function DecQty( FldName )
{
  Fld = eval( FldName );
  Cnt = parseInt( Fld.value ) - 1
  Fld.value = Cnt
  if ( Fld.value < 0 )
    Fld.value = 0;
}


function ChangeCat( NewCat )
{
  DisplayCat = NewCat;
  SaveOrderData();
}


function LoadOrderData()
{
  expdate.setTime (expdate.getTime() + (1000*60*60*24*32));
  DelLim = "$";

  // Cookie does not exist processing
  if(getCookie("_CrazySandOrder") == null)
  {
    // No cookie, default
    DisplayCat = "Bottles";
    SaveOrderData();
  }

  // Cookie exists processing
  else
  {
  	SaveData = getCookie("_CrazySandOrder");
  	EndIndex = SaveData.indexOf( DelLim );
  	DisplayCat = SaveData.substring(0,EndIndex);
  	Trol = 0;

    while ( EndIndex != -1 )
    {
      var Item = new Object();
      Item.Qty = 0;
      Item.Idx = -1;
      Item.Option = "";

    	StartIndex = EndIndex + 1;
    	EndIndex = SaveData.indexOf( DelLim, StartIndex );
    	if ( EndIndex != -1 )
    	{
  	    Item.Qty = parseInt( SaveData.substring(StartIndex,EndIndex) );

    	  StartIndex = EndIndex + 1;
    	  EndIndex = SaveData.indexOf( DelLim, StartIndex );
    	}
    	if ( EndIndex != -1 )
    	{
    	  Item.Idx = parseInt( SaveData.substring(StartIndex,EndIndex) );

    	  StartIndex = EndIndex + 1;
    	  EndIndex = SaveData.indexOf( DelLim, StartIndex );
    	}
    	if ( EndIndex != -1 )
    	{
    	  Item.Option = SaveData.substring(StartIndex,EndIndex);

        Trolley[Trol] = Item;
        Trol++;
      }
    }
  }
}


function SaveOrderData()
{
	SaveData = DisplayCat + DelLim;

  for ( i = 0; i < Trolley.length; i++ )
  {
    if ( Trolley[i].Qty > 0 )
    {
      SaveData += Trolley[i].Qty + DelLim + Trolley[i].Idx + DelLim + Trolley[i].Option + DelLim;
    }
  }
  
  SaveData += "*";
  setCookie( "_CrazySandOrder", SaveData, expdate ); 
}





function ShowCategoryTabs( Url )
{

  document.write( "<tr class=tabtable><td  class=tabtable colspan=8><table cellspacing=0 cellpadding=0 border=0 class=tabtable><tr class=tabtable>" );
  for ( i = 0; i < CatArray.length; i++ )
  {
    if ( CatArray[ i ] == DisplayCat )
    {
      document.write( "<td class=seltab><img border=0 src=gifs/crnlfton.gif>" );
      document.write( CatArray[ i ] );
      document.write( "<img border=0 src=gifs/crnrgton.gif></td> " );
    }
    else
    {
      document.write( "<td class=unseltab><img border=0 src=gifs/crnlftoff.gif> " );
      document.write( "<a class=unseltab title='Click to order " + CatArray[i] + 
                      "' onclick='ChangeCat(\"" + CatArray[ i ] + "\" )' href=" + Url + ".htm>" + 
                      CatArray[ i ] + "</a>" );
      document.write( "<img border=0 src=gifs/crnrgtoff.gif></td> " );
    }
  }

//  document.write( "<tr><td colspan=" + CatArray.length + " class=seltab> &nbsp; " );
  document.write( "</table>" );
  document.write( "<tr class=tabtable><td colspan=8 class=seltab> &nbsp; " );
}

function UpdateAllPrices( Cat )
{
  var  i;

  for ( i = 0; i < MaxProds; i++ )
  {
    if ( ( Cat == "all" ) || 
         ( Cat == ProdArray[i].Category )  )
    {
      WritePrice( i );
    }
  }
}

function WritePrice( i )
{
  var Price;
  
  if ( ( CaseOrdering ) &&
       ( ProdArray[i].PackSize > 1 ) )
  {
    Price = ProdArray[i].UnitPrice * ProdArray[i].PackSize;
  }
  else
  {
    Price = ProdArray[i].UnitPrice;
  }

  Field = eval( "Price" + ProdArray[i].Code );

  if ( Price >= 100 )
    Field.innerHTML = "£" + Format( (Price / 100), 2 ) + " ";
  else
    Field.innerHTML = Price + "p ";

  if ( ( CaseOrdering ) &&
       ( ProdArray[i].PackSize >  1 ) )
    Field.innerHTML += ProdArray[i].PackName;
  else
    Field.innerHTML += ProdArray[i].UnitName;

  Field = eval( "PackSize" + ProdArray[i].Code );
  if ( ( CaseOrdering ) &&
       ( ProdArray[i].PackSize >  1 ) )
    Field.innerHTML = ProdArray[i].PackSize + " " + ProdArray[i].UnitName + "s in a " + ProdArray[i].PackName;
  else
    Field.innerHTML = ProdArray[i].UnitName;
}




function WriteProducts( Cat, Url )
{
  var  i;
  var PicTitle = "";
  var FmtPos = -1;
  
  for ( i = 0; i < MaxProds; i++ )
  {
    if ( ( Cat == "all" ) || 
         ( Cat == ProdArray[i].Category )  )
    {
      document.write( "<tr>" );
      document.write( "<td>" + ProdArray[i].Code );
      
      FmtPos = ProdArray[i].Descrip.indexOf( "Crazy Sand" );
      if ( FmtPos == -1 )
      {
        document.write( "<td>" + ProdArray[i].Descrip );
      }
      else
      {
        document.write( "<td>" + ProdArray[i].Descrip.substring( 0, FmtPos ) + 
                        '<img src="gifs/crazysand.gif" width=100 height=30 border=0 alt="Crazy Sand">' +
                        ProdArray[i].Descrip.substring( FmtPos + 10, ProdArray[i].Descrip.length ) );
      }
      if ( ProdArray[i].Pic == "" )
      {
        document.write( "<td>" );
      }
      else
      {
        FmtPos = ProdArray[i].Descrip.indexOf( "<" );
        if ( FmtPos >= 0 )
          PicTitle = ProdArray[i].Descrip.substr( 0, FmtPos );
        else
          PicTitle = ProdArray[i].Descrip;
        document.write( "<td><img src='" + ProdArray[i].Pic + "' alt='" + PicTitle + "' width=50 height=50>" );
      }

      document.write( "<td>" );
      if ( ( ProdArray[i].Options == null ) || ( ProdArray[i].Options == "" ) )
      {
//        document.write( "No Options" );
      }
      else
      {
        // Some options here
        document.write( "<select id='Opt" + ProdArray[i].Code + "'>" );
        var StIdx = 0;
        var EndIdx = 0;
        while ( EndIdx != -1 )
        {
          EndIdx = ProdArray[i].Options.indexOf( ",", StIdx );
          if ( EndIdx != -1 )
          {
            document.write( "<option>" + ProdArray[i].Options.substring( StIdx, EndIdx ) );
            StIdx = EndIdx + 1;
          }
        }
        document.write( "</select>" );
      }

      var Price;
      if ( ( CaseOrdering ) &&
           ( ProdArray[i].PackSize >  1 )   )
      {
        Price = ProdArray[i].UnitPrice * ProdArray[i].PackSize;
      }
      else
      {
        Price = ProdArray[i].UnitPrice;
      }
     
      document.write( "<td id='Price" + ProdArray[i].Code + "'>" );

      if ( ProdArray[i].PackSize > 1 )
      {
        document.write( "<td id='PackSize" + ProdArray[i].Code + "'>" + ProdArray[i].PackSize + " " + ProdArray[i].PackName );
      }
      else
      {
        document.write( "<td id='PackSize" + ProdArray[i].Code + "'>Each" );
      }
      
      document.write( '<td><IMG onClick="DecQty(\'Order_Form.Qty' + ProdArray[i].Code + '\');" title="Decrease Quantity" src="gifs/minus.gif" border=0>' )
      document.write( "<input type=text value=1 size=3 name='Qty" + ProdArray[i].Code + "'>" );
      document.write( '<IMG onClick="IncQty(\'Order_Form.Qty' + ProdArray[i].Code + '\');" title="Increase Quantity" src="gifs/plus.gif"  border=0>' )
      document.write( '<td><button onClick="AddToTrolley(\'' + ProdArray[i].Code + '\',\'' + Url + '\');" title="Add to trolley" name=Btn' + ProdArray[i].Code + '><IMG src="gifs/trolley.gif"  border=0></button>' )
      
      WritePrice( i );
      
    } // this category
  } // for
}


function AddToTrolley( Code, Url )
{
  var Item = new Object();
  Item.Qty = 0;
  Item.Idx = -1;
  Item.Option = "";

  // Determine Index
  for ( i = 0; i < MaxProds; i++ )
  {
    if ( ProdArray[i].Code == Code )
      Item.Idx = i;
  }

  if ( Item.Idx < 0 )
    alert( "Product code " + Code + " not found" );

  QtyFld = eval( "Order_Form.Qty" + Code  );
  Item.Qty = parseInt( QtyFld.value );
  if ( ( CaseOrdering                       ) &&
       ( ProdArray[ Item.Idx ].PackSize > 1 )   )
    Item.Qty = Item.Qty * ProdArray[ Item.Idx ].PackSize;

  if ( ( ProdArray[ Item.Idx ].Options != null ) && ( ProdArray[ Item.Idx ].Options != "" ) )
  {
    OptionFld = eval( "Order_Form.Opt" + Code );
    Item.Option = OptionFld.options[ OptionFld.selectedIndex ].text;
  }

  
  // Has this item already been added ? 
  for ( i = 0; i < Trolley.length; i++ )
  {
    if ( ( Trolley[i].Idx    == Item.Idx    ) &&
         ( Trolley[i].Option == Item.Option )   )
    {
      // This has already been added to the list, so use increment quantity
      Trolley[i].Qty += Item.Qty;
      WriteInvoice(Url);
      return;
    }
  }
  
  // Not in the list, so add now.
  i = Trolley.length;
  Trolley[i] = Item;
  WriteInvoice(Url);
}

function CancelItem(Item,Url)
{
  Trolley[Item].Qty = 0;
  WriteInvoice(Url);
}

function WriteInvoice( Url )
{
CalcSandReqd();
  InvoiceHtml = "<table class=invoice width=75% align=center border=1>";
  Total = 0;
  ItemCount = 0;

  InvoiceHtml += "<td width=75 bgcolor=white>Click the <strong><font color=red>X</font></strong> in this column to delete this item<td bgcolor=white>Description and Options<td bgcolor=white>Quantity<td bgcolor=white>Cost";

  for ( i = 0; i < Trolley.length; i++ )
  {
    if ( Trolley[i].Qty > 0 )
    {
      j = Trolley[i].Idx;
      InvoiceHtml += "<tr>";      // Start a new row

      InvoiceHtml += "<input type=hidden name='No_"+i+"' value='" + i + "'>";

      InvoiceHtml += "<td align=center><button title='Remove from shopping trolley' onClick='CancelItem(" + i + ",\"" + Url + "\");'><img src='gifs/cross.gif'></button>";
      FmtPos = ProdArray[j].Descrip.indexOf( "<" );
      if ( FmtPos >= 0 )
        ItemTitle = ProdArray[j].Descrip.substr( 0, FmtPos );
      else
        ItemTitle = ProdArray[j].Descrip;

      ItemCount += Trolley[i].Qty;

      InvoiceHtml += "<td class=invoice>" + ItemTitle;
      if ( Trolley[i].Option != "" )
      {
        InvoiceHtml += " - " + Trolley[i].Option;
        InvoiceHtml += "<input type=hidden name='Code"+i+"' value='" + ProdArray[j].Code + Trolley[i].Option + "'>";
        InvoiceHtml += "<input type=hidden name='Item"+i+"' value='" + ItemTitle + Trolley[i].Option + "'>";
      }
      else
      {
        InvoiceHtml += "<input type=hidden name='Code"+i+"' value='" + ProdArray[j].Code + Trolley[i].Option + "'>";
        InvoiceHtml += "<input type=hidden name='Item"+i+"' value='" + ItemTitle + "'>";
      }
      
      if ( ProdArray[j].PackSize > 1 )
        Cases = Math.round( Trolley[i].Qty / ProdArray[j].PackSize );
      else
        Cases = 0;
      Units = Trolley[i].Qty - ( Cases * ProdArray[j].PackSize );
      InvoiceHtml += "<input type=hidden name='Quantity"+i+"' value='" + Trolley[i].Qty + "'>";

      InvoiceHtml += "<td class=invoice>";
      if ( Cases > 0 )
        InvoiceHtml += Cases + " " + ProdArray[j].PackName;
      if ( Cases > 1 ) InvoiceHtml += "s";
      InvoiceHtml += "<input type=hidden name='Quantity-cases"+i+"' value='" + Cases + "'>";
        
      if ( ( Cases > 0 ) && ( Units > 0 ) )
        InvoiceHtml += " and ";
      
      if ( Units > 0 )
        InvoiceHtml += Units + " " + ProdArray[j].UnitName;
      if ( Units > 1 ) InvoiceHtml += "s";
      
      InvoiceHtml += "<input type=hidden name='Quantity-units"+i+"' value='" + Units + "'>";
        
      InvoiceHtml += "<td align=right class=invoice>";
      Cost = Trolley[i].Qty * ProdArray[j].UnitPrice;
      Total += Cost;
      InvoiceHtml += "£" + Format( ( Cost / 100 ), 2 );
      InvoiceHtml += "<input type=hidden name='Price"+i+"' value='£ " + Format( ( Cost / 100 ), 2 ) + "'>";
    }
  }

  /* Add delivery cost */
      InvoiceHtml += "<tr>";      // Start a new row
      InvoiceHtml += "<input type=hidden name='No' value='Delivery Cost'>";

      InvoiceHtml += "<td align=center>&nbsp;";
      InvoiceHtml += "<td class=invoice>Delivery";
      InvoiceHtml += "<input type=hidden name='Code_Del' value='Delivery'>";
      InvoiceHtml += "<input type=hidden name='Item_Del' value='Calculated Delivery Cost'>";
      
      CalcDeliveryCost( );
      InvoiceHtml += "<td class=invoice>" + NoPallets + " pallets, " + NoPost + " by post";
      InvoiceHtml += "<input type=hidden name='Quantity_Del' value='1'>";
      InvoiceHtml += "<input type=hidden name='Quantity-cases_Del' value='" + NoPallets + " by pallet'>";
      InvoiceHtml += "<input type=hidden name='Quantity-units_Del' value='" + NoPost + " by post'>";
        
      InvoiceHtml += "<td align=right class=invoice>";
      Total += DelCost;
      InvoiceHtml += "£" + Format( ( DelCost / 100 ), 2 );
      InvoiceHtml += "<input type=hidden name='Price_Del' value='£ " + Format( ( DelCost / 100 ), 2 ) + "'>";
/* end of delivery */



  InvoiceHtml += "<tr>";      // Start a new row
  InvoiceHtml += "<td colspan=3 class=invoice>Total";
  InvoiceHtml += "<td align=right class=invoice>";
  InvoiceHtml += "£" + Format( ( Total / 100 ), 2 );
  Order_Form.TotalPrice.value = "£" + Format( ( Total / 100 ), 2 );
  InvoiceHtml += "</table></font>";

  InvoiceHtml += "<input type=hidden name='Total' value='£ " + Format( ( Total / 100 ), 2 ) + "'>";

  if ( Trolley.length == 0 )
  {
    return;
  }
  
  if ( Total == 0 )
  {
    trolley_img.innerHTML = '<a href="' + Url + '.htm#trolley"><img src=gifs/trolley.gif align=center alt="Click here to view your trolley"><br>';
    trolley_img.innerHTML += 'Your trolley is empty</a>';
  }
  else
  {
    trolley_img.innerHTML = '<a href="' + Url + '.htm#trolley"><img src=gifs/trolleyfull.gif align=center alt="Click here to view your trolley"><br>';
    if ( ItemCount == 1 )
      trolley_img.innerHTML += 'You have one item in your trolley</a>';
    else
      trolley_img.innerHTML += 'You have ' + ItemCount + ' items in your trolley</a>';
  }  
  Invoice_form.innerHTML = InvoiceHtml;
}



function CheckOrder( MyForm, CheckCard )
{
  if ( MyForm.UserName.value == "" )
  {
    alert( "Please enter a User Name" );
    MyForm.UserName.focus();
    return false;
  }
  
  if ( MyForm.email.value == "" )
  {
    alert( "Please enter a Email Address so we can contact you should there be a problem." );
    MyForm.email.focus();
    return false;
  }

  if ( MyForm.DelAddr.value == "" )
  {
    alert( "Please enter a Delivery Address, so we will not know where to send your order." );
    MyForm.DelAddr.focus();
    return false;
  }
  
  if ( CheckCard )
  {
    if ( ! CheckCardNumber( MyForm ) )
      return false;
  }
  return true;
}


var SandReqd = 0;
var BagsReqd = 0;
var DelCost = 0;
var SandReqd = 0;
var NoPallets = 0;
var NoPost = 0;

function CalcSandReqd()
{
  var i;
  SandReqd = 0;
  BagsSelected = 0;
  SandRequirement.innerHTML = "";
  for ( i = 0; i < Trolley.length; i++ )
  {
    if ( Trolley[i].Qty > 0 )
    {
      j = Trolley[i].Idx;
      if ( ProdArray[j].Category != "Sand" )
      {
        SandReqd += ( ProdArray[j].SandWgt * Trolley[i].Qty );
      }
      else
      {
        BagsSelected += ( ProdArray[j].SandWgt * Trolley[i].Qty );
      }
    }
  }
  SandRequirement.innerHTML += "<br>These bottles require <td>" + Math.round(SandReqd)/1000 + " kg of sand";
  SandReqd = ( SandReqd * 1.10 );
  SandReqd = Math.round( SandReqd ) / 1000;
  SandRequirement.innerHTML += "<br>We recommend 10% for spillage suggesting <td>" + SandReqd + " kg";
  
  if ( SingleBags )
  {  
    SandRequirement.innerHTML += "<br>You have selected <td>" + Math.round(-BagsSelected/1000) + " kg bags of sand";
    BagsReqd = ( SandReqd + (BagsSelected / 1000) );
    if ( ( BagsReqd > 0 ) && ( BagsReqd < 0.9 ) )
      SandRequirement.innerHTML += "<br>We suggest you need " + Math.round( BagsReqd * 10 ) / 10 + " more bags of sand";  
    else if ( BagsReqd < -1 )
      SandRequirement.innerHTML += "<br>We suggest you have " + Math.round( BagsReqd * 10 ) / 10 + " more bags of sand more than you need";  
    else 
      SandRequirement.innerHTML += "<br>From these calculation we suggest you have enough 1kg bags of sand";  
  }    
  else
  {  
    SandRequirement.innerHTML += "<br>You have selected <td>" + Math.round(-BagsSelected/1000) + " kg in 25 kg bags of sand";
    BagsReqd = ( SandReqd + (BagsSelected / 1000) ) / 25;
    if ( ( BagsReqd > 0 ) && ( BagsReqd < 0.9 ) )
      SandRequirement.innerHTML += "<br>We suggest you need 1 more bag of sand";
    else if ( BagsReqd > 0.9 )
      SandRequirement.innerHTML += "<br>We suggest you need " + Math.round( BagsReqd * 10 ) / 10 + " more bags of sand";  
    else if ( BagsReqd < -1 )
      SandRequirement.innerHTML += "<br>We suggest you have " + Math.round( BagsReqd * 10 ) / 10 + " more bags of sand more than you need";  
    else 
      SandRequirement.innerHTML += "<br>From these calculation we suggest you have enough 25kg bags of sand";  
  }
}

function CalcDeliveryCost(  )
{
  /* Rules for delivery costs 
  
  Schools and private orders under one pallet £7.05
  
  Trade:  
    Post : 1st Bag £ 6.10
           other bags = £ 3.10 each
    Pallet : Up to 40 bags per pallet @ 34.60
  */
PerPalletCost = 34.60;
FixedFirstBagPostCost = 6.10;
PerPostCost = 3.10;
BagsPerPallet = 40;
DelNoteDescrip = "";
  
  Bags = 0;
  for ( i = 0; i < Trolley.length; i++ )
  {
    if ( Trolley[i].Qty > 0 )
    {
      j = Trolley[i].Idx;
      if ( ProdArray[j].Category == "Sand" )
        Bags += Trolley[i].Qty;
    }
  }

  // Mixed
  NoPallets = Math.floor( ( Bags + BagsPerPallet - 10 ) / BagsPerPallet );
  if ( NoPallets > 0 ) 
    DelNoteDescrip = "Delivered on " +  NoPallets + " pallet(s)";

  NoPost = ( Bags - ( NoPallets * BagsPerPallet ) );
  if ( NoPost > 0 )
  {
    MixPostCost = ( NoPost * PerPostCost ) + FixedFirstBagPostCost - PerPostCost;
    if ( DelNoteDescrip != "" )
      DelNoteDescrip += " and ";
    DelNoteDescrip += NoPost + " bags by post";
  }
  else
  {
    MixPostCost = 0;
    NoPost = 0;
  }
  
  DelCost = ( NoPallets * PerPalletCost ) + MixPostCost;
  DelCost = Math.round( DelCost * 100 );
  
  return DelCost;
}

