define(
    [
        'jquery'
    ], function ($) {
        'use strict';

        $.fn.spinForPromise = function (promise) {
            var self = this;

            if (!promise || promise.state() !== 'pending') {
                return this;
            }
            promise.always(function () {
                self.stopSpin();
            });

            return this.startSpin();
        };

        $.fn.startSpin = function () {

            var icon = this.find('i').andSelf('i');

            if (!icon || !icon.attr('class')) {
                return this;
            }

            var iconClasses = icon.attr('class').match(/(?:^|\s)icon\-.+?(?:$|\s)/);

            if (iconClasses.length === 0) {
                return this;
            }

            var iconClass = $.trim(iconClasses[0]);

            this.addClass('disabled');

            if (icon.hasClass('icon-can-spin')) {
                icon.addClass('icon-spin');
            }
            else {
                icon.attr('data-idle-icon', iconClass);
                icon.removeClass(iconClass);
                icon.addClass('icon-nd-spinner');
            }

            return this;
        };

        $.fn.stopSpin = function () {
            var icon = this.find('i').andSelf('i');

            this.removeClass('disabled');
            icon.removeClass('icon-spin icon-nd-spinner');
            var idleIcon = icon.attr('data-idle-icon');

            if (idleIcon) {
                icon.addClass(idleIcon);
            }

            return this;
        };
    });
