var xmlobj;			// process price list tree
var prForm;
var prField;
var optField;

var directNdx=0;	// radio button select index for price
var editing=false;	// if edit tall or width dimension

var gCategory;	// from xmlobj
var gProdId;	// from xmlobj
var gUnitPrice;
var gDelivery = 80;
var gMinProof = 100;
var gMinCharge = 500;
var gSubTotal = 0;
var gSumTotal = 0;
var gSExtTotal = 0;
var temp = 0;
var gDiscount = 100;
var gQuantity = 0;
var gPriceErr = "價目表錯誤：";
var gObjectErr = "-缺價格物件";
var gPaperErr = "與紙張選項不符";
var gSaddle = "騎馬釘";
var gUndefined = "undefined";
var gUnitName="張";
//var psign="#"; It already used in payment notify 
var gSep = ",";
var gXobj = "@";
var gPrSep = "-";
var gSpecInfo;
var gPageInfo;
var gOptsInfo="";
// types of prices xml
var inkType="@type";
var sizeType="@size";
var paperType="@paper";
var optAry = ["OptFrame", "OptFolder", "OptFilm"];
var txtAry = ["txtFrame", "txtFolder", "txtFilm"];

function changeQuantity() {
    var q = prForm.quantity.value;
    q = q.replace(",", "");
    q = parseInt(q);
	if (isNaN(q)) {
		prForm.quantity.value = 0;	// will set to min. quantity
	}
	else {
		prForm.quantity.value = q;
	}
	changePrices();
}

// for cards by groups
function changeGroups() {
    var q = prForm.groups.value;
    q = q.replace(",", "");
    q = parseInt(q);
	if (isNaN(q)) {
		prForm.groups.value = 1;	// will set to min. quantity
	}
	else {
		prForm.groups.value = q;
	}
	changePrices();
}

// booklet inside pages (color/b&w)
function changePages(objName) {
	var obj = document.getElementById(objName);
    var q = obj.value;
    q = q.replace(",", "");
    q = parseInt(q);
	if (isNaN(q)) {
		obj.value = 0;
		q = 0;
	}
	var modBy = 2;
	var bindObj = prForm.binding;
	if (bindObj.options[bindObj.selectedIndex].text==gSaddle)
		modBy = 4;
	if ((q % modBy) != 0) {
		pg = parseInt(q/modBy);
		q = (pg+1)*modBy;
		obj.focus;
		alert("頁數不符合裝訂方式，調整內頁頁數為："+q);
	}
	obj.value = q;
	changePrices();
}

function validAddPages(modBy) {
    var q = prForm.addpages.value;
    q = q.replace(",", "");
    q = parseInt(q);
	if (isNaN(q)) {
		prForm.addpages.value = 0;
		q = 0;
	}
	if ((q % modBy) != 0) {
		pg = parseInt(q/modBy);
		q = (pg+1)*modBy;
		prForm.addpages.focus;
	}
	prForm.addpages.value = q;
	return q;
}

// certificate wth both frame and folder
function syncCert(objName)
{
	//var qQuan = prForm.quantity.value;
	var halfOf;
	var q = document.getElementById(objName).value;
	q = q.replace(",", "");
	q = parseInt(q);
	if (isNaN(q)) {// || q==qQuan)
		//changeCert();
		document.getElementById(objName).value = 0;
	}
	//halfOf = gQuantity - q;//prForm.elements[objName].value;
	//if (objName==txtAry[0])
	//	document.getElementById(txtAry[1]).value = halfOf;
	//else 
	//	document.getElementById(txtAry[0]).value = halfOf;
	changePrices();
}

function changeCert(objId)
{
	if (prForm.elements[optAry[objId]].checked) {
		document.getElementById(txtAry[objId]).disabled = false;
		document.getElementById(txtAry[objId]).value = gQuantity;
	} else {
		document.getElementById(txtAry[objId]).disabled = false;
		document.getElementById(txtAry[objId]).value = 0;
	}
	changePrices();
}

function doOptions()
{
	// processing option fields:自取與打樣除外
	var sum = 0;

	var optLists = xmlobj.product.option.list;
	if (optLists==null) return 0;	// no lists used
	if (!xmlobj.product.option._propertyIsArray("list"))
		optLists = [ xmlobj.product.option.list ];	//single object as array with length=1
	sum += hdrChgPaper();	//temp will be removed
	for (var opt=0; opt < optLists.length; opt++) {
		switch (optLists[opt]["@func"]) {
			case "byUnit":
				sum += byUnit(optLists[opt], false);
				break;
			case "byScroll":	// for poster POSBG
				sum += byScroll(optLists[opt]);
				break;			
			case "byQuan":	// for envelop STSEV
				sum += byQuan(optLists[opt]);
				break;			
			case "byRel":	// for cetificatea
			//alert(optLists[opt]["@name"]+":"+document.getElementById(optLists[opt]["@rel"]).value);
				sum += byUnit(optLists[opt], true);
				break;			
			default:
				alert(gPriceErr+optLists[opt]["@func"]+"-無此函數!");
				break;
		}
	}
	return sum;
}

function  changePrices()
{
	if (xmlobj && xmlobj.product) {
		var price;
		var inputq = parseInt(prForm.quantity.value);
		var groupq = 1;
		var ret = findQuantity(xmlobj.product.quantity, inputq);
		
		gQuantity = ret.val;
		if (gQuantity != inputq)	// set to mininum quantity
			prForm.quantity.value = gQuantity;
		//alert(inputq+"-"+ret.val + "@"+ ret.ndx );
		// get and show discount value
		if (gCategory.toLowerCase() == "certificate") {
			var htmlTxt;
			gDiscount = xmlobj.product.quantity.quan[ret.ndx]["@discount"];
			if (prForm.OptFrame.checked && document.getElementById("wdiscount") != null)
				htmlTxt = gDiscount + "%";
			else
				htmlTxt = "";
			document.getElementById("wdiscount").innerHTML = htmlTxt;
			if (prForm.OptFolder.checked && document.getElementById("cdiscount") != null)
				htmlTxt = gDiscount + "%";
			else
				htmlTxt = "";
			document.getElementById("cdiscount").innerHTML = htmlTxt;
		}

		gSubTotal = 0;
		gSpecInfo = "";
		gPageInfo = "";
		
		if (gCategory.toLowerCase() == "booklet") {
			price = catBoolet(ret);
			//price += hdrBinding(); remove to sumtotal
		} else if (gCategory.toLowerCase() == "bydim") {
			price = catByDim(ret);
		} else if (gCategory.toLowerCase() == "sticker") {
			price = catSticker(ret);
		} else {
			price = catSimple(ret);
			price += hdrAddPages();
		}

		// unitPrice and subtotal in decimal point 2
		//prForm.unitPrice.value = Math.round(price*100)/100;
		gUnitPrice = Math.round(price*100)/100;
		gSubTotal = Math.round((price*gQuantity)*100)/100;

		// cards product by groups and discount
		if (document.getElementById("groups") != null) {
			groupq = parseInt(prForm.groups.value);
			ret = findQuantity(xmlobj.product.groups, groupq);
			var grpDiscount = xmlobj.product.groups.quan[ret.ndx]["@discount"];
			gSpecInfo += gSep+groupq+"種版面(各" +gQuantity+gUnitName;
			gSubTotal = gSubTotal * groupq * (grpDiscount/100);
			//alert(inputq+":"+grpDiscount+":"+gSubTotal);
			gQuantity = groupq*gQuantity;
			gSpecInfo += " 共"+gQuantity+gUnitName+")";
			//prForm.unitPrice.value = Math.round((gSubTotal/gQuantity)*100)/100;
			gUnitPrice = Math.round((gSubTotal/gQuantity)*100)/100;
		}

		//prForm.subTotal.value = gSubTotal;
	
		// sumtotal
		gSumTotal = doOptions();
		if (gCategory.toLowerCase() == "booklet") {
			gSumTotal += hdrBinding();
		}
		gSumTotal += hdrBackpad(gSubTotal);	// 裱豪卡板
		//prForm.sumTotal.value = gSumTotal + gSubTotal;
		// extra services
		gExtTotal = 0;
		gExtTotal += hdrProof();

		// shipping fee
		if (prForm.addByself.checked) {
			prForm.shipping.value = 0;
			gSpecInfo += gSep+"公司自取";
		} else {
			if ((gSumTotal + gSubTotal) >= gMinCharge) {
				prForm.shipping.value = 0;
			} else {
				prForm.shipping.value = gDelivery;
				gExtTotal += gDelivery;
			}
		}

		// calculate sumupTotal grandTotal
		var pureTotal = gSubTotal + gSumTotal + gExtTotal;
		pureTotal = Math.round(pureTotal);
		prForm.pureTotal.value = pureTotal;
		prForm.unitNotax.value = Math.round((pureTotal/gQuantity)*100)/100;
		var tax = Math.round(pureTotal * 0.05);
		prForm.tax.value = tax;
		grandTotal = pureTotal + tax;
		prForm.grandTotal.value = grandTotal;
		/* old
		var grandTotal = gSubTotal + gSumTotal + gExtTotal;
		grandTotal = Math.round(grandTotal);
		prForm.grandTotal.value = grandTotal; */
		
		// unit cost on decimal=2
		prForm.unitCost.value = Math.round((grandTotal/gQuantity)*100)/100;
		// set hidden field for uploading
		//document.batch.pageinfo.value = gPageInfo+gSpecInfo+gOptsInfo;
		document.getElementById("pageinfo").value = gPageInfo+gSpecInfo+gOptsInfo;
		//alert("數量:"+gQuantity+"(總價$"+grandTotal+")"+document.getElementById('pageinfo').value);
		// for debug only
		//for (p=0; p<xmlobj.product.comps.prices.length; p++) {
		//	var arr = xmlobj.product.comps.prices[p];
		//	alert(arr["@ink"]+":"+arr["@size"]);
		//	showPrices(arr.price);
		//}
	} else
		alert(gPriceErr+"product");
}

// for dropdown list and radio group to change image and price
function changeInks(itemName, obj) {
	var ndx;
	
	if (obj.type == 'radio') {	//gCategory == "direct"
		radios= document.getElementsByName(obj.name);
		ndx = getSelNdx(radios);	// find select index in a radio group
		directNdx = ndx;
	} else //'select-one'
		ndx = obj.selectedIndex;
	changeImage(itemName, ndx);
	changePrices();
}

// retrieve paper selection from xml attribute for envelope (stationery)
function getPaperSel(source, target)
{
	var srcObj = document.getElementById(source);	//size
	var targetObj = document.getElementById(target);//paper
	var selSize = srcObj.options[srcObj.selectedIndex].value.toLowerCase();
	var trigIndex = 0;
	var found = false;
	
	targetObj.options.length = 0;	// clear contents
	// find location to start	
	for (p=0; p<xmlobj.product.comps.prices.length; p++) {
		var arr = xmlobj.product.comps.prices[p];
		if (arr[sizeType].toLowerCase() == selSize) {
			trigIndex = p;
			found = true;
			break;
		}
	}
	if (!found)
		alert(selSize+":信封尺寸無XML資料!");
	// find the same selSize
	for (ndx=trigIndex; ndx<xmlobj.product.comps.prices.length; ndx++) {
		var arr = xmlobj.product.comps.prices[ndx];
		//alert(arr["@size"]+":"+arr["@paper"]);
		if (arr[sizeType].toLowerCase() != selSize)
			break;
		var new_option = new Option(arr[paperType]);
		targetObj.options.add(new_option);
	}
	if (targetObj.options.length==0)
		alert(selSize+":信封尺寸有錯誤!");
	// call optTrigger/changePrices changeOptions in stationery
	document.getElementById(target).onchange();
}

// retrieve paper selection from xml attribute for envelope (stationery)
function getCategotySel()
{
	var srcObj = document.getElementById("inkSel");	
	var target = "patternSel";
	var targetObj = document.getElementById(target);
	var sizeObj = document.getElementById("sizeSel");
	var paperObj = document.getElementById("paperSel");
	var selType = srcObj.options[srcObj.selectedIndex].value.toLowerCase();
	var trigIndex = 0;
	var arr;
	var imageLists = xmlobj.product.allImages.images[1];

	// A: get image list
	targetObj.options.length = 0;	// clear contents
	// find location to start	
	for (var p=0; p<imageLists.img.length; p++) {
		arr = imageLists.img[p];
		if (arr[inkType].toLowerCase() == selType) {
			trigIndex = p;
			break;
		}
	}
	// find the same selSize
	for (var ndx=trigIndex; ndx<imageLists.img.length; ndx++) {
		arr = imageLists.img[ndx];
		if (arr[inkType].toLowerCase() != selType)
			break;
		var new_option = new Option(arr["@name"], ndx);
		// todo-add real index for changeImage() use
		targetObj.options.add(new_option);
	}
	// B: get size and paper list
	sizeObj.options.length = 0;
	paperObj.options.length = 0;
	for (var p=0; p<xmlobj.product.comps.prices.length; p++) {
		arr = xmlobj.product.comps.prices[p];
		if (arr[inkType].toLowerCase() == selType) {
			trigIndex = p;
			break;
		}
	}
	for (var ndx=trigIndex; ndx<xmlobj.product.comps.prices.length; ndx++) {
		arr = xmlobj.product.comps.prices[ndx];
		//alert(arr["@size"]+":"+arr["@paper"]);
		if (arr[inkType].toLowerCase() != selType)
			break;
		
		if (findOption(sizeObj,arr[sizeType]) == -1) {
			var size_option = new Option(arr[sizeType]);
			sizeObj.options.add(size_option);
		}
		if (findOption(paperObj,arr[paperType]) == -1) {
			var paper_option = new Option(arr[paperType]);
			paperObj.options.add(paper_option);
		}
	}
	
	// call changeImage in cerificate
	document.getElementById(target).onchange();
}

function findOption(srcObj, toFind)
{
	var found= -1;
	for (var ndx=0; ndx < srcObj.length; ndx++) {
		if (srcObj.options[ndx].text == toFind) {
			found = ndx;
			break;
		}
	}
	return found;
}

// toggle paper selection for different group called from html (booklet/stationery)
function toggleOpt(target, start, trigger, trigAt)
{
	var obj=document.getElementById(target);
	// if >=trigAt
	var beginAt = start;
	var endAt = obj.length;
	for (opt=0; opt < obj.length; opt++)
		obj.options[opt].disabled = true;
	if (trigger.selectedIndex < trigAt) {
		beginAt = 0; endAt = start;
	}
	
	for (opt=beginAt; opt<endAt; opt++)
		obj.options[opt].disabled = false;
	obj.options[beginAt].selected=true;
	// call optTrigger/changePrices in booklet or changeOptions in stationery
	document.getElementById(target).onchange();
}

function changeBinding() {
	// check valid pages number for booklet
	changePages('insBkPages');
	changePages('insCrPages');
}

function changeImage(itemName, ndx) {
	var imgName;
	var imageLists = xmlobj.product.allImages.images;
	for (i=0; i <imageLists.length; i++) {
		if (imageLists[i]["@id"] == itemName) {
			imgName = imageLists[i].img[ndx]._value();
			document.images[itemName].src= "data/"+imgName;
			return;
		}
	}
	alert(gPriceErr+itemName);
}

function changeOptions()
{
	var obj;
	gOptsInfo = "";
	for (var opt=0; opt < optField.length; opt++) {
		obj = document.getElementById(optField[opt]);
		if (!obj.disabled) {
			if (gOptsInfo.length == 0)
				gOptsInfo = "(";
			else
				gOptsInfo += gSep;
			gOptsInfo += obj.options[obj.selectedIndex].text;
		}
	}
	if (gOptsInfo.length != 0)
		gOptsInfo += ")";
	changePrices();
}

function catSticker(ret)
{
	var price = 0;
	var selSize="";
	//var obj = document.getElementsByName('stickerSel');
	var obj = document.getElementById('stickerSel');
	if (obj != null) {
		gPageInfo = getSelVal(obj);
		gPageInfo += gSep+prForm.paperSel.options[prForm.paperSel.selectedIndex].text;
		var highSel = document.getElementById('highDim');
		selSize = highSel.options[highSel.selectedIndex].value;
		var lenSel = document.getElementById('lenDim');
		selSize += "x"+lenSel.options[lenSel.selectedIndex].value;
		gPageInfo += gSep+"規格尺寸："+selSize;
	}else {
		gPageInfo = prForm.paperSel.options[prForm.paperSel.selectedIndex].text;
		optSel = prForm.sizeSel.options[prForm.sizeSel.selectedIndex].text;
		gPageInfo += gSep+"規格尺寸："+optSel;
		var sizeObj = document.getElementById('sizeSel');
		selSize = sizeObj.options[sizeObj.selectedIndex].value;
	}
	var prIndex = findBySticker(selSize);
	if (prIndex >=0) {
		priceList = (xmlobj.product.comps.prices[prIndex].price[ret.ndx]._value()).split(gPrSep);
		price = parseFloat(priceList[prForm.paperSel.selectedIndex]);
	}else
		alert(gPriceErr+"prIndex");
	//alert(prIndex+":"+ndx+"="+price);
	return price;
}

function catBoolet(ret)
{
	// covers- priceOrdering :sizeSel-inkSel-paperSel
	var ndx = ret.ndx;
	var prCvrIndex, prCvrBkIndex, prInsCrIndex, prInsBkIndex;
	var arrPrice = new Array(3);
	arrPrice[2]=0;	// 0-color, 1-b&w, 2-empty
	
	gPageInfo = prForm.sizeSel.options[prForm.sizeSel.selectedIndex].text;	
	gPageInfo += gSep+"封面紙張:"+prForm.paperCvrSel.options[prForm.paperCvrSel.selectedIndex].text;
	gPageInfo += gSep+"封面印刷:"+prForm.inkCvrSel.options[prForm.inkCvrSel.selectedIndex].text;
	gPageInfo += gSep+"封面裡:"+prForm.inkCvrInSel.options[prForm.inkCvrInSel.selectedIndex].text;

	// get color price
	prCvrIndex = prForm.sizeSel.selectedIndex * prForm.paperCvrSel.length;
	prCvrIndex += prForm.paperCvrSel.selectedIndex;
	arrPrice[0] = parseFloat(xmlobj.product.covers.prices[prCvrIndex].price[ndx]._value());
	// get black & white price
	prCvrBkIndex = (prForm.sizeSel.selectedIndex * prForm.paperCvrSel.length) + prForm.paperCvrSel.length;
	prCvrBkIndex += prForm.paperCvrSel.selectedIndex;
	arrPrice[1] = parseFloat(xmlobj.product.covers.prices[prCvrBkIndex].price[ndx]._value());
	// calc real price
	var cvrPrice = arrPrice[prForm.inkCvrSel.selectedIndex];
	var cvrBkPrice;
	switch(prForm.inkCvrInSel.selectedIndex)
	{
		case 0:
			cvrBkPrice = arrPrice[2];
			break;
		case 1:
			cvrBkPrice = arrPrice[1];
			break;
		case 2:
			cvrBkPrice = arrPrice[0];;
			break;
	}
	//alert(cvrPrice+"["+prCvrIndex+"]"+cvrBkPrice+"["+prCvrBkIndex+"]");
	cvrPrice += cvrBkPrice;		
	
	// insides
	var pgName="內頁";
	gPageInfo += gSep+"封面裡:"+prForm.paperInsSel.options[prForm.paperInsSel.selectedIndex].text;
	var pNum = prForm.paperInsSel.length;
	var insPageLen = prForm.sizeSel.selectedIndex * pNum * 2;	//paper for 2 (color&b&w)
	//color
	prInsCrIndex = insPageLen + prForm.paperInsSel.selectedIndex;
	gPageInfo += gSep+pgName+"彩色:"+prForm.insCrPages.value;
	var insCrPrice = parseFloat(xmlobj.product.insides.prices[prInsCrIndex].price[ndx]._value());
	var clrPrice = insCrPrice * prForm.insCrPages.value;
	//black and white
	prInsBkIndex = insPageLen + pNum + prForm.paperInsSel.selectedIndex;
	gPageInfo += gSep+pgName+"黑白:"+prForm.insBkPages.value;
	var insBkPrice = parseFloat(xmlobj.product.insides.prices[prInsBkIndex].price[ndx]._value());
	var bnwPrice = insBkPrice * prForm.insBkPages.value;

	var price = cvrPrice + clrPrice + bnwPrice;
	//alert(price+"="+cvrPrice+"["+prCvrIndex+"]+"+clrPrice+"["+prInsCrIndex+"]+"+bnwPrice+"["+prInsBkIndex+"]");
	return price;
}

function catSimple(ret)
{
	var prIndex = 0;
	var obj;
	var depth = 0;
	var price = 0;
	var bottom = prField.length-1;
	var ndx = ret.ndx;
	var opt;

	/** layer0: size.indx * (ink.length * paper.length)
		layer1: + ink.index * (paper.length)
		layer2: + paper.index
	*/
	// for dropdown list or radio group (return a collection)
	for (pr=bottom; pr>=0; pr--) {
		opt = "";
		obj = document.getElementsByName(prField[pr]);	// get a collection of objects
		if (pr == bottom) {
			prIndex += getSelNdx(obj);
			//alert("pr="+bottom+"ndx:"+prIndex+"-dep:"+depth);
			depth = getSelLength(obj);
		} else {
			prIndex += getSelNdx(obj) * depth;
			//alert("else:"+prIndex+"-dep:"+depth);
			depth = getSelLength(obj) * depth;
			gPageInfo += gSep;
		}
		// card category
		if (gCategory.toLowerCase() == "card") {
			if (prField[pr]=="inkBackSel") {
				gPageInfo += "正面彩色/反面-";
				if (getSelVal(obj)=="空白")
					opt = "(單面";
				else
					opt = "(雙面";
				opt += "印刷)";
			}
		}
		gPageInfo += getSelVal(obj)+opt;
		//alert(getSelVal(obj));
	}	

	// special handling on envelope
	if (gProdId.toLowerCase()=="envelope")
		prIndex = findByEnvelope();
	else if (gCategory.toLowerCase()=="certificate")
		prIndex = findByAward();
	//alert(prIndex);
	if (prIndex >=0) {
		// linear calc
		if (xmlobj.product.quantity["@linear"] != null) {
			var ndxHigh = ndx - 1;
			var range = ret.high - ret.low;
			var prLow = parseFloat(xmlobj.product.comps.prices[prIndex].price[ndx]._value());
			if (ndx == 0) {
				ndxHigh	= ndx;
				range	= 1;
			}
			var prHigh = parseFloat(xmlobj.product.comps.prices[prIndex].price[ndxHigh]._value());
			var prRange = prHigh - prLow;
			var distVal = prRange/range;
			price =  prLow + (ret.high - ret.val)*distVal;
			/*alert("ndx:"+ndx+",val="+ret.val);
			alert("range:"+range+"="+ret.high+"-"+ret.low);
			alert("prRange:"+prRange+"="+prHigh+"-"+prLow);
			alert("price:"+price+",dist:"+distVal+",val="+ret.val);*/
		}else
			price = parseFloat(xmlobj.product.comps.prices[prIndex].price[ndx]._value());
	}else
		alert(gPriceErr+"prIndex");
	//alert(prIndex+":"+ndx+"="+price);
	return price;
}

// *********** start of category of dimension
function catByDim(ret)
{
	var uprice;
	var obj;
	var price = 0;
	var dims;
	var tall;
	var width;
	var bottom = prField.length-1;
	var disNdx = ret.ndx;
	var prNdx = document.getElementById("paperSel").selectedIndex;	//paperSel
	
	uprice = parseFloat(xmlobj.product.prices.price[prNdx]._value());
	tall = document.getElementById("sizeTall").value;
	width = document.getElementById("sizeWidth").value;
	//obj = document.getElementsByName(prField[0]);
	gDiscount = xmlobj.product.quantity.quan[disNdx]["@discount"];
	//alert("prNdx:"+prNdx+"-"+uprice);
	//alert("disNdx:"+disNdx+"-"+gDiscount);
	dims =  tall * width;
	dims = Math.ceil(dims / 900);	// maximize interger or getIntUnit
	//alert(dims+"才-"+uprice);
	price = dims * uprice;
	price = (price * gDiscount)/100;

	for (pr=bottom; pr>=0; pr--) {
		obj = document.getElementsByName(prField[pr]);	// get a collection of objects
		if (pr != bottom)
		  gPageInfo += gSep;
		gPageInfo += getSelVal(obj);
	}	
	gPageInfo += gSep+"尺寸:"+tall+"X"+width;
	return price;
}
// *********** end of category of dimension

// fill poster dimension into input text for editing
function fillDimText(obj)
{
	var selSize = obj.options[obj.selectedIndex].value;
	var dimension = selSize.split("x");
	// fill input text
	document.getElementById("sizeTall").value = dimension[0];
	document.getElementById("sizeWidth").value = dimension[1];
	if (obj.selectedIndex == obj.length-1)
		document.getElementById("sizeTall").focus();
}

function calcByDim()
{
	if (editing) {
		var obj;
		editing = false;
		obj = document.getElementById(prField[0]);
		obj.options[obj.length-1].selected = true;	// set to last item: customize
		changePrices();
	}
}

function isNumbers(myfield, e, dec)
{
	var key;
	var keychar;
	
	if (window.event)
	   key = window.event.keyCode;
	else if (e)
		key = e.which;
	else {
		editing = true;
		return true;
	}
	keychar = String.fromCharCode(key);

	// control keys
	if ((key==null) || (key==0) || (key==8) || 
    	(key==9) || (key==13) || (key==27) ) {
		editing = true;
		return true;
	}
	// numbers
	else if ((("0123456789").indexOf(keychar) > -1)) {
		editing = true;
		return true;
	}
	// decimal point jump
	/*else if (dec && (keychar == "."))
	{
	   myfield.form.elements[dec].focus();
	   return false;
	}*/
	else
   		return false;
}

// start of unified function for doOptions
// byQuan for STSEV
function byQuan(olist)
{
	var temp = 0;
	var optName =olist["@name"];
	var optObj  =olist["@obj"];
	var optBase =parseInt(olist["@base"]);
	var optInc  =parseInt(olist["@inc"]);
	//var optVal  =olist._value();
	var priceObj="Opt"+optObj;	// objname of check box
	var minQ = parseInt(olist["@minq"]);
	var incQ  = parseInt(olist["@incq"]);
	var ndx = 0;
	
	if (document.getElementById(optObj) != null && document.getElementById(priceObj) != null) {
		if (prForm.elements[priceObj].checked) {
			if (gQuantity > minQ) {
				temp = optBase;
				var inc = getIntUnit(gQuantity, incQ);
				temp += (inc-1) * optInc;
			} else
				temp = optBase;
			gSpecInfo += gSep+optName;
		}
		document.getElementById(optObj).value = temp;
	} else {
		if (document.getElementById(optObj) == null)
			alert(gPriceErr+optObj+gObjectErr);
		if (document.getElementById(priceObj) == null)
			alert(gPriceErr+priceObj+gObjectErr);
	}
	return temp;
}

// byScroll for POSBG
function byScroll(olist)
{
	var temp = 0;
	var optName =olist["@name"];
	var optObj  =olist["@obj"];
	var priceObj="Opt"+optObj;	// objname of check box
	var optMetal= olist["@hbar"];
	var optAcc  = parseInt(olist["@accessory"]);
	// 圖寬x0.5x2 + 配件加工50
	var ndx = 0;
	
	if (document.getElementById(optObj) != null && document.getElementById(priceObj) != null) {
		if (prForm.elements[priceObj].checked) {
			//	temp = parseFloat(spec[ndx]) * gQuantity;
			var tall = document.getElementById("sizeTall").value;
			var width = document.getElementById("sizeWidth").value;
			temp = width * optMetal * 2
			temp += optAcc;
			temp *= gQuantity;
			gSpecInfo += gSep+optName;
		}
		document.getElementById(optObj).value = temp;
	} else {
		if (document.getElementById(optObj) == null)
			alert(gPriceErr+optObj+gObjectErr);
		if (document.getElementById(priceObj) == null)
			alert(gPriceErr+priceObj+gObjectErr);
	}
	return temp;
}

function byUnit(olist, bolRel)
{
	var temp = 0;
	var optName =olist["@name"];
	var optObj  =olist["@obj"];
	var optDiscount  =olist["@discount"];
	var optVal  =olist._value();
	var priceObj="Opt"+optObj;	// objname of check box
	var optNdx  =olist["@index"];
	var special = false;	// for certificate
	var calQuan = gQuantity;
	var relObj  =olist["@rel"];
	var ndx = 0;
	
	// if both frame and folder checked
	if (bolRel)
		calQuan = document.getElementById(relObj).value;
	if (document.getElementById(optObj) != null && document.getElementById(priceObj) != null) {
		if (prForm.elements[priceObj].checked) {
			var spec = optVal.split(gPrSep);
			if (spec.length == 1)
				ndx = 0;
			else {
				if (optNdx != null) { // use another object index
					var perObj = prForm.elements[optNdx];
					ndx = perObj.selectedIndex;
				} else	// default index of object sizeSel
					ndx = prForm.sizeSel.selectedIndex;
				if (ndx >= spec.length) {
					alert(gPriceErr+gPaperErr);
					ndx = 0;
				}
			}

			// calculates by quanity, group or onetime
			var perGroup  =olist["@group"];
			var oneTime =olist["@onetime"];
			if (perGroup != null) { //by per
				if (isNaN(perGroup)) {	// object not number value
					var perObj = prForm.elements[perGroup];
					var perNdx = perObj.selectedIndex;
					perGroup = parseInt(perObj.options[perNdx].text);
					optName += "-每本張數:"+perGroup;
				} else
					perGroup = parseFloat(perGroup);
				temp = parseFloat(spec[ndx]) * getIntUnit(calQuan, perGroup);
			} else if (oneTime != null)
				temp = parseFloat(spec[ndx]);
			else {	// default by quantiy/unit or from relObj.value
				temp = parseFloat(spec[ndx]) * calQuan;
			}
			
			// if price discount available
			if (optDiscount != null)
				temp = temp * parseInt(gDiscount)/100;
			// if have base/min cost available
			var baseCost = parseFloat(olist["@base"]);
			if (temp < baseCost)
				temp = baseCost;
			gSpecInfo += gSep+optName;
			// add indivisul from relObj
			if (bolRel)
				gSpecInfo += "("+calQuan+")";
		}
		document.getElementById(optObj).value = temp;
	} else {
		if (document.getElementById(optObj) == null)
			alert(gPriceErr+optObj+gObjectErr);
		if (document.getElementById(priceObj) == null)
			alert(gPriceErr+priceObj+gObjectErr);
	}
	return temp;
}
// end of unified function for doOptions

// return index of radio group or dropdown list
function getSelNdx(radios)
{	
	if (radios[0].type != 'radio')
		return radios[0].selectedIndex;
	for(var i = 0; i < radios.length; i++) {
		if (radios[i].checked)
			return i;
	}
}

function getSelVal(radios)
{	
	if (radios[0].type != 'radio') {
		if (radios[0].selectedIndex==-1)
			radios[0].selectedIndex = 0;
		return radios[0].options[radios[0].selectedIndex].text;
	}
	for(var i = 0; i < radios.length; i++) {
		if (radios[i].checked) {
			//labelName = "label"+i;
			return radios[i].value;
			//return document.getElementById(labelName).innerHTML;
		}
	}
}

function getSelLength(radios)
{	
	if (radios[0].type != 'radio') {
		return radios[0].length;	//dropdown list
	} else
		return radios.length;
}
// end of radio group or dropdown list

function findBySticker(selSize)
{
	//var highObj = document.getElementById("highDim");
	//var lenObj = document.getElementById("lenDim");
	//var selSize = highObj.options[highObj.selectedIndex].value + "x" + lenObj.options[lenObj.selectedIndex].value;
	selSize = selSize.toLowerCase();

	for (p=0; p<xmlobj.product.comps.prices.length; p++) {
		var arr = xmlobj.product.comps.prices[p];
		if ((arr[sizeType].toLowerCase()==selSize))
			return p;
	}
	alert("sticker price error");
	return -1;
}


function findByEnvelope()
{
	var srcObj = document.getElementById("sizeSel");
	var targetObj = document.getElementById("paperSel");
	var selSize = srcObj.options[srcObj.selectedIndex].value.toLowerCase();
	var selPaper = targetObj.options[targetObj.selectedIndex].text;

	for (p=0; p<xmlobj.product.comps.prices.length; p++) {
		var arr = xmlobj.product.comps.prices[p];
		if ((arr[sizeType].toLowerCase()==selSize) && (arr[paperType]==selPaper))
			return p;
	}
	alert("envelope price error");
	return -1;
}

function findByAward()
{
	var inkObj = document.getElementById("inkSel");
	var sizeObj = document.getElementById("sizeSel");
	var paperObj = document.getElementById("paperSel");

	var selType = inkObj.options[inkObj.selectedIndex].value.toLowerCase();
	var selSize = sizeObj.options[sizeObj.selectedIndex].text;
	var selPaper = paperObj.options[paperObj.selectedIndex].text;

	for (var p=0; p<xmlobj.product.comps.prices.length; p++) {
		var arr = xmlobj.product.comps.prices[p];
		if ((arr[inkType]==selType) && (arr[sizeType]==selSize) && (arr[paperType]==selPaper))
			return p;
	}
	alert("certificate price error");
	return -1;
}

function hdrChgPaper()
{
	var temp = 0;
	var itemName = "paper";
	if (document.getElementById(itemName) != null) {
		var spPaper =xmlobj.product.option[gXobj+itemName];
		var ndx = prForm.sizeSel.selectedIndex;
		if (typeof(spPaper) != gUndefined) {
			if (prForm.addPaper.checked) {
				var spec = spPaper.split('#');
				var cost = spec[1].split(gPrSep);
				//alert(spec[1]+":"+cost[ndx]);
				temp = parseFloat(cost[ndx]) * gQuantity;
				gSpecInfo += gSep+"換紙"+spec[0];
			}
		} else
			alert(gPriceErr+itemName);
		document.getElementById(itemName).value = temp;
	}
	return temp;
}

function hdrBackpad(subTotal)
{
	var temp = 0;
	var itemName = "backpad";
	if (document.getElementById(itemName) != null) {
		var spPad =xmlobj.product.option[gXobj+itemName];
		if (typeof(spPad) != gUndefined) {
			if (prForm.addPad.checked) {
				temp = Math.round(parseFloat(spPad) * subTotal);
				gSpecInfo += gSep+"裱豪卡板";
			}
		} else
			alert(gPriceErr+itemName);
		document.getElementById(itemName).value = temp;
	}
	return temp;
}

function hdrBinding()
{
	var temp = 0;
	if (typeof(prForm.bindPrice) != gUndefined) {
		var retobj = findQuantity(xmlobj.product.bindquan, gQuantity);
		var xmlNdx;
		var bindIndex = prForm.binding.selectedIndex;
		if (prForm.binding.length == 1)	//only 1 level=sizeSel
			xmlNdx = prForm.sizeSel.selectedIndex;
		else	// 2 levels: sizeSel-bindSel
			xmlNdx = (prForm.sizeSel.selectedIndex * prForm.binding.length) + bindIndex;
		//alert("ret:"+retobj.ndx+"="+bindIndex+"->"+xmlNdx);
		var perBook = parseFloat(xmlobj.product.bindings.binding[xmlNdx].price[retobj.ndx]._value());
		temp = gQuantity * perBook;
		gSpecInfo += gSep+prForm.binding.options[bindIndex].text;
		prForm.bindPrice.value = temp;
	}
	return temp;
}

function hdrProof()
{
	var temp = 0;
	var itemName = "proof";
	if (document.getElementById(itemName) != null) {
		var spProof =xmlobj.product.option[gXobj+itemName];
		if (prForm.addProof.checked) {
			if (typeof(spProof) != gUndefined)
				temp = parseFloat(spProof);
			else {
				//temp = parseFloat(prForm.unitPrice.value) + gDelivery;
				temp = parseFloat(gUnitPrice) + gDelivery;
				if (temp < gMinProof)
					temp = gMinProof;
			}
			gSpecInfo += gSep+"打樣";
		}
		document.getElementById(itemName).value = temp;
	}
	return temp;
}

// for calendar add pages discount
function pageDiscount()
{
	var optDiscount = xmlobj.product.option["@pageOff"];
	var offAry = [300, 1000, 3000];

	var offRange = optDiscount.split(gPrSep);
	for (r=0; r < offRange.length; r++) {
		if (gQuantity <= offAry[r])
			return parseFloat(offRange[r]);
	}
	alert(gPriceErr+"pageOff");
}

function hdrAddPages()
{
	var temp = 0;
	var itemName = "addpages";
	var modBy = 2;
	var discount = 1;
	if (document.getElementById(itemName) != null) {
		var ndx = prForm.sizeSel.selectedIndex;
		var spPage =xmlobj.product.option[gXobj+itemName];
		if (gProdId=="cala3")
			modBy = 1;	// wall calendar A3
		if (typeof(spPage) != gUndefined) {		
			var pages = validAddPages(modBy);
			if (pages > 0) {
				// per 2 pages
				var cost = spPage.split(gPrSep);
				var perPage = parseFloat(cost[ndx]);
				if (gProdId=="cala3" || gProdId=="calendar") {
					discount = pageDiscount();
					//alert("pageOff:"+discount+":"+perPage * discount);
				}
				temp = (perPage * discount) * getIntUnit(pages,modBy);
				gSpecInfo += gSep+"加頁數:"+pages;
			}
		} else
			alert(gPriceErr+itemName);
		}
		//document.getElementById(itemName).value = temp;
	return temp;
}
// end of unified function for doOptions

function findQuantity(quanList, q)
{
	var minRVal,maxVal;
	var low, high, value;
	var ret = new Object;
	var prevHigh= 0;
	var quan = quanList.quan;
	
	ret.ndx = -1;
	ret.val=q;	// set init. value
	for (i=0; i<quan.length; i++) {
		value = quan[i]._value();
		arr=value.split(gPrSep);
		if (arr.length==1) {
			low=arr[0];
			high=arr[0];
		}else {
			low=arr[0];
			high=arr[1];
		}
		// found
		if (q >= low && q <= high) {
			ret.ndx = i;
			break;
		}
		// set boundary value: minVal & maxVal
		if (i==0)
			minVal = low;
		if (i==quan.length-1)
			maxVal = high;
			
		// range in the middle shift value
		if (q > minVal) {
			if (q >= prevHigh && q <= high) {
				ret.ndx = i;
				ret.val = high;
				break;
			}
		}
		prevHigh = high;
	}
	// quantity with linear should not be shifted
	if (quanList["@linear"] != null)
		ret.val=q;
		
	//adjust lower/upper limit
	if (ret.ndx == -1) {
		if (q < minVal) {
			ret.ndx = 0;
			ret.val = minVal;
			low = minVal;
			value = quan[0]._value();
			var arr=value.split(gPrSep);
			if (arr.length==1)
				high=arr[0];
			else
				high=arr[1];
		}
		if (q > maxVal) {
			ret.ndx = quan.length-1;
			ret.val = maxVal;
		}
	}

	// default low=high (arr.length==1) if not ndx=0, set low to high value
	if (quanList["@linear"] != null) {
		if (ret.ndx != 0)
			low = quan[ret.ndx-1]._value();
	}
	ret.low = low;
	ret.high = high;
	//alert("ndx:"+ret.ndx+",q:"+ret.val+"="+ret.low+"-"+ret.high);

	// show quan range
	if (quanList["@count"] != null)
		document.getElementById("quanUnit").title = low+"-"+high;
	return ret;
}

function showPrices(arr)
{
	var str="";
	for (i=0; i <arr.length; i++)
		str += arr[i]._value()+gSep;
	alert(str);
}

function optTrigger(srcObj, linkName, ndx)
{
	var linkObj = document.getElementById(linkName);
	if (srcObj.type=='checkbox' && srcObj.checked || srcObj.type=='select-one' && srcObj[ndx].selected)
		linkObj.disabled = false;
	else
		linkObj.disabled = true;
	changeOptions();
}

function checkOptions(srcObj, linkName)
{
	var linkObj = document.getElementById(linkName);
	if (srcObj.checked)
		linkObj.disabled = false;
	else
		linkObj.disabled = true;
	changeOptions();
}

function listOptions(srcObj, linkName, ndx)
{
	var linkObj = document.getElementById(linkName);
	//alert(srcObj.type);
	if (srcObj[ndx].selected)
		linkObj.disabled = false;
	else
		linkObj.disabled = true;
	changeOptions();
}

// Math.ceil(value)
function getIntUnit(quan, modBy)
{
	var theUnit = parseInt(quan/modBy);
	if ((quan % modBy) != 0) 
		theUnit++;
	return theUnit;
}

// extra process if size=A3 in booklet
// not used
var paperCvrA3 = "180P亮彩紙";
var gCvrPaper; // save original
function setBooklet()
{	
	if (prForm.sizeSel.selectedIndex==2) {	// A3 only has one paper selection
		gCvrPaper = prForm.paperCvrSel.options[0].text;
		prForm.paperCvrSel.options[0].text = paperCvrA3;
		prForm.paperCvrSel.disabled=true;
		prForm.paperCvrSel.selectedIndex=0;
		for (i=0; i< prForm.binding.length; i++)
			if (prForm.binding.options[i].text==gSaddle) {
				prForm.binding.options[i].disabled=true; // no saddle binding
				var selNdx = i+1;
				if (selNdx == prForm.binding.length)	//last index
					selNdx = 0;
				prForm.binding.selectedIndex=selNdx;	//point to next;
				prForm.binding.onchange();
				break;
			}
		prForm.inkCvrSel.selectedIndex=0;
		prForm.inkCvrSel.onchange();
		prForm.inkCvrSel.options[1].disabled=true; // only color allowed
	} else if (prForm.paperCvrSel.disabled){
		prForm.paperCvrSel.options[0].text = gCvrPaper; //restore paper
		prForm.paperCvrSel.disabled=false;
		for (i=0; i< prForm.binding.length; i++)
			if (prForm.binding.options[i].text==gSaddle) {
				prForm.binding.options[i].disabled=false;
				break;
			}
		prForm.inkCvrSel.options[1].disabled=false;
	}
}

function isArray(obj)
{
	return(typeof(obj.length)=="undefined")?false:true;
}

function debug(msg)
{
	document.batch.comment.value = msg;
}

// replace submit when enter to call blur
function onEnter( evt, ele )
{
	var keyCode = null;

	if (evt.which) {
		keyCode = evt.which;
	} else if (evt.keyCode) {
		keyCode = evt.keyCode;
	}
	if (keyCode==13) {
		ele.blur();
		return false;
	}
	return true;
}

// for sticker
function setStickList(ndx)
{
	var highSel = document.getElementById('highDim');
	
	if (highSel == null) {
		changePrices();
		return;
	}
	highSel.options.length=0; 
	var stkType;
	switch (ndx) {
	case 0:
		minval = 10;
		maxVal = 85;
		incVal = 5;
		stkType="B";
		break;
	case 1:
		minval = 10;
		maxVal = 135;
		incVal = 5;
		stkType="C";
		break;			
	case 2:
		minval = 10;
		maxVal = 50;
		incVal = 10;
		stkType="D";
		break;			
	}	
	for (var v=minval; v <= maxVal; v+=incVal)
		highSel.options.add(new Option(v, stkType+v)); 
	highSel.selectedIndex=0;
	setLengthList();
}
function setLengthList()
{
	var highSel = document.getElementById('highDim');
	var optSel = highSel.options[highSel.selectedIndex].value;
	var stkType = optSel.substring(0,1);
	var stkVal = parseInt(optSel.substring(1));
	var lenSel = document.getElementById('lenDim');
	lenSel.options.length=0;
	switch (stkType) {
	case "B":
		if (stkVal <60) {
			minval = stkVal;
			maxVal = 90;
			incVal = 5;
			for (var v=minval; v <= maxVal; v+=incVal)
				lenSel.options.add(new Option(v, v)); 
		}
		if (stkVal >=30) {
			lenSel.options.add(new Option(95, 95));
			lenSel.options.add(new Option(145, 145));
		}
		break;
	case "C":
		lenSel.options.add(new Option(stkVal, stkVal));
		break;			
	case "D":
		minval = stkVal+10;
		maxVal = 40+stkVal;
		incVal = 5;
		for (var v=minval; v <= maxVal; v+=incVal)
			lenSel.options.add(new Option(v, v)); 
		break;			
	}	
	changePrices();
}
