Event.observe(window, 'load', function () {
	function number_format( number, decimals, dec_point, thousands_sep ) {
		var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
		var d = dec_point == undefined ? "." : dec_point;
		var t = thousands_sep == undefined ? "," : thousands_sep, s = n < 0 ? "-" : "";
		var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
		return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
	}
	function max() {
		var ar, retVal, i = 0, n = 0;
		var argv = arguments, argc = argv.length;

		var _obj2Array = function(obj) {
			if (obj instanceof Array) {
				return obj;
			} else {
				var ar = [];
				for (var i in obj) {
					ar.push(obj[i]);
				}
				return ar;
			}
		} //function _obj2Array

		var _compare = function(current, next) {
			var i = 0, n = 0, tmp = 0;
			var nl = 0, cl = 0;

			if (current === next) {
				return 0;
			} else if (typeof current == 'object') {
				if (typeof next == 'object') {
					current = _obj2Array(current);
					next    = _obj2Array(next);
					cl      = current.length;
					nl      = next.length;
					if (nl > cl) {
						return 1;
					} else if (nl < cl) {
						return -1;
					} else {
						for (i = 0, n = cl; i<n; ++i) {
							tmp = _compare(current[i], next[i]);
							if (tmp == 1) {
								return 1;
							} else if (tmp == -1) {
								return -1;
							}
						}
						return 0;
					}
				} else {
					return -1;
				}
			} else if (typeof next == 'object') {
				return 1;
			} else if (isNaN(next) && !isNaN(current)) {
				if (current == 0) {
					return 0;
				} else {
					return (current<0 ? 1 : -1);
				}
			} else if (isNaN(current) && !isNaN(next)) {
				if (next==0) {
					return 0;
				} else {
					return (next>0 ? 1 : -1);
				}
			} else {
				if (next==current) {
					return 0;
				} else {
					return (next>current ? 1 : -1);
				}
			}
		} //function _compare

		if (argc == 0) {
			throw new Error('At least one value should be passed to max()');
		} else if (argc == 1) {
			if (typeof argv[0]=='object') {
				ar = _obj2Array(argv[0]);
			} else {
				throw new Error('Wrong parameter count for max()');
			}
			if (ar.length == 0) {
				throw new Error('Array must contain at least one element for max()');
			}
		} else {
			ar = argv;
		}

		retVal = ar[0];
		for (i=1, n=ar.length; i<n; ++i) {
			if (_compare(retVal, ar[i])==1) {
				retVal = ar[i];
			}
		}

		return retVal;
	}// }}}

	function check_first_delivery() {
		var first_delivery_date_object = Date.parseDate($('first_delivery').value, 'n/j/Y');
		if (first_delivery_date_object == null) {
			$('first_delivery_field_note').addClassName('field_note_error');
		} else {
			$('first_delivery_field_note').removeClassName('field_note_error');
		}
	}
	function update_fields() {
		var option_offset = 0;
		var option_value = '';
		var date_object = new Date();
		var first_delivery_date_object = Date.parseDate($('first_delivery').value, 'n/j/Y');
		if (first_delivery_date_object != null) {
			var eyear = first_delivery_date_object.getYear() + 1900;
			var emonth = first_delivery_date_object.getMonth();
			var eday = first_delivery_date_object.getDate();
		}
		$$('#deliveries option').each(function (elem) {
			if (elem.value != '' && elem.value != '0') {
				option_offset = (parseInt(elem.value) - 1);

				// Unlimited option -- do not update
				if (elem.value != '-1') {

					// Increment
					if (first_delivery_date_object == null) {
						option_value = elem.value;
					} else if ($('order_frequency_id').value == '1') { // daily
						var date_object = new Date(eyear, emonth, (eday + option_offset));
						option_value = elem.value+' deliver'+(elem.value == 1? 'y' : 'ies')+' (Last delivery on '+(date_object.getMonth() + 1)+'/'+date_object.getDate()+'/'+(date_object.getYear() + 1900)+')';
					} else if ($('order_frequency_id').value == '2') { // weekly
						var date_object = new Date(eyear, emonth, (eday + (option_offset*7)));
						option_value = elem.value+' deliver'+(elem.value == 1? 'y' : 'ies')+' (Last delivery on '+(date_object.getMonth() + 1)+'/'+date_object.getDate()+'/'+(date_object.getYear() + 1900)+')';
					} else if ($('order_frequency_id').value == '3') { // monthly
						var date_object = new Date(eyear, (emonth + option_offset), eday);
						option_value = elem.value+' deliver'+(elem.value == 1? 'y' : 'ies')+' (Last delivery on '+(date_object.getMonth() + 1)+'/'+date_object.getDate()+'/'+(date_object.getYear() + 1900)+')';
					} else if ($('order_frequency_id').value == '4') { // yearly
						var date_object = new Date((eyear + option_offset), emonth, eday);
						option_value = elem.value+' deliver'+(elem.value == 1? 'y' : 'ies')+' (Last delivery on '+(date_object.getMonth() + 1)+'/'+date_object.getDate()+'/'+(date_object.getYear() + 1900)+')';
					} else {
						option_value = elem.value;
					}

					// Value
					elem.innerHTML = option_value;
				}
			}

			if ($('order_frequency_id').value == '1') {
				$('total_label').innerHTML = 'Daily total';
			} else if ($('order_frequency_id').value == '2') {
				$('total_label').innerHTML = 'Weekly total';
			} else if ($('order_frequency_id').value == '3') {
				$('total_label').innerHTML = 'Monthly total';
			} else if ($('order_frequency_id').value == '4') {
				$('total_label').innerHTML = 'Yearly total';
			} else {
				$('total_label').innerHTML = 'Total';
			}
		}.bind(this));
	}
	if ($('even_number_field_note')) {
		$('even_number_field_note').insert({
			bottom: ' <span id="even_number_end">asdasdasd</span>'
		});
	}
	function update_totals() {
		var subtotal = 0.00;
		var total_quantity = 0;
		$$('.quantity').each(function (elem) {
			var product_price = max(0, extract_float(elem.up().previous().innerHTML));
			var product_quantity = max(0, extract_integer(elem.value));
			if (!isNaN(product_price) && !isNaN(product_quantity)) {
				var product_total = product_price*product_quantity;
				subtotal = subtotal + product_total;
				total_quantity = total_quantity + product_quantity;
				elem.up().next().innerHTML = '$'+number_format(product_total, 2);
			} else {
				elem.up().next().innerHTML = '$0.00';
			}
			elem.value = product_quantity;
		});
		$('subtotal_field').update('$'+number_format(subtotal, 2));
		$('grand_total_field').update('$'+number_format(subtotal, 2));
		if (total_quantity/2 != Math.floor(total_quantity/2)) {
			$('even_number_field_note').addClassName('field_note_error');
			if (total_quantity == 1) {
				$('even_number_field_note').update('We ship 50 flowers (2 bunches) per box, but you only have 1 bunch in your cart. <strong>Please add at least one more bunch to your cart to checkout.</strong>');
			} else {
				$('even_number_field_note').update('We ship 50 flowers (2 bunches) per box, so your order must contain an even number of bunches. You currently have an odd number of bunch in your cart ('+number_format(total_quantity, 0)+'). <strong>Please add or subtract one bunch to continue.</strong>');
			}
		} else {
			$('even_number_field_note').removeClassName('field_note_error');
			var msg = 'We ship 50 flowers (2 bunches) per box, so your order must contain an even number of bunches.';
			if (total_quantity !== 0) {
				msg = msg+' You have the correct number of bunches in your cart right now ('+number_format(total_quantity, 0)+').';
			}
			$('even_number_field_note').update(msg);
		}
	}

	update_fields();
	update_totals();
	if ($('order_frequency_id')) {
		$('order_frequency_id').observe('change', update_fields);
	}
	check_first_delivery();
	if ($('first_delivery')) {
		$('first_delivery').observe('change', check_first_delivery);
		$('first_delivery').observe('mouseup', check_first_delivery);
		$('first_delivery').observe('keyup', check_first_delivery);
		$('first_delivery').observe('change', update_fields);
		$('first_delivery').observe('mouseup', update_fields);
		$('first_delivery').observe('keyup', update_fields);
	}
	$$('.quantity').each(function (elem) {
		elem.observe('change', update_totals);
		elem.observe('mouseup', update_totals);
		elem.observe('keyup', update_totals);
	});
});
