 // worksheet functions

 function updateLinePrice(obj){

 	var sObjectKey = getObjectKeyFromName(obj.name);

 	var sPriceObject = 'price_' + sObjectKey;

 	var sCalcObject = 'calc_' + sObjectKey;

 	var objCalc = eval('obj.form.' + sCalcObject);

 	var sSubObject = 'sub_' + sObjectKey;

 	var objSub = eval('obj.form.' + sSubObject);

 	var aPrices = new Array;

 	aPrices = eval('obj.form.' + sPriceObject).value.split(',');

 	var sSizeObject = 'size_' + sObjectKey;

 	var aSizes = new Array;

 	aSizes = eval('obj.form.' + sSizeObject).value.split(',');

 	return buildLinePrice(sObjectKey, objCalc, objSub, aSizes, aPrices);

}



function buildLinePrice(sObjKey, objCalc, objSub, aSizes, aPrices){

	var aCalc = new Array;

	var nSub = 0;

	var nPrice = 0;

	

	

	for (var i=0;i<aSizes.length;i++){

		var objQty = eval('objCalc.form.' + 'qty_' + sObjKey + '_' + aSizes[i]);

		if (!isNaN(parseFloat(objQty.value))){

			nPrice = parseFloat(objQty.value) * parseFloat(aPrices[i]);

		}else{

			nPrice = 0;

		}

		

		aCalc[i] = nPrice;

		nSub += nPrice;



	}

	objSub.value = nSub.toFixed(2);

	calcGrandTotals(objCalc);

	return false;

}



function calcGrandTotals(obj){

	var sSTObject = 'subtotal';

	var objSubTotal = eval('obj.form.' + sSTObject);

	var sTaxObject = 'tax';

	var objTax = eval('obj.form.' + sTaxObject);

	var sGTObject = 'grandtotal'

	var objGrandTotal = eval('obj.form.' + sGTObject);

	

	calcSubTotal(objSubTotal, objTax, objGrandTotal);

	calcGrandTotal(objSubTotal, objTax, objGrandTotal);

	

}



function calcSubTotal(objSubTotal, objTax, objGrandTotal){

	var nSub = 0;

	var nLineSub = 0;

	var elements = document.getElementsByTagName('input');

	

	for(var i=0; i<elements.length; i++){

		if (elements[i].name.indexOf('sub_') > -1){



		if (!isNaN(parseFloat(elements[i].value))){

			nLineSub = parseFloat(elements[i].value);

		}else{

			nLineSub = 0;

		}

		

		nSub += nLineSub;

			

		}

	}

	objSubTotal.value = nSub.toFixed(2);

	

	calcTax(objSubTotal, objTax, objGrandTotal);



}



function calcTax(objSubTotal, objTax, objGrandTotal){

	var sTaxRateObject = 'vat';

	var objTaxRate = eval('objTax.form.' + sTaxRateObject);

	

	var nSub = 0;

	if (!isNaN(parseFloat(objSubTotal.value))){

	nSub = parseFloat(objSubTotal.value);

	}else{

		nSub = 0;

	}

	

	var nTax = 0;

	nTax = objTaxRate.value * nSub;

	

	objTax.value = nTax.toFixed(2);



}



function calcShipping(nSubTotal){

	var nShipRate = 0.08;

	

	nSubTotal = (Math.ceil(nSubTotal/100)) * 100;

	nShip = nSubTotal * nShipRate;

	

	return nShip;

	

}



function calcGrandTotal(objSubTotal, objTax, objGrandTotal){

	var nSub = 0;

	var nShip = 0;

	var nGT = 0;

	var nTax = 0;

	

	if (!isNaN(parseFloat(objSubTotal.value))){

	nSub = parseFloat(objSubTotal.value);

	}else{

		nSub = 0;

	}

	

	if (!isNaN(parseFloat(objTax.value))){

	nTax = parseFloat(objTax.value);

	}else{

		nTax = 0;

	}

	

	nShip = calcShipping(nSub);



	nGT = nSub + nTax + nShip;

	objGrandTotal.value = nGT.toFixed(2);	

}



// output functions

function buildOutputString(obj){

	var aKeys = new Array;

	aKeys = getObjectKeyArray(obj);

	

	var sHeader = '(ITEM,QTY,PRICE,SubTotal)\r\n';

	var sItems = '';

	

	for (var i=0; i<aKeys.length; i++){

		sItems += buildOutputByKey(obj, aKeys[i]);	

	}

	

	

	var objSubTotal = eval('obj.form.subtotal');

	var objTax = eval('obj.form.tax');

	var objGrandTotal = eval('obj.form.grandtotal');

	

	sItems += '\r\nSUBTOTAL:\t\t\t\t\t' + objSubTotal.value;

	sItems += '\r\nTAX:\t\t\t\t\t\t' + objTax.value;

	sItems += '\r\nTOTAL:\t\t\t\t\t\t' + objGrandTotal.value;

	

	eval('obj.form.output').value = sHeader + sItems;

}



function buildOutputByKey(obj, sObjKey){

	var sOutput = '';

	

	var aSizes = new Array;

	var aPrices = new Array;

	aSizes = eval('obj.form.' + 'size_' + sObjKey).value.split(',');

	aPrices = eval('obj.form.' + 'price_' + sObjKey).value.split(',');



	

	for (var i=0;i<aSizes.length;i++){

		var objQty = eval('obj.form.' + 'qty_' + sObjKey + '_' + aSizes[i]);

		if (!isNaN(parseFloat(objQty.value))){

			sOutput += sObjKey + '-' + aSizes[i].toString() + '\t\t';

			sOutput += objQty.value.toString() + '\t\t';

			sOutput += parseFloat(aPrices[i]).toFixed(2) + '\t\t';

			sOutput += (parseFloat(objQty.value) * parseFloat(aPrices[i])).toFixed(2) + '\r\n';

		}



	}	

	return sOutput;

}





// helper functions

function getObjectKeyArray(obj){

	var aKeys = new Array;

	var elements = document.getElementsByTagName('input');

	

	for(var i=0; i<elements.length; i++){

		if (elements[i].name.indexOf('price_') > -1){

			addToArray(aKeys, elements[i].name.substring(elements[i].name.indexOf('_')+1));

		}

	}

	return aKeys;

}



function addToArray(ar,obj){

	if (ar.length == 0){

		ar[0] = obj;

	}else{

		ar[ar.length] = obj;

	}

}



// regex functions

function getObjectKeyFromName(sName){

	RegExp.lastIndex = 0;

	var r = /\w_([^_]*)_\w{1,3}/;

	var match = r.exec(sName);

	if (match != null && match.length > 1) {

		return match[1];

	} else {

		return  '';

	}

}
