// JavaScript Document
var xmlhttp;
var xmlhttp_options;

var state        = '';
var price_tier   = '';
var width_class  = '';
var certified    = 'uncertified';
var options_loaded = false;

var length       = 0;
var width        = 0;
var height       = 0;
var min_height   = 0;
var door_height  = 0;
var additional_height_price = 0;
var perimeter    = 0;
var surface_area = 0;

var loaded_base       = false;
var loaded_options    = false;
var loaded_sides_ends = false;
var loaded_extras     = false;

var doors_set    = false;
var door_array   = Array();

var style        = 'regular';

var closed_left     = 0;
var closed_right    = 0;
var closed_front    = 0;
var closed_back     = 0;
var has_closed_side = 0;

var cert_changed = false;

function GetXmlHttpObject()
{
	if (window.XMLHttpRequest)
	{
		// code for IE7+, Firefox, Chrome, Opera, Safari
		return new XMLHttpRequest();
	}
	if (window.ActiveXObject)
	{
		// code for IE6, IE5
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
	return null;
}

function setPriceTier(s)
{
	state = s.value;
	
	xmlhttp = GetXmlHttpObject();
	
	if (xmlhttp == null)
	{
		alert ("Browser does not support HTTP Request");
		return;
	}
	
	var url = "ajax_price_tier.php";
	url += "?state=" + state;
	
	xmlhttp.onreadystatechange = handlePriceTier;
	xmlhttp.open("GET", url, true);
	xmlhttp.send(null);
}

function handlePriceTier()
{
	if (xmlhttp.readyState == 4)
	{
		// handle response here
		price_tier = xmlhttp.responseText;
		
		if (options_loaded == true)
			setOptions();
		
		// document.getElementById('price_tier').innerHTML = price_tier;
		setBase();
	}
}

function setWidthClass(w)
{
	width = w.value;
	
	xmlhttp = GetXmlHttpObject();
	
	if (xmlhttp == null)
	{
		alert ("Browser does not support HTTP Request");
		return;
	}
	
	var url = "ajax_width_class.php";
	url += "?width=" + width;
	
	xmlhttp.onreadystatechange = handleWidthClass;
	xmlhttp.open("GET", url, true);
	xmlhttp.send(null);
}

function handleWidthClass()
{
	if (xmlhttp.readyState == 4)
	{
		// handle response here

		width_class = xmlhttp.responseText;
		
		setBase();
	}
}

function setBase()
{
	length = document.getElementById('length').value;
	width  = document.getElementById('width').value;
	style  = document.getElementById('style').value;
	
	if ((length == '') || (width == ''))
	{
		// need to clear whole form, baes not valid
		return;
	}
	
	perimeter = 2 * parseInt(width) + 2 * parseInt(length);
	
	xmlhttp = GetXmlHttpObject();
	
	if (xmlhttp == null)
	{
		alert ("Browser does not support HTTP Request");
		return;
	}
	
	var url = "ajax_base.php";
	url = url + "?price_tier="  + price_tier;
	url = url + "&width_class="  + width_class;
	url = url + "&style="  + style;
	url = url + "&width="  + width;
	url = url + "&length=" + length;
				
	xmlhttp.onreadystatechange = handleBase;
	xmlhttp.open("GET", url, true);
	xmlhttp.send(null);
}

function handleBase()
{
	if (xmlhttp.readyState == 4)
	{
		// handle response here
		var list = xmlhttp.responseText.split("|");
		
		document.getElementById('base_price').innerHTML = list[0];
		
		min_height = list[1];
		additional_height_price = list[2];
		
		var current_height = document.getElementById('height').value;
		if ((current_height == '') || (current_height < Math.max(min_height, door_height)))
			current_height = min_height;
		
		document.getElementById('height').disabled = false;
		var h = document.getElementById('height');
		
		while(h.length)
			h.remove(h.length - 1);
			
		var i = 0;
		var o = document.createElement('option');
						
		o.text  = '-- Height --';
		o.value = '0';
		
		try
		{
			h.add(o, null);
		}
		catch(e)
		{
			h.add(o);
		}
		
		
		if (parseInt(o.value) == current_height)
			h.selectedIndex = i;
		
		for (temp_height = min_height; temp_height <= 12; temp_height++)
		{					
			var temp_price = parseInt(additional_height_price) * i;
			
			i++;
			
			var o = document.createElement('option');
			o.text  = temp_height + '\' : $' + temp_price + '.00';
			o.value = temp_height;
			
			try
			{
				h.add(o, null);
			}
			catch(e)
			{
				h.add(o);
			}
			
			if (parseInt(o.value) == current_height)
				h.selectedIndex = i;
		}		
		
		if (current_height != height)
			height = current_height; 
		
		setSidesEnds();
	}
}

function setSidesEnds()
{
	xmlhttp = GetXmlHttpObject();
	
	if (xmlhttp == null)
	{
		alert ("Browser does not support HTTP Request");
		return;
	}
	
	var url = "ajax_sides_ends.php";
	url = url + "?price_tier="  + price_tier;
	url = url + "&width_class="  + width_class;
	url = url + "&width="  + width;
	url = url + "&length=" + length;
	url = url + "&height=" + height;
	url = url + "&certified=" + certified.toLowerCase();
				
	xmlhttp.onreadystatechange = handleSidesEnds;
	xmlhttp.open("GET", url, true);
	xmlhttp.send(null);
}

function handleSidesEnds()
{
	if (xmlhttp.readyState == 4)
	{
		// handle response here
		var list = xmlhttp.responseText.split("|");
		
		var sh = list[0];
		var sv = list[1];
		var eh = list[2];
		var ev = list[3];
		
		var s = document.getElementById('closed_sides').value;
		var f = document.getElementById('closed_front').value;
		var b = document.getElementById('closed_back').value;
		
		var ts = document.getElementById('closed_sides');
		ts.disabled = false;
		while(ts.length > 1)
			ts.remove(ts.length - 1);
			
		var o = document.createElement('option');
		o.text  = 'Closed Sides : $' + sh;
		o.value = 'horizontal';
		try
		{
			ts.add(o, null);
		}
		catch(e)
		{
			ts.add(o);
		}
		if (s == o.value)
			ts.selectedIndex = ts.length - 1;
		
		var o = document.createElement('option');
		o.text  = 'Vertical Sides : $' + sv;
		o.value = 'vertical';
		try
		{
			ts.add(o, null);
		}
		catch(e)
		{
			ts.add(o);
		}
		if (s == o.value)
			ts.selectedIndex = ts.length - 1;
			
		var te = document.getElementById('closed_front');
		te.disabled = false;
		while(te.length > 1)
			te.remove(te.length - 1);
			
		var o = document.createElement('option');
		o.text  = 'Closed Front : $' + eh;
		o.value = 'horizontal';
		try
		{
			te.add(o, null);
		}
		catch(e)
		{
			te.add(o);
		}
		if (f == o.value)
			te.selectedIndex = te.length - 1;
		
		var o = document.createElement('option');
		o.text  = 'Vertical Front : $' + ev;
		o.value = 'vertical';
		try
		{
			te.add(o, null);
		}
		catch(e)
		{
			te.add(o);
		}
		if (f == o.value)
			te.selectedIndex = te.length - 1;
			
		var te = document.getElementById('closed_back');
		te.disabled = false;
		while(te.length > 1)
			te.remove(te.length - 1);
			
		var o = document.createElement('option');
		o.text  = 'Closed Back : $' + eh;
		o.value = 'horizontal';
		try
		{
			te.add(o, null);
		}
		catch(e)
		{
			te.add(o);
		}
		if (b == o.value)
			te.selectedIndex = te.length - 1;
		
		var o = document.createElement('option');
		o.text  = 'Vertical Back : $' + ev;
		o.value = 'vertical';
		try
		{
			te.add(o, null);
		}
		catch(e)
		{
			te.add(o);
		}
		if (b == o.value)
			te.selectedIndex = te.length - 1;
		
		updateEndsPrice();
		updatePrice('closed_sides');
		
		setExtras();
	}
}

function setExtras()
{
	xmlhttp = GetXmlHttpObject();
	
	if (xmlhttp == null)
	{
		alert ("Browser does not support HTTP Request");
		return;
	}
	
	var url = "ajax_extras.php";
	url = url + "?price_tier="  + price_tier;
	url = url + "&width_class="  + width_class;
	url = url + "&length=" + length;
	url = url + "&certified=" + certified.toLowerCase();
							
	xmlhttp.onreadystatechange = handleExtras;
	xmlhttp.open("GET", url, true);
	xmlhttp.send(null);
}

function handleExtras()
{
	if (xmlhttp.readyState == 4)
	{
		// handle response here
		var list = xmlhttp.responseText.split("\n");
		
		for (a = 0; a < list.length; a++)
		{
			var l = list[a].split("|");
			
			var id = l[0];
			var temp = id + "_price";
			
			if (l[1] == 'NA')
			{
					// disable current dropdown and zero price
					document.getElementById(id).disabled    = true;
					document.getElementById(temp).innerHTML = "0.00";
			}
			else
			{
				
					document.getElementById(id).disabled    = false;
				var sel = document.getElementById(id);
				var val = sel.value;
				
				while(sel.length > 0)
					sel.remove(sel.length - 1);
				
				for (b = 1; b < l.length; b++)
				{
					var params = l[b].split(":");
					
					var o = document.createElement('option');
					o.text  = params[0].split("_").join(" ") + " : $" + params[1];
					o.value = params[0];
					try
					{
						sel.add(o, null);
					}
					catch(e)
					{
						sel.add(o);
					}
					
					if (val == params[0])
					{
						sel.selectedIndex = sel.length - 1;
					document.getElementById(temp).innerHTML = params[1];
					}
				}
			}
			
		}
		if (cert_changed == true)
		{
			cert_changed = false;
			setSidesEnds();
		}
	}
}

function setOptions()
{
	xmlhttp_options = GetXmlHttpObject();
	
	if (xmlhttp_options == null)
	{
		alert ("Browser does not support HTTP Request");
		return;
	}
	
	if (has_closed_side)
	{
		if (options_loaded || (doors_set == false))
		{
			var url = "ajax_options.php";
			url = url + "?price_tier="  + price_tier;
			url = url + "&certified="  + certified.toLowerCase();
			url = url + "&width_class="  + width_class;
						
			xmlhttp_options.onreadystatechange = handleOptions;
			xmlhttp_options.open("GET", url, true);
			xmlhttp_options.send(null);
		}
		else
		{
			// need to enable doors
			for (i = 0; i < door_array.length; i++)
			{
				document.getElementById(door_array[i]).disabled = false;
			}
			doorHeightHelper();
			updateDoorPrice();
		}
	}
}

function handleOptions()
{
	if (xmlhttp_options.readyState == 4)
	{
		// handle response here
		var list = xmlhttp_options.responseText.split("\n");
		for (a = 0; a < list.length; a++)
		{
			var l = list[a].split("|");
			
			var id = l[0];
			
			for (b = 1; b < l.length; b++)
			{
				var props = l[b].split(":");
										
				var temp  = id + "_" + props[0];
				var br = false;
								
				if (document.getElementById(temp) == null)
				{
					var sel   = document.createElement('select');
					sel.name  = temp;
					sel.id    = temp;
				
					door_array.push(sel.id);
				
					document.getElementById(id).innerHTML += props[0].split("_").join(" ") + " : ";
					document.getElementById(id).appendChild(sel);
					br = true;
				}
				else
				{
					sel = document.getElementById(temp);
				}
				
				var qty = document.getElementById(temp).selectedIndex;
				
				while(sel.length > 0)
					sel.remove(sel.length - 1);
				
				for (c = 0; c < 5; c++)
				{
					var cost = parseInt(props[1]) * parseInt(c);
					
					var o = document.createElement('option');
					o.value = c;
					o.text  = c + " : $" + cost + ".00";
					
					try
					{
						document.getElementById(temp).add(o, null);
					}
					catch(e)
					{
						document.getElementById(temp).add(o);
					}
					
				}
				
				document.getElementById(temp).selectedIndex = qty;				
				if (br)
				{
					document.getElementById(id).innerHTML += "<br>\n";
				}
			}
		}
		
		doors_set = true;
		options_loaded = true;
		updateDoorPrice();
	}
	
	for (a = 0; a < door_array.length; a++)
	{
		document.getElementById(door_array[a]).onchange = doorHeight;
	}
}

function setHeight(h)
{
	height = h.value;
	if (height < Math.max(door_height, min_height))
		adjustHeight();
	else
		checkBracing();
				
	calculateSurfaceArea();
}

function checkSidesEnds()
{
	if (document.getElementById('closed_sides').value == 'open')
	{
		closed_left  = 0;
		closed_right = 0;
	}
	else
	{
		closed_left  = 1;
		closed_right = 1;
	}
	
	if (document.getElementById('closed_front').value == 'open')
	{
		closed_front = 0;
	}
	else
	{
		closed_front  = 1;
	}
	
	if (document.getElementById('closed_back').value == 'open')
	{
		closed_back = 0;
	}
	else
	{
		closed_back  = 1;
	}
	
	checkGableEnds();
	calculateSurfaceArea();
}

function checkGableEnds()
{
	var max_gables = 2 - closed_front - closed_back;
	
	if (max_gables == 0)
	{
		// document.getElementById('gable_ends').selectedIndex = 0;
		document.getElementById('gable_ends').disabled = true;
		document.getElementById('gable_ends_price').innerHTML = '0.00';
	}
	else
	{
		document.getElementById('gable_ends').disabled = false;
		if (document.getElementById('gable_ends').selectedIndex > max_gables)
		{
			document.getElementById('gable_ends').selectedIndex = max_gables;
		}
		updatePrice('gable_ends');
	}
	
}

function calculateSurfaceArea()
{
	var sa = 0;
	
	sa += closed_left  * height * length;
	sa += closed_right * height * length;
	sa += closed_front * height * width;
	sa += closed_back  * height * width;
				
	has_closed_side = 0;
	if (sa > 0)
	{
		has_closed_side = 1;
		setOptions();
	}
	else
	{
		for (i = 0; i < door_array.length; i++)
		{
			document.getElementById(door_array[i]).disabled = true;
		}
		door_height = 0;
		document.getElementById('doors_price').innerHTML = '0.00';
	}
	
	surface_area = sa;
}

function doorHeight()
{			
	var n = this.id.split("_");
	var dimensions = n[n.length - 1];
				
	n = dimensions.split("x");
	if (n.length == 2)
	{
		w = parseInt(n[0]);
		h = parseInt(n[1]);
		
		if (h > 12)
			h = Math.ceil(h / 12);
			
		h += 1;
		
		if (this.selectedIndex == 0)
			h = 0;
	}
	else
	{
		// not valid
		h = 0;
	}
	
	document.getElementById(this.id).setAttribute('door_height', h);
	
	doorHeightHelper();
	updateDoorPrice();
}

function doorHeightHelper()
{
	var dh = 0;
	for (i = 0; i < door_array.length; i++)
	{
		var th = parseInt(document.getElementById(door_array[i]).getAttribute('door_height'));
		
		if (th > dh)
			dh = th;
	}
	
	door_height = dh;
	
	if (height < Math.max(parseInt(door_height), parseInt(min_height)))
		adjustHeight();
}

function adjustHeight()
{
	var hs = document.getElementById('height');
	var mh = Math.max(door_height, min_height);
										
	if (hs.value < mh)
	{
		for (i = 0; i < hs.length; i++)
		{
			if (hs.options[i].value >= mh)
			{
				hs.selectedIndex = i;
				hs.focus();
				height = hs.options[i].value;
				// hs.blur();
				updatePrice('height');
				checkBracing();
				return;
			}
		}
	}
	
	checkBracing();
}

function checkBracing()
{
	if (height >= 8)
	{
		// 4 ft. extra bracing is required
		var eb = document.getElementById('extra_bracing');
		if ((eb.length > 1) && (eb.value != '4_foot'))
		{
			for (i = 0; i < eb.length; i++)
			{
				if (eb.options[i].value == '4_foot')
				{
					eb.selectedIndex = i;
					eb.focus();
					updatePrice('extra_bracing');
					return;
				}
			}
		}
	}
}

function updateDoorPrice()
{
	var total = 0;
	
	for (i = 0; i < door_array.length; i++)
	{
		total += parseInt(getPrice(door_array[i]));
	}
							
	document.getElementById('doors_price').innerHTML = total.toFixed(2);
}

function updateEndsPrice()
{
	var pf = parseInt(getPrice('closed_front'));
	var pb = parseInt(getPrice('closed_back'));
	
	var temp = pf + pb;
	document.getElementById('closed_ends_price').innerHTML = temp.toFixed(2);
}

function updatePrice(id)
{
	var target = id + "_price";
	var temp = parseInt(getPrice(id));
	
	if (id == 'certified')
	{
		certified = document.getElementById(id).value;
	}
	
	document.getElementById(target).innerHTML = temp.toFixed(2);
}

function getPrice(id)
{
	var e = document.getElementById(id);
	
	if (e == null)
		return 0;
	
	return extractPrice(e.options[e.selectedIndex].text);
}

function extractPrice(string)
{
	var s = string.split("$");
	if (s.length == 2)
		return s[1];
	
	return 0;
}

function updateTotal()
{
	var grand_total = 0;
	
	grand_total += parseInt(document.getElementById('base_price').innerHTML);
	grand_total += parseInt(document.getElementById('height_price').innerHTML);
	grand_total += parseInt(document.getElementById('certified_price').innerHTML);
	grand_total += parseInt(document.getElementById('closed_sides_price').innerHTML);
	grand_total += parseInt(document.getElementById('closed_ends_price').innerHTML);
	grand_total += parseInt(document.getElementById('doors_price').innerHTML);
	grand_total += parseInt(document.getElementById('gable_ends_price').innerHTML);
	grand_total += parseInt(document.getElementById('12_gauge_price').innerHTML);
	grand_total += parseInt(document.getElementById('j_trim_price').innerHTML);
	grand_total += parseInt(document.getElementById('extra_bracing_price').innerHTML);
	
	document.getElementById('total_price').innerHTML = grand_total.toFixed(2);
}

// timer function to update total
function totalTimer()
{
	// not fast enough
	setInterval("updateTotal()", 200);
}