 // 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.07;
	
	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  '';
	}
}