var ajaxSubmitCart = function (form, indicator, submit_clicked) {
	var form_data = form.serialize(true);

	if (submit_clicked) {
		form_data[submit_clicked.name] = submit_clicked.value;
	}

	var onLoading;
	if (indicator) {
		onLoading = function () {
			indicator.addClassName('working');
		};
	} else {
		onLoading = function () {};
	}

	new Ajax.Request(form.action + '?isAjaxRequest=true', {
		method: 'post',
		parameters: form_data,
		onLoading: onLoading,
		onComplete:  function (transport) {
			eval(transport.responseText);

			// public this here to avoid having a jerky animation later
			var error_list = $('error-list');
			var cart_errors = $('cart-errors');

			// updates
			var num_updates = cartUpdate.updates.length;
			for (i = 0; i < num_updates; ++i) {

				var my_div = $('cart-item_' + cartUpdate.updates[i].id);
				new Effect.Highlight(my_div, { duration: 0.5, startcolor: "#ff9900", endcolor: "#25272d"});
				my_div.down('input[type="text"]').value = '' + cartUpdate.updates[i].quantity;
				my_div.down('span.gray').update('(' + cartUpdate.updates[i].quantity + ')');
				my_div.down('.subtotal').update('$' + cartUpdate.updates[i].subtotal);
			}

			// deletes
			for (i = 0; i < cartUpdate.deleted_ids.length; ++i) {
				var my_div = $('cart-item_' + cartUpdate.deleted_ids[i]);
				new Effect.Highlight(my_div, { duration: 0.5, startcolor: "#ff9900", endcolor: "#25272d" });

				// if this is the only cart item, make the cart disappear
				if (undefined === $('cart').down('.cart-item', 1)) {
					var cart_summary = $('cart-summary');
					if (cart_summary.down('#cart-summary_wrapper')) {
						new WindowDisplayer('cart-summary').Close(function () {
							var container = cart_summary.up();
							container.removeChild(cart_summary);
							container.hide();
						});
					} else if (happy_advice_container = $('happyadvice_container')) {
						$('cart_container').hide();
						happy_advice_container.show();
					}
				} else {
					new Effect.Fade(my_div, { duration: 0.5, afterFinish: function () {
						// remove from form
						my_div.up().removeChild(my_div);

						// update cart total
						var new_total = '$' + cartUpdate.total;
					}});
				}
			}

			// errors
			var num_errors = cartUpdate.errors.length;
			if (error_list) {
				if (num_errors > 0) {
					var proto_error = $('proto-cart-error');
					error_list.update('');
					for (i = 0; i < num_errors; ++i) {
						new_error = proto_error.cloneNode(true);
						new_error.id = null;
						new_error.update(cartUpdate.errors[i]);
						error_list.appendChild(new_error);
						new_error.show();
					}

					if (!cart_errors.visible()) {
						if (window.attachEvent) {
							cart_errors.show();
							cart_errors.down().style.visibility = 'visible';
						} else {
							new WindowDisplayer('cart-errors').Open();
						}
					}
				} else {
					if (cart_errors.visible()) {
						if (window.attachEvent) {
							cart_errors.hide();
							cart_errors.down().style.visibility = 'hidden';
						} else {
							new WindowDisplayer('cart-errors').Close();
						}
					}
				}
			} else {
				var error_place = $('error_place');
				if (num_errors > 0) {
					$('errors_in_error_place').update(cartUpdate.errors.join("<br />"));
					if (!error_place.visible()) {
						new WindowDisplayer('error_place').Open();
					}
				} else {
					if (error_place.visible()) {
						new WindowDisplayer('error_place').Close();
					}
				}
			}

			// update handling charge and grand total, if present
			var handling_charge = $('handling-charge');
			var grand_total = $('grand-total');
			var handling = parseFloat(cartUpdate.handling);
			if (handling_charge && cartUpdate.handling) {
				if (handling) {
					handling_charge.update('$' + cartUpdate.handling);
					grand_total.update('$' + cartUpdate.grand_total);

					handling_charge.up('div.total').show();
					grand_total.up('div.total').show();
				} else {
					handling_charge.up('div.total').hide();
					grand_total.up('div.total').hide();
				}
			}

			$('cart-total').update('$' + cartUpdate.total);
			indicator.removeClassName('working');
		}
	});
};

var highlightCartItem = function (my_div) {
	new Effect.Highlight(my_div, { duration: 0.5, startcolor: "#ff9900", endcolor: "#25272d"});
};

var submitOnClickSubmit = function (e) {
	var my_input = Event.element(e);

	var my_form = my_input.up('form');
	var indicator = my_input.up('.lineitem');

	ajaxSubmitCart(my_form, indicator, my_input);

	Event.stop(e);
};

var submitOnEnter = function (e) {
	var my_input = Event.element(e);

	// only detect Enter
	if (13 === e.keyCode) {
		var my_form = my_input.up('form');
		var indicator = my_input.up('.lineitem');

		ajaxSubmitCart(my_form, indicator);

		Event.stop(e);
	}
};

var attachListenersToCart = function () {
	var cart = $('cart');

	if (cart) {
		cart.select('input[type="submit"]').invoke('observe', 'click', submitOnClickSubmit);
		cart.select('input[type="text"]').invoke('observe', 'keydown', submitOnEnter);
	}
};

document.observe('dom:loaded', attachListenersToCart);

var updateCart = function (my_form, transport, cart_container)
{
	// if the cart is not empty ...
	if (cart_container.down('#cart-summary')) {
		cart_container.update(transport.responseText);
		cart_container.select('div.modified-item').each( function (item) {
			highlightCartItem(item);
		});
	} else {
		cart_container.update(transport.responseText);
		cart_summary = $('cart-summary');
		cart_summary.hide();
		cart_summary.down().style.visibility = 'hidden';
		cart_container.show();
		new WindowDisplayer(cart_summary.id).Open();
	}
	my_form.down('input[type="submit"]').up().removeClassName('working');
	attachListenersToCart();
};

var addItemToCart = function (e)
{
	var my_form = Event.element(e);

	new Ajax.Request(my_form.action, {
		method: 'post',
		parameters: my_form.serialize(true),
		onLoading: function () {
			my_form.down('input[type="submit"]').up().addClassName('working');
		},
		onComplete:  function (transport) {
			var cart_container = $('put-cart-here');

			var scrollOffsets = document.viewport.getScrollOffsets();
			var viewport_height = document.viewport.getHeight();
			var elementOffsets = cart_container.cumulativeOffset();

			if (elementOffsets['top'] > scrollOffsets['top'] && elementOffsets['top'] < scrollOffsets['top'] + viewport_height + 20) {
				updateCart(my_form, transport, cart_container);
			} else {
				new Effect.ScrollTo(cart_container, {duration: 0.3, afterFinish: function () {
					updateCart(my_form, transport, cart_container);
				}});
			}
		}
	});

	Event.stop(e);
};

var updateCartItems = function (item_ids) {
};

var calculateStickerPrice = function (quantity) {
	var price_points = PHP.get('price_points');
	if (price_points.length) {
		for (i = 1; i < price_points.length; ++i) {
			if (price_points[i]['quantity'] > quantity) {
				return price_points[i-1]['price'];
			}
		}

		return price_points[i-1]['price'];
	} else {
		return PHP.get('price');
	}
}

var formatCurrency = function (amount) {
	amount = Math.ceil(100.0 * amount) / 100.0;
	amount = String(amount);
	if (amount.indexOf('.') == -1) {
		return amount + '.00';
	} else {
		var dollars_and_cents = amount.split('.');
		var cents = dollars_and_cents[1];
		if (!cents) cents = '';
		for (i = cents.length; i < 2; ++i) {
			cents += '0';
		}

		return dollars_and_cents[0] + '.' + cents.substr(0, 2);
	}
}

var setStickerQuantity = function (e) {
	var my_input = Event.element(e);

	var quantity = parseInt(my_input.value);
	if (quantity > 0) {
		var price = calculateStickerPrice(quantity);

		var quantity_info = $('sticker-quantity-info');
		if (quantity_info) {
			quantity_info.down('#number-of-stickers').update(quantity);
			quantity_info.down('#price-per-sticker').update(formatCurrency(price));
			quantity_info.show();
		}

		$('item-total').update('$' + formatCurrency(quantity * price));
	}
};

function showHelp(helpterm, helpdef, morehelp) {
	var content = '<div class="hovcontain hovnone"><div class="hoverbox"> <div><strong>QuickHelp:&nbsp;</strong>' + helpterm + '</div> ';

	content = content + '<span><strong>Definition:&nbsp;</strong>' + helpdef + '</span>';
	
	if(morehelp != "")
	{
		content = content + '<span><em>[' + morehelp + ']</em></span>';
	}

	content = content + '</div></div>';

	$('submission').innerHTML = content;
	submissiondisplay.display = "";
	yoffset = defaultyoffset;

	return false;
}

var StoreAddressInfo = {};
var setUpAddress = function (which_form) {
	if (which_form !== 'shipping' && which_form !== 'billing') return;

	var country_input = $(which_form + '_country');
	var is_US = PHP.get(which_form + '_is_usa');
	StoreAddressInfo.is_US = is_US;

	var selectedUS = function (select) {
		return select.options[select.selectedIndex].value == PHP.get('usa_country_id');
	};

	var switchForm = function (e) {
		var elem = Event.element(e);
		if (elem) {
			if (is_US && !selectedUS(elem)) {
				StoreAddressInfo.switchToForeign();
			} else if (!is_US && selectedUS(elem)) {
				StoreAddressInfo.switchToUS();
			}
		}
	};

	StoreAddressInfo.switchToForeign = function () {
		is_US = false;

		var line3 = $(which_form + '_line3');
		var line4 = $(which_form + '_line4');
		var state = $(which_form + '_state');
		var province = $(which_form + '_province');
		var zip = $(which_form + '_zip');

		if (line3) line3.up('div').show();
		if (line4) line4.up('div').show();
		if (state && province) {
			state.up('div').hide();
			province.up('div').show();
		}

		if (zip) {
			zip_label = zip.up('div').down('label[for="' + zip.id + '"]');
			if (zip_label) zip_label.update('Postal Code');
		}
	};

	StoreAddressInfo.switchToUS = function () {
		is_US = true;

		var line3 = $(which_form + '_line3');
		var line4 = $(which_form + '_line4');
		var state = $(which_form + '_state');
		var province = $(which_form + '_province');
		var zip = $(which_form + '_zip');

		if (line3) line3.up('div').hide();
		if (line4) line4.up('div').hide();
		if (state && province) {
			state.up('div').show();
			province.up('div').hide();
		}

		if (zip) {
			zip_label = zip.up('div').down('label[for="' + zip.id + '"]');
			if (zip_label) zip_label.update('Zip Code');
		}
	};

	var selectText = function (e) {
		Event.element(e).select();
	}

	// we put this on "blur", because "change" doesn't play nice with the autocompletes
	if (country_input) {
		country_input.observe('change', switchForm);
	}
};

