function PipForm(formObj) {
	this.init(formObj);
}

PipForm.prototype = {
	init: function(formObj) {
		this.formObj = formObj;
	},
	
  productsList: new Array(),

  setProductMap: function(mapObject) {
  	this.productMap = mapObject;
  	this.getProductsList(this.productMap.products.productSet, "id");
  },
  
  getProductsList: function(srcArray, key) {
    for (var i=0; i<srcArray.length; i++) {
      this.productsList.push(srcArray[i][key]);
    }
  },
  
	checkAll: function(srcObj, partialFldStr) {
		var mark =  (!isEmpty(srcObj) && srcObj.checked == true) ? true:false;
		var missingFld = new Array();
		var foundFlag = false;
		
		for (var i=0; i<this.productsList.length; i++) {
			var fldId = partialFldStr + this.productsList[i];
			if (!isEmpty(dojo.byId(fldId))) {
				dojo.byId(fldId).checked = mark;
				foundFlag = true;
			}
			else {
				missingFld.push(fldId);
			}
		}
		
		if (!foundFlag) {
			var str = missingFld.join("\n");
			return "The following fields were not found:\n" + str;
		}
		else {
			return true;
		}
	},
	
	selectAll: function(srcObj, partialFldStr) {
		var selectedIndex =  (!isEmpty(srcObj)) ? srcObj.selectedIndex : 0;
		var missingFld = new Array();
		var foundFlag = false;
		
		for (var i=0; i<this.productsList.length; i++) {
			var fldId = partialFldStr + this.productsList[i];
			if (!isEmpty(dojo.byId(fldId))) {
				dojo.byId(fldId).selectedIndex = selectedIndex;
				foundFlag = true;
			}
			else {
				missingFld.push(fldId);
			}
		}
		
		if (!foundFlag) {
			var str = missingFld.join("\n");
			return "The following fields were not found:\n" + str;
		}
		else {
			return true;
		}
	}
}

function PipCart(formObj) {
  this.init(formObj);
}

PipCart.prototype = {
  init: function(formObj) {
    this.formObj = formObj;
  },
  
  productsList: new Array(),
  
  pipFormFieldMap: new Object(),
  
  pipCartMap: new Object(),
  
  productMap: new Object(),
  
  dropdownObj: null,
  
  setFormFieldMap: function(mapObject) {
  	this.pipFormFieldMap = mapObject;
  },
  
  setCartMap: function(mapObject) {
  	this.pipCartMap = mapObject;
  },
  
  setProductMap: function(mapObject) {
  	this.productMap = mapObject;
  	this.getProductsList(this.productMap.products.productSet, "id");
  },
  
  setDropdownObj: function(object) {
  	this.dropdownObj = object;
  },
  
  getProductsList: function(srcArray, key) {
    for (var i=0; i<srcArray.length; i++) {
      this.productsList.push(srcArray[i][key]);
    }
  },
  
  convertFormToXml: function() {
  	if (isEmpty(this.pipFormFieldMap)) return "Map of the PIP form fields is required";
  	
    var result = new Array();
    var error = new Array();
    var isGiftWrap = false;
    var giftCard = 0;
    var shipTo = "";
    
    for (var i=0; i<this.productsList.length; i++) {
      var qtyFld = this.pipFormFieldMap.qty.id + this.productsList[i];
      var skuFld = this.pipFormFieldMap.sku.id + this.productsList[i];
      var isMultiple = this.pipFormFieldMap.isMultiple.id + this.productsList[i];
      
      if (!isEmpty(dojo.byId(qtyFld)) || !isEmpty(dojo.byId(skuFld))) {
	      if (isEmpty(dojo.byId(qtyFld).value) && isEmpty(dojo.byId(skuFld).value)) {
					continue;
	      }
      	else if (dojo.byId(qtyFld).value>0 && isEmpty(dojo.byId(skuFld).value)) {
     			error.push({"id": this.productsList[i], "message": "Please select an item from the dropdown."});
      	}
      	else if (!isEmpty(dojo.byId(isMultiple)) && 
      					((dojo.byId(isMultiple).value == "0" && !isEmpty(dojo.byId(qtyFld).value)) || 
      						(dojo.byId(isMultiple).value == "1" && !isEmpty(dojo.byId(skuFld).value)))){
	        var sku = XmlUtil.element("sku", dojo.byId(skuFld).value);
	        var qty = XmlUtil.element("quantity", dojo.byId(qtyFld).value);
	        
	        result.push(XmlUtil.element("item", sku + qty));
	        
	        var giftwrapFld = this.pipFormFieldMap.giftWrap.id + this.productsList[i];
	        //alert(giftwrapFld);
	        if (dojo.byId(giftwrapFld).checked == true && !isGiftWrap) {
	          isGiftWrap = true;
	        }
	        
	        var giftCardFld = dojo.byId(this.pipFormFieldMap.giftCard.id);
	       	giftCard = (!isEmpty(giftCardFld) && giftCardFld.value > 0 && giftCard == 0) ? "1":"0";
	       	
	       	var shipToFld = dojo.byId(this.pipFormFieldMap.shipTo.id + this.productsList[i]);
	       	shipTo = (!isEmpty(shipToFld)) ? shipToFld.options[shipToFld.selectedIndex].value : shipToFld.options[0].value;
      	}
      }
    }
    
    if (error.length > 0) {
   		this.showError(error);
    	return false;
    }
    
    if (result.length > 0) {
	    var resultStr = result.join("");
	    var firstTagStr =  XmlUtil.element("isgiftcard", giftCard) 
	    								   + XmlUtil.element("items", resultStr) 
	    								   + XmlUtil.element("shiptoinfo", shipTo) 
	    								   + XmlUtil.element("wrapany", (isGiftWrap ? "1" : "0")) 
	    								   ;
	    var xmlStr = '<?xml version="1.0" encoding="UTF-8"?>' + XmlUtil.element("addtocartrequest", firstTagStr);
	    
	    return xmlStr;
    }
    else {
    	alert("Please select an item to add to your basket.");
    }
  },
               
  addToCart: function() {
    var formXml = this.convertFormToXml();
   	
   	if (!formXml) return false;
   
   addItem(formXml);
  },

	alertProps: function(o) {
		var properties = typeof o + "\n";
		properties = properties + o + "\n";
		if (typeof o != "string") {
      for (p in o) {
      	properties = properties + p + "\n";
      }
		}
		
		alert(properties);
	},
  
  processResults: function(ajaxResponse) {
  	ajaxResponse = ((typeof ajaxResponse) == "string") ? XmlUtil.loadStringToXML(ajaxResponse) : ajaxResponse;

  	var parserErrors = ajaxResponse.getElementsByTagName('parsererror');
  	if (parserErrors.length > 0) {
  		return "The server returned invalid XML:\n\n" + parserErrors.item(0).textContent;
  	}
  
		var xmlRoot = ajaxResponse.getElementsByTagName('addtocartresponse');
    var parser = new dojo.xml.Parse();
		var parsedXml = parser.parseElement(xmlRoot.item(0));
		
    if (!isEmpty(parsedXml.errors)) {
    	// Display the errors
			this.showErrorForSku(parsedXml);
    }
    else if (!isEmpty(parsedXml.pageid)) {
    	// A pageid was in the xml, submit the page and it will take the user to the interstitial pages
    	dojo.byId("transactionid").value = (!isEmpty(parsedXml.transactionid)) ? parsedXml.transactionid[0].value : "-1";
    	this.formObj.method = "post";
    	this.formObj.submit();
    }
    else {
    	// Display the popup layer
    	// alert("parsedXml.addtocartresponse = " + parsedXml.addtocartresponse);
    	this.buildLayer(parsedXml);
    }
    
  },
  
  getIdByAttribute: function(attribute, value) {
  	var map = this.productMap.products.productSet;
  	
  	for (var i=0; i<this.productsList.length; i++) {
  		//var attrFld = this.pipFormFieldMap[attribute].id + (this.pipFormFieldMap[attribute].idAppendRequired) ? this.productsList[i] : "";
  		if (dojo.byId(attrFld).value == value) {
  			return this.productsList[i];
  		}
  	}
  },
  
  getTargetSku: function(targetSkuValue) {
		var productList = this.productMap.products;
    
    var matchObj = this.dropdownObj.getMatchingProductSku(productList, targetSkuValue);
    
		return matchObj;
  },
  
  getTargetSkuProductId: function(targetSkuValue) {
		var productList = this.productMap.products;
    
    var matchObj = this.dropdownObj.getMatchingSkuProductId(productList, targetSkuValue);
    
		return matchObj;
  },
  
  removeErrors: function() {
  	var matchEl = document.getElementsByTagAndClassName("p", "error");
  	
  	for (var i=0; i<matchEl.length; i++) {
  		dojo.dom.removeNode(matchEl[i], true);
  	}
  },
  
  showError: function(errorObj) {
 		this.removeErrors();
  	for (var i=0; i<errorObj.length; i++) {
  		var prodId = errorObj[i].id;
  		var prodObj = dojo.byId(prodId).parentNode.parentNode;
  		var el = document.createElement("p");
  		el.className = "error";
  		el.appendChild(document.createTextNode(errorObj[i].message));
  		dojo.dom.insertBefore(el, prodObj.firstChild);
  	}
  },
  
  showErrorForSku: function(infoObj) {
  	var errorObj = (!isEmpty(infoObj.errors) && !isEmpty(infoObj.errors[0].error)) ? infoObj.errors[0].error : null;
		var productList = this.productMap.products;
  	
 		this.removeErrors();
  	for (var i=0; i<errorObj.length; i++) {
  		var prodId = this.dropdownObj.getMatchingSkuProductId(productList, errorObj[i].sku[0].value);
  		var prodObj = dojo.byId(prodId).parentNode.parentNode;
  		var el = document.createElement("p");
  		el.className = "error";
  		el.appendChild(document.createTextNode(errorObj[i].message[0].value));
  		dojo.dom.insertBefore(el, prodObj.firstChild);
  	}
  },
  
  /**
   * Function to populate cart dialog
   *
   **/
  buildLayer: function(infoObj) {
  	var target = dojo.byId("itemmodule");
  	
  	if (target.hasChildNodes()) {
  		dojo.dom.removeChildren(target);
  	}
   	
   	var priceTotal = 0;
  	for (var key in infoObj) {
  	 	if (key == "items") {
		 		var itemArr = infoObj.items[0].item;
		 		var itemCount = 0;
		 		
		 		for (var i=0; i<itemArr.length; i++) {
		 			var sku = itemArr[i].sku[0].value;
		 			//alert("sku = " + sku);
		 			var itemObject = this.getTargetSku(sku);
		 			
		 			if (itemObject) {
				   	var container = document.createElement("div");
			  	 	container.className = "lineItem";
			  	 	
		  		 	var imgContainer = document.createElement("div");
		  		 	imgContainer.className = "itemImg";
		  		 	var itemImg = document.createElement("img");
		  
		  
		  		 	itemImg.src = itemObject.cartThumb.src;
	  			 	itemImg.alt = itemObject.cartThumb.alt;
	  		 		itemImg.title = itemObject.cartThumb.alt;
		  
		  		 	imgContainer.appendChild(itemImg);
		  		 	container.appendChild(imgContainer);
			  	 	
			  	 	var infoContainer = document.createElement("div");
			  	 	infoContainer.className = "itemInfo";
			  	 	
			  	 	// Set the item header
			  		if (!isEmpty(itemArr[i].productname)) {
				  		var el = document.createElement("h3");
				  		el.appendChild(document.createTextNode(itemArr[i].productname[0].value));
		  				infoContainer.appendChild(el);
				  		var el = document.createElement("ul");
			  		}
			  					  		
			  		// Set the item sku
			  		var dt = document.createElement("li");
			  		var dd = document.createElement("li");
			  		var libreak = document.createElement("li");
			  		libreak.className = "break";
			  		dt.appendChild(document.createTextNode("Item: "));
			  		dd.appendChild(document.createTextNode(itemObject.sku));
			  		el.appendChild(dt);
			  		el.appendChild(dd);
			  		el.appendChild(libreak);
	  				
			  		// Set the item quantity
			  		if (!isEmpty(itemArr[i].quantity)) {
				  		var dt = document.createElement("li");
				  		var dd = document.createElement("li");
				  		var libreak = document.createElement("li");
				  		libreak.className = "break";
				  		dt.appendChild(document.createTextNode("Qty: "));
				  		dd.appendChild(document.createTextNode(itemArr[i].quantity[0].value));
				  		el.appendChild(dt);
				  		el.appendChild(dd);
				  		el.appendChild(libreak);
			  		}

			  		// Set the item price
			  		if (!isEmpty(itemArr[i].price)) {
				  		var dt = document.createElement("li");
				  		var dd = document.createElement("li");
				  		var libreak = document.createElement("li");
				  		libreak.className = "break";
				  		//var price = (!isEmpty(itemObject.price.saleSpecial)) ? itemObject.price.saleSpecial : itemObject.price.regular;
				  		var price = itemArr[i].price[0].value;
				  		dd.appendChild(document.createTextNode("$" + price + " each"));
				  		el.appendChild(dt);
				  		el.appendChild(dd);
				  		el.appendChild(libreak);
				  		
				  		price = price * parseInt(itemArr[i].quantity[0].value);
				  		priceTotal += parseInt(price);
			  		}			  		
			  		
			  		// Set the item monogram
			  		if (!isEmpty(itemArr[i].monograminfo)) {
				  		var dt = document.createElement("li");
				  		var libreak = document.createElement("li");
				  		libreak.className = "break";
				  		dt.appendChild(document.createTextNode("Monogramming: "));
				  		el.appendChild(dt);
				  		var monogramInfo = itemArr[i].monograminfo[0].seqmonogram;
				  		var dd = document.createElement("li");
				  		for (var n=0; n<monogramInfo.length; n++) {
			  				var br = document.createElement("br");
			  				dd.appendChild(br);
					  		dd.appendChild(document.createTextNode(monogramInfo[n].monogramseqinfo[0].value));
				  		}
				  		el.appendChild(dd);
				  		el.appendChild(libreak);
			  		}

			  		// Set the gift wrap option
						if (!isEmpty(infoObj.wrapany)) {
				  		var dt = document.createElement("li");
				  		var dd = document.createElement("li");
				  		var libreak = document.createElement("li");
				  		libreak.className = "break";
				  		dt.appendChild(document.createTextNode("Gift Wrap: "));
				  		dd.appendChild(document.createTextNode(infoObj.wrapany[0].value));
				  		el.appendChild(dt);
				  		el.appendChild(dd);
				  		el.appendChild(libreak);
						}

			  		// Set the ship to info
			  		if (!isEmpty(infoObj.shiptoinfo)) {
				  		var dt = document.createElement("li");
				  		var dd = document.createElement("li");
				  		var libreak = document.createElement("li");
				  		libreak.className = "break";
				  		dt.appendChild(document.createTextNode("Send to: "));
				  		dd.appendChild(document.createTextNode(infoObj.shiptoinfo[0].nickname[0].value));
				  		el.appendChild(dt);
				  		el.appendChild(dd);
				  		el.appendChild(libreak);
			  		}
			  		
			  		// Set the gift card info
			  		if (!isEmpty(itemArr[i].giftcard)) {
				  		var giftcardseq = itemArr[i].giftcard[0].seqgiftcard;
				  		for (var t=0; t<giftcardseq.length; t++) {
					  		var dt = document.createElement("li");
					  		var dd = document.createElement("li");
					  		var libreak = document.createElement("li");
					  		libreak.className = "break";
					  		dt.appendChild(document.createTextNode("To: "));
					  		dd.appendChild(document.createTextNode(giftcardseq[t].to[0].value));
					  		el.appendChild(dt);
					  		el.appendChild(dd);
					  		el.appendChild(libreak);

					  		var dt = document.createElement("li");
					  		var dd = document.createElement("li");
					  		var libreak = document.createElement("li");
					  		libreak.className = "break";
					  		dt.appendChild(document.createTextNode("From: "));
					  		dd.appendChild(document.createTextNode(giftcardseq[t].from[0].value));
					  		el.appendChild(dt);
					  		el.appendChild(dd);
					  		el.appendChild(libreak);

					  		var dt = document.createElement("li");
					  		var dd = document.createElement("li");
					  		var libreak = document.createElement("li");
					  		libreak.className = "break";
					  		dt.appendChild(document.createTextNode("Message: "));
					  		if (giftcardseq[t].messgone) dd.appendChild(document.createTextNode(giftcardseq[t].messgone[0].value));
					  		if (giftcardseq[t].messgtwo) {
					  				var br = document.createElement("br");
					  				dd.appendChild(br);
					  				dd.appendChild(document.createTextNode(giftcardseq[t].messgtwo[0].value));
					  		}
					  		el.appendChild(dt);
					  		el.appendChild(dd);
					  		el.appendChild(libreak);
				  		}
			  		}
		  		
			  		// Set the backorder info
			  		if (!isEmpty(itemArr[i].backorderinfo)) {
				  		var dd = document.createElement("li");
				  		var libreak = document.createElement("li");
				  		libreak.className = "break";
				  		dd.className = "specialAlerts";
				  		dd.appendChild(document.createTextNode(itemArr[i].backorderinfo[0].value));
				  		el.appendChild(dd);
				  		el.appendChild(libreak);
			  		}


	  				infoContainer.appendChild(el);
						container.appendChild(infoContainer);
			  		target.appendChild(container);
			  		
			  		itemCount++;
		 			}
		 		}
  	 	}
  	}
  	
  	var skuCountNode = dojo.byId("skucount");
  	dojo.dom.removeChildren(skuCountNode);
  	var itemCountString = (itemCount > 1) ? itemCount+" items" : "1 item";
  	skuCountNode.appendChild(document.createTextNode(itemCountString));
  	var priceTotalNode = dojo.byId("totalprice");
  	dojo.dom.removeChildren(priceTotalNode);
  	priceTotalNode.appendChild(document.createTextNode(priceTotal));
  	
  	cartDialog.show();
  }
}

function addItem(xmlStr) {

  var bindArgs = {
    url: "/services/wh/shoppingcart",
    load: function(type, data, evt){ 
    	//alert("data = " + data);
    	pipConfig.ajax.processResults(data);
    	return true;
   	},
    error: function(type, error) { alert(error.toSource()); return false; },
    //postContent:  xmlStr,
    content: { "p_xml": xmlStr },
    //contentType: "text/xml",
    multipart: false,
    method: "post",
    sync: true,
    mimetype: "text/xml",
    transport: "XMLHTTPTransport"
   };
   dojo.io.bind(bindArgs);
  
}



               
               
               
