var req = null;
var miniCart = null;
var message = null;
var recommendations = null;
var recommendationsRendered = false;
var conflictsExist = null;
var addToCartActivity = null;
var READY_STATE_UNINITIALIZED = 0;
var READY_STATE_LOADING = 1;
var READY_STATE_LOADED = 2;
var READY_STATE_INTERACTIVE = 3;
var READY_STATE_COMPLETE = 4;
var pricingString = "pricing_";
function sendRequest(url, params, HttpMethod) {

	if (!HttpMethod) {
		HttpMethod = "GET";
	}
	req = initXMLHTTPRequest();

	if (req) {

		req.onreadystatechange = onJsonReadyState;
		req.open(HttpMethod, url, true);
		req.setRequestHeader("Content-Type",
				"application/x-www-form-urlencoded");
		req.send(params);
	}

}

function initXMLHTTPRequest() {
	var xRequest = null;
	if (window.XMLHttpRequest) {
		xRequest = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xRequest = new ActiveXObject("Microsoft.XMLHTTP");
	}

	return xRequest;
}

function onJsonReadyState() {
	var ready = req.readyState;
	var jsonResult = null;

	if (ready == READY_STATE_COMPLETE) {

		jsonResult = eval("(" + req.responseText + ")");

		if (isAjaxLightWeightCart(jsonResult)) {
			conflictsExist = cartHasConflicts(jsonResult);

			if (conflictsExist && !recommendationsRendered) {
				conflictRedirect();

			} else {
				renderMiniCart(jsonResult);
			}

		} else if (isAjaxMessages(jsonResult)) {
			renderMessages(jsonResult);
		} else if (isAjaxPricedProductList(jsonResult)) {
			// console.log("isAjaxPricedProductList: ", jsonResult);

			hideWaitImages();
			loadMessages();
		}

	}
}

function cartHasConflicts(jsonResult) {
	var lightWeightCart = jsonResult['ajaxLightWeightCart'];
	if (lightWeightCart.hasConflicts) {

		return true;
	} else {

		return false;
	}
}

function isAjaxLightWeightCart(jsonResult) {
	var lightWeightCart = jsonResult['ajaxLightWeightCart'];

	if (lightWeightCart) {
		return true;
	} else {
		return false;
	}
}
function isAjaxPricedProductList(jsonResult) {
	var ajaxPricedProductList = jsonResult['ajaxPricedProductList'];

	if (ajaxPricedProductList) {
		return true;
	} else {
		return false;
	}
}
function isAjaxMessages(jsonResult) {
	var ajaxMessages = jsonResult['ajaxMessages'];
	if (ajaxMessages) {
		return true;
	} else {
		return false;
	}
}
function renderMessages(jsonResult) {

	if (message) {

		var messages = jsonResult['ajaxMessages'];
		if (messages) {
			removeAllChildren(message);
			var errorMessages = messages['errorMessages'];
			var warningMessages = messages['warningMessages'];
			var successMessages = messages['successMessages'];
			for ( var i = 0; i < successMessages.length; i++) {
				var successMessage = successMessages[i];

				var div = document.createElement("div");
				div.id = "message";
				div.innerHTML = "<strong><img src=\"images\/success.gif\" align=\"left\" \/><span class=\"subhead\">"
						+ successMessage + "<\/span><\/strong><br \/>";

				var successDiv = document.createElement("div");
				successDiv.id = "successMessage";
				successDiv.appendChild(div);
				message.appendChild(successDiv);

			}
			for ( var i = 0; i < warningMessages.length; i++) {
				var warningMessage = warningMessages[i];

				var div = document.createElement("div");
				div.id = "message";
				div.innerHTML = "<strong><img src=\"images\/error_alert.gif\" width=\"25\" height=\"29\" hspace=\"5\" align=\"left\" \/><span class=\"prodname\">"
						+ warningMessage + "<\/span><\/strong><br \/>";

				var warningDiv = document.createElement("div");
				warningDiv.id = "warningMessage";
				warningDiv.appendChild(div);
				message.appendChild(warningDiv);

			}
			for ( var i = 0; i < errorMessages.length; i++) {
				var errorMessage = errorMessages[i];

				var div = document.createElement("div");
				div.id = "message";
				div.innerHTML = "<strong><img src=\"images\/error_alert.gif\" width=\"25\" height=\"29\" hspace=\"5\" align=\"left\" \/><span class=\"prodname\">"
						+ errorMessage + "<\/span><\/strong><br \/>";

				var errorDiv = document.createElement("div");
				errorDiv.id = "warningMessage";
				errorDiv.appendChild(div);
				message.appendChild(errorDiv);

			}
		}
	}
}
function renderMiniCart(jsonResult) {
	miniCart = document.getElementById('miniCart');
	if (miniCart != null) {

		var lightWeightCart = jsonResult['ajaxLightWeightCart'];
		if (lightWeightCart) {
			removeAllChildren(miniCart);

			var ajaxLightWeightRentalCartItems = lightWeightCart['ajaxLightWeightRentalCartItems'];
			var ajaxLightWeightRetailCartItems = lightWeightCart['ajaxLightWeightRetailCartItems'];
			var ajaxLightWeightKitCartItems = lightWeightCart['ajaxLightWeightKitCartItems'];
			var ajaxLightWeightRentalCartItemsLength = ajaxLightWeightRentalCartItems.length;
			var ajaxLightWeightRetailCartItemsLength = ajaxLightWeightRetailCartItems.length;
			var ajaxLightWeightKitCartItemsLength = ajaxLightWeightKitCartItems.length;
			var hasValidRentalPeriod = lightWeightCart['hasValidRentalPeriod'];

			if (ajaxLightWeightRetailCartItemsLength == 0
					&& ajaxLightWeightRentalCartItemsLength == 0 && ajaxLightWeightKitCartItemsLength == 0) {
				var emptyCartTable = "<table width=\"130\" border=\"0\" cellspacing=\"0\" cellpadding=\"1\">";
				emptyCartTable += "<tr align=\"center\" valign=\"top\"><td colspan=\"2\" class=\"productdiscr\">Your cart is empty.</td></tr>";
				emptyCartTable += "<\/table>";

				var emptyCartDiv = document.createElement("div");
				emptyCartDiv.innerHTML = emptyCartTable;
				miniCart.appendChild(emptyCartDiv);
			} else {
				var cartTotal = lightWeightCart['total'];
				var cartQuantity = lightWeightCart['cartQuantity'];
				if (cartTotal) {
					var cartSummaryTable = "<table width=\"130\" border=\"0\" cellspacing=\"0\" cellpadding=\"1\">";
					cartSummaryTable += "<tr align=\"left\" valign=\"top\"><td colspan=\"2\" class=\"productdiscr\">Cart Total: $"
							+ cartTotal + "</td></tr>";
					cartSummaryTable += "<tr align=\"left\" valign=\"top\"><td colspan=\"2\" class=\"productdiscr\">Items in Cart: "
							+ cartQuantity + "</td></tr>";
					cartSummaryTable += "<\/table>";

					var cartSummarylDiv = document.createElement("div");
					cartSummarylDiv.innerHTML = cartSummaryTable;
					miniCart.appendChild(cartSummarylDiv);
					var space = document.createElement("img");
					space.src = "images/spacer.gif";
					space.height = "10";
					miniCart.appendChild(space);

				}
				if (ajaxLightWeightKitCartItemsLength > 0) {

					var kitTable = "<table width=\"130\" border=\"0\" cellspacing=\"0\" cellpadding=\"1\">";

					if (!hasValidRentalPeriod) {

						kitTable += "<tr align=\"center\" valign=\"top\"><td colspan=\"2\" class=\"productdiscr\">"
								+ "<a href=\"ScheduleDropoffPickup.action\">"
								+ "For accurate pricing<br> schedule your order</a></td></tr>";

					}

					kitTable += "<tr align=\"left\" valign=\"top\"><td colspan=\"2\" class=\"productdiscr\">Rental Kits</td></tr>";
					for ( var j = 0; j < ajaxLightWeightKitCartItemsLength; j++) {
						var lightWeightKitCartItem = ajaxLightWeightKitCartItems[j];
						var kitTableRowText = getMiniCartTableRow(lightWeightKitCartItem);
						// console.log("tableRowText: ", tableRowText);
						kitTable += kitTableRowText;

					}
					kitTable += "<\/table>";
					var kitDiv = document.createElement("div");
					kitDiv.innerHTML = kitTable;
					miniCart.appendChild(kitDiv);
					var spacer = document.createElement("img");
					spacer.src = "images/spacer.gif";
					spacer.height = "10";
					miniCart.appendChild(spacer);
				}

				if (ajaxLightWeightRentalCartItemsLength > 0) {
					
					var rentalTable = "<table width=\"130\" border=\"0\" cellspacing=\"0\" cellpadding=\"1\">";

					if (!hasValidRentalPeriod) {

						rentalTable += "<tr align=\"center\" valign=\"top\"><td colspan=\"2\" class=\"productdiscr\">"
								+ "<a href=\"ScheduleDropoffPickup.action\">"
								+ "For accurate pricing<br> schedule your order</a></td></tr>";

					}

					rentalTable += "<tr align=\"left\" valign=\"top\"><td colspan=\"2\" class=\"productdiscr\">Rental Products</td></tr>";
					for ( var j = 0; j < ajaxLightWeightRentalCartItemsLength; j++) {
						var lightWeightRentalCartItem = ajaxLightWeightRentalCartItems[j];
						var rentalTableRowText = getMiniCartTableRow(lightWeightRentalCartItem);
						// console.log("tableRowText: ", tableRowText);
						rentalTable += rentalTableRowText;

					}
					rentalTable += "<\/table>";
					var rentalDiv = document.createElement("div");
					rentalDiv.innerHTML = rentalTable;
					miniCart.appendChild(rentalDiv);
					var spacer = document.createElement("img");
					spacer.src = "images/spacer.gif";
					spacer.height = "10";
					miniCart.appendChild(spacer);
				}

				if (ajaxLightWeightRetailCartItemsLength > 0) {
					var retailTable = "<table width=\"130\" border=\"0\" cellspacing=\"0\" cellpadding=\"1\">";
					retailTable += "<tr align=\"left\" valign=\"top\"><td colspan=\"2\" class=\"productdiscr\">Retail Products</td></tr>";
					for ( var i = 0; i < ajaxLightWeightRetailCartItemsLength; i++) {
						var lightWeightRetailCartItem = ajaxLightWeightRetailCartItems[i];

						var retailTableRowText = getMiniCartTableRow(lightWeightRetailCartItem);

						retailTable += retailTableRowText;

					}
					retailTable += "<\/table>";
					var retailDiv = document.createElement("div");
					retailDiv.innerHTML = retailTable;
					miniCart.appendChild(retailDiv);
				}
			}

		}

	}
	loadMessages();
	hideWaitImages();
	miniCartRendered = true;
}
function getMiniCartTableRow(ligthWeightCartItem) {
	var productName = ligthWeightCartItem.productName;
	var quantity = ligthWeightCartItem.quantity;
	var productId = ligthWeightCartItem.productId;
	var productWebAction = ligthWeightCartItem.productWebAction;

	var tableRow = "<tr align=\"left\" valign=\"top\"><td width=\"20\" class=\"productdiscr\">"
			+ quantity
			+ "</td><td width=\"120\" class=\"productdiscr\">"
			+ "<a href=\""
			+ productWebAction
			+ ".action"
			+ "?selectedContent="
			+ productId
			+ "\">"
			+ productName + "<\/a><\/td><\/tr>";
	return tableRow;
}
function showWaitImage(object) { // DOM

	if (object) {
		var p = document.createElement("p");
		p.align = "center";
		p.id = "waitImageParent";
		var image = document.createElement("img");

		image.id = "waitImage";
		image.src = "images/animatedDots.gif";
		image.width = "80";
		p.appendChild(image);

		object.appendChild(p);

	}

}
function showWaitImages(divIdArray) { // DOM
	
	$(divIdArray).each(function(){
		
		var cssClass = $(this).attr("pricingClass");
// console.log("class: ", cssClass);
		$(this).addClass(cssClass);
		
		var img = $("<img src=\"images/animatedDots.gif\"/>");
		var center = $("<center/>");
		$(img).appendTo(center);
		$(this).text("Prices Loading");
		$(center).appendTo(this);
	
		
	});

}
function hideWaitImages() { // DOM

	var pTags = document.getElementsByTagName("p");
	
	for ( var i = 0; i < pTags.length; i++) {
		var pTag = pTags[i];
		var pTagId = pTag.id;
		if (pTagId.startsWith("waitImageParent")) {
			removeAllChildren(pTag);
		}
	}

}

function removeAllChildren(node) {
	var childCount = node.childNodes.length;
	for ( var count = 1; count <= childCount; count++) {
		node.removeChild(node.childNodes[0]);
	}
}
// function loadMiniCart() {
// miniCart = document.getElementById('miniCart');
// if (!miniCart) {
// miniCart = parent.document.getElementById('miniCart');
// }
// if (miniCart != null) {
// showWaitImage(miniCart);
// sendRequest("AjaxGetLightWeightCart.action;jsessionid=" + jsessionid,
// "", "POST");
// }
// }

function loadMessages() {
	message = document.getElementById('message');

	if (message != null) {
		sendRequest("AjaxGetMessages.action", "POST");
	}
}
function addToCart(button) {

	miniCart = document.getElementById('miniCart');
	showWaitImage(miniCart);

	addToCartActivity = document.getElementById("addToCartActivity_"
			+ button.id);
	showWaitImage(addToCartActivity);

	// sendRequest("AjaxAddToCart.action;jsessionid=" + jsessionid,
	// "selectedContent=" + button.id + "&quantity=1", "POST");

	var addToCartRequest = initXMLHTTPRequest();

	if (addToCartRequest) {

		addToCartRequest.onreadystatechange = function() {
			var ready = addToCartRequest.readyState;
			var jsonResult = null;

			if (ready == READY_STATE_COMPLETE) {

				jsonResult = eval("(" + addToCartRequest.responseText + ")");

				conflictsExist = cartHasConflicts(jsonResult);

				if (conflictsExist && !recommendationsRendered) {
					conflictRedirect();

				} else {
					renderMiniCart(jsonResult);
				}

			}
		};
		addToCartRequest.open("POST", "AjaxAddToCart.action", true);
		addToCartRequest.setRequestHeader("Content-Type",
				"application/x-www-form-urlencoded");
		addToCartRequest.send("selectedContent=" + button.id + "&quantity=1");
	}

}

function conflictRedirect() {

	window.location = "RecommendedRentalPeriodTable.action?selectedContent=" + selectedContent;

}
function setRecommendationsRendered(value) {
	recommendationsRendered = value;

}

function getProductIds(pricingDivTagArray) {
	var productIds = new Array();
	var element = 0;
	for ( var i = 0; i < pricingDivTagArray.length; i++) {
		var divTag = pricingDivTagArray[i];
		var divTagId = divTag.id;

		var productId = getProductIdFromPricingString(divTagId);

		productIds[element] = productId;
		element++;

	}
	return productIds;
}

function getProductIdFromPricingString(stringObject) {

	return stringObject.substr(pricingString.length, stringObject.length);

}

function getPricingDivElements() {
	var divTags = document.getElementsByTagName("div");
	var pricingDivElements = new Array();
	var element = 0;
	for ( var i = 0; i < divTags.length; i++) {
		var divTag = divTags[i];
		var divTagId = divTag.id;
		if (divTagId.startsWith(pricingString)) {

			pricingDivElements[element] = divTag;
			element++;
		}
	}

	return pricingDivElements;
}

function getAjaxProductPriceById(ajaxPricedProductList, id) {

	for ( var i = 0; i < ajaxPricedProductList.length; i++) {
		var pricedProduct = ajaxPricedProductList[i];
		if (pricedProduct.id == id) {
			return pricedProduct;

		}
	}

	return null;
}

function getProductPricing(pricingDivElements) {
	
	showWaitImages(pricingDivElements);
	var productIds = getProductIds(pricingDivElements);

	// console.log("pricingDivElements: ", pricingDivElements);
	// console.log("productIds: ", productIds);

	var requestParameterProductIds = "";
	for ( var i = 0; i < productIds.length; i++) {

		var productId = productIds[i];
		requestParameterProductIds += "products=" + productId + "&";

	}

	var pricingRequest = initXMLHTTPRequest();

	if (pricingRequest) {

		pricingRequest.onreadystatechange = function() {
			var ready = pricingRequest.readyState;
			var jsonResult = null;

			if (ready == READY_STATE_COMPLETE) {

				jsonResult = eval("(" + pricingRequest.responseText + ")");

				var ajaxPricedProductResonse = jsonResult['ajaxPricedProductResponse'];

				var ajaxPricedProductList = ajaxPricedProductResonse['ajaxPricedProductList'];

				var listLength = pricingDivElements.length;

				for ( var i = 0; i < listLength; i++) {
					var divElement = pricingDivElements[i];
					$(divElement).removeClass();
					var cssClass = $(divElement).attr("pricingClass");
// console.log("class: ", cssClass);
					$(divElement).addClass(cssClass);

					var divElementId = divElement.id;
					var id = getProductIdFromPricingString(divElementId);
					var ajaxPricedProduct = getAjaxProductPriceById(
							ajaxPricedProductList, id);
					if (ajaxPricedProduct) {
						var pricingHtml = "";
						if (ajaxPricedProduct.retail) {
							pricingHtml += "<span class=\"productdiscr\">Purchase Price: </span><br><span class=\"pricing\">$"
									+ ajaxPricedProduct.retailPrice + "</span>";
						} else if (ajaxPricedProduct.rental || ajaxPricedProduct.kit) {
							if (ajaxPricedProduct.rentalPeriodPrice) {
								pricingHtml += "<span class=\"productdiscr\">Rental Period Price: </span><br><span class=\"pricing\">$"
										+ ajaxPricedProduct.rentalPeriodPrice
										+ "</span>";
							} else {
								pricingHtml += "<span class=\"pricing\" >2 Hours: $"
										+ ajaxPricedProduct.twoHourRentalPrice
										+ "</span><br>"
										+ "<span class=\"productdiscr\">("
										+ ajaxPricedProduct.minimumRentalHours
										+ " hour minimum)</span><br>"
										+ "<span class=\"pricing\">4 Hours: $"
										 
										 + ajaxPricedProduct.fourHourRentalPrice
										 + "<br>" 
// + "$"
// + ajaxPricedProduct.sixHourRentalPrice
// + " / 6 hours<br>"
										 + "8 Hours: $"
										+ ajaxPricedProduct.eightHourRentalPrice
									
										+ "<br>" 
										 + "24 Hours: $"
											+ ajaxPricedProduct.dailyRentalPrice
										
											+ "<br>" 
// + "$"
// + ajaxPricedProduct.dailyRentalPrice
// + "/24 hours<br>" +
										+"</span>";
							}
						}

						var isAvailable = (ajaxPricedProduct.availableQuantity > 0);

						if (!isAvailable) {
							pricingHtml += "<p><b>Out of Stock</b></p>";
						}

						pricingHtml += "<div id=\"addToCartActivity_"
								+ ajaxPricedProduct.id
								+ "\"><input type=\"button\" name=\"addToCart\" value=\"Add to Cart\" "
								+ ((!isAvailable) ? "\disabled=\"true\"" : "")
								+ "class=\"buttons\" id=\""
								+ ajaxPricedProduct.id + "\""
								+ " onclick=\"addToCart(this);\" /></div>";

						removeAllChildren(divElement);

						var divPrice = document.createElement("div");
						divPrice.innerHTML = pricingHtml;

						divElement.appendChild(divPrice);
					}
				}

			}
		};
		pricingRequest.open("POST", "AjaxGetProductPricing.action", true);
		pricingRequest.setRequestHeader("Content-Type",
				"application/x-www-form-urlencoded");
		pricingRequest.send(requestParameterProductIds);
	}

}

function loadZipCodePrompt(divElements) {

// console.log("divElements: ", divElements);
	$(divElements).each(
			function(i) {
				$(this).empty();
				var cssClass = $(this).attr("enterZipClass");
				var message = $("<span/>").text(
						"Enter zip for pricing and availability:").addClass(
						"errorMessage");
				var zipField = $("<input/>").attr("type", "text").attr(
						"maxlength", 5).attr("size", 5).keyup(function(event) {
							 if (event.keyCode == '13') {
								 goButtonClickOrEnter(event);
							   }
						});
				var goButton = $("<input type=\"button\" value=\"go\"/>")
						.addClass("buttons");
				$(goButton).click(	

						function(e) { goButtonClickOrEnter(e);
						});
				var orText = $("<span/>").text("or").addClass("errorMessage");
				$(this).append($(message)).append($("<br>")).append(zipField)
						.append(goButton).append($("<br>")).append($(orText))
						.append($("<br>"));

				var loginHref = $(
						"<a href=\"Login_input.action\"/>").text("login / create an account").addClass("productdiscr");

				$(this).append($(loginHref)); 
	
// console.log("cssClass: ", cssClass);

				$(this).addClass(cssClass); 
				function goButtonClickOrEnter(e){

					$.getJSON("AjaxZipCodeBrowse.action", {
						zipCodeString :$(zipField).val()
					}, function(jsonReturnZipCode) {

						// if (jsonReturnZipCode['null']) {
							zipCode = jsonReturnZipCode.zipCode;

							loadMessages();
							loadPricingOrZipCodePrompt();

					// } else {
// alert("fooo");
// loadPricingOrZipCodePrompt();
							// location.reload(true);
						// }

					});

				}
		

			});
}

function submitFormDisableSubmitButton(){
	
	$('form').each(function()
			{
			var $that = $(this);
			$that.submit(function(){
			$that.find("input[type='image'],input[type='submit']").attr('disabled', 'true');
			});
			});
	
}

function loadPricingOrZipCodePrompt() {
	var pricingDivElements = getPricingDivElements();

	if (zipCode!=null) {
		getProductPricing(pricingDivElements);
	} else {
		loadZipCodePrompt(pricingDivElements);

	}
}

String.prototype.startsWith = function(str) {
	return (this.match("^" + str) == str)
}
String.prototype.endsWith = function(str) {
	return (this.match(str + "$") == str)
}

