$(function($){
	
	function number_format (number, decimals, dec_point, thousands_sep) {
		// Formats a number with grouped thousands
		//
		// version: 906.1806
		// discuss at: http://phpjs.org/functions/number_format
		// +   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)
		// *     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'
		var n = number, prec = decimals;
	 
		var toFixedFix = function (n,prec) {
			var k = Math.pow(10,prec);
			return (Math.round(n*k)/k).toString();
		};
	 
		n = !isFinite(+n) ? 0 : +n;
		prec = !isFinite(+prec) ? 0 : Math.abs(prec);
		var sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep;
		var dec = (typeof dec_point === 'undefined') ? '.' : dec_point;
	 
		var s = (prec > 0) ? toFixedFix(n, prec) : toFixedFix(Math.round(n), prec); //fix for IE parseFloat(0.55).toFixed(0) = 0;
	 
		var abs = toFixedFix(Math.abs(n), prec);
		var _, i;
	 
		if (abs >= 1000) {
			_ = abs.split(/\D/);
			i = _[0].length % 3 || 3;
	 
			_[0] = s.slice(0,i + (n < 0)) +
				  _[0].slice(i).replace(/(\d{3})/g, sep+'$1');
			s = _.join(dec);
		} else {
			s = s.replace('.', dec);
		}
	 
		var decPos = s.indexOf(dec);
		if (prec >= 1 && decPos !== -1 && (s.length-decPos-1) < prec) {
			s += new Array(prec-(s.length-decPos-1)).join(0)+'0';
		}
		else if (prec >= 1 && decPos === -1) {
			s += dec+new Array(prec).join(0)+'0';
		}
		return s;
	}
	
	function format_number(number, decimals)
	{
		if(decimals == undefined)
			decimals = true;
		var ret = '';
		if(number-Math.floor(number) > 0)
			ret = number_format(number, 2, '.', "'");
		else
		{
			if(decimals)
				ret = number_format(number, 0, '.', "'")+'.-';
			else
				ret = number_format(number, 0, '.', "'");
		}
		return ret;
	}

	var update_cart = function() {
		$(".grand-total .price_count").text('?');
		$('#currency_convertor').change();
		//$("#packing_price").text('calculating...');
		//$("#shipping_price").text('calculating...');
		//$(".shipping .price_unit").text('');
		//$('#promotional_infos').html('');
		
		// immediate update of per-product displayed total
		$("table.bag tr").each(function() {
			var new_total = format_number(parseFloat($('.price .price_count', this).html()) * $(".product_quantity, .code_quantity", this).val());
			$('.total .price_count', this).html(new_total);
		});

		$.getJSON(
			config_dir+"index.php?fuseaction=ajax.cart_update"
			,$('#frmCartDetails').serialize() + '&nodelete=1'
			,function(cart_info) {
				$(".sub-total .total .price_count").text(format_number(cart_info.sub_total));
				$(".gift .price_unit").text(cart_info.packing_price ? 'CHF' : '');
				$("#packing_price").text(cart_info.packing_price ? format_number(cart_info.packing_price) : '-');
				$("#shipping_price").text(cart_info.shipping_price ? format_number(cart_info.shipping_price) : _language_free.toUpperCase());
				$(".shipping .price_unit").text(cart_info.shipping_price ? 'CHF' : '');
				$(".grand-total .price_count").text(format_number(cart_info.grand_total));
				$('#discount_errors').html((cart_info.discount_errors || ''));
				$('#discount_messages').html((cart_info.discount_messages || ''));
				$('#currency_convertor').change();
			}
		);
		
		return false;
	}

	$('.calculate_discount').click(update_cart);
	$('.sub-total #country_id, .input_spinner input').change(update_cart);
	$('input.gift_product').click(function(){update_cart();});

	$('#currency_convertor').change(function(){
		var currency_id = $(this).val();
		var total = parseFloat($('.grand-total .price_count').html().replace("'",""));
		var value = currencies[currency_id].value * total;
		$('#currency_value').html(currencies[currency_id].code + ' ' + format_number(value));
	});

	$('.calculate_discount').live('click',update_cart);
	$('.promotion-codes .plus').live('click',function(){
		var div = $('<div>');
		div.html($('.promotion-codes .first').html() + '<a class="button minus" href="">-<a>');
		$('input.text', div).val('').removeClass('default_text input_default_text');
		$(this).parent().parent().append(div);
		return false;
	});
	$('.promotion-codes .minus').live('click',function(){
		$(this).parent().remove();
		return update_cart();
	});
	$('.promotional_code').live('change',update_cart);

	update_cart();
});
