current_item_id = 0;
var shipping = {};
var selected_payopt = {};
var discount = {};
var notification = {};

$(document).ready(function() {
	$.ajaxSetup({ cache: false });

	basket_get();
	$('select[name^=product_variation]').change(function() { basket_verify_combination(); });
	$('select[name^=set_choice]').change(function() { basket_verify_set(); });
	
	$('input[name=amount]').keyup(function() { 
		if(is_single) basket_verify_single();
		else if(is_set) basket_verify_set();
		
	});
	
	basket_verify_set();
	basket_verify_combination();
	$('#buy_button').click(function() { basket_add(current_item_id); })
	$('a[rel=product_image]').fancybox();
	$('#klarna_lookup').click(function() { 
		klarna_lookup($('input[name=klarna_pnr]').val()); 
	}); 
	
	btn = {};
	btn[language.basket_item_added_basket] = function() { document.location.href = '/basket.php'; };
	btn[language.basket_item_added_keep_shopping] = function() { basket_get(function() { $('#dialog_item_added').dialog('close'); }); };
	
	$('#dialog_item_added').dialog({
		modal: true,
		width: 300,
		autoOpen: false,
		buttons: btn
 	});
});

function klarna_lookup(pnr)
{
	$.getJSON("/basket.php?action=klarna_lookup&pnr=" + pnr, function(data) {
		if(data.status == 'fail')
		{
			$('.klarna_errmsg').html(data.msg).show();
			$('#submit_order').hide();
			$('#checkout_customer_address').hide();
		}
		else
		{
			$('.klarna_errmsg').hide();
			$('input[name=invoice_name_1]').val(data.data.first_name);
			$('input[name=invoice_name_2]').val(data.data.last_name);
			$('input[name=invoice_address]').val(data.data.address);
			$('input[name=invoice_zip]').val(data.data.zip);
			$('input[name=invoice_city]').val(data.data.city);
			$('select[name=invoice_country] option[value='+data.data.country.toUpperCase()+']').attr("selected",true);
			$('#submit_order').show();
			$('#checkout_customer_address').show();
		}
	});
}

function valid_email(email)
{
	var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
	return email.search(emailRegEx) == -1 ? false : true;
}

function validate_newsletter()
{
	email = $('#newsletter_box input[name=email]').val();
	if(!valid_email(email))
	{
		alert(language.invalid_email);
		return false;
	}
	else
	{
		alert(language.newsletter_thanks);
		$('#newsletter_box').submit();
	}
}

function submitOrder()
{
	error=false;
	$('.checkout_error_field').removeClass('checkout_error_field');
	$('#checkout_error_message').hide();
	
	disabled_fields = [];
	$('#checkout_customer_address input:text').each(function() {
		if($(this).attr('disabled'))
		{
			disabled_fields.join($(this).attr("name"));
			$(this).attr('disabled',false);
		}
		
		if($(this).val() == "" || 
			($(this).attr('name')=='email' && !valid_email($(this).val()))
		)
		{
			$(this).addClass('checkout_error_field');
			$('#checkout_error_message').show();
			error = true;
		}
		
		if(!$('input[name=phone]').val().match(/^0[0-9\-\ ]{6,}$/))
		{
			// only klarna require this
			if(selected_payopt.id == '3' || selected_payopt.id == '3_konto')
			{
				$('input[name=phone]').addClass('checkout_error_field');
				$('#checkout_error_message').show();
				error = true;
			}
		}
		
		if($(this).attr('name') == 'email2' && $(this).val() != $('#checkout_customer_address input[name=email]').val())
		{
			$(this).addClass('checkout_error_field');
			$('#checkout_error_message').show();
			error = true;
		}
	});

	if(!error)
	{
		if($('input[name=shipping]').length>0) $('input[name=shipping]').val($('input[name=shipping_option]:checked').val());
		$('form[name=checkout]').submit();
	}
	else
	{
		// disable fields
		$.each(disabled_fields, function(k,v) {
			$('input[name=' + v + ']').attr('disabled',true);
		});
	}
}

function go(url)
{
	document.location.href = url;
}

var partpay_first_option;
var payopt_set = false;
function getPayopts()
{
	$.getJSON("/basket.php?action=getPayopts&order_total="+price_total+"&shipping=" + shipping.id, function(data) {
		$('#payment_option table').html('');
		checked_id = 0;
		
		partpay = [];
		partpay_first_option = 0;
		lowest_partpay_fee = 999999;
		
		// delbetalning
		$.each(data.data, function(k, payopt) {
			if(payopt.klarna_suboption)
			{
				partpay.push(
					"<input type='radio' onclick=\"setPayopt(0, '"+payopt.name+"','"+payopt.payment_id+"')\" name='payment_option' value='" + payopt.payment_id + "' />" +
					payopt.name + " - Delbetala från " +payopt.currency_prefix + number_format(payopt.klarna_monthly,2,',',' ') + payopt.currency_suffix + " i månaden"
				);
				
				if(partpay_first_option < 1)
					partpay_first_option = payopt.payment_id;
				
				if(payopt.klarna_monthly < lowest_partpay_fee)
					lowest_partpay_fee = payopt.klarna_monthly;
			}
		});
		
		has_klarna = false;
		$.each(data.data, function(k, payopt) {
			if(payopt.payment_id == 3)
				has_klarna = true;
		});
		
		$.each(data.data, function(k, payopt) {
			if(payopt.klarna_suboption != true)
			{	
				if(payopt.payment_id == 3)
				{
					// klarna faktura
					img = "<img src='/img/payopt_" + payopt.payment_id + ".png' />";
					$('#payment_option table').append(
						"<tr>" +
							"<td class='opt_logo'>"+img+"</td>"+
							"<td class='opt_radio'><input type='radio' onclick=\"setPayopt("+payopt.price+", '"+payopt.name+"','"+payopt.payment_id+"')\" name='payment_option' value='" + payopt.payment_id + "' /></td>" +
							"<td class='opt_price'>" + payopt.currency_prefix + number_format(payopt.price,2,',',' ') + payopt.currency_suffix + "</td>" +
							"<td class='opt_text'><h4>Klarna faktura - betala om 14 dagar <a href='https://online.klarna.com/villkor.yaws?eid=2&charge="+payopt.price+"' style='font-size:8pt;font-weight:normal' class='klarna_iframe'>Läs mer</a></h4>" + payopt.description + "</td>" +
						"</tr>" 
					);					
					
					// delbetalning
					$('#payment_option table').append(
							"<tr>" +
								"<td class='opt_logo' valign='top'><img src='/img/payopt_3_konto.png' /></td>"+
								"<td class='opt_radio'><input type='radio' onclick=\"setPayopt("+payopt.price+", 'Klarna delbetalning','3_konto')\" name='payment_option' value='3_konto' /></td>" +
								"<td class='opt_price'></td>" +
								"<td class='opt_text'><h4>Klarna delbetalning <span style='font-size:8pt;font-weight:normal;color:red;'>från " + lowest_partpay_fee + " kr/mån!</span> <a href='https://online.klarna.com/account_se.yaws?eid=2&charge="+payopt.price+"' style='font-size:8pt;font-weight:normal' class='klarna_iframe'>Läs mer</a></h4><div id='klarna_partpay' style='display:none'>" + partpay.join("<br/>") + "</div></td>" +
							"</tr>" 
					);		
					
					$('.klarna_iframe').fancybox({type:'iframe'});
				}
				else
				{
					img = "<img src='/img/payopt_" + payopt.payment_id + ".png' />";
					$('#payment_option table').append(
						"<tr>" +
							"<td class='opt_logo'>"+img+"</td>"+
							"<td class='opt_radio'><input type='radio' onclick=\"setPayopt("+payopt.price+", '"+payopt.name+"','"+payopt.payment_id+"')\" name='payment_option' value='" + payopt.payment_id + "' /></td>" +
							"<td class='opt_price'>" + payopt.currency_prefix + number_format(payopt.price,2,',',' ') + payopt.currency_suffix + "</td>" +
							"<td class='opt_text'><h4>" + payopt.name + "</h4>" + payopt.description + "</td>" +
						"</tr>" 
					);					
				}
				
				if(!payopt_set)
				{
					// om klarna erbjuds så ska inget sättas om detta inte är klarna
					if(!has_klarna || (has_klarna && payopt.payment_id == 3))
					{
						setPayopt(payopt.price, payopt.name, payopt.payment_id);
						payopt_set = true;
						checked_id = payopt.payment_id;
					}
				}
				else
				{
					$('input[name=payment_option][value=' + selected_payopt.id + ']').trigger('click');
				}
			}
		});
		
		$('input[name=payment_option][value=' + checked_id + ']').attr('checked',true);
	});
}

function getShipping()
{
	country = $('#country').val();
	
	$.getJSON("/basket.php?action=getShipping&country="+country+"&weight=" + weight_total_gram + "&order_total=" + price_total, 
			function(data)
			{
				var logo = "";
				if(data.status == "fail")
				{
					alert('ERROR: No shipping provider for this weight');
				}
				else
				{
					sbuf=[];
					sdata=[];
					first = true;
					
					if(data.data.length == 0)
					{
						$('form[name=checkout]').hide();
						$('.checkout_dividor_subheader').hide();
						$('#content_container').append("<div style='background:#f6b5b5;border:1px solid #d37070;padding:10px;text-align:center'>Det finns inget fraktalternativ som matchar varorna du har köpt. Kontakta oss!</div>");
					}
					
					sbuf.push("<table id='checkout_shipping_options' class='checkout_options'>");
					$.each(data.data, function(key, val) {
						if(first) setShipping(val.min_price, val.provider_name, val.service_id);
						
						logo = "";
						if(val.provider_id == 5)
							logo = "";
						else
							logo = "<img src='/themes/"+theme+"/img/shipping_provider_" + val.provider_id + ".png' />";
						
						sdata.push(val.service_id+":"+val.min_price+":"+val.hash);
						sbuf.push(
							"<tr>" +
								"<td class='opt_logo'>"+logo+"</td>" +
								"<td class='opt_radio'><input "+((first) ? "checked " : "")+"type='radio' onclick=\"setShipping("+val.min_price+",'"+val.provider_name+"','"+val.service_id+"')\" name='shipping_option' value='" + val.service_id + "'/></td>" +
								"<td class='opt_price'>" + val.currency_prefix + number_format(val.min_price,2,',',' ') + val.currency_suffix + "</td>" + 
								"<td class='opt_text'><h4 class='shipping_service_name'>" + val.service_name + "</h4>"+ val.service_description + "</td>" +
							"</tr>"
						);
						
						first=false;
					});
					sbuf.push("</table>");
					
					$('#shipping_options').html(sbuf.join("\n"));
					
					$('input[name=shipping_data]').val(sdata.join(";"));
				}
			}
	);
}

function setShipping(price,name,service_id)
{
	shipping = {"name":name, "price":price, "id":service_id};
	getPayopts();
	buildBasketSummary();
	getNotificationOptions(service_id);
}

function setPayopt(price, name, service_id)
{
	textfields = ['invoice_name_1', 'invoice_name_2', 'invoice_address', 'invoice_zip', 'invoice_city', 'invoice_country'];
	
	$('input[name=payment_id]').val(service_id);
	if(service_id.match(/^3$/) || service_id.match(/^3__/)) // klarna
	{
		$('#klarna_pnr_input').show();
		$.each(textfields, function(k, f) {
			$('input[name=' + f + '], select[name='+f+']').attr('disabled',true).addClass('disabled').val('');
		});
			
		$('#submit_order').hide();
		$('#checkout_customer_address').hide();
	}
	else
	{
		if(service_id == '3_konto')
		{
			$('#klarna_partpay').show();
			$('input[name=payment_option][value='+partpay_first_option+']').trigger('click');
			return;
		}
		else
		{
			$('#klarna_pnr_input').hide();
			$.each(textfields, function(k, f) {
				$('input[name=' + f + '], select[name='+f+']').attr('disabled',false).removeClass('disabled');
			});
			
			$('#submit_order').show();
			$('#checkout_customer_address').show();
			$('#klarna_partpay').hide();
		}
	}
	
	selected_payopt = {"name":name, "price":price, "id":service_id};
	buildBasketSummary();
}

function getNotificationOptions(service_id)
{
	$.getJSON("/basket.php?action=notification_get&service_id=" + service_id, function(data) {
		first = true;
		buf = ['<table class="checkout_options">'];
		
		$.each(data.data, function(key, notification) {
			if(first) setNotification(notification.id, notification.price, notification.name);
			
			buf.push(
				"<tr>" +
					"<td class='opt_logo'></td>" +
					"<td class='opt_radio'>" + 
						"<input onchange=\"setNotification('"+notification.id+"','"+notification.price+"','"+notification.name+"')\" type='radio' name='notification_id_radio' value='" + notification.id + "' " + ((first) ? " checked" : "") + " /> " +
					"</td>" + 
					"<td class='opt_price'>" + notification.currency_prefix + number_format(notification.price,2,',',' ') + notification.currency_suffix + "</td>" + 
					"<td class='opt_text'>" + notification.name + "</td>" +
				"</tr>"
			);
			
			first = false;
		});
		
		buf.push("</table>");
		
		$('#shipping_notification_options').html(buf.join(''));
		buildBasketSummary();
	});
}

function setNotification(id, price, name)
{
	notification = {'id':id, 'price':price, 'name':name};
	$('input[name=notification_id]').val(id);
	buildBasketSummary();
}

function verify_cupon()
{
	cupon = $('input[name=cupon]').val();
	if(cupon == "") 
	{
		alert('Du har inte angivit en giltig rabattkod');
		return;
	}
	
	$.getJSON("/basket.php?action=cupon_verify&code=" + cupon, function(data)
		{
			if(data.status == 'invalid')
			{
				alert('Rabattkoden du har angivit är ogiltig.');
				return false;
			}
			else
			{
				if(data.demand.items > num_items)
				{
					alert('Du måste köpa minst ' + data.demand.items + ' varor för att utnyttja den här rabattkoden.');
					return false;
				}
				
				if(data.demand.price > price_total)
				{
					alert('Du måste handla för minst ' + data.demand.price + ' för att utnyttja den här rabattkoden.');
					return false;
				}
			}
			
			discount = data.offer;
			buildBasketSummary();
		}
	);
}

var order_total_inc_shipping;
function buildBasketSummary()
{
	disc = 0;
	
	$('#basket_summary').html('');
	$('#basket_summary').append("<tr><td>Totalt:</td><td>" + number_format(price_total,2,',',' ') + "</td></tr>");
	$('#basket_summary').append("<tr><td>Frakt "+shipping.name+":</td><td>" + number_format(shipping.price,2,',',' ') + "</td></tr>");
	$('#basket_summary').append("<tr><td>Betalning med " + selected_payopt.name + "</td><td>" + number_format(selected_payopt.price,2,',',' ') + "</td></tr>");
	
	notification_price = 0;
	if(notification.id != null)
	{
		notification_price = parseFloat(notification.price);
		$('#basket_summary').append("<tr><td>Avisering "+notification.name+":</td><td>" + number_format(notification.price,2,',',' ') + "</td></tr>");
	}
	
	if(discount.type != null)
	{
		if(discount.type == "flatPrice") disc = discount.value;
		else if(discount.type == "percentage") disc = price_total*(1-discount.value);
		
		$('#basket_summary').append("<tr><td>Rabatt:</td><td>" + number_format(disc,2,',',' ') + "</td></tr>");
	}	
	
	$('#basket_summary').append("<tr id='basket_summary_topay'><td>Att betala:</td><td>" + number_format((price_total + selected_payopt.price + notification_price + shipping.price - disc),2,',',' ') + "</td></tr>");
	order_total_inc_shipping = price_total + selected_payopt.price + notification_price + shipping.price - disc;
}

function basket_verify_set()
{
	if(typeof(is_set)=="undefined" || !is_set) return;
	
	error = false;
	least_available = 99999;
	price = 0;
	amount_requested = Number($('input[name=amount]').val());
	if(amount_requested < 1) amount_requested = 1;
	
	$.each(set_products, function(a,prod) { 
		total_amount = amount_requested * prod.amount;
		message = "";
		stock_error = false;
		
		if(total_amount > prod.stock && prod.neg_orderable == '0') { stock_error=true; message = prod.neg_message; }
		if(total_amount < prod.stock && prod.pos_orderable == '0') { stock_error=true; message = prod.pos_message; }
			
		if(stock_error && !error)
		{
			$('#buy_message').html(message == "" ? language.basket_item_unavailable_combination : message).show();
			$('#buy_button').hide();
			$('.product_stock').html('');
			$('.product_price').html('-');
			$('.klarna_monthly').html('');
			error = true;
		}
		else
		{
			a = Math.floor(prod.stock / (amount_requested * prod.amount));
			if(a<least_available) least_available = a;
		}
		
		price += amount_requested * prod.amount * prod.price;		
	});
	
	if(!error && set_groups != null)
	{
		$.each(set_groups, function(kg, group) {
			selected_value = $('select[name=set_choice_' + group.group_id +']').val();
			
			$.each(group.values, function(key2, grpval) {
				if(grpval.product_id == selected_value)
				{
					stock_error = false;
					total_amount = group.amount*amount_requested;
					message = "";
					
					if(total_amount > grpval.stock && grpval.neg_orderable == '0') { stock_error=true; message = grpval.neg_message; }
					if(total_amount < grpval.stock && grpval.pos_orderable == '0') { stock_error=true; message = grpval.pos_message; }
					
					if(!error && stock_error)
					{
						$('#buy_message').html(message == "" ? language.basket_item_unavailable_combination : message).show();
						$('#buy_button').hide();
						$('.product_stock').html('');
						$('.product_price').html('-');
						$('.klarna_monthly').html('');
						error = true;				
					}
					else
					{
						a = Math.floor(value.stock / (amount_requested * group.amount));
						if(a<least_available) least_available = a;				
					}
					
					price += amount_requested * group.amount * grpval.price;
				}
			});
		});
	}

	// subtract discount
	if(typeof(set_info) != "undefined")
	{
		price_each = price/amount_requested;
		
		if(set_info.price_type == "percent")
			discount = price_each * (set_info.price_reduction/100);
		else
			discount = set_info.price_reduction;
		
		price -= amount_requested * discount;
	}
	
	if(!error)
	{
		if(least_available == 0)
			stock_msg = "<img src='/img/stock-soldout.png' class='stock_icon' />" + language.stock_soldout;
		else if(least_available < 3)
			stock_msg = "<img src='/img/stock-few.png' class='stock_icon' />" + language.stock_few;
		else
			stock_msg = "<img src='/img/stock-available.png' class='stock_icon' />" + language.stock_available;
		
		$('.product_stock').html(stock_msg);
		$('.product_price').html(number_format(price,2,',',' '));
		$('#buy_message').hide();
		$('#buy_button').show();
		
		if(klarna_monthly_active) klarna_monthly_calc(price);
	}
}

function klarna_monthly_calc(sum)
{
	$.getJSON("/product.php?action=klarnaGetMonthly&sum="+sum, function(data) {
		if(data.status == 'success')
		{
			$('.klarna_monthly').html("<img src='/img/klarna-small.gif' /><br/>Delbetala från " + data.price + " kr/månad");
		}
		else
		{
			$('.klarna_monthly').html('');
		}
	});
}

function basket_verify_single()
{
	if(!is_single) return true;
	
	stock_error = false;
	val = single_item_info;
	total_amount = parseInt($('input[name=amount]').val());
	if(total_amount == "") total_amount = 1;
	if(total_amount > val.stock && val.neg_orderable == '0') { stock_error=true; message = val.neg_message; }
	if(total_amount < val.stock && val.pos_orderable == '0') { stock_error=true; message = val.pos_message; }
	
	$('.product_price').html(
			val.campaign_price > 0 ?
				'<span class="campaign_old_price">' + number_format(val.price,2,',',' ') + "</span>" +
				'<span class="campaign_new_price">' + val.currency_prefix + number_format(val.campaign_price,2,',',' ') + val.currency_suffix + "</span>"
			:
				val.currency_prefix + number_format(val.price,2,',',' ') + val.currency_suffix
	);
	
	if(stock_error)
	{
		$('#buy_message').html(message);
		$('#buy_message').show();
		$('#buy_button').hide();
		$('.product_stock').html('');
		error = true;
	}
	else
	{
		$('#buy_message').hide();
		$('#buy_button').show();

		if(val.stock == 0)
			stock_msg = "<img src='/img/stock-soldout.png' class='stock_icon' />" + language.stock_soldout;
		else if(val.stock < 3)
			stock_msg = "<img src='/img/stock-few.png' class='stock_icon' />" + language.stock_few;
		else
			stock_msg = "<img src='/img/stock-available.png' class='stock_icon' />" + language.stock_available;
		
		$('.product_stock').html(stock_msg);	
	}
	
	if(klarna_monthly_active) klarna_monthly_calc(val.price);
}

function basket_verify_combination()
{
	if(typeof(combos)=="undefined" || combos == null)
	{
		return true;
	}
	
	selectedCombination = [];
	$('select[name^=product_variation] option:selected').each(function() {
		selectedCombination.push($(this).val());
	});
	
	comboItem = null;
	comboStock = null;
	comboPrice = null;
	comboCampaignPrice = null;
	stock_error = false;
	error = false;
	$.each(combos, function(key, val) {
		if(compare_array(selectedCombination, val.combo))
		{
			comboItem=val.item;
			comboStock=val.stock;
			comboPrice=val.price;
			comboCampaignPrice = val.campaign_price;
			
			total_amount = parseInt($('input[name=amount]').val());
			message = "";
			
			if(total_amount > val.stock && val.stock_status.neg_orderable == '0') { stock_error=true; message = val.stock_status.neg_message; }
			if(total_amount < val.stock && val.stock_status.pos_orderable == '0') { stock_error=true; message = val.stock_status.pos_message; }
			
			// change image
			$('#main_product_image').attr('href','/img/products/'+val.image_id+'-large.jpg').html('<img src="/img/products/' + val.image_id + '-screen.jpg" />');
			
			if(stock_error)
			{
				$('#buy_message').html(message);
				$('#buy_message').show();
				$('#buy_button').hide();
				$('.product_stock').html('');
				$('.product_price').html('-');
				$('.klarna_monthly').html('');
				error = true;
			}
		}
	});

	if(comboItem == null)
	{
		$('#buy_message').html(language.basket_item_unavailable_combination).show();
		$('#buy_button').hide();
		$('.product_stock').html('');
		$('.product_price').html('-');
	}
	else if(!error)
	{
		if(comboStock == 0)
			stock_msg = "<img src='/img/stock-soldout.png' class='stock_icon' />" + language.stock_soldout;
		else if(comboStock < 3)
			stock_msg = "<img src='/img/stock-few.png' class='stock_icon' />" + language.stock_few;
		else
			stock_msg = "<img src='/img/stock-available.png' class='stock_icon' />" + language.stock_available;
		
		$('.product_stock').html(stock_msg);
		$('.product_price').html(
				comboCampaignPrice > 0 ?
					'<span class="campaign_old_price">' + number_format(comboPrice,2,',',' ') + '</span>' +
					'<span class="campaign_new_price">' + language.currency_prefix + number_format(comboCampaignPrice,2,',',' ') + language.currency_suffix + '</span>'
				: 
				language.currency_prefix + number_format(comboPrice,2,',',' ') + language.currency_suffix
		);
		current_item_id = comboItem;
		$('#buy_message').hide();
		$('#buy_button').show();
		
		if(klarna_monthly_active) klarna_monthly_calc(comboPrice);
	}
}

function compare_array(array1, array2)
{
	// all array1 elements must be in array2
	for(i=0; i<array1.length; i++)
	{
		match=false;
		for(j=0; j<array2.length; j++)
		{
			if(array1[i] == array2[j])
			{
				match=true; 
				break;
			}
		}
		
		if(!match) return false;
	}
	
	return true;
}

function basket_add(item_id)
{
	item_amount = $('input[name=amount]').val();

	if(is_set)
	{
		type = 'set';
		choices = [];
		$('select[name^=set_choice]').each(function() {
			choices.push($(this).attr("name").replace("set_choice_", "") + ":" + $(this).val());
		});
		
		choices = choices.join(";");
	}
	else
	{
		if(typeof(single_item_info) != "undefined")
		{
			
		}
		
		type = 'single';
		choices = "";
	}
	
	$.getJSON("/basket.php", { action: 'add', type: type, choices: choices, item_id: item_id, amount: item_amount}, function(data)
	{
		$('#dialog_item_added').dialog('open');
	})
}

function basket_get(cb)
{
	basket_num = 0;
	basket_total = 0;
	basket_list = "";
	
	$.getJSON("/basket.php", { action: 'get' }, function(data)
			{
		    	if(data.status == "success")
				{
					$.each(data.basket, function(k, row) {
						basket_list = basket_list + 
										"<tr>" + 
											"<td>" + row.amount + " x " + row.product_name + "</td>" +
											"<td class='text_right'>" + language.currency_prefix + row.row_total + language.currency_suffix + "</td>" +
										"</tr>";
						
						basket_total += row.row_total;
						basket_num++;
					});
				}
				
				$('.basket_num_items').html(basket_num);
				$('.basket_list').html(basket_list);
				$('.basket_total').html(language.currency_prefix + number_format(basket_total,2,',',' ') + language.currency_suffix);
				
				if(typeof(cb) === "function") cb();
			});
}

function number_format (number, decimals, dec_point, thousands_sep) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // +    revised by: Luke Smith (http://lucassmith.name)
    // +     bugfix by: Diogo Resende
    // +     bugfix by: Rival
    // +      input by: Kheang Hok Chin (http://www.distantia.ca/)
    // +   improved by: davook
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Jay Klehr
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Amir Habibi (http://www.residence-mixte.com/)
    // +     bugfix by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Theriault
    // +      input by: Amirouche
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');
    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'
    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'
    // *     example 7: number_format(1000.55, 1);
    // *     returns 7: '1,000.6'
    // *     example 8: number_format(67000, 5, ',', '.');
    // *     returns 8: '67.000,00000'
    // *     example 9: number_format(0.9, 0);
    // *     returns 9: '1'
    // *    example 10: number_format('1.20', 2);
    // *    returns 10: '1.20'
    // *    example 11: number_format('1.20', 4);
    // *    returns 11: '1.2000'
    // *    example 12: number_format('1.2000', 3);
    // *    returns 12: '1.200'
    // *    example 13: number_format('1 000,50', 2, '.', ' ');
    // *    returns 13: '100 050.00'
    // Strip all characters but numerical ones.
    number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
    var n = !isFinite(+number) ? 0 : +number,
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}
