
function BtnGrp(type,oname,assoc,rank,heading,valueSet,costSet,parentSet,childSet,limit,live)
{
	this.optCost = 0;
	this.type = type;
	this.optName = oname;
	this.assoc = assoc;
	this.rank = rank;
	this.heading = heading;
	this.live = live || false;
	this.limit = (type=="radio") ? 1 : limit;
	
	//valueSet & costSet ARE COMMA DELIMITED LISTS
	this.valueSet = valueSet.split(",");
	this.costSet = costSet.split(",");

	//INITIALIZE COST SET (USE EXISTING VALUE IF FOUND, LAST IN LIST OTHERWISE)
	//...ALSO, CONVERT "*" TO COMMAS
	for(i=0; i<this.valueSet.length; i++)
	{
		//this.valueSet[i] = this.valueSet[i].replace("`","'");==DONOTUSE
		this.valueSet[i] = this.valueSet[i].replace("*",",");
		this.costSet[i] = (this.costSet[i]) ? this.costSet[i] : this.costSet[i-1] ;
	}
	
	//childSet IS COMMA DELIMITED LIST OF 'optNames', IF A BUTTON HAS MULTIPLE CHILDREN
	//IT SHOULD BE A '-' DELIMITED LIST
	//E.G. 'opt1,opt2,opt3-opt4' INDICATES A THREE BUTTON GROUP WITH FOUR CHILD GROUPS
	//BTN1 ENABLES 'opt1' - BTN2 ENABLES 'opt2' - AND BTN3 ENABLES 'opt3' AND 'opt4'
	this.childSet = childSet.split(",");
	//INITIALIZE CHILD SET (USE EXISTING VALUE IF FOUND, "na" OTHERWISE)
	for(i=0; i<this.valueSet.length; i++)
	{
		this.childSet[i] = (this.childSet[i]) ? this.childSet[i] : "na" ;
	}
	
	//parentSet IS COMMA DELIMITED LIST : optName,1,2 (BTN 1 & BTN 2 OF 'optName' CONTROL DISPLAY)
	//E.G. 'optName,1,2' (BTN 1 & BTN 2 OF 'optName' CONTROL DISPLAY OF THIS GROUP)
	//E.G. 'optName,3,4' (BTN 3 & BTN 4 OF 'optName' CONTROL DISPLAY OF THIS GROUP)
	this.parentSet = parentSet.split(",");

	//USE THIS ARRAY TO KEEP TRACK OF THE CHECKED BUTTON HISTORY
	if(this.type == "checkbox") this.arrSeq = new Array();

	this.BtnCost   = new Object(); 
	eval("Item.Options."+this.optName+" = this;");
}
BtnGrp.prototype.toHtml = toHtml;
BtnGrp.prototype.handleClick = handleClick;
BtnGrp.prototype.enable = enable;
BtnGrp.prototype.disable = disable;
BtnGrp.prototype.isParentEnabled = isParentEnabled;
BtnGrp.prototype.calcOptCost = calcOptCost;
BtnGrp.prototype.handleSeq = handleSeq;
BtnGrp.prototype.handleChildren = handleChildren;

function toHtml()
{
	if(this.type=="comment") return this.valueSet;
	pad = (this.rank==1) ? "" : "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" ;
	rtnStr = (this.heading=="na") ? " " : pad + this.heading+"<br>" ;
	for(i=0; i<this.valueSet.length; i++)
	{
		if((this.type == "checkbox") && (i < this.limit)) this.arrSeq[this.arrSeq.length] = this.valueSet[i];
		strCkd = ((this.live) && (i < this.limit)) ? "checked" : "" ;	
		strAddCost = (this.costSet[i] != 0) ? " ("+ ((this.costSet[i] > 0) ? "Add" : "Deduct" ) +" $"+this.costSet[i]+")" : "";	
		this.BtnCost[this.valueSet[i]] = this.costSet[i];
		onoff = ((this.live == false) && (this.rank > 1)) ? "disabled" : "" ;
		rtnStr += pad + "<input "+onoff+" "+strCkd+" type='"+this.type+"' onclick='scan(this)' name='"+this.optName+"' value='"+this.valueSet[i]+"'>"+this.valueSet[i]+strAddCost+"<br>";
	}
	return rtnStr;
}
function handleClick(btn)
{
	db(0,"Handling click on "+btn.name+ " : " +btn.value);
	if(this.isParentEnabled(btn))
	{
		if(this.type=="checkbox") this.handleSeq(btn);
		this.calcOptCost();
		if(this.childSet[0] != "na") this.handleChildren(btn);
		calcTotal();
	}
	else
	{
		btn.checked = false;
	}
}
function handleSeq(btn)
{
	//CHECKBOX PROTOCOLS
	//-- LIMIT < 0 : ANY, ALL OR NONE CHECKED
	//-- LIMIT = 0 : ONE OR NONE CHECKED
	//-- LIMIT > 0 : EXACTLY 'LIMIT' CHECKED (< OR > LIMIT IS NOT ALLOWED)
	if(this.limit >= 0)
	{
		//ADD BTN VALUE TO SEQ IF DISSIMILAR TO PREVIOUS 'LIMIT'-NBR OF CHOICES 
		if(btn.checked)
		{	
			var add2Seq = true;
			for(i=(this.arrSeq.length-this.limit); i<this.arrSeq.length; i++)
			{
				if(btn.value == this.arrSeq[i])
				{
					add2Seq = false;
					break;
				}
			}
			//ADD TO SEQ IF SPECIAL CASE LIMIT = 0 REGARDLESS
			if((add2Seq) || (this.limit == 0)) this.arrSeq[this.arrSeq.length] = btn.value; 
		}

		//RESET GROUP
		for(q=0; q<formEls.length; q++)
		{
			if(formEls[q].name == this.optName)
			{
				if(this.limit > 0)
				{
					formEls[q].checked = false;
					for(j=(this.arrSeq.length-this.limit); j<this.arrSeq.length; j++)
					{
						if(formEls[q].value == this.arrSeq[j]) formEls[q].checked = true;
					}
				}
				else
				{
					//SPC CASE 'LIMIT=0' : LEAVE CHECKED IF VALUE IS LAST IN THE SEQUENCE
					formEls[q].checked = ((formEls[q].checked) && (formEls[q].value == this.arrSeq[this.arrSeq.length-1])) ? true : false ;
				}
			}
		}
	}
	this.calcOptCost();
}
//
function handleChildren(btn)
{
	db(1,"Handling children of "+this.optName);	
	//USE btnIndex TO KEEP TRACK OF POSITION IN SEQUENCE OF BTNS
	btnIndex = 0;
	//USE THIS STRING TO KEEP TRACK OF 'ENABLED' OPTIONS...TO PREVENT DISABLING
	//A PREVIOUSLY ENABLED OPTION GOUP
	enabledOpts = "";
	//LOOP THRU FORM
	for(m=0; m<formEls.length; m++)
	{
		//IF MATCH FOUND
		if(formEls[m].name == this.optName)
		{
			for(n=0; n<this.childSet.length; n++)
			{
				if(n == btnIndex)
				{
					multiChildren = this.childSet[n].split("-");
					for(o=0; o<multiChildren.length; o++)
					{
						//CK TO SEE IF VALID GROUP
						if(Item.Options[multiChildren[o]])
						{
							if(formEls[m].checked==true)
							{
								Item.Options[multiChildren[o]].enable();
								enabledOpts += "("+multiChildren[o]+")";
							}
							else
							{
								//ONLY ALLOW IF *NOT* PREVIOUSLY ENABLED ON EARLIER PASS
								//FOR A DIFFERENT BUTTON
								if(enabledOpts.indexOf(multiChildren[o]) == -1)
									Item.Options[multiChildren[o]].disable();
							}
						}
					}
				}
			}
			//INCR INDEX TO BE READY FOR NEXT BUTTON
			btnIndex++;
		}
	}
}
function calcOptCost()
{
	this.optCost=0;
	for(w=0; w<formEls.length; w++)
	{
		if(this.optName == formEls[w].name)
		{
			for(t=0; t<this.valueSet.length; t++)
			{
				if((this.valueSet[t] == formEls[w].value) && (formEls[w].checked == true))
				{
					this.optCost += parseFloat(this.costSet[t]);
				}
			}
		}
	}
}
function enable()
{
	db(3,"Enabling option : "+this.optName+" : "+this.heading);
	nbrCkd = 0;
	//USE THIS ARRAY TO KEEP TRACK OF CHILD OPTS TO BE ENABLED
	childOpts = new Array();
	for(e=0; e<formEls.length; e++)
	{
		if((formEls[e].name == this.optName))
		{
			db(4,"Enabling button : "+formEls[e].value);
			formEls[e].disabled = "";
			if(nbrCkd < this.limit)
			{
				db(5,"Checking button : "+formEls[e].value);
				formEls[e].checked = true;
				if(this.childSet[nbrCkd] != "na") childOpts[childOpts.length] = this.childSet[nbrCkd];
				nbrCkd++;
			}
			//IN CASE OF CHECKBOX, CLEAR ALL BOXES PAST 'LIMIT'
			else
			{
				formEls[e].checked = false;
			}
		}
	}
	this.calcOptCost();
	for(idx in childOpts)
	{
		multiChildren = childOpts[idx].split("-");
		for(l=0; l<multiChildren.length; l++)
		{
			db(4,"Found child option : "+multiChildren[l]);
			if(Item.Options[multiChildren[l]]) Item.Options[multiChildren[l]].enable();
		}
		//if(Item.Options[childOpts[idx]]) Item.Options[childOpts[idx]].enable();
	}
}
function disable()
{
	db(3,"Disabling option : "+this.optName+" : "+this.heading);
	for(x=0; x<formEls.length; x++)
	{
		if(formEls[x].name == this.optName)
		{
			formEls[x].checked = false;
			formEls[x].disabled = "disabled";
		}
	}
	this.optCost = 0;
	if(this.childSet[0] != "na")
	{
		for(v=0; v<this.childSet.length; v++)
		{
			multiChild = this.childSet[v].split("-");
			for(t=0; t<multiChild.length; t++)
			{
				if(Item.Options[multiChild[t]]) Item.Options[multiChild[t]].disable();
			}
		}
	}
}
function isParentEnabled(btn)
{
	if(this.parentSet[0]=="na")
	{
		return true;
	}
	else
	{
		parentName = this.parentSet[0];
		parentBtnIdx = 0;
		for(z=0; z<formEls.length; z++)
		{
			if(formEls[z].name == parentName)
			{
				parentBtnIdx++;
				for(y=1; y<this.parentSet.length; y++)
				{
					if(this.parentSet[y] == parentBtnIdx)
					{
						if(formEls[z].checked == true)
						{
							return true;
						}
					}
				}
			}
		}
		return false;
	}
}
function scan(bobj)
{
	Item.Options[bobj.name].handleClick(bobj);
}
function calcTotal()
{
	var optionsTotal = 0;
	for(optname in Item.Options)
	{
		optionsTotal += parseFloat(Item.Options[optname].optCost);
	}
	Item.optionsCost = Math.round(100*optionsTotal)/100;
	Item.UpdateCost();
}


var formEls;
//SET TRACE=1 TO OPEN SEPARATE DEBUG WINDOW
var trace = new Boolean;
trace = 0;
function goTrace(){
	if(trace){
		debug = window.open("","debugWin","top=0,left=0,width=450,height=350,scrollbars,resizable");
		debug.document.open();
	}
}
function db(n,astr)
{
	p="&nbsp;";
	cnt = (n==0) ? 0 : n*5;
	for(i=0; i<cnt; i++) p+="&nbsp;";
	if(trace)debug.document.writeln(p+astr+"<BR>");
}
goTrace();
