var oStateMessages = new Object();
// State Messages will be provided in page onload action

var current_rodend = "";
var hasXOptions = false;
var bore_size = "";
var stroke_size = "";
var rod_end_dom = "";
var MM_user_select = "";

function blockEnter(e) { //e is event object passed from function invocation
	if (!e) var e = window.event;
	var characterCode;
	if (e.which) { //if which property of event object is supported (NN4)
		characterCode = e.which //character code is contained in NN4's which property
	} else {
		characterCode = e.keyCode //character code is contained in IE's keyCode property
	} 

	if (characterCode == 13) { 
		//if generated character code is equal to ascii 13 (if enter key)
		var targ = e.target || e.srcElement;
		if (targ.nodeType == 3) targ = targ.parentNode // defeat Safari bug
		targ.blur();
		return false
	}
}

function toggleAddOpts(domid, button, alttext) {
	//alert(domid)
	var oTr = document.getElementById("CROW_" + domid);
	if (oTr) {
		if (oTr.style.display == "") {
			oTr.style.display = "none";
		} else {
			oTr.style.display = "";
		}
	}
	if (button) {
		var oButton = document.getElementById("add_opts_button");
		var saveval = oButton.value;
		if ('undefined' == typeof oButton.value2) {
		//alert("was undefined setting to "+alttext)
			oButton.value = alttext;
		} else {
		//alert("ok setting to "+oButton.value2)
			oButton.value = oButton.value2;
		}
		oButton.value2 = saveval;
	}
	for (var i=0; i<addOptsDomArray.length; i++) {
	//alert('domid = '+domid+' addOptsDomArray['+i+'] = '+ addOptsDomArray[i])
		if (addOptsDomArray[i] == domid && i<(addOptsDomArray.length-1)) {
			var cmd = "toggleAddOpts(" + addOptsDomArray[i+1] + ", false, '"+alttext+"');"
			setTimeout(cmd, 30);
			break;
		}
	}
}

function ShowRodEndPicture( rodcode ) {
	if (rodcode == current_rodend) return;
	var oRodDiv = document.getElementById("rodModArea");
	if (oRodDiv) {
		current_rodend = rodcode;
		oRodDiv.innerHTML = "";
		RodEndInitAction = "";
		if (rodcode == "") {
			oRodDiv.style.display = "none";
		} else {
			oRodDiv.innerHTML = '<table><tr><td><img src="images/animated_busy2.gif" alt="" width="20" height="20" border="0"></td><td> Loading...</td></tr></table>';
			oRodDiv.style.display = "";
			var params = 'rod_code='+encodeURIComponent(rodcode);
			params += '&base_linecode='+encodeURIComponent(base_linecode);
			params += '&catalog_dsn='+encodeURIComponent(catalog_dsn);
			params += '&series='+encodeURIComponent(series);
			params += '&id='+encodeURIComponent(product_id);
			params += '&reqpartnobutton='+encodeURIComponent(reqpartno_buttontext);
			params += '&ordcustrodend='+encodeURIComponent(ordcustrodends_linktext);
			params += '&ordcustrodendmsg='+encodeURIComponent(ordcustrodend_msgtext);
		    // use the standard_ajax.js ajax object
		    new net.ContentLoader("ajax/rodends.cfm", loadRodEndDiv, null, "POST", params);	
		}
	} else alert("no rod end area!")
}

var RodEndInitAction = "";
function loadRodEndDiv() {
    var responsetxt = this.req.responseText;
    var responseObj = eval("(" + responsetxt + ")");

	var oRodDiv = document.getElementById("rodModArea");
    if ("undefined" != typeof responseObj.status && !responseObj.status) {
		oRodDiv.innerHTML = "";
        alert('Loading Rod End Information Failed: '+responseObj.data.message);
        return;
    }
	oRodDiv.innerHTML = responseObj.html_content;
	MM_user_select = responseObj.init_mm;
	RodEndInitAction = responseObj.init_action;
	setTimeout(RodEndInitAction);
	last_bore = "";
}

function customFormChange(nTriggerDomain) {
	stdFormChange(nTriggerDomain);
	for (var domid in oDomains.domains)  {
		if (oDomains.domains.hasOwnProperty(domid)) {
			oDom = oDomains.domains[domid];
			if (oDom.dtype != "D_CONSTANT" && oDom.dtype != "") {
				var oDiv = document.getElementById("MP_"+domid);
				if (oDiv) oDiv.style.display = "none";
				var oConfigRow = document.getElementById('CROW_'+domid);
				var oStateImage = document.getElementById('status_img_'+domid);
				if (!oDom.hasSelection()) {
					if (oStateImage) {
						oStateImage.style.cursor = "";
						oStateImage.src = 'images/NA/tilda_16.GIF';
					}
					backgroundColor = "#B8CCFF";//"#D0D0A0";
				} else { 
					backgroundColor = "#FFFFFF";//"#EEEEEE";
					oStroke = document.getElementById('stroke_'+domid);
					if (oStateImage) {
						oStateImage.style.cursor = "";
						switch (oDom.contype) {
						case Rule.NoConstraint:
							oStateImage.src = 'images/NA/sq_check_16.GIF';
							if (oStroke) oStroke.style.color = gNoConstraintColor;
							break;
						case Rule.SoftConstraint:
							oStateImage.src = 'images/NA/warning_diamond16.GIF';
							if (oStroke) oStroke.style.color = gSoftConstraintColor;
							// popup a message box
							var xpos = getPositionX(oStateImage)+18;
							var ypos = getPositionY(oStateImage);
							displayErrorMsg(domid, getDomainConflictMessages(domid, ''), xpos ,ypos, 'warn');
							break;
						case Rule.HardConstraint:
							oStateImage.src = 'images/NA/helphere16_red.GIF';//'images/red_x_16.GIF';
							oStateImage.style.cursor = "help";
							if (oStroke) oStroke.style.color = gHardConstraintColor;
							// popup a message box
							var xpos = getPositionX(oStateImage)+18;
							var ypos = getPositionY(oStateImage);
							displayErrorMsg(domid, getDomainConflictMessages(domid, '<br>&nbsp;'), xpos ,ypos, 'error');
							break;
						}
					}
				}
				try {
				oConfigRow.cells[0].style.backgroundColor = backgroundColor;//"#DEBE84"
				oConfigRow.cells[1].style.backgroundColor = backgroundColor;
				oConfigRow.cells[2].style.backgroundColor = backgroundColor;
				//oConfigRow.cells[3].style.backgroundColor = backgroundColor;
				} catch (myexcept) { }
				if (oDom.code == 'XROD_ENDS') {
					ShowRodEndPicture(oDom.selectionString());
					rod_end_dom = oDom;
					// clear any xtra attributes
					rod_end_dom.extraAttributes = new Object();
				}
				if (oDom.code == 'BORE') {
					bore_size = oDom.hasSelection()?oDom.selectionString():"";
				}
				if (oDom.code == 'STROKE') {
					stroke_size = oDom.hasSelection()?DomInputValProcessor(oDom):"";
				}
			}
		}
	}
	if (RodEndInitAction != "") {
		setTimeout(RodEndInitAction);
	}
}
function smcShowDomainMessages(domainid, oDiv, sTitle) {
	var wobj = self;
	var title = "Conflicts/Warnings"

	if (arguments.length > 1) {
		wobj = arguments[1];
	}
	if (typeof sTitle != "undefined") {
		title = sTitle;
	}
	var oDom = oDomains.domains[domainid];
	if (getDomainConflictMessages(domainid, '') != "") {
		displayErrorMsg(domainid, getDomainConflictMessages(domainid, '<br>&nbsp;'), getPositionX(wobj)+18, getPositionY(wobj), (oDom.contype == Rule.HardConstraint)?'error':'warn' );
	}
}


function displayErrorMsg( domid, text, xp, yp, level ) {
	var oDiv = document.getElementById("MP_"+domid);
	var color = "ce2929";
	var img = "red_left";
	if (level == "warn") {
		color = "cfb529";
		img = "yellow_left";
	}
	if (!oDiv) oDiv = createDivElement("MP_"+domid, "display:none;")
	oDiv.innerHTML = '<div><table class="small" cellspacing="0" cellpadding="0"><tr><td valign="top"><img src="images/'+img+'.gif" alt="" width="12" height="12" vspace="12" border="0"></td><td style="border-bottom: 1px solid silver; border-top: 1px solid white; color:white;background-color:#'+color+';padding:5px 0px 5px 5px;">'+text+'</td><td valign="top" style="border-right: 1px solid silver; border-bottom: 1px solid silver; border-top: 1px solid white; color:white;background-color:#'+color+';"><img src="images/closebox_white.GIF" alt="Close Message Box" width="15" height="15" hspace="3" vspace="3" border="0"> </td></tr></table></div>';
	oDiv.style.top=(yp-12)+"px";
	oDiv.style.left=xp+"px";
	oDiv.style.width=176+"px";
	oDiv.style.position='absolute';
	oDiv.style.cursor='pointer';
	oDiv.style.display='';
	oDiv.onclick = function () {this.style.display="none";}

	document.body.appendChild(oDiv);
	//alert(domid+"',"+text+", "+xp+", "+yp);
}

var currentPartNumber;
function smcShowPartNumber() {
	var oCPNString = document.getElementById('cpn_partnumber');
	partNumberString = "";
	currentPartNumber = "";
	partCode = '';
	//partArray = oDomains.getPartNumber();
	partNumberString = oDomains.getPartNumber().join("");
	hasXOptions = false;	
	for (var i=0; i<oDomains.cpcarray.length; i++) {
		partBlock = '';
		partBackColor = 'FFFFFF';
		oDom = oDomains.cpcarray[i];
		switch (oDom.dtype) {
		case Domain.Constant:
			//It is a constant - user can't pick
			partBlock = oDom.label;
			currentPartNumber = currentPartNumber+partBlock;
			partBackColor = 'FFFFFF';
			break;
		case Domain.List:
			//If oDom.label == 'dash' then user cannot pick it is autoset.
			//code will either be '-' or empty string.
			partBackColor = 'B8CCFF';
			if (oDom.label.substring(0,1) == '-')//optional dash fields
				partBackColor = 'FFFFFF';
			if (oDom.state == Domain.NotSet) {
				partBlock = '';
			} else {
				partBlock = oDom.selectionString();
			}
			hasXOptions = hasXOptions || (partBlock == '-X');
			currentPartNumber = currentPartNumber+partBlock;
			break;
		case Domain.Mixed:
		case Domain.IntegerRange:
		case Domain.DecimalRange:
			partBackColor = 'B8CCFF';
			if (oDom.hasSelection()) {
				try {
					partBlock = DomInputValProcessor(oDom);
				} catch (myexcept) {
					partBlock = oDom.inputval;
				}
			} else {
				partBlock = new String(oDomains.nopick);
			}
			currentPartNumber = currentPartNumber+partBlock;
			break;
		default:
			alert('Domain ('+oDom.label+') is an unsupported datatype ('+oDom.dtype+')');
			break;
		}
		if(oDom.contype == Rule.HardConstraint)
			partBackColor = 'FF0000';
		if(partBlock == '')
			partCode = partCode + '<td nowrap bgcolor="#' + partBackColor + '">' + '&nbsp;&nbsp;' + '</td>';
		else
			partCode = partCode + '<td nowrap bgcolor="#' + partBackColor + '">' + partBlock + '</td>';
	}

	oCPNString.innerHTML = '<table border="0" cellpadding="3" cellspacing="1" bgcolor="#000000"><tr style="font-family: arial; font-weight: bold;">' +
							partCode +
							'</tr></table>';
	var oCPNState = document.getElementById('cpn_state');
	var sState = oDomains.getConstraintEngineState();
	var oStateImage = document.getElementById('status_img');
	switch(sState) {
	case 'Partial':
		oStateImage.src = 'images/NA/tilda_32.gif';
		break;
	case 'Complete':
		oStateImage.src = 'images/NA/sq_check_32.gif';
		break;
	case 'Invalid':
		oStateImage.src = 'images/NA/red_x_32.gif';
		break;
	}
	
	oCPNState.innerHTML = oStateMessages[sState];
}

function setConfigByPartNumber(oSel) {
	partNum = oSel.options[oSel.selectedIndex].value;
	if (partNum.length == 0) return;
	
	//var acodes = partNum.split("~");
	var partNumToGo = partNum.replace(/\s/g,'');
	partNumToGo = partNumToGo.replace(/~/g,'');
	var lastNonOption = -1;
	for (var domid in oDomains.domains) {
		oDom = oDomains.domains[domid];
		// find last non-option
		if (!oDom.isOption) {
			lastNonOption = domid;
		}
	}

	// build up a list of matching groups that merge all of the options together
	var matchGroups = new Array();
	var matchStruct;
	var mergerest = false;
	for (var domid in oDomains.domains) {
		oDom = oDomains.domains[domid];
		if (!mergerest) {
			matchStruct = new Object();
			matchStruct.domids = new Array();
			matchStruct.optids = new Array();
			matchStruct.dtype = oDom.dtype;
			matchGroups[matchGroups.length] = matchStruct;
		}
		if (lastNonOption == domid) {
			mergerest = true;
		}
		if (oDom.dtype == "D_CONSTANT" ) {
			matchStruct.domids[matchStruct.domids.length] = domid;
			matchStruct.optids[matchStruct.optids.length] = -1;		
		} else {
			oDom.clearDomainChoices();
			// loop through all the options
			for (var idDomMember in oDom.members) {
				if (oDom.members.hasOwnProperty(idDomMember)) {
					matchStruct.domids[matchStruct.domids.length] = domid;
					matchStruct.optids[matchStruct.optids.length] = oDom.members[idDomMember].id;		
				}
			}
		}
	}

	// search the matching groups to build up the choices
	for (var ig=0; ig<matchGroups.length; ig++) {
		matchStruct = matchGroups[ig];
		matchFound = true;
		while (matchFound && matchStruct.domids.length > 0) {
			//alert("match group "+ig+" doms = "+matchStruct.domids.length);
			matchFound = false;
			if (matchStruct.dtype == "D_CONSTANT" ) {
				domid = matchStruct.domids[0];
				oDom = oDomains.domains[domid];
				if (0==partNumToGo.indexOf(oDom.label)) {
					partNumToGo = partNumToGo.substring(oDom.label.length);
					matchFound = true;
					// clear this dom from arrays
					for (var j=0; j<matchStruct.domids.length; j++) {
						if (matchStruct.domids[j] == domid) {
							matchStruct.domids.splice(j,1);
							matchStruct.optids.splice(j,1);
						}
					}
				} else {
					//alert("DID not match constant "+partNumToGo+" / "+oDom.label);
				}
			} else {
				// clear this option
				found = false;
				foundMatch = "";
				foundMatchID = "";
				foundDomID = "";
				sNum = "";
				noneid = -1;
				noneDomid = -1;
				
				// loop through all the options
				for (var iopt = 0; iopt<matchStruct.domids.length; iopt++) {
					domid = matchStruct.domids[iopt];
					idDomMember = matchStruct.optids[iopt];
					oDom = oDomains.domains[domid];
			
					if (oDom.dtype == Domain.Mixed) {
						// loop through the characters left to see 
						// how many will return a validated range
						var oklen = 1;
						var oDomMember = oDom.validateValueRange(partNumToGo.substr(0,oklen));
						while (oDomMember != null && oklen<partNumToGo.length) {
							oDomMember = oDom.validateValueRange(partNumToGo.substr(0,oklen));
							oklen++;
						}
						if (oDomMember==null) {
							oklen--;
							oDomMember = oDom.validateValueRange(partNumToGo.substr(0,oklen))
						}
						if (oDomMember != null) {
							sNum = partNumToGo.substr(0,oklen);
							foundMatch = partNumToGo.substr(0,oklen);
							foundMatchID = oDomMember.id;
							foundDomID = domid;
							found = true;
							document.getElementById('dom_'+oDom.containerCode+"_"
								+oDom.did+'_choiceid').value = partNumToGo.substr(0,oklen);
						}
					} else {
						var matchCode = oDom.members[idDomMember].code;
						var ta = matchCode.split(" ");
						if (ta.length==2 && "(" == ta[1].substr(0,1)) {
							// we found a banner arm type code BAB (1) -- throw out the second item
							matchCode = ta[0];
						}
						var adomcodes = matchCode.split(" ");
						var lcode1 = adomcodes[0].length;
						var lcode2 = adomcodes.length==1?0:adomcodes[1].length;
						if (adomcodes[0]=="" && adomcodes.length==1) {
							noneid = oDom.members[idDomMember].id;
							noneDomid = domid;
						} else if ((adomcodes.length==1 && 0==partNumToGo.indexOf(adomcodes[0]))
								|| 	(adomcodes.length==2 && partNumToGo.length > lcode1
								&& 0==partNumToGo.indexOf(adomcodes[0]) 
								&& lcode1==partNumToGo.indexOf(adomcodes[1],lcode1))) {
							if (foundMatch.length < (lcode1+lcode2)) {
								foundMatch = matchCode.replace(/\s/g,'');
								foundMatchID = oDom.members[idDomMember].id;
							}
							foundDomID = domid;
							found = true;
						}
					}
				}

				if (!found && noneid >= 0) {
					oDom = oDomains.domains[noneDomid];
					oDom.setChoice(noneid, Domain.UserSet);
					// clear this dom from arrays
					clearDom(matchStruct, noneDomid);
					matchFound = true;			
					//alert("none found "+oDom.label+ " "+noneid+" togo:"+partNumToGo);
				} else if (found){
					partNumToGo = partNumToGo.substring(foundMatch.length);
					oDom = oDomains.domains[foundDomID];
					oDom.setChoice(foundMatchID, Domain.UserSet, sNum);
					// clear this dom from arrays
					clearDom(matchStruct, foundDomID);
					matchFound = true;
					//alert("found "+oDom.label+ " "+foundMatchID+" "+foundMatch+" togo:"+partNumToGo);
				} else {
					//alert("Not found "+oDom.label+ " togo:"+partNumToGo);
				}
			}
		}
	}
	customFormChange(0);
}
function clearDom(mStruct, domid) {
	var newdomid = new Array();
	var newoptid = new Array();
	for (var j=0; j<mStruct.domids.length; j++) {
		if (mStruct.domids[j] != domid) {
			newdomid[newdomid.length] = mStruct.domids[j];
			newoptid[newoptid.length] = mStruct.optids[j];
		}
	}
	mStruct.domids = newdomid;
	mStruct.optids = newoptid;
}

ShowPartNumber = smcShowPartNumber;

