//=====================================================================
//  TOWeb Shopcart (c)2008 Lauyan.com - All rights reserved
//=====================================================================
SHIPPINGDETAILS       = false;

MonetarySymbol        = ' €';
DecimalSymbol         = ',';
MonetarySymbolFirst   = false;
DisplayNotice         = true;
DisplayShippingColumn = true;
DisplayShippingRow    = true;
DisplayTaxRow         = false;
TaxRate               = 0.00;
DefaultTaxRate        = 0.00;
TaxIncluded           = false;
EnableTaxPerCountry   = false;
MinimumOrder          = 0.00;
MaximumOrder          = 300.00;
MinimumOrderWeight    = 0.00;
MaximumOrderWeight    = 0.00;
InitialShippingAmount = 0.00;
WeightUnit            = '';
DefaultCountry        = 'FR=France';
UseRebate             = false;
DisplayOrderRebate    = true;
RebateIgnoreCase  	  = true;
TaxOnShipping         = 0;

CurrentShipment       = 0;

shipments 			  = new Array();

// PayPal fields parameters
PPOutputItemId        = 'item_number_';	// 'ID_';
PPOutputItemQuantity  = 'quantity_';
PPOutputItemPrice     = 'amount_';		// 'PRICE_';
PPOutputItemName      = 'item_name_';	// 'NAME_';
PPOutputItemShipping  = 'SHIPPING_';
PPOutputItemAddtlInfo = 'os0_';			// 'ADDTLINFO_';

// standard fields parametes
OutputItemId          = 'i';		// 'item_number_';
OutputItemQuantity    = 'q';		// 'quantity_'
OutputItemPrice       = 'a';		// 'amount_';
OutputItemName        = 'n';		// 'item_name';
OutputItemShipping    = 's';		// 'SHIPPING_'
OutputItemAddtlInfo   = 'o';		// 'os0_';				
OutputOrderSubtotal   = 'subtotal';			
OutputOrderShipping   = 'shipping';		
OutputOrderShipment   = 'shiptype';		
OutputOrderTax1       = 'tax1';
OutputOrderTax2       = 'tax2';
OutputOrderTotal      = 'TOTAL';

// Internal constants
AppendItemNumToOutput  = true;
HiddenFieldsToCheckout = true;
MaxItemPerOrder        = 15;
  
htmlExt                = '.html';
CatalogPath            = new Array("","","","","","","","","../paques/page","../catalogue/page","../alsace/page","../lecoindesbrodeus/page","../collectioncharme/page","","","","","","../aulutindesbois/page");
DisplayItemLinks       = true;	

g_TotalCost = 0;
g_TotalWeight = 0;
g_SubTotalCost = 0;

function initArray() 
{
	this.length = initArray.arguments.length;
	for (var i = 0; i < this.length; i++)
		this[i] = initArray.arguments[i];
}

function hasCountry( cc ) 
{
  if( this.countries == 'ALL' || cc == 'ALL' )
    return true;
  return ( this.countries.indexOf( cc ) >= 0 );
}

function getFixedShippingAmount( price ) 
{
  if( this.fixed_limits == 0 )
  	return 0;
  var shippingamount = this.fixed_amounts[0];
  if( this.fixed_limits[0] > 0 || this.fixed_amounts[0] > 0 )
    for( var i=0; i<this.fixed_limits.length; i++ )
      if( this.fixed_limits[i] > 0 && price >= this.fixed_limits[i] )
        shippingamount = this.fixed_amounts[i];
  return shippingamount;	
}

function getWeightShippingAmount( weight ) 
{
  if( this.weight_limits == 0 )
  	return 0;
  var shippingamount = this.weight_amounts[0];
  if( this.weight_limits[0] > 0 || this.weight_amounts[0] > 0 )
    for( var i=0; i<this.weight_limits.length; i++ )
      if( this.weight_limits[i] > 0 && weight >= this.weight_limits[i] )
        shippingamount = this.weight_amounts[i];
  return shippingamount;	
}

function createShipment( sname, sdesc, svatrate, scountries ) 
{
  this.name = sname;
  this.desc = sdesc;
  this.vatrate = svatrate;
  this.countries = scountries;
  this.fixed_limits  = 0;
  this.fixed_amounts = 0;
  this.weight_limits = 0;
  this.price_amounts = 0;
  this.hasCountry = hasCountry;
  this.getFixedShippingAmount = getFixedShippingAmount;
  this.getWeightShippingAmount = getWeightShippingAmount;
}

function CalculateFixedShipping()
{
	var fShipping      = 0; 
	var iNumberOrdered = GetCookie("NumberOrdered");
	if( iNumberOrdered == null )
		iNumberOrdered = 0;
	for( var i=1; i<=iNumberOrdered; i++) 
	{
		var NewOrder = "Order." + i;
		var database = "";
		database = GetCookie(NewOrder);

		Token0 = database.indexOf("|", 0);
		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( 0, Token0 );                 // Product ID
		fields[1] = database.substring( Token0+1, Token1 );          // Quantity
		fields[2] = database.substring( Token1+1, Token2 );          // Price
		fields[3] = RemoveUnsafeChars( database.substring( Token2+1, Token3 ) );          // Product Name/Description
		fields[4] = database.substring( Token3+1, Token4 );          // Shipping Cost
		fShipping += (parseInt(fields[1]) * parseFloat(fields[4]) );
	}
	return fShipping;
}

function getParam(paramName)
{
	var SelfURL = document.location.href;
	var paramIndex = SelfURL.indexOf("?");    
	if (paramIndex <= -1)
		return "";
	var paramStr = SelfURL.substr(paramIndex+1, 4096);
	if( paramStr == "" )
		return "";
	if( paramStr.charAt(0) == "?" )
		paramStr = paramStr.substr(1);
	arg = (paramStr.split("&"));
	for( i=0; i<arg.length; i++ ) 
	{
		arg_values = arg[i].split("=")
		if( unescape(arg_values[0]) == paramName ) 
		{
			ret = unescape(arg_values[1]);  // IE 5.0 and older does not have decodeURI
			return ret;
		}
	}
	return "";
}

//---------------------------------------------------------------------
// FUNCTION:    AddMonetarySymbol
// RETURNS:     string with the MonetarySymbol added in first/last position
//---------------------------------------------------------------------
function AddMonetarySymbol(strVal) 
{
	var strsym = "";
	if (MonetarySymbolFirst) 
		strsym = MonetarySymbol + strVal;
	else	
		strsym = strVal + MonetarySymbol;
	return(strsym);
}

//---------------------------------------------------------------------
// FUNCTION:    CKquantity
// PARAMETERS:  Quantity 
// RETURNS:     Quantity as a number, and possible alert 
// PURPOSE:     Make sure quantity is represented as a number 
//---------------------------------------------------------------------
function CKquantity(checkString) 
{
	var strNewQuantity="";
	for(var i=0; i<checkString.length; i++) 
	{
		var 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:  Item Form Object
// RETURNS:     Cookie to user's browser, with prompt
// PURPOSE:     Adds a product to the user's shopping cart
//---------------------------------------------------------------------
function AddToCart(thisForm) 
{
	var iNumberOrdered = 0;
	var bAlreadyInCart = false;
	var notice = "";
	var bNoQtyAllowed = false;
	iNumberOrdered = GetCookie("NumberOrdered");

	if( thisForm.STATUS.value == 6 ) //out of order status
	{
		alert( strAddToCartError + " " + catstatusnames[6] );
		return false;
	}
	
	if ( iNumberOrdered == null )
		iNumberOrdered = 0;

	if ( thisForm.USC == null )
		strShipCoeff = "";
	else
		strShipCoeff = thisForm.USC.value;

		if ( thisForm.ID_NUM == null )
		strID_NUM    = "";
	else
		strID_NUM    = thisForm.ID_NUM.value;
		
	if ( thisForm.QUANTITY == null )
	{
		strQUANTITY  = "1";
		bNoQtyAllowed = true;
	}   
	else
	{
		strQUANTITY  = thisForm.QUANTITY.value;
		if( strQUANTITY <= 0 )
		{
			alert( strErrQty );
			thisForm.QUANTITY.value = "1";
			return;
		}
		bNoQtyAllowed = false;
	}
	if ( thisForm.PRICE == null )
		strPRICE     = "0.00";
	else
		strPRICE     = thisForm.PRICE.value;

	if ( thisForm.NAME == null )
		strNAME      = "";
	else
		strNAME      = thisForm.NAME.value;

	if ( thisForm.SHIPPING == null )
		strSHIPPING  = "0.00";
	else
		strSHIPPING  = thisForm.SHIPPING.value;

	if ( thisForm.ADDITIONALINFO == null ) {
		strADDTLINFO = "";
	} else {
		var s = thisForm.ADDITIONALINFO[thisForm.ADDITIONALINFO.selectedIndex].value;
		s = s.split('^');
		strADDTLINFO = s[0];
	}
	if ( thisForm.ADDITIONALINFO2 != null ) {
		var s = thisForm.ADDITIONALINFO2[thisForm.ADDITIONALINFO2.selectedIndex].value;
		s = s.split('^');
		strADDTLINFO += "; " + s[0];
	}
	if ( thisForm.ADDITIONALINFO3 != null ) {
		var s = thisForm.ADDITIONALINFO3[thisForm.ADDITIONALINFO3.selectedIndex].value;
		s = s.split('^');
		strADDTLINFO += "; " + s[0];
	}
	if ( thisForm.ADDITIONALINFO4 != null ) {
		var s = thisForm.ADDITIONALINFO4[thisForm.ADDITIONALINFO4.selectedIndex].value;
		s = s.split('^');
		strADDTLINFO += "; " + s[0];
	}

	var qtyMax = -1;

	if( bNoQtyAllowed ) 
	{
		qtyMax = 1;
	}
	else if ( thisForm.QTYMAX && thisForm.QTYMAX.value >= 0 )
	{
			qtyMax = parseInt( thisForm.QTYMAX.value );
	}
	if( qtyMax > 0 )
		strADDTLINFO += "|qty=" + qtyMax;
			
   //Is this product already in the cart?  If so, increment quantity instead of adding another.
   for ( i = 1; i <= iNumberOrdered; i++ ) {
      NewOrder = "Order." + i;
      database = "";
      database = GetCookie(NewOrder);

      Token0 = database.indexOf("|", 0);
      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( 0, Token0 );
      fields[1] = database.substring( Token0+1, Token1 );
      fields[2] = database.substring( Token1+1, Token2 );
      fields[3] = database.substring( Token2+1, Token3 );
      fields[4] = database.substring( Token3+1, Token4 );
      fields[5] = database.substring( Token4+1, Token5 );
			fields[6] = database.substring( Token5+1, database.length );

      if ( fields[0] == strID_NUM &&
           fields[2] == strPRICE  &&
           fields[3] == strNAME   &&
           fields[6] == strADDTLINFO
         ) 
      {
         bAlreadyInCart = true;
				 
         if ( !bNoQtyAllowed )
         {
					 var nqty = parseInt(strQUANTITY) + parseInt(fields[1]);
					 if( qtyMax >= 0 && nqty > qtyMax )
					 {
							alert( strQtyMaxError + " " + qtyMax + " ( " + fields[3] + " )" );
							return;
					 }
           dbUpdatedOrder = strID_NUM    + "|" +
                          nqty  + "|" +
                          strPRICE     + "|" +
                          strNAME      + "|" +
                          strSHIPPING  + "|" +
                          strShipCoeff + "|" +
                          strADDTLINFO;
           strNewOrder = "Order." + i;
           DeleteCookie(strNewOrder, "/");
           SetCookie(strNewOrder, dbUpdatedOrder, null, "/");
           notice = strQUANTITY + " " + strNAME + " " + strAdded;
         }
				 else
	         notice = strNAME + " " + strAdded;
         break;
      }
   }

   if ( !bAlreadyInCart ) 
   {
      iNumberOrdered++;

			if( qtyMax >= 0 && strQUANTITY > qtyMax )
			{
				alert( strQtyMaxError + " " + qtyMax + " ( " + strNAME + " )" );
				return;
			}
			
      if ( iNumberOrdered > MaxItemPerOrder )
         alert( strSorry );
      else 
      {
         dbUpdatedOrder = strID_NUM    + "|" + 
                          strQUANTITY  + "|" +
                          strPRICE     + "|" +
                          strNAME      + "|" +
                          strSHIPPING  + "|" +
                          strShipCoeff + "|" +
                          strADDTLINFO;

         strNewOrder = "Order." + iNumberOrdered;
         SetCookie(strNewOrder, dbUpdatedOrder, null, "/");
         SetCookie("NumberOrdered", iNumberOrdered, null, "/");
         if( !bNoQtyAllowed ) 
	         notice = strQUANTITY + " " + strNAME + " " + strAdded;
	     else
	         notice = strNAME + " " + strAdded;
      }
   }
   if ( DisplayNotice && notice != "" )
      alert(notice);
}
//---------------------------------------------------------------------
// 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) 
{
	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:    MoneyFormat
// PARAMETERS:  Number to be formatted
// RETURNS:     Formatted Number 
// PURPOSE:     Reformats Dollar Amount to #.## format
//---------------------------------------------------------------------
function moneyFormat(input, decsep) 
{
	var dollars = Math.floor(input);
	var tmp = new String(input);
	for( var decimalAt = 0; decimalAt < tmp.length; decimalAt++ ) { if ( tmp.charAt(decimalAt)=="." ) break; }
	var cents  = "" + Math.round(input * 100);
	cents = cents.substring(cents.length-2, cents.length);
	dollars += ((tmp.charAt(decimalAt+2)=="9")&&(cents=="00"))? 1 : 0;
	if( cents.length == 1 )
		cents = "0" + cents;
	if( (decsep == null) || (decsep == "") )
	 return(dollars + DecimalSymbol + cents);
	return(dollars + '.' + cents);
}
function taxFormat(input) {
   input = Math.round(input*100*1000) / 1000;
   return input;
}
//---------------------------------------------------------------------
// FUNCTION:    RemoveFromCart
// PARAMETERS:  Order Number to Remove
// RETURNS:     Null
// PURPOSE:     Removes an item from a users shopping cart
//---------------------------------------------------------------------
function RemoveFromCart(RemOrder) 
{
	if( confirm(strRemove) ) 
	{
		NumberOrdered = GetCookie("NumberOrdered");
		for(i=RemOrder; i<NumberOrdered; i++)
		{
			 NewOrder1 = "Order." + (i+1);
			 NewOrder2 = "Order." + (i);
			 database = GetCookie(NewOrder1);
			 SetCookie(NewOrder2, database, null, "/");
		}
		NewOrder = "Order." + NumberOrdered;
		SetCookie("NumberOrdered", NumberOrdered-1, null, "/");
		DeleteCookie(NewOrder, "/");
		location.href=location.href;
	}
}
//---------------------------------------------------------------------
// FUNCTION:    CleanShopcart
// PURPOSE:     delete shopcart cookies
//---------------------------------------------------------------------
function CleanShopcart() 
{
	DeleteCookie( "NumberOrdered", "/" );  
	DeleteCookie( "rebate", "/" );
	DeleteCookie( "OrderId", "/" );
}
//---------------------------------------------------------------------
// FUNCTION:    ChangeQuantity
// PARAMETERS:  Order Number to Change Quantity
// RETURNS:     Null
// PURPOSE:     Changes quantity of an item in the shopping cart
//---------------------------------------------------------------------
function ChangeQuantity(OrderItem,NewQuantity) 
{
	if( NewQuantity.value == "" || isNaN(NewQuantity.value) ) {
		alert(strErrQty);
	} else 
	{
		NewOrder = "Order." + OrderItem;
		database = "";
		database = GetCookie(NewOrder);

		Token0 = database.indexOf("|", 0);
		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( 0, Token0 );
		fields[1] = database.substring( Token0+1, Token1 );
		fields[2] = database.substring( Token1+1, Token2 );
		fields[3] = database.substring( Token2+1, Token3 );
		fields[4] = database.substring( Token3+1, Token4 );
		fields[5] = database.substring( Token4+1, Token5 );
		fields[6] = database.substring( Token5+1, database.length );

		var qty = fields[6].split("|qty=");
		if( qty.length>0 && parseInt(NewQuantity.value)>parseInt(qty[1]) )
		{
			NewQuantity.focus();
			alert( strQtyMaxError + " " + qty[1] + " ( " + fields[3] + " )" );
			NewQuantity.value = qty[1];
			return;
		}
		dbUpdatedOrder = fields[0] + "|"+NewQuantity.value + "|" +fields[2] + "|" +fields[3] + "|" +fields[4] + "|" +fields[5] + "|" +fields[6];
		strNewOrder = "Order." + OrderItem;
		DeleteCookie(strNewOrder, "/");
		SetCookie(strNewOrder, dbUpdatedOrder, null, "/");
		location.href=location.href;      
	}
}
//---------------------------------------------------------------------
// FUNCTION:    getUniqueId
// PARAMETERS:  Null
// RETURNS:     a 11 character unique Id (time based) 
//---------------------------------------------------------------------
function getUniqueId()
{
	var retval = '';
	var ConvArray = new initArray(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F');
	var tmpnum, i = 0;
	var value = new Date().getTime();
	var intnum = parseInt(value,10);
	if (isNaN(intnum)) {
		retval = 'NaN';
	} else 
	{
		while (intnum > 0.9)
		{
			i++;
			tmpnum = intnum;
			// cancat return string with new digit:
			retval = ConvArray[tmpnum % 16] + retval;  
			intnum = Math.floor(tmpnum / 16);
			if(i > 100)
			{
				// break infinite loops
				retval = 'NaN';
				break;
			}
		}
	}
	return retval;
}

function GetAdditionalCountryShipping( cncode )
{
  if( cncode != "" )
  {
	var as = "IT;10;AF;30;ZA;30;AL;20;DZ;20;DE;10;AO;30;AI;30;AQ;30;AG;30;AN;30;SA;30;AR;30;AM;15;AW;30;AU;30;AT;10;AZ;30;BS;30;BH;30;BD;30;BB;30;PW;30;BE;10;BZ;30;BJ;30;BM;30;BT;30;BY;30;BO;30;BA;30;BW;30;BR;30;BN;30;BG;10;BF;30;BI;30;KH;30;CM;30;CA;30;CV;30;CL;30;CN;30;CY;10;CO;30;KM;30;CG;30;KP;30;KR;30;CR;30;CI;30;HR;10;CU;30;DK;10;DJ;30;DM;30;EG;30;AE;30;EC;30;ER;30;ES;10;EE;10;US;30;ET;30;FI;10;GE;10;GA;30;GM;30;GH;30;GI;30;GR;10;GD;30;GL;30;GP;30;GU;30;GT;30;GN;30;GQ;30;GW;30;GY;30;GF;7;HT;30;HN;30;HK;30;HU;10;BV;30;CX;30;NF;30;KY;30;CK;30;FO;30;FK;30;FJ;30;GS;30;HM;30;MH;30;PN;30;SB;30;SJ;30;TC;30;VI;30;VG;30;CC;30;IN;30;ID;30;IR;30;IQ;30;IE;10;IS;30;IL;30;JM;30;JP;30;JO;30;KZ;30;KE;30;KG;30;KI;30;KW;30;LA;30;LS;30;LV;30;LB;30;LR;30;LY;30;LI;30;LT;10;LU;10;MO;30;MG;30;MY;30;MW;30;MV;30;ML;30;MT;30;MP;30;MA;30;MQ;7;MU;7;MR;30;YT;30;MX;30;FM;30;MD;30;MN;30;MS;30;MZ;30;MM;30;NP;30;NA;30;NR;30;NI;30;NE;30;NG;30;NU;30;NO;10;NC;30;NZ;30;OM;30;UG;30;UZ;30;PK;30;PA;30;PG;30;PY;30;NL;10;PE;30;PH;30;PL;10;PF;7;PR;30;PT;10;QA;30;MK;30;CF;30;CD;30;DO;30;CZ;10;RE;7;RO;10;GB;10;RU;30;RW;30;SN;30;EH;30;KN;30;SM;30;PM;7;VC;30;SH;30;LC;30;SV;30;WS;30;AS;30;SC;30;SL;30;SG;30;SI;10;SK;10;SO;30;SD;30;LK;30;SE;10;CH;10;SR;30;SZ;30;SY;30;TW;30;TJ;30;TZ;30;TD;30;TF;30;IO;30;TH;30;TL;30;TG;30;TK;30;TO;30;TT;30;TN;30;TM;30;TR;30;TV;30;UA;30;UY;30;VU;30;VA;30;VE;30;VN;30;WF;30;YE;30;YU;10;ZM;30;ZW;30";    
	var ss = as.split(";");
	for( var i=0; i<ss.length; i+=2 )
	{
		  if( ss[i] == cncode )
			return eval( ss[i+1] );
	} 
  }
  return 0.00;
}

function GetCountryShippingVAT( cncode, defvalue )
{
  if( cncode != "" )
  {
	var as = "";    
	var ss = as.split(";");
	for( var i=0; i<ss.length; i+=2 )
	{
		  if( ss[i] == cncode )
			return eval( ss[i+1] );
	} 
  }
  return defvalue;
}

// Shipment values
shipments[0] = new createShipment("Mode de livraison par défaut","",0.0,"ALL")
shipments[0].fixed_limits   = new initArray(0.01,90.00);
shipments[0].fixed_amounts  = new initArray(6.95,0.00);

//---------------------------------------------------------------------
// FUNCTION:    GetShipmentPrice
// PARAMETERS:  country code (cc) and shipment index (n)
// RETURNS:     shipment price according to the g_SubTotalCost and g_TotalWeight of the order
//---------------------------------------------------------------------
function GetShipmentPrice(cc, n)
{
	var shipmentprice = 0.0;
  if( shipments.length > 0 ) 
  {
    if( !n || n >= shipments.length )
      n = 0;
    if( shipments[n].hasCountry( cc ) )
		{
//	    shipmentprice = shipments[n].getFixedShippingAmount( g_SubTotalCost ) + shipments[n].getWeightShippingAmount( g_TotalWeight );	
			var fixed = shipments[n].getFixedShippingAmount( g_SubTotalCost );
			var weight = shipments[n].getWeightShippingAmount( g_TotalWeight );
			if( ( fixed == 0.0 && shipments[n].fixed_limits && shipments[n].fixed_limits.length > 1 ) ||
			    ( weight == 0.0 && shipments[n].weight_limits && shipments[n].weight_limits.length > 1 ) ) {
			  // free shipping price reached (because at least 2 limits defined and a zero value returned)
				shipmentprice = 0.0;
			} else
				shipmentprice = fixed + weight;
		}
  }	
	return shipmentprice;
}
//---------------------------------------------------------------------
// FUNCTION:    GetShipmentVAT
// PARAMETERS:  shipment index (n)
// RETURNS:     shipment VAT rate
//---------------------------------------------------------------------
function GetShipmentVAT(n)
{
	var shipmentvat = 0.0;
  if( shipments.length > 0 ) 
  {
    if( n == null || n >= shipments.length )
      n = 0;
	  if( n < 0 ) {
			shipmentvat = TaxRate;
		} else if( shipments[n] ) 
			shipmentvat = shipments[n].vatrate;
  }	
	return shipmentvat;
}
//---------------------------------------------------------------------
// FUNCTION:    generateCountryShipments
// PARAMETERS:  country code (cc) and selected shipment index (shipmentsel)
// RETURNS:     string containing the HTML code of shipments' choices
//---------------------------------------------------------------------
function generateCountryShipments(cc, shipmentsel)
{
  var html = "", bHasShipment = false, i;
  var fixedship = CalculateFixedShipping();
  if( shipments.length >= 1 ) // at least one shipment has in order to be defined to display anything
  {		
		if( !cc || cc == "" ) cc = DefaultCountry; 
		cc = cc.substring(0,2);	
		// if only one shipment is defined with all countries by default (i.e. a V2 website) then we return a non-empty result (a white space char  in order not to display this shipment name & info but just the "continue" button for V2 user compatibility
		if( shipments.length == 1 && shipments[0].countries == 'ALL' ) 
			return " ";
			
		if( !shipmentsel || shipmentsel >= shipments.length )
			shipmentsel = 0;
		if( !(shipments[shipmentsel].hasCountry( cc )) )
		{
			for(i=0; i<shipments.length; i++)
				if( shipments[i].hasCountry( cc ) )
				{
					shipmentsel = i;
					break;
				}
		}
		
	html += '<table border="0" cellpadding="0" cellspacing="2"><tr><td colspan="2">&nbsp;</td></tr>';
	for(i=0; i<shipments.length; i++)
      if( shipments[i].hasCountry( cc ) )
      {
        var totalshipping = shipments[i].getFixedShippingAmount( g_SubTotalCost ) + shipments[i].getWeightShippingAmount( g_TotalWeight );
		html += '<tr><td valign="top"><input type="radio" name="'+OutputOrderShipment+'" value="' + i + '" onclick="javascript:RefreshShippingPrice(' + i + ')" ';		
        if( i == shipmentsel ) 
				{ 
					html += 'checked'; 
					CurrentShipment = i;
					bHasShipment = true;
				}
		if( SHIPPINGDETAILS ) {
			html += '></td><td><b>' + shipments[i].name + '</b> (' + AddMonetarySymbol(moneyFormat(totalshipping)) + 
															     ' + ' + AddMonetarySymbol(moneyFormat(fixedship)) + 
															     ' + ' + AddMonetarySymbol(moneyFormat(GetAdditionalCountryShipping(cc))) + 
																')<br>' + shipments[i].desc + '</td></tr>';
		} else
			html += '></td><td><b>' + shipments[i].name + '</b> (' + AddMonetarySymbol(moneyFormat(totalshipping+fixedship+GetAdditionalCountryShipping(cc))) + ')<br>' + shipments[i].desc + '</td></tr>';
      }
		html += '<tr><td colspan="2">&nbsp;</td></tr></table>';
  }
	if( !bHasShipment ) 
		html = "";
  return html;
}
//---------------------------------------------------------------------
// FUNCTION:    RemoveUnsafeChars
// PARAMETERS:  string
// RETURNS:     string without any double quotes
//---------------------------------------------------------------------
function RemoveUnsafeChars(str)
{
  if( str != null )
    return str.replace( '\"', '\'\'' );		// replace double quotes with two simple quotes
  return null;
}
//---------------------------------------------------------------------
// FUNCTION:    crpt
// PARAMETERS:  string to crypt (str) & lowercase flag (lwc)
// RETURNS:     md5 encryption of a string
//---------------------------------------------------------------------
function crpt(str,lwc) 
{ 
	var res="";	if( lwc ) str = str.toLowerCase();
	if( typeof hex_md5 != "undefined" )
		res = hex_md5( str );
  return res;
}
	 
function GetCouponIndex(name)
{
	var cp = name;
	if( cp == null || name == "" )
		cp = GetCookie( "rebate" );
	if( cp )
	{
		var aCpnName = new initArray( );
		for( var i=0; i<aCpnName.length; i++ )
		  if( aCpnName[i] == crpt( cp, RebateIgnoreCase, 4 ) )
			  return i;
	}
	return -1;
}

function GetCouponPrice()
{
	var aCpnPrice = new initArray( );
	var i = GetCouponIndex();
	if( i >= 0 )
	  return aCpnPrice[ i ];
	return 0.0;
}

function ChangeCoupon()
{
	var scouponval = "";
    var elt = document.getElementById("rebate");
	if( elt )
       scouponval = elt.value;
	if( scouponval != "" )
	{
		var i = GetCouponIndex( scouponval );
		if( i < 0 )
		{
				alert(strRebateError);
				elt.focus();
				return false;
		}
		SetCookie( "rebate", scouponval );
	}
	else
	{
		SetCookie( "rebate", scouponval );
		DeleteCookie( "rebate", "/" );
	}
	// recalc & update
  location.href=location.href;      
}
//---------------------------------------------------------------------
// FUNCTION:    ManageCart
// PARAMETERS:  Null
// RETURNS:     Product Table Written to Document
// PURPOSE:     Draws current cart product table on HTML page
//---------------------------------------------------------------------
function ManageCart( ) 
{
	var iNumberOrdered = 0;    //Number of products ordered
	var fTotal         = 0;    //Total cost of order
	var fTax           = 0;    //Tax amount
	var fTax2          = 0;    //Shipping Tax amount
	var fShipping      = InitialShippingAmount;    //Shipping amount
	var fShippingWeight = 0;   //Shipping weight
	var strTotal       = "";   //Total cost formatted as money
	var strTax         = "";   //Total tax formatted as money
	var strShipping    = "";   //Total shipping formatted as money
	var strOutput      = "";   //String to be written to page
	var bDisplay       = true; //Whether to write string to the page (here for programmers)
	var fCoupon 			 = 0.0;  // MODIF REBATE
	var sif, strREF="";
	var qtyMax = -1;

	SetCookie("OrderId", getUniqueId(), null, "/");

	iNumberOrdered = GetCookie("NumberOrdered");
	if( iNumberOrdered == null )
		iNumberOrdered = 0;

	if( bDisplay )
		strOutput = "<center><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 ( iNumberOrdered == 0 ) {
		strOutput += "<TR><TD COLSPAN=6 CLASS=\"nopentry\"><CENTER><BR><B>" + strEmptyCart + "</B><BR><BR></CENTER></TD></TR>";
	}
	g_TotalWeight = 0.0;
	g_SubTotalCost = 0.0;

	for( i=1; i<=iNumberOrdered; i++) 
	{
		NewOrder = "Order." + i;
		database = "";
		database = GetCookie(NewOrder);

		Token0 = database.indexOf("|", 0);
		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( 0, 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 );          // Shipping Cost
		fields[5] = database.substring( Token4+1, Token5 ); 				 //Shipping weight
		fields[6] = database.substring( Token5+1, database.length ); //Additional Information		

		sif = fields[0].split('^');
		if( sif.length > 1 )
			strREF = sif[1];
		else
			strREF = sif[0];
	
// {		 3.1 qty bugfix
//		bNoQtyUpdate = ( fields[6].indexOf("|qty=1", 0) >= 0 );
// }
		k = fields[6].indexOf("|qty=", 0);
		if(k >= 0)
		{
			qtyMax = parseInt( fields[6].substring( k+5 ) );
			fields[6] = fields[6].substring( 0, k );
		}	
// {		 3.1 qty bugfix
		bNoQtyUpdate = ( qtyMax == 1 );
// }
		fTotal += (parseInt(fields[1]) * parseFloat(fields[2]) );
		fShipping += (parseInt(fields[1]) * parseFloat(fields[4]) );
		if( fields[5] && fields[5].length > 0 )
		{
			fShippingWeight += (parseInt(fields[1]) * parseFloat(fields[5]) );
			g_TotalWeight = fShippingWeight;
		}
		g_SubTotalCost = fTotal;

		// TAX on shipping
		if( TaxOnShipping <= 0.0 || TaxOnShipping == TaxRate )
		{
			if( TaxOnShipping == TaxRate )
				fTax = fTotal + fShipping
			else
				fTax = fTotal;

			if( TaxIncluded )
				fTax = fTax - fTax / ( 1.00 + TaxRate )
			else
				fTax = (fTax * TaxRate);
			fTax2 = 0.0;
		}
		else
		{
			if( TaxIncluded )
			{
				fTax = fTotal - fTotal / ( 1.00 + TaxRate );
				fTax2 = fShipping - fShipping / ( 1.00 + TaxOnShipping );
			}
			else
			{
				fTax = (fTotal * TaxRate);
				fTax2 = (fShipping * TaxOnShipping);
			}
		}
		strTotal    = moneyFormat(fTotal, '.');
		strTax      = moneyFormat(fTax, '.');
		strShipping = moneyFormat(fShipping, '.');
		if( bDisplay ) 
		{
			if( DisplayItemLinks ) 
			{
				var url = "";
				var pidx ="";
				database = sif[0];
				Token0 = database.indexOf("-", 0);
				url = CatalogPath[ eval( database.substring( 0, Token0 ) ) - 1 ];

				// remove leading zeros (JS bug with eval)
				pidx = database.substring( Token0+1, database.length );
				while( pidx.substring( 0, 1 ) == '0' )
						pidx = pidx.substring( 1, database.length );
				Token0 = eval( pidx );
				if( (Token0 > 1) || (url.substring( url.length - 4 ) == "page" ) )
					url += pidx;
				url += htmlExt;
				strOutput += "<TR><TD CLASS=\"nopentry\">"  + strREF + "</TD><TD CLASS=\"nopentry\"><a href=\"" + url + "\">" + fields[3] + "</a>";
			}
			else
				strOutput += "<TR><TD CLASS=\"nopentry\">"  + strREF + "</TD><TD CLASS=\"nopentry\">" + fields[3];
			
			if( fields[6] != "" )
			 strOutput += " - <I>"+ fields[6] + "</I></TD>";
			strOutput += "</TD>";

			if( !bNoQtyUpdate )
				strOutput += "<TD CLASS=\"nopentry\" align=\"center\"><INPUT TYPE=TEXT NAME=Q SIZE=2 VALUE=\"" + fields[1] + "\" onChange=\"ChangeQuantity("+i+", this);\"></TD>";
			else
				strOutput += "<TD CLASS=\"nopentry\" align=\"center\">" + fields[1] + "</TD>";
			strOutput += "<TD CLASS=\"nopentry\">"+ AddMonetarySymbol(moneyFormat(fields[2])) + strPerItem +"</TD>";

			if ( DisplayShippingColumn ) 
			{
				if ( parseFloat(fields[4]) > 0 )
					strOutput += "<TD CLASS=\"nopentry\">"+ AddMonetarySymbol(moneyFormat(fields[4])) + strPerItem +"</TD>";
				else if( parseFloat(fields[5]) > 0 && WeightUnit != "" )
				{
					var sx = parseInt(fields[1]) * parseFloat(fields[5]);
					strOutput += "<TD CLASS=\"nopentry\">" + sx + WeightUnit + "</TD>";
				}
				else
					strOutput += "<TD CLASS=\"nopentry\">" + strNotApplicable + "</TD>";
			}
			strOutput += "<TD CLASS=\"nopentry\" ALIGN=CENTER><input type=button value=\" "+strRButton+" \" onClick=\"RemoveFromCart("+i+")\" class=\"nopbutton\"></TD></TR>";
		}
		
		if ( AppendItemNumToOutput )
			strFooter = i;
		else
			strFooter = "";

		if( HiddenFieldsToCheckout ) 
		{
			 strOutput += "<input type=hidden name=\"" + OutputItemId        + strFooter + "\" value=\"" + strREF + "\">";
			 strOutput += "<input type=hidden name=\"" + OutputItemQuantity  + strFooter + "\" value=\"" + fields[1] + "\">";
			 strOutput += "<input type=hidden name=\"" + OutputItemPrice     + strFooter + "\" value=\"" + fields[2] + "\">";
			 strOutput += "<input type=hidden name=\"" + OutputItemName      + strFooter + "\" value=\"" + RemoveUnsafeChars( fields[3] ) + "\">";
			 strOutput += "<input type=hidden name=\"" + OutputItemShipping  + strFooter + "\" value=\"" + fields[4] + "\">";
			 strOutput += "<input type=hidden name=\"" + "USC" + strFooter + "\" value=\"" + fields[5] + "\">";
			 strOutput += "<input type=hidden name=\"" + OutputItemAddtlInfo + strFooter + "\" value=\"" + fields[6] + "\">";
		}
	}
 
 	if( UseRebate )
	{
		fCoupon = GetCouponPrice();
		if( fCoupon < 0 )
			fCoupon = -1 * (fTotal + fShipping + fTax + fTax2 ) * fCoupon;
	}
	g_TotalCost = (fTotal + fShipping + fTax + fTax2 - fCoupon);
	g_SubTotalCost = fTotal;
	g_TotalShipping = fShipping;
	 
	if ( bDisplay ) 
	{
		// strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=4><B>"+strSUB+"&nbsp;</B></TD>";
		// strOutput += "<TD align='right' CLASS=\"noptotal\" COLSPAN=2><B>" + AddMonetarySymbol(moneyFormat(fTotal)) + "</B></TD>";
		// strOutput += "</TR>";
		if ( false ) { //DisplayShippingRow ) {
			 strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=4><B>"+strSHIP+"&nbsp;</B></TD>";
			 strOutput += "<TD align='right' CLASS=\"noptotal\" COLSPAN=2><B>" + AddMonetarySymbol(moneyFormat(fShipping)) + "</B></TD>";
			 strOutput += "</TR>";
		}
		if ( false ) { // DisplayTaxRow ) {
			 strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=4><B>"+strTAX+"&nbsp;</B></TD>";
			 strOutput += "<TD align='right' CLASS=\"noptotal\" COLSPAN=2><B>" + AddMonetarySymbol(moneyFormat(fTax)) + "</B></TD>";
			 strOutput += "</TR>";
		}
		strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=4><B>"+strTOT+"&nbsp;</B></TD>";
	//      strOutput += "<TD align='right' CLASS=\"noptotal\" COLSPAN=2><B>" + AddMonetarySymbol(moneyFormat(g_TotalCost)) + "</B></TD>";
		strOutput += "<TD align='right' CLASS=\"noptotal\" COLSPAN=2><B>" + AddMonetarySymbol(moneyFormat(fTotal)) + "</B></TD>";
		strOutput += "</TR>";
		strOutput += "</TABLE></center>";

		if( UseRebate && iNumberOrdered > 0 )
		{
			strOutput += "<center><br><table cellspacing=0 cellpadding=0 border=0><tr><td>";
			var s = GetCookie( "rebate" );
			if( s == null )
				s = "";
			strOutput += ""+strRebateFormLabel+"&nbsp;</td><td><input type=\"input\" name=\"rebate\" onChange=\"ChangeCoupon()\" id=\"rebate\" value=\"" + s + "\">";
			strOutput += "<input class=\"nopbutton\" name=\"cvalidate\" onclick=\"ChangeCoupon()\" type=\"button\" value=\"OK\">";

			if( fCoupon > 0 )
			{
				fCoupon = GetCouponPrice();
				if( fCoupon < 0 )
				{
					fCoupon = fCoupon * 100;
					strOutput += "</tr><tr><td>&nbsp;</td><td align='left'>"+strRebateTotal+" : <b>"+fCoupon+"%</b>";
				}
				else
					strOutput += "</tr><tr><td>&nbsp;</td><td align='left'>"+strRebateTotal+" : <b>"+AddMonetarySymbol(moneyFormat(fCoupon))+"</b>";
			}
			strOutput += "</td></tr></table></center>";
		}

		if ( HiddenFieldsToCheckout ) 
		{
			 strOutput += "<input type=\"hidden\" name=\""+OutputOrderShipping+"\" value=\""+ moneyFormat(fShipping, '.') + "\">";
//         	strOutput += "<input type=\"hidden\" name=\"shipping2\" value=\""+ moneyFormat(fShipping, '.') + "\">";
			 strOutput += "<input type=\"hidden\" name=\""+OutputOrderTotal+"\"    value=\""+ moneyFormat(g_TotalCost, '.') + "\">";
		}
	}
	document.write(strOutput);
	//	 alert( 'weight=' + g_TotalWeight + ' / amount = ' + g_SubTotalCost );
	document.close();
}
/*
function DisplayBillingInfo() {
   var strOutput = GetCookie("OrderComment");
   document.open();
   if (!strOutput) {
      document.writeln( "<p>" + strNoComment + "</p>" );
   } else
   {
      document.writeln( "<p>" + strOutput + "</p>" );
      document.writeln( "<input type=hidden name=\"comment\"    value=\""+ strOutput + "\">" );
   }
   document.close();
}

function GetOrderAmount( excludeShipping )
{
  var amount = "";
  if( excludeShipping == 1 ) {
    amount = GetCookie("OrderSubtotal");
  } else
  	amount = GetCookie("OrderTotal");
  return( amount );
}
*/
//---------------------------------------------------------------------
// FUNCTION:    ValidateCart
// PARAMETERS:  Form to validate
// RETURNS:     true/false
// PURPOSE:     Validates the managecart form
//---------------------------------------------------------------------
function ValidateCart( theForm ) 
{
	if( MinimumOrder >= 0.01 ) {
		if( g_TotalCost < MinimumOrder ) {
			alert( MinimumOrderPrompt );
			return false;
		}
	}
	if( MaximumOrder >= 0.01 ) {
		if( g_TotalCost > MaximumOrder ) {
			alert( MaximumOrderPrompt );
			return false;
		}
	}
	if( MinimumOrderWeight >= 0.01 ) {
		if( g_TotalWeight < MinimumOrderWeight ) {
			alert( MinimumOrderWeightPrompt );
			return false;
		}
	}
	if( MaximumOrderWeight >= 0.01 ) {
		if( g_TotalWeight > MaximumOrderWeight ) {
			alert( MaximumOrderWeightPrompt );
			return false;
		}
	}
	if( UseRebate )	{
		if( theForm.rebate ) 
		{
			var s = theForm.rebate.value;
			if ( s != null && s != "" && strRebateError != "" )
			{	
				if( GetCouponIndex( s ) < 0 ) {
					alert(strRebateError);
					return false;
				}
				else if( g_TotalCost < MinimumOrder ) {
					alert( MinimumOrderPrompt );
					return false;
				}
			}					
		}
	}
	SetCookie("OrderTotal", theForm.TOTAL.value, null, "/");	
  return true;
}
//---------------------------------------------------------------------
// FUNCTION:    CheckoutCart
// PARAMETERS:  Null
// RETURNS:     Product Table Written to Document
// PURPOSE:     Draws current cart product table on HTML checkout page
//---------------------------------------------------------------------
function CheckoutCart( bHide, paypalcart, bcalc ) 
{
	var iNumberOrdered = 0;    //Number of products ordered
	var fTotal         = 0;    //Total cost of order
	var fTax           = 0;    //Tax amount
	var fTax2          = 0;    //Shipping Tax amount
	var fShipping      = InitialShippingAmount;    //Shipping amount
	var fShippingWeight = 0;   // Shipping weight
	var strTotal       = "";   //Total cost formatted as money
	var strTax         = "";   //Total tax formatted as money
	var strTax2        = "";   //Shipping tax formatted as money
	var strShipping    = "";   //Total shipping formatted as money
	var strOutput      = "";   //String to be written to page
	var strPP          = "";   //Payment Processor Description Field
	var bDisplay 	  = (bHide != true);
	var fCoupon      = 0;		// MODIF REBATE
	var sif, strREF="";
	var couponInfo = "";
	
	g_TotalWeight = 0.0;
	g_SubTotalCost = 0.0;
	iNumberOrdered = GetCookie("NumberOrdered");
	if( iNumberOrdered == null )
		iNumberOrdered = 0;
	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>":"") +
								"</TR>";

  for( i=1; i<=iNumberOrdered; i++) 
	{
		NewOrder = "Order." + i;
		database = "";
		database = GetCookie(NewOrder);

		Token0 = database.indexOf("|", 0);
		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( 0, Token0 );                 // Product ID
		fields[1] = database.substring( Token0+1, Token1 );          // Quantity
		fields[2] = database.substring( Token1+1, Token2 );          // Price
		fields[3] = RemoveUnsafeChars( database.substring( Token2+1, Token3 ) );          // Product Name/Description
		fields[4] = database.substring( Token3+1, Token4 );          // Shipping Cost
		fields[5] = database.substring( Token4+1, Token5 );          // Shipping Cost
		fields[6] = RemoveUnsafeChars( database.substring( Token5+1, database.length ) ); //Additional Information
		fields[6] = fields[6].split("|qty=")[0]; // remove quantity flag info (use only to indicate that quantity is fixed to 1)

		sif = fields[0].split('^');
		if( sif.length > 1 )
			strREF = sif[1];
		else
			strREF = sif[0];
		
		fTotal += (parseInt(fields[1]) * parseFloat(fields[2]) );
		fShipping += (parseInt(fields[1]) * parseFloat(fields[4]) );
		if( fields[5] && fields[5].length > 0 )
			fShippingWeight += (parseInt(fields[1]) * parseFloat(fields[5]) );

		if( bDisplay ) 
		{
			 strOutput += "<TR><TD CLASS=\"nopentry\">"  + strREF + "</TD>";
			 if( fields[6] == "" )
					strOutput += "<TD CLASS=\"nopentry\">"  + fields[3] + "</TD>";
			 else
					strOutput += "<TD CLASS=\"nopentry\">"  + fields[3] + " - <I>"+ fields[6] + "</I></TD>";
			 
			 strOutput += "<TD CLASS=\"nopentry\">" + fields[1] + "</TD>";
			 strOutput += "<TD CLASS=\"nopentry\">"+ AddMonetarySymbol(moneyFormat(fields[2])) + strPerItem +"</TD>";
			 if( DisplayShippingColumn ) 
			 {
					if( parseFloat(fields[4]) > 0 )
						 strOutput += "<TD CLASS=\"nopentry\">"+ AddMonetarySymbol(moneyFormat(fields[4])) + strPerItem +"</TD>";
					else if( parseFloat(fields[5]) > 0 && WeightUnit != "" )
					{
						 var sx = parseInt(fields[1]) * parseFloat(fields[5]);
						 strOutput += "<TD CLASS=\"nopentry\">" + sx + WeightUnit + "</TD>";
					}
					else
						 strOutput += "<TD CLASS=\"nopentry\">" + strNotApplicable + "</TD>";
			 }
			 strOutput += "</TR>";
		}

		if ( AppendItemNumToOutput )
			 strFooter = i;
		else
			 strFooter = "";

		strOutput += "<input type=hidden name=\"" + ((paypalcart)?PPOutputItemId:OutputItemId) + strFooter + "\" value=\"" + strREF + "\">";
		strOutput += "<input type=hidden name=\"" + ((paypalcart)?PPOutputItemQuantity:OutputItemQuantity) + strFooter + "\" value=\"" + fields[1] + "\">";
		strOutput += "<input type=hidden name=\"" + ((paypalcart)?PPOutputItemPrice:OutputItemPrice) + strFooter + "\" value=\"" + fields[2] + "\">";
		strOutput += "<input type=hidden name=\"" + ((paypalcart)?PPOutputItemName:OutputItemName) + strFooter + "\" value=\"" + RemoveUnsafeChars(fields[3]) + "\">";
		strOutput += "<input type=hidden name=\"" + ((paypalcart)?PPOutputItemShipping:OutputItemShipping) + strFooter + "\" value=\"" + fields[4] + "\">";
		if( bHide && fields[6] != "" ) // Paypal
		{
			strOutput += "<input type=hidden name=\"" + ((paypalcart)?PPOutputItemAddtlInfo:OutputItemAddtlInfo) + strFooter + "\" value=\"" + fields[6] + "\">";
			strOutput += "<input type=hidden name=\"on0_" + strFooter + "\" value=\"Info\">";
		}
	}

	g_TotalWeight = fShippingWeight;
	g_SubTotalCost = fTotal;

	// rebate
	if( UseRebate )
	{
		fCoupon = GetCouponPrice();
		if( fCoupon < 0 ) // negative means a rebate percentage that we need to convert to a rebate amount
		{
			couponInfo = "" + (-100 * fCoupon) + "% ";
			fCoupon = -1 * fTotal * fCoupon;
		}
		g_SubTotalCost -= fCoupon;

	}
	if( DisplayTaxRow ) 
	{
		// TAX on shipping
		if( TaxOnShipping <= 0.0 || TaxOnShipping == TaxRate )
		{
			if( TaxOnShipping == TaxRate )
				fTax = g_SubTotalCost + fShipping
			else
				fTax = g_SubTotalCost;

			if( TaxIncluded )
				fTax = fTax - fTax / ( 1.00 + TaxRate )
			else
				fTax = (fTax * TaxRate);
			fTax2 = 0.0;
		}
		else
		{
			if( TaxIncluded )
			{
				fTax = g_SubTotalCost - g_SubTotalCost / ( 1.00 + TaxRate );
				fTax2 = fShipping - fShipping / ( 1.00 + TaxOnShipping );
			}
			else
			{
				fTax = (g_SubTotalCost * TaxRate);
				fTax2 = (fShipping * TaxOnShipping);
			}
		}
	}
	strTax = moneyFormat(fTax, '.');
	strTax2 = moneyFormat(fTax2, '.');
	strShipping = moneyFormat(fShipping, '.');
	if( paypalcart )
	 strOutput += "<input type=hidden name=\"shipping_1\" value=\"" + strShipping + "\">";

	if( UseRebate && fCoupon > 0.0 ) // rebate amount valid
	{
		var s = GetCookie( "rebate" );
		if( DisplayOrderRebate )
			couponInfo += "(" + s + ")";
		if( s == null )
			s = "";
		s = moneyFormat(fCoupon,'.') + "(" + s + ")";
		if( !paypalcart )
			strOutput += "<input type=\"hidden\" name=\"rebate\" value=\"" + s + "\">";
	}
	if( bDisplay ) 
	{
		// Order SUBTOTAL and associated Taxes
		var lblSub = ""+strSUB+"&nbsp;";
		var valSub = ""+AddMonetarySymbol(moneyFormat(fTotal));			

		if( UseRebate && fCoupon > 0 )
		{
			lblSub += "<BR>"+strRebateTotal+"&nbsp;"+couponInfo+"&nbsp;";
			valSub += "<BR>- " + AddMonetarySymbol(moneyFormat(fCoupon));
			if( DisplayTaxRow && !TaxIncluded && fTax > 0 ) 
			{
				strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=3>"+lblSub+"</TD><TD align='right' CLASS=\"noptotal\" COLSPAN='2'>"+valSub+"</TD></TR>";
				strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=3>" + strSUB2 + "&nbsp;";
				strOutput += "<BR>" + strTAX + " (" + taxFormat(TaxRate) + "%)&nbsp;</TD>";
				strOutput += "<TD align='right' CLASS=\"noptotal\" COLSPAN=2>" + AddMonetarySymbol(moneyFormat(g_SubTotalCost));
				strOutput += "<BR>" + AddMonetarySymbol(moneyFormat(fTax)) +"</TD>";
				strOutput += "</TR>";
			}			
			else
				strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=3>"+lblSub+"</TD><TD align='right' CLASS=\"noptotal\" COLSPAN='2'>"+valSub+"</TD></TR>";
		}	
		else
		{
			if( DisplayTaxRow && !TaxIncluded && fTax > 0 ) 
			{
				lblSub += "<BR>"+strTAX+" ("+taxFormat(TaxRate)+"%)&nbsp;";
				valSub += "<BR>"+AddMonetarySymbol(moneyFormat(fTax));
			}			
			strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=3>"+lblSub+"</TD><TD align='right' CLASS=\"noptotal\" COLSPAN='2'>"+valSub+"</TD></TR>";
		}
		// SHIPPING total and associated Taxes			
		lblSub = "";
		valSub = "";			
		if( DisplayShippingRow ) 
		{
			lblSub += ""+strSHIP+"&nbsp;";
			valSub += ""+AddMonetarySymbol(moneyFormat(fShipping));
		}
		if( DisplayTaxRow && !TaxIncluded && fTax2 > 0 ) 
		{
			if( DisplayShippingRow )
			{
				lblSub += "<BR>";
				valSub += "<BR>";			
			}
			lblSub += ""+strTAX+" ("+taxFormat(TaxOnShipping)+"%)&nbsp;";
			valSub += ""+AddMonetarySymbol(moneyFormat(fTax2));
		}
		if( lblSub != "" )
			strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=3>"+lblSub+"</TD><TD align='right' CLASS=\"noptotal\" COLSPAN='2'>"+valSub+"</TD></TR>";
		
		// TOTAL
		strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=3><B>"+strTOT+"&nbsp;</B></TD>";
		if( TaxIncluded ) {
			strOutput += "<TD align='right' CLASS=\"noptotal\" COLSPAN='2'><B>" + AddMonetarySymbol(moneyFormat((fTotal + fShipping - fCoupon))) + "</B></TD>";
		} else
			strOutput += "<TD align='right' CLASS=\"noptotal\" COLSPAN='2'><B>" + AddMonetarySymbol(moneyFormat((fTotal + fShipping + fTax + fTax2 - fCoupon))) + "</B></TD>";
		strOutput += "</TR>";

		// Taxes included
		if( DisplayTaxRow && TaxIncluded )
		{
			if( fTax > 0 || fTax2 > 0 )
			{
				var lblTaxes = "", valTaxes = "";
				if( fTax > 0 ) 
				{
					lblTaxes += "" + strTAX + " (" + taxFormat(TaxRate) + "%)&nbsp;";
					valTaxes += AddMonetarySymbol(moneyFormat(fTax));
				}
				if( fTax2 > 0 ) 
				{
					if( fTax > 0 )
					{
						lblTaxes += "<BR>";
						valTaxes += "<BR>";
					}
					lblTaxes += ""+strTAX+" ("+taxFormat(TaxOnShipping)+"%)&nbsp;";
					valTaxes += AddMonetarySymbol(moneyFormat(fTax2));
				}
				strOutput += "<TR><TD align='right' CLASS=\"noptotal\" COLSPAN=3>" + lblTaxes + "</TD><TD align='right' CLASS=\"noptotal\" COLSPAN='2'>" + valTaxes + "</TD>";
			}
		}
		strOutput += "</TABLE>";
	}

  strTotal = moneyFormat(fTotal - fCoupon, '.'); // MODIF REBATE
	strOutput += "<input type=\"hidden\" name=\""+OutputOrderSubtotal+"\" value=\""+ strTotal + "\">";
  strOutput += "<input type=\"hidden\" name=\""+OutputOrderShipping+"\" value=\""+ strShipping + "\">";
	strOutput += "<input type=\"hidden\" name=\""+OutputOrderShipment+"\" value=\""+ CurrentShipment + "\">"; 
	if( DisplayTaxRow && !TaxIncluded )
	{
	  if( fTax > 0 || fTax2 > 0 )
		{
		  if(paypalcart) {
				strOutput += "<input type=\"hidden\" name=\"tax_cart\" value=\""+ moneyFormat(fTax+fTax2, '.') +"\">";
			} else
				strOutput += "<input type=\"hidden\" name=\"tax\" value=\""+ moneyFormat(fTax+fTax2, '.') +"\">";
		  if( fTax > 0 )
				strOutput += "<input type=\"hidden\" name=\""+OutputOrderTax1+"\" value=\""+ moneyFormat(fTax, '.') + "(" + ( TaxRate * 100 ) + "%)\">";
		  if( fTax2 > 0 )
				strOutput += "<input type=\"hidden\" name=\""+OutputOrderTax2+"\" value=\""+ moneyFormat(fTax2, '.') +"("+ ( TaxOnShipping * 100 ) + "%)\">";
		}
	}
  strOutput += "<input type=\"hidden\" name=\""+OutputOrderTotal+"\" value=\""+ moneyFormat(g_TotalCost, '.') + "\">";
  if( !bcalc )
	{
		document.open();
		document.write(strOutput);
		document.close();
		//return strOutput;
	}

	g_TotalCost = fTotal + fShipping - fCoupon;	// MODIF REBATE
	if( !TaxIncluded )
		g_TotalCost += ( fTax + fTax2 );	
	g_SubTotalCost = fTotal;
	g_TotalShipping = fShipping;
	return g_TotalCost;
}
//---------------------------------------------------------------------
// FUNCTION:    showElement
// PARAMETERS:  HTML object (e) & boolean show flag (bshow)
// PURPOSE:     Show or Hide an HTML object
//---------------------------------------------------------------------
function showElement(e, bshow)
{
  if( e ) {
    if( bshow ) {
   	  e.style.visibility='visible'; 
      e.style.display='block';
    } else {
      e.style.visibility='hidden';
      e.style.display='none';
    }
  }
}
//---------------------------------------------------------------------
// FUNCTION:    DisplayItemInfo
// PARAMETERS:  item index (nid) & types/size/colors (a1/a2/a3) & show flags
// PURPOSE:     Display info of a  catalog item 
//---------------------------------------------------------------------
function DisplayItemInfo( nid, a1, a2, a3, bshowstock, bshowref, bshowqty )
{
  var e,s,t,nx,idx,i, ok = a1 >=0 && a2 >=0 && a3 >=0;
	var bshowqty = 0;
	if( ok )
	{
	  var asel = new Array;
	  asel[0] = 0;  
	  asel[1] = (a1>0)?0:-1;  
	  asel[2] = (a2>0)?0:-1;
	  asel[3] = (a3>0)?0:-1;  
	    
	  for( i=1; i<=3; i++ )
	  if( asel[i] >= 0 )
		{	
		  e = document.getElementById( nid + '-' + i );
	    if ( e ) {
				s = e.value.split('^');
				if( s[1] )
	 	      asel[ i ] = parseInt(s[1],10);
	 	  }
	  }
	  idx = 0.0;
		//alert('color=' + asel[1] + ' size=' + asel[2] + ' type=' + asel[3]);
	  if ( asel[1] >= 0 ) {
		  if( asel[2] >= 0 ) {
		    if( asel[3] >= 0 ) {
	        idx = asel[1] + (a1 * asel[2]) + (a2 * a1 * asel[3]);
	      } else
	        idx = asel[1] + (a1 * asel[2]);
		  } else {
		    if( asel[3] >= 0 ) {
	        idx = asel[1] + (a1 * asel[3]);
	      } else
	        idx = asel[1];
	    }
	  } else {
		if( asel[2] >= 0 ) {
	    if( asel[3] >= 0 ) {
	      idx = asel[2] + (a2 * asel[3]);
	    } else
	      idx = asel[2];
		} else
		  idx = asel[3];
	  }
	  s = nid.split('-');
	  nx = parseInt(s[1],10) - 1; // get item index
	  for( i=0; i<catprices[nx].length; i++ ) 
	  {  
	    e = document.getElementById( nid + '-p' + i );
	    if( e ) 
	      showElement( e, (i == idx) ); 
	    e = document.getElementById( nid + '-s' + i );
	    if( e )       
			  showElement( e, (i == idx) ); 
	  }
	  e = document.getElementById( nid + '-price' );
	  if( e )
	    e.value = catprices[nx][idx];
	  e = document.getElementById( nid + '-ship' );
	  if( e ) {
	    e.value = catshippings[nx][idx];
		} else {
	    e = document.getElementById( nid + '-weight' );
	    if( e )
	      e.value = catshippings[nx][idx];
		}
	  e = document.getElementById( nid + '-ref' );
	  if( e )
	    e.value = ''+nid+'^'+catreferences[nx][idx];
	  e = document.getElementById( nid + '-qtymax' );
	  if( e )
			e.value = catquantities[nx][idx];
	  e = document.getElementById( nid + '-status' );
	  if( e )
			e.value = catstatus[nx][idx];
	}
  e = document.getElementById( nid + '-qtyinfo' );
  if ( e )
	{
		var info = "", qty;
    if( bshowref == 1 )
		{		
			if( ok )
				info += "<div style='margin:0;padding:0'>" + strReferenceLabel + " " + catreferences[nx][idx] + "</div>";
			else
				info += "<div style='margin:0;padding:0'>" + strReferenceLabel + " " + (document.getElementById( nid + '-ref' ).value).split('^')[1] + "</div>";
		}
		if( bshowstock == 1 )
		{
			if( bshowqty == 1 )
			{
				if( ok ) 
					qty = catquantities[nx][idx];
				else
					qty = parseInt( document.getElementById( nid + '-qtymax' ).value );
				if( qty > 0 )
					info += "<div style='margin:0;padding:0'>" + strStockQuantityLabel + " " + qty + "</div>";
			}
			if( ok ) 
				qty = catstatus[nx][idx];
			else
				qty = parseInt( document.getElementById( nid + '-status' ).value );
			if( qty > 0 )
			{
			  info += "<table border='0' cellspacing='0' cellpadding='0'><tr>";
				if( strStockStatusLabel != "" )
					info += "<td style='padding:2px 0 0 0'>"+strStockStatusLabel+"&nbsp;</td>";
				info += "<td valign='center' style='padding:2px 4px 0px 0'><img border='0' src='../_frame/stock-" + qty + ".gif'";
				if( catstatusnames[qty] )
				{
					info += " title='" + catstatusnames[qty] + "' alt='" + catstatusnames[qty] + "' />";
					info += "</td><td style='padding:2px 0 0 0'>" + catstatusnames[qty];
				}
				else
				  info += " />";
				info += "</td></tr></table>";
			}
		}
		if( info != "" )
			info = "<div style='padding:0;margin:2px 0 2px 0'>" + info + "</div>";
		e.innerHTML = info;
	}
}

function SubmitWithEnterKey(event) 
{
  if (event.keyCode == 13) 
  {
    var e = document.getElementById('subm');
    if( e )
	  e.focus();
	return false;
  }
  return true;
}
