jQuery.fn.AJAXCartPreview = function(options) { 
    window.AJAXCartPreview = this;
    this.options = $.extend({
        totalPriceSelector: "#ajax-cart-preview-total-price",
        totalQtySelector:   "#ajax-cart-preview-total-qty",
        targetURL:          "/cart.html",
        
        msgShowList:        "Show",
        msgHideList:        "Hide",
        msgGoToCart:        "Go to cart",
        msgEmptyCart:       "Your cart is empty."
    }, options);
    
    $(this).css("display", "block").html("<a href='#' class='button toggle'><span>" + this.options.msgShowList + "</span></a><div class='list-container'><ol class='list' /><a href='/cart.html' class='button go-to-cart'><span>" + this.options.msgGoToCart + "</span></a></div>");
    
    this.toggle        = $(".toggle", this);
    this.listContainer = $(".list-container", this);
    this.list          = $(".list", this);
    this.totalPrice    = $(this.options.totalPriceSelector);
    this.totalQty      = $(this.options.totalQtySelector);
    
    this.reloadNeeded  = true;
    
    this.flush = function() {
        $.get(this.options.targetURL, function(data, textStatus, XMLHttpRequest) {
            this.totalPrice = $(data).find("total").attr("price");
            this.totalQty  = $(data).find("total").attr("qty");
            
            AJAXCartPreview.list.empty();
            AJAXCartPreview.totalPrice.text(this.totalPrice);
            AJAXCartPreview.totalQty.text(this.totalQty);
            
            if (0 == this.totalQty) {
                AJAXCartPreview.list.append("<li class='empty'>" + AJAXCartPreview.options.msgEmptyCart + "</li>");
                return;
            }
            
            $(data).find("product").each(function() {
                var qty  = $(this).attr("qty");
                var link = "<a href='" + $(this).attr("href") + "'>" + $(this).attr("name") + "</a>";
                var cost = "<span>(" + $(this).attr("price") + ")</span>";
                
                var options = $(this).find("option");
                if (0 == options.length) {
                    var optionsList = "";
                } else {
                    var tmp = "";
                    options.each(function() {
                        tmp += "<dt><span>" + $(this).attr("name") + ":</span> " + $(this).attr("value") + "</dt>";
                    });
                    var optionsList = "<dl>" + tmp + "</dl>";
                }
                
                AJAXCartPreview.list.append("<li>" + qty + " x " + link + " " + cost + optionsList + "</li>");
            });
        }, "xml");
        
        this.reloadNeeded = false;
    };
    
    this.toggle.toggle(function() {
        $(this).toggleClass("opened").find("span").text(AJAXCartPreview.options.msgHideList);
        
        if (AJAXCartPreview.reloadNeeded) {
            AJAXCartPreview.flush();
        }
        
        AJAXCartPreview.listContainer.show();
    }, function() {
        $(this).toggleClass("opened").find("span").text(AJAXCartPreview.options.msgShowList);
        
        AJAXCartPreview.listContainer.hide();
    }).click(function() {
        return false;
    });
    
    return this;
}
 
 
jQuery.fn.AJAXCart = function(options) {
    this.options = $.extend({
        formSelector:        "#order-form",
        imageSelector:       "#image",
        imageTargetSelector: "#cart",
        targetURL:           "/cart.html",
        
        msgPleaseWait:       "Please wait...",
        msgFailure:          "It seems that something went wrong. Please try again."
    }, options);
    
    this.SUCCESS = "1";
    
    this.form    = $(this.options.formSelector);
    this.orgText = $(this).text();
    
    this.form.data("AJAXCartRef", this);
    
    this.form.submit(function() {
        var AJAXCartRef = $(this).data("AJAXCartRef");
        
        $.ajax({
            type:    "POST",
            url:     AJAXCartRef.options.targetURL,
            data:    $(this).serialize(),
            
            success: function(data, textStatus, XMLHttpRequest) {
                if (AJAXCartRef.SUCCESS !== data) {
                    alert(AJAXCartRef.options.msgFailure);
                } else {
                    window.scrollTo(0, 0);
                    AJAXCartRef.find("*").text(AJAXCartRef.orgText);
                    AJAXCartRef.animateSuccess();
                    if ("object" === typeof AJAXCartPreview) {
                        AJAXCartPreview.flush();
                        
                        if (!AJAXCartPreview.list.is(":visible")) {
                            AJAXCartPreview.toggle.click();
                        }
                    }
                }
            },
            beforeSend: function(XMLHttpRequest) {
                AJAXCartRef.find("*").text(AJAXCartRef.options.msgPleaseWait);
            }
        });
        
        return false;
    });
        
    this.animateSuccess = function() {
        var srcOffset = $(this.options.imageSelector).offset();
        var dstOffset = $(this.options.imageTargetSelector).offset();
    
        var imgCopy = $(this.options.imageSelector).clone(false);       
        imgCopy.attr("id", "AJAXCart-animate-temp").css({
            position: "absolute",
            top: srcOffset.top,
            left: srcOffset.left
        });
        
        imgCopy.appendTo($(this.options.imageSelector).parent());
        
        imgCopy.animate({
            top: dstOffset.top,
            left: dstOffset.left,
            opacity: 0,
            width: $(this.options.imageTargetSelector).width(),
            height: $(this.options.imageTargetSelector).height()
        }, "slow", null, function() {
            $("#AJAXCart-animate-temp").remove();
        });
    };
    
    return this.click(function() {        
        return false;
    });
};
 
function cartSubmit() {
    document.forms["cart"].submit();
}
 
function cartQuantity(id, qty) {
    if (qty == 0) {
        document.forms["cart"].elements["quantity[" + id + "]"].value = 0;
    } else {
        document.forms["cart"].elements["quantity[" + id + "]"].value = Number(document.forms["cart"].elements["quantity[" + id + "]"].value)+Number(qty);
    }
 
    cartSubmit();
}
