var Cart = {

 toString	: function() { return "[object Cart]"; },

 numItemsDisplay	: "",
 items	: [],
 coupons	: [],
 eventDetails	: [],
 customerInfoXML	: "",
 storeInfoXML	: "",
 deTarget	: "",
 cartTarget : "",
 onClickDate	: function() {},

 setNumItemDisplay	: function(numItemDisplayObj) {
	this.numItemsDisplay	= numItemDisplayObj;
 },

 updateNumItemDisplay	: function () {
	this.numItemsDisplay.innerHTML	= this.items.length;
 },

 addCoupon	: function(coupon,options) {
	for (var cIdx = 0; cIdx < this.coupons.length; cIdx++) {
		if (this.coupons[cIdx].data.code == coupon.data.code) {
			alert("You have already applied this coupon.");
			return;
		}
	}
	this.coupons.push(coupon);
	return;
 },

 addItem	: function(item,options) {
	var date	= options["date"];
	if (this.isInCart(item,date)) {
//		alert("You already added this item to your cart!");
		return 0;
	}
//alert("Adding " + item.name + " to cart for " + str2date(date));
	var cartItem	= new Object();
	    cartItem.Product	= item;
	    cartItem.Options	= options;
	if (!cartItem.Options["type"]) { cartItem.Options["type"] = "product"; }
	this.items.push(cartItem);
	var type	= cartItem.Options["type"];
	if (type == "product") {
		this.updateNumItemDisplay();
	}
 },

 isInCart	: function(item,date) {
	for (var iIdx = 0; iIdx < this.items.length; iIdx++) {
		var cartItem	= this.items[iIdx];
		if ((cartItem.Product == item) && (cartItem.Options["date"] == date)) {
//alert(cartItem.Product.name + "\n" + cartItem.Options.date + "\n" + cartItem.Options.custom[0].value + "\n" + cartItem.Product.name + iIdx);
			return cartItem;
		}
	}
	return 0;
 },

 listItems	: function() {
	return this.items;
 },

 clearCartDisplay	: function() {
	var prodTab	= this.cartTarget;
	var numrows = prodTab.rows.length;
	for (var rIdx = 0; rIdx < numrows; rIdx++) {
		prodTab.deleteRow(0);
	}
 },

 displayCart	: function() {
	var numEvents	= 0;
	var prodTab	= this.cartTarget;
	    prodTab.className	= "cartList";
	this.clearCartDisplay();
	if (!this.items.length) {
		var emptyRow	= prodTab.insertRow(-1);
//		emptyRow.insertCell(-1);
		var emptyCell	= emptyRow.insertCell(-1);
		    emptyCell.colSpan	= 6;
		    emptyCell.className	= "header";
		    emptyCell.innerHTML	= "No items in cart";
		this.deTarget.style.display	= "none";
		return;
	}
	this.deTarget.style.display	= "";
	var sortedItems	= this.items.sort(this.sortItemsByDate);
	var hRow	= prodTab.insertRow(-1);
	    hRow.className	= "header";
	    hRow.style.fontWeight	= "bold";
	    hRow.style.textAlign	= "center";
	var hDateCell	= hRow.insertCell(-1);
	    hDateCell.innerHTML = "Date";
	    hDateCell.colSpan	= 2;
	var hStartCell	= hRow.insertCell(-1);
	    hStartCell.innerHTML = "Start Time";
	var hEndCell	= hRow.insertCell(-1);
	    hEndCell.innerHTML = "End Time";
	var dTotalCell	= hRow.insertCell(-1);
	    dTotalCell.innerHTML = "Disc";
	    dTotalCell.colSpan	= 1;
	var hTotalCell	= hRow.insertCell(-1);
	    hTotalCell.innerHTML = "Total";
	    hTotalCell.colSpan	= 1;
	for (var iIdx = 0; iIdx < sortedItems.length; iIdx++) {
		var item	= sortedItems[iIdx];
		var date	= item.Options["date"];
		var eRow	= 0;
		for (var rIdx = 0; rIdx < prodTab.rows.length; rIdx++) {
			if (prodTab.rows[rIdx].date	== date) {
				eRow	= prodTab.rows[rIdx];
				break;
			}
		}
		if (!eRow) {
			eRow	= prodTab.insertRow(-1);
			eRow.eventPrice	= 0;
		    eRow.Cart	= this;
			eRow.className	= "event";
			eRow.date = date;
			eRow.eventIndex	= ++numEvents;
			eRow.updatePrice	= function(iPrice) {
				var eTotal	= document.getElementById("cart" + this.date + "Total");
//				var ePrice	= parseInt(this.eventPrice.replace(/^\$/,""));
//				var ePrice	= parseInt(eRow.cells[3].innerHTML.replace(/^\$/,""));
				this.eventPrice	+= iPrice;
				eTotal.innerHTML	= "$" + this.eventPrice;
				this.applyCoupons();
//				eRow.cells[3].innerHTML	= "$" + ePrice;
			};
			eRow.getCoupons	= function() {
				var retArr	= [];
				for (var cIdx = 0; cIdx < this.Cart.coupons.length; cIdx++) {
					var coupon	= this.Cart.coupons[cIdx];
					var tmpObj	= {"coupon":coupon,"discount":0,"datestr":this.date};
					var disc	= coupon.data.discount;
					if (!eval("this.eventIndex" + coupon.data.applyto.eventno)) { continue; }
					var eTotal	= document.getElementById("cart" + this.date + "Total");
					var eDisc	= document.getElementById("cart" + this.date + "Discount");
					var discInt	= parseInt(disc.replace(/\D/g,""));
					if (disc.match(/%/)) { tmpObj.discount = -discInt*this.eventPrice/100; }
					else if (disc.match(/$/)) { tmpObj.discount = -discInt; }
					retArr.push(tmpObj);
				}
				return retArr;
			};
			eRow.applyCoupons	= function() {
				var appliedCoupons = this.getCoupons();
				var discount	= 0;
				var coupontext	= "Applied Coupons";
				if (!appliedCoupons.length) { return; }
				for (var cIdx = 0; cIdx < appliedCoupons.length; cIdx++) {
					var disc	= appliedCoupons[cIdx].discount;
					discount += appliedCoupons[cIdx].discount;
					coupontext	+= " : " + appliedCoupons[cIdx].coupon.data.code + " ($" + disc + ")"; 
				}
				var eTotal	= document.getElementById("cart" + this.date + "Total");
				var eDisc	= document.getElementById("cart" + this.date + "Discount");
				var newPrice = parseInt(this.eventPrice + discount);
				if (newPrice < 0) { newPrice = 0; }
				eTotal.innerHTML	= "$" + parseInt(newPrice);
				eTotal.title	= "(" + this.eventPrice + " + " + discount + ")";
				eDisc.innerHTML	= "$" + parseInt(discount);
				eDisc.title	= coupontext;
			};
			var dateCell    = eRow.insertCell(-1);
			    dateCell.datestr	= date;
			    dateCell.innerHTML  = str2date(date);
			    dateCell.eRow	= eRow;
			    dateCell.className	= "clickable";
			    dateCell.onclick	= this.onClickDate;
			    dateCell.colSpan	= 2;
			var dropoffCell = eRow.insertCell(-1);
			    dropoffCell.style.textAlign = "center";
			    dropoffCell.eRow	= eRow;
			var pickupCell  = eRow.insertCell(-1);
			    pickupCell.style.textAlign  = "center";
			    pickupCell.eRow	= eRow;
			var discCell   = eRow.insertCell(-1);
			    discCell.innerHTML	= "$0";
			    discCell.eRow	= eRow;
			    discCell.className	= "discount";
			    discCell.id	= "cart" + date + "Discount";
			    discCell.colSpan	= 1;
			var totalCell   = eRow.insertCell(-1);
			    totalCell.innerHTML	= "0";
			    totalCell.eRow	= eRow;
			    totalCell.id	= "cart" + date + "Total";
			    totalCell.colSpan	= 1;
			var dropoffInput	= document.createElement("INPUT");
			    dropoffInput.cart	= this;
			    dropoffInput.type	= "text";
			    dropoffInput.size	= "8";
			    dropoffInput.id		= "dropoff" + date;
			    dropoffInput.onchange	= function() { this.cart.updateEventDetails(this); };
			    dropoffInput.value	= this.eventDetails[dropoffInput.id] || "11:00";
			var dropoffAmPm	= document.createElement("SPAN");
			    dropoffAmPm.title	= "Click to change am/pm";
			    dropoffAmPm.cart	= this;
			    dropoffAmPm.className	= "clickable";
			    dropoffAmPm.id		= "dropoffampm" + date;
			    dropoffAmPm.style.color	= "blue";
			    dropoffAmPm.style.textDecoration	= "underline";
			    dropoffAmPm.innerHTML	= this.eventDetails[dropoffAmPm.id] || "am";
			    dropoffAmPm.value	= dropoffAmPm.innerHTML;
			    dropoffAmPm.onclick	= function() {
					this.innerHTML	= (this.innerHTML == "am") ? "pm" : "am";
			    	this.value	= this.innerHTML;
					this.cart.updateEventDetails(this);
			    };
			var pickupInput	= document.createElement("INPUT");
			    pickupInput.cart	= this;
			    pickupInput.type	= "text";
			    pickupInput.size	= "8";
			    pickupInput.id		= "pickup" + date;
			    pickupInput.onchange	= function() { this.cart.updateEventDetails(this); };
			    pickupInput.value	= this.eventDetails[pickupInput.id] || "4:00";
			var pickupAmPm	= document.createElement("SPAN");
			    pickupAmPm.cart	= this;
			    pickupAmPm.className	= "clickable";
			    pickupAmPm.title	= "Click to change am/pm";
			    pickupAmPm.id		= "pickupampm" + date;
			    pickupAmPm.style.color	= "blue";
			    pickupAmPm.style.textDecoration	= "underline";
			    pickupAmPm.innerHTML	= this.eventDetails[pickupAmPm.id] || "pm";
			    pickupAmPm.value	= pickupAmPm.innerHTML;
			    pickupAmPm.onclick	= function() {
					this.innerHTML	= (this.innerHTML == "am") ? "pm" : "am";
			    	this.value	= this.innerHTML;
					this.cart.updateEventDetails(this);
			    };
			dropoffCell.appendChild(dropoffInput);
			dropoffCell.appendChild(dropoffAmPm);
			pickupCell.appendChild(pickupInput);
			pickupCell.appendChild(pickupAmPm);
		}
		var iRow = prodTab.insertRow(eRow.sectionRowIndex + 1);
		    iRow.item	= item;
			iRow.className	= "item";
		    iRow.date	= date;
		    iRow.price	= parseInt(item.Options["price"].replace(/^\$/,""));
		    iRow.Cart	= this;
		    iRow.eRow	= eRow;
		var deleteCell	= iRow.insertCell(-1);
		    deleteCell.iRow	= iRow;
		    deleteCell.eRow	= eRow;
		    deleteCell.colSpan	= 2;
		var itemCell	= iRow.insertCell(-1);
		    itemCell.style.textAlign	= "center";
		    itemCell.iRow	= iRow;
		    itemCell.eRow	= eRow;
		var priceCell	= iRow.insertCell(-1);
		    priceCell.iRow	= iRow;
		    priceCell.eRow	= eRow;
		var editCell	= iRow.insertCell(-1);
		    editCell.iRow	= iRow;
		    editCell.eRow	= eRow;
		    editCell.colSpan	= 2;
		var thumb	= document.createElement("IMG");
		    thumb.iRow	= iRow;
		    thumb.eRow	= eRow;
		    thumb.src	= item.Product.imageth;
		    thumb.alt	= item.Product.name;
		    thumb.style.width	= "30px";
		    thumb.style.height	= "30px";
/*
thumb.onclick	= function() {
var cojson	= this.iRow.Cart.getCheckoutJSON();
if (!cojson) { return; }
DEBUGPANE.innerHTML	+= "JSON: " + this.iRow.Cart.getCheckoutJSON().toJSONString() + "\n";
};
*/
		var nameSpan	= document.createElement("SPAN");
		    nameSpan.iRow	= iRow;
		    nameSpan.eRow	= eRow;
		    nameSpan.innerHTML	= item.Product.name;
		var delText	= document.createElement("SPAN");
		    delText.style.fontWeight	= "bold";
		    delText.style.color	= "red";
		if (item.Options["type"] == "product") {
			// delete Button
			delImg	= document.createElement("IMG");
			delImg.src = "/Icons/failed-sm.gif";
		    delImg.iRow	= iRow;
		    delImg.eRow	= eRow;
		    delImg.onclick	= function() { this.iRow.Cart.deleteItem(this.iRow); }
		    delImg.className	= "clickable";
			delImg.title	= "remove from cart";
			// edit Button
			editImg	= document.createElement("IMG");
			editImg.src = "/Icons/edit.gif";
		    editImg.iRow	= iRow;
		    editImg.eRow	= eRow;
			editImg.Options	= new Object();
			editImg.Options.float	= 1;
			editImg.Options.cartitem	= editImg.iRow.item;
//		    editImg.onclick	= function() { this.iRow.item.Product.displayDescription({float: 1,cartitem: this.iRow.item }); };
		    editImg.onclick	= function() { this.iRow.item.Product.displayDescription(this.Options); };
		    editImg.className	= "clickable";
			editImg.title	= "edit options";
			// add buttons to cell
			deleteCell.appendChild(delImg);
			editCell.appendChild(editImg);
		}
		var itemItem	= (item.Options["type"] == "product") ? thumb : nameSpan;
		itemCell.appendChild(itemItem);
		eRow.updatePrice(iRow.price);
		priceCell.innerHTML	= "$" + iRow.price;
//alert("price: " + iRow.price + "\ntotPrice: " + eRow.cells[3].innerHTML.replace(/^\$/,""));
	}
//	displayCustomerInfoRequest();
 },

 updateEventDetails	: function(input) {
	var inputId		= input.id;
	var inputVal	= input.value;
	input.cart.eventDetails[inputId] = inputVal;
	if (!input.cart.storeInfoXML) { return; }
	var eventId	= inputId.replace(/\D/g,"");
	if (inputId.match(/pickup|dropoff/i)) {
		var pickTime	= document.getElementById("pickup" + eventId).value;
		var pickTimeAmPm	= document.getElementById("pickupampm" + eventId).value;
		var pick	= getElementValue(input.cart.storeInfoXML,"Close","00");
		var thisPick	= time2int(pickTime + pickTimeAmPm);
		var lastPick	= time2int(pick);
		var dropTime	= document.getElementById("dropoff" + eventId).value;
		var dropTimeAmPm	= document.getElementById("dropoffampm" + eventId).value;
		var drop	= getElementValue(input.cart.storeInfoXML,"Open","00");
		var thisDrop	= time2int(dropTime + dropTimeAmPm);
		var lastDrop	= time2int(drop);
		if ((parseInt(thisPick) > parseInt(lastPick)) || (parseInt(thisDrop) < parseInt(lastDrop))) {
			input.cart.addFee(eventId);
//			alert("You will incur a $50 charge\n" + thisPick + " > " + lastPick);
		} else {
			input.cart.removeFee(eventId);
		}
	}
 },

 addFee	: function(eventId) {
	var afterFee	= this.Fees["After Hours"];
	var options	= new Array();
	options["date"] = eventId;
	options["type"] = "fee";
	options["price"] = afterFee["price"];
	this.addItem(afterFee,options);
	this.displayCart();
 },

 removeFee	: function(eventId) {
	for (var iIdx = 0; iIdx < this.items.length; iIdx++) {
		var item	= this.items[iIdx];
		if ((item.Options["date"] == eventId) && (item.Options["type"] == "fee")) {
			this.items.splice(iIdx,1);
			break;
		}
	}
	this.displayCart();
 },

 deleteItem	: function(iRow) {
	var item	= iRow.item;
//	var rIndex	= iRow.sectionRowIndex;
	for (var iIdx = 0; iIdx < this.items.length; iIdx++) {
		if (this.items[iIdx] == item) {
//alert(this.items[iIdx].Product.name + "\n" + this.items[iIdx].Options["date"]);
			this.items.splice(iIdx,1);
			break;
		}
	}
	this.updateNumItemDisplay();
	this.displayCart();
//	iRow.eRow.updatePrice(parseInt(-iRow.price));
//	iRow.parentNode.deleteRow(rIndex);
 },

 displayCustomerInfoRequest	: function() {
	this.deTarget.innerHTML	= "";
	var fields	= this.customerInfoXML.getElementsByTagName("Data");
	for (var fIdx = 0; fIdx < fields.length; fIdx++) {
		var field	= fields[fIdx];
		var fName	= field.getAttribute("name");
		var fSize	= field.getAttribute("size");
		var fRows	= field.getAttribute("rows");
		var fisReq	= field.getAttribute("isRequired");
		var fRegex	= field.getAttribute("regex");
		var fDispl	= field.getAttribute("display");
		var options	= field.getElementsByTagName("Options");
	}
 },

 sortItemsByDate	: function(a,b) {
	var aVal    = parseInt(a.Options["date"]);
	var bVal    = parseInt(b.Options["date"]);
	if (aVal == bVal) { return  0; }
	if (aVal  < bVal) { return -1; }
	if (aVal  > bVal) { return  1; }
 },

 setStoreInfoXML	: function(storeInfoXML) {
	this.storeInfoXML	= storeInfoXML;
    this.Fees    = new Array();
    var afterHoursFee   = new Object();
	var hourOpen	= getElementValue(this.storeInfoXML,"Open","8:00am");
	var hourClose	= getElementValue(this.storeInfoXML,"Close","8:00pm");
    afterHoursFee.name  = "After Hours<BR>" + hourOpen + " - " + hourClose;
    afterHoursFee.datafile  = "AfterHoursFee.xml";
    afterHoursFee.price = getElementValue(this.storeInfoXML,"AfterHoursFee","$0");
    afterHoursFee.type  = "fee";
	this.Fees["After Hours"]	= afterHoursFee;
//alert("added " + afterHoursFee.price + "After Hours Fee");
 },

 setCustomerInfoXML	: function(customerInfoXML) {
	this.customerInfoXML	= customerInfoXML;
 },

 getCheckoutJSON	: function() {
	var variables	= new Object();
	variables.customer	= new Object();
	variables.items	= new Array();
	for (var iIdx = 0; iIdx < this.items.length; iIdx++) {
		var coItem	= new Object();
		var item	= this.items[iIdx];
		var datestr	= item.Options["date"];
		var dropoff		= document.getElementById("dropoff" + datestr).value + document.getElementById("dropoffampm" + datestr).value;
		var pickup		= document.getElementById("pickup" + datestr).value + document.getElementById("pickupampm" + datestr).value;
		coItem.price	= item.Options["price"];
		coItem.datestr	= datestr;
		coItem.dropoff	= dropoff;
		coItem.pickup	= pickup;
		coItem.datafile	= item.Product.datafile;
		coItem.options	= new Array();
		if (!item.Options.custom) { item.Options.custom = []; }
		for (var oIdx = 0; oIdx < item.Options.custom.length; oIdx++) {
			var cOpt	= item.Options.custom[oIdx];
			var cOptObj	= new Object();
			cOptObj.name	= cOpt.name;
			cOptObj.value	= cOpt.value;
			coItem.options.push(cOptObj);
		}
		variables.items.push(coItem);
	}
	var custFields	= ["Name",
					   "Address",
					   "Address2",
					   "City",
					   "State",
					   "Zip",
					   "Phone",
					   "PhoneAlt",
					   "Email",
					   "WhichAd",
					   "Comments"];
	for (var fIdx = 0; fIdx < custFields.length; fIdx++) {
		var f	= custFields[fIdx];
		var input	= document.getElementById("order" + f);
		var v	= input.value;
		var req	= input.className.match(/required/);
		if (req && !v) {
			alert("You missed some required fields");
			return 0;
		}
		variables.customer[f]	= v;
	}
	variables.coupons	= new Array();
	var prodTab = Cart.cartTarget;
	for (var rIdx = 0; rIdx < prodTab.rows.length; rIdx++) {
		var eRow	= prodTab.rows[rIdx];
		if (!prodTab.rows[rIdx].className.match(/event/)) { continue; }
		var eCouponArr	= eRow.getCoupons();
		for (var cIdx = 0; cIdx < eCouponArr.length; cIdx++) {
			var eCoupon	= eCouponArr[cIdx];
			var code	= eCoupon.coupon.data.code;
			var discount= eCoupon.discount;
			var datestr	= eCoupon.datestr;
			var tmpObj	= {"code":code,"discount":discount,"datestr":datestr};
			variables.coupons.push(tmpObj);
		}
	}
//	var input	= document.getElementById("orderCoupon");
//	if (input) {
//		var v	= input.value;
//		variables.coupons.push(v);
//	}
	return variables;
 },

 getCheckoutVariables	: function() {
	var variables	= new Array();
	for (var iIdx = 0; iIdx < this.items.length; iIdx++) {
		var item	= this.items[iIdx];
		var datestr	= item.Options["date"];
		var fieldpre	= "order" + datestr + iIdx;
		var dropoff		= document.getElementById("dropoff" + datestr).value + document.getElementById("dropoffampm" + datestr).value;
		var pickup		= document.getElementById("pickup" + datestr).value + document.getElementById("pickupampm" + datestr).value;
		variables[fieldpre + "price"]	= item.Options["price"];
		variables[fieldpre + "datestr"]	= datestr;
		variables[fieldpre + "dropoff"]	= dropoff;
		variables[fieldpre + "pickup"]	= pickup;
		variables[fieldpre + "datafile"]	= item.Product.datafile;
//		variables[fieldpre + "unit"]	= item.Product.unit;
	}
	var custFields	= ["Name",
					   "Address",
					   "Address2",
					   "City",
					   "State",
					   "Zip",
					   "Phone",
					   "PhoneAlt",
					   "Email",
					   "WhichAd",
					   "Comments"];
	for (var fIdx = 0; fIdx < custFields.length; fIdx++) {
		var f	= custFields[fIdx];
		var input	= document.getElementById("order" + f);
		var v	= input.value;
		var req	= input.className.match(/required/);
		if (req && !v) {
			alert("You missed some required fields");
			return 0;
		}
		variables["cust" + f]	= v;
	}
	var input	= document.getElementById("orderCoupon");
	if (input) {
		var v	= input.value;
		variables["coupon00"] = v;
	}
	return variables;
 },

 getCheckoutVariablestr	: function(isJSON) {
	var variablestr = "isBETA=" + isBETA;
	if (isJSON) {
		var variables	= this.getCheckoutJSON();
		if (!variables) { return 0; }
		variablestr += "&json=" + escape(variables.toJSONString());
	} else {
		var variables	= this.getCheckoutVariables();
		if (!variables) { return 0; }
		for (var f in variables) {
//DEBUGPANE.innerHTML	+= f + "\t= " + variables[f] + "\n";
			var v = variables[f];
			v = escape(v);
			variablestr += "&" + f + "=" + v;
		}
DEBUGPANE.innerHTML	+= variablestr;
	}
	return variablestr;
 },

 gotCouponData : function(couponarr) {
	if (!Cart.items.length) { alert("Please add something to your cart before redeeming a coupon."); return; }
	var coupondata	= couponarr[0];
	if (!coupondata) { 
        alert('Your coupon does not appear to be valid');
        return 0; 
    }
	var coupon	= new Coupon(coupondata);
	var discount	= coupon.data.discount;
	var type	= coupon.data.type;
	if (type == "percent") {}
	var cprice	= "$-" + coupon.data.discount;
	var sortedItems	= Cart.items.sort(Cart.sortItemsByDate);
	var lastitem	= sortedItems[sortedItems.length - 1];
	var lastdate	= lastitem.Options["date"];
	Cart.addCoupon(coupon,{"date":lastdate,"type":"coupon","price":cprice});
	Cart.displayCart();
 }

};

//AJAX.createSRCtag('/Coupon.js',"");

