function Configurators_init()
{
	if(document.getElementById)
	{
		for (var i = 0; i < ConfiguratorsArray.length; i++)
		{
			Configurators_setUpConfigurator(ConfiguratorsArray[i]);
		}
	}
}


// Shows or hides the options on a particular item.
function Configurators_toggleOptions(element) {

	var options = element.parentNode.parentNode.getElementsByTagName('DIV')[3];
	options.style.display = options.style.display == '' ? 'inline' : '';
}


// Increases the quantity of items to be included
// in the configuration.
function increaseQuantity(element) {
	// Get the hidden input element which stores the quantity
	var hidden	= element.parentNode.getElementsByTagName('INPUT')[1];

	// Get the maximum quantity for this item
	var max		= element.parentNode.getElementsByTagName('INPUT')[2];
	
	// Get the span tag which displays the quantity
	var span	= element.parentNode.getElementsByTagName('SPAN')[0];
	
	if(parseFloat(hidden.value) < parseFloat(max.value)) {
	
		// get this item's price element
		var price	= element.parentNode.parentNode.getElementsByTagName('p')[1].childNodes[0];
		var priceValue = price.innerHTML.replace(price.innerHTML.substr(0,1), '').replace(',','');	
		var unitPrice = parseFloat(priceValue) / parseFloat(hidden.value);	

		price.childNodes[0].nodeValue = Configurators_addMoney(price.innerHTML, unitPrice);		
	
		// Increment both the hidden and visible values
		hidden.value = parseFloat(hidden.value) + 1;
		span.childNodes[0].nodeValue = parseFloat(span.innerHTML) + 1;

		// Update the master price
		var totalElement = document.getElementById('configuratorTotalSpan');
		totalElement.childNodes[0].nodeValue = Configurators_addMoney(totalElement.innerHTML, unitPrice);

		var totalElementAlt = document.getElementById('configuratorTotalAltSpan');

		totalElementAlt.innerHTML = totalElement.innerHTML;

	}
	
	return false;
}


// Decreases the quantity of items to be included
// in the configuration.
function decreaseQuantity(element) {

	// Get the hidden input element which stores the quantity
	var hidden	= element.parentNode.getElementsByTagName('INPUT')[1];
	
	// Get the span tag which displays the quantity
	var span	= element.parentNode.getElementsByTagName('SPAN')[0];

	// Don't let quantity go lower than 1.
	if(parseFloat(hidden.value) > 1) {
	
		// get this item's price element
		var price	= element.parentNode.parentNode.getElementsByTagName('p')[1].childNodes[0];
		var priceValue = price.innerHTML.replace(price.innerHTML.substr(0,1), '').replace(',','');		
		var unitPrice = parseFloat(priceValue) / parseFloat(hidden.value);	
		price.childNodes[0].nodeValue = Configurators_subtractMoney(price.innerHTML, unitPrice);	
	
		// Decrement both the hidden and visible values
		hidden.value = parseFloat(hidden.value) - 1;
		span.childNodes[0].nodeValue = parseFloat(span.innerHTML) - 1;
		
		// Update the master price
		var totalElement = document.getElementById('configuratorTotalSpan');
		totalElement.childNodes[0].nodeValue = Configurators_subtractMoney(totalElement.innerHTML, unitPrice);	
		
		var totalElementAlt = document.getElementById('configuratorTotalAltSpan');

		totalElementAlt.innerHTML = totalElement.innerHTML;		
	}
	
	return false;
}


function Configurators_setUpConfigurator(id)
{
	var configurator = document.getElementById(id);
	
	if(configurator)
	{
		var divs = configurator.getElementsByTagName("div");
		var paras = configurator.getElementsByTagName("p");
		var totalElement = null;
		var totalElementAlt = null;		
		var resetElement = null;
		var printElement = null;
		var printElementAlt = null;

		//find the total element
		for(var i = 0; i < paras.length; i++)
		{
			switch(paras[i].className)
			{
				case "configuratorTotal":
					var spans = paras[i].getElementsByTagName("span");
					totalElement = spans[0].firstChild;
					break;
				case "configuratorTotalAlt":
					var spans = paras[i].getElementsByTagName("span");
					totalElementAlt = spans[0].firstChild;
					break;					
				case "configuratorReset":
					var inputs = paras[i].getElementsByTagName("input");
					resetElement = inputs[0];
					break;
				case "configuratorPrint":
					var links = paras[i].getElementsByTagName("a");
					printElement = links[0];
					break;
				case "configuratorPrintAlt":
					var links = paras[i].getElementsByTagName("a");
					printElementAlt = links[0];
					break;					
				default:
					break;
			}
			
			if(totalElement != null && resetElement != null && printElement != null && printElementAlt != null && totalElementAlt != null)
			{
				break;
			}
		}
		
		var items = new Array();
		for(var i = 0; i < divs.length; i++)
		{
			if(divs[i].className == "configuratorItem")
			{
				Configurators_setUpItem(divs[i], totalElement);
				
				items[items.length] = divs[i];
			}
		}
		
		var totalElement = document.getElementById('configuratorTotalSpan');;
		var totalElementAlt = document.getElementById('configuratorTotalAltSpan');;

		totalElementAlt.innerHTML = totalElement.innerHTML;
		
		resetElement.items = items;
		printElement.items = items;
		printElementAlt.items = items;
	}
}

function Configurators_setUpItem(itemDiv, totalElement)
{
	// get the display elements
	var divs = itemDiv.getElementsByTagName("div");
	var paras = itemDiv.getElementsByTagName("p");
	var inputs = itemDiv.getElementsByTagName("input");
	
	var imgElement = null;
	var nameElement = null;
	var descElement = null;
	var priceElement = null;
	var selectedIndexElement = null;
	var imgLink = null;
	var infoLink = null;
	
	var optionsDiv = null;
	
	for(var i = 0; i < divs.length; i++)
	{
		switch(divs[i].className)
		{
			case "itemImg":
				imgElement = divs[i].getElementsByTagName('img')[0];
				break;
			case "itemOptions":
				optionsDiv = divs[i];
				break;
			default:
				break;
		}
		
		if(imgElement != null  && optionsDiv != null)
		{
			break;
		}
	}
	
	for(var i = 0; i < paras.length; i++)
	{
		switch(paras[i].className)
		{
			case "productName":
				nameElement = paras[i].firstChild;
				break;
			case "productDescription":
				descElement = paras[i].firstChild;
				break;
			case "productPrice":
				var spans = paras[i].getElementsByTagName("span");
				priceElement = spans[0].firstChild;
				break;
			case "productLinks":
				var links = paras[i].getElementsByTagName("a");
				imgLink = links[0];
				infoLink = links[1];
				break;
			default:
				break;
		}
		
		if(nameElement != null && descElement != null && priceElement != null && imgLink != null && infoLink != null)
		{
			break;
		}
	}
		
	// get the hidden input for selectedIndexElement
	for(var i = 0; i < inputs.length; i++)
	{
		// Loop through all the input elements
		// and select the one with a 'hiddenField' class
		if(inputs[i].className == "hiddenField") {
		
			selectedIndexElement = inputs[i];
		}
		// Break out of the loop if we've assigned
		// the selectedIndexElement
		if(selectedIndexElement != null)
		{
			break;
		}
	}
	
	//attach references to the display element to the itemDiv
	itemDiv.imgElement = imgElement;
	itemDiv.nameElement = nameElement;
	//itemDiv.descElement = descElement;
	itemDiv.priceElement = priceElement;
	itemDiv.selectedIndexElement = selectedIndexElement;
	itemDiv.imgLink = imgLink;
	itemDiv.infoLink = infoLink;
	itemDiv.totalElement = totalElement;
	
	//attach references to their current values to the itemDiv
	itemDiv.currentImgSrc = imgElement.src;
	itemDiv.currentName = nameElement.nodeValue;
	//itemDiv.currentDesc = descElement.nodeValue;
	itemDiv.currentPrice = priceElement.nodeValue;
	//itemDiv.currentInfoUrl = moreInfoElement.nodeValue;
	//itemDiv.currentImgUrl = imgLink.href;
	
	//cycle over the options in the list
	// attach the itemDiv to each and apply an itemIndex
	// also get the id of each option from the hidden field	
	var optLinks= optionsDiv.getElementsByTagName("a");
	var inputs = optLinks[0].getElementsByTagName("input");
	itemDiv.defaultOption = inputs[0];
	
	for(var i = 0; i < optLinks.length; i++)
	{
		var inputs = optLinks[i].getElementsByTagName("input");
		var selectButton = optLinks[i].parentNode.getElementsByTagName('span')[3];
		var button = inputs[0];
		var idField = inputs[1];
		
		selectButton.itemIndex = i;
		selectButton.productId = idField.value;
		selectButton.parentItem = itemDiv;
		
		button.itemIndex = i;
		button.productId = idField.value;
		button.parentItem = itemDiv;
		
		if(optLinks[i].className.indexOf("optionLinkSelected") != -1)
		{
			itemDiv.selectedOption = button;
		}
		
		if(optLinks[i].className.indexOf("default") != -1)
		{
			defaultFound = true;
			itemDiv.defaultOption = button;
		}
	}
	
	itemDiv.defaultOption.imgSrc = itemDiv.currentImgSrc;
	itemDiv.defaultOption.nameText = itemDiv.currentname;
	itemDiv.defaultOption.descText = itemDiv.currentDesc;
	itemDiv.defaultOption.priceText = itemDiv.currentPrice;
	itemDiv.defaultOption.infoUrl = itemDiv.currentInfoUrl;
	itemDiv.defaultOption.imgUrl = itemDiv.currentImgUrl;
}

function Configurators_optionMouseover(obj, name, desc, price, imgSrc, imgUrl, infoUrl)
{
	//attach the parameters to the object as references
	
	if(document.getElementById)
	{
		if(!obj.nameText) //if any are present all are
		{
			obj.nameText	= name;
			obj.descText	= desc;
			obj.priceText	= price;
			obj.imgSrc		= imgSrc;
			obj.imgUrl		= imgUrl;
			obj.infoUrl		= infoUrl;
			
			//set up onclick and mouseout
			/*if(document.all)
			{
				obj.attachEvent("onclick", Configurators_optionClick);
				obj.attachEvent("onmouseout", Configurators_optionMouseout);
			}
			else if(document.getElementById)
			{
				obj.addEventListener("click", Configurators_optionClick, false);
				obj.addEventListener("mouseout", Configurators_optionMouseout, false);
			}*/
		}
			
		//carry out the display change
		obj.parentItem.nameElement.nodeValue = obj.nameText;
		//obj.parentItem.descElement.nodeValue = obj.descText;
		
		//alert(obj.priceText);
		
		obj.parentItem.priceElement.nodeValue = obj.priceText;
		//obj.parentItem.imgElement.src = obj.imgSrc;
		//obj.parentItem.imgElement.alt = obj.nameText;
		//obj.parentItem.infoLink.className = "disabled";
		//obj.parentItem.imgLink.className = "disabled";
		//obj.parentItem.infoLink.href = "#";
		//obj.parentItem.imgLink.href = "#";
		
		//change the total
		var total = obj.parentItem.totalElement.nodeValue;
		var subTotal = Configurators_subtractMoney(total, obj.parentItem.currentPrice);
		var sumTotal = Configurators_addMoney(subTotal, obj.priceText);

		obj.parentItem.totalElement.nodeValue = sumTotal;
		
		var totalElementAlt = document.getElementById('configuratorTotalAltSpan');

		totalElementAlt.innerHTML = sumTotal;		
	}
	
}

function Configurators_optionMouseout(event)
{

	var eventSrc = (event.srcElement) ? event.srcElement : (event.target) ? event.target : null;
	var toElement = (event.relatedTarget) ? event.relatedTarget : (event.toElement) ? event.toElement : null;

	//if(eventSrc != null && toElement != null) return;
	//if(eventSrc != null && toElement != null) return;
	
	//alert('after');

	while(toElement != eventSrc && toElement && toElement.nodeName && toElement.nodeName != "BODY")
	{
		toElement = toElement.parentNode;
	}
	
	
	//if(toElement == eventSrc) return;

	eventSrc.parentItem.nameElement.nodeValue = eventSrc.parentItem.currentName;
	//eventSrc.parentItem.descElement.nodeValue = eventSrc.parentItem.currentDesc;
	eventSrc.parentItem.priceElement.nodeValue = eventSrc.parentItem.currentPrice;
	//eventSrc.parentItem.imgElement.src = eventSrc.parentItem.currentImgSrc;
	//eventSrc.parentItem.imgElement.alt = eventSrc.parentItem.currentName;
	//eventSrc.parentItem.imgLink.href = eventSrc.parentItem.currentImgUrl;
	//eventSrc.parentItem.infoLink.href = eventSrc.parentItem.currentInfoUrl;
	//eventSrc.parentItem.infoLink.className = "";
	//eventSrc.parentItem.imgLink.className = "";
	
	//change the total
	var total = eventSrc.parentItem.totalElement.nodeValue;
	var subTotal = Configurators_subtractMoney(total, eventSrc.priceText);
	var sumTotal = Configurators_addMoney(subTotal, eventSrc.parentItem.currentPrice);
	eventSrc.parentItem.totalElement.nodeValue = sumTotal;
	
	var totalElementAlt = document.getElementById('configuratorTotalAltSpan');

	totalElementAlt.innerHTML = sumTotal;			
}

function Configurators_optionClick(event)
{    
	// Get the source of the event, i.e. the input image button
	var eventSrc = (event.srcElement) ? event.srcElement : (event.target) ? event.target : null;
	
	if (eventSrc.nodeType == 3) 
	{
		eventSrc = eventSrc.parentNode;
	}
	
	// Should we submit to the server?
	var shouldSubmit = true;
	
	//alert(eventSrc.parentItem.imgElement);
		
	if(eventSrc != null && eventSrc.tagName == 'INPUT')
	{
		// Reset the quantities to one (default)
		ResetQuantities(eventSrc);
	
		//highlight the clicked item
		//eventSrc.parentItem.selectedOption.parentNode.className = "";
		//eventSrc.parentNode.className = "selected";
		eventSrc.parentItem.selectedOption = eventSrc;
		
		//display the correct text
		eventSrc.parentItem.nameElement.nodeValue = eventSrc.nameText;
		//eventSrc.parentItem.descElement.nodeValue = eventSrc.descText;
		eventSrc.parentItem.priceElement.nodeValue = eventSrc.priceText;
		eventSrc.parentItem.imgElement.src = eventSrc.imgSrc;
		eventSrc.parentItem.imgElement.alt = eventSrc.nameText;
		//eventSrc.parentItem.imgLink.href = eventSrc.imgUrl;
		//eventSrc.parentItem.infoLink.href = eventSrc.infoUrl;
		//eventSrc.parentItem.infoLink.className = "";
		//eventSrc.parentItem.imgLink.className = "";
		
		//specify that the current values have been selected
		eventSrc.parentItem.currentImgSrc = eventSrc.imgSrc;
		eventSrc.parentItem.currentName = eventSrc.nameText;
		//eventSrc.parentItem.currentDesc = eventSrc.descText;
		eventSrc.parentItem.currentPrice = eventSrc.priceText;
		eventSrc.parentItem.currentInfoUrl = eventSrc.infoUrl;
		eventSrc.parentItem.currentImgUrl = eventSrc.imgUrl;
		
		//set the selected index field
		// WHAT'S THIS??!!
		eventSrc.parentItem.selectedIndexElement.value = eventSrc.itemIndex;
		
		//change the total
		var total = eventSrc.parentItem.totalElement.nodeValue;
		var subTotal = Configurators_subtractMoney(total, eventSrc.parentItem.currentPrice);
		var sumTotal = Configurators_addMoney(subTotal, eventSrc.priceText);
		//eventSrc.parentItem.totalElement.nodeValue = sumTotal;
				
		var totalElementAlt = document.getElementById('configuratorTotalAltSpan');

		totalElementAlt.innerHTML = sumTotal;						
		
		eventSrc.parentNode.parentNode.parentNode.parentNode.style.display = '';
		
		shouldSubmit = false;
	}

	if(eventSrc != null && eventSrc.tagName == 'SPAN')
	{
		// Reset the quantities to one (default)
		ResetQuantities(eventSrc);
	
		//highlight the clicked item
		//eventSrc.parentItem.selectedOption.parentNode.className = "";
		//eventSrc.parentNode.className = "selected";
		eventSrc.parentItem.selectedOption = eventSrc;
		
		//display the correct text
		eventSrc.parentItem.nameElement.nodeValue = eventSrc.nameText;
		//eventSrc.parentItem.descElement.nodeValue = eventSrc.descText;
		eventSrc.parentItem.priceElement.nodeValue = eventSrc.priceText;
		eventSrc.parentItem.imgElement.src = eventSrc.imgSrc;
		eventSrc.parentItem.imgElement.alt = eventSrc.nameText;
		//eventSrc.parentItem.imgLink.href = eventSrc.imgUrl;
		//eventSrc.parentItem.infoLink.href = eventSrc.infoUrl;
		//eventSrc.parentItem.infoLink.className = "";
		//eventSrc.parentItem.imgLink.className = "";
		
		//specify that the current values have been selected
		eventSrc.parentItem.currentImgSrc = eventSrc.imgSrc;
		eventSrc.parentItem.currentName = eventSrc.nameText;
		//eventSrc.parentItem.currentDesc = eventSrc.descText;
		eventSrc.parentItem.currentPrice = eventSrc.priceText;
		eventSrc.parentItem.currentInfoUrl = eventSrc.infoUrl;
		eventSrc.parentItem.currentImgUrl = eventSrc.imgUrl;
		
		//set the selected index field
		// WHAT'S THIS??!!
		eventSrc.parentItem.selectedIndexElement.value = eventSrc.itemIndex;
		
		//change the total
		var total = eventSrc.parentItem.totalElement.nodeValue;
		var subTotal = Configurators_subtractMoney(total, eventSrc.parentItem.currentPrice);
		var sumTotal = Configurators_addMoney(subTotal, eventSrc.priceText);
		//eventSrc.parentItem.totalElement.nodeValue = sumTotal;
		
		var totalElementAlt = document.getElementById('configuratorTotalAltSpan');
		totalElementAlt.innerHTML = sumTotal;		

		eventSrc.parentNode.parentNode.parentNode.style.display = '';
		
		shouldSubmit = false;
	}
	
	return shouldSubmit;
}

function ResetQuantities(eventSrc) {

	// Get the hidden input element which stores the quantity
	var hidden	= eventSrc.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('INPUT')[2];

	// Get the span tag which displays the quantity
	var span	= eventSrc.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('SPAN')[1];
	
	//Get the span that holds the max for this product
	var productMax = eventSrc.parentNode.getElementsByTagName('SPAN')[4];
	
	if (productMax == null)
	{
		productMax = eventSrc.parentNode.parentNode.getElementsByTagName('SPAN')[4];
	}

	//Get the input which stores the current max
	var currentMax	= eventSrc.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('INPUT')[3];

	if (currentMax == null)
	{
		currentMax = eventSrc.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('INPUT')[3];
	}

	//Copy in the max
	currentMax.value = productMax.innerHTML;
	
	//Hide the quantity div if needed
	var divs = eventSrc.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('DIV');
	
	for(var i = 0; i < divs.length; i++)
	{
		if (divs[i].className == "productQuantity")
		{
			quantitySpan = divs[i];
			
			break;
		}
	}
	
	if (currentMax.value > 1)
	{
		quantitySpan.style.display = '';
	}
	else
	{
		quantitySpan.style.display = 'none';
	}

	// Subtract the price from the overall price
	if(hidden.value > 1){
		
		//change the total
		var total = eventSrc.parentItem.totalElement.nodeValue;
		var subTotal = Configurators_subtractMoney(total, eventSrc.priceText);
		var sumTotal = Configurators_addMoney(subTotal, eventSrc.parentItem.currentPrice);
	
		var totalElement = document.getElementById('configuratorTotalSpan');
		var totalElementAlt = document.getElementById('configuratorTotalAltSpan');
				
		var format1 = new NumberFormat(eventSrc.parentItem.currentPrice);
		format1.justNumber();
		
		var price = parseFloat(format1.toFormatted()) * parseFloat(hidden.value);
		var subtracted = Configurators_subtractMoney(totalElement.innerHTML, price);
		
		totalElement.childNodes[0].nodeValue = Configurators_addMoney(subtracted, eventSrc.parentItem.currentPrice);

		totalElementAlt.innerHTML = totalElement.innerHTML;
	}
	
	// Set them both to 1, the default value
	hidden.value	= 1;
	span.innerHTML	= 1;
}

function Configurators_resetClick(obj)
{
	var currentUrl = unescape(window.location.pathname);
	
	window.location.replace(currentUrl);
	
	/*
	var total = "0";
	//alert("resetting");
	//alert(obj.items.length);
	for(var i = 0; i < obj.items.length; i++)
	{
		
		//if(obj.items[i].selectedOption.nameText)
		//{
			obj.items[i].selectedOption.parentNode.className = "";
			obj.items[i].defaultOption.parentNode.className = "selected";
			obj.items[i].selectedOption = obj.items[i].defaultOption;
			obj.items[i].imgElement.src = obj.items[i].defaultOption.imgSrc;
			obj.items[i].nameElement.nodeValue = obj.items[i].defaultOption.nameText;
			obj.items[i].priceElement.nodeValue = obj.items[i].defaultOption.priceText;
			//obj.items[i].descElement.nodeValue = obj.items[i].defaultOption.descText;
			obj.items[i].selectedIndexElement = obj.items[i].defaultOption.itemIndex;
			//alert(obj.items[i].defaultOption.itemIndex);
			//obj.items[i].infoLink.href = obj.items[i].defaultOption.infoUrl;
			//obj.items[i].imgLink.href = obj.items[i].defaultOption.imgUrl;
			
			total = Configurators_addMoney(total, obj.items[i].defaultOption.priceText);
		//}
		//else
		//{
			//total = Configurators_addMoney(total, obj.items[i].priceElement.nodeValue);
			//alert(obj.items[i].priceElement.nodeValue);
		//}		
	}
	
	obj.items[0].totalElement.nodeValue = total;
	return false;
	*/
}

function Configurators_printClick(obj)
{
	var url = "/print/products/";
	for(var i = 0; i < obj.items.length; i++)
	{
		url += obj.items[i].selectedOption.productId + "~" + 1 + "|";
	}
	//trim the trailing |
	url = url.substr(0, url.lastIndexOf("|"));
	window.open(url, "printWindow", "width=600,height=600");
	return false;
}

function Configurators_addMoney(addTo, add)
{
	var symbol = addTo.substr(0, 1);
	var format1 = new NumberFormat(addTo);
	var format2 = new NumberFormat(add);
	format1.justNumber();
	format2.justNumber();
	format1.setSeparators(false);
	format2.setSeparators(false);
		
	var addToNum = parseFloat(format1.toFormatted());
	var addNum = parseFloat(format2.toFormatted());
	var total = addToNum + addNum;
	
	var finalFormat = new NumberFormat(total);
	finalFormat.setPlaces(2);
	finalFormat.setSeparators(true);
	
	return symbol + finalFormat.toFormatted();
}

function Configurators_subtractMoney(subtractFrom, subtract)
{
	var symbol = subtractFrom.substr(0, 1);
	var format1 = new NumberFormat(subtractFrom);
	var format2 = new NumberFormat(subtract);
	format1.justNumber();
	format2.justNumber();
	format1.setSeparators(false);
	format2.setSeparators(false);
	
	var subtractFromNum = parseFloat(format1.toFormatted());
	var subtractNum = parseFloat(format2.toFormatted());
	var total = subtractFromNum - subtractNum;
	
	var finalFormat = new NumberFormat(total);
	finalFormat.setPlaces(2);
	finalFormat.setSeparators(true);

	return symbol + finalFormat.toFormatted();
}

function Configurators_OpenPopup(clientID)
{
	window.open(document.getElementById(clientID).parentNode.parentNode.currentInfoUrl,'popup','toolbar=no,menubar=no, scrollbars=yes, resizable=yes, width=550,height=500');
}
