// Version 3.010
// Jonathan Maxwell Copyright 2005-2009
// Updated 30 March 2010

function CalcPrice(thatForm){

	var TempProductOptionArray, TempElementValue;
	var CurrencyRateDollar = DollarRate;
	var CurrencyRateEuro = EuroRate;
	var Submitted = false;
	if(arguments.length>1){Submitted = true;}
	var ShowTextboxName = true;	// shows text box name beside value
	
	var TotalFormFields = thatForm.elements.length;

	var DisplayWeight = new Number(0);
	var DisplayPrice = new Number(0);
	var StockCodes = "";

	// Gets stock codes
	for (var i = 1; i<TotalFormFields; i++) {
		var TempElement = thatForm.elements[i];
		var TempElementName = TempElement.name.toLowerCase();
		var TempElementValue = TempElement.value;
		var TempElementType = TempElement.type;
		
		if (TempElement.disabled==false){		
			// Stock Codes
			if (TempElementName.toLowerCase().indexOf("stockcode") > -1 && 
				TempElementName != "stockcode" && 
				TempElementValue != ""
			){
				// Only get selected stockcodes
				if((TempElementType == 'checkbox' || TempElementType == 'radio') && !TempElement.checked) break;
				StockCodes += TempElementValue + "~";
			}
		}
	}

	// Updates StockCode for cart
	if (StockCodes != "") StockCodes = StockCodes.substring(0,StockCodes.length-1);
	var ArrayStockCodes = StockCodes.split("~");
	var TempDisplayPrice = new Array();
	var TempDisplayWeight = new Array();
	
	// Checks each productoption and price
	for (var i = 0; i<ArrayStockCodes.length; i++) {
		
		var TempCurrentStockCode = ArrayStockCodes[i];
		
		// Price and Weight
		var TempPrice = new Number(0);
		var TempWeight = new Number(0);
		TempDisplayPrice[i] = new Number(0);
		TempDisplayWeight[i] = new Number(0);

		// Product Options
		var TempElement = thatForm.elements["productoption"+TempCurrentStockCode];

		if (TempElement){

			for (var j = 0; j<TotalFormFields; j++) {
				
				TempElement = thatForm.elements[j];
				if (TempElement.name == "productoption"+TempCurrentStockCode){
				
					TempElementType = TempElement.type;
					TempElementName = TempElement.name;
					TempElementValue = TempElement.value;
					TempElementDisabled = TempElement.disabled;
					TempElementChecked = TempElement.checked;
	
					// Override of checkbox/radio not selected
					if ((TempElementType=='checkbox' || TempElementType=='radio') && !TempElementChecked) TempElementDisabled = true;
	
					// Get Price, Weight per option/product
					if (TempElementDisabled==false){
						TempProductOptionArray = TempElementValue.split(":");
			
						// Price
						if (TempProductOptionArray[1]!=null && isNaN(TempProductOptionArray[1])==false){TempPrice = parseFloat(TempProductOptionArray[1]).toDecimals(2);}
						
						// Weight
						if (TempProductOptionArray[2]!= null){TempWeight = parseFloat(TempProductOptionArray[2]).toDecimals(3);}
	
						// Updates stock code price
						if (!isNaN(TempPrice)){TempDisplayPrice[i] += Number(parseFloat(TempPrice).toDecimals(2));}
						if (!isNaN(TempWeight)){TempDisplayWeight[i] += Number(parseFloat(TempWeight).toDecimals(3));}
	
					}
					// Breaks if only one product option
					if(!TempElementName) break;
				}	
			}
		}

		// Update stock code display
		var TempSCDisplayPrice = 0;
		if (thatForm.elements["price"+TempCurrentStockCode]) TempSCDisplayPrice = parseFloat(Number(thatForm.elements["price"+TempCurrentStockCode].value).toDecimals(2));
		var TempSCDisplayWeight = 0;
		if (thatForm.elements["weight"+TempCurrentStockCode]) TempSCDisplayWeight = parseFloat(Number(thatForm.elements["weight"+TempCurrentStockCode].value).toDecimals(3));
		var TempSCDisplayQty = 1;
		if (thatForm.elements["qty"+TempCurrentStockCode]) TempSCDisplayQty = parseInt(Number(thatForm.elements["qty"+TempCurrentStockCode].value));
		if (TempSCDisplayQty == 0) TempSCDisplayQty = 1;
		
		TempDisplayPrice[i] = parseFloat(TempDisplayPrice[i]);
		TempDisplayWeight[i] = parseFloat(TempDisplayWeight[i]);
		TempSCDisplayPrice = parseFloat( TempSCDisplayPrice + TempDisplayPrice[i] ).toDecimals(2);
		TempSCDisplayWeight = parseFloat( TempSCDisplayWeight + TempDisplayWeight[i] ).toDecimals(3);

		// Update main display
		DisplayPrice = (parseFloat(DisplayPrice) + parseFloat(TempSCDisplayPrice * TempSCDisplayQty)).toDecimals(2);
		DisplayWeight = (parseFloat(DisplayWeight) + parseFloat(TempSCDisplayWeight * TempSCDisplayQty)).toDecimals(3);

		if(thatForm.elements["DisplayPrice"+TempCurrentStockCode]) thatForm.elements["DisplayPrice"+TempCurrentStockCode].value = GetCurrencyPrice(g_CurrentCurrency, TempSCDisplayPrice);
		if(thatForm.elements["PriceMessage"+TempCurrentStockCode]) thatForm.elements["PriceMessage"+TempCurrentStockCode].value = "(GBP "+ (parseFloat(TempSCDisplayPrice * TempSCDisplayQty)).toDecimals(2) + ", US$"+ CurrencyRateDollar +", EUR "+ CurrencyRateEuro +")";
		if(thatForm.elements["DisplayWeight"+TempCurrentStockCode]) thatForm.elements["DisplayWeight"+TempCurrentStockCode].value = parseFloat(TempSCDisplayWeight * TempSCDisplayQty).toDecimals(3);
	}
	
	// Creates price for product(s)
	CurrencyRateDollar = currency(DisplayPrice*CurrencyRateDollar);
	CurrencyRateEuro = currency(DisplayPrice*CurrencyRateEuro);

	// Displays price and weight
	if(thatForm.DisplayPrice) thatForm.DisplayPrice.value = GetCurrencyPrice(g_CurrentCurrency, DisplayPrice);
	if(thatForm.PriceMessage) thatForm.PriceMessage.value = "(GBP "+ DisplayPrice + ", US$"+ CurrencyRateDollar +", EUR "+ CurrencyRateEuro +")";
	if(thatForm.DisplayWeight) thatForm.DisplayWeight.value = DisplayWeight;
	thatForm.stockcode.value = StockCodes;
	if(document.getElementById("PriceValue"))document.getElementById("CurrentCurrency").innerHTML = g_CurrentCurrency;
	if(document.getElementById("PriceValue")) document.getElementById("PriceValue").style.visibility = "visible";
	
	if (Submitted){
		// Validate
		if(thatForm.singlesc.value != "") thatForm.stockcode.value = thatForm.singlesc.value;
	}
	
	// Call currency conversion
	UpdateCurrencyPrices();
	CheckStock(thatForm);
	
	// Call finish function if defined
	if (typeof(CalcPriceFinish) == "function") CalcPriceFinish();
	
	return true;
}

function cleanProduct(strProduct){
	// Gets rid of all [strArrayNames] if used in 
	// conjunction with Dynamic List Script
	// Also, gets rid of (strImageName) if used in
	// conjunction with Image Options Script
	
	var intArrayNameStart = 0;
	var intArrayNameEnd = 0; 
	var strProductTemp = "";
	var strProductTempDelete = "";
	
	strProductTemp = strProduct;
	
	// Loops each text character in string and removes [arraynames]
	for (var i=0;i<strProduct.length;i++){
		if (strProduct.substring(i, i+1)=='['){intArrayNameStart = (i)};
		if (strProduct.substring(i, i+1)==']'){intArrayNameEnd = (i+1)};
		
		if (intArrayNameEnd>0){
			strProductTempDelete = strProduct.substring(intArrayNameStart, intArrayNameEnd);
			strProductTemp = strProductTemp.replace(strProductTempDelete, "");
			intArrayNameEnd = 0;
			intArrayNameStart = 0;
		}
	}
	
	for (var i=0;i<strProduct.length;i++){
		if (strProduct.substring(i, i+1)=='('){intArrayNameStart = (i)};
		if (strProduct.substring(i, i+1)==')'){intArrayNameEnd = (i+1)};
		
		if (intArrayNameEnd>0){
			strProductTempDelete = strProduct.substring(intArrayNameStart, intArrayNameEnd);
			strProductTemp = strProductTemp.replace(strProductTempDelete, "");
			intArrayNameEnd = 0;
			intArrayNameStart = 0;
		}
	}

	return strProductTemp;
}

function currency(dbAmount) { 
	// returns the amount in the .99 format 
	dbAmount -= 0; 
	dbAmount = (Math.round(dbAmount*100))/100; 
	return (dbAmount == Math.floor(dbAmount)) ? dbAmount + '.00' : ( (dbAmount*10 == Math.floor(dbAmount*10)) ? dbAmount + '0' : dbAmount); 
} 

function trim(strText) { 
    // this will get rid of leading spaces 
    while (strText.substring(0,1) == ' ') 
        strText = strText.substring(1, strText.length);

    // this will get rid of trailing spaces 
    while (strText.substring(strText.length-1,strText.length) == ' ')
        strText = strText.substring(0, strText.length-1);

   return strText;
}

function getIndex(thatForm, thatElement) {
	var TotalFormFields = thatForm.elements.length;
    for (var i=0;i<TotalFormFields;i++){
        if (thatElement == thatForm.elements[i]) return i;
	}
    return -1;
}

// Mals Cart Script to create product row correctly
function MalsProductOptions(thatForm){
	var ProductOptions = "";
	var TempOptions = "";
	
	for (var i = 1; i<thatForm.elements.length; i++) {
		if (thatForm.elements[i].name == "CartProductOption"){
			TempOptions = thatForm.elements[i].value;
			TempOptions = TempOptions.substring(0,TempOptions.indexOf(":"));
			ProductOptions += "{br}" + TempOptions;
		}
	}

	thatForm.product.value += ProductOptions;	
}

function CheckStock(thatForm){
	// Check Product Option Stock before adding to cart
	var TotalFormFields = thatForm.elements.length;
	var ArrayStockCodes = new Array;
	var ArrayOptionStockCodes = new Array;
	var OptionStockCodes = "";
	
	ArrayStockCodes = thatForm.elements["stockcode"].value.split("~");

	for (var x = 0; x<ArrayStockCodes.length; x++) {	
	
		var TempCurrentStockCode = ArrayStockCodes[x];
		OptionStockCodes = "";
		ArrayOptionStockCodes.length = 0;
		var k = 0;
		
		// Change Quantity levels
		var TempTotalStockLevel;
		
		if (document.getElementById("TotalStockLevel"+TempCurrentStockCode)) TempTotalStockLevel = Number(document.getElementById("TotalStockLevel"+TempCurrentStockCode).value);
		ChangeQty(thatForm, TempCurrentStockCode, TempTotalStockLevel);

		// Product Options
		var TempElement = thatForm.elements["productoption"+TempCurrentStockCode];

		if (TempElement){			
			for (var j = 0; j<TempElement.length; j++) {
				var TempElementType = TempElement[j].type;
				var TempElementName = TempElement[j].name;
				var TempElementValue = TempElement[j].value;
				var TempElementDisabled = TempElement[j].disabled;
				
				if(!TempElementName){
					TempElementType = TempElement.type;
					TempElementName = TempElement.name;
					TempElementValue = TempElement.value;
					TempElementDisabled = TempElement.disabled;
				}
				
				var TempOptionStockCode = "";
				
				// Get Option Stock Code
				if (TempElementDisabled==false){
					TempProductOptionArray = TempElementValue.split(":");
					// Option Stock Code
					if (TempProductOptionArray[5]!=null && isNaN(TempProductOptionArray[5])==false){TempOptionStockCode = TempProductOptionArray[5];}
					
					ArrayOptionStockCodes[k] = TempOptionStockCode;
					k++;
				}
				
				// Breaks if only one product option
				if(!TempElement[j].name) break;		
			}
		}
	
		// Loop array and order
		ArrayOptionStockCodes.sort(StockSortNumber);
		for (i=0; i<ArrayOptionStockCodes.length; i++) {
			OptionStockCodes += "|" + ArrayOptionStockCodes[i];
		}
		
		if (OptionStockCodes != "") OptionStockCodes = "|" + TempCurrentStockCode + OptionStockCodes + "|";

		// Check if hidden stock code level exists
		if (OptionStockCodes != "" && document.getElementById("StockLevel" + OptionStockCodes) && document.getElementById("LabelTotalStock"+TempCurrentStockCode)){
			var TempInstock = document.getElementById("StockLevel" + OptionStockCodes).value;
			TempInstock = TempInstock - 0;

			var TotalStock = document.getElementById("StockLevel" + OptionStockCodes)
			
			// Validates
			if (TempInstock <= 0){document.getElementById("LabelTotalStock"+TempCurrentStockCode).innerHTML = "Stock Level: 0";ChangeQty(thatForm, TempCurrentStockCode, 0);break;}
			
			// Updates Stock Level label
			document.getElementById("LabelTotalStock"+TempCurrentStockCode).innerHTML = "Stock Level: " + TempInstock;
			ChangeQty(thatForm, TempCurrentStockCode, TempInstock);
		}
	}
}

function ChangeQty(thatForm, StockCode, Qty){
	// Check qty levels
	
	if (thatForm.elements["qty"+StockCode]){
		var QtyMin = Number(thatForm.elements["minqty"+StockCode].value);
		var QtyMax = Number(thatForm.elements["maxqty"+StockCode].value);
		var QtyStep = Number(thatForm.elements["stepqty"+StockCode].value);
		var QtyDisplay = thatForm.elements["qty"+StockCode];
		var QtyMaxDropDown = Number(thatForm.elements["maxqtydropdown"+StockCode].value);
		var QtySelected = QtyDisplay.value;
	
		// Dropdown
		if (QtyDisplay.options){
			if (QtyMax == -1) QtyMax = QtyMaxDropDown;
			QtyDisplay.options.length = 0;
			
			// Validate
			if (Qty == undefined) Qty = QtyMax;
			
			// No stock
			if (Qty <= 0){QtyDisplay.options[0] = new Option("-","");return false;}
			if (Qty < QtyMax) QtyMax = Qty;
			
			var x = 0;

			// Add qty options
			for (var i=QtyMin-1;i<QtyMax;i=i+QtyStep){
				QtyDisplay.options[x] = new Option(i+1,i+1);
				if (i+1 == QtySelected) QtyDisplay.selectedIndex = x;
				x = x + 1;
			}

		}else{
			// Textbox and hidden
			if (isNaN(Number(QtyDisplay.value)) || !isInteger(Number(QtyDisplay.value))){ alert('Please enter a number'); QtyDisplay.focus(); QtyDisplay.select(); return false;}
			if (Number(QtyDisplay.value) < QtyMin){QtyDisplay.value = QtyMin; alert('Quantity must be more than or equal to ' + QtyMin); QtyDisplay.focus(); QtyDisplay.select(); return false;}
			if (QtyMax > -1 && Number(QtyDisplay.value) > QtyMax){QtyDisplay.value = QtyMax; alert('Quantity must be less than or equal to ' + QtyMax); QtyDisplay.focus(); QtyDisplay.select(); return false;}
			if (Number(QtyDisplay.value) > QtyMin && !isInteger((Number(QtyDisplay.value))/QtyStep)){QtyDisplay.value = QtyMin; alert('Quantity must be in groups of ' + QtyStep); QtyDisplay.focus(); QtyDisplay.select(); return false;}
		}
	}
}

function StockSortNumber(a,b){
	return a - b;
}

Number.prototype.toDecimals=function(n){
    n=(isNaN(n))?
        2:
        n;
    var
        nT=Math.pow(10,n);
    function pad(s){
            s=s||'.';
            return (s.length>n)?
                s:
                pad(s+'0');
    }
    return (isNaN(this))?
        this:
        (new String(
            Math.round(this*nT)/nT
        )).replace(/(\.\d*)?$/,pad);
}
