var mBuilder = new MatboardBuilder();
var prod = new Product();
var indicatorImg = '<img src=\''+Env.IMG_INDICATOR+'\'/>';

FullSheets = {

	onProductChange : function(layer, prodId, prodName, params) {
		Precuts.setPrice(params.price);
	},
	setPrice : function (price) {
		Precuts.price = price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('price').value = price;
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	}, 
	setQuantity : function () {
		var price = Precuts.price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	},
	price : 0

};

WoodMoulding = {
	onProductChange : function(layer, prodId, prodName, params) {
		$("divLayer"+layer+"Label").getElementsByTagName("DIV")[1].innerHTML="Category: "+params.priceCat;
		$("divLayer"+layer+"Label2").innerHTML="Product: "+params.sku;
	}
}

Supplies = {
	onProductChange : function(layer, prodId, prodName, params) {
		Supplies.setPrice(params.price);
	},
	setPrice : function (price) {
		Supplies.price = price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('price').value = price;
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	}, 
	setQuantity : function () {
		var price = Supplies.price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	},
	price : 0
}

Bags = {
	onProductChange : function(layer, prodId, prodName, params) {
		Bags.setPrice(params.price);
	},
	setPrice : function (price) {
		Bags.price = price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('price').value = price;
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	}, 
	setQuantity : function () {
		var price = Bags.price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	},
	price : 0
}

Precuts = {
	onProductChange : function(layer, prodId, prodName, params) {
		Precuts.setPrice(params.price);
	},
	setPrice : function (price) {
		Precuts.price = price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('price').value = price;
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	}, 
	setQuantity : function () {
		var price = Precuts.price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	},
	price : 0
}

ReadyMadeFrames = {
	onProductChange : function(layer, prodId, prodName, params) {
		ReadyMadeFrames.setPrice(params.price);
	},
	setPrice : function (price) {
		ReadyMadeFrames.price = price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('price').value = price;
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	}, 
	setQuantity : function () {
		var price = ReadyMadeFrames.price;
		$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
		if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
			$('txtQuantity').value = 1;
		}
		var tot = parseFloat(price * $('txtQuantity').value).toFixed(2);
		
		$('divPrice').innerHTML='<div>Unit Price: $'+price+'</div>'
	      + '<div>Total Price: $'+tot+'</div>';

	},
	price : 0
}

Matboards = {
	minDimensions : {
		WIDTH : 4,
		HEIGHT : 4
	},
	maxDimensions : {
		WIDTH : 32,
		HEIGHT : 40
	}
};

Mountingboards = {
	minDimensions : {
		WIDTH : 4,
		HEIGHT : 4
	},
	maxDimensions : {
		WIDTH : 32,
		HEIGHT : 40
	}
};

function MatboardBuilder() {

	this.nr=function (value, defaultValue) {
		value=parseFloat(value);
		return (isNaN(value)||value==""||typeof value=="undefined"?defaultValue:value);
	}

	this.setLayers=function (nr) {
		for (var i=0; i<3; i++) {
			$("tab"+i).hide();
			$("divLayer"+i+"Label").hide();
		}
		for (var i=0; i<Math.min(1,nr); i++) {
			$("tab"+i).show();
			$("divLayer"+i+"Label").show();
		}
		this.selectLayer(0);
		for (var i=1; i<nr; i++) {
			//new Effect.Pulsate($("tab"+i));
			$("tab"+i).show();
			$("divLayer"+i+"Label").show();
		}
		prod.preview();
	}

	this.selectLayer=function (idx) {
		for (var i=0; i<3; i++) {
			$("tab"+i).className="";
			$("layer"+i).hide();
		}
		$("tab"+idx).className="active";
		$("layer"+idx).show();
		$("current_layer").value = idx;
	}

	this.setBlankMat=function (isBlank) {
		if (isBlank) {
			$('divLayerSelector').hide();
			$('divMultiLayerOptions').hide();
			this.setLayers(1);
		}else {
			$('divLayerSelector').show();
			$('divMultiLayerOptions').show();
		}
		prod.preview();
	}

	this.setWeightedWindow=function (isWeighted) {
		if (isWeighted) {
			$('divWeightedWindowSelector').show();
		}else {
			$('divWeightedWindowSelector').hide();
		}
		prod.preview();
	}

	this.getOutsideDims=function () {
		var outside={
			width:this.nr($("MatboardSelOutsideDimensionsWidthInt").value,0),
			height:this.nr($("MatboardSelOutsideDimensionsHeightInt").value,0),
			widthDec:this.nr($("MatboardSelOutsideDimensionsWidthFloat").value,0),
			heightDec:this.nr($("MatboardSelOutsideDimensionsHeightFloat").value,0)
		};
		return outside;
	}

	this.getOpeningDims=function () {
		var opening={
			width:this.nr($("MatboardSelOpeningDimensionsWidthInt").value,0),
			height:this.nr($("MatboardSelOpeningDimensionsHeightInt").value,0),
			widthDec:this.nr($("MatboardSelOpeningDimensionsWidthFloat").value,0),
			heightDec:this.nr($("MatboardSelOpeningDimensionsHeightFloat").value,0)
		};
		return opening;
	}
	this.setWeight=function (type){
		//The bottom weight can be determined from the top weight by the following: [outside dimensions height] - [opening dimensions height] � [top weight].
		var outside=this.getOutsideDims();
		var opening=this.getOpeningDims();


		if (type=='top') {
			var top=this.nr($('MatboardSelTopWeightInt').value,0) + this.nr($('MatboardSelTopWeightFloat').value,0);
			var bottom=(outside.height+outside.heightDec) - (opening.height+opening.heightDec+top);
			$('MatboardSelBottomWeightInt').value=Math.floor(bottom);
//alert('here' + $('MatboardSelBottomWeightFloat').value);
			for (var i=0; i<$('MatboardSelBottomWeightFloat').options.length; i++) {
				if ($('MatboardSelBottomWeightFloat').options[i].value==bottom-Math.floor(bottom)) {
					$('MatboardSelBottomWeightFloat').selectedIndex=i;
				}
			}
			if ($('MatboardSelBottomWeightInt').value < 0 || ($('MatboardSelBottomWeightInt').value == 0 && (parseFloat($('MatboardSelBottomWeightFloat').value) < .5 || !$('MatboardSelBottomWeightFloat').value))) {
			    alert('Please check your dimensions, with the weight chosen the window will not fit.');
			}
		} else {
			var bottom=this.nr($('MatboardSelBottomWeightInt').value,0) + this.nr($('MatboardSelBottomWeightFloat').value,0);
			var top=(outside.height+outside.heightDec) - (opening.height+opening.heightDec+bottom);
			$('MatboardSelTopWeightInt').value=Math.floor(top);
			for (var i=0; i<$('MatboardSelTopWeightFloat').options.length; i++) {
				if ($('MatboardSelTopWeightFloat').options[i].value==top-Math.floor(top)) {
					$('MatboardSelTopWeightFloat').selectedIndex=i;
				}
			}
			if ($('MatboardSelTopWeightInt').value < 0 || ($('MatboardSelTopWeightInt').value == 0 && (parseFloat($('MatboardSelTopWeightFloat').value) < .5 || !$('MatboardSelTopWeightFloat').value))) {
			    alert('Please check your dimensions, with the weight chosen the window will not fit.');
			}
		}
		prod.preview();
	}
	this.setSetBack=function (sel, layer) {
		$("divLayer"+layer+"Label-setback").innerHTML="<span class='product_selection'>Set back:</span> "+sel.options[sel.selectedIndex].text;
	}
}

var Validation = {
	matboard : function (prod) {
		var msgs = [];
		var outside=mBuilder.getOutsideDims();
		var opening=mBuilder.getOpeningDims();


		if (outside.width=="") {
			msgs[msgs.length] = "Please set the width for the outside dimension.";
		}
		if (outside.height=="") {
			msgs[msgs.length] = "Please set the height for the outside dimension.";
		}

		if (outside.width!="" && outside.height!="") {

			var w=Math.min(outside.width+outside.widthDec, outside.height+outside.heightDec);
			var h=Math.max(outside.width+outside.widthDec, outside.height+outside.heightDec);
			if (w < Matboards.minDimensions.WIDTH || h < Matboards.minDimensions.HEIGHT) {
				msgs[msgs.length] = "The outside dimension needs to be at least "+Matboards.minDimensions.WIDTH+" x "+Matboards.minDimensions.HEIGHT+" . Please call customer service if you need a smaller size.";
			} else if (w > Matboards.maxDimensions.WIDTH || h > Matboards.maxDimensions.HEIGHT) {
				msgs[msgs.length] = "The outside dimension cannot be larger than "+Matboards.maxDimensions.WIDTH+" x "+Matboards.maxDimensions.HEIGHT+".";
			}
		}

		var layers=document.getElementById("MatboardSelNumberLayers").value;
		var layerNames = ['Top', 'Bottom', 'Middle'];
		var firstWrongLayer = -1;
		for (var i=0; i<layers; i++) {
			if ($("product_id"+i).value=="") {
				msgs[msgs.length] = "Please select a product for the "+layerNames[i]+" layer.";
				firstWrongLayer=(firstWrongLayer==-1?i:firstWrongLayer);
			}
			if ($("selColorCode"+i).value=="") {
				msgs[msgs.length] = "Please select a color for the "+layerNames[i]+" layer.";
				firstWrongLayer=(firstWrongLayer==-1?i:firstWrongLayer);
			}
			if (opening.width != "" && !isNaN(opening.width)
				&& opening.height != "" && !isNaN(opening.height)) {
				var setBack=mBuilder.nr($('MatboardLayer'+i+'SelSetback').value,0);
				if (opening.width + opening.widthDec + setBack > outside.width + outside.widthDec
					|| opening.height + opening.heightDec + setBack > outside.height + outside.heightDec) {
					msgs[msgs.length] = "The opening dimension must be larger than the outside dimension in the "+layerNames[i]+" layer.";
					firstWrongLayer=(firstWrongLayer==-1?i:firstWrongLayer);
				}
			}
		}

		if (msgs.length==0) {
			return true;
		}
		if (firstWrongLayer>-1) {
			mBuilder.selectLayer(firstWrongLayer);
			new Effect.Highlight($('layer'+firstWrongLayer));
		}
		alert("Please verify the following:\n- "+msgs.join("\n- "));
		return false;
	},
	full_sheets : function (prod) {
		var msgs = [];

		var layers=1;
		var layerNames = ['Top', 'Bottom', 'Middle'];
		var firstWrongLayer = -1;
		for (var i=0; i<layers; i++) {
			if ($("product_id"+i).value=="") {
				msgs[msgs.length] = "Please select a product.";
				firstWrongLayer=(firstWrongLayer==-1?i:firstWrongLayer);
			}
			if ($("selColorCode"+i).value=="") {
				msgs[msgs.length] = "Please select a color.";
				firstWrongLayer=(firstWrongLayer==-1?i:firstWrongLayer);
			}
		}

		if (msgs.length==0) {
			return true;
		}
		if (firstWrongLayer>-1) {
			mBuilder.selectLayer(firstWrongLayer);
			new Effect.Highlight($('layer'+firstWrongLayer));
		}
		alert("Please verify the following:\n- "+msgs.join("\n- "));
		return false;
	},
	mounting_board : function (prod) {
		var msgs = [];
		var outside={
			width:this.nr($("MountingBoardSelOutsideDimensionsWidthInt").value,0),
			height:this.nr($("MountingBoardSelOutsideDimensionsHeightInt").value,0),
			widthDec:this.nr($("MountingBoardSelOutsideDimensionsWidthFloat").value,0),
			heightDec:this.nr($("MountingBoardSelOutsideDimensionsHeightFloat").value,0)
		};
		
		if ($("product_id").value=="") {
			msgs[msgs.length] = "Please select a product.";
		}
		if (!Validation.sanitize($('MountingBoardSelOutsideDimensionsWidthInt').value)) {
			msgs[msgs.length] = "Please set the width for the outside dimension.";
		}
		if (!Validation.sanitize($('MountingBoardSelOutsideDimensionsHeightInt').value)) {
			msgs[msgs.length] = "Please set the height for the outside dimension.";
		}
// added 7/2011
		if (outside.width!="" && outside.height!="") {

			var w=Math.min(outside.width+outside.widthDec, outside.height+outside.heightDec);
			var h=Math.max(outside.width+outside.widthDec, outside.height+outside.heightDec);
//			alert ((outside.width+outside.widthDec) +" by " + (outside.height+outside.heightDec)) ;
			if (w < Mountingboards.minDimensions.WIDTH || h < Mountingboards.minDimensions.HEIGHT) {
				msgs[msgs.length] = "The outside dimension needs to be at least "+Mountingboards.minDimensions.WIDTH+" x "+Mountingboards.minDimensions.HEIGHT+" . Please call customer service if you need a smaller size.";
			} else if (w > Mountingboards.maxDimensions.WIDTH || h > Mountingboards.maxDimensions.HEIGHT) {
				msgs[msgs.length] = "The outside dimension cannot be larger than "+Mountingboards.maxDimensions.WIDTH+" x "+Mountingboards.maxDimensions.HEIGHT+".";
			}
		}
///////////
		if (msgs.length==0) {
			return true;
		}
		alert("Please verify the following:\n- "+msgs.join("\n- "));
		return false;
	},
	full_mounting_board : function (prod) {
		var msgs = [];
		if (msgs.length==0) {
			return true;
		}
		alert("Please verify the following:\n- "+msgs.join("\n- "));
		return false;
	},
	wood_moulding : function (prod) {
		var msgs = [];
		if ($("product_id").value=="") {
			msgs[msgs.length] = "Please select a product.";
		}
		if (!Validation.sanitize($("WoodMouldingSelOutsideDimensionsWidthInt").value) ||
			(!Validation.sanitize($("WoodMouldingSelOutsideDimensionsWidthFloat").value) && '' != $("WoodMouldingSelOutsideDimensionsWidthFloat").value) ||
			!Validation.sanitize($("WoodMouldingSelOutsideDimensionsHeightInt").value) ||
			(!Validation.sanitize($("WoodMouldingSelOutsideDimensionsHeightFloat").value) && '' != $("WoodMouldingSelOutsideDimensionsHeightFloat").value))
		{
			msgs[msgs.length] = "Please revise your dimensions.";
		}
		
		var width = parseFloat($("WoodMouldingSelOutsideDimensionsWidthInt").value);
		if ('' != $("WoodMouldingSelOutsideDimensionsWidthFloat").value)
		{
			width += parseFloat($("WoodMouldingSelOutsideDimensionsWidthFloat").value);
		}
		var height = parseFloat($("WoodMouldingSelOutsideDimensionsHeightInt").value);
		if ('' != $("WoodMouldingSelOutsideDimensionsHeightFloat").value)
		{
			height += parseFloat($("WoodMouldingSelOutsideDimensionsHeightFloat").value);
		}
		
		if (6.0 > width || 6.0 > height || 60 < width || 60 < height) {
			msgs[msgs.length] = "Wood frames can be cut from 6.0\" to 60\".  Please revise your dimensions.";
		}
		if (msgs.length==0) {
			return true;
		}
		alert("Please verify the following:\n- "+msgs.join("\n- "));
		return false;
	},
	metal_moulding : function (prod) {
		var msgs = [];
		if ($("product_id").value=="") {
			msgs[msgs.length] = "Please select a product.";
		}
		if ($("selColorCode").value=="") {
			msgs[msgs.length] = "Please select a color .";
		}
		if (!Validation.sanitize($("MetalMouldingSelOutsideDimensionsWidthInt").value) ||
			(!Validation.sanitize($("MetalMouldingSelOutsideDimensionsWidthFloat").value) && '' != $("MetalMouldingSelOutsideDimensionsWidthFloat").value) ||
			!Validation.sanitize($("MetalMouldingSelOutsideDimensionsHeightInt").value) ||
			(!Validation.sanitize($("MetalMouldingSelOutsideDimensionsHeightFloat").value) && '' != $("MetalMouldingSelOutsideDimensionsHeightFloat").value))
		{
			msgs[msgs.length] = "Please revise your dimensions.";
		}
		
		var width = parseFloat($("MetalMouldingSelOutsideDimensionsWidthInt").value);
		if ('' != $("MetalMouldingSelOutsideDimensionsWidthFloat").value)
		{
			width += parseFloat($("MetalMouldingSelOutsideDimensionsWidthFloat").value);
		}
		var height = parseFloat($("MetalMouldingSelOutsideDimensionsHeightInt").value);
		if ('' != $("MetalMouldingSelOutsideDimensionsHeightFloat").value)
		{
			height += parseFloat($("MetalMouldingSelOutsideDimensionsHeightFloat").value);
		}
		
		if (18 == $("MetalMouldingCategoryId").options[$("MetalMouldingCategoryId").selectedIndex].value) {
			if (5 > width || 5 > height || 24 < width || 24 < height) {
				msgs[msgs.length] = "Backloading frames can be cut from 5\" to 24\".  Please revise your dimensions.";
			}
		} else {
			if (6 > width || 6 > height || 60 < width || 60 < height) {
				msgs[msgs.length] = "Metal frames can be cut from 6\" to 60\".  Please revise your dimensions.";
			}
		}
		if (msgs.length==0) {
			return true;
		}
		alert("Please verify the following:\n- "+msgs.join("\n- "));
		return false;
	},
	plexiglass : function (prod) {
		var msgs = [];
		if ($("product_id").value=="") {
			msgs[msgs.length] = "Please select a product.";
		} else {
			if (!Validation.sanitize($("PlexiglassSelOutsideDimensionsWidthInt").value) ||
				(!Validation.sanitize($("PlexiglassSelOutsideDimensionsWidthFloat").value) && '' != $("PlexiglassSelOutsideDimensionsWidthFloat").value) ||
				!Validation.sanitize($("PlexiglassSelOutsideDimensionsHeightInt").value) ||
				(!Validation.sanitize($("PlexiglassSelOutsideDimensionsHeightFloat").value) && '' != $("PlexiglassSelOutsideDimensionsHeightFloat").value))
			{
				msgs[msgs.length] = "Please revise your dimensions.";
			}
			
			var width = parseFloat($("PlexiglassSelOutsideDimensionsWidthInt").value);
			if ('' != $("PlexiglassSelOutsideDimensionsWidthFloat").value)
			{
				width += parseFloat($("PlexiglassSelOutsideDimensionsWidthFloat").value);
			}
			var height = parseFloat($("PlexiglassSelOutsideDimensionsHeightInt").value);
			if ('' != $("PlexiglassSelOutsideDimensionsHeightFloat").value)
			{
				height += parseFloat($("PlexiglassSelOutsideDimensionsHeightFloat").value);
			}
			
			var high_dim = Math.max(width, height);
			var low_dim = Math.min(width, height);
			
			if (low_dim > 28 || high_dim > 36) {
				msgs[msgs.length] = "We cannot ship plexiglass larger than 28 x 36. Please call Customer Service for more information.";
	 		} 
		}
		
		if (msgs.length==0) {
			return true;
		}
		alert("Please verify the following:\n- "+msgs.join("\n- "));
		return false;
	},
	supplies : function (prod)	{
		var msgs = [];
		if ('' == $('product_id').value)
		{
			msgs[msgs.length] = 'Please select a product.';
		}
		if (0 == msgs.length)
		{
			return true;
		}
		alert('Please verify the following:\n- ' + msgs.join('\n- '));
		return false;
	},
	bags : function (prod)	{
		var msgs = [];
		if ('' == $('product_id').value)
		{
			msgs[msgs.length] = 'Please select a product.';
		}
		if (0 == msgs.length)
		{
			return true;
		}
		alert('Please verify the following:\n- ' + msgs.join('\n- '));
		return false;
	},
	precuts : function (prod)	{
		var msgs = [];
		if ('' == $('product_id').value)
		{
			msgs[msgs.length] = 'Please select a product.';
		}
		if (0 == msgs.length)
		{
			return true;
		}
		alert('Please verify the following:\n- ' + msgs.join('\n- '));
		return false;
	},
	ready_made_frames : function (prod)	{
		var msgs = [];
		if ('' == $('product_id').value)
		{
			msgs[msgs.length] = 'Please select a product.';
		}
		if (0 == msgs.length)
		{
			return true;
		}
		alert('Please verify the following:\n- ' + msgs.join('\n- '));
		return false;
	},
	sanitize : function (value)	{
		return (!isNaN(value) && '' != value && 'undefined' != typeof value);
	}
}

function Product() {
	this.nr=function (value, defaultValue) {
		value=parseFloat(value);
		return (isNaN(value)||value==""||typeof value=="undefined"?defaultValue:value);
	}
	
	this.isNullOrUndefined=function (val) {
		return (typeof val == "undefined" || val == null);
	}
	this.type="";
	this.colors=false;
	this.getPriceLink="get_price";
	this.selectedProdEl={};
	this.selectedColorEl={};
	this.validation=function () {};

	this.setOptions=function (options) {
		options=(this.isNullOrUndefined(options) ? {} : options);
		this.type=(this.isNullOrUndefined(options.type) ? "" : options.type);
		this.colors=(this.isNullOrUndefined(options.colors) ? false : options.colors);
		this.getPriceLink=(this.isNullOrUndefined(options.getPriceLink) ? "get_price" : options.getPriceLink);
		this.onProductChange=function (layer, prodId, prodName, params) {
		}
	}
	this.getParent=function (el,pTag) {
		var p=el;
		while(p&&p.tagName!=pTag){
		  p=p.parentNode;
		}
		return p;
	}
	this.loadByCat=function (catId, builder, layer) {
		$('divProductsItems'+layer).innerHTML=indicatorImg;
		new Ajax.Updater('divProductsItems' + layer,Env.URL_PATH+'builders/load_by_category/'+catId+'/'+builder+'/'+layer, {evalScripts: true});
		//var li=$("liCatId"+catId);
		categories.selectCat(catId);
	}
	this.setCat=function (categoryId) {
		//var li=$("liCatId"+categoryId);
		categories.selectCat(categoryId);
		//li.className = "selected";
	}
	this.onProductChange=function (layer, prodId, prodName, params) {
	}
	this.previewDisplay = function (value, multiline) {
		if (isNaN(value))
		{
			return '';
		}
		
		value = Math.round(value * 10000) / 10000;
		
		if (!multiline)
		{
			return value;
		}
		
		value = value.toString();
		var value_new = '';
		
		for (var index = 0; value.length > index; ++index)
		{
			value_new += value.charAt(index);
			
			if (value.length - 1 > index)
			{
				value_new += '<br />';
			}
		}
		
		return value_new;
	}
	this.preview = function() {
		if ($('preview'))
		{
			//Reset user inputs
			var id_height = 0;
			var id_width = 0;
			var id_weight = 0;
			var layer1_color = '';
			var layer2 = 0;
			var layer2_color = '';
			var layer3 = 0;
			var layer3_color = '';
			var od_height = 0;
			var od_width = 0;
			
			//Retrieve user inputs
			if (!$('chkBlankMatBoard').checked)
			{
				id_height = mBuilder.nr($('MatboardSelOpeningDimensionsHeightInt').value, 0) + mBuilder.nr($('MatboardSelOpeningDimensionsHeightFloat').value, 0);
				id_width = mBuilder.nr($('MatboardSelOpeningDimensionsWidthInt').value, 0) + mBuilder.nr($('MatboardSelOpeningDimensionsWidthFloat').value, 0);
				
				if ($('chkWeightedWindow').checked)
				{
					id_weight = mBuilder.nr($('MatboardSelTopWeightInt').value, 0) + mBuilder.nr($('MatboardSelTopWeightFloat').value, 0);
				}
				
				if (3 == $('MatboardSelNumberLayers').value)
				{
					layer2 = 1;
					layer3 = 1;
					
					if ($('divLayer2Label-color').getElementsByTagName('img')[0])
					{
						layer2_color = $('divLayer2Label-color').getElementsByTagName('img')[0].src;
					}
					if ($('divLayer1Label-color').getElementsByTagName('img')[0])
					{
						layer3_color = $('divLayer1Label-color').getElementsByTagName('img')[0].src;
					}
				}
				else if (2 == $('MatboardSelNumberLayers').value)
				{
					layer2 = 1;
					
					if ($('divLayer1Label-color').getElementsByTagName('img')[0])
					{
						layer2_color = $('divLayer1Label-color').getElementsByTagName('img')[0].src;
					}
				}
			}
			
			if ($('divLayer0Label-color').getElementsByTagName('img')[0])
			{
				layer1_color = $('divLayer0Label-color').getElementsByTagName('img')[0].src;
			}
			
			od_height = mBuilder.nr($('MatboardSelOutsideDimensionsHeightInt').value, 0) + mBuilder.nr($('MatboardSelOutsideDimensionsHeightFloat').value, 0);
			od_width = mBuilder.nr($('MatboardSelOutsideDimensionsWidthInt').value, 0) + mBuilder.nr($('MatboardSelOutsideDimensionsWidthFloat').value, 0);
			
			var show_dims = true;
			
			//Use default values if none entered
			if (!od_height && !od_width && !id_height && !id_width)
			{
				od_height = 10;
				od_width = 8;
				
				if (!$('chkBlankMatBoard').checked)
				{
					id_height = 8;
					id_width = 6;
				}
				
				show_dims = false;
			}
			
			//Set primary elements
			var preview = $('preview').getElementsByTagName('table')[0];
			var cells = preview.getElementsByTagName('td');
			
			//Hide preview while building
			preview.style.display = 'none';
			
			//Check that outside dimensions are entered and valid
			if (od_height && od_width && 0 < od_height && 0 < od_width)
			{
				var od_min_border = 9;										//Minimum space for text (px)
				var od_min_dim = od_min_border * 4;							//Minimum space for all borders (px)
				var od_min_layer = 9;										//Minimum space for interior layers 2-3 (px)
				var od_min_ratio = 0.75;									//Minimum aspect ratio to display before skewing
				var od_max_container = 234;									//Preview container size (px, must be square)
				var od_max_dim = od_max_container - (od_min_border * 2);	//Maximum space for outside dimensions (px)
				
				//Display outside dimensions
				if (show_dims)
				{
					cells[0].innerHTML = /*cells[20].innerHTML = */this.previewDisplay(od_width);
					/*cells[1].innerHTML = */cells[3].innerHTML = this.previewDisplay(od_height, 1);
				}
				else
				{
					cells[0].innerHTML = '';
					cells[3].innerHTML = '';
				}

				
				//Display layer 1 color
				cells[2].style.background = cells[4].style.background = cells[6].style.background = cells[19].style.background = 'url(' + layer1_color + ')';
				
				//Display borders
				cells[1].style.borderRight = cells[2].style.borderTop = cells[3].style.borderLeft = cells[19].style.borderBottom = (!layer1_color ? '1px dotted #333333' : '0');
				
				//Reset layer 2-3 dimensions
				cells[5].style.height = cells[8].style.height = cells[17].style.height = cells[18].style.height = '0';
				cells[7].style.width = cells[9].style.width = cells[10].style.width = cells[12].style.width = '0';
				
				//Calculate outside aspect ratio and adjust for minimums
				if (od_height > od_width)
				{
					var od_ratio = od_width / od_height;
				}
				else
				{
					var od_ratio = od_height / od_width;
				}
				
				if (od_ratio < od_min_ratio)
				{
					od_ratio = od_min_ratio;
				}
				
				//Calculate actual outside dimensions (px)
				var od_height_actual = od_height > od_width ? od_max_dim : od_max_dim * od_ratio;
				var od_width_actual = od_height > od_width ? od_max_dim * od_ratio : od_max_dim;
				
				//Reset inside dimension adjustments
				var id_adj_height = 0;
				var id_adj_width = 0;
				var id_offset_bottom = 0;
				var id_offset_top = 0;
				
				//Check that inside dimensions are entered and valid
				if (id_height && id_width && 0 < id_height && od_height > id_height && 0 < id_width && od_width > id_width)
				{
					//Reset layer 2-3 and window colors
					cells[5].style.background = cells[7].style.background = cells[8].style.background = cells[9].style.background = cells[10].style.background = cells[11].style.background = cells[12].style.background = cells[13].style.background = cells[14].style.background = cells[15].style.background = cells[16].style.background = cells[17].style.background = cells[18].style.background = 'none';
					
					//Display borders
					cells[4].style.borderRight = cells[5].style.borderTop = cells[6].style.borderLeft = cells[18].style.borderBottom = (!layer1_color ? '1px dotted #333333' : '0');
					
					//Check that layer 2 is selected
					if (layer2)
					{
						//Display layer 2 color and set dimensions
						cells[5].style.background = cells[7].style.background = cells[9].style.background = cells[18].style.background = 'url(' + layer2_color + ')';
						cells[5].style.height = cells[18].style.height = od_min_layer + 'px';
						cells[7].style.width = cells[9].style.width = od_min_layer + 'px';
						
						//Check that layer 3 is selected
						if (layer3)
						{
							//Display layer 3 color and set dimensions
							cells[8].style.background = cells[10].style.background = cells[12].style.background = cells[17].style.background = 'url(' + layer3_color + ')';
							cells[8].style.height = cells[17].style.height = od_min_layer + 'px';
							cells[10].style.width = cells[12].style.width = od_min_layer + 'px';
							
							//Increase minimum to allow space for layer
							od_min_dim += (od_min_layer * 2);
						}
						
						//Increase minimum to allow space for layer
						od_min_dim += (od_min_layer * 2);
					}
					
					//Calculate actual inside dimensions (px)
					var id_height_actual = od_height_actual * (id_height / od_height);
					var id_width_actual = od_width_actual * (id_width / od_width);
					
					//Make inside height adjustments based on minimum space
					if (id_height_actual < od_min_dim - od_min_border)
					{
						id_adj_height = od_height_actual - (od_min_dim - od_min_border) - (od_min_border * 2);
					}
					else if (od_height_actual - id_height_actual > od_min_dim - (od_min_border * 2))
					{
						id_adj_height = od_height_actual - id_height_actual - (od_min_border * 2);
					}
					
					//Make inside width adjustments based on minimum space
					if (id_width_actual < od_min_dim - od_min_border)
					{
						id_adj_width = od_width_actual - (od_min_dim - od_min_border) - (od_min_border * 2);
					}
					else if (od_width_actual - id_width_actual > od_min_dim - (od_min_border * 2))
					{
						id_adj_width = od_width_actual - id_width_actual - (od_min_border * 2);
					}
					
					//Check that weight is entered
					if (id_weight && id_weight != (od_height - id_height) / 2)
					{
						//Calculate actual weight dimension (px)
						var id_weight_actual = ((id_weight / ((od_height - id_height) / 2)) * ((id_adj_height / 2) + od_min_border));
						
						//Make weight adjustments based on minimum space
						if (id_weight_actual < od_min_border)
						{
							id_offset_bottom = id_adj_height / 2;
							id_offset_top = id_adj_height / -2;
						}
						else if (id_weight_actual > id_adj_height + od_min_border)
						{
							id_offset_bottom = id_adj_height / -2;
							id_offset_top = id_adj_height / 2;
						}
						else
						{
							id_offset_bottom = ((id_adj_height / 2) + od_min_border) - id_weight_actual;
							id_offset_top = (((id_adj_height / 2) + od_min_border) - id_weight_actual) * -1;
						}
						
						//Display weight dimensions
						if (show_dims)
						{
							cells[2].innerHTML = "<div style='background-color: #fff; color: #000; display: inline; padding: 0 2px;'>"+this.previewDisplay(id_weight)+"</div>";
							cells[19].innerHTML = "<div style='background-color: #fff; color: #000; display: inline; padding: 0 2px;'>"+ this.previewDisplay(od_height - id_height - id_weight)+"</div>";
						}
						else 
						{
							cells[2].innerHTML = '';
							cells[19].innerHTML = '';
						}
					}
					else
					{
						//Display weight dimensions
						if (show_dims)
						{
							cells[2].innerHTML = cells[19].innerHTML = "<div style='background-color: #fff; color: #000; display: inline; padding: 0 2px;'>"+this.previewDisplay((od_height - id_height) / 2)+"</div>";
						}
						else 
						{
							cells[2].innerHTML = '';
							cells[19].innerHTML = '';
						}
					}
					
					//Display weight and inside dimensions
					if (show_dims)
					{
						cells[4].innerHTML = cells[6].innerHTML = "<div style='background-color: #fff; color: #000; margin: 0 auto; padding: 2px; width: 9px;'>"+this.previewDisplay((od_width - id_width) / 2, 1)+"</div>";
						cells[11].innerHTML = /*cells[16].innerHTML = */"<div style='padding-top: 1px;'>" + this.previewDisplay(id_width) + "</div>";
						/*cells[13].innerHTML = */cells[15].innerHTML = "<div style='padding-right: 1px;'>" + this.previewDisplay(id_height, 1) + "</div>";
					}
					else
					{
						cells[4].innerHTML = '';
						cells[6].innerHTML = '';
						cells[11].innerHTML = '';
						cells[15].innerHTML = '';
					}
				}
				else
				{
					//Reset all inside dimensions and layer 2-3 colors
					cells[2].innerHTML = cells[4].innerHTML = cells[6].innerHTML = cells[11].innerHTML = cells[13].innerHTML = cells[15].innerHTML = cells[16].innerHTML = cells[19].innerHTML = '';
					cells[5].style.background = cells[7].style.background = cells[8].style.background = cells[9].style.background = cells[10].style.background = cells[11].style.background = cells[12].style.background = cells[13].style.background = cells[14].style.background = cells[15].style.background = cells[16].style.background = cells[17].style.background = cells[18].style.background = 'url(' + layer1_color + ')';
					
					//Display borders
					cells[4].style.borderRight = cells[5].style.borderTop = cells[6].style.borderLeft = cells[18].style.borderBottom = '0';
				}
				
				//Set outside dimensions
				cells[0].style.height = cells[20].style.height = (od_height > od_width ? 0 : (od_max_dim - od_height_actual) / 2) + od_min_border + 'px';
				cells[1].style.width = cells[3].style.width = (od_height > od_width ? (od_max_dim - od_width_actual) / 2 : 0) + od_min_border + 'px';
				
				//Set top weight dimension
				cells[2].style.height = ((id_adj_height / 2) + od_min_border + id_offset_top) + 'px';
				
				//Set left-right weight dimensions
				cells[4].style.width = cells[6].style.width = ((id_adj_width / 2) + od_min_border) + 'px';
				
				//Set inside dimensions
				cells[11].style.height = cells[16].style.height = od_min_border + 'px';
				cells[13].style.width = cells[15].style.width = od_min_border + 'px';
				
				//Set window dimensions
				cells[14].style.height = od_height_actual - id_adj_height - od_min_dim + 'px';
				cells[14].style.width = od_width_actual - id_adj_width - od_min_dim + 'px';
				
				//Set bottom weight dimension
				cells[19].style.height = ((id_adj_height / 2) + od_min_border + id_offset_bottom) + 'px';
				
				//Show preview after building
				preview.style.display = '';
				
				//DEBUG: Uncomment all below to alert() dimension calculations and validations
				/*
				var debug = '';
				var debug_height = parseFloat(cells[0].style.height) + parseFloat(cells[2].style.height) + parseFloat(cells[5].style.height) + parseFloat(cells[8].style.height) + parseFloat(cells[11].style.height) + parseFloat(cells[14].style.height) + parseFloat(cells[16].style.height) + parseFloat(cells[17].style.height) + parseFloat(cells[18].style.height) + parseFloat(cells[19].style.height) + parseFloat(cells[20].style.height);
				var debug_width = parseFloat(cells[1].style.width) + parseFloat(cells[4].style.width) + parseFloat(cells[7].style.width) + parseFloat(cells[10].style.width) + parseFloat(cells[13].style.width) + parseFloat(cells[14].style.width) + parseFloat(cells[15].style.width) + parseFloat(cells[12].style.width) + parseFloat(cells[9].style.width) + parseFloat(cells[6].style.width) + parseFloat(cells[3].style.width);
				debug += "PREVIEW DEBUG:\n\n";
				debug += "Heights (Top-Bottom):\n";
				debug += cells[0].style.height + "\n" + cells[2].style.height + "\n" + cells[5].style.height + "\n" + cells[8].style.height + "\n" + cells[11].style.height + "\n" + cells[14].style.height + "\n" + cells[16].style.height + "\n" + cells[17].style.height + "\n" + cells[18].style.height + "\n" + cells[19].style.height + "\n" + cells[20].style.height + "\n";
				debug += "Heights accurate: " + (od_max_container == Math.round(debug_height) ? 'true' : 'false (' + (od_max_container - debug_height) + ')') + "\n\n";
				debug += "Widths (Left-Right):\n";
				debug += cells[1].style.width + "\n" + cells[4].style.width + "\n" + cells[7].style.width + "\n" + cells[10].style.width + "\n" + cells[13].style.width + "\n" + cells[14].style.width + "\n" + cells[15].style.width + "\n" + cells[12].style.width + "\n" + cells[9].style.width + "\n" + cells[6].style.width + "\n" + cells[3].style.width + "\n";
				debug += "Widths accurate: " + (od_max_container == Math.round(debug_width) ? 'true' : 'false (' + (od_max_container - debug_width) + ')');
				alert(debug);
				*/
				
				return true;
			}
		}
		
		return false;
	}
	this.resetSpecs = function (){
		$('chkBlankMatBoard').checked = '';
		mBuilder.setBlankMat(0);
		
		$('MatboardSelOutsideDimensionsHeightInt').value = '';
		$('MatboardSelOutsideDimensionsHeightFloat').selectedIndex = 0;
		$('MatboardSelOutsideDimensionsWidthInt').value = '';
		$('MatboardSelOutsideDimensionsWidthFloat').selectedIndex = 0;
		
		$('MatboardSelOpeningDimensionsHeightInt').value = '';
		$('MatboardSelOpeningDimensionsHeightFloat').selectedIndex = 0;
		$('MatboardSelOpeningDimensionsWidthInt').value = '';
		$('MatboardSelOpeningDimensionsWidthFloat').selectedIndex = 0;
		
		$('chkWeightedWindow').checked = '';
		mBuilder.setWeightedWindow(0);
		
		$('MatboardSelTopWeightInt').value = '';
		$('MatboardSelTopWeightFloat').selectedIndex = 0;
		$('MatboardSelBottomWeightInt').value = '';
		$('MatboardSelBottomWeightFloat').selectedIndex = 0;
		
		this.preview();
		
		return true;
	}
	this.setProd=function (a, layer, prodId, prodName, params, colorId) {
		if(typeof layer == "undefined" || layer == '') {
			if($("current_layer")) {
				layer = $("current_layer").value;
			}
		}
		this.onProductChange(layer, prodId, prodName, params);
		$("product_id"+layer).value=prodId;
		if (!this.isNullOrUndefined(this.selectedProdEl[layer])) {
			this.selectedProdEl[layer].className=this.selectedProdEl[layer].getAttribute("cssClass");
		}
		this.selectedProdEl[layer]=this.getParent(a,"LI");
		this.selectedProdEl[layer].setAttribute("cssClass", this.selectedProdEl[layer].className);
		this.selectedProdEl[layer].className="selected";
		productsPopup.hide();
		$("divLayer"+layer+"Label").getElementsByTagName("DIV")[0].innerHTML=prodName;
		if (this.colors=='load_colors') {
			this.loadColors(layer, prodId, 'load_colors', colorId);
		} else if (this.colors=='load_metal_colors') {
			this.loadColors(layer, prodId, 'load_metal_colors', colorId);
		}
		this.loadRelatedProducts(prodId);
		this.preview();
	}
	this.loadColors=function (layer, prodId, action, colorId) {
		$('ulColors'+layer).innerHTML=indicatorImg;
		$("selColorCode"+layer).value="";
		$("selColorName"+layer).value="";
		
		new Ajax.Updater('ulColors' + layer,Env.URL_PATH+'builders/'+action+'/'+prodId+'/'+(layer==''?'null':layer)+'/'+colorId, 
			{
				'evalScripts' : true,
				'onComplete' : function () {
					var clrs = $('ulColors'+layer).getElementsByTagName("LI");
					if (clrs.length > 0) {
						clrs[0].getElementsByTagName("LI")[0].click();
					}
				}
			});
	}
	this.setColor=function (a, layer, imgCode, imgName, imgFile) {
		$("selColorCode"+layer).value=imgCode;
		$("selColorName"+layer).value=imgCode;
		if (!this.isNullOrUndefined(this.selectedColorEl[layer])) {
			this.selectedColorEl[layer].className="";
		}
		this.selectedColorEl[layer]=this.getParent(a,"LI");
		this.selectedColorEl[layer].className="selected";
		colorsPopup.hide();
// it's here
		this.showFullColors(false, layer);
		try {
			$("divLayer"+layer+"Label-color").innerHTML= '<span class="product_selection">Color:</span> <img src="' + Env.URL_PATH + 'img/' + imgFile + '" alt="' + imgName + '" width="25" height="15" align="top" /> ' + imgName;
		} catch (e) {
		}
		//this.selectedColorEl[layer].scrollTo();
		this.preview();
	}
	this.showFullColors=function (b, layer) {
		var div=$("divColors"+layer).getElementsByClassName('colors')[0];
		if (b) {
			div.style.position="absolute";
			div.style.top="100px";
			div.style.left="50px";
			div.style.height="500px";
			div.style.width="680px";
			div.style.border="2px solid #666";
			div.style.paddingLeft="0px";
			$('divColorsClose').style.display="block";
		} else {
			div.style.position="static";
			div.style.height="328px";
			div.style.width="229px";
			div.style.border="0px";
			div.style.borderBottom="gray 1px solid";
			div.style.paddingLeft="5px";
			$('divColorsClose').style.display="none";
		}
	}
	this.woodGetPrice=function () {
		if (this.validation(this)) {

			$('divPrice').innerHTML=indicatorImg;
			$('divShowQuantityPrices').innerHTML=indicatorImg;

			$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
			if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
				$('txtQuantity').value = 1;
			}

			var postBody = Form.serializeElements( Form.getElements($('frmProduct')) );

			new Ajax.Updater({ success: 'divShowQuantityPrices', failure: 'divNotice' }, Env.URL_PATH+'builders/wood_moulding_quantity_prices/', {'postBody' : postBody});
			new Ajax.Updater({ success: 'divPrice', failure: 'divNotice' }, Env.URL_PATH+'builders/'+this.getPriceLink+'/', {'postBody' : postBody});
		}
	}
	this.getPrice=function () {
		if (this.validation(this)) {

			$('divPrice').innerHTML=indicatorImg;

			$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
			if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
				$('txtQuantity').value = 1;
			}

			var postBody = Form.serializeElements( Form.getElements($('frmProduct')) );

			new Ajax.Updater({ success: 'divPrice', failure: 'divNotice' }, Env.URL_PATH+'builders/'+this.getPriceLink+'/', {'postBody' : postBody});
		}
	}
	this.addToCart=function (isWishlist) {
		if (this.validation(this)) {
			$('divPrice').innerHTML=indicatorImg;

			$('txtQuantity').value = $('txtQuantity').value.replace(/[^0-9]/gi, "");
			if ($('txtQuantity').value == "" || $('txtQuantity').value == 0) {
				$('txtQuantity').value = 1;
			}
			
			var postBody = Form.serializeElements( Form.getElements($('frmProduct')) );

			var ajaxOptions = {
				success: 'divPrice',
				failure: 'divNotice',
				onComplete: function (httpXml, xJson) {
					$('divNotice').innerHTML='The product was added to your cart.';
				}
			};
			
			if (isWishlist) {
				new Ajax.Updater(ajaxOptions, Env.URL_PATH + 'builders/add_to_cart/' + this.type + '/' + isWishlist, {evalScripts: true, 'postBody' : postBody});
			} else {
				new Ajax.Updater(ajaxOptions, Env.URL_PATH + 'builders/add_to_cart/' + this.type, {evalScripts: true, onSuccess : function() { new Ajax.Updater('cart_area', Env.URL_PATH + 'builders/update_cart_area/', {}); }, 'postBody' : postBody});
			}
		}
	}
	this.myCart=function () {
		location.href = Env.URL_PATH+'orders/cart';
	}
	this.checkout=function () {
		location.href = Env.URL_PATH+'checkout';
	}
	this.loadRelatedProducts=function (prodId) {
		if (Builders[this.type].rightBar) {
			new Ajax.Updater('right_box_related',Env.URL_PATH+'products/load_related_random/'+prodId, {evalScripts: true});
		}
	}
}





