﻿$.ajaxSetup({
    cache: false
});
function BasketController() {
    var controls = new Array();
    var onEmptyFunctions = new Array();
    var onNotEmptyFunctions = new Array();

    this.Attach = function(basketctrl) {
        controls.push(basketctrl);
    }

    this.ExecOnEmpty = function(method) {
        onEmptyFunctions.push(method);
    }

    this.ExecOnNotEmpty = function(method) {
        onNotEmptyFunctions.push(method);
    }

    function UpdateAllCallback(data) {
        if (data.IsEmpty == "False") {
            for (var x = 0; x < onNotEmptyFunctions.length; x++) {
                onNotEmptyFunctions[x]();
            }
        } else {
            for (var x = 0; x < onEmptyFunctions.length; x++) {
                onEmptyFunctions[x]();
            }
        }
        for (var x = 0; x < controls.length; x++) {
            controls[x].UpdateAll(data);
        }
    }

    this.UpdateAll = function(values) {
        if (values) {
            UpdateAllCallback(values);
        } else {
            $.ajax({
                url: "/services/basket.ashx",
                cache: false,
                dataType: 'json',
                data: { m: "GetTotals" },
                success: UpdateAllCallback
            });
        }
    }

    this.RefreshBasketHolder = function(settings) {
        var holder = $(settings.BasketHolder);
        if (settings.LoadingPanel) {
            $(settings.LoadingPanel).fadeIn("fast");
        }

		var url = "/Checkout/MiniBasketViewer.aspx";
		if(settings.CustomUrl){
			url = settings.CustomUrl;
		}
        $.ajax({
            url: url,
            cache: false,
            success: function(html) {
				var resHtml = $(html).find(settings.BasketHolder).html();
				$(holder).html(resHtml);
				if (settings.LoadingPanel) {
					$(settings.LoadingPanel).fadeOut("fast");
				}
				if (settings.OnBasketHolderRefreshed) {
					settings.OnBasketHolderRefreshed(html);
				}
            }, error: function() {
                if (settings.LoadingPanel) {
                    $(settings.LoadingPanel).fadeOut("fast");
                }
            }
        });
    }
    this.RefreshBasketHolder1 = function (settings) {
        var holder = $(settings.BasketHolder);
        if (settings.LoadingPanel) {
            $(settings.LoadingPanel).fadeIn("fast");
        }

        var url = "/Checkout/MiniBasketViewer1.aspx";
        if (settings.CustomUrl) {
            url = settings.CustomUrl;
        }
        $.ajax({
            url: url,
            cache: false,
            success: function (html) {
                var resHtml = $(html).find(settings.BasketHolder).html();
                $(holder).html(resHtml);
                if (settings.LoadingPanel) {
                    $(settings.LoadingPanel).fadeOut("fast");
                }
                if (settings.OnBasketHolderRefreshed) {
                    settings.OnBasketHolderRefreshed(html);
                }
            }, error: function () {
                if (settings.LoadingPanel) {
                    $(settings.LoadingPanel).fadeOut("fast");
                }
            }
        });
    }
	
	var guid = CreateGuid();
		
	this.AddToCart = function(settings) {
		if (settings.ID == 0) {
            return;
        }
		var action = function(myguid){
			if (settings.OnStart) {
				settings.OnStart();
			}
			var quantity = 1;
            if (settings.QTY) {
                quantity = settings.QTY;
            }
            $.ajax({
                url: "/webservices/producthandler.ashx",
                cache: false,
                dataType: 'json',
                data: { id: settings.ID, r: settings.Mode, QTY: quantity },
				success: function(data) {
					if(myguid == guid){
						if (settings.ReloadPage) {
							window.location.reload();
						} else if (settings.OnSuccess) {
							settings.OnSuccess();
						} else if (settings.UpdateBasket){
							
						}
						
						if (data.IsSuccessfull == "True") {
							$(basketController).trigger('OnAddBasketSuccess');
						} else {
							$(basketController).trigger('OnAddBasketFailed');
						}
					}
				},
				error: function() {
					if(myguid == guid){
						if (settings.OnError) {
							settings.OnError();
						}
					}
				}
			});
		}
		guid = CreateGuid();
		action(guid);
    }
}

var basketController = new BasketController();

function BasketManager(settings) {
    var _updating = false;
    var next;

    basketController.Attach(this);

    this.UpdateAll = function(data) {
        UpdateSubTotal(data.SubTotal);
        UpdateTotalAmount(data.TotalAmount);
        UpdateBasketItemCount(data.BasketItemCount);
    }

    function UpdateTotalAmount(value) {
        if (settings.TotalAmountQuery) {
            var list = $("#" + settings.ContainerID).find(settings.TotalAmountQuery);
            for (var x = 0; x < list.length; x++) {
                $(list[x]).html(value);
            }
        }
    }

    function UpdateSubTotal(value) {
        if (settings.SubTotalQuery) {
            var list = $("#" + settings.ContainerID).find(settings.SubTotalQuery);
            for (var x = 0; x < list.length; x++) {
                $(list[x]).html(value);
            }
        }
    }

    function UpdateBasketItemCount(value) {
        if (settings.BasketItemCountQuery) {
            var list = $("#" + settings.ContainerID).find(settings.BasketItemCountQuery);
            for (var x = 0; x < list.length; x++) {
                $(list[x]).html(value);
            }
        }
    }

    function AssignShippingCategory(value) {
        $.ajax({
            url: "/services/basket.ashx",
            cache: false,
            dataType: 'json',
            data: { id: value, c: settings.GetCurrentCountry() },
            success: function(data) {
                if (data.IsSuccessfull == "True") {
                    UpdateTotalAmount(data.TotalAmount);

                    basketController.UpdateAll(data);
                }
            }
        });
    }

    function AssignInitialValue() {
        $.ajax({
            url: "/services/basket.ashx",
            cache: false,
            dataType: 'json',
            data: { m: "GetIdShippingCategory", c: settings.GetCurrentCountry() },
            success: function(data) {
                if (data.IsSuccessfull == "True") {
                    var radio = $("#" + settings.ContainerID).find("input[value='" + data.IdShippingCategory + "']").first();
                    if (radio.length > 0) {
                        $(radio).attr('checked', true);
                    } else {
                        radio = $("#" + settings.ContainerID).find("input[value='" + data.CheapestShippingCategory + "']").first();
                        $(radio).attr('checked', true);
                        AssignShippingCategory(data.CheapestShippingCategory);
                    }
                }
            }
        });
    }

    function DeleteItem(param) {
        _updating = true;
        $.ajax({
            url: "/services/basket.ashx",
            cache: false,
            dataType: "json",
            data: { id: param.IdBasketLine, m: "RemoveItem" },
            success: function(data) {
                if (data.IsSuccessfull == "True") {
                    basketController.UpdateAll(data);
					$(basketController).trigger('OnBasketItemDeleted', [data]);
                    $(param.Container).parent().fadeOut('slow', function() {
                        $(param.Container).parent().remove();
                    });
                }
                _updating = false;
                if (next) {
                    next();
                }
            }
        });
    }

    this.UpdateItem = function(param) {
        if (param.Quantity > 0) {
            _updating = true;
            $.ajax({
                url: "/services/basket.ashx",
                cache: false,
                dataType: "json",
                data: { id: param.IdBasketLine, q: param.Quantity, m: "UpdateItem" },
                success: function(data) {
                    if (data.IsSuccessfull == "True") {
                        if (data.NeedReload == "True") {
                            window.location = window.location;
                        } else {
                            basketController.UpdateAll(data);

                            if (param.LineTotalContainer) {
                                $(param.LineTotalContainer).html(data.LineTotal);
                            }
                        }
                    }
                    _updating = false;
                    if (next) {
                        next();
                    }
                }
            });
        } else if (parseInt(param.Quantity, 10) == 0) {
            DeleteItem(param);
        }
    }

    this.RemoveItem = function(param) {
        if (param.ConfirmText == undefined || confirm(param.ConfirmText)) {
            DeleteItem(param);
        }
    }

    $(document).ready(function() {
        if (settings.ShippingQuery) {
            var shippinglist = $("#" + settings.ContainerID).find(settings.ShippingQuery);
            for (var x = 0; x < shippinglist.length; x++) {
                $(shippinglist[x]).change(function() {
                    if ($(this).is(':checked') == true) {
                        AssignShippingCategory($(this).val());
                    }
                });
            }
            AssignInitialValue();
        }

        if (settings.ButtonID) {
            for (var x = 0; x < settings.ButtonID.length; x++) {
                $("#" + settings.ButtonID[x]).click(function() {
                    var href = $(this).attr('href');
                    if (_updating == false) {
                        window.location = href;
                    } else {
                        next = function() {
                            window.location = href;
                        }
                    }
                    return false;
                });
            }
        }

        if (settings.OnInitComplete) {
            settings.OnInitComplete();
        }
    });
}

