var NutritionCalculator = Class.create(CustomSelect, {
	initialize: function(selectIDs, options) {
		this.currentValues = {};
		this.selectIDs = selectIDs;
		this.options = options;
		this.startObserve();
		this.productExtras = {};
		this.emptyMenu = true;
		this.menuItems = 0;
		$('nutPortion').nutValue = 0
		$('nutCarbonhydrate').nutValue = 0
		$('nutProtein').nutValue = 0
		$('nutKcal').nutValue = 0
		$('nutSugar').nutValue = 0
		$('nutFat').nutValue = 0;
	},
	load: function() {
		this.updateProductValues();
	},
	startObserve: function(){
		this.selectIDs.each(function(selectID){
			document.observe("dCS:"+selectID+":change", function(event) {
				this.updateProductValues();
			}.bind(this));
		}.bind(this));
	},
	updateProductValues: function(){
		this.selectIDs.each(function(s){
			this.currentValues[s] = $(s).options[$(s).selectedIndex].value;
		}.bind(this));
		this.updateProducts();
	},
	updateProducts: function(){
		var nc = this;
		var pB = '';
		this.selectIDs.each(function(selectID){
			pB += selectID+'='+this.currentValues[selectID]+'&';
		}.bind(this)); 
		//console.log(pB);
		new Ajax.Request(this.options.productURL, {
			method: 'post',
			postBody: pB,
			onCreate: function(){
				$(nc.options.productBoxId).update(new Element('img', {'src':'/bkProductsPlugin/images/calculator/loading.gif', 'alt':''}));
			},
			onSuccess: function(transport) {
				$(nc.options.productBoxId).update(transport.responseText);
				//CSBfleXcroll(nc.options.productBoxId);
				nc.updateFlexcroll();
			}
		});
	},
	updateFlexcroll: function(){
		if($(this.options.productBoxFxId).scrollUpdate) $(this.options.productBoxFxId).scrollUpdate();
		if($(this.options.menuOverviewBoxFxId).scrollUpdate) $(this.options.menuOverviewBoxFxId).scrollUpdate();
		/* if(Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 6) {
			DD_belatedPNG.fix('#myMenuDBList li ul.extraList li a, #myMenuDBList li img, #myMenuDBList li a.removeLink');
			try {
				document.execCommand("BackgroundImageCache", false, true);
			} catch(err) {}
		} */
	},
	addExtras: function(extras) {
		extras.each(function(e){
			this.productExtras[e.id] = e;
		}.bind(this));
		//console.log(this.productExtras);
	},
	addProduct: function(p) {
		if(p.extras.length) {
			var extraArray = ''
			extraArray = p.extras;
			var i = 0;
			extraArray.each(function(e){
				extraArray[i] = Object.clone(this.productExtras[e]);
				i++;
			}.bind(this));
			p.extras = extraArray;
		}
		if(!this.menuItems) {
			//first product, need to build whole list & update
			$(this.options.menuOverviewBoxId).update(new Element('ul', {'id':'myMenuDBList'}));
		}
		var newListItem = this.buildmenuListItem(p);
		//console.log(newListItem);
		$('myMenuDBList').insert(newListItem[0]);
		this.startEventhandlers(newListItem[1]);
		//this.buildmenuListItem(p)
		this.menuItems++;
		//CSBfleXcroll(this.options.menuOverviewBoxId);
		//console.log(p);
		this.updateNutritionTableAdd(p.nutrition, 1);
		this.updateFlexcroll();
	},
	buildmenuListItem: function(p) {
		var listItem = new Element('li', {'id':p.id+'_'+this.menuItems+'_li', 'class':'productItem'});
		//$('myMenuDBList').insert(listItem);
		//listItem.setStyle({backgroundImage: 'url('+p.imagepath+')'});
		listItem.insert(new Element('img', {'src':p.imagepath, 'alt':'', 'height':'83'}));
		listItem.product = p;
		//listItem.nutrition = p.nutrition
		var extraList = new Element('ul', {'id':p.id+'_'+this.menuItems+'_el', 'class':'extraList'});
		var imItem = new Element('li', {'class':'im'});
		imItem.insert(new Element('a', {'href':'#','id':p.id+'_'+this.menuItems+'_li_dp','rel':p.id+'_'+this.menuItems+'_li'}).update('-'));
		imItem.insert(new Element('a', {'href':'#','id':p.id+'_'+this.menuItems+'_li_ip','rel':p.id+'_'+this.menuItems+'_li'}).update('+'));
		imItem.insert(new Element('span', {'class':'a', 'id':p.id+'_'+this.menuItems+'_li_a'}).update('1'));
		imItem.insert(new Element('span', {'class':'t'}).update(p.name));
		extraList.insert(imItem);
		//console.log(p.extras);
		p.extras.each(function(extra) {
			extraItem = new Element('li', {'id':p.id+'_'+this.menuItems+'_'+extra.id+'_ei', 'class':'extraItem'});
			extraItem.insert(new Element('a', {'href':'#','class':'del','rel':p.id+'_'+this.menuItems+'_'+extra.id+'_ei,'+p.id+'_'+this.menuItems+'_li'}).update('-'));
			extraItem.insert(new Element('a', {'href':'#','class':'iel','rel':p.id+'_'+this.menuItems+'_'+extra.id+'_ei,'+p.id+'_'+this.menuItems+'_li'}).update('+'));
			extraItem.insert(new Element('span', {'class':'a', 'id':p.id+'_'+this.menuItems+'_'+extra.id+'_ei_a'}).update('0'));
			extraItem.insert(new Element('span', {'class':'t'}).update(extra.name));
			extraItem.extra = extra;
			//extraItem.nutrition = extra.nutrition
			extraList.insert(extraItem);
			//console.log(extraList);
		}.bind(this));
		listItem.insert(extraList);
		listItem.insert(new Element('a', {'href':'#','id':p.id+'_'+this.menuItems+'_li_rp','rel':p.id+'_'+this.menuItems+'_li', 'class':'removeLink'}).update('entfernen'));
		return [listItem, p.id+'_'+this.menuItems+'_li'];
	},
	startEventhandlers: function(dadId){
		t = this;
		//inc/dec/rem prod
		Event.observe(dadId+'_ip', 'click', function(e){e.stop();t.increaseProduct($(dadId+'_ip').rel)});
		Event.observe(dadId+'_dp', 'click', function(e){e.stop();t.decreaseProduct($(dadId+'_dp').rel)});
		Event.observe(dadId+'_rp', 'click', function(e){e.stop();t.removeProduct($(dadId+'_rp').rel)});
		//inc/dec extra
		$$('#'+dadId+' a.del').each(function(l){
			var lr = l.rel.split(',');
			Event.observe(l, 'click', function(e){e.stop();t.decreaseExtra(lr[0], lr[1])});
		});
		$$('#'+dadId+' a.iel').each(function(l){
			var lr = l.rel.split(',');
			Event.observe(l, 'click', function(e){e.stop();t.increaseExtra(lr[0], lr[1])});
		});
	},
	removeProduct: function(id){
		this.updateNutritionTableSub($(id).product.nutrition, $(id).product.amount);
		$(id).remove();
		this.updateFlexcroll();
	},
	updateNutritionTableAdd: function(nutObj, multi) {
		$('nutPortion').nutValue = ((parseFloat($('nutPortion').nutValue)) + nutObj.portion*multi);
		$('nutCarbonhydrate').nutValue = ((parseFloat($('nutCarbonhydrate').nutValue)) + nutObj.carbonhydrate*multi);
		$('nutProtein').nutValue = ((parseFloat($('nutProtein').nutValue)) + nutObj.protein*multi);
		$('nutKcal').nutValue = ((parseFloat($('nutKcal').nutValue)) + nutObj.kcal*multi);
		$('nutSugar').nutValue = ((parseFloat($('nutSugar').nutValue)) + nutObj.sugar*multi);
		$('nutFat').nutValue = ((parseFloat($('nutFat').nutValue)) + nutObj.fat*multi);
		
		$('nutPortion').innerHTML = this.formatNumber($('nutPortion').nutValue/1000);
		$('nutCarbonhydrate').innerHTML = this.formatNumber($('nutCarbonhydrate').nutValue/1000);
		$('nutProtein').innerHTML = this.formatNumber($('nutProtein').nutValue/1000);
		$('nutKcal').innerHTML = this.formatNumber($('nutKcal').nutValue/1000);
		$('nutSugar').innerHTML = this.formatNumber($('nutSugar').nutValue/1000);
		$('nutFat').innerHTML = this.formatNumber($('nutFat').nutValue/1000);
	},
	updateNutritionTableSub: function(nutObj, multi) {
		$('nutPortion').nutValue = ((parseFloat($('nutPortion').nutValue)) - nutObj.portion*multi);
		$('nutCarbonhydrate').nutValue = ((parseFloat($('nutCarbonhydrate').nutValue)) - nutObj.carbonhydrate*multi);
		$('nutProtein').nutValue = ((parseFloat($('nutProtein').nutValue)) - nutObj.protein*multi);
		$('nutKcal').nutValue = ((parseFloat($('nutKcal').nutValue)) - nutObj.kcal*multi);
		$('nutSugar').nutValue = ((parseFloat($('nutSugar').nutValue)) - nutObj.sugar*multi);
		$('nutFat').nutValue = ((parseFloat($('nutFat').nutValue)) - nutObj.fat*multi);
		
		$('nutPortion').innerHTML = this.formatNumber($('nutPortion').nutValue/1000);
		$('nutCarbonhydrate').innerHTML = this.formatNumber($('nutCarbonhydrate').nutValue/1000);
		$('nutProtein').innerHTML = this.formatNumber($('nutProtein').nutValue/1000);
		$('nutKcal').innerHTML = this.formatNumber($('nutKcal').nutValue/1000);
		$('nutSugar').innerHTML = this.formatNumber($('nutSugar').nutValue/1000);
		$('nutFat').innerHTML = this.formatNumber($('nutFat').nutValue/1000);
	},
	formatNumber: function(zahl) {
		
		if(!/^\d+(\.+)?([\d]{0,2})?$/.test(zahl)) {
			return zahl;
		}
		
		var fullInt = zahl
		var strlen = zahl.length;
		
		//console.log(fullInt+': '+strlen);
		if(String(fullInt).indexOf('.') > 0) { 
			fullInt = parseInt(String(fullInt).split('.')[0]); 
			strlen = parseInt(String(fullInt).split('.')[0].length);
		}
		
		//console.log(fullInt+': '+strlen);
		if(strlen>3) {
			var intArray = new Array();
			while(fullInt.length>3) {
				//console.log(fullInt, fullInt.substr((fullInt.length-3), 3), fullInt.substring(0, (fullInt.length-3)));
				intArray.push(fullInt.substr((fullInt.length-3), 3));
				fullInt = fullInt.substring(0, (fullInt.length-3));
			}
			intArray.push(fullInt);
			intArray.reverse();
			fullInt = intArray.join('.');
			//console.log(fullInt);
		}
		if(String(zahl).split('.').length > 1) {
			strlen = String(zahl).split('.')[1].length;
			if(strlen == 1) {
				return fullInt + ',' + String(zahl).split('.')[1];
			} else if(strlen==2) {
				return fullInt + ',' + String(zahl).split('.')[1];
			}
		} else {
			return fullInt;
		}
	},
	increaseProduct: function(id) {
		if($(id).product.amount<1000) {
			$(id).product.amount += 1;
			this.updateNutritionTableAdd($(id).product.nutrition, 1);
			$(id+'_a').innerHTML = parseInt($(id+'_a').innerHTML) + 1;
		}
	},
	decreaseProduct: function(id) {
		if($(id).product.amount) {
			$(id).product.amount -= 1;
			this.updateNutritionTableSub($(id).product.nutrition, 1);
			$(id+'_a').innerHTML = parseInt($(id+'_a').innerHTML) - 1;
		}
	},
	increaseExtra: function(id, pid) {
		if($(id).extra.amount<1000) {
			$(id).extra.amount += 1;
			$(id+'_a').innerHTML = parseInt($(id+'_a').innerHTML) + 1;
			this.updateNutritionTableSub($(pid).product.nutrition, $(pid).product.amount);
			$(pid).product.nutrition.portion += $(id).extra.nutrition.portion;
			$(pid).product.nutrition.carbonhydrate += $(id).extra.nutrition.carbonhydrate;
			$(pid).product.nutrition.protein += $(id).extra.nutrition.protein;
			$(pid).product.nutrition.kcal += $(id).extra.nutrition.kcal;
			$(pid).product.nutrition.sugar += $(id).extra.nutrition.sugar;
			$(pid).product.nutrition.fat += $(id).extra.nutrition.fat;
			this.updateNutritionTableAdd($(pid).product.nutrition, $(pid).product.amount);
		}
	},
	decreaseExtra: function(id, pid) {
		if($(id).extra.amount) {
			$(id).extra.amount -= 1;
			$(id+'_a').innerHTML = parseInt($(id+'_a').innerHTML) - 1;
			this.updateNutritionTableSub($(pid).product.nutrition, $(pid).product.amount);
			$(pid).product.nutrition.portion -= $(id).extra.nutrition.portion;
			$(pid).product.nutrition.carbonhydrate -= $(id).extra.nutrition.carbonhydrate;
			$(pid).product.nutrition.protein -= $(id).extra.nutrition.protein;
			$(pid).product.nutrition.kcal -= $(id).extra.nutrition.kcal;
			$(pid).product.nutrition.sugar -= $(id).extra.nutrition.sugar;
			$(pid).product.nutrition.fat -= $(id).extra.nutrition.fat;
			this.updateNutritionTableAdd($(pid).product.nutrition, $(pid).product.amount);
		}
	},
	initOverview: function(print) {
		var products = [];
		$$('#myMenuDBList li.productItem').each(function(elem){
			//console.log(elem.product);
			products.push(elem.product);
		});
		menuNutrition = {
			'portion':($('nutPortion').innerHTML),
			'carbonhydrate':($('nutCarbonhydrate').innerHTML),
			'protein':($('nutProtein').innerHTML),
			'kcal':($('nutKcal').innerHTML),
			'sugar':($('nutSugar').innerHTML),
			'fat':($('nutFat').innerHTML)
		};
		//console.log(Object.toJSON(menuNutrition));
		var pB = 'json='+Object.toJSON(products)+'&sum='+Object.toJSON(menuNutrition);
		if(print) pB += '&print=true';
		this.NTLayer = new Layer(this.options.NTLayerURL, {
			width: 		967,
			topOffset:	111,
			leftOffset: -487,
			overlay:	true,
			objBody:	$$('body')[0],
			centerOffset: true,
			select: false,
			method: 'post',
			postBody: pB
		});
	}
});