﻿var PRODUCTDETAILS_AJAX_URL = "/Sta.DnnWebService/AjaxService.ashx";
var MODULE_PATH = "/DesktopModules/Sta.CommerceControls/";
var LEAD_DAYS_DEFAULT = 5;
var LEAD_DAYS_RANGE_ADDITIONS = 3;
var DROP_SHIP_STATUS = "T1";
var REGULAR_STATUS = "R1";
var MULTIPRICING_BOGO = "Y"
var MULTIPRICING_BOGO_LOW = "L"
var MAX_PRICE_BREAK1 = 9999999;
var MAX_PRICE_BREAK2 = 999999999;
var DEFAULT_MAX_QUANTITY = 99;

var strAltImageRepeater = "<div class=\"ProductDetails_AltImagePanel\"><a href=\"javascript: void(setMainImage('#AltImage_ImageUrl#', true));\" onmouseover=\"setMainImage('#AltImage_ImageUrl#', false);\"><img src=\"#AltImage_ThumbnailUrl#\" alt=\"Alternate Image\" /></a></div>";
var strMultiPriceRepeaterHeader = "<div class=\"ProductDetails_SeparatorPanel\">&nbsp;</div><div class=\"ProductDetails_MultiPriceHeader\"><p>Quantity Discount Pricing</p></div><table class=\"ProductDetails_MultiPriceTable\"><tr>";
var strMultiPriceRepeater = "<td class=\"MultiPriceCell\"><table class=\"ProductDetails_MultiPriceItemTable\"><tr><td><p>#MultiPrice_Quantity#</p></td></tr><tr><td><p>#MultiPrice_Amount#</p></td></tr></table></td>";
var strMultiPriceRepeaterFooter = "</tr></table>";

var bolAddingToCart = false;
var objDropDowns;

function startGetProductVariations(intVariationNumber, strItemNumber, objItemNumberCallback, objCartImage, objPricePanel, objInStockMessagePanel, objProductIDLabel, objQuantityCallback, objQuantityLabel, objDetailImage, objAltImagesPanel, objAltImageCallback, objMultiPricePanel) {
	try {
		var intIndex;
		var strVarCodes, strSelectedValue;
		if (objDropDowns[intVariationNumber - 1] != null) {
		    incrementImageLoadCount(objCartImage);
		    strSelectedValue = objDropDowns[intVariationNumber - 1].options[objDropDowns[intVariationNumber - 1].selectedIndex].value;
			strVarCodes = getVarCodes();
			objDropDowns[intVariationNumber - 1].loadStatus = "loading";
			objDropDowns[intVariationNumber - 1].options[0] = new Option("Loading...", "");
			objDropDowns[intVariationNumber - 1].selectedIndex = 0;
			objDropDowns[intVariationNumber - 1].options.length = 1;
			sta.loadXML("GET", PRODUCTDETAILS_AJAX_URL, "WebMethod=GetProductVariations&ItemNumber=" + escape(strItemNumber) + "&VariationNumber=" + intVariationNumber + "&VarCode1=" + strVarCodes[0] + "&VarCode2=" + strVarCodes[1] + "&VarCode3=" + strVarCodes[2], getProductVariations, [intVariationNumber, strSelectedValue, strItemNumber, objItemNumberCallback, objCartImage, objPricePanel, objInStockMessagePanel, objProductIDLabel, objQuantityCallback, objQuantityLabel, objDetailImage, objAltImagesPanel, objAltImageCallback, objMultiPricePanel]);
		}
	}
	catch (ex) {
		alert("An error occurred!");
	}
}

function getProductVariations(objXmlDoc, objParams) {
    try {
		var objResponseNode, objVarsNode, objOption, objResponse, objVars, objCartImage, objSelect, objItemNumberCallback, objPricePanel, objInStockMessagePanel, objProduct;
		var objProductIDLabel, objQuantityCallback, objQuantityLabel, objDetailImage, objAltImagesPanel, objAltImageCallback, objMultiPricePanel;
		var intIndex, intSelectedIndex, intVariationNumber;
		var strSelectedValue, strText, strItemNumber;
		if (objXmlDoc.childNodes[0].nodeName == "xml") {
			objResponseNode = objXmlDoc.childNodes[1];
			objResponse = sta.createObject(objXmlDoc.childNodes[1]);
		}
		else {
			objResponseNode = objXmlDoc.childNodes[0];
			objResponse = sta.createObject(objXmlDoc.childNodes[0]);
		}
		if (objResponse.ServerError == "false") {
		    intVariationNumber = objParams[0];
		    strSelectedValue = objParams[1];
		    strItemNumber = objParams[2]
		    objItemNumberCallback = objParams[3]
		    objCartImage = objParams[4];
		    objPricePanel = objParams[5];
		    objInStockMessagePanel = objParams[6];
		    objProductIDLabel = objParams[7];
		    objQuantityCallback = objParams[8];
		    objQuantityLabel = objParams[9];
		    objDetailImage = objParams[10];
		    objAltImagesPanel = objParams[11];
		    objAltImageCallback = objParams[12];
		    objMultiPricePanel = objParams[13];
		    objVarsNode = objResponseNode.getElementsByTagName("Variations")[0];
			objVars = sta.createObject(objVarsNode);
			objVars.Variations = sta.fillCollection(objVarsNode.getElementsByTagName("Variations")[0]);
			objProduct = sta.createObject(objResponseNode.getElementsByTagName("EcomProduct")[0]);
			objDropDowns[intVariationNumber - 1].options.length = objVars.Variations.length + 1;
			objDropDowns[intVariationNumber - 1].options[0] = new Option("--Any--", "");
			intSelectedIndex = 0;
			for (intIndex = 0; intIndex < objVars.Variations.length; intIndex++) {
			    if (objVars.Variations[intIndex].DisplayName == null || objVars.Variations[intIndex].DisplayName == "")
		            strText = objVars.Variations[intIndex].VarValue;
		        else
		            strText = objVars.Variations[intIndex].DisplayName;
			    objOption = new Option(strText, objVars.Variations[intIndex].VarCode);
			    objDropDowns[intVariationNumber - 1].options[intIndex + 1] = objOption;
			    if (objOption.value == strSelectedValue)
				    intSelectedIndex = intIndex + 1;
			}
			objDropDowns[intVariationNumber - 1].loadStatus = null;
			objDropDowns[intVariationNumber - 1].selectedIndex = intSelectedIndex;
			if (areAllVariationsSelected())
                startGetProduct(strItemNumber, objItemNumberCallback, objCartImage, objPricePanel, objInStockMessagePanel, objProductIDLabel, objQuantityCallback, objQuantityLabel, objDetailImage, objAltImagesPanel, objAltImageCallback, objMultiPricePanel);
            decrementImageLoadCount(objCartImage);
		}
		else
		    alert("An error has occurred!");
	}
	catch (ex) {
	    alert("An error has occurred!");
	}
}

function startGetProduct(strItemNumber, objItemNumberCallback, objCartImage, objPricePanel, objInStockMessagePanel, objProductIDLabel, objQuantityCallback, objQuantityLabel, objDetailImage, objAltImagesPanel, objAltImageCallback, objMultiPricePanel) {
    try {
        var strVarCodes = getVarCodes();
        incrementImageLoadCount(objCartImage);
	    sta.loadXML("GET", PRODUCTDETAILS_AJAX_URL, "WebMethod=GetProduct&ItemNumber=" + escape(strItemNumber) + "&VarCode1=" + strVarCodes[0] + "&VarCode2=" + strVarCodes[1] + "&VarCode3=" + strVarCodes[2], getProduct, [objItemNumberCallback, objCartImage, objPricePanel, objInStockMessagePanel, objProductIDLabel, objQuantityCallback, objQuantityLabel, objDetailImage, objAltImagesPanel, objAltImageCallback, objMultiPricePanel]);
	}
	catch (ex) {
		alert("An error occurred!");
	}
}

function getProduct(objXmlDoc, objParams) {
    try {
		var objResponseNode, objResponse, objProduct, objCartImage, objItemNumberCallback, objPricePanel, objInStockMessagePanel, objProductIDLabel, objQuantityCallback;
		var objQuantityLabel, objDetailImage, objAltImagesPanel, objAltImages, objAltImageCallback, objMultiPricing, objProductNode, objMultiPricePanel;
		var strValue, strCssClass, strRepeater, strSplit;
		var intLeadDays, intIndex, intFoundIndex, intPriceBreak;
		var datPreOrder, datNow;
		var bolAllSelected = areAllVariationsSelected();
		if (objXmlDoc.childNodes[0].nodeName == "xml") {
			objResponseNode = objXmlDoc.childNodes[1];
			objResponse = sta.createObject(objXmlDoc.childNodes[1]);
		}
		else {
			objResponseNode = objXmlDoc.childNodes[0];
			objResponse = sta.createObject(objXmlDoc.childNodes[0]);
		}
		if (objResponse.ServerError == "false") {
		    objItemNumberCallback = objParams[0];
		    objCartImage = objParams[1];
		    objPricePanel = objParams[2];
		    objInStockMessagePanel = objParams[3];
		    objProductIDLabel = objParams[4];
		    objQuantityCallback = objParams[5];
		    objQuantityLabel = objParams[6];
		    objDetailImage = objParams[7];
		    objAltImagesPanel = objParams[8];
		    objAltImageCallback = objParams[9];
		    objMultiPricePanel = objParams[10];
		    objProductNode = objResponseNode.getElementsByTagName("EcomProduct")[0];
		    objProduct = sta.createObject(objProductNode);
		    objAltImages = sta.fillCollection(objResponseNode.getElementsByTagName("AlternateImages")[0]);
		    objMultiPricing = sta.fillCollection(objProductNode.getElementsByTagName("MultiPricing")[0]);
		    objItemNumberCallback(objProduct.ItemNumber);
		    strCssClass = "ProductDetails_Price";
		    if (new Number(objProduct.SourceCodePrice) > 0 && new Number(objProduct.SourceCodePrice) < new Number(objProduct.Price)) {
		        strValue = "<span class=\"ProductDetails_OldPrice\">Retail Price: " + objProduct.AjaxPrice + "</span> ";
		        strCssClass += " ProductDetails_SalePrice";
		    }
		    else
		        strValue = ""
		    strValue += "<span class=\"" + strCssClass + "\">Our Price: " + objProduct.AjaxUserPrice + "</span>";
		    objPricePanel.innerHTML = strValue;
		    if (bolAllSelected) {
		        strSplit = objProduct.PreorderUntil.split("T")[0].split("-");
		        datPreOrder = new Date(new Number(strSplit[0]), strSplit[1] - 1, strSplit[2]);
		        datNow = new Date();
		        if (datPreOrder.getTime() > datNow.getTime()) {
		            objInStockMessagePanel.className = "ProductDetails_MessagePanel ProductDetails_OutOfStockMessagePanel";
		            objInStockMessagePanel.innerHTML = strPreOrderMessage.replace(/\[PreOrder\_Date\]/g, getLongDateString(datPreOrder));
		        }
		        else if (new Number(objProduct.InStock) > 0) {
		            objInStockMessagePanel.className = "ProductDetails_MessagePanel ProductDetails_InStockMessagePanel";
		            objInStockMessagePanel.innerHTML = strInStockMessage;
		        }
		        else if (objProduct.Status == DROP_SHIP_STATUS) {
		            objInStockMessagePanel.className = "ProductDetails_MessagePanel ProductDetails_InStockMessagePanel";
		            objInStockMessagePanel.innerHTML = strDropShipMessage;
		        }
		        else {
		            objInStockMessagePanel.className = "ProductDetails_MessagePanel ProductDetails_OutOfStockMessagePanel";
		            intLeadDays = new Number(objProduct.LeadDays);
		            if (intLeadDays <= 0)
		                intLeadDays = LEAD_DAYS_DEFAULT;
		            strValue = strBackorderedMessage;
		            strValue = strValue.replace(/\[Lead\_Days\]/g, intLeadDays + " - " + (intLeadDays + LEAD_DAYS_RANGE_ADDITIONS));
		            objInStockMessagePanel.innerHTML = strValue;
		        }
		    }
		    else
		        objInStockMessagePanel.innerHTML = "";
		    objProductIDLabel.innerHTML = objProduct.ItemNumber;
		    if (bolAllSelected) {
		        if (objProduct.Status == REGULAR_STATUS || objProduct.Closeout == "false") {
		            objQuantityCallback(DEFAULT_MAX_QUANTITY);
		            strValue = "";
		        }
		        else {
		            objQuantityCallback(new Number(objProduct.InStock));
		            strValue = " (Max. " + objProduct.InStock + ")";
		        }
		    }
		    else   
		        strValue = "";
		    if (objQuantityLabel != null)
		        objQuantityLabel.innerHTML = strValue;
		    objDetailImage.src = "/Sta.DnnWebService/GetProductImage.ashx?ImageOverride=" + getProductImageOverride(objProduct.WarehouseLocs4) + "&ImageTypeID=1";
		    sta.setPanelVisibility(objAltImagesPanel, objAltImages.length > 0);
		    if (objAltImages.length > 0) {
		        strValue = "";
		        for (intIndex = 0; intIndex < objAltImages.length; intIndex++)
		            strValue += strAltImageRepeater.replace(/\#AltImage\_ImageUrl\#/g, objAltImages[intIndex].ImageUrl).replace(/\#AltImage\_ThumbnailUrl\#/g, objAltImages[intIndex].ThumbnailUrl);
		        objAltImagesPanel.innerHTML = strValue;
		        objAltImageCallback(objAltImages);
		    }
		    if (objMultiPricePanel != null) {
		        if (objMultiPricing.length == 0 || objProduct.MultipricingType == MULTIPRICING_BOGO || objProduct.MultipricingType == MULTIPRICING_BOGO_LOW)
		            strValue = "";
		        else {
		            strValue = strMultiPriceRepeaterHeader;
		            intPriceBreak = 0;
		            for (intIndex = 0; intIndex < objMultiPricing.length; intIndex++) {
		                strRepeater = strMultiPriceRepeater;
		                if (objMultiPricing[intIndex].MaxQuantity == MAX_PRICE_BREAK1 || objMultiPricing[intIndex].MaxQuantity == MAX_PRICE_BREAK2)
		                    strRepeater = strRepeater.replace(/\#MultiPrice\_Quantity\#/g, (intPriceBreak + 1) + "+");
		                else
                            strRepeater = strRepeater.replace(/\#MultiPrice\_Quantity\#/g, ((intPriceBreak + 1) + " - " + objMultiPricing[intIndex].MaxQuantity));
		                strRepeater = strRepeater.replace(/\#MultiPrice\_Amount\#/g, objMultiPricing[intIndex].AjaxPrice);
		                strValue += strRepeater;
		                intPriceBreak = new Number(objMultiPricing[intIndex].MaxQuantity);
		            }
		            strValue += strMultiPriceRepeaterFooter;
		        }
		        objMultiPricePanel.innerHTML = strValue;
		    }
		    decrementImageLoadCount(objCartImage);
		}
		else
		    alert("Product not found or an error occurred.");
	}
	catch (ex) {
	    alert("An error occurred!");
	}
}

function startAddToCart(strCurrentItemNumber, intQuantity, objCartImage, strShoppingCartUrl, objProductDetailsPanel) {
    try {
        if (strCurrentItemNumber != "") {
            if (! bolAddingToCart) {
                bolAddingToCart = true;
                incrementImageLoadCount(objCartImage);
                if (bolInExchangeMode) {
                    if (bolExchangeComplete)
                        alert("You have already added all of your exchange items to your cart, you must checkout to complete your exchange.");
                    else
                        document.location = strExchangeUrl + escape(strCurrentItemNumber);
                    decrementImageLoadCount(objCartImage);
                }
                else {
                    var strSplit = document.location.search.substr(1, document.location.search.length - 1).split("&");
                    var strItem, strTabID;
                    var intIndex, intTabID;
                    intTabID = null;
                    intIndex = 0;
                    while (intIndex < strSplit.length && intTabID == null) {
                        strItem = strSplit[intIndex].split("=");
                        if (strItem[0].toLowerCase() == "parenttabid")
                            intTabID = strItem[1];
                        intIndex++;
                    }
                    if (intTabID == null)
                        strTabID = "";
                    else
                        strTabID = "&ParentTabID=" + intTabID;
                    sta.loadXML("GET", PRODUCTDETAILS_AJAX_URL, "WebMethod=AddToCart&ItemNumber=" + escape(strCurrentItemNumber) + "&Quantity=" + intQuantity + strTabID, addToCart, [objCartImage, strShoppingCartUrl, objProductDetailsPanel]);
                }
            }
		}
		else
            alert("You must first select the product variations for this item. (i.e. size, color)");
	}
	catch (ex) {
		alert("An error occurred!");
	}
}

function addToCart(objXmlDoc, objParams) {
    try {
		var objResponse, objCartImage, objResponseNode, objCart, objNode, objProductDetailsPanel, objRelatedItems, objNodeList;
		var strShoppingCartUrl, strValue;
		var intItemIndex, intCellIndex, intCellCount;
        if (objXmlDoc.childNodes[0].nodeName == "xml") {
			objResponseNode = objXmlDoc.childNodes[1];
			objResponse = sta.createObject(objXmlDoc.childNodes[1]);
		}
		else {
			objResponseNode = objXmlDoc.childNodes[0];
			objResponse = sta.createObject(objXmlDoc.childNodes[0]);
		}
		if (objResponse.ServerError == "false") {
		    objCartImage = objParams[0];
	        strShoppingCartUrl = objParams[1];
	        objProductDetailsPanel = objParams[2];
	        bolAddingToCart = false;
	        objCart = sta.fillCollection(objResponseNode.getElementsByTagName("CartContents")[0]);
	        try {
	            objNodeList = objResponseNode.getElementsByTagName("RelatedItems");
	            if (objNodeList.length > 0) {
	                objRelatedItems = sta.fillCollection(objNodeList[0]);
	                updateMiniCartOnPage(objCart);
	                decrementImageLoadCount(objCartImage);
	                showAddedMiniCartProductOnPage(objCart[objResponse.AddedProductIndex]);
	                strValue = "<p><b>More Shopping Options:</b></p><ul>" + 
	                  "<li><a href=\"javascript:document.location.reload();\">Buy More " + getProductName(objCart[objResponse.AddedProductIndex]) + "</li>";
	                if (objResponse.ParentUrl != null)
	                    strValue += "<li><a href=\"" + objResponse.ParentUrl + "\">Return to Main Category for this Product</a></li>";
	                strValue += "<li><a href=\"/\">Return to the Home Page</a></li>" + 
	                  "<li><a href=\"" + strShoppingCartUrl + "\"><b><u>View Cart/Checkout</u></b></a></li>" +
	                  "</ul>";
    	            strValue += "<h1>Others Who Purchased This Product Liked:</h1>" + 
    	              "<table border=\"1\" cellpadding=\"3\" cellspacing=\"0\" width=\"100%\">";
    	            intCellIndex = 0;
    	            intItemIndex = 0;
    	            intCellCount = 0;
    	            while (intCellCount < 9 && intItemIndex < objRelatedItems.length) {
    	                if (intCellIndex == 0)
    	                    strValue += "<tr>";
    	                if (intItemIndex < objRelatedItems.length) {
    	                    strValue += "<td width=\"33%\" valign=\"top\"><p style=\"text-align: center;\"><a href=\"" + objRelatedItems[intItemIndex].AjaxProductUrl + "\">" + 
    	                      "<img src=\"/Sta.DnnWebService/GetProductImage.ashx?ImageOverride=" + getProductImageOverride(objRelatedItems[intItemIndex].WarehouseLocs4) + "&ImageTypeID=0\" style=\"width: 120px; height: 120px; border: 0px;\" /><br />" + 
    	                      getProductName(objRelatedItems[intItemIndex]) + "</a><br />";
    	                    if (new Number(objRelatedItems[intItemIndex].SourceCodePrice) < 0)
    	                        strValue += objRelatedItems[intItemIndex].AjaxPrice;
    	                    else if (new Number(objRelatedItems[intItemIndex].SourceCodePrice) < new Number(objRelatedItems[intItemIndex].Price))
    	                        strValue += "<span style=\"text-decoration: line-through;\">" + objRelatedItems[intItemIndex].AjaxPrice + "</span> <span style=\"color: green; font-weight: bold;\">" + objRelatedItems[intItemIndex].AjaxSourceCodePrice + "</span>";
    	                    else
    	                        strValue += objRelatedItems[intItemIndex].AjaxSourceCodePrice;
    	                    strValue += "</p></td>";
    	                    intItemIndex++;
    	                }
    	                else
    	                    strValue += "<td>&nbsp;</td>";
    	                intCellIndex++;
    	                if (intCellIndex == 3) {
    	                    intCellIndex = 0;
    	                    strValue += "</tr>";
    	                }
    	                intCellCount++;
    	            }
    	            strValue += "</table>";
	                objProductDetailsPanel.innerHTML = strValue;
	            }
	            else
	                document.location = strShoppingCartUrl;
	        } catch(ex) {
	            document.location = strShoppingCartUrl;
	        }
		}
		else {
		    alert("An error occurred!");
		    decrementImageLoadCount(objCartImage);
		}
	}
	catch (ex) {
		alert("An error occurred!");
	}
}

function getProductName(objProduct) {
    var strRetVal = "";
    if (objProduct.BrandName != null && objProduct.BrandName != "")
        strRetVal += objProduct.BrandName + " ";
    if (objProduct.WebName != null && objProduct.WebName != "")
        strRetVal += objProduct.WebName;
    else if (objProduct.StyleName != null && objProduct.StyleName != "")
        strRetVal += objProduct.StyleName;
    else
        strRetVal += objProduct.ItemName;
    return strRetVal;
}

function incrementImageLoadCount(objCartImage) {
    if (objCartImage != null) {
        if (objCartImage.loadCount == null) {
            objCartImage.src = MODULE_PATH + "Images/AddToCartLoading.gif";
            objCartImage.loadCount = 1;
        }
        else
            objCartImage.loadCount++;
    }
}

function decrementImageLoadCount(objCartImage) {
    if (objCartImage != null) {
        if (objCartImage.loadCount != null)
            objCartImage.loadCount--;
        if (objCartImage.loadCount == null || objCartImage.loadCount == 0) {
            objCartImage.loadCount = null;
            if (areAllVariationsSelected())
                objCartImage.src = strAddToCartImage;
            else
                objCartImage.src = MODULE_PATH + "Images/AddToCartDisabled.gif";
        }
    }
}

function areAllVariationsSelected() {
	var bolRetVal = true;
	var intIndex = -1;
	while (++intIndex < objDropDowns.length && bolRetVal)
	    if (objDropDowns[intIndex] != null)
	        bolRetVal = (objDropDowns[intIndex].loadStatus == null && objDropDowns[intIndex].selectedIndex != 0);
	return bolRetVal;
}

function getVarCodes() {
	var strRetVal = ["", "", ""];
	strRetVal[0] = objDropDowns[0].options[objDropDowns[0].selectedIndex].value;
	if (objDropDowns[1] != null)
		strRetVal[1] = objDropDowns[1].options[objDropDowns[1].selectedIndex].value;
	if (objDropDowns[2] != null)
		strRetVal[2] = objDropDowns[2].options[objDropDowns[2].selectedIndex].value;
	return strRetVal;
}

function validateQuantity(objTextBox) {
    var bolRetVal = true;
    if (objTextBox != null) {
        try {
            var intValue = parseInt(objTextBox.value.trim(), 10);
            bolRetVal = (intValue > 0 && intValue <= intMaxQuantity);
        }
        catch (ex) {
            bolRetVal = false;
        }
    }
    return bolRetVal;
}

function getLongDateString(datValue) {
    var strDaysOfWeek = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    var strMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    return strDaysOfWeek[datValue.getDay()] + ", " + strMonths[datValue.getMonth()] + " " + datValue.getDate() + ", " + datValue.getFullYear();
}

function getProductImageOverride(strWarehouseLocs) {
    if (strWarehouseLocs != null && strWarehouseLocs.length >= 8)
      return strWarehouseLocs.substr(0, 8).trim();
    else
      return "";
}
