		//--------------------------------------------------------------------//
		//----------------------- Utilities (Start) ----------------------------//
		//--------------------------------------------------------------------//

		var BROWSER_OK=document.getElementById;
		function getObject(objName){
			var theObj;
			if(BROWSER_OK) {
				theObj=document.getElementById(objName);
			}	
       		return theObj;
		}

		function winPop(url,n,wid,height,scroll,toolbar,menubar) {
			var strOpt = '';
			strOpt = "height=" + height + ",width=" + wid + ",location=no";
			if (scroll==1) strOpt += ',scrollbars=yes';
			else strOpt += ',scrollbars=no';
			if (toolbar==1) strOpt += ',toolbar=yes';
			else strOpt += ',toolbar=no';
			if (menubar==1) strOpt += ',menubar=yes';
			else strOpt += ',menubar=no';
			var w = window.open(url,n,strOpt);
			if(w)w.focus();
			else alert("Our system has detected that your popup blocker\nis preventing you from viewing the item you clicked on!");
		}

		
		function cloneObject(obj) {
			for (i in obj) {
				if (typeof obj[i] == 'object') {
					this[i] = new cloneObject(obj[i]);
				}
				else
					this[i] = obj[i];
			}
		}	
			
			
		function screenInnerWidth() {
			return getCorrectVals (
				window.innerWidth ? window.innerWidth : 0,
				document.documentElement ? document.documentElement.clientWidth : 0,
				document.body ? document.body.clientWidth : 0
			);
		}
		function screenInnerHeight() {
			return getCorrectVals (
				window.innerHeight ? window.innerHeight : 0,
				document.documentElement ? document.documentElement.clientHeight : 0,
				document.body ? document.body.clientHeight : 0
			);
		}

		function getCorrectVals(n_win, n_docel, n_body) {
			var n_result = n_win ? n_win : 0;
			if (n_docel && (!n_result || (n_result > n_docel)))
				n_result = n_docel;
			return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
		}


					
		function createCopy (obj) {
			if(obj){
				var returnObj = new Object();
				if (typeof(obj) == 'object') {
					if (typeof(obj.length) != 'undefined')
						var returnObj = new Array();
					for (var objInd in obj) {
						if (typeof(obj[objInd]) == 'object') {
							returnObj[objInd] = createCopy(obj[objInd]);
						} else if (typeof(obj[objInd]) == 'string') {
							returnObj[objInd] = obj[objInd];
						} else if (typeof(obj[objInd]) == 'number') {
							returnObj[objInd] = obj[objInd];
						} else if (typeof(obj[objInd]) == 'boolean') {
							((obj[objInd] == true) ? returnObj[objInd] = true : returnObj[objInd] = false);
						}
					}
				}
				return returnObj;
			}
		}			
			
		function replaceAll(str,r0,r1){
       		return unescape(escape(str).replace(new RegExp(escape(r0),"g"),escape(r1)));
		}	
		

		function isNumeric(sText){
			if(!sText||sText==""||sText=="true"||sText=="false"){
				if(sText!="0")return false;
			}
			var validChars = "0123456789.";
			var isNumber=true;
			var theChar;		 
			for (i = 0; i<sText.length; i++){ 
				theChar = sText.charAt(i); 
				if (validChars.indexOf(theChar) == -1){
					// Check for negative numbers
					if(i==0&&sText.length>1&&theChar=='-'){
						sNumber = true;
					}else{
						return false;
					}
				}
			}
			return isNumber;		   
		}

		function makeNullEmptyStr(valStr){
		if(!valStr) return "";
			else return valStr;
		}
		
		function makeNullOnlyEmptyStr(valStr){
		if(valStr == null) return "";
			else return valStr;
		}
		
		function isColor(obj,colorType){
			if(obj&&(obj.Id!=null)) return true;
			else if (findColor(obj,colorType)) return true;
			else return false;
		}


		function convertInches(x2,x3){if(!x3)x3=16;var x4=16;var ip,fn,fd,x5;var test=(x2-Math.floor(x2))%(1/x4);if(test!=0){x2=x2-test;}if(parseInt(x2)==parseFloat(x2)){return x2;}ip=parseInt(x2);if(!ip)ip=0;if(ip==0)fn=parseInt(x2*x3);else fn=parseInt((x2-parseInt(x2))*x3);fd=x3;var x6;x5=gcf(fn,fd);fn=fn/x5;fd=fd/x5;x6=fn+"/"+fd;if(fn==0){return ip;}else{if(ip!=0){return ip+" "+x6;}else{return x6;}}};;
		function validateInches(x2,x3,x4,x5,x6,silentMode,minSizeHint,maxSizeHint){if(x2.type!='text')return true;var x7=16;if(x5)x7=x5;var y2=Number(x2.name.substring(11,x2.name.length));var i;var y3=/^\s*(\d+(\.\d+)?)\s*((\d+)\/(\d+))?\s*$/i;var y4=x2.value.match(y3);if(!y4){if(!silentMode){alert("You must enter a number for this value.");}if(x3){x2.value=x3;}else{x2.value=1;}x2.focus();return false;}var y5=Number(y4[1]);var y6=y4[4];var y7=y4[5];y6=(y6&&y6.length>0)?Number(y6):0;y7=(y7 && y7.length>0)?Number(y7):1;var y8=y5+y6/y7;if ((((y8 - parseInt(y8))*100000)%((1/x7)*100000))!=0){y8=Math.round(y8*4)/4;}if((y8>x4)||(y8<x3)){
			if(!silentMode){
				if(x6){
					alert(x6+" must be between " + x3 + " and " + x4);
				}else{
					var msgExtra = "";
					if(x3>y8&&minSizeHint){
						msgExtra = "\n"+minSizeHint;
					}
					if(x4<y8&&maxSizeHint){
						msgExtra += "\n"+ maxSizeHint;
					}
					if(msgExtra!="") msgExtra = "\n\nHint:" + msgExtra;
					if(x3==x4) alert("This section must be " + x3 + " inches."+msgExtra);
					else alert("This section must be between " + x3 + " and " + x4 + " inches."+msgExtra);
				}
			}
			x2.focus();if(y8>x4){y8=x4;}if(y8<x3){y8=x3;}x2.value=y8;return false;}x2.value=y8;return true;}
		
		
		function gcf(n1,n2){var cn,cd,nn;if(parseFloat(n1)>parseFloat(n2)){cn=parseFloat(n1);cd=parseFloat(n2);}else{cn=parseFloat(n2);cd=parseFloat(n1);}do{nn=cd;cd=cn%cd;cn=nn;}while(cd!=0)return cn;};    
		
		
		function getFractDecimalVal(x2,x3){
			if(!x3)x3=16;
			var x4=16;var ip,fn,fd,x5;
			var test=(x2-Math.floor(x2))%(1/x4);
			if(test!=0){x2=x2-test;}
			if(parseInt(x2)==parseFloat(x2)){return x2;}
			ip=parseInt(x2);
			if(!ip)ip=0;if(ip==0)fn=parseInt(x2*x3);else fn=parseInt((x2-parseInt(x2))*x3);fd=x3;
			var x6;x5=gcf(fn,fd);fn=fn/x5;fd=fd/x5;x6=fn+"/"+fd;
			if(fn==0){return ip;}else{
				if(ip!=0){
					return ip+(fn/fd);
				}else{
					return fn/fd;
				}
			}
		}


		function roundToNearestQuarter(theNym, divNum){
			if(theNum&&divNum&&divNum>0){
				
			}
		}
		
		function tokenize(s,t){
			if(s&&s!=""){
				var arr = s.split(t);
				if (!arr) return arr;
				var x = (arr.length-1);
				if (arr[x].length==0) arr.length=x;
				return arr;
			}
			return false;
		}
		
		function getTokenValue(str,token,seperator){
			var tokenVal = "";
			if(str&&str!=""){
				if(str.indexOf(token)==-1){
					return "";
				}
				var index = str.indexOf(seperator+token);
				if(index!=-1){
					index += seperator.length;
				}else{
					index = str.indexOf(token);
					if(index!=0) return "";
				}
				
				tokenVal= str.substring(index+token.length);
				if(tokenVal.indexOf(seperator)!=-1){
					tokenVal = tokenVal.substring(0,tokenVal.indexOf(seperator));
				}
			}
			return tokenVal;			
		}
		
		// setValueFromToken : Sets a value based on the token value
		function setValueFromToken(str,token,seperator,forceType, defaultValue){
			var tokenVal = getTokenValue(str,token,seperator)+"";
			if(tokenVal&&tokenVal!=""){
				// Check for number
				if(isNumeric(tokenVal)){
					return tokenVal*1;
				} 
				
				
				// Check for script
				//if(tokenVal.indexOf(";")!=-1&&tokenVal.indexOf("=")!=-1){
				//	return eval(tokenVal);
				//}
			}
			if(forceType){
			if(forceType==TYPE_NUMBER&&tokenVal.toLowerCase()!="i"){
					if(!isNumeric(tokenVal)){
						if(defaultValue) tokenVal = defaultValue;
						else tokenVal = 0;
					}
				}
			}
			return tokenVal;
		}
		

        function roundIt(X) {
        	if (X==0) return "0.00";
        	with (new Object(Math.round(100*X)+''))
           { return substring(0,length-2)+'.'+substring(length-2,length) } }
	
	
		function convertToUSCurrency(num){
			if(!num)
				num = 0;
			num = num.toString().replace(/\$|\,/g,'');
			if(isNaN(num))num="0";
			sign=(num==(num=Math.abs(num)));
			num=Math.floor(num*100+0.50000000001);
			cents=num%100;num=Math.floor(num/100).toString();
			if(cents<10)cents="0"+cents;
			for(var i=0;i<Math.floor((num.length-(1+i))/3);i++){
				num=num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
			}
			return (((sign)?'':'-')+'$'+num+'.'+cents);
		}		
		
		function getPNGImgStr(img, width, height, script){
			var str="";
			var supported = BROWSER_OK && navigator.platform == "Win32";
			if(supported)str="<img border=0 class=\"noPrint\" src=\"images/t.gif\" style=\"width: "+width+"px; height: "+height+"px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+img+"', sizingMethod='scale')\"";
			else{str="<img src='"+img+"' width="+width+" height="+height+" ";}
			if(script)str+=" "+script;
			str+=">";
			return str;
		}		
				
		function writeToLyr(objName,data){
			var theObj = getObject(objName);
			if (theObj&&(BROWSER_OK)) {
        			theObj.innerHTML = data;
			}
		}

		function writeToLyrDir(theObj,data){
			if (BROWSER_OK) {
        		theObj.innerHTML = data;
			}
		}

		function getLayerHeight(layerObj){
			if(layerObj) return parseInt(layerObj.style.height);
			return 0;
		}				


		function getLayerWidth(layerObj){
			if(layerObj) return parseInt(layerObj.style.width);
			return 0;
		}				

				
		function getNewLayerID(){
			LAYER_COUNTER++;
			var lyrChk = getObject("Lyr_"+LAYER_COUNTER);
			while (lyrChk){
				LAYER_COUNTER++;
				lyrChk = getObject("Lyr_"+LAYER_COUNTER);
			}
			return "Lyr_"+LAYER_COUNTER;
		}
		    	
		function createNewLyr(id,left,top,width,height,zindex,renderStr,parentObject,script){
			if(!id||id=="") id=getNewLayerID();
			var layer = getObject(id);
			var newLayer = false;
			if(!layer){
				layer = document.createElement('DIV');
				layer.id=id; 
				newLayer = true;
			}
			if(newLayer){
				layer.style.position = 'absolute';
			}
			layer.style.left = left+'px';
			layer.style.top = top+'px';
			layer.style.width = width+'px'; 
			layer.style.height = height+'px';
			layer.style.zIndex=zindex;
			if(newLayer){
				if(parentObject){
					parentObject.appendChild(layer);		
				}else{
					document.body.appendChild(layer);
				}
			}
			if(script&&script!=""){
				renderStr = "<div "+script+" >"+renderStr+"</div>";
				//alert(renderStr);
			}
			writeToLyrDir(layer,renderStr);
			if(!newLayer)showLayerDir(layer);
			return layer;	
		}		
		
		
		function deleteLayer(id) {
			var lyr=getObject(id);
			deleteLayerDir(lyr);
		}		

		function deleteLayerDir(lyr){
			if (lyr){
				// Do not Delete the main layer
				if(MAIN_LAYER&&lyr==MAIN_LAYER) return false;
				if (BROWSER_OK) {
					try{
						if(lyr.parentNode){
							lyr.parentNode.removeChild(lyr);
						}else{
							document.body.removeChild(lyr);
						}
					}catch(err){
					}
        			lyr=null;
				}
			}
		}

		function hideLayerDir(theLyr){
			if (theLyr&&BROWSER_OK) theLyr.style.visibility="hidden";
		}

		function showLayerDir(theLyr){
			if (theLyr&&BROWSER_OK) theLyr.style.visibility="visible";
		}
		
		
		function hideLayer(lyr){
			var theLyr=getObject(lyr);
			hideLayerDir(theLyr);
		}

		function showLayer(lyr){
			var theLyr=getObject(lyr);
			showLayerDir(theLyr);
		}


		function objExistsInArray(obj,arr){
			var found=-1;
			for(var i=0;i<arr.length;i++){
			if (obj==arr[i]){
					found=i;break;
				}
			}
			return found;
		}
		function objIdExistsInArray(obj,arr){
			var found=-1;
			for(var i=0;i<arr.length;i++){
				if (obj.Id==arr[i].Id){
					found=i;
					break;
				}
			}
			return found;
		}

		function addToArray(obj,arr){
			if (objExistsInArray(obj,arr)==-1){
				arr[arr.length]=obj;
			}
			return arr;
		}

		function addToArrayAt(pos,obj,arr){
			if (objExistsInArray(obj,arr)==-1){
				arr.splice(pos,0,obj);
			}
			return arr;
		}

		function removeFromArray(obj,arr){
			var j=objExistsInArray(obj,arr);
			if(j!=-1){
				arr.splice(j,1);
				obj=null;
			}
			return arr;
		}
		function removeIdFromArray(obj,arr){
			var j=objIdExistsInArray(obj,arr);
			alert("J=" + j);
			if(j!=-1){
				arr.splice(j,1);
				alert("nulling the array");
				obj=null;
			}
			return arr;
		}
		function removeFromArrayAt(pos,arr){
			arr.splice(pos,1);
			return arr;
		}


		function concatArrays(arr1,arr2){
			var concatArray = new Array();
			if(arr1){
				for(var i=0;i<arr1.length;i++){
					concatArray[concatArray.length] = arr1[i];
				}
			}
			if(arr2){
				for(var i=0;i<arr2.length;i++){
					concatArray[concatArray.length] = arr2[i];
				}
			}
			return concatArray;
		}
		
		function findColor(id,type)
		{
			var arrLength=ColorArray.length;
			for(var i=0;i<arrLength;i++)
			{
				var color = ColorArray[i];
				//alert("color.Id =" + color.Id + " color type = " + color.Type);
				if(id==color.Id&&type==color.Type)
				{
					return color.Copy();
				}
			}
			return false;
		}
			
			
				
		function findItem(id)
		{
			if(!ItemArray)
				return;
			var arrLength=ItemArray.length;
			for(var i=0;i<arrLength;i++){
		
				var item = ItemArray[i];
				if(id==item.Id){
					return item.Copy();
				}
			}
			return false;
		}
		
		function findStratItem(id)
		{
			if(!StratItemsArray)
				return;
			var arrLength=StratItemsArray.length;
			for(var i=0;i<arrLength;i++){
				var item = StratItemsArray[i];
				if(id==item.Id){
					return item.Copy();
				}
			}
			return false;
		}
		function findPart(id){
		try
		{
			var arrLength=PartArray.length;
			for(var i=0;i<arrLength;i++){
				var part = PartArray[i];
				if(id==part.Id){
					return part.Copy();
				}
			}
			return false;
			}
			catch(err)
			{
			 alert("Error in FindPart part id = "  + id + " Error: " + err.Description)
			}
		}


		function findAccessory(id){
			var arrLength=AccessoryArray.length;
			for(var i=0;i<arrLength;i++){
				var accessory = AccessoryArray[i];
				if(id==accessory.Id){
					return accessory.Copy();
				}
			}
			return false;
		}


		function findSectionByID(wallID, sectionPosition, sectionsArray){
			for(var i=0;i<sectionsArray.length;i++){
				var section = sectionsArray[i];
				if(section.ParentWall){
					if(section.Position==sectionPosition&&section.ParentWall.Id==wallID){
						return section;
					}
				}
			}
			return null;
		}


		function findObjectByLayer(layerObject, ObjectsArray){
			for(var i=0;i<ObjectsArray.length;i++){
				if(ObjectsArray[i].DisplayLayer==layerObject){
					return ObjectsArray[i];
				}
			}
			return null;
		}
		

		function findObjectInArray(obj, ObjectsArray){
			for(var i=0;i<ObjectsArray.length;i++){
				if(ObjectsArray[i]==obj){
					return ObjectsArray[i];
				}
			}
			return null;
		}


		function findPosX(obj){
			var x = 0;
			if(obj.offsetParent){
				while(true){
					x += obj.offsetLeft;
					if(!obj.offsetParent){
						break;
					}
					obj = obj.offsetParent;
				}
			}else if(obj.x){
				x += obj.x;
			}
			return x;
		}

		function findPosY(obj){
			var y = 0;
			if(obj.offsetParent){
				while(true){
					y += obj.offsetTop;
					if(!obj.offsetParent){
						break;
					}
					obj = obj.offsetParent;
				}
			}else if(obj.y){
				y += obj.y;
			}
			return y;
		}


		function getCorrectVertHeight(height,getGreaterOrEqNum){
			var theVertArr=VERTICAL_HEIGHT_ARRAY;
			var maxVertVal=theVertArr[theVertArr.length-1];
			if(height>maxVertVal) return maxVertVal;
			
			for(var i=1;i<theVertArr.length;i++){
				if (eval(height)<eval(theVertArr[i])){
					if(!getGreaterOrEqNum||eval(height)==eval(theVertArr[i-1])){
						var diff1=Math.abs(height-theVertArr[i-1]);
						var diff2=Math.abs(theVertArr[i]-height);
						if(diff1<diff2){ 
							height=theVertArr[i-1];
						}else height=theVertArr[i];
					}else{ 
						height=theVertArr[i];
					}
					break;
				}
			}
			return height;
		}

		//-- Used for add remove --//
		
		function getAvailableParts(){
			return PartArray;
		}
		
		function getPartCategories(partsArray){
			var catArray = new Array();
			if(partsArray){
				partsArray.sort(partCategorySort);
				var category="";
				for(var i=0;i<partsArray.length;i++){
					var part = partsArray[i];
					//if(category!=part.Category||i==(partsArray.length-1))
					if(category!=part.Category)
					{
						category = part.Category+"";
						catArray[catArray.length] = category;
					}
				}
			}
			return catArray
		}


		function getItemCategories(itemsArray){
			var catArray = new Array();
			if(itemsArray){
				itemsArray.sort(partCategorySort);
				var category="";
				for(var i=0;i<itemsArray.length;i++){
					var part = itemsArray[i];
					if(category!=itemsArray.Category||i==(itemsArray.length-1)){
						category = itemsArray.Category+"";
						catArray[catArray.length] = category;
					}
				}
			}
			return catArray
		}
		
		function getCategoryParts(category){
			var catPartsArray = new Array();
			var partsArray = getAvailableParts();
			if(partsArray){
				for(var i=0;i<partsArray.length;i++){
					var part = partsArray[i];
					if(category==part.Category){
						catPartsArray[catPartsArray.length] = part;
					}
				}
			}
			return catPartsArray;
		}
		
		function getCategoryItems(category)
		{
			var catItemsArray = new Array();
			var itemsArray
			//if(category !="Garages")
				itemsArray = getAvailableItems();
			//else
			//	itemsArray = getAvailabeGarageItems();
			
			if(itemsArray)
			{
				for(var i=0;i<itemsArray.length;i++){
				
					var item = itemsArray[i];
				
					if(category==item.Category && category !="Garages"){
						catItemsArray[catItemsArray.length] = item;
					}
				}
			}
			else
			{
			// get garage items from the new table
			
			}
			return catItemsArray;
		}

		// value range string format : min|max|stdVal1|stdVal2.....|C
		function getValueRange(valueRangeString,isColor){
			var valueRangeArray = new Array();
			valueRangeString = valueRangeString+"";
			if(valueRangeString&&valueRangeString!=""){
				if (valueRangeString.indexOf("|")!=-1){
					valueRangeArray = tokenize(valueRangeString,"|");
					if(valueRangeArray.length<1&&!isColor){
						return new Array();	
					}
				}else if (isNumeric(valueRangeString)&&isColor){
					valueRangeArray[0] = valueRangeString;
				}
			}
			return valueRangeArray;
		}

		//------------------------------//
		
		function makeAStringVariableNameCompatible(str){
			str = str.replace("-","");
			str = str.replace(".","");
			str = str.replace("(","");
			str = str.replace(")","");
			str = replaceAll(str," ","");
			str = replaceAll(str,"\"","");
			return str;
		}
		
		
		function debug(txt){
			if(!txt)txt="";
			writeToLyr("debug",txt);
		}

		function showProgressBox(){
			var functionCallStr = "";
			for(var i=0; i<showProgressBox.arguments.length;i++){
				var arg = ""+showProgressBox.arguments[i]+"";
				if(i==0)functionCallStr = arg+"(";
				else if(i>0){ 
					if(isNumeric(arg)){
						functionCallStr += ""+arg+"";
					}else{ 
						functionCallStr += "'"+arg+"'";
					}
					if(i<(showProgressBox.arguments.length-1)){
						functionCallStr += ",";
					}
				}
			}
			//if(msg){
				writeToLyr("progressLayerMsg","Rendering...");
			//}
			showLayer("progressLayer");
			if(functionCallStr!=""){
				functionCallStr += ");hideProgressBox();";
				//alert(functionCallStr);
				var t=setTimeout(functionCallStr,1);
			}
		}


		//function doShowProgressBox(msg){
		//	if(msg){
		//		writeToLyr("progressLayerMsg",msg);
		//	}
		//	showLayer("progressLayer");
		//}
		
		function hideProgressBox()
		{
			hideLayer("progressLayer");
		}		
		
		
		function knobStyleObj (name, hw, parts, ktw, kth, img, kt)
		{
			this.name = name; 
			this.hw = hw; 
			this.parts = parts;	
			this.ktw = ktw;	
			this.kth = kth;	
			this.img = img;	
			this.kt = kt;
		}

 	function getObject(id) 
	{
	        if (document.layers) 
		        return document[id]
	        else if (document.all)
		        return document.all[id]
	        else if(document.getElementById)
		        return document.getElementById(id)
	        else return null
        }  
		
		//--------------------------------------------------------------------//
		//----------------------- Utilities (End) ----------------------------//
		//--------------------------------------------------------------------//
