﻿function StoreAvailabilityChecker(name, catalogueRef) {
    return {
        name: name,

        catalogueRef: catalogueRef,

        xhr: null,

        toggleStoreAvailabilityVisibility: function() {
            var isStoreAvailabilityVisible = !isStoreAvailabilityHidden();
            var me = this;

            if (isStoreAvailabilityVisible) {
                var selector = null;

                if ($('#storeAvailabilityCancelMessage').css('display') == 'block') {
                    selector = '#storeAvailabilityCancelMessage';
                }
                else if ($('#storeAvailabilityErrorMessage').css('display') == 'block') {
                    selector = '#storeAvailabilityErrorMessage';
                }
                else if ($('#storeAvailabilityResults').css('display') == 'block') {
                    selector = '#storeAvailabilityResults';
                }

                $(selector).slideUp('fast', function() { me.clearStoreAvailability(); });
            }
            else {
                $('#' + this.name + '_hlCheckMipStock').text('Hide availability');
                $('#' + this.name + '_hlCheckMipStock').addClass('hidestore').removeClass('checkstore');
                $('#storeAvailabilityCancelMessage').slideDown('fast', function() { me.fillStoreAvailability(); });
            }

            function isStoreAvailabilityHidden() {
                return $('#storeAvailabilityCancelMessage').css('display') == 'none' && $('#storeAvailabilityErrorMessage').css('display') == 'none' && $('#storeAvailabilityResults').css('display') == 'none';
            }
        },

        fillStoreAvailability: function() {
            if (this.xhr != null) {
                this.xhr.abort();
                this.xhr = null;
            }
            $('#storeAvailabilityCancelMessage').css('display', 'block');
            $('#storeAvailabilityErrorMessage').css('display', 'none');

            var me = this;

            this.xhr = $.ajax({
                type: "GET",
                url: "/Ajax/StoreAvailability.ashx",
                data: { 'catalogno': catalogueRef },
                dataType: "html",
                cache: false,
                success: function(data, textStatus) {
                    $('#storeAvailabilityCancelMessage').css('display', 'none');
                    $('#storeAvailabilityResults').html(data);
                    $('#storeAvailabilityResults').css('display', 'block');
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    $('#storeAvailabilityCancelMessage').css('display', 'none');
                    $('#storeAvailabilityErrorMessage').css('display', 'block');
                }
            });
        },

        clearStoreAvailability: function() {
            if (this.xhr != null) {
                $('#storeAvailabilityCancelMessage').css('display', 'none');
                $('#storeAvailabilityErrorMessage').css('display', 'none');
                $('#storeAvailabilityResults').css('display', 'none');

                $('#' + this.name + '_hlCheckMipStock').text('Check availability');
                $('#' + this.name + '_hlCheckMipStock').addClass('checkstore').removeClass('hidestore');

                this.xhr.abort();
                this.xhr = null;
            }
        },

        wire: function() {
            $('#' + this.name + '_hlCheckMipStock').bind('click', this, function(e) { e.data.toggleStoreAvailabilityVisibility(); });
            $('#' + this.name + '_cancel').bind('click', this, function(e) { e.data.clearStoreAvailability(); });
            $('#' + this.name + '_retry').bind('click', this, function(e) { e.data.fillStoreAvailability(); });
        },

        unwire: function() {
            $('#' + this.name + '_hlCheckMipStock').unbind('click');
            $('#' + this.name + '_cancel').unbind('click');
            $('#' + this.name + '_retry').unbind('click');
        }
    };
}