/*
	These functions are presented as standard examples of the application side
	framework api for the product configuration constraint system.
	
	The functions are all assigned to their framework api name at the bottom of this
	script.
	
	The functions developed here are expected to be application specific. This script
	is presented as a standard development that can be used as a base starting point
	for application development.
	
	Individual functions in this framework may be replaced by defining a function and
	assigning it to the standard api name after this script has been called.
	
	This entire script may be replaced for any single application by developing js function
	with the same api presented here and using them rather than this script.
	
	The use of this script with the constraint system is optional. These functions must
	be present when the domain_display.cfc component is used but alternates to those
	in this script can be utilized.
*/
var init_slider_pics = true;
function customFormChange(nTriggerDomain) {
	oDomains.evaluateRules(aExRules, oDomainToRuleMap, nTriggerDomain);
	// Cycle through Domains - Mark the domains in a conflict or warning state
	//								Mark the prohibited domain choices
	//								For each domain reset the form element.
	// set the default finish
	// process the rules
	// clear image tab
	document.getElementById('tdsecdwg2').innerHTML = "";
	inBuilder = false;
	startBuilder = -1;
	startBuilderStat = Rule.NoConstraint;
	addOptionStr = '';
	
	// set the additional options value
	var inBuilder = false;
	var startBuilder = -1;
	var addOptionStr = '';
	for (var domid in oDomains.domains) {
		oDom = oDomains.domains[domid];
		if (oDom.dtype != "D_CONSTANT") {
			if (oDom.domainFuncType == 'BUILDER') {
				if (!inBuilder) {
					startBuilder = domid;
					for (var optid in oDom.members) {
						if (Trim(oDom.members[optid].code) == '') {
							choiceid = optid;
						} else {
							choice1 = optid;
						}
					}
				}
				inBuilder = true;
			} else {
				inBuilder = false;
			}
			
			if (oDom.aDSV.length > 0 && Trim(oDom.members[oDom.aDSV[0]].code) != '') {
				if (inBuilder && !(startBuilder == domid)) {
					choiceid = choice1;
					break;
				}
			}
		}
	}
	if (startBuilder != -1) {
		//alert("inbuilder "+startBuilder+" - choice="+choiceid)
		oDom = oDomains.domains[startBuilder];
		oDom.clearDomainChoices();
		oDom.setChoice(choiceid, Domain.UserSet);
	}

	stdFormChange(nTriggerDomain);
	
	var oStateImage;
	for (var domid in oDomains.domains) {
		if (oDomains.domains.hasOwnProperty(domid)) {
			oDom = oDomains.domains[domid];
			if (oDom.dtype != "D_CONSTANT" && oDom.dtype != "") {
				// change background color for selected rows & handle images
				oConfigRow = document.getElementById('CROW_'+domid);
				// clear the picture mark
				oImageMarkSpan = document.getElementById('IHI_'+domid);
				oImageMarkSpan.style.display = 'none';
				if (oDom.domainFuncType == 'BUILDER') {
					if (!inBuilder) {
						startBuilder = domid;
					}
					inBuilder = true;
				} else {
					inBuilder = false;
				}
				if (inBuilder && !(startBuilder == domid)) {
					for (k=0; k<oDom.aDSV.length; k++) {
						addOptionStr = addOptionStr + oDom.members[oDom.aDSV[k]].code;
					}
					if ("" == Trim(addOptionStr)) {
						document.getElementById('builder').innerHTML = "No Options Selected - Standard Construction";
					} else {
						document.getElementById('builder').innerHTML = addOptionStr;
					}
				}
				oConfigRow.style.backgroundColor = "#DEBE84";
				// possibly add a picture mark
				for (k=0; k<oDom.aDSV.length; k++) {
					if (oDom.members[oDom.aDSV[k]].image != '') {
						oImageMarkSpan.style.display = '';
						// add image to image tab
						document.getElementById('tdsecdwg2').innerHTML =
							document.getElementById('tdsecdwg2').innerHTML 
							+ '<p class="tabs" style="page-break-inside: avoid;">'
							+ '<table width="100%"><tr><td width="50%">'
							+ '<hr width="100%" color="#AAAAAA" noshade></td>'
							+ '<td nowrap class="med">&nbsp;' +oDom.members[oDom.aDSV[k]].value + '&nbsp;</td>'
							+ '<td width="50%"><hr width="100%" color="#AAAAAA" noshade></td></tr></table>' 
							+'<img src="' + linepath + oDom.members[oDom.aDSV[k]].image 
							+ '" alt="" border="0"></p>';
					}				
				}

			    // *******************************************************************
				oStateImage = document.getElementById('status_img_'+domid);
				var oConfigRow = document.getElementById('CROW_'+domid);
				var first_builder = null;
				if (oConfigRow) {
					if (!oDom.hasSelection()) {
						oStateImage.src = 'images/tilda_16.GIF';
						if (inBuilder) {
							backgroundColor = "#EEEEEE";
						} else { 
							backgroundColor = "#F3E8B0";
						}
						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;
						if (null != document.getElementById('scroll_div_'+domid)) {
							// image picker
							//if (init_slider_pics) {
								slideVis(domid, -1);
							//}
						}
					} else {
						if (oDom.contype == Rule.HardConstraint) {
							backgroundColor = "#F3B0B0";
						} else { 
							backgroundColor = "#EEEEEE";
						}
						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;
						if (null != document.getElementById('scroll_div_'+domid)) {
							// image picker
							pickIndx = document.getElementById("dom_"+domid).selectedIndex;
							slideVis(domid, pickIndx-1);
						}
						
						switch (oDom.contype) {
						case Rule.NoConstraint:
							oStateImage.src = 'images/sq_check_16.GIF';
							break;
						case Rule.SoftConstraint:
							oStateImage.src = 'images/warning_diamond16.GIF';
							if (inBuilder && startBuilderStat != Rule.HardConstraint) {  
								startBuilderStat = Rule.SoftConstraint;
							}
							break;
						case Rule.HardConstraint:
							oStateImage.src = 'images/helphere16_red.GIF';//'images/red_x_16.GIF';
							if (inBuilder) {  
								startBuilderStat = Rule.HardConstraint;
							}
							break;
						}
					}
				}
			}
		}
	}
	if (startBuilder != -1) {
		oStateImage = document.getElementById('status_img_'+startBuilder);
		switch (startBuilderStat) {
		case Rule.NoConstraint:
			oStateImage.src = 'images/sq_check_16.GIF';
			break;
		case Rule.SoftConstraint:
			oStateImage.src = 'images/warning_diamond16.GIF';
			break;
		case Rule.HardConstraint:
			oStateImage.src = 'images/red_x_16.GIF';
			break;
		}
	}
	// *******************************************************************
	var sState = oDomains.getConstraintEngineState();
	SetButtonStates( sState!="Invalid", sState=="Partial"); //In main template
	// *******************************************************************
	init_slider_pics = false;
}

formChange = customFormChange;

function customShowPartNumber() {
	var oDom;
	var aPNBlocks = new Array();
	for (var i=0; i<oDomains.cpcarray.length; i++) {
		oDom = oDomains.cpcarray[i];
		switch (oDom.dtype) {
		case Domain.Constant:
			//It is a constant - user can't pick
			aPNBlocks[i] = oDom.label;
			break;
		case Domain.List:
			aPNBlocks[i] = (oDom.hasSelection()) ? oDom.selectionString():oDomains.nopick;
			break;
		case Domain.IntegerRange:
		case Domain.Mixed:
		case Domain.DecimalRange:
			if (oDom.hasSelection()) {
				try {
					oDomFormEle =  getFormObject(oDom.did);
					aPNBlocks[i] = DomInputValProcessor(oDom);
					// format the users input
					if (oDomFormEle) {
						// upper case the input
						oDomFormEle.value = oDomFormEle.value.toUpperCase();
						var nubs = "-0123456789.";
						if (oDomFormEle.value.length > 0 && nubs.indexOf(oDomFormEle.value.charAt(0)) >= 0) {
							// strip out letters and "-" sign -- only positive for AIRPAX and "-" is seperator
							oDomFormEle.value = oDomFormEle.value.replace(/[^0-9.]/g, '');
							// strip out leading zeros
							oDomFormEle.value = oDomFormEle.value.replace(/^0*/g, '');
						}
					}
				} catch (myexcept) {
					aPNBlocks[i] = oDom.inputval;
					// upper case the input
					oDomFormEle.value = aPNBlocks[i].toUpperCase();
				}
			} else {
				aPNBlocks[i] = new String(oDomains.nopick);
			}
			break;
		default:
			alert('Domain ('+oDom.label+') is an unsupported datatype ('+oDom.dtype+')');
			break;
		}
	}
	var oCPNString = document.getElementById('cpn_partnumber');
	oCPNString.innerHTML = aPNBlocks.join('');
	document.config_form.part_number.value = aPNBlocks.join('');
	
	var oCPNState = document.getElementById('cpn_state');
	var sState = oDomains.getConstraintEngineState();
	var oCPNStateImage = document.getElementById('cpn_state_image');
	var oUpdateButton = document.getElementById('update_assembly');
	var oVPButton = document.getElementById('view_part_but');
	var oAddCartButton = document.getElementById('add_to_cart');
	var oDownloadCADButton = document.getElementById('download_CAD');
	if (oDownloadCADButton != null) {
		 document.getElementById('CAD').src = "images/button_CAD_0.gif";
		 oDownloadCADButton.onmouseout = null;
		 oDownloadCADButton.onmouseover = null;
		 oDownloadCADButton.onclick = function () {  alert('Complete configuration before downloading CAD drawings.'); }
	}
	switch(sState) {
	case 'Partial':
		oCPNState.style.color = '#997700';
		oCPNStateImage.src = 'images/tilda_32.gif';
		if (oUpdateButton != null) oUpdateButton.disabled = true;
		if (oVPButton != null) oVPButton.disabled = true;
		if (oAddCartButton != null) {
			 oAddCartButton.src = "images/addcart_0.gif";
			 oAddCartButton.onmouseout = null;
			 oAddCartButton.onmouseover = null;
			 oAddCartButton.onclick = function () {  alert('Complete configuration before adding to the cart.'); }
		}
		break;
	case 'Complete':
		oCPNState.style.color = '#00A000';
		oCPNStateImage.src = 'images/sq_check_32.gif';
		if (oUpdateButton != null) oUpdateButton.disabled = false;
		if (oVPButton != null) oVPButton.disabled = false;
		if (oAddCartButton != null) {
			 oAddCartButton.src = "images/addcart_1.gif";
			 oAddCartButton.onmouseout = function () {MM_swapImgRestore();}
			 oAddCartButton.onmouseover = function () { MM_swapImage('add_to_cart','','images/addcart_2.gif',1);}
			 oAddCartButton.onclick = function () {  addToCart(); }
		}
		if (oDownloadCADButton != null && cadModelCount > 0) {
			cad_file = getCADfromConfiguration();
			if (cad_file != "") {
				 document.getElementById('CAD').src = "images/button_CAD_1.gif";
				 oDownloadCADButton.onmouseout = function () {MM_swapImgRestore();}
				 oDownloadCADButton.onmouseover = function () { MM_swapImage('CAD','','images/button_CAD_2.gif',1);}
				 oDownloadCADButton.onclick = function () {  downloadCadWindow(); }
			}
		}
		break;
	case 'Invalid':
		oCPNState.style.color = '#CC0000';
		oCPNStateImage.src = 'images/red_x_32.gif';
		if (oUpdateButton != null) oUpdateButton.disabled = true;
		if (oVPButton != null) oVPButton.disabled = true;
		if (oAddCartButton != null) {
			 oAddCartButton.src = "images/addcart_0.gif";
			 oAddCartButton.onmouseout = null;
			 oAddCartButton.onmouseover = null;
			 oAddCartButton.onclick = function () {  alert('Correct configuration before adding to the cart.'); }
		}
		break;
	}
	oCPNState.innerHTML = sState;
}
ShowPartNumber = customShowPartNumber;

function customShowDomainMessages(domainid, oDiv, sTitle) {
	var wobj = self;
	if (arguments.length > 1) {
		wobj = arguments[1];
	}
	if (oDomains.domains.hasOwnProperty(domainid)) {
		oDom = oDomains.domains[domainid];
		if (oDom.hasSelection()) {
			switch (oDom.contype) {
			case Rule.NoConstraint:
				break;
			case Rule.SoftConstraint:
				displayHelp(getPositionX(wobj)-300, getPositionY(wobj), "Configuration Notice!", getDomainConflictMessages(domainid, '<br>&nbsp;'), 300, 200);
				break;
			case Rule.HardConstraint:
				displayHelp(getPositionX(wobj)-300, getPositionY(wobj), "Configuration Error!", getDomainConflictMessages(domainid, '<br>&nbsp;'), 300, 200);
				break;
			}
		}
	}
}

showDomainMessages = customShowDomainMessages;

//Debugging Routines - These scripts should not be 
//					   moved into production code.
function ShowConstraintState() {
	
	var mystring = 'Domains';
	
	for (var domid in oDomains.domains) {
		if (oDomains.domains.hasOwnProperty(domid)) {
			oDom = oDomains.domains[domid];
			if (oDom.dtype != Domain.Constant) {
				mystring += '\n'+ oDom.label +': code="' + oDom.code + '" dsv=['+oDom.aDSV.join()+'] selected=(';
				for (j=0; j<oDom.aDSV.length; j++) {
					mystring +=  oDom.members[oDom.aDSV[j]].code+" ";
				}
				mystring += ')';
			}
		}
	}
	alert(mystring)
}

