
/* file:source/js/inCart.js */

if (window.isCartPage) {
	window.synFloatingCart = new (function () {
		this.handleCart = function() {
			try {
				var synFloatingCartFrameTest = /^synFloatingCartFrame/,
				    passedArguments = synFloatingCartFrameTest.test(window.name) ?
				      JSON.parse(unescape(window.name.replace(/^synFloatingCartFrame/, ""))) :
				      {},
				    cart = synParseCart();
				if (!cart) return;

				// get names of event buttons
				var eventTriggers = [];
				for (i in cart.events)
					eventTriggers.push(cart.events[i]);

				// build information to send back to top page
				var form = $(cart.form),
				    events = cart.events,
				    output = {
					items: $.map(cart.items, function(item) {
						var obj = {
							name: item.name,
							href: item.elements.name.href,
							cost: item.cost,
							price: item.price,
							quantity: item.quantity,
							quantityInput: item.elements.quantity.name,
							options: item.options
						};
						if (item.elements.image)
							obj.image = item.elements.image.src;
						return obj;
					}),
					subtotal: cart.subtotal,
					total: cart.total,
					tax: cart.tax,
					shipping: cart.shipping,
					form: {
						action: form.attr("action"),
						method: form.attr("method"),
						name: form.attr("name"),
						events: $.each(events, function(key, value) { events[key] = value.getAttribute("name"); }),
						elements: form.find("input, select").
						  not($.map(cart.items, function(item) { return item.elements.quantity; })).
						  not(eventTriggers).
						  map(function() {
							return {
								name: this.name,
								value: $(this).val()
							};
						  }).get()
					}
				    },
				    removeUndefined = function(obj) {
					    $.each(obj, function (key, value) {
						    if (typeof value === "undefined") delete obj[key];
					    });
				    };

				removeUndefined(output);
				removeUndefined(output.form);

				// create communication iframe
				function getStoreFloatingCartURL(storeURL) {
					var timestamp = "?" + (new Date()).getTime();
					return passedArguments.inEditor || passedArguments.isSearchPage || passedArguments.isTranslated ?
						passedArguments.referrer + (passedArguments.isSearchPage || passedArguments.isTranslated ? "" : timestamp) :
						storeURL.replace(/\/[^\/]*(\?.*)?$/, "/synfloatingcart.html") + timestamp;
				}

				// pass a flag to the communication IFRAME that tell's it we're not in a second frame
				if (!passedArguments.inFrame)
					output.refreshFrame = true;

				synCreateIframe({
					src: getStoreFloatingCartURL(passedArguments.referrer || cart.elements.keepShopping.href),
					name: "synFloatingCartCommFrame" + escape(JSON.stringify(output)),
					id: "synFloatingCartFrame"
				});

				if (!passedArguments.inEditor && passedArguments.baseHref) {
					// after sending back signal to close the overlay, send cart data back to store domain
					// make sure to tell it to refresh the data
					output.refreshFrame = true;
					synCreateIframe({
						src: getStoreFloatingCartURL(passedArguments.baseHref),
						name: "synFloatingCartCommFrame" + escape(JSON.stringify(output))
					});
				}
			} catch (e) {
				if (window.console) console.log(e);
			}
		};
	});
}

/* file:source/js/inStore.js */

if (!window.isCartPage) {
	window.synFloatingCart = new (function () {
		var overlayTimeout = null;
		this.cartData = null;

		this.receiveCartData = function(json) {
			try {
				if (this.storage) {
					this.storage.set("synFloatingCart", json);
				}
			} catch (e) {
				if (window.console) console.log(e);
			}
			this.cartData = JSON.parse(json);
			this.display();
			if (window.synOverlay) {
				// hide "add to cart" overlay
				$(window).trigger("synFloatingCart", { dataReceived: this.cartData });
				synOverlay.hide();
				if (overlayTimeout) {
					clearTimeout(overlayTimeout);
					overlayTimeout = null;
				}
			}
		};

		this.display = function() {
			var cart = this.cartData;
			for (var i = 0, containers = $(".synFloatingCart"), container; container = containers[i]; i++) {
				var container = $(container),
				    itemCount = 0;
				$.each(cart.items, function(key, item) { itemCount += item.quantity; });

				// remove currently displayed items
				container.find(".item").not(".hidden").remove();

				container.find(".loadingMessage").addClass("hidden");
				if (itemCount > 0) {
					container.find(".emptyMessage").addClass("hidden");

					function displayValue(jQuerySet, cssExpression, value) {
						var elements = jQuerySet.find(cssExpression),
						    valueElements = elements.find(".value");
						elements.add(valueElements).removeClass("hidden").end();
						var outputElements = (valueElements.length > 0 ? valueElements : elements);
						if (typeof value === "string" || typeof value === "number")
							outputElements.text(value);
						else
							outputElements.empty().append(value);
					}

					displayValue(container, ".itemCount", itemCount);
					if (cart.subtotal) displayValue(container, ".subtotal", cart.subtotal);
					if (cart.total) displayValue(container, ".total", cart.total);

					var template = container.find(".item")[0];
					if (template) {
						for (var j = 0, k = cart.items.length, item; j < k && (item = cart.items[j]); j++) {
							var elements,
							    valueElements,
							    row = template.cloneNode(true),
							    values = ["quantity", "name", "price", "cost"];

							template.parentNode.insertBefore(row, template);
							row = $(row);

							displayValue(row, ".name", $(document.createElement("a")).attr("href", item.href).text(item.name));
							displayValue(row, ".quantity", item.quantity);
							displayValue(row, ".cost", item.cost);
							displayValue(row, (item.quantity > 1 ? ".price, .priceEach" : ".price"), item.price);

							var optionsLength = item.options.length;
							if (optionsLength > 0) {
								var optionTemplate = row.find(".option"),
								    optionSeparator = row.find(".options").find(".separator");
								$.each(item.options, function(key, option) {
									var optionRow = optionTemplate.clone();
									optionRow.insertBefore(optionTemplate).removeClass("hidden");
									$.each(["name", "value", "price", "withoutPrice"], function(key, className) {
										if (option[className])
											optionRow.find("." + className).html(option[className]).removeClass("hidden");
									});
									if (key + 1 < optionsLength) {
										optionRow.append(optionSeparator.clone().removeClass("hidden"));
									}
								});
								row.find(".options").removeClass("hidden");
							}

							row.removeClass("hidden");
						}
					}

					container.removeClass("hidden");
				} else {
					container.find(".emptyMessage").removeClass("hidden");
					container.find(".itemCount, .subtotal, .total").addClass("hidden");
				}

				setTimeout(function() {
					$.event.trigger("synFloatingCartDisplayed");
				}, 0);
			}
		};

		this.loadData = function() {
			// create cart iframe
			var isYahooSearch = (location.host === "search.store.yahoo.net"),
			    attributes = {
				src: "",
				name: "synFloatingCartFrame" + escape(JSON.stringify({
					referrer: location.pathname === "/translate_c" ? $("#synFloatingCartTranslationLink").attr("href") :
					  isYahooSearch ? "http://search.store.yahoo.net/cgi-bin/nsearch?catalog=" + storeID :
					  location.search !== "" ?
					    location.href.replace(/\?\.ynsctx=.*$/, "") :
					    location.href,
					inEditor: /\.store\.yahoo\.net\/RT\/NEWEDIT/.test(location.href),
					isSearchPage: window.isSearchPage || isYahooSearch,
					isTranslated: location.pathname === "/translate_c", /* page is being translated by Google Translate */
					baseHref: $("base[href]").attr("href"),
					storeID: storeID,
					inFrame: true
				})),
				id: "synFloatingCartFrame"
			    };
			synCreateIframe(attributes);

			if (this.storage) {
				try {
					this.storage.get("synFloatingCart", function(ok, val) {
						var data = (val && val !== "") ? JSON.parse(val) : {};
						if (ok && data.items && !data.isDirty) {
							this.cartData = data;
							this.display();
						} else {
							this.scrapeCart();
						}
					}, this);
				} catch (e) {
					if (window.console) console.log(e);
					this.scrapeCart();
				}
			} else {
				this.scrapeCart();
			}

			// if there is an overlay and an "adding to cart" message, set each Floating
			//   Cart form to target the hidden IFRAME
			for (var i = 0, forms = $("form.synFloatingCartForm"); form = forms[i]; i++) {
				this.formHandler(form);
			};
		};

		this.scrapeCart = function() {
			$("#synFloatingCartFrame").attr("src", "http://order.store.yahoo.net/cgi-bin/wg-order?" + storeID);
			$(".synFloatingCart:has(.loadingMessage)").removeClass("hidden").find(".loadingMessage").removeClass("hidden");
		};

		this.init = function() {
			window.synFloatingCart.formHandler = (window.synOverlay && document.getElementById("synFloatingCartAdding")) ? function(form) {
				var target = $("#synFloatingCartFrame").attr("name");
				if (!target) return;

				$(form).attr("target", target).submit(function() {
					synOverlay.clickCloses = false;
					synOverlay.setContent($("#synFloatingCartAdding").clone().css("display", "block"));
					synOverlay.show();
					overlayTimeout = setTimeout(function() {
						// TODO: display "failed add to cart" message here
						$(window).trigger("synFloatingCart", { communicationTimeout: true });
						synOverlay.hide();
					}, 20000);
				});
			} : function() {};

			// create Persist storage (IE storage requires adding a DOM element to document.body)
			try {
				if (window.Persist) synFloatingCart.storage = new Persist.Store("synFloatingCart");
			} catch (e) {
				if (window.console) console.log(e);
			}
			
			if (!/^synFloatingCart/.test(window.name)) {
				try {
					// load data from storage, or scrape the cart if storage is empty
					synFloatingCart.loadData();
				} catch (e) {
					if (window.console) console.log(e);
				}
			}
		};
	});
}

/* file:source/js/inCommFrame.js */

if (!window.isCartPage) {
	synFloatingCart.commFrame = function() {
		var synFloatingCartCommFrame = /^synFloatingCartCommFrame/;
		if (synFloatingCartCommFrame.test(window.name)) {
			var dataText = unescape(window.name.replace(synFloatingCartCommFrame, "")),
			    data = JSON.parse(dataText);
			try {
				if (data.refreshFrame && window.synFloatingCart) {
					synFloatingCart.receiveCartData(dataText);
				} else if (window.parent.parent.synFloatingCart) {
					window.parent.parent.synFloatingCart.receiveCartData(dataText);
				}
			} catch (e) {
				if (window.console) console.log(e);
			}
		}
	};
}

/* file:source/js/synFloatingCart.js */

if (window.Persist) Persist.remove("ie");

// helper function to handle creation of IFRAMEs in IE
function synCreateIframe(attributes) {
	if (!$.browser.msie) {
		$(document.body).append($(document.createElement("iframe")).attr(attributes));
	} else {
		var arr = [],
		    div = document.createElement("div");
		for (i in attributes)
			arr.push(i + "='" + attributes[i] + "'");
		
		// This extra container DIV prevents later problems with stored DOM elements
		//   The code originall just added the HTML to the body ("document.body += ..."),
		//   but IE was losing handles to stored DOM element's parentNodes...
		document.body.appendChild(div);
		div.innerHTML += "<iframe " + arr.join(" ") + "></iframe>";
	}
};

(function() {
	if (!/^syn/.test("synertech")) return false;

	if (window.isCartPage) {
		// in Yahoo checkout

		// Prevent alert errors from other scripts in the page while inside the IFRAME
		if (/^synFloatingCartFrame/.test(window.name)) {
			try {
				// prevent the Yahoo "Cookie's not enabled" error
				window.alert = function() { return; };
			} catch (e) {};
		}

		$(document).ready(synFloatingCart.handleCart);
	} else {
		// not in Yahoo checkout
		$(document).ready(synFloatingCart.init);
	}
})();

// Second IFRAME handler. This code receives data back to the store's domain.
if (synFloatingCart.commFrame) {
	$(document).ready(synFloatingCart.commFrame);
}
