sdi.cart = {
    canSubmit: true,
    numSubmitRetries: 10,
    curUidPk: 0,
    detachedPaymentSection : null,
    billingAddressSection : null,
    selectedCardSection : null,
    //initialize the shopping cart
    initCart : function(){
        sdi.cart.ajax.getCart(sdi.cart.changeCart);
    },

    //quantity change
    addToCart : function(name, quantity, successCallBack){

        var digitMatch = /\d+/;
        var index = digitMatch.exec(name);

        var productIdName = "cartItem" + index + "pID";
        var skuGuidName = "cartItem" + index + "skuGuid";

        var productId = $("#" + productIdName).val();
        var skuGuid = $("#" + skuGuidName).val();

        $("#cartItem"+skuGuid+"subtotal").hide();
        $("#loading-"+skuGuid).show();

        if(quantity == 0){
            sdi.cart.ajax.removeCartItemBySkuGuid({"skuGuid": skuGuid}, function(bean){
                var subtotal = "#cartItem" + skuGuid + "subtotal";
                $(subtotal).empty();
                $("#summaryItem_" + skuGuid).remove();
                $("#summaryItemDets_" + skuGuid).remove();
                $("#cartItem"+skuGuid+"subtotal").show();
                $("#loading-"+skuGuid).hide();
                sdi.cart.changeCart(bean);
                
                successCallBack(bean);
            });
        } else {
            sdi.cart.ajax.addOrupdateCartItemBySkuGuid({"productUidPk": productId, "skuGuid": skuGuid, "quantity": quantity}, function(bean){
                $("#cartItem"+skuGuid+"subtotal").show();
                $("#loading-"+skuGuid).hide();
                sdi.cart.changeCart(bean);
                
                successCallBack(bean);
            });
        }
    },

    /**
     * Method to remove an item from the cart by the shopping item uidpk
     */
    removeFromCart: function(uidPk) {
    	sdi.cart.ajax.removeCartItemByUidPk(uidPk, sdi.cart.changeCart);
    },
    
    changeCart : function(bean){
        sdi.cart.updateTotal(bean, true);
        sdi.cart.updateSummary(bean);
        sdi.cart.canSubmit = true; 
    },

    refreshCart : function(bean){
        sdi.cart.updateTotal(bean, false);
    },

    updateTotal : function(cartBean, isChange) {
        //debug(cartBean);
        var omnitureString = "";

        var shoppingItems = cartBean.shoppingItems;

        if (shoppingItems.length > 0) { //Make sure we have cart items
            for (var i = 0; i < shoppingItems.length; i++) {
                var shoppingItem = shoppingItems[i];
                var skuCode = shoppingItem["productSku"]["skuCode"];
                var index = "#cartItem" + skuCode + "quantity";
                var subtotal = "#cartItem" + skuCode + "subtotal";

                $(subtotal).empty();
                $(subtotal).append(shoppingItem.total);
                if (shoppingItem.savings != 0.00) {
                    $(subtotal).addClass("saleprice");
                }

                $(index).val(shoppingItem.quantity);

                if (i == 0) {
                    omnitureString = ";" + shoppingItem.skuCode;
                } else {
                    omnitureString = omnitureString + ",;" + shoppingItem.skuCode;
                }
            } //End loop of cart items
        } 


        if (isChange) {
            omnitureScAdd(omnitureString);
        }

        sdi.util.showNumCartItems();
    },

    updateSummary : function(cartBean){
        var shoppingItems = cartBean.shoppingItems;

        if (shoppingItems.length == 0) {
            //no shopping items
        	$("#continue").addClass("disabled");
        	$("#orderSummaryBody").html('<tr id="summaryZeroItems"><td colspan="3" class="center">Add cards to your cart!</td></tr>');
        } else {
        	$("#continue").removeClass("disabled");
            $("#summaryZeroItems").remove();
            
            for (var i = 0; i < shoppingItems.length; i++) {
                var shoppingItem = shoppingItems[i];

                var skuCode = shoppingItem["productSku"]["skuCode"];

                var sel = "#summaryItem_" + skuCode;
                var item = $(sel);
                if(item.length == 0){
                    //create a new row
                    //alert("need to create a new summary row - " + sel);
                    var html = this.newSummaryRow(shoppingItem);
                    $("#orderSummaryBody").append(html);
                }

                //update an existing row
                //alert("found an existing summary row - " + sel);
                this.updateSummaryRow(shoppingItem);
            }
        }

        var giftCertificateDiscount = cartBean["giftCertificateDiscount"];
        if(giftCertificateDiscount !== undefined && giftCertificateDiscount > 0) {
        	$("#summaryGiftCertificateDiscount").text("-" + cartBean["giftCertificateDiscountMoney"]);
        	$("#summaryGiftCertificates").show();
        }
        
        var discount = cartBean["subtotalDiscount"];
        if(discount > 0){
            $("#summaryPromoCodeDiscount").text("-" + cartBean["subtotalDiscountMoney"]);
            $("#summaryPromoCode").show();
        }

        var total;
        if(cartBean["shippingSelected"]){
            total = cartBean["total"];

            //shipping is selected, update the shipping row
            this.updateShippingChoiceCallback(cartBean);
        } else {
            total = cartBean["subtotal"];
        }

        $("#summaryTotal").text(total);
    },

    updateSummaryRow : function(shoppingItem){
        var skuCode = shoppingItem["productSku"]["skuCode"];
        var qty = shoppingItem["quantity"];
        var uidPk = shoppingItem["uidpk"];

        var name = shoppingItem["productSku"]["product"]["displayName"];
        if(shoppingItem["productSku"]["optionValueMap"]["age"] != undefined){
            var age = shoppingItem["productSku"]["optionValueMap"]["age"]["displayName"] ;
        }
        var total = shoppingItem["total"];
        var split = skuCode.split("_");

        var link;
        if(/.*gift_certificate.*/.test(skuCode)) {
        	link = sdi.baseUrl + "/gift.ep?gcId=" + uidPk;
        } else if(split[1] == "Add"){
            link = sdi.baseUrl + "/pass.ep?filters=_d_" + split[0] + "_Prod_" + split[2];
        } else {
            link = sdi.baseUrl + "/pass.ep?filters=_d_" + split[0] + "_" + split[1] + "_" + split[2];
        }

        $("#summaryQty_" + skuCode).text(qty);
        $("#summaryName_" + skuCode).text(name);
        $("#summaryAge_" + skuCode).text(age)
        
        $("#summaryTotal_" + skuCode).text(total);
        
        var curUrl = window.location.href.toLowerCase();
        //only show edit link if cart item is not from current city or a gift item
		if (curUrl.indexOf(split[0].toLowerCase()) === -1 && skuCode !== 'Gift_Option') { 
			$("#summaryLink_" + skuCode).attr("href", link).text("edit");
		}

        if(shoppingItem["discount"] != "$0.00"){
            var listPrice = shoppingItem["price"]["listPrice"];
            var discount = shoppingItem["discount"];
            $("#listPriceItem_" + skuCode).text(listPrice);
            $("#discountItem_" + skuCode).text("-" + discount);
            $("#summaryDiscountItem_" + skuCode).show();
        }

    },

    newSummaryRow : function(shoppingItem){
    	var id = shoppingItem["productSku"]["skuCode"];
    	var uidPk = shoppingItem["uidpk"];
        var html = [];
        
        html.push('<tr id="summaryItem_' + id + '">');
        html.push('<td colspan="3" class="cardName">');
        
        // Only display the delete icon for gift certificate cart items
        if(/.*gift_certificate.*/.test(id)) {
        	html.push('<img data-uidpk="' + uidPk + '" class="removeShoppingItem" src="/img/icons/delete.png" />');
        }
        
        html.push('<span id="summaryName_' + id + '"></span> <a href="" id="summaryLink_' + id + '" title="edit" class="fwNormal"></a></td></tr>');
        html.push('<tr id="summaryItemDets_' + id + '">');
        html.push('<td id="summaryAge_' + id + '" class="pll"></td><td id="summaryQty_' + id + '"></td>');
        html.push('<td class="last" style="width:5em"><span id="summaryTotal_' + id + '"></span></td></tr>');
      
        html.push('<tr id="summaryDiscountItem_' + id + '" class="ui-helper-hidden">');
        html.push('<td>Originally: <span id="listPriceItem_' + id + '"></span>/each</td>');
        html.push('<td></td>');
        html.push('<td class="last">(<span id="discountItem_' + id + '"></span>)</td>');
        html.push('</tr>'); 

        return html.join('');
    },

    updateBillingStates : function(){
        var dom = "";
        var val = $("#billingAddresscountry").val();

        if(val == "US" || val == "CA"){
            dom = sdi.cart.common.createStateDropdown("billingAddress.subCountry", "billingAddresssubCountry", "");
        } else {
            dom = sdi.cart.common.createStateInput("billingAddress.subCountry", "billingAddresssubCountry", "");
        }
        $("#billingAddresssubCountryContainer").html(dom);

        if($("input[name='billingIsShipping']:checked").val() == "1"){
            $("input[name='selectedShippingServiceLevel']").attr("checked", false);
        }
    },

    updateShippingStates : function(){
        var dom = "";
        var val = $("#shippingAddresscountry").val();
        if(val == "US" || val == "CA"){
            dom = sdi.cart.common.createStateDropdown("shippingAddress.subCountry", "shippingAddresssubCountry", "");
        } else {
            dom = sdi.cart.common.createStateInput("shippingAddress.subCountry", "shippingAddresssubCountry", "");
        }
        $("#shippingAddresssubCountryContainer").html(dom);

        if($("input[name='billingIsShipping']:checked").val() == "0"){
            $("input[name='selectedShippingServiceLevel']").attr("checked", false);
        }
    },

    updateShippingChoice : function(shippingUidPk){
        if(shippingUidPk != ""){
            this.billingIsShippingState(shippingUidPk);
            
            sdi.cart.ajax.setShippingServiceLevel({"selectedShippingServiceLevelUid": shippingUidPk}, sdi.cart.updateShippingChoiceCallback);
        }
    },


    billingIsShippingState : function(shippingUidPk){
        var shippingCarrier = $("#shippingLevelCarrier_" + shippingUidPk).val();
        var shipToAddress = $("#shipToAddress");

        if(shippingCarrier != undefined && shippingCarrier.toLowerCase() == "voucher"){
            shipToAddress.slideUp("slow");
            $("input[name='billingIsShipping']").val(2);
        } else { 
            shipToAddress.slideDown('slow');
            var checked = $("input[name='shippingIsBillingCheckbox']").attr("checked");
            if(checked){
                $("input[name='billingIsShipping']").val(1);
            } else {
                $("input[name='billingIsShipping']").val(0);
            }
        }
    },

    updateShippingChoiceCallback : function(cartBean){
        var total;
        if(cartBean.shippingSelected){
            total = cartBean.total;
        } else {
            total = cartBean.subtotal;
        }

        $("#summaryTotal").text(total);
        $("#total").text(total);

        if (cartBean.shippingSelected) {
            var uidPk = cartBean.selectedShippingServiceLevelUidPk;
            var shippingName;
            var shippingCost;

            for(var i = 0; i< cartBean.shippingServiceLevelList.length; i++){
                var serviceLevel = cartBean.shippingServiceLevelList[i];
                if(uidPk == serviceLevel.uidPk){
                    shippingName = serviceLevel.name;
                    shippingCost = serviceLevel.cost;
                }
            }

            $("#shippingName").text(shippingName);
            $("#shippingCost").text(shippingCost);
            $("#summaryShipping").show();
        }
    },
    
    applyGiftCertificate: function(cartBean) {
    	$("#giftCertificateError").empty();
    	
    	sdi.cart.updateSummary(cartBean);
    },

    updateCoupon : function(cartBean){

        $("#couponError").empty();
        $("#discount").empty();

        $("#promocode").html("Promotion code '" + cartBean["promotionCodes"][0] + "' has been applied. <br/> Pease note: Promo discounts are calculated off the regular, non-sale price of the card.").show();

        sdi.cart.updateSummary(cartBean);
    },
    
    removePtCoupon : function(cartBean) {
    	$(".promotionCodeSuccessBtn").css('display', 'none');
    	$("#ptPromotionCodeSection").removeClass('hide');
    	$(".promotionCodeSuccess").addClass('hide');
    	$(".removingPtCode").addClass('hide');
    	$(".applyingPtCode").addClass('hide');
    	$(".applyingPtCodeButton").css('display', 'inline-block');
    	if(sdi.cart.detachedPaymentSection) {
    		sdi.cart.detachedPaymentSection.appendTo($("#paymentInfoFieldsWrapper"));
    	}
    	jQuery().sdiPtCart('refreshCart');
    },    
    
    
    updatePtCoupon : function(cartBean){
    	var useDummyPaymentType = false;
    	
    	var length=0;
    	for(var k in cartBean) {
    		if(k=="useDummyPaymentType") {
    			useDummyPaymentType = cartBean[k];
    			continue;
    		}
    		length++;
    	}
    	
    	if(length==0) {
    		if(useDummyPaymentType == "true") {
    			sdi.cart.detachedPaymentSection = $("#paymentInfoFields").detach();
    		}
    		else {
    			if(sdi.cart.detachedPaymentSection) {
    				sdi.cart.detachedPaymentSection.appendTo($("#paymentInfoFieldsWrapper"));
    			}
    		}
    		
    		$("#ptPromotionCodeSection").addClass('hide');
    		$(".promotionCodeSuccess").removeClass('hide');
    		$(".promotionCodeSuccessBtn").css('display', 'inline-block');
    		jQuery().sdiPtCart('refreshCart');
    	}
    	else {
    		var errorMessage = "";
    		for(var k in cartBean) {
    			errorMessage = cartBean[k];
    		}
    		$(".applyingPtCode").addClass('hide');
    		$("#applyPtCode").removeClass('hide');
    		$(".applyingPtCodeButton").css('display', 'inline-block');
    		$(".promotionErrorMessage").removeClass('hide');
    		$(".promotionErrorMessage").text(errorMessage);
    	}
    },
    

    selectPayPal : function(){
        $("#creditcard").hide();
    },

    selectCreditCard : function(){
        $("#creditcard").show();

    },

    validateShippingChoice : function() {
        var country = $("#shippingAddresscountry").val();
        var shippingChoice = $("#selectedShippingServiceLevel").val();

        var validates = false;

        if (shippingChoice == "") {
            alert("Please select a valid shipping level.");
        } else {
            var shippingRegion = $("#shippingLevelRegion_" + shippingChoice).val();
            if (shippingRegion.toLowerCase() == "voucher") {
                validates = true;
            } else if (country.toLowerCase() == "us" && shippingRegion.toLowerCase() == "usa") {
                validates = true;
            } else if (country.toLowerCase() == "ca" && shippingRegion.toLowerCase() == "canada") {
                validates = true;
            } else if (country != "" && country.toLowerCase() != "us" && country.toLowerCase() != "ca" && shippingRegion.toLowerCase() == "international") {
                validates = true;
            }

            if (!validates) {
                alert("Please select a shipping method that corresponds to the country you have selected");
            }
        }

        return validates;
    }

};



sdi.cart.pt = {
    destCode: "",

    //initialize the pt cart
    initCart : function(){
        sdi.cart.ajax.getPtCart({}, function(cartBean){
            sdi.cart.pt.refreshPtPage(cartBean, true);
        });
        
    },

    setPtTravelers : function(){
        var numAdult = 0;
        var numChildren = 0;

        numAdult = $("#numAdult").val();
        numChildren = $("#numChildren").val();
        
        if(numAdult == "")
    		numAdult = 0;
    	if(numChildren == "")
    		numChildren = 0;        

        if((numAdult == "" && numChildren == "") || (numAdult == 0 && numChildren == 0)){
            alert("You need to enter at least 1 traveler to continue");
        } else {
            sdi.cart.ajax.setPtTravelers({"numAdults": numAdult, "numChildren": numChildren}, function(cartBean){
                $("#stepTwoNumAdult").text(numAdult);
                $("#summaryNumAdult").text(numAdult);
                $("#stepTwoNumChild").text(numChildren);
                $("#summaryNumChild").text(numChildren);

                sdi.cart.pt.refreshPtPage(cartBean, true);
                $("#stepOne").hide();
                $("#stepTwo").show();
            });
        }
    },

	ptCheckoutInactive : function() {						
		$('#continueButtonRow .inactive a').replaceWith('<h2 title="You must have more than one attraction in your cart to purchase a Custom Explorer Pass">Checkout</h2>');
		$('#continueButtonRow h2').tooltip({ position: 'bottom left', opacity: 0.7});
	},

	ptCheckoutActive : function() {						
		$('#continueButtonRow h2').replaceWith('<a href="' + sdi.baseUrl + '/checkout/sdi-checkout-shipping.ep" title="Checkout">Checkout</a>');
	},
	
    addAttraction : function(index, callback){
        this.updatePtCart(this.destCode, index, 1, callback);
    },

    removeAttraction : function(index, callback){
        this.updatePtCart(this.destCode, index, 0, callback);
    },

    updatePtCart : function(destCode, productId, quantity, callback){
        $("body").css("cursor", "wait");

        $("#addAttraction_" + productId).hide();
        $("#removeAttraction_" + productId).hide();
        $("#summaryTooltip_" + productId).hide();
        $("#checkout_" + productId).hide();
        $("#loading_" + productId).show();

        sdi.cart.ajax.updatePerfectTicketItemByProductId({"destCode": destCode, "productUidPk": productId, "quantity": quantity}, function(bean){
            sdi.cart.pt.updatePtCartCallback(productId, quantity, bean, callback);
        });
    },

    updatePtCartCallback : function(productId, quantity, cartBean, callback){
        //debug(cartBean);
        var shoppingItems = cartBean["shoppingItems"];

        //add or remove a row from the summary
        if(quantity == 0){
            //udpate button status
            $("#loading_" + productId).hide();

            $("#checkout_" + productId).hide();
            $("#removeAttraction_" + productId).hide();
            $("#summaryTooltip_" + productId).hide();
            $("#addAttraction_" + productId).show();
            $("#addMore_" + productId).show();
        } else {
            //udpate button status
            $("#loading_" + productId).hide();

            $("#checkout_" + productId).show();
            $("#removeAttraction_" + productId).show();
            $("#summaryTooltip_" + productId).show();
            $("#addAttraction_" + productId).hide();
            $("#addMore_" + productId).hide();
        }
        //IF COUNT OF CART PRODUCTS IS < 2 ADD CLASS inactive to #checkoutButtonCell
        if(cartBean.pt.pricing.attractionCount < 2 && cartBean.pt.pricing.containsPackage == false){
          	$('#checkoutButtonCell').addClass('inactive');
			this.ptCheckoutInactive();
        } else {
			$('#checkoutButtonCell').removeClass('inactive');
			this.ptCheckoutActive();
		}
        this.refreshPtPage(cartBean, false);

        var omnitureString = "";

        //tally up the new prices
        for (i = 0; i < shoppingItems.length; i++) {
            var cartItem = shoppingItems[i];

/*
            age = "";
            for (x in cartItem.productSku.optionValueMap) {
                if (x.match("age")) {
                    age = cartItem.productSku.optionValueMap[x].optionValueKey;
                }
            }
*/

            if (i == 0) {
                omnitureString = ";" + cartItem.skuCode;
            } else {
                omnitureString = omnitureString + ",;" + cartItem.skuCode;
            }

        }

        omnitureScAdd(omnitureString);

        if(shoppingItems.length == 0){
            //hide certain summary rows
            $("#attractionPriceTotalRow").hide();
            $("#savingsRow").hide();
            $("#priceRow").hide();
        } else {
            //show them
            $("#attractionPriceTotalRow").show();
            $("#savingsRow").show();
            $("#priceRow").show();
        }

        if(callback && typeof(callback) == "function"){
            callback.call(this);
        }

        $("body").css("cursor", "auto");
    },


    refreshPtPage : function(cartBean, refreshRoot){
        this.updatePtSummary(cartBean);

        var shoppingItems = cartBean["shoppingItems"];
        var uidPkArr = [];

        if(refreshRoot){
            for(var i = 0; i<shoppingItems.length; i++){
                var shoppingItem = shoppingItems[i];
                var curProductId = shoppingItem["productSku"]["product"]["uidPk"];
                if(curProductId != undefined){
                    curProductId = curProductId.toString();
                }

                if(jQuery.inArray(curProductId, uidPkArr) == -1){
                    uidPkArr.push(curProductId);
                }
            }

            $("#attractionListRoot").children().each(function(){
                var id = $(this).attr("id").replace("li_", "");

                if(jQuery.inArray(id, uidPkArr) == -1){
                    //id is not in the arr, not in the cart, show "add" button
                    $("#addAttraction_" + id).show();
                    $("#addMore_" + id).show();
                    $("#removeAttraction_" + id).hide();
                    $("#summaryTooltip_" + id).hide();
                    $("#checkout_" + id).hide();
                } else {
                    //show remove button
                    $("#addAttraction_" + id).hide();
                    $("#addMore_" + id).hide();
                    $("#removeAttraction_" + id).show();
                    $("#summaryTooltip_" + id).show();
                    $("#checkout_" + id).show();
                }
            });
        }

    },

    updatePtSummary : function(cartBean) {
        var html = [];
        var pt = cartBean["pt"];
        var pricing = pt["pricing"];
        var shoppingItems = pricing["items"];
        var numCartItems = shoppingItems.length;

        if(numCartItems == 0) {
            html.push('<tr id="summaryZeroItems"><td><img class="imgleft" src="/img/ui/arrowsummary.jpg" alt="arrow icon"/><br/>Add attractions to customize your Explorer Pass. The more you add the more you save.</td><td colspan="3"></td></tr>');
            $("#continueButtonRow").hide();
        } else {
            $("#summaryZeroItems").remove();

            for(var i = 0; i < numCartItems; i++) {
                var cartProduct = shoppingItems[i];
                var cartProductId = cartProduct["productUidPk"];
                var cartProductCode = cartProduct["code"];
                var cartProductName = cartProduct["displayName"];
                var items = cartProduct["shoppingItems"];

                //display new row
                var adultItem = "";
                var childItem = "";

                for(var j = 0; j < items.length; j++){
                    var cartItem =  items[j];

                    var key = cartItem["ageSkuOption"];

                    if (key == "age_adult") {
                        adultItem = cartItem;
                    } else if (key == "age_child") {
                        childItem = cartItem;
                    }

                }

                var tooltip = "";

                //TODO: tooltip of attractions in a package
    /*
                if (associationMap.keySet().contains(cartProductCode)) {
                    var associationSet = associationMap.get(cartProductCode);

                    for (assoc in associationSet) {

                        var prodAssocName = assoc.getTargetProduct().getDisplayName(sesShoppingCart.getLocale());
                        if (tooltip == "") {
                            tooltip = "This package contains: " + prodAssocName;
                        } else {
                            tooltip = tooltip + ", " + prodAssocName;
                        }

                    }
                }
    */


                html.push('<tr id="tr_"' + cartProductId + '">');
                if (tooltip == "") {
                    html.push('<td>' + cartProductName + '</td>');
                } else {
                    html.push('<td title="' + tooltip + '" class="tooltip"> ' + cartProductName + '</td>');
                }

                html.push('<td class="bg">');

                html.push(adultItem["retailPriceString"]);

                html.push('</td>');
                html.push('<td class="bg">');

                html.push(childItem["retailPriceString"]);

                html.push('</td>');
                html.push('<td class="bg"><a href="#" rel="' + cartProductId + '" title="Remove this item from my cart" class="removeAttractionX"><img src="/img/ui/remove.gif" alt="x" width="10" height="10"/></a></td>');
                html.push('</tr>');

                var curListPrice = 0.0;
                var curLowPrice = 0.0;

            }

            var discountTotal = pricing["discountString"];
            var retailTotal = pricing["retailString"];

            var shippingSelected = cartBean["shippingSelected"];
            var subtotal = cartBean["subtotal"];
            var total = cartBean["total"];
            var totalTotal = (shippingSelected ? total : subtotal);

            $("#childTotal").text(retailTotal);
            $("#childSavings").text(discountTotal);
            $("#total").text(totalTotal);

            $("#attractionPriceTotalRow").show();
            $("#savingsRow").show();
            $("#priceRow").show();

            $("#continueButtonRow").show();

            if(cartBean["shippingSelected"]){
                //shipping is selected, update the shipping row
                sdi.cart.updateShippingChoiceCallback(cartBean);
            }

        }

        $("#summaryTBody").html(html.join(''));

    }

};


sdi.cart.common = {

    createStateDropdown : function(fieldName, idName, selectedState){
        var dom = [];
        var stateCodes = ["AL","AK","AB","AZ","AR","BC","CA","CO","CT","DE","DC","FL","GA","HI","ID","IL","IN","IA","KS","KY","LA","ME","MB","MD","MA","MI","MN","MS","MO","MT","NE","NV","NB","NH","NJ","NM","NY","NL","NC","ND","NT","NS","NU","OH","OK","ON","OR","PA","PE", "PR", "QC","RI","SK","SC","SD","TN","TX","UT","VT","VA","WA","WV","WI","WY","YT"];
        var stateNames = ["AL","AK","AB","AZ","AR","BC","CA","CO","CT","DE","DC","FL","GA","HI","ID","IL","IN","IA","KS","KY","LA","ME","MB","MD","MA","MI","MN","MS","MO","MT","NE","NV","NB","NH","NJ","NM","NY","NL","NC","ND","NT","NS","NU","OH","OK","ON","OR","PA","PE", "PR", "QC","RI","SK","SC","SD","TN","TX","UT","VT","VA","WA","WV","WI","WY","YT"];
        //var stateNames = ["Alabama","Alaska","Alberta","Arizona","Arkansas","British Columbia","California","Colorado","Connecticut","Delaware","District of Columbia ","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Manitoba","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Brunswick","New Hampshire","New Jersey","New Mexico","New York","Newfoundland &amp; Labrador","North Carolina","North Dakota","Northwest Territories","Nova Scotia","Nunavut","Ohio","Oklahoma","Ontario","Oregon","Pennsylvania","Prince Edward Isl", "Puerto Rico", "Quebec","Rhode Island","Saskatchewan","South Carolina","South Dakota","Tennessee","Texas","Utah","Vermont","Virginia ","Washington","West Virgina","Wisconsin","Wyoming","Yukon"];

        dom.push('<select class="selectOne" name="');
        dom.push(fieldName);
        dom.push('" id="');
        dom.push(idName);
        dom.push('">');
        dom.push('<option value=""></option>');
        for(i = 0; i < stateCodes.length; i++){
            dom.push('<option value="');
            dom.push(stateCodes[i]);
            dom.push('"');
            if(selectedState && (stateCodes[i] == selectedState)){
                dom.push('selected="selected"');
            }
            dom.push('>');
            dom.push(stateNames[i]);
            dom.push('</option>');
        }
        dom.push('</select>');

        return dom.join("");
    },

    createStateInput : function(fieldName, idName, value){
        return '<input type="text" name="'+ fieldName +'" id="'+ idName +'" value="'+ value +'"/>';
    },

    formatCurrency : function(num) {
        num = num.toString().replace(/\$|\,/g, '');
        if (isNaN(num)){
            num = "0";
        }
        var sign = (num == (num = Math.abs(num)));
        num = Math.floor(num * 100 + 0.50000000001);
        var cents = num % 100;
        num = Math.floor(num / 100).toString();
        if (cents < 10){
            cents = "0" + cents;
        }
        for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++){
            num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
        }
        return (((sign) ? '' : '-') + '$' + num + '.' + cents);
    }

};

sdi.cart.ajax = {

    getCart : function(callback){
        jQuery.getJSON(sdi.baseUrl + "/getCart.json", function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },

    setShippingServiceLevel : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/setShippingServiceLevel.json", data, function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },

    addOrupdateCartItemBySkuGuid : function(data, callback){
    	jQuery.ajax({
    		async: true,
    		url:  sdi.baseUrl + "/addOrupdateCartItemBySkuGuid.json",
    		dataType: 'json',
    		data: data,
    		success: function(response){
    			sdi.cart.ajax.handleResponse(response, callback);
    		}
    	});
    },

    /**
     * Performs a POST request to remove a shopping cart item by its uidpk and calls the callback upon sucess
     */
    removeCartItemByUidPk: function(uidPk, callback) {
    	$.post(sdi.baseUrl + "/removeCartItemByUidPk.json", {"uidpk": uidPk}, function(response) {
    		sdi.cart.ajax.handleResponse(response, callback);
    	});
    },

    removeCartItemBySkuGuid : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/removeCartItemBySkuGuid.json", data, function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },

    updatePerfectTicketItemByProductId : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/updatePerfectTicketItemByProductId.json", data, function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },

    setPtTravelers : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/setPtTravelers.json", data, function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },

    getPtCart : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/getPtCart.json", data, function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },

    getNumCartItems : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/getNumCartItems.json", data, function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },

    clearCartItems : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/clearCartItems.json", data, function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },
    
    applyGiftCertificate: function(data, callback) {
    	$.post(sdi.baseUrl + "/applyGiftCertificate.json", data, function(response) {
    		sdi.cart.ajax.handleResponse(response, callback);
		});
    },
    
    setPtPromotionCode : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/ptCart/setPtPromotionCode.json", data, function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },
    
    removePtPromotionCode : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/ptCart/removeAllCouponsFromCart.json", data, function(response){
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },    
    

    setPromotionCode : function(data, callback){
        jQuery.getJSON(sdi.baseUrl + "/setPromotionCode.json", data, function(response){
        	$('#applyCode').show().prev('.loading').hide();
            sdi.cart.ajax.handleResponse(response, callback);
        });
    },

    handleResponse : function(response, callback){
    	var timeout = response["timeout"];
    	
    	if(typeof(timeout) != "undefined" && response["timeout"].sessionHasTimedOut==true) {
    		//alert("Your session timed out due to more than 30 minutes of inactivity. Please enter your information again");
    		alert(response["timeout"].timeOutMessage);
    		window.location.reload();
    		return;
        } else {        	
        	
            var errors = response["errors"];
            
            if(typeof(errors) == "undefined" || errors.length == 0){
                //no errors, call the callback if it is a function
                if(typeof(callback) == "function"){
                	var cart = response["cart"];

                	$("#giftCertificateCode").val("");
                	
					if(typeof(cart) == "undefined"){
						callback.call(this, response)
					} else {
						callback.call(this, cart);
					}
                }
            } else {
            	//handle the errors
                //TODO handle errors

                var ptErrors = errors["pt"];
                if(ptErrors != undefined ){
                    $("#modal").dialog("open");
                }

                if(errors["couponCode"] != undefined){
                    var errorText = errors["couponCode"];

                    $("#discount").empty().hide();
                    $("#promocode").empty().hide();
                    $("#summaryPromoCode").hide();

                    if(errorText == invalidCode || errorText == saleBetter){
                        $("#couponError").text(errorText).show();
                    } else if(errorText == selectShipping){
                        alert(errorText);
                    }

                    sdi.cart.updateSummary(response["cart"]);
                } else if(errors["giftCertificate"] !== undefined) {
                	var errorText = errors["giftCertificate"];
                	$("#giftCertificateError").text(errorText).show();
                	
                	sdi.cart.updateSummary(response["cart"]);
                }
            }
        }
    }//handleResponse

};

function debug(cartBean){
    var json = JSON.stringify(cartBean);
    //$("#debug").html(json);
    alert(json);
}

function noop(){}




