﻿// NS.js - NetSteps global namespace

var NS = new function () {
    // Use "this.fn" for public functions
    // Use "var fn" for private functions

    this.get = function (options) {
        ajax($.extend({}, options, { type: 'GET' }));
    };

    this.getJSON = function (options) {
        ajax($.extend({}, options, { type: 'GET', contentType: 'application/json' }));
    };    

    this.post = function (options) {
        ajax($.extend({}, options, { type: 'POST' }));
    };

    this.postJSON = function (options) {
        ajax($.extend({}, options, { type: 'POST', contentType: 'application/json' }));
    };

    this.initPostalCodeLookup = function (options) {
        var defaults = {
            container: undefined,
            url: '/Checkout/LookupZip',
            regex: '^\\d{5}',
            countryId: 0,
            city: undefined,
            county: undefined,
            stateId: undefined,
            dropDownText: ''
        };
        var settings = $.extend({}, defaults, options);

        if (settings.container === undefined)
            return;

        var container = $(settings.container);
        var regExp = new RegExp(settings.regex);
        var postalCodeControl = $('.postalcodelookup-postalcode', container);
        var cityControl = $('.postalcodelookup-city', container);
        var countyControl = $('.postalcodelookup-county', container);
        var stateControl = $('.postalcodelookup-state', container);
        var loadingElement = $('.postalcodelookup-loading', container);

        var zipXHR;
        var lastZip;

        function clearCityCountyStateControls() {
            cityControl.add(countyControl).add(stateControl).html('<option value=\"\">' + settings.dropDownText + '</option>');
        }
        function postalCodeLookup(zip) {
            if (!zipXHR) {
                loadingElement.show();
                cityControl.add(countyControl).add(stateControl).empty();
                zipXHR = $.getJSON(settings.url, { countryId: settings.countryId, zip: zip }, function (results) {
                    zipXHR = undefined;
                    lastZip = zip;
                    loadingElement.hide();
                    if (!results.length) {
                        if (showMessage && results.message) {
                            showMessage(results.message, true);
                        }
                        clearCityCountyStateControls();
                    } else {
                        for (var i = 0; i < results.length; i++) {
                            if (!cityControl.contains(results[i].city.trim())) {
                                cityControl.append('<option' + (settings.city && results[i].city == settings.city ? ' selected=\"selected\"' : '') + ' value=\"' + results[i].city + '\">' + results[i].city.trim() + '</option>');
                            }
                            if (!countyControl.contains(results[i].county.trim())) {
                                countyControl.append('<option' + (settings.county && results[i].county == settings.county ? ' selected=\"selected\"' : '') + ' value=\"' + results[i].county + '\">' + results[i].county.trim() + '</option>');
                            }
                            if (!stateControl.contains(results[i].state.trim())) {
                                stateControl.append('<option' + (settings.stateId && results[i].stateId == settings.stateId ? ' selected=\"selected\"' : '') + ' value=\"' + results[i].stateId + '\">' + results[i].state.trim() + '</option>');
                            }
                        }
                        cityControl.add(countyControl).add(stateControl).clearErrorMS();
                    }
                });
            }
        }
        postalCodeControl.keyup(function () {
            var postalCodeMatches = regExp.exec(postalCodeControl.fullVal());
            if (!postalCodeMatches) {
                lastZip = undefined;
                clearCityCountyStateControls();
                return;
            }
            // Check lastZip to avoid repeat lookups
            if (lastZip === postalCodeMatches[0]) {
                return;
            }
            postalCodeLookup(postalCodeMatches[0]);
        }).keyup();
    };

    var ajax = function (options) {
        var defaults = {
            url: undefined,
            type: 'GET',
            data: {},
            showLoading: undefined,
            target: undefined,
            success: function (data, textStatus, jqXHR) { },
            error: function (jqXHR, textStatus, errorThrown) {
                showMessage(undefined, true);
            }
        };
        var settings = $.extend({}, defaults, options);

        if (settings.url === undefined)
            return;

        if (settings.showLoading)
            showLoading($(settings.showLoading));

        var ajaxOptions = $.extend({}, settings, {
            showLoading: undefined,
            target: undefined,
            success: function (data, textStatus, jqXHR) {
                if (settings.showLoading)
                    hideLoading($(settings.showLoading));

                if (settings.target) {
                    if (data.result === undefined) {
                        $(settings.target).fadeOut('fast', function () {
                            $(this).empty().append(data).fadeIn('fast');
                        });
                    } else {
                        showMessage(data.message, !data.result);
                    }
                }

                settings.success(data, textStatus, jqXHR);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                if (settings.showLoading)
                    hideLoading($(settings.showLoading));

                settings.error(jqXHR, textStatus, errorThrown);
            }
        });

        $.ajax(ajaxOptions);
    };
};

