//=====================================================================||
//               NOP Design JavaScript Shopping Cart                   ||
//                                                                     ||
// For more information on SmartSystems, or how NOPDesign can help you ||
// Please visit us on the WWW at http://www.nopdesign.com              ||
//                                                                     ||
// Javascript portions of this shopping cart software are available as ||
// freeware from NOP Design.  You must keep this comment unchanged in  ||
// your code.  For more information contact FreeCart@NopDesign.com.    ||
//                                                                     ||
// JavaScript Shop Module, V.4.4.0                                     ||
//=====================================================================||

//---------------------------------------------------------------------||
//                       Global Options                                ||
//                      ----------------                               ||
// Shopping Cart Options, you can modify these options to change the   ||
// the way the cart functions.                                         ||
//                                                                     ||
// Language Packs                                                      ||
// ==============                                                      ||
// You may include any language pack before nopcart.js in your HTML    ||
// pages to change the language.  Simply include a language pack with  ||
// a script src BEFORE the <SCRIPT SRC="nopcart.js">... line.          ||
//  For example: <SCRIPT SRC="language-en.js"></SCRIPT>                ||
//                                                                     ||
// Options For Everyone:                                               ||
// =====================                                               ||
// * MonetarySymbol: string, the symbol which represents dollars/euro, ||
//   in your locale.                                                   ||
// * DisplayNotice: true/false, controls whether the user is provided  ||
//   with a popup letting them know their product is added to the cart ||
// * DisplayShippingColumn: true/false, controls whether the managecart||
//   and checkout pages display shipping cost column.                  ||
// * DisplayShippingRow: true/false, controls whether the managecart   ||
//   and checkout pages display shipping cost total row.               ||
// * DisplayTaxRow: true/false, controls whether the managecart        ||
//   and checkout pages display tax cost total row.                    ||
// * TaxRate: number, your area's current tax rate, ie: if your tax    ||
//   rate was 7.5%, you would set TaxRate = 0.075                      ||
// * TaxByRegion: true/false, when set to true, the user is prompted   ||
//   with TaxablePrompt to determine if they should be charged tax.    ||
//   In the USA, this is useful to charge tax to those people who live ||
//   in a particular state, but no one else.                           ||
// * TaxPrompt: string, popup message if user has not selected either  ||
//   taxable or nontaxable when TaxByRegion is set to true.            ||
// * TaxablePrompt: string, the message the user is prompted with to   ||
//   select if they are taxable.  If TaxByRegion is set to false, this ||
//   has no effect. Example: 'Arizona Residents'                       ||
// * NonTaxablePrompt: string, same as above, but the choice for non-  ||
//   taxable people.  Example: 'Other States'                          ||
// * MinimumOrder: number, the minium dollar amount that must be       ||
//   purchased before a user is allowed to checkout.  Set to 0.00      ||
//   to disable.                                                       ||
// * MinimumOrderPrompt: string, Message to prompt users with when     ||
//   they have not met the minimum order amount.                       ||
//                                                                     ||
// Payment Processor Options:                                          ||
// ==========================                                          ||
// * PaymentProcessor: string, the two digit payment processor code    ||
//   for support payment processor gateways.  Setting this field to    ||
//   anything other than an empty string will override your OutputItem ||
//   settings -- so please be careful when receiving any form data.    ||
//   Support payment processor gateways are:                           ||
//    * Authorize.net (an)                                             ||
//    * Worldpay      (wp)                                             ||
//    * LinkPoint     (lp)
//                                                                     ||
// Options For Programmers:                                            ||
// ========================                                            ||
// * OutputItem<..>: string, the name of the pair value passed at      ||
//   checkouttime.  Change these only if you are connecting to a CGI   ||
//   script and need other field names, or are using a secure service  ||
//   that requires specific field names.                               ||
//---------------------------------------------------------------------||

//Options for Everyone:
MonetarySymbol        = '&pound;';
DisplayNotice         = false;
DisplayShippingColumn = false;
DisplayShippingRow    = true;
DisplayTaxRow         = true;
//TaxRate               = 0.175; now set externally
TaxByRegion           = false;
TaxPrompt             = 'For tax purposes, please select if you are an Arizona resident before continuing';
TaxablePrompt         = 'Arizona Residents';
NonTaxablePrompt      = 'Other States';
MinimumOrder          = 0.00;
MinimumOrderPrompt    = 'Your order is below our minimum order, please order more before checking out.';

//Payment Processor Options:
PaymentProcessor      = '';

//Options for Programmers:
OutputItemId          = 'ID_';
OutputItemQuantity    = 'QUANTITY_';
OutputItemPrice       = 'PRICE_';
OutputItemName        = 'NAME_';
OutputItemShipping    = 'SHIPPING_';
OutputItemAddtlInfo   = 'ADDTLINFO_';
OutputOrderSubtotal   = 'SUBTOTAL';
OutputOrderShipping   = 'SHIPPING';
OutputOrderTax        = 'TAX';
OutputOrderTotal      = 'TOTAL';

//=====================================================================||
//---------------------------------------------------------------------||
//    YOU DO NOT NEED TO MAKE ANY MODIFICATIONS BELOW THIS LINE        ||
//---------------------------------------------------------------------||
//=====================================================================||


//---------------------------------------------------------------------||
//                      Language Strings                               ||
//                     ------------------                              ||
// These strings will not be used unless you have not included a       ||
// language pack already.  You should NOT modify these, but instead    ||
// modify the strings in language-**.js where ** is the language pack  ||
// you are using.                                                      ||
//---------------------------------------------------------------------||
strSorry  = "I'm Sorry, your cart is full, please proceed to checkout.";
strAdded  = " added to your shopping cart.";
strRemove = "Click 'Ok' to remove this product from your shopping cart.";
strILabel = "Quick Code";
strDLabel = "Product Name/Description";
strQLabel = "Quantity";
strPLabel = "Price";
strSLabel = "Delivery";
strRLabel = "Remove From Cart";
strRButton= "Remove";
strSUB    = "SUBTOTAL";
strSHIP   = "DELIVERY";
strTAX    = "VAT";
strTOT    = "TOTAL";
strErrQty = "Invalid Quantity.";
strNewQty = 'Please enter new quantity:';
bLanguageDefined = true;


//---------------------------------------------------------------------||
// FUNCTION:    CKquantity                                             ||
// PARAMETERS:  Quantity to                                            ||
// RETURNS:     Quantity as a number, and possible alert               ||
// PURPOSE:     Make sure quantity is represented as a number          ||
//---------------------------------------------------------------------||
function CKquantity(checkString) {
   var strNewQuantity = "";

   for ( i = 0; i < checkString.length; i++ ) {
      ch = checkString.substring(i, i+1);
      if ( (ch >= "0" && ch <= "9") || (ch == '.') )
         strNewQuantity += ch;
   }

   if ( strNewQuantity.length < 1 )
      strNewQuantity = "1";

   return(strNewQuantity);
}


//---------------------------------------------------------------------||
// FUNCTION:    AddToCart                                              ||
// PARAMETERS:  Form Object                                            ||
// RETURNS:     Cookie to user's browser, with prompt                  ||
// PURPOSE:     Adds a product to the user's shopping cart             ||
//---------------------------------------------------------------------||
function AddToCart(thisForm,stock) {
	 if (stock == 0) {
	 	alert("Sorry! There are no items in stock.\nPlease choose another item.");
	 	return false;
	 }
   var bAlreadyInCart = false;
   var notice = "";

   if ( thisForm.ID_NUM == null )
      strID_NUM    = "";
   else
      strID_NUM    = thisForm.ID_NUM.value;

   if ( thisForm.SUPPLIERDATA == null )
      strSUPPLIERDATA    = "";
   else
      strSUPPLIERDATA    = thisForm.SUPPLIERDATA.value;

   if ( thisForm.QUANTITY == null || thisForm.QUANTITY.value == "" || thisForm.QUANTITY.value == 0)
      strQUANTITY  = "1";
   else
      strQUANTITY  = thisForm.QUANTITY.value;

   if  (parseInt(strQUANTITY) < 0)
   {
      alert("invalid number!");
      return false;
   }

   if ( thisForm.PRICE == null || thisForm.PRICE.value == "" )
      strPRICE     = "0.00";
   else
      strPRICE     = thisForm.PRICE.value;

   if ( thisForm.NAME == null )
      strNAME      = "";
   else
   {
      strNAME      = thisForm.NAME.value;
      strNAME = strNAME.replace(/\&/g,"+");
      strNAME = strNAME.replace(/\;/g," ");
      strNAME = strNAME.replace(/\|/g," ");
   }

   if ( thisForm.WEIGHT == null )
      strWEIGHT   = "0";
   else
      strWEIGHT   = thisForm.WEIGHT.value;
      
   var database = GetCookie("shoppingcart");
   if ( database  == null ) database  = "";
  
  //Is this product already in the cart?  If so, increment quantity instead of adding another.
  
   var orderpos = 0;
   var newdatabase = "";
   for ( i = 1; ; i++ ) 
   {
      Token0 = database.indexOf("|", orderpos);
      if (Token0 == -1) break;
      Token1 = database.indexOf("|", Token0+1);
      Token2 = database.indexOf("|", Token1+1);
      Token3 = database.indexOf("|", Token2+1);
      Token4 = database.indexOf("|", Token3+1);
      Token5 = database.indexOf("|", Token4+1);

      storedID_NUM = database.substring( orderpos, Token0 );                 // Product ID
      storedQTY = database.substring( Token0+1, Token1 );			//quantity
      storedPRICE = database.substring( Token1+1, Token2 );          // Price
      storedNAME = database.substring( Token2+1, Token3 );          // Product Name/Description
      storedSUPPLIERDATA = database.substring( Token3+1, Token4 );          // supplierdata
      storedWEIGHT = database.substring( Token4+1, Token5 ); //weight

      orderpos = Token5+1;
		
      if ( strID_NUM != "" && storedID_NUM == strID_NUM || strID_NUM == "" && storedID_NUM == "" && storedNAME  == strNAME ) 
      {
         bAlreadyInCart = true;
         storedQTY = parseInt(strQUANTITY)+parseInt(storedQTY);
         if (storedQTY > stock) {
         	alert("You wish to order more items than what are in stock.\nPlease reduce number of required items.");
		 		return false;
         }
      }
      newdatabase  +=  storedID_NUM    + "|" +
                       storedQTY  + "|" +
                       storedPRICE     + "|" +
                       storedNAME      + "|" +
                       storedSUPPLIERDATA  + "|" +
                       storedWEIGHT  + "|";
   }
	
   if ( !bAlreadyInCart ) {
     var newQuantity = parseInt(strQUANTITY);
     if (newQuantity > stock) {
     	alert("There are not enough items in stock.\nPlease reduce number of required items.");
	 	return false;
     }
     newdatabase  +=   strID_NUM    + "|" +
                       strQUANTITY  + "|" +
                       strPRICE     + "|" +
                       strNAME      + "|" +
                       strSUPPLIERDATA  + "|" +
                       strWEIGHT  + "|";

   }
   notice = strQUANTITY + " " + strNAME + strAdded;
   SetCookie("shoppingcart", newdatabase , null, "/");   
   if ( DisplayNotice )
      alert(notice);
   return true;
}


//---------------------------------------------------------------------||
// FUNCTION:    getCookieVal                                           ||
// PARAMETERS:  offset                                                 ||
// RETURNS:     URL unescaped Cookie Value                             ||
// PURPOSE:     Get a specific value from a cookie                     ||
//---------------------------------------------------------------------||
function getCookieVal (offset) {
   var endstr = document.cookie.indexOf (";", offset);

   if ( endstr == -1 )
      endstr = document.cookie.length;
   return(unescape(document.cookie.substring(offset, endstr)));
}


//---------------------------------------------------------------------||
// FUNCTION:    FixCookieDate                                          ||
// PARAMETERS:  date                                                   ||
// RETURNS:     date                                                   ||
// PURPOSE:     Fixes cookie date, stores back in date                 ||
//---------------------------------------------------------------------||
function FixCookieDate (date) {
   var base = new Date(0);
   var skew = base.getTime();

   date.setTime (date.getTime() - skew);
}


//---------------------------------------------------------------------||
// FUNCTION:    GetCookie                                              ||
// PARAMETERS:  Name                                                   ||
// RETURNS:     Value in Cookie                                        ||
// PURPOSE:     Retrieves cookie from users browser                    ||
//---------------------------------------------------------------------||
function GetCookie (name) {
   var arg = name + "=";
   var alen = arg.length;
   var clen = document.cookie.length;
   var i = 0;

   while ( i < clen ) {
      var j = i + alen;
      if ( document.cookie.substring(i, j) == arg ) return(getCookieVal (j));
      i = document.cookie.indexOf(" ", i) + 1;
      if ( i == 0 ) break;
   }

   return(null);
}


//---------------------------------------------------------------------||
// FUNCTION:    SetCookie                                              ||
// PARAMETERS:  name, value, expiration date, path, domain, security   ||
// RETURNS:     Null                                                   ||
// PURPOSE:     Stores a cookie in the users browser                   ||
//---------------------------------------------------------------------||
function SetCookie (name,value,expires,path,domain,secure) {
   //domain = "www.lambda-tek.com";
   document.cookie = name + "=" + escape (value) +
                     ((expires) ? "; expires=" + expires.toGMTString() : "") +
                     ((path) ? "; path=" + path : "") +
                     ((domain) ? "; domain=" + domain : "") +
                     ((secure) ? "; secure" : "");
}


//---------------------------------------------------------------------||
// FUNCTION:    DeleteCookie                                           ||
// PARAMETERS:  Cookie name, path, domain                              ||
// RETURNS:     null                                                   ||
// PURPOSE:     Removes a cookie from users browser.                   ||
//---------------------------------------------------------------------||
function DeleteCookie (name,path,domain) {
   if ( GetCookie(name) ) {
      document.cookie = name + "=" +
                        ((path) ? "; path=" + path : "") +
                        ((domain) ? "; domain=" + domain : "") +
                        "; expires=Thu, 01-Jan-70 00:00:01 GMT";
   }
}

//---------------------------------------------------------------------||
// FUNCTION:    CreateCookie                                           ||
// PARAMETERS:  Cookie name, path, domain                              ||
// RETURNS:     null                                                   ||
// PURPOSE:     sets a cookie with set days as time limit.             ||
//---------------------------------------------------------------------||
function CreateCookie(name,value,days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

//---------------------------------------------------------------------||
// FUNCTION:    MoneyFormat                                            ||
// PARAMETERS:  Number to be formatted                                 ||
// RETURNS:     Formatted Number                                       ||
// PURPOSE:     Reformats Dollar Amount to #.## format                 ||
//---------------------------------------------------------------------||
function moneyFormat(input)
{
	var num = Math.round(input*100)/100;
	if (Math.round(input) == num)
	{
		return num+'.00';
	}
	else if (Math.round(input*10) == num*10)
	{
		return num+'0';
	}
	else
	{
		return num+'';
	}
}

//---------------------------------------------------------------------||
// FUNCTION:    ReduceString                                           ||
// PARAMETERS:  string and maxlength                                   ||
// RETURNS:     reduced string                                         ||
// PURPOSE:     reduces a tring to "string ..." format                 ||
//---------------------------------------------------------------------||
function ReduceString(input, maxNameLen) {
	var shortName = input;
	if (shortName.length > maxNameLen) {
		shortName = shortName.substring(0,maxNameLen-1) + "...";
	}
	return shortName;
}

function UpdateCart() 
{
  OnCartUpdate();  
  document.form.updatecart.value="yes";  
  document.form.submit();    
}

//---------------------------------------------------------------------||
// FUNCTION:    RemoveFromCart                                         ||
// PARAMETERS:  Order Number to Remove                                 ||
// RETURNS:     Null                                                   ||
// PURPOSE:     Removes an item from a users shopping cart             ||
//---------------------------------------------------------------------||
function RemoveFromCart(RemOrder) {
   if ( !confirm( strRemove ) ) 
      return;
   var database = GetCookie("shoppingcart");
   if ( database  == null ) database  = "";
   var orderpos = 0;
   var newdatabase = "";
   for ( i = 1; ; i++ ) 
   {
      Token0 = database.indexOf("|", orderpos);
      if (Token0 == -1) break;
      Token1 = database.indexOf("|", Token0+1);
      Token2 = database.indexOf("|", Token1+1);
      Token3 = database.indexOf("|", Token2+1);
      Token4 = database.indexOf("|", Token3+1);
      Token5 = database.indexOf("|", Token4+1);
      
      storedID_NUM = database.substring( orderpos, Token0 );                 // Product ID
      storedQTY = database.substring( Token0+1, Token1 );			//quantity
      storedPRICE = database.substring( Token1+1, Token2 );          // Price
      storedNAME = database.substring( Token2+1, Token3 );          // Product Name/Description
      storedSUPPLIERDATA = database.substring( Token3+1, Token4 );          // supplierdata
      storedWEIGHT = database.substring( Token4+1, Token5 ); //weight

      orderpos = Token5+1;
		
      if (i == RemOrder)
         continue;

      newdatabase  +=  storedID_NUM    + "|" +
                       storedQTY  + "|" +
                       storedPRICE     + "|" +
                       storedNAME      + "|" +
                       storedSUPPLIERDATA  + "|" +
                       storedWEIGHT  + "|";
   }
   SetCookie("shoppingcart", newdatabase , null, "/");
   UpdateCart();
}

//---------------------------------------------------------------------||
// FUNCTION:    ChangeQuantity                                         ||
// PARAMETERS:  Order Number to Change Quantity                        ||
// RETURNS:     Null                                                   ||
// PURPOSE:     Changes quantity of an item in the shopping cart       ||
//---------------------------------------------------------------------||
function ChangeQuantity(OrderItem,elt, oldvalue) {
	var NewQuantity = elt.value;
	if ( isNaN(NewQuantity) || NewQuantity=="" || NewQuantity<=0) {
		alert( strErrQty );
		elt.value = oldvalue;
		return;
	}
   var database = GetCookie("shoppingcart");
   if ( database  == null ) database  = "";
   var orderpos = 0;
   var newdatabase = "";
   for ( i = 1; ; i++ ) 
   {
      Token0 = database.indexOf("|", orderpos);
      if (Token0 == -1) break;
      Token1 = database.indexOf("|", Token0+1);
      Token2 = database.indexOf("|", Token1+1);
      Token3 = database.indexOf("|", Token2+1);
      Token4 = database.indexOf("|", Token3+1);
      Token5 = database.indexOf("|", Token4+1);
      
      storedID_NUM = database.substring( orderpos, Token0 );                 // Product ID
      storedQTY = database.substring( Token0+1, Token1 );			//quantity
      storedPRICE = database.substring( Token1+1, Token2 );          // Price
      storedNAME = database.substring( Token2+1, Token3 );          // Product Name/Description
      storedSUPPLIERDATA = database.substring( Token3+1, Token4 );          // supplierdata
      storedWEIGHT = database.substring( Token4+1, Token5 ); //weight
      
      orderpos = Token5+1;
		
      if (i == OrderItem)
      {
         storedQTY = parseInt(NewQuantity);
      }

      newdatabase  +=  storedID_NUM    + "|" +
                       storedQTY  + "|" +
                       storedPRICE     + "|" +
                       storedNAME      + "|" +
                       storedSUPPLIERDATA  + "|" +
                       storedWEIGHT  + "|";
   }
   SetCookie("shoppingcart", newdatabase , null, "/");
   UpdateCart();
}

function SaveOptShipping(shippingCode) {
	if (document.form.optShippingLabel)
		SetCookie("optShippingLabel", document.form.optShippingLabel.value, null, "/");
	SetCookie("shippingCode", shippingCode + "=" + document.form.optShippingVal.value, null, "/");

  OnCartUpdate();  
  //document.form.updatecart.value="yes";  NO! as we do NOT want to update shipping,etc
  document.form.submit();    
}

//---------------------------------------------------------------------||
// FUNCTION:    RadioChecked                                           ||
// PARAMETERS:  Radio button to check                                  ||
// RETURNS:     True if a radio has been checked                       ||
// PURPOSE:     Form fillin validation                                 ||
//---------------------------------------------------------------------||
function RadioChecked( radiobutton ) {
   var bChecked = false;
   var rlen = radiobutton.length;
   for ( i=0; i < rlen; i++ ) {
      if ( radiobutton[i].checked )
         bChecked = true;
   }    
   return bChecked;
} 


//---------------------------------------------------------------------||
// FUNCTION:    QueryString                                            ||
// PARAMETERS:  Key to read                                            ||
// RETURNS:     value of key                                           ||
// PURPOSE:     Read data passed in via GET mode                       ||
//---------------------------------------------------------------------||
QueryString.keys = new Array();
QueryString.values = new Array();
function QueryString(key) {
   var value = null;
   for (var i=0;i<QueryString.keys.length;i++) {
      if (QueryString.keys[i]==key) {
         value = QueryString.values[i];
         break;
      }
   }
   return value;
} 

//---------------------------------------------------------------------||
// FUNCTION:    QueryString_Parse                                      ||
// PARAMETERS:  (URL string)                                           ||
// RETURNS:     null                                                   ||
// PURPOSE:     Parses query string data, must be called before Q.S.   ||
//---------------------------------------------------------------------||
function QueryString_Parse() {
   var query = window.location.search.substring(1);
   var pairs = query.split("&"); for (var i=0;i<pairs.length;i++) {
      var pos = pairs[i].indexOf('=');
      if (pos >= 0) {
         var argname = pairs[i].substring(0,pos);
         var value = pairs[i].substring(pos+1);
         QueryString.keys[QueryString.keys.length] = argname;
         QueryString.values[QueryString.values.length] = value;
      }
   }
}

function encodeData(s) {
	 var encodedData = escape(s);
	 encodedData = encodedData.replace(/\//g,"%2F");
	 encodedData = encodedData.replace(/\?/g,"%3F");
	 encodedData = encodedData.replace(/=/g,"%3D");
	 encodedData = encodedData.replace(/&/g,"%26");
	 encodedData = encodedData.replace(/@/g,"%40");
	 return encodedData ;
} 


//---------------------------------------------------------------------||
// FUNCTION:    ManageCart                                             ||
// PARAMETERS:  Null                                                   ||
// RETURNS:     Product Table Written to Document                      ||
// PURPOSE:     Draws current cart product table on HTML page          ||
//---------------------------------------------------------------------||
function ManageCart( fobj,enableOptShipping) {
   var fTotal         = 0;    //Total cost of order
   var wTotal         = 0;    //Total weight (if available - else is empty)
   var strOutput      = "";   //String to be written to page
   var bDisplay       = (fobj != null);
   var cartData = "";
   var shippingData = "";
   var sideCartNameLen = 20; //used in side shopping cart (fobj = null)
   var mainCartNameLen = 100; //used in main shopping cart (fobj != null)
   var cdNameLen = 80; //used in cart data

   var database = GetCookie("shoppingcart");
   if ( database  == null ) database  = "";
    
   if ( bDisplay ) {
      strOutput = "<TABLE CLASS=\"nopcart\"><TR>" +
                  "<TD CLASS=\"nopheader\"><B>"+strILabel+"</B></TD>" +
                  "<TD CLASS=\"nopheader\"><B>"+strDLabel+"</B></TD>" +
                  "<TD CLASS=\"nopheader\"><B>"+strQLabel+"</B></TD>" +
                  "<TD CLASS=\"nopheader\"><B>"+strPLabel+"</B></TD>" +
                  (DisplayShippingColumn?"<TD CLASS=\"nopheader\"><B>"+strSLabel+"</B></TD>":"") +
                  "<TD CLASS=\"nopheader\"><B>"+strRLabel+"</B></TD></TR>";

	   if ( database == "") {
	      strOutput += "<TR><TD COLSPAN=6 CLASS=\"nopentry\"><CENTER><BR><B>Your cart is empty</B><BR><BR></CENTER></TD></TR>";
	   }
   }
   var orderpos = 0;
   for ( i = 1; ; i++ ) {

      Token0 = database.indexOf("|", orderpos);
      if (Token0 == -1) break;
      Token1 = database.indexOf("|", Token0+1);
      Token2 = database.indexOf("|", Token1+1);
      Token3 = database.indexOf("|", Token2+1);
      Token4 = database.indexOf("|", Token3+1);
      Token5 = database.indexOf("|", Token4+1);

      fields = new Array;
      fields[0] = database.substring( orderpos, Token0 );                 // Product ID
      fields[1] = database.substring( Token0+1, Token1 );          // Quantity
      fields[2] = database.substring( Token1+1, Token2 );          // Price
      fields[3] = database.substring( Token2+1, Token3 );          // Product Name/Description
      fields[4] = database.substring( Token3+1, Token4 );          // supplierdata
      fields[5] = database.substring( Token4+1, Token5 ); //weight

      orderpos = Token5+1;
            	  	  	  
      var fTotalS     = (parseInt(fields[1]) * parseFloat(fields[2]) );
      fTotal     += fTotalS;
       var fTax1 = parseFloat(fields[2]) * TaxRate;
      var fItemTotal = fTax1 + parseFloat(fields[2]);
      var fLineTotal = parseInt(fields[1]) * fItemTotal;

	  var cdShortName = ReduceString(fields[3],cdNameLen);

	  //get first token from supplierdata - this will be "preferred" supplier
	  var Token = fields[4].indexOf("=", 0);
	  var supplier = fields[4].substring( 0, Token );

      cartData = cartData + encodeData(fields[0]) + "=" + encodeData(cdShortName) + "=" + encodeData(fields[1]) + "=" + encodeData(fields[2]) + "=" + encodeData(supplier) + "=";

      if ( bDisplay ) {
		 var shortName = ReduceString(fields[3],mainCartNameLen);
         strOutput += "<TR><TD CLASS=\"nopentry\">"  + fields[0] + "</TD>";

         strOutput += "<TD CLASS=\"nopentry\"><a href=\"" + scriptPath + fields[0] + "\"><img src=\"" + imageServePath + fields[0] + "\" width=\"50\" style=\"vertical-align: middle;\"/>"  + shortName  + "</a></TD>";

         strOutput += "<TD CLASS=\"nopentry\"><INPUT TYPE=TEXT NAME=Q SIZE=2 VALUE=\"" + fields[1] + "\" onkeypress=\"this.form.updatecart.value='yes';\" onChange=\"ChangeQuantity("+i+", this," + fields[1] + ");\"\></TD>";
         strOutput += "<TD CLASS=\"nopentry\">"+ MonetarySymbol + moneyFormat(fields[2]) + "/ea</TD>";

         if ( DisplayShippingColumn ) {
            if ( parseFloat(fields[4]) > 0 )
               strOutput += "<TD CLASS=\"nopentry\">"+ MonetarySymbol + moneyFormat(fields[4]) + "/ea</TD>";
            else
               strOutput += "<TD CLASS=\"nopentry\">N/A</TD>";
         }

         strOutput += "<TD CLASS=\"nopentry\" ALIGN=CENTER><input type=button value=\" "+strRButton+" \" onClick=\"RemoveFromCart("+i+")\" class=\"nopbutton\"></TD></TR>";
       
      } else {
       		
			strOutput += "<span class=\"CartPrice\">"+ MonetarySymbol + moneyFormat(fields[2] * fields[1]) + "</span>" + fields[1] + " x <a href=\"" + scriptPath + fields[0] + "\">" + ReduceString(fields[3],sideCartNameLen) + "</a><br />";
      }

   }
      
   //get shipping options format |c1=s1|c2=s2|
   shippingCodes = new Array;
   shippingStrings = new Array;
   var shippingoptions = GetCookie("shippingOptions");
   var Token=0;
   for (var idx=0;shippingoptions != null;idx++)
   {
   		var Token1 = shippingoptions.indexOf("=", Token+1);
   		if (Token1 == -1) break;
   		shippingCodes[idx] = shippingoptions.substring( Token+1 , Token1);
   		Token = Token1;
   		Token1 = shippingoptions.indexOf("|", Token+1);
   		shippingStrings[idx] = shippingoptions.substring( Token+1, Token1 );
   		Token = Token1;
   }
   
   if (enableOptShipping && database != "") {
   		var idx = shippingCodes.length;
   		shippingStrings[idx] = "custom...";		shippingCodes[idx] = "CUSTOM";
   }
   
   //transform shipping charge:
   var shippingcookie = GetCookie("shippingCode"); //form "code=price"
   var Token = shippingcookie != null ? shippingcookie.indexOf("=", 0) : -1;
   var shippingCode = Token != -1 ? shippingcookie.substring( 0, Token ) : "";;
   var shippingValue = Token != -1 ? shippingcookie.substring( Token+1, shippingcookie.length) : 0;
   
   var shippingSelection;
   for (shippingSelection=0;shippingSelection<shippingCodes.length;shippingSelection++) {
      if (shippingCodes[shippingSelection] == shippingCode)
      	break;
   }
   if (shippingSelection == null || shippingSelection>=shippingCodes.length) {
   		shippingSelection = 0;
   }
   var optShippingLabel = GetCookie("optShippingLabel");
   if (optShippingLabel == null) optShippingLabel="";

   var fShipping = 0;
   if (fTotal > 0)
   {
		fShipping = shippingValue*1.0;
   }
   var fTax        = fTotal * TaxRate;
   var strTotal    = moneyFormat(fTotal);
   var strTax      = moneyFormat(fTax);
   var strShipping = moneyFormat(fShipping);
   var fShippingTax = fShipping*TaxRate;
   var fShippingTot = fShipping + fShippingTax;
   var strShippingTax = moneyFormat(fShippingTax);
   var strTotTax = MonetarySymbol+moneyFormat(fShippingTax + fTax);
   
   //do shipping data
   var shippingLabel = enableOptShipping && shippingSelection == shippingCodes.length-1 ? optShippingLabel : shippingStrings[shippingSelection];
   shippingData = encodeData(shippingCodes[shippingSelection]) + "=" + encodeData(shippingLabel) + "=" + encodeData(strShipping) + "=";
   
   if ( bDisplay ) {
      strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=4><B>"+strSUB+"</B></TD>";
      strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2><B>" + MonetarySymbol + strTotal + "</B></TD>";
      strOutput += "</TR>";
      if ( DisplayShippingRow ) {
         strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=4><B>"+strSHIP+"</B>  ";
		 strOutput += "<select size=\"1\" name=\"Shipping\" class = \"checkout\"  onchange=\"UpdateCart()\">";
		 for (ivals = 0; ivals < shippingCodes.length; ivals++) {
		 	if (ivals == shippingSelection)
				strOutput += "<option value=" + shippingCodes[ivals] + " selected>" + shippingStrings[ivals] + "</option>";
			else
				strOutput += "<option value=" + shippingCodes[ivals] + ">" + shippingStrings[ivals] + "</option>";
		 }
		 strOutput += "</select>";  
		 if (enableOptShipping && shippingSelection == shippingCodes.length-1) { 
		 	//custom shipping
			 strOutput += "<br/>Description <input type=\"text\" name=\"optShippingLabel\" size=\"45\" VALUE=\"" + optShippingLabel + "\" onchange=\"SaveOptShipping(\'"+shippingCode+"\')\">";  		 	
		 }
         strOutput += "</TD>";
         if (enableOptShipping)
         {
         	strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2>" + MonetarySymbol + "<input type=\"text\" name=\"optShippingVal\" size=\"5\" VALUE=\"" + moneyFormat(shippingValue) + "\" onchange=\"SaveOptShipping(\'"+shippingCode+"\')\"></TD>";
			
         }
         else
         {
         	strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2><B>" + MonetarySymbol+strShipping + "</B></TD>";
         }
         strOutput += "</TR>";
      }

      if ( DisplayTaxRow || TaxByRegion ) {
         if ( TaxByRegion ) {
            strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=4><B>"+strTAX+" at "+TaxRate*100+"%</B></TD>";
            strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2><B>";
            strOutput += "<input type=radio name=\""+OutputOrderTax+"\" value=\"" + strTax + "\">";
            strOutput += TaxablePrompt + ": " + MonetarySymbol + strTax;
            strOutput += "<BR><input type=radio name=\""+OutputOrderTax+"\" value=\"0.00\">";
            strOutput += NonTaxablePrompt + ": " + MonetarySymbol + "0.00";
            strOutput += "</B></TD>";
            strOutput += "</TR>";
         } else {
            strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=4><B>"+strTAX+" at "+TaxRate*100+"%</B></TD>";
            strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2><B>" + strTotTax + "</B></TD>";
            strOutput += "</TR>";
         }
      }

      if ( !TaxByRegion ) {
         strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=4><B>"+strTOT+"</B></TD>";
         strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2><B>" + MonetarySymbol + moneyFormat((fTotal + fTax + fShipping + fShippingTax)) + "</B></TD>";
         strOutput += "</TR>";
      }
      strOutput += "</TABLE>";

   } else {
   		//insert cart list within scrollable area
		//strOutput = "<div style=\"width: 100%; height: 100px;overflow: scroll\">" + strOutput + "</div>";
		strOutput += "<br /><span class=\"CartPrice\">" + MonetarySymbol + strTotal + "</span>Total in cart:<br />";
		strOutput += "<span class=\"CartPrice\">" + MonetarySymbol+strShipping + "</span>"+strSLabel+":<br />";
		strOutput += "<span class=\"CartPrice\" style=\"margin-bottom: 4px;FONT-WEIGHT: bold\">" + MonetarySymbol + moneyFormat(fTotal + fShipping)+ "</span>Total ex.VAT:<br />";
   }
   g_TotalCost = (fTotal + fShipping + fTax);

   document.write(strOutput);
   document.close();
   if (fobj) {
	   //fill form variables
		fobj.cartdata.value = cartData;
		fobj.shippingdata.value = shippingData;
		fobj.vatrate.value = TaxRate;
	}
}

//---------------------------------------------------------------------||
// FUNCTION:    ValidateCart                                           ||
// PARAMETERS:  Form to validate                                       ||
// RETURNS:     true/false                                             ||
// PURPOSE:     Validates the managecart form                          ||
//---------------------------------------------------------------------||
var g_TotalCost = 0;
function ValidateCart( theForm ) 
{
   if (theForm.updatecart.value != "")
		return true; //do not validate if just updating cart
   if (g_TotalCost ==0) {
      alert("your cart is empty");
      return false;
   }
   if ( TaxByRegion ) {
      if ( !RadioChecked(eval("theForm."+OutputOrderTax)) ) {
         alert( TaxPrompt );
         return false;
      }
   }

   if ( MinimumOrder >= 0.01 ) {
      if ( g_TotalCost < MinimumOrder ) {
         alert( MinimumOrderPrompt );
         return false;
      }
   }

   return true;
}

//---------------------------------------------------------------------||
// FUNCTION:    DisplayCart											   ||
// PARAMETERS:  Null                                                   ||
// RETURNS:     Product Table Written to Document                      ||
//---------------------------------------------------------------------||
function DisplayCart() 
{
	ManageCart(null,false);
}

function ShowPendingMsg(fobj)
{
	//if (fobj.Submit) {
	//	fobj.Submit.value = "wait ...";
	//}
	//also set a test cookie
    //SetCookie("testcookie", "blabla", null, "/"); //DISABLE FOR NOW

}

function TestEnabledCookies(fobj)
{
	return; //DISABLE FOR NOW
	if ( !GetCookie("testcookie") ) 
	{
		location.href = "http://www.lambda-tek.com/componentshop/cookie_error.htm";
	}
}


//=====================================================================||
//               END NOP Design SmartPost Shopping Cart                ||
//=====================================================================||


