﻿// 
var arraySelectedItems;

/// <summary>
/// Calculates the order's price.
/// </summary>
/// <returns>Returns the order's price.</returns>
function CalculatePrice()
{
	// local variables
	var found;
	var hd;
	var price;

	// initialization
	price = 0;

	// traverse the elements
	for(var i = 0; i < arraySelectedItems.length; ++i)
	{
		// initialization
		found = false;

		// traverse the element items
		for(var j = 0; j < arraySelectedItems[i].length && !found; ++j)
		{
			// check if it is selected and it is an option
			if(arraySelectedItems[i][j] && arrayType[i][j] == 'option')
			{
				// add the price and indicate that it was found
				if(hd = document.getElementById("hd" + i + "_" + j))
				{
					found = true;
					price += parseFloat(hd.value);
				}
			}
		}
	}

	return price;
}

/// <summary>
/// Calculates the order's shipping.
/// </summary>
/// <returns>Returns the order's shipping.</returns>
function CalculateShipping()
{
    return document.getElementById("spanShipping").innerHTML == "Free" ? 0 : parseFloat(document.getElementById("spanShipping").innerHTML.substring(1));
}

/// <summary>
/// Returns the specified element item's title
/// </summary>
/// <param name="indexElement">The element's index.</param>
/// <param name="indexElementItem">The element item's index.</param>
/// <returns>The specified element item's title.</returns>
function GetElementItemTitle(indexElement, indexElementItem)
{
	// local variables
	var span
	var text;

	// initialization
	if(span = document.getElementById("span" + indexElement + "_" + indexElementItem))
		text = span.innerHTML;
	else
		text = "";

	// change uppercase HTML tags to lowercase
	while(text.indexOf("B>") != -1)
		text = text.replace("B>", "b>");

	// remove price
	text = text.substring(0, text.indexOf(" <b>["));

	// format title HTML
	text = "<span style='display: block;'>&nbsp;-&nbsp;" + text + "</span>";

	return text;
}

/// <summary>
/// Displays the element with the selected index.
/// </summary>
/// <param name="index">The element's index.</param>
function ShowElement(indexElement)
{
	// local variables
	var div;
	var hyplnk;
	var i;
	var imgLarge;
	var imgSmall;

	// initialization
	i = 0;

	// hide all elements
	while((hyplnk = document.getElementById("a" + i))
			&& (div = document.getElementById("div" + i))
			&& (imgLarge = document.getElementById("imgLarge" + i))
			&& (imgSmall = document.getElementById("imgSmall" + i)))
	{
		if(i == indexElement)
		{
			// show the selected element
			hyplnk.className = "elementSelected";
			div.className = "element";
			imgLarge.className = "elementUnselected";
			imgSmall.className = "elementSelected";
		}
		else
		{
			// hide the unselected element
			hyplnk.className = "elementUnselected";
			div.className = "elementHidden";
			imgLarge.className = "elementSelected";
			imgSmall.className = "elementUnselected";
		}

		// increment
		++i;
	}
}

/// <summary>
/// Updates the selected items array.
/// </summary>
function UpdateArraySelectedItems()
{
	// local variables
	var rb;

	// initialization
	arraySelectedItems = new Array();

	// traverse the elements
	for(var indexElement = 0; indexElement < arrayType.length; ++indexElement)
	{
		// initialization
		arraySelectedItems[indexElement] = new Array();

		// traverse the element items and check if selected
		for(var indexElementItem = 0; rb = document.getElementById("rb" + indexElement + "_" + indexElementItem); ++indexElementItem)
			arraySelectedItems[indexElement][indexElementItem] = rb.checked;
	}
}

/// <summary>
/// Updates the order.
/// </summary>
function UpdateOrder()
{
	// local variables
	var details;
	var price;
	var quantity;
	var shipping

	// update the selected items array
	this.UpdateArraySelectedItems();

	// initialization
	details = this.UpdatePrices();
	price = this.CalculatePrice();
	quantity = parseInt(document.getElementById("txtQuantity").value);
	shipping = this.CalculateShipping();

	// update order details
	document.getElementById("divDetails").innerHTML = details;
	document.getElementById("spanPrice").innerHTML = "$" + price.toFixed(2);
	document.getElementById("txtPrice").value = price.toFixed(2); // remove
	document.getElementById("spanSubtotal").innerHTML = "$" + ((price * quantity) + shipping).toFixed(2);
}

/// <summary>
/// Updates all of the element items' prices.
/// </summary>
/// <return>Returns the order's details.</returns>
function UpdatePrices()
{
	// local variables
	var details;
	var hd;
	var indexChecked;
	var indexElementItem;
	var rb;

	// initialization
	details = "";

	// traverse the elements
	for(var indexElement = 0; document.getElementById("div" + indexElement); ++indexElement)
	{
		// initialization
		indexChecked = -1;

		// traverse the element items to find the checked element item and update the details
		for(indexElementItem = 0; (rb = document.getElementById("rb" + indexElement + "_" + indexElementItem)) && (hd = document.getElementById("hd" + indexElement + "_" + indexElementItem)); ++indexElementItem)
		{
			// if checked, get details and save index
			if(rb.checked)
			{
				// save checked index
				indexChecked = indexElementItem;

				// get details if the price is not zero or it's not the first item
				if(parseFloat(hd.value) > 0 || indexElementItem > 0)
					details += this.GetElementItemTitle(indexElement, indexElementItem);
			}
		}

		// 
		for(var i = 0; i < indexElementItem; ++i)
		{
			if(arrayType[indexElement][i] == 'option')
				this.UpdateOption(indexElement, i);
			else if(arrayType[indexElement][i] == 'product')
				this.UpdateProduct(indexElement, i);
		}

		// update "add" / "subtract" / "included" text
		for(var j = 0; j < indexElementItem; ++j)
			this.UpdatePriceLabel(indexChecked == j, indexElement, j, document.getElementById("hd" + indexElement + "_" + indexChecked).value);
	}

	return details;
}

/// <summary>
/// 
/// </summary>
/// <param name="indexElement"></param>
/// <param name="indexOption"></param>
function UpdateOption(indexElement, indexOption)
{
	// local variables
	var value;

	// initialization
	value = arrayPrice[indexElement][indexOption];

	for(var i = 0; i < arrayPrice.length; ++i)
	{
		for(j = 0; j < arrayPrice[i].length; ++j)
		{
			if(arrayType[i][j] == "product")
			{
				if(arrayPrice[i][j].length > 0)
				{
					if(arraySelectedItems[i][j])
					{
						if(arrayPrice[i][j].length > indexElement)
						{
							value += arrayPrice[i][j][indexElement][indexOption];
						}
					}
				}
			}
		}
	}

	// set radio button value
	
	document.getElementById("hd" + indexElement + "_" + indexOption).value = value;
}

function UpdateProduct(indexElement, indexProduct)
{
	// local variables
	var value;

	// initialization
	value = 0;

//	for(var i = 0; i < arrayType.length; ++i)
//	{
//		for(var j = 0; j < arrayType[i].length; ++j)
//		{
//			if(arrayType[i][j] == "option" && arraySelectedItems[i][j])
//			{
//				for(var k = 0; k < arrayPrice[indexElement][indexProduct].length; ++k)
//				{
//					for(var m = 0; m < arrayPrice[indexElement][indexProduct][k].length; ++m)
//					{
//						if(document.getElementById("rb" + indexElement + "_" + indexProduct).value == document.getElementById("
//					}
//				}
//			}
//		}
//	}



	for(var element = 0; element < arrayPrice[indexElement][indexProduct].length; ++element)
	{
		for(var option = 0; option < arrayPrice[indexElement][indexProduct][element].length; ++option)
		{
			if(arraySelectedItems[element][option])
			{
				value += arrayPrice[indexElement][indexProduct][element][option];
			}
		}
	}

	// set radio button value
	document.getElementById("hd" + indexElement + "_" + indexProduct).value = value;
}

function UpdatePriceLabel(checked, indexElement, indexElementOption, price)
{
	// local variables
	var text;
	var value;

	// initialization
	text = document.getElementById("span" + indexElement + "_" + indexElementOption).innerHTML;
	value = document.getElementById("hd" + indexElement + "_" + indexElementOption).value - price;

	// add beginning information
	while(text.indexOf("B>") != -1)
		text = text.replace("B>", "b>");
	text = text.substring(0, text.indexOf(" <b>["));
	text += " <b>[";

	// display contents within the brackets
	if(checked)
	{
		text += "Included in Price";
	}
	else
	{
		if(value < 0)
		{
			text += "subtract $";
			value *= -1;
		}
		else
		{
			text += "add $";
		}

		value = value.toFixed(2);
		text += value;
	}

	// add ending information
	text += "]</b>";
	document.getElementById("span" + indexElement + "_" + indexElementOption).innerHTML = text;
}