function buy(productId, qty, variant) {
	var url = '/updateBasket.jspa?qty_' + productId
	if (variant) url += '_' + escape(variant);
	url += '=' + qty;

	document.location.href=url;
}

function display_fields(opt, sid) {
    $(sid).css('display',(opt == 0)?"none":"block");
}
function setSearchState(keywords, searchType) {
    if (document.searchFull) {
        document.searchFull.keywords.value = keywords;
        for (i = 0; i < document.searchFull.searchType.length; i++) {
            if (document.searchFull.searchType[i].value == searchType) {
                document.searchFull.searchType.selectedIndex = i;
                break;
            }
        }
    }
    if (document.topNav_searchForm) {
        document.topNav_searchForm.keywords.value = keywords;
	}
    if (document.searchForm) {
        document.searchForm.keywords.value = keywords;
    }
}

function setCartTotal(total) {
	if (Number(total) == 0) {
		$("#paymentForm").hide();
	}
	else {
		$("#paymentFormCartTotal").text(total);
		$("#paymentForm").show();
	}
}

function validatePromotionCode() {
	$(".tickOrCross").attr("src", "/images/ajaxLoad.gif").show();
	$.ajax({
		url: "/selectPromotionDeliveryMethodAjax.jspa",
		data: {deliveryPromotionCode:$("#deliveryPromotionCode").val()},
		dataType : "json",
		success: function(data){
			if (data.status == "ok") {
				$(".tickOrCross").attr("src", "/images/tick.png").show();
				refreshCartAjax();	
			}
			else if (data.status == "invalid") {
				$(".tickOrCross").attr("src", "/images/cross.png").show();
			}
			else {
				alert("Error Processing Request");
			}
		},
		error : function() {
			alert("Error Processing Request");
		}
	});

}

function refreshCartAjax() {
	if ($(".cartTable").length > 0) {
		$.ajax({
			url: "/cartHtml.jspa",
			data: {editable:$(".cartTable").attr("editable"), "_":new Date().getTime()},
			dataType : "html",
			success: function(data){
				$(".cartTable").replaceWith(data);
				bindCardEditors();
	  		}
		});
	}
}

$(refreshCartAjax);

$(function(){
	$(".deliveryMethodInput").bind("click", function(){
		var d = $(this);
		var code = d.val();
		//if (code == "PROMOTION") return;
		$(".tickOrCross").hide();
		$("#deliveryPromotionCode").val("")
		$.ajax({
			url: "/selectDeliveryMethodAjax.jspa",
			data: {deliveryMethodCode:code},
			dataType : "json",
			success : refreshCartAjax
		});
	});
});


var cartUpdatesInFlight = 0;
var cartUpdateMessages = [];
function showResults(messages) {
	if (messages) {
		cartUpdateMessages = cartUpdateMessages.concat(messages);
	}
	//console.debug(results)
	cartUpdatesInFlight --;
	if (cartUpdatesInFlight > 0) {
		return;
	}
	if (cartUpdateMessages.length > 0) {
//		console.debug("cartUpdateMessages", cartUpdateMessages);
		$("#errorMessages").html("<div class='pageErrors'><div class='actionError'>" + cartUpdateMessages.join("<br>") + "</div></div>");
		cartUpdateMessages = []
	}
	else {
		$("#errorMessages").html("");
	}
	refreshCartAjax();
}

function nrKeys(a) {
    var i = 0;
    for (key in a) {
        i++;
    }
    return i;
}
function compareAssociativeArrays(a, b) {
   if (a === b) {
       return true;
   }   
   if (nrKeys(a) != nrKeys(b)) {
       return false;
   }
   for (key in a) {     
     if (a[key] != b[key]) {
         return false;
     }
   }
   return true;
}

function extractQuantities() {
	var q = {};
	$('.cartTable .cartRow').each(function() {
		var id = $(this).attr('rowId');
		var quantity = $('.quantity', this).val();
		q["qty_" + id] = quantity;
	});
	return q;
}
function submitUpdate() {
	var data = extractQuantities();
	if (!compareAssociativeArrays(lastCartQuantities, data)) {
		lastCartQuantities = data;
		cartUpdatesInFlight ++;
		$.ajax({
		  type: 'POST',
		  url: '/updateBasketAjax.jspa',
		  data: data,
		  success: function(result) {
			  	showResults(result.messages);
		  },
		  dataType: 'json'
		});
	}
}
function submitAjax() {
	clearTimeout(delayedTimer);
	submitUpdate();
}
var delayedTimer = null;
function delayedSubmitAjax() {
	clearTimeout(delayedTimer);
	delayedTimer = setTimeout(submitAjax, 500);
}
var lastCartQuantities;

function bindCardEditors() {
	if ($('.cartTable').length) {
		window.lastCartQuantities = extractQuantities();
		$('.cartTable .quantity').bind('change', submitAjax);						
		$('.cartTable .quantity').bind('keyup', delayedSubmitAjax);
	}
}
$(bindCardEditors);

