// copyright 2010 Laura Shaffer Mills// units -- treat as constantsvar gkUnitMillimeters =		0;var gkUnitInches =			1;var gkUnitPlayingCards =	2;var gkUnitMatBoard =		3;var gkUnitCraftSticks =		4;// ### delete these// clay types -- treat as constants// these must match the "option value" items in the dropdown menusvar gkTypeBronzeClay =			0;		// 18.5% (17-20%) BronzClayvar gkTypeBronzeHadarClay =		1;		// 25% Hadarvar gkTypeBronzeQFHadarClay =	2;		// 10% Hadar Quick Firevar gkTypeBronzeMetalMania =	3;		// 15-19% Bronze Metal Mania powdervar gkTypeBronzePrometheus =	4;		// 6-10% Prometheus Bronze Clayvar gkTypeCopperArtClay =		5;		// 10% Copper Art Clayvar gkTypeCopperClay =			6;		// 20% CopprClayvar gkTypeCopperHadarClay =		7;		// 15%var gkTypeCopperQFHadarClay =	8;		// 10%var gkTypeCopperMetalMania =	9;		// 15-19% Copper Metal Mania powdervar gkTypeGoldArtClay =			10;		// 15%var gkTypeGoldPMCClay =			11;		// 11%var gkTypePlatinumPMCClay = 	12;		// 20-30% Platinumvar gkTypeSilverArtClay =		13;		// 9% (8-10%)var gkTypeSilverArtClay650 =	14;		// 8.5% (8-9%)var gkTypeSilverArtClayLite =	15;		// 10%var gkTypeSilverPMC1Clay =		16;		// 27.5% or (25-30 27%, 28%, 29%, 30%) PMC Standardvar gkTypeSilverPMC2Clay =		17;		// 13.5% (12-15%) PMC+var gkTypeSilverPMC3Clay =		18;		// 13.5% (12-15%) PMC3var gkTypeSilverSmithClay =		19;		// 10%var gkTypeSteelHadarClay =		20;		// 15% (10-15%)var gkTypeSteelQFHadarClay =	21;		// 10%var gkTypeSteelStHadarClay =	22;		// 10% Stainless Steelvar gkTypeSteelStQFHadarClay =	23;		// 10% Stainless Steel// Names and shrinkage values (percent) for all clay typesvar gkaoShrink = new Array;// ### delete these// Shrinkage values for all clay types with "gkType..." array index (percent)var gkaShrink = [0.185,					// BronzClay	0.25,								// Bronze Hadar	0.1,								// Bronze quick-fire Hadar	0.17,								// Bronze Metal Mania powder	0.08,								// Prometheus Bronze Clay	0.1,								// Copper Art	0.2,								// CopprClay	0.15,								// Copper Hadar	0.1,								// Copper quick-fire Hadar	0.17,								// Copper Metal Mania powder	0.15,								// Gold Art	0.11,								// Gold PMC	0.25,								// Platinum	0.09,								// Silver art	0.085, 								// Silver art650	0.1,								// Silver artLite	0.275, 0.135, 0.135,				// PMC1, PMC2, PMC3	0.1,								// Silver Smiths'	0.15,								// Steel Hadar	0.1,								// Steel quick-fire Hadar	0.1,								// Stainless steel Hadar	0.1];								// Stainless steel quick-fire Hadar// unit conversions with "gkUnit..." array indicesvar gaConvert = new Array(new Array(5), new Array(5), new Array(5), new Array(5), new Array(5));// ignore the "Enter" key (for form submit)function ignoreEnterKey(evt) {	var key;     if(window.event)          key = window.event.keyCode;	// IE     else          key = (evt).which;			// Firefox     return (key != 13);}			// ignoreEnterKey()// converts number from one unit to anotherfunction convertByUnit(oldValue, oldUnits, newUnits) {	// conversion rates	var kIn2mm = 25.4;				// OK	var kPlayingCards2mm = 0.28;	// playing cards 0.19-0.34mm 0.25-0.32mm 0.3mm .31mm 0.32mm 0.19-0.28mm 0.25mm 0.01	var kMatBoard2mm = 1.5;			// mat board 1.5mm 0.8mm-3mm 0.050-0.060in 1/16in .052-.060in	var kCraftStick2mm = 2;			// craft sticks 1/16in-1/12in	var newValue = 0;	if (oldUnits == newUnits)		newValue = oldValue;	else		newValue = gaConvert[oldUnits][newUnits] * oldValue;	return newValue;}			// convertByUnit()// fills dropdown list with all clay types (from shrinkage array)function fillDropdownClayTypes(dropdownID) {	var myList = document.getElementById(dropdownID);	if (myList != null)		for (var i = 0; i < gkaoShrink.length; i++)			myList[i] = new Option(gkaoShrink[i].name + " " + gkaoShrink[i].percentStr(), i);}			// fillDropdownClayTypes()// ignore the enter/return keyfunction ignoreSubmit() {	return false;}			// ignoreSubmit()// initialize the conversion array (onLoad)function initializeConversions() {	var kIn2mm = 25.4;				// OK	var kPlayingCards2mm = 0.28;	// playing cards 0.19-0.34mm 0.25-0.32mm 0.3mm .31mm 0.32mm 0.19-0.28mm 0.25mm 0.01	var kMatBoard2mm = 1.5;			// mat board 1.5mm 0.8mm-3mm 0.050-0.060in 1/16in .052-.060in	var kCraftStick2mm = 2;			// craft sticks 1/16in-1/12in	// conversion array uses [old units][new units];	//    will multiply array entry by old size to get new size	gaConvert[gkUnitMillimeters][gkUnitMillimeters] = 1;	gaConvert[gkUnitMillimeters][gkUnitInches] = 1 / kIn2mm;	gaConvert[gkUnitMillimeters][gkUnitPlayingCards] = 1 / kPlayingCards2mm;	gaConvert[gkUnitMillimeters][gkUnitMatBoard] = 1 / kMatBoard2mm;	gaConvert[gkUnitMillimeters][gkUnitCraftSticks] = 1 / kCraftStick2mm;	gaConvert[gkUnitInches][gkUnitMillimeters] = kIn2mm;	gaConvert[gkUnitInches][gkUnitInches] = 1;	gaConvert[gkUnitInches][gkUnitPlayingCards] = kIn2mm / kPlayingCards2mm;	gaConvert[gkUnitInches][gkUnitMatBoard] = kIn2mm / kMatBoard2mm;	gaConvert[gkUnitInches][gkUnitCraftSticks] = kIn2mm / kCraftStick2mm;	gaConvert[gkUnitPlayingCards][gkUnitMillimeters] = kPlayingCards2mm;	gaConvert[gkUnitPlayingCards][gkUnitInches] = kPlayingCards2mm / kIn2mm;	gaConvert[gkUnitPlayingCards][gkUnitPlayingCards] = 1;	gaConvert[gkUnitPlayingCards][gkUnitMatBoard] = kPlayingCards2mm / kMatBoard2mm;	gaConvert[gkUnitPlayingCards][gkUnitCraftSticks] = kPlayingCards2mm / kCraftStick2mm;	gaConvert[gkUnitMatBoard][gkUnitMillimeters] = kMatBoard2mm;	gaConvert[gkUnitMatBoard][gkUnitInches] = kMatBoard2mm / kIn2mm;	gaConvert[gkUnitMatBoard][gkUnitPlayingCards] = kMatBoard2mm / kPlayingCards2mm;	gaConvert[gkUnitMatBoard][gkUnitMatBoard] = 1;	gaConvert[gkUnitMatBoard][gkUnitCraftSticks] = kMatBoard2mm / kCraftStick2mm;	gaConvert[gkUnitCraftSticks][gkUnitMillimeters] = kCraftStick2mm;	gaConvert[gkUnitCraftSticks][gkUnitInches] = kCraftStick2mm / kIn2mm;	gaConvert[gkUnitCraftSticks][gkUnitPlayingCards] = kCraftStick2mm / kPlayingCards2mm;	gaConvert[gkUnitCraftSticks][gkUnitMatBoard] = kCraftStick2mm / kMatBoard2mm;	gaConvert[gkUnitCraftSticks][gkUnitCraftSticks] = 1;}			// initializeConversions()// create array of clay type and shrinkage percentagesfunction makeShrinkageArray() {	var counter = 0;// ### remove gkType... entirely, and just use array index?	// 17-20% BronzClay	gkaoShrink[counter++] = new shrinkageObject(gkTypeBronzeClay, 0.17, 0.20,		"Bronze: BronzClay");	// 25% Hadar (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeBronzeHadarClay, 0.25, 0.25,		"Bronze: Hadar's Clay");	// 10% Hadar Quick Fire (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeBronzeQFHadarClay, 0.10, 0.10,		"Bronze: Quick-fire Hadar's Clay");	// 15-19% Bronze Metal Mania powder	gkaoShrink[counter++] = new shrinkageObject(gkTypeBronzeMetalMania, 0.15, 0.19,		"Bronze: Metal Mania Metal Clay");	// 6-10% Prometheus Bronze Clay	gkaoShrink[counter++] = new shrinkageObject(gkTypeBronzePrometheus, 0.06, 0.10,		"Bronze: Prometheus Clay");	// 10% Copper Art Clay (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeCopperArtClay, 0.10, 0.10,		"Copper: Art Clay");	// 20% CopprClay (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeCopperClay, 0.20, 0.20,		"Copper: CopprClay");	// 15% Copper Hadar's (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeCopperHadarClay, 0.15, 0.15,		"Copper: Hadar's Clay");	// 10% Hadar's Quick-Fire Copper (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeCopperQFHadarClay, 0.10, 0.10,		"Copper: Quick-fire Hadar's Clay");	// 15-19% Copper Metal Mania powder	gkaoShrink[counter++] = new shrinkageObject(gkTypeCopperMetalMania, 0.15, 0.19,		"Copper: Metal Mania Copper Clay");	// 15% (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeGoldArtClay, 0.15, 0.15,		"Gold: Art Clay");	// 11% (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeGoldPMCClay, 0.11, 0.11,		"Gold: PMC");	// 20-30% Platinum	gkaoShrink[counter++] = new shrinkageObject(gkTypePlatinumPMCClay, 0.20, 0.30,		"Platinum: PMC");	// 8-10%	gkaoShrink[counter++] = new shrinkageObject(gkTypeSilverArtClay, 0.08, 0.10,		"Silver: Art Clay Standard and Slow-Dry");	// 8-9%	gkaoShrink[counter++] = new shrinkageObject(gkTypeSilverArtClay650, 0.08, 0.09,		"Silver: Art Clay 650 Low Fire and Slow-Dry");	// 10% (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeSilverArtClayLite, 0.10, 0.10,		"Silver: Art Clay Lite");	// 25-30% PMC Standard	gkaoShrink[counter++] = new shrinkageObject(gkTypeSilverPMC1Clay, 0.25, 0.30,		"Silver: PMC Original");	// 12-15% PMC+	gkaoShrink[counter++] = new shrinkageObject(gkTypeSilverPMC2Clay, 0.12, 0.15,		"Silver: PMC+");	// 12-15% PMC3	gkaoShrink[counter++] = new shrinkageObject(gkTypeSilverPMC3Clay, 0.12, 0.15,		"Silver: PMC3");	// 10% (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeSilverSmithClay, 0.10, 0.10,		"Silver: Silver Smiths' Metal Clay Powder");	// 10-15%	gkaoShrink[counter++] = new shrinkageObject(gkTypeSteelHadarClay, 0.10, 0.15,		"Steel: Hadar's Clay");	// 10% (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeSteelQFHadarClay, 0.10, 0.10,		"Steel: Quick-fire Hadar's Clay");	// 10% Stainless Steel (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeSteelStHadarClay, 0.10, 0.10,		"Stainless Steel: Hadar's Clay");	// 10% Stainless Steel (no range)	gkaoShrink[counter++] = new shrinkageObject(gkTypeSteelStQFHadarClay, 0.10, 0.10,		"Stainless Steel: Quick-fire Hadar's Clay");}			// makeShrinkageArray()// replace string on page, using DOM instead of innerHTMLfunction replaceNodeText(elementID,newString) {//	document.getElementById(theElement).innerHTML = newString;	try {		var currNode = document.getElementById(elementID);		var newNode = document.createTextNode(newString);		while (currNode.firstChild)			currNode.removeChild(currNode.firstChild);		currNode.appendChild(newNode);	}	catch (e) {		// ###		switch(e.name) {			case "DOM_NO_MODIFICATION_ALLOWED_ERR":				// fallthrough			case "DOM_NOT_FOUND":				// fallthrough			case "DOM_HIERARCHY_REQUEST_ERR":				// fallthrough			case "DOM_WRONG_DOCUMENT_ERR":				if (newString.length > 0)					alert(newString);		// didn't work; show the error in a dialog instead				break;			default:				break;		}	}}			// replaceNodeText()// constructor for shrinkage data objectfunction shrinkageObject(id, min, max, name) {	this.id = id;	this.min = min;	this.max = max;	this.avg = (min + max) / 2;	this.name = name;	if (min == max)		this.range = false;		// has no range	else		this.range = true;		// range of values and average}			// constructor shrinkageObject()// calculate shrinkage from clay to final metal (smaller)shrinkageObject.prototype.minShrinkToFired = function (claySize) {	return ( claySize * (1 - this.min) );		// final size}			// shrinkageObject minShrinkToFired()shrinkageObject.prototype.maxShrinkToFired = function (claySize) {	return ( claySize * (1 - this.max) );		// final size}			// shrinkageObject maxShrinkToFired()shrinkageObject.prototype.avgShrinkToFired = function (claySize) {	return ( claySize * (1 - this.avg) );		// final size}			// shrinkageObject avgShrinkToFired()// create range string with average/min/maxshrinkageObject.prototype.rangeStrShrinkToFired = function (claySize) {	var newSize;	if (!this.range) {		// no range, just single value		newSize = this.minShrinkToFired(claySize).toFixed(2);	}	else {		// range string like "10.00 (9.00 - 11.00)"		newSize = this.avgShrinkToFired(claySize).toFixed(2) + " (" +			this.maxShrinkToFired(claySize).toFixed(2) + " - " +			this.minShrinkToFired(claySize).toFixed(2) + ")";	}	return(newSize);}			// shrinkageObject rangeStrShrinkToFired()// calculate shrinkage; from desired final metal size to clay (bigger)shrinkageObject.prototype.minFromClay = function (claySize) {	return ( claySize / (1 - this.min) );		// final size}			// shrinkageObject minFromClay()shrinkageObject.prototype.maxFromClay = function (claySize) {	return ( claySize / (1 - this.max) );		// final size}			// shrinkageObject maxFromClay()shrinkageObject.prototype.avgFromClay = function (claySize) {	return ( claySize / (1 - this.avg) );		// final size}			// shrinkageObject avgFromClay()// create range string with average/min/maxshrinkageObject.prototype.rangeStrFromClay = function (claySize) {	var newSize;	if (!this.range) {		// no range, just single value		newSize = this.minFromClay(claySize).toFixed(2);	}	else {		// range string like "10.00 (9.00 - 11.00)"		newSize = this.avgFromClay(claySize).toFixed(2) + " (" +			this.minFromClay(claySize).toFixed(2) + " - " +			this.maxFromClay(claySize).toFixed(2) + ")";	}	return(newSize);}			// shrinkageObject rangeStrFromClay()shrinkageObject.prototype.percentStr = function () {	var myStr;	if (!this.range) {		// no range, just single value		myStr = "(" + (100 * this.min) + "%)";	}	else {		// range string like "10% (9-11%)"		myStr = "(" + (100 * this.min) + "% - " + (100 * this.max) + "%)";	}	return(myStr);}			// shrinkageObject percentStr()// validate that this is a number (positive)// returns number as float, or -1 if not number// sets the string element if number validation fails (such as "Enter a number")function validatePosNumber(value, valStringID, valString) {	if ( (isNaN(value)) || (parseFloat(value) < 0) ) {		if (valStringID)			replaceNodeText(valStringID,valString);		value = -1;	}	else {		if (valStringID)			replaceNodeText(valStringID,"");		value = parseFloat(value);	}	return(value);}			// validatePosNumber()
