function contains(thisArray, element)
{
	for (var i = 0; i < thisArray.length; i++)
	{
		if (thisArray[i] == element)
		{
			return true;
		}
	}
	return false;
}

var dependancies = [];
var mutex = [];

var sum_price = [];
var activate_threshold = [];
var requires = [];
var requires_not = [];
var sold_out = [];
var info_fields = [];
var check_one = [];
var no_cancel = [];

var paid = 0;

var disabled = [];
var checked = [];
var forced = [];

var elements = [];

function apply_constraints()
{
	disabled.length = 0;
	checked.length = 0;
	forced.length = 0;
	
	
	for(var key in dependancies)
	{
		for(var value in dependancies[key])
		{
			set_dependency(dependancies[key][value], key);
		}
	}
	
	for(var key in mutex)
	{
		set_mutex(mutex[key]);
	}
	
	
	set_sold_out();
	set_requires();
	set_requires_not();
	set_activate_threshold();
	set_check_one();
	set_no_cancel();
	
	var sum = 0;
	var changed = false;
	
	for(var element in elements)
	{	
		if(contains(forced, element))
		{
			changed = !document.getElementById(element).checked || changed;
			document.getElementById(element).checked = true;
			document.getElementById(element).disabled = false;
		}
		else if(contains(disabled, element))
		{
			changed = document.getElementById(element).checked || changed;
			document.getElementById(element).checked = false;
			document.getElementById(element).disabled = true;
		}
		else if(contains(checked, element))
		{
			changed = !document.getElementById(element).checked || changed;
			document.getElementById(element).checked = true;
			document.getElementById(element).disabled = false;
		}
		else
		{
			document.getElementById(element).disabled = false;
		}
		
		if(document.getElementById(element).checked)
		{
			var price = elements[element];
			sum += price;
		}
	}
	
	
	
	var paymentElement = document.getElementById("payment");
	var returnElement = document.getElementById("return");
	var multiElement = document.getElementById("multisale");
	
	if(multiElement != null && returnElement != null)
	{
		if(isNaN(multiElement.value) || multiElement.value == "" || multiElement.value < 0)
			multiElement.value = 1;
		
		var multiplier = parseInt(multiElement.value);
		sum *= multiplier;
	}
	
	document.getElementById("totalprice").innerHTML = sum.toFixed(2);
	if(paid > 0)
		document.getElementById("grandtotal").innerHTML = (sum - paid).toFixed(2);
	
	if(paymentElement != null && returnElement != null)
	{
		if(isNaN(paymentElement.value) || paymentElement.value == "")
			paymentElement.value = 0;
			
		var payment = parseFloat(paymentElement.value);
		returnElement.innerHTML = (-sum + paid + payment).toFixed(2);
	}
	
	set_info_fields();
	
	set_display_sum_price();
	
	
	

	

	
	
	
	
	var count = 0;
	if(document.getElementById("product57").checked)
		count++;
	if(document.getElementById("product58").checked)
		count++;
	if(document.getElementById("product59").checked)
		count++;
		
	var gopherElement = document.getElementById("gopher");
	var stewardElement = document.getElementById("steward");
	var gopherEmail = document.getElementById("gopher_email");
	
	if(gopherElement && stewardElement && gopherEmail)
	{
		if(count<2)
		{
			document.getElementById("gopher").checked = false;
			document.getElementById("gopher").disabled = true;
			document.getElementById("steward").checked = false;
			document.getElementById("steward").disabled = true;
		}
		else
		{
			var steward = document.getElementById("steward").checked;
			var gopher = document.getElementById("gopher").checked;
			
			document.getElementById("gopher").disabled = steward;
			document.getElementById("steward").disabled = gopher;
		}
		
		document.getElementById("gopher_email").disabled = !(document.getElementById("gopher").checked || document.getElementById("steward").checked);
	}
	
	if(changed)
		apply_constraints();
}

function is_checked(element)
{
	return contains(checked, element) || document.getElementById(element).checked;
}

function is_disabled(element)
{
	return contains(disabled, element);
}

function set_check_one()
{
	for(var i in check_one)
	{
		products = check_one[i];
		take_action = false;
		for(var j in products)
		{
			element = products[j];
			if(!is_disabled(element))
				take_action = true;
			if(is_checked(element))
			{
				take_action = false;
				break;
			}
		}
		
		if(take_action)
		{
			for(var j in products)
			{
				element  = products[j];
				if(!is_disabled(element))
				{
					checked.push(element);
					break;
				}
			}
		}
	}
}

function set_dependency(target, dependant)
{
	if(!is_checked(target))
		disabled.push(dependant);
}

function set_info_fields()
{
	for(var product in info_fields)
	{
		fieldlist = info_fields[product];
		for(var i in fieldlist)
		{
			document.getElementById(fieldlist[i]).disabled = !document.getElementById(product).checked;
		}
	}
}

function set_mutex(thisMutex)
{
	var checked = "";
	for(var i in thisMutex)
	{
		if(is_checked(thisMutex[i]))
			checked = thisMutex[i];
	}
	
	if(checked != "")
	{
		for(var i in thisMutex)
		{
			if(!is_checked(thisMutex[i]))
			{
				disabled.push(thisMutex[i]);
			}
		}
	}
	// else
	// {
		// for(var i in thisMutex)
		// {
			// document.getElementById(thisMutex[i]).disabled = false;
		// }
	// }
}

function set_display_sum_price()
{
	for(var category in sum_price)
	{
		var sum = 0;
		for(var product in sum_price[category])
		{
			if(document.getElementById(product).checked)
			{
				var price = sum_price[category][product];
				sum += price;
			}
		}
		document.getElementById("price"+category).innerHTML = "&#8364; "+sum.toFixed(2);
	}
}

function set_activate_threshold()
{
	for(var i in activate_threshold)
	{
		product = activate_threshold[i];
		var count = 0;
		for(var j in product[2])
		{
			if(is_checked(product[2][j]))
				count+=1;
		}
		
		if(count>=product[1])
		{
			checked.push(product[0]);
		}
		else
		{
			disabled.push(product[0]);
		}
	}
}

function set_requires()
{
	for(var i in requires)
	{
		product = requires[i];
		var count = 0;
		for(var j in product[2])
		{
			if(is_checked(product[2][j]))
				count+=1;
		}
		
		if(count<product[1])
		{
			disabled.push(product[0]);
		}
	}
}

function set_requires_not()
{
	for(var i in requires_not)
	{
		product = requires_not[i];
		var count = 0;
		for(var j in product[2])
		{
			if(is_checked(product[2][j]))
				count+=1;
		}
		
		if(count>=product[1])
		{
			disabled.push(product[0]);
		}
	}
}

function set_sold_out()
{
	for(var i in sold_out)
	{
		product = sold_out[i];
		disabled.push(product);
	}
}

function set_no_cancel()
{
	for(var i in no_cancel)
	{
		product = no_cancel[i];
		forced.push(product);
	}
}

function add_dependency(dependant, depends_on)
{
	if(typeof(dependancies[dependant]) == 'undefined')
		dependancies[dependant] = [];
	dependancies[dependant].push(depends_on);
}

function add_disabled(id)
{
	//alert("Adding disabled product");
	sold_out.push(id);
}

function add_mutex(group)
{
	mutex.push(group);
}

function add_display_sum_price(category, product, price)
{
	if(typeof(sum_price[category]) == 'undefined')
		sum_price[category] = [];
	sum_price[category][product] = price;
}

function add_activate_threshold(product, threshold, group)
{
	activate_threshold.push([product, threshold, group]);
}

function add_requires(product, threshold, group)
{
	requires.push([product, threshold, group]);
}

function add_requires_not(product, threshold, group)
{
	requires_not.push([product, threshold, group]);
}

function add_check_one(group)
{
	check_one.push(group);
}

function add_no_cancel(product)
{
	no_cancel.push(product);
}

function jump(elmnt,content, nextelement){
	if (content.length==elmnt.maxLength)
	{
		next=elmnt.tabIndex
		if (next<document.forms[0].elements.length)
		{
			document.getElementById(nextelement).focus()
		}
	}
	document.getElementById('redeemvoucher').checked = true;
}

function add_info_field(product, info_field)
{
	if(typeof(info_fields[product]) == 'undefined')
		info_fields[product] = [];
	info_fields[product].push(info_field);
}

function on_other_country()
{
	if(document.getElementById('country').value=="Other")
		document.getElementById('country_other').disabled = false;
	else
		document.getElementById('country_other').disabled = true;
}

function select_all(id)
{
    document.getElementById(id).focus();
    document.getElementById(id).select();
}

