/**
 * AJAX Eventhandler für das Quickorder Formular
 * ICO GmbH 2009
 */

//counter für eindeutige item ids
var count = 0;
//container für die enthaltenen Items
var items = new Object();

//Die URL zum AJAX backend
var backendScript = "/quickorder_backend.php";

//Versandkosten der akutellen Auswahl
var shipCost = 0;
//Kosten für die Zahlungsweise der aktuellen Auswahl
var payCost = 0;
//Gutschrift per Gutschein
var voucherDiff = 0;
//Array mit den verwendeten discount klassen
var usedDiscounts = null;
//Produktpreis nach Gutschein/Discount Anwendung
var productsPrice = 0;
//reiner Warenwert ohne weitere Anpassungen
var productsPriceWOVoucher = 0;
//Gesamtpreis der aktuellen Auswahl
var overallPrice = 0;
//Enthaltene Steuern
var taxSum = 0;
//Kosten für eine evtl. Geschenkverpackung
var giftWrapAmount = 0;
//Fehlerflag für eingegebene Gutscheincodes
var voucher_error = false;

//Anzahl der Items in der aktuellen Order
var itemsInCart = 0;
//Attributkonflikte werden hier gesammelt
var attribErrors = new Object();

//flag ob ein login vorhanden ist oder nicht
var newCustomer = false;

/**
 * Product Bean - repräsentiet ein Produkt durch Id, Menge und gewählte Attribute
 * productAttributes ist ein Array von Attribut Beans
 */
function Product(productId, productQuantity, productAttributes){
	this.id = productId;
	this.quantity = productQuantity;
	this.attributes = productAttributes;
}

/**
 * Attribut Bean - Ein Attribut ID und Attributwert ID Paar
 */
function Attribute(attributeId, attributeValueId){
	this.id = attributeId;
	this.valueId = attributeValueId;
}

/**
 * Utility zur Ausgabe von Preisen
 */
function formatPrice(price){
	return parseFloat(price).toFixed(2).toString().replace('\.', ",") + " €";
}

/**
 * Utility zur Erstellung einer Tabellenzeile mit zwei Spalten
 * die einfach nur Text enthält
 */
function createTr(leftText, rightText, trId, beforeTr, tdbgcolor){
	var tr = document.createElement('tr');
	tr.id = trId;
	var td1 = document.createElement('td');
	if(tdbgcolor != ""){ td1.style.backgroundColor = tdbgcolor; }
	td1.appendChild(document.createTextNode(leftText));
	var td2 = document.createElement('td');
	if(tdbgcolor != ""){ td2.style.backgroundColor = tdbgcolor; }
	td2.appendChild(document.createTextNode(rightText));
	tr.appendChild(td1);
	tr.appendChild(td2);
	beforeTr.insert({before: tr});
}

/** this function adds a generic item to a table
 * @param tableId the element id of the table that holds the items as trs
 * @param header the title of the Item to create
 * @param baseCategories the categories to populate the products from. All subcategories will be merged.
 * @param doFlatten if false, one level of <optgroup> elements is used to structure the select box
 * @param preSelect a productId to preSelect (e.g. for session recovery)
 */
function add_item(tableId, header, baseCategories, doFlatten, preSelect){

	var myTr = document.createElement('tr');
	var myId = 'Item' + count;
	myTr.id = myId;
	myTr.getProduct = function(){
		var atts = new Array();
		$('pData'+myId).getElementsBySelector('select[id^="pAttSel'+myId+'"]').each(function(item){
			this.push(new Attribute(item.id.substring(item.id.lastIndexOf('.')+1), item.value));
		}, atts);
		return new Product($('pSel'+myId).value, $('pQuanSel'+myId).value, atts);
	};
	var myTd = document.createElement('td');
	myTr.appendChild(myTd);
	
	var params = {itemId: myId, title: header};
	var template = new Template($('itemTemplate').innerHTML);
	Element.insert(myTd,  template.evaluate(params));

	$(tableId).appendChild(myTr);
	populateProducts(myId, baseCategories, doFlatten, preSelect);
	items[myId] = myTr;
	
	count++;
}

/** 
 * remove item with this id from the list
 * @param id the item to remove
 */
function remove_item(id){
	var my_tr = $(id);

	$('productsTable').removeChild(my_tr);
	items[id] = null;
	itemsChanged();
}

/** 
 * this function loads the requested products from the backend and populates the given select box
 * @param itemId the element id of the item to populate
 * @param catIds a '_' seperated string of category ids to use for population
 * @param flatten do full category flattening (@see #add_item)
 * @param preSelect @see #add_item
 */
function populateProducts(itemId, catIds, flatten, preSelect){
	var sel = $('pSel'+itemId);
	//create AJAX request using prototype library
	new Ajax.Request(backendScript,
	{
		method:'get',
		parameters: {mode: 'getProducts', catIds: catIds, flatten: flatten},
		onSuccess: function(transport){
			var json = transport.responseText.evalJSON();
			//got result - create select options depending on flatten
			if(!flatten){
				//create optgroups
				for(var cat in json){
					var og = document.createElement('optgroup');
					og.label = cat;
					sel.appendChild(og);
					//add options
					for(var prodId in json[cat]){
						var opt = document.createElement('option');
						opt.innerHTML = json[cat][prodId];
						opt.label = opt.innerHTML;
						opt.value = prodId;
						//if preSelect is given check if it is this item and select it
						if(preSelect && prodId == preSelect.id){
							opt.selected = true;
						}
						og.appendChild(opt);
					}
				}
			} else {
				//if all is flat, we just create options
				for(var prodId in json){
					var opt = document.createElement('option');
					opt.innerHTML = json[prodId];
					opt.label = opt.innerHTML;
					opt.value = prodId;
					//if preSelect is given check if it is this item and select it
					if(preSelect && prodId == preSelect.id){
						opt.selected = true;
					}
					sel.appendChild(opt);
				}
			}
		},
		onFailure: function(){ 
			sel.disabled = true;
			var opt = document.createElement('option');
			opt.text = 'could not load product list...';
			sel.appendChild(opt);
		}
	});
	//finally, if we had a preSelection given we need to fire the select's onChange ourselves
	//this means loading attributes and that
	if(preSelect != null && typeof(preSelect) != "undefined" && preSelect.id != ""){
		loadProductInfo(itemId, preSelect.id, preSelect);
	}
}

/**
 * lädt Produktinformationen (Attribute, Preis) zu einem Produkt und trifft eine eventuelle Vorauswahl
 * @param itemId das Quickorder Item in dem die Informationen angezeigt werden sollen
 * @param productId die Produkt ID des Produkts für das die Info geladen wird
 * @param preSelectProd ein Product Bean das dieses Item darstellen soll
 */
function loadProductInfo(itemId, productId, preSelectProd){
	if(productId == "" || typeof(productId) == "undefined" || itemId == "" || typeof(itemId) == "undefined"){
		return;
	}
	
	//clean old attribs first
	$('pData'+itemId).getElementsBySelector('div[id^="pAtt'+itemId+'"]').invoke('remove');
	//wenn im warenkorb ein produkt mit mehr als 5 einheiten liegt muss die liste der preise entsprechend verlängert werden
	var limit = (preSelectProd && preSelectProd.quantity > 5) ? (preSelectProd.quantity + 2) : 5;
	
	new Ajax.Request(backendScript,
	{
		method:'get',
		parameters: {mode: 'getProductInfo', productId: productId, quantity: limit},
		onSuccess: function(transport){
			var json = transport.responseText.evalJSON();
			//Attributauswahlfelder erstellen
			for(var attId in json.atts){
				//für jedes Attribut ein <div> erstellen
				//var tr = document.createElement('tr');
				var div = document.createElement('div');

				//tr.appendChild(td);

				div.id = 'pAtt'+itemId+'.'+attId;
				//div.style.verticalAlign = "top";				
				var text = document.createTextNode(json.atts[attId].name);
				var br = document.createElement('br');
				div.appendChild(text);
				div.appendChild(br);
				//ein dropdown für das Attribut anlegen
				var select = document.createElement('select');
				select.id = 'pAttSel'+itemId+'.'+attId;
				select.name = productId + "_" + attId;
				//den eventhandler für block-Überprüfung registrieren
				select.onchange = function(){
					attribChanged(itemId);
				};
				
				//für jede Attribut-Value eine option anlegen
				for(var attValId in json.atts[attId].values){
					var opt = document.createElement('option');
					opt.value = attValId;
					if(json.atts[attId].name == "Dioptrien" && parseFloat(json.atts[attId].values[attValId]) > 0){
						opt.innerHTML = '+' + json.atts[attId].values[attValId];
					} else {
						opt.innerHTML = json.atts[attId].values[attValId];
					}
					//falls diese AttValId im preSelectProd ist => selected
					if(preSelectProd && preSelectProd.attributes[attId].valueId == attValId){
						opt.selected = true;
					}
					select.appendChild(opt);
				}
				
				div.appendChild(select);
				//vor dem Preis <td> einfügen
				$('pAttTd'+itemId).insert({ top : div});

			}
			//das Bild aktualisieren
			$('pImg'+itemId).src = '/img/products/tn/tn-'+json.img;
			//und die Preise anzeigen
			$('pQuanSel'+itemId).childElements().invoke('remove');
			
			//Das Preis/Menge Dropdown mit limit vielen vielfachen füllen
			for(var i = 1; i < limit+1; i++){
				var opt = document.createElement('option');
				opt.value = i;
				opt.innerHTML = i + ' St. ' + (i>0 ? formatPrice(json.price[i-1]*i) : formatPrice('0,00'));
				if(preSelectProd && preSelectProd.quantity == i){
					opt.selected = true;
				} else if(!preSelectProd && i == 1){
					opt.selected = true;
				}
				$('pQuanSel'+itemId).appendChild(opt);
				$('pQuanSel'+itemId).disabled = false;
			}
			//und den info link setzen
			var pInfo = $('pInfo'+itemId);
			//pInfo.href="javascript:doPopup('productinfo_popup.php/p_id/"+productId+"', 'LinsenPlatz')";
			pInfo.onclick = new Function("javascript:doPopup('/productinfo_popup.php/p_id/"+productId+"')");
			
			//und die tax note setzen
			$('taxNote'+itemId).innerHTML = json.tax_note;

			//geladene attIDs auf konflikte checken
			attribChanged(itemId, true);
			
			//attribs und preise sind geladen. d.h. wir können das produkt zum ersten mal zum backend schreiben
			if(preSelectProd == null || !preSelectProd || preSelectProd.id == ""){
				itemsChanged();
			}
		},
		onFailure: function(){ 
			//Im Fehlerfall schreiben wir eine Fehlermeldung ins <td>
			var td = document.createElement('td');
			td.id = 'pAtt'+itemId+'.';
			var text = document.createTextNode('error loading attributes for product ' + productId);
			td.appendChild(text);
			$('pData'+itemId).appendChild(td);
		}
	});
}

/**
 * Eventhandler für Attributwerte. Falls sich Attributwerte für ein Item verändern wird die neue Kombination
 * auf Konflikte gecheckt
 */
function attribChanged(itemId, isInit){
	var p = items[itemId].getProduct();
	//in diesem Array alle ValIds sammeln und dann ans backend schicken
	var attValIds = new Array(1);
	p.attributes.each(function(item){ attValIds.push(item.valueId); });
	
	new Ajax.Request(backendScript,
	{
		method:'post',
		//wenn das produkt zum ersten mal aufgerufen wird könnten per default geblockte 
		//attribute geladen werden - daher synchronous um das schreiben in den Warenkorb verhindern zu können
		asynchronous: !isInit,
		parameters: {mode: 'checkAttribConflicts', attValIds: attValIds.compact().join("_")},
		onSuccess: function(transport){
			$('pError'+itemId).innerHTML = '';
			if(transport.responseText.strip() != "[]"){
				var json = transport.responseText.evalJSON();
				//wurde ein Fehler gefunden die entsprechende msg aus der Datenbank in das pError des Items schreiben
				json.each(function(item){
					$('pError'+itemId).innerHTML += item + "<br/>";
				});
				//Den Fehler noch im attribErrors Objekt vermerken um das Absenden der Bestellung verhindern zu können
				attribErrors[itemId] = true;
			} else {
				//Falls keine Fehler(mehr) gefunden wurden das flag zurück setzen
				attribErrors[itemId] = false;
				//falls wir grad einen neuen Warenkorb geladen haben diesen nicht gleich wieder wegschreiben
				if(!isInit){
					itemsChanged();
				}
			}
		},
		onFailure: function(){ 
			//Im Fehlerfall eine Fehlernachricht ausgeben
			$('pError'+itemId).setText('Problem while checking attributes');
		}
	});
}

/**
 * Schreibt geänderte Artikelliste in den Warenkorb im backend und aktualisiert dann den Preis
 * @param noWrite true unterdrückt das Schreiben des Warenkorbs und holt nur den neuen Preis
 */
function itemsChanged(noWrite){
	var ret = new Array();

	if(hasAttribErrors()){
		noWrite = true;
	}

	if(!noWrite){
		for(var itemId in items){
			if(items[itemId] != null){
				var prod = items[itemId].getProduct();
				if(prod.id != ""){
					ret.push(prod);
				}
			}
		}
	}
	new Ajax.Request(backendScript,
	{
		method:'post',
		parameters: {mode: 'setCart', cart: ret.toJSON(), doWrite: !noWrite},
		onSuccess: function(transport){
			var json = transport.responseText.evalJSON();
			if(json.update_fail == 0){
				$$('td[id^="pError"]').innerHTML = '';
				//now update price info
				taxSum = json.tax_sum;
				if(!noWrite){
					itemsInCart = ret.length;
				}
				//jetzt zusammen mit Liefer und Zahlungsmodalitäten die Preisinfos holen
				fetchShipPayVoucherDiscountInfo($('pay_moduleSel').value, $('ship_moduleSel').value, 'address_id', 'customers_country', $('voucher_code').value);
			} else {
				//Backend meldet Fehler...
				alert('failure while updating shopping cart');
			}
		},
		onFailure: function(){ 
			//Irgendwas ging schief... was tun?
			alert("Something went wrong in setCart");
		}
	});
}

/**
 * Schreibt die globalen Preisvariablen in die Tabelle und stellt die nötigen
 * Berechnungen an. Nur Frontend...
 */
function updateAmounts(){
	//erstmal alte rabatt felder wegräumen
	$$('tr[id^="discount_"]').invoke('remove');
	
	//Vor-Gutschein-Rabatte
	if(usedDiscounts.PRODUCTS != null && usedDiscounts.PRODUCTS != "" && usedDiscounts.PRODUCTS.length > 0)
		usedDiscounts.PRODUCTS.each(function(item, index){ 	
			createTr(item.name, formatPrice(item.price_diff), "discount_" + index, $('productsPriceTr'));
		});
	//Gutschein
	if(voucherDiff != 0){
		createTr('Zwischensumme', formatPrice(productsPriceWOVoucher), "discount_pWOV", $('productsPriceTr'), "white");
		createTr('Gutschein', formatPrice(voucherDiff), "discount_voucher", $('productsPriceTr'), "white");
	}
	//Nach-Gutschein-Rabatte
	if(usedDiscounts.PRODUCTS_w_VOUCHER != null && usedDiscounts.PRODUCTS_w_VOUCHER != "" && usedDiscounts.length > 0){
		usedDiscounts.PRODUCTS_w_VOUCHER.each(function(item, index){ 	
			createTr(item.name, formatPrice(item.price_diff), "discount_" + index, $('productsPriceTr'));
		});
	}
	
	//Zwischensumme
	$('productsPriceTd').innerHTML = formatPrice(productsPrice);
	
	//Sonderfall giftwrapping
	if($('giftWrapTr') != null){
		$('giftWrapTr').remove();
	}
	if($('do_gift_wrap') != null && $('do_gift_wrap').checked){
		createTr("Geschenkverpackung", formatPrice(giftWrapAmount), 'giftWrapTr', $('paymentAmountTr'));
	} 
	//Hier muss der Preis manuell abgezogen werden, da er im backend nicht verrechnet wird
	overallPrice += giftWrapAmount;
	//Zahlungskosten
	if(payCost > 0) {
		$('paymentAmountTd').innerHTML = formatPrice(payCost);
		$('paymentAmountTr').show();
	} else {
		$('paymentAmountTr').hide();
	}
	//Versandkosten
	$('shippingAmountTd').innerHTML = formatPrice(shipCost);	
	
	//Gesamtpreis
	$('totalAmountTd').innerHTML = formatPrice(overallPrice);
}

/**
 * Diese Methdoe klärt alle Aufschläge/Rabatte für den aktuellen Warenkorb unter Auswertung des gewählten Lieferwegs, 
 * Zahlungsmethode, Lieferland sowie Gutscheincodes. Außerdem werden im Backend vorhandene Discounts abgefragt
 */
function fetchShipPayVoucherDiscountInfo(payModuleName, shipModuleName, selAddressIdId, countryIdId, voucherCode){
	//Irgendwoher muss das Zielland kommen
	if($(selAddressIdId) == null && $(countryIdId) == null) return;
	var addressId = "", countryId = "";
	if($(selAddressIdId) != null) addressId = $(selAddressIdId).value;
	if($(countryIdId) != null) countryId = $(countryIdId).value;
	
	var jetzt = new Date(); //für Timestamp, damit der IE die Anfrage nicht cacht.
	
	new Ajax.Request(backendScript,
	{
		method:'get',
		parameters: {mode: 'getShipPayVoucherDiscountInfo', payModuleName: payModuleName, shipModuleName: shipModuleName, addressId: addressId, countryId: countryId, voucherCode: voucherCode, timestamp: jetzt.getTime() },
		onSuccess: function(transport){
		  var json = "";
			json = transport.responseText.evalJSON();
			//Fehler gemeldet?
			if(json.msg != null && typeof(json.msg) != "undefined" && json.msg != ""){
				alert('Error: ' + json.msg);
			} else {
				//Ein eventuelle Zusatz-Info formular des Zahlugnsmoduls anzeigen
				if(typeof currentpayform == "undefined" || payModuleName != currentpayform)//Nur wenn Form vom aktuellen abweicht um Daten nicht zu löschen
				{
					currentpayform = payModuleName;
					if(json.pay.form != null && json.pay.form != "null"){
						$('payFormTd').innerHTML = json.pay.form;
					} else {
						$('payFormTd').innerHTML = '';
					}
				}
				//Preise speichern
				payCost = parseFloat(json.pay.price_diff);
				shipCost = parseFloat(json.ship.price_diff);
				voucherDiff = parseFloat(json.voucher.price_diff);
				//Gültigkeit des Gutscheincodes...
				if(json.voucher_msg != null && typeof(json.voucher_msg) != "undefined" && json.voucher_msg != ""){
					$('voucher_error').innerHTML = 'Code ungültig';
					voucher_error = true;
				} else {
					$('voucher_error').innerHTML = "";
					voucher_error = false;
				}
				//Angewandte Disocunts merken
				usedDiscounts = json.used_discounts;
				//Weitere Zwischensummen
				productsPriceWOVoucher = parseFloat(json.products_price_wo_voucher);
				productsPrice = parseFloat(json.products_price);
				overallPrice = parseFloat(json.overall_price);
				//Die frischen Werte anzeigen
				updateAmounts();
			}
		},
		onFailure: function(){ 
			alert("problem fetching updates for payment/shipping");
		}
	});
}

/**
 * client-seitige feld validierungsfunktion (legacy vom bankeinzug modul)
 */
function check_form_element(feld, wert){
             		
	if(feld == "bankeinzug_blz"){
		if(wert.length != 8){
			return;
		}
		
		var blzurl = '/bank_number_check.php';
		new Ajax.Request(blzurl,
		{
			method:'get',
			parameters: {blz: wert},
			onSuccess: function(transport){            
				if(transport.responseText != "noresult"){  
					$("bankeinzug_bank").value = transport.responseText;
					$("banknamestatus").innerHTML = "";
				}
				else{
					$("bankeinzug_bank").value = "";
					$("banknamestatus").innerHTML = "<b style='color:red'>Keine Bank zur eingegebenen BLZ gefunden.<br>Bitte prüfen Sie Ihre Eingabe oder geben Sie<br>den Banknamen per Hand ein.</b>";
				}
			}
		});
	}
}

/**
 * Einfaches Utilityzum öffnen eines Popups (hier Produktinfo)
 */
function doPopup(target, title){
	fenster = window.open(target, title, 'width=575,height=600,left=100,top=2001,scrollbars=yes');
	fenster.focus();
}

/**
 * Utility zum Auswerten des attribErrors Arrays
 */
function hasAttribErrors(){
	var attribErr = false;
	for(key in attribErrors){
		attribErr |= attribErrors[key];
	}
	return attribErr;
}

/**
 * onSubmit Eventhandler der die Form contents vorm eigentlichen Bestellen checkt
 */
function checkForm(submitBtnId){
	$(submitBtnId).disabled = true;
	var attribErr = hasAttribErrors();
		
	var error = false;
	//Es müssen Artikel im Warenkorb sein
	if(itemsInCart < 1){
		alert("Der Warenkorb ist leer");
		error = true;
	}
	//attribut errors?
	else if(attribErr){
		alert("Ihr Warenkorb enthält ungültige Konfigurationen");
		error = true;
	}
	//die AGB müssen akzeptiert sein
	else if(!$('accept_agb').checked){
		alert('Bitte akzeptieren sie unsere AGBs');
		error = true;
	}
	
	//bei Bankeinzug müssen die Felder ausgefüllt sein
	else if($('pay_moduleSel').value == 'Bankeinzug' && $$('input[id^="bankeinzug_"]').any(function(item){ return item.value.empty(); })){
		alert('Bitte alle Bankeinzug-Felder ausfüllen!');
		error = true;
	}
	//ungültiger gutscheincode im feld => führt zur umleitung von checkout4..
	else if(voucher_error){
		alert('Ihr Gutschein Code ist leider ungültig.');
		error = true;
	}
	
	//bei neuem Kunden müssen die Pflichtfelder für die Anmeldung ausgefüllt sein
	else if(newCustomer){
		var errors = checkCustomerFields();
		//alle fehler zurücksetzen
		$$('b[id^="customers_"],b[id$="_err"]').each(function(item){ item.innerHTML = ''; });
		$$('b[id^="address_"],b[id$="_err"]').each(function(item){ item.innerHTML = ''; });
		errors.each(function(item){
			//beim email feld wird nur einmal NG check gemacht
			var msg = "";
			if(item.key == "customers_email"){
				$('customers_email_c').value="EMAIL";			
				if(item.value == "EXISTS"){
					msg = "Unter dieser Emailadresse existiert bereits ein Konto.<br>Unter <a href='https://www.linsenplatz.de/login.php'>Login</a> können Sie sich über 'Passwort vergessen' ein neues Passwort zusenden lassen. ";
				} else {
					msg = "Bitte prüfen Sie Ihre Emailadresse, sie sollte in der Regel so aussehen: name@domain.de <br>Häufige Fehler sind z.B. name@tonline.de (statt name@t-online.de).";
				}
			} else if(item.key == "customers_dob_day" && item.value == "TOO_YOUNG"){
				msg = "Nur volljährige Personen dürfen sich anmelden!";
			} else {
				msg = "Bitte überprüfen sie ihre Eingabe!";
			}
			$(item.key+'_err').innerHTML = msg;	
		});
		if(errors.length > 0) error = true;
	} 
	//kunde ist eingeloggt und bis hierhin war alles richtig ausgefüllt
	else {
		if(parseInt($('address_id').value) == Number.NaN){
			alert('ungültige Addresse');
			error = true;
		}
	}
	//wenn fehler aufgetreten sind, absenden abbrechen
	if(error){
		$(submitBtnId).disabled = false;
		return false;
	} else {
		return true;
	}
}

/**
 * Methode überträgt customer registration felder ans Backend zur Validierung
 * SJAX wird verwendet, da submit-vorgang ansonsten abgebrochen werden muss.
 * Caller wartet also explizit auf das Ergebnis
 */
function checkCustomerFields(){
	var fields = $$('[id^="customers_"]');

	//externe Lieferadresse?
	if($('external_delivery_adress').value == '1'){
			fields = fields.concat($$('[id^="address_"]'));
	}

	//Die Felder zusammenstellen und umpacken
	var reqFields = new Object();
	fields.each(function(item){ reqFields[item.id] = item.value; });
	
	var errors = false;
	new Ajax.Request(backendScript,
	{
		method:'post',
		parameters: {mode: 'checkFields', fields: Object.toJSON(reqFields)},
		asynchronous: false,
		onSuccess: function(transport){
			//Fehlermeldungen sammeln
			errors = transport.responseText.evalJSON();
		},
		onFailure: function(){ 
			alert("problem checking fields");
		}
	});
	//Nach der synchronen Abarbeitung die Fehlermeldungen zurückgeben
	return errors;
}

/**
 * onChange Handler für die Giftwrapping Checkbox
 * setzt den Preis entsprechend um und zeigt das div an
 */
function giftWrapToggle(checkboxId, divId, price){
	$(divId).toggle();
	if($(checkboxId).checked){
		giftWrapAmount = price;
	} else {
		giftWrapAmount = 0;
	}
	updateAmounts();
}

