// JavaScript Document

/*global JSON, OptItem, ParameterDef, Product, ProductConfiguration, ProductSystem, ProductType, Request, _each, _isProperty, _merge, count, first, serveurl, addEvent, $, $$, Element*/


function vatRound(n) {
	return Math.round(n*100-0.1)/100;
}

var cformatter;
function formatCurrency(n) {
	if (!cformatter) {
		cformatter=new NumFormatter({currencySymbol:ProductSystem.settings.currency.symbol});
	}
	return cformatter.format(n);
}

function getInputValue(element) {
	var type=$(element).type;
	if (type=="checkbox") {
		return !!element.checked;
	} else if (type=="select-one") {
		if (element.value==="undefined" && element.options.length>0) {
			return element.options[0].value;
		} else {
			return element.value;
		}
	}
}
/*

function updateOption() {
	var parameterid=this.retrieve("parameterid");
	var prodconfig=ProductSystem.getProductConfig(this.retrieve("productindex"));

	prodconfig.setOption(parameterid,getInputValue(this));
	DisplayProductOptions(prodconfig,parameterid);
}
function DisplayProductOptions(prodconfig,parameterid) {
	//only update those parameters following specified parameter
	var doUpdate=false;
	_each(prodconfig.product.getParameters(),function(param) {	
		if (doUpdate) {
			var prod=prodconfig.product;													  
			var fieldname=prodconfig.getInputName(param);
			var field=$(fieldname);
			if (field) {
				var value=field.value;
				var opts=prod.getOptionsFor(param.parameterid);
				if (param.data.parametertype=='opt') {
					field.empty();
					
					_each(opts,function(opt) {
						var el=new Element('option');
						el.value=opt.optid;
						el.setText(opt.optiondescription());
						el.injectInside(field);
					});
					field.value=value;
				} else if (param.data.parametertype=='bool') {
					if (opts[false]!==undefined && opts[true]!==undefined) {
						field.disabled=false;
					} else if (opts[false]!==undefined) {
						field.disabled=true;
						field.checked=false;
					} else {
						field.disabled=true;
						field.checked=true;
					}
				}
			}
		}
		if (param.parameterid==parameterid) {doUpdate=true;}
	});
	var incvatctrl=prodconfig.prefix()+'OptComboPriceInc';
	var exvatctrl=prodconfig.prefix()+'OptComboPriceEx';
	if ($(exvatctrl)) {$(exvatctrl).setText(formatCurrency(prodconfig.price()));}
	if ($(incvatctrl)) {$(incvatctrl).setText(formatCurrency(prodconfig.price()*(1+ProductSystem.vatrate)));}

}


addEvent("domready",function() {
	_each(ProductSystem.data.productconfigs,function(prodconf) {
		_each(prodconf.product.getParameters(),function(param) {
			var fieldname=prodconf.getInputName(param);
			var field=$(fieldname);
			if (field) {
				field.store("productindex",prodconf.prefix());
				field.store("parameterid",param.parameterid);
			}
		});
	});
	
	$$('.optionselect').each(function(x) {
		x.addEvent("change",updateOption);
		x.addEvent("keypress",updateOption);
		updateOption.bind(x)();
	});
	$$('.optioncheckbox').each(function(x) {
		x.addEvent("click",updateOption);
		x.addEvent("keypress",updateOption);
		updateOption.bind(x)();
	});
});*/

function displayPrice(data) {
	if (data.display && data.conf) {
		$(data.display).set("text",formatCurrency(data.conf.price()));
	}
}
function displayPriceInc(data) {
	if (data.display && data.conf) {
		$(data.display).set("text",formatCurrency(data.conf.priceInc()));
	}
}

function updateOption(el,option) {
	var id,name,desc;
	if (typeof(option)=="object") {
		id=option.optid;
		name=option.optionname;
		desc=option.optiondescription();
	}else {
		id=option;
		name=option;
		desc=option;
	}
	switch (el.get("tag")) {
		case "span": 
			el.set("text",desc);
			break;
		case "checkbox":
			el.checked=id;
			break;
		default:	
			el.value=id;
	}
}

ProductConfiguration.prototype.registerInputs=function() {
	var allInputs=[];
	var priceDisplay=$(this.prefix()+"PriceEx");
	if (priceDisplay) {
		ProductSystem.addListener(
				this.prefix(),
				"change",
				null,
				displayPrice,
				{
					conf:this,
				  	display:priceDisplay
				}
			);
	}
	var priceDisplayInc=$(this.prefix()+"PriceInc");
	if (priceDisplayInc) {
		ProductSystem.addListener(
				this.prefix(),
				"change",
				null,
				displayPriceInc,
				{
					conf:this,
				  	display:priceDisplayInc
				}
			);
	}
	var me=this;

	var selector;
	_each(this.product.getComponentGroups(),function(group) {
		var groupid=group.groupid;
		if (group.isOptional) {
			var enabler=me.getGroupEnabler(group.groupid);
			enabler=$(enabler);
			if (enabler) {
				function groupSelect() {
					if (this.checked) {
						me.setDefaultComponent(groupid);
					} else {
						me.setComponent(groupid,null);
					}
				}
				enabler.addEvent("click",groupSelect);
				enabler.addEvent("keypress",groupSelect);
				enabler.addEvent("initialize",groupSelect);
				allInputs.push(enabler);
			}
		}
		_each(group.getComponents(),function(component) {
			var componentid=component.componentid;
			component=me.getComponent(groupid,componentid);
			selector=me.getComponentSelector(groupid,componentid);
			
			selector=$(selector);
			if (selector) {
				function compSelect() {
					if (this.checked) {
					me.setComponent(groupid,componentid);
				}
				}
				selector.addEvent("click",compSelect);
				selector.addEvent("keypress",compSelect);
				selector.addEvent("initialize",compSelect);
				allInputs.push(selector);
				
				var optarea=$(component.prefix()+"Options");
				var subarea=$(component.prefix()+"Subcomponents");

				(function(selector,enabler,optarea,subarea) {
					function compSelected() {
						selector.checked="checked";
						if (optarea) {
							//optarea.show();
						}
						if (subarea) {
							//subarea.show();
						}
						if (enabler) {
							enabler.checked="checked";
						}
					}
					function compUnselected() {
						selector.checked="";
						if (optarea) {
							//optarea.hide();
						}
						if (subarea) {
							//subarea.hide();
						}
					}
					component.addEvent("select",compSelected);
					component.addEvent("unselect",compUnselected);
				})(selector,enabler,optarea,subarea);
			}
			
		});

	});

	_each(this.product.getParameters(),function(param,parameterid) {
		if (param.isChoice()) {
			var input=$(me.getInputName(param));
			if (input) {
				(function(input,compconf,parameterid) {
					function changeOption(e) {
						$(this).highlight();
						var opt=getInputValue(this);
						if (opt!==undefined) 
							compconf.setOption(parameterid,opt);
					}
					switch (input.get("tag")) {
						case "select" :
							input.addEvent("change",changeOption);
							break;
						case "input" :
							input.addEvent("click",changeOption);
							break;
					}
					input.addEvent("initialize",changeOption);
					allInputs.push(input);
					
					function updateOptList(data) {
						if (data.parameterid==parameterid) {

							if (input.get("tag")=="select") {
								rebuildSelect(input,compconf,parameterid);
							} else if (input.type=="checkbox") {
								rebuildCheckbox(input,compconf,parameterid);
							} else if (input.tagName=="fieldset") {
								rebuildRadios(input,compconf,parameterid);
							}
						}
						
					}
					compconf.addEvent("optlistchange",updateOptList);
	
					function displayOption() {
						updateOption(input,compconf.getFullOption(parameterid));
					}
					compconf.addEvent("change",displayOption);
			  })(input,me,parameterid);
			}
		}
	});
	if (true) { //apply all inputs, in case the browser has updated them behind the scenes
		_each(allInputs,function(el) {
			el.fireEvent("initialize");
		});
	}
};
function rebuildSelect(selectbox,prodconf,parameterid) {
	var current=selectbox.value;
	var newopts=prodconf.getCurrentOptions(parameterid);
	selectbox.empty();
	newopts.each(function(opt) {
		var el=new Element("option");
		el.value=opt.optid;
		el.set("text",opt.optiondescription());
		el.inject(selectbox);
	});
	selectbox.value=current;
}
function rebuildCheckbox(checkbox,prodconf,parameterid) {
	var current=checkbox.checked;
	var opts=prodconf.getCurrentOptions(parameterid);
	if (opts.length>1) {
		checkbox.readonly="";
		checkbox.disabled="";
		checkbox.checked=current;
	} else {
		checkbox.readonly="disabled";
		checkbox.disabled="disabled";
		checkbox.checked=opts[0];
	}
}
function rebuildRadios(fieldset,prodconf,parameterid) {
	
}

