var products = new Array();
var selectedInputs = new Array();

function pageLoaded()
{
	var inputs = document.getElementById("maincontent").getElementsByTagName("input");
	for(var i=0; i<inputs.length; i++)
	{
		if(inputs[i].type != null && inputs[i].type == "radio")
		{
			inputs[i].onclick = function(){ recalculate(this); };
		}
	}
	loadRankings();
	fireSelectedElements();
}

function loadRankings()
{
	var rankInfo = document.getElementById("rankingInfo").value;
	//<productID>-<rankingID>-<ranking>_
	var chunks = rankInfo.split("_");
	for(var i=0; i<chunks.length; i++)
	{
		if(chunks[i].length > 0)
		{
			loadRanking(chunks[i]);
		}
	}
}

function loadRanking(chunk)
{
	var parts = chunk.split("-");
	var productID = parts[0];
	var product = null;
	
	if(products[productID] == null)
	{
		product = new Product();
		product.setProductID(productID);
		products[product.getProductID()] = product;
	}
	else
	{
		product = products[productID];
	}

	var ranking = new Ranking();
	ranking.setRankingID(parts[1]);
	ranking.setRanking(parts[2]);
	
	product.addRanking(ranking);
}

function Product()
{
	var productID;
	var rankings;
	var deviation;
	
	this.productID = -1;
	this.rankings = new Array();
	this.deviation = 0;
	
	this.getProductID = getProductID;
	this.setProductID = setProductID;
	
	this.getRanking = getRanking;
	this.addRanking = addRanking;
	
	this.getDeviation = getDeviation;
	this.setDeviation = setDeviation;
	this.adjustDeviation = adjustDeviation;
	
	function getProductID(){ return this.productID; }
	function setProductID(value){ this.productID = value; }
	
	function getRankings(){ return this.rankings; }
	function setRankings(value){ this.rankings = value; }
	
	function getRanking(value){ return this.rankings[value]; }
	function addRanking(value){ this.rankings[value.getRankingID()] = value; }
	
	function getDeviation(){ return this.deviation; }
	function setDeviation(value){ return this.deviation; }
	function adjustDeviation(value) { this.deviation += value; }
}

function Ranking()
{
	var rankingID;
	var ranking;	
	
	this.rankingID = -1;
	this.ranking = -1;
	
	this.getRankingID = getRankingID;
	this.setRankingID = setRankingID;
	
	this.getRanking = getRanking;
	this.setRanking = setRanking;
	
	this.printRanking = printRanking;
	
	function getRankingID(){ return this.rankingID; }
	function setRankingID(value){ this.rankingID = value; }
	
	function getRanking(){ return this.ranking; }
	function setRanking(value) { this.ranking = value; }
	
	function printRanking()
	{
		alert("ranking: \nproductID: "+this.productID + "\nrankingID: "+this.rankingID+"\nranking: " + this.ranking);
	}
}

function recalculate(ipt)
{
	var resultsDiv = document.getElementById("resultsDiv");
	removeAllChildNodes(resultsDiv); //strip the results
	
	var prevRankingValue = 0;
	
	//check our cache for currently selected values
	if(selectedInputs[ipt.name] != null || ipt.value == 0) 
	{
		if(selectedInputs[ipt.name] != null) { prevRankingValue = selectedInputs[ipt.name].value; }
	}
	
	selectedInputs[ipt.name] = (ipt.value == 0) ? null : ipt;
	
	//need to get the first row of this element.
	var row = ipt.parentNode.parentNode;
	var firstCell = row.getElementsByTagName("td")[0];
	var rankingIDEle = firstCell.getElementsByTagName("input")[0];
		
	for(var i in products)
	{
		var product = products[i];
		var ranking = product.getRanking(rankingIDEle.value);
		
		//subtract off the previous deviation
		if(prevRankingValue > 0)
		{
			product.adjustDeviation(-1 * Math.abs(ranking.getRanking() - prevRankingValue)); 
		}
		
		//add the new deviation, but not if N/A is selected
		if(ipt.value > 0)
		{
			product.adjustDeviation(Math.abs(ranking.getRanking() - ipt.value));
		}
	}
	
	var deviations = new Array(countElements(products));
	var devCount = 0;
	
	//get the deviation of all products
	for(var i in products)
	{
		deviations[devCount++] = parseInt(products[i].getDeviation());
	}
	
	var found = false;
	for(var i in selectedInputs)
	{
		if(selectedInputs[i] != null && selectedInputs[i].value > 0){ found = true; }
	}
	
	if(!found){ hideElement(resultsDiv); }
	else { showBlockElement(resultsDiv); }
	
	//sort all deviations in ascending order
	deviations.sort(function(a, b){ return a-b; });
	
	var h3 = document.createElement("h3");
	h3.innerHTML = "BASED ON YOUR SELECTIONS, WE RECOMMEND THE FOLLOWING PRODUCTS (IN THE ORDER PRESENTED): ";
	resultsDiv.appendChild(h3);
	
	var winners = new Array(6);
	for(var i=0; i<6; i++)
	{
		//pick the top 3 products
		for(var j in products)
		{
			if(products[j].getDeviation() == deviations[i])
			{
				if(winners[0] != products[j] && winners[1] != products[j] && winners[2] != products[j] && winners[3] != products[j] && winners[4] != products[j] && winners[5] != products[j])
				{
					winners[i] = products[j];
					var productDiv = getProductDiv(products[j].getProductID());
					var clone = productDiv.cloneNode(true);
					resultsDiv.appendChild(clone);
					break;
				}
			}
		}
	}
}

function getProductDiv(pID)
{
	return document.getElementById("product-" + pID);
}

function fireSelectedElements()
{
	var inputs = document.getElementById("maincontent").getElementsByTagName("input");
	for(var i=0; i<inputs.length; i++)
	{
		var ipt = inputs[i];
		if(ipt.type == "radio" && ipt.onclick != null && ipt.value > 0 && ipt.checked)
		{
			ipt.onclick();
		}
	}
}