(function ($) {

$.widget("ui.likeButton", {  

    options: {
        likedLabel: 'Remove from Favorites',
        notLikedLabel: 'Add to Favorites'
    },

    _init: function () {
        var self = this;

        this.isLiked = null;

        this._getLikeStatus().then(function (likeStatus) {
            if (!likeStatus) {
                self.isLiked = false;
            }
            else {
                self.isLiked = true;
            }
        })
        .always(function () {
            self._bindClickHandler();
            self._renderButton();
        });

        this.element.button({
            text: true
        });
    },

    _bindClickHandler: function () {
        var self = this;

        this.element.click(function () {
            if (self.isLiked) {
                self._unlikeSong();
            }
            else {
                self._likeSong();
            }
        });
    },

    _unbindClickHandler: function () {
        this.element.unbind('click');
    },

    destroy: function () {
        this._unbindClickHandler();
        this.element.button('destroy');
    },

    _likeSong: function () {
        var self = this,
            url = this.element.data('href-like');

        this._unbindClickHandler();

        this._postLikeForm(url).then(
            function (likeResponse) {
                self.isLiked = true;
            },
            function (xhr) {
                self.isLiked = false;
            }
        )
        .always(function () {
            self._renderButton();
            self._bindClickHandler();
        });
    },

    _unlikeSong: function () {
        var self = this,
            url = this.element.data('href-unlike');

        this._unbindClickHandler();

        this._postLikeForm(url).then(
            function (likeResponse) {
                self.isLiked = false;
            }
        )
        .always(function () {
            self._renderButton();
            self._bindClickHandler();
        });
    },

    _getLikeStatus: function () {
        var href = this.element.data('href-like'),
            deferred = new $.Deferred();

        $.ajax({
            url: href,
            type: 'GET',
            dataType: 'json'
        })
        .then(
            function (likeStatus) {
                deferred.resolve(likeStatus);
            },
            function (xhr) { 
                deferred.resolve(null);
            }
        );

        return deferred.promise();
    },

    _postLikeForm: function (url) {
        var self = this,
            deferred = new $.Deferred();

        $.ajax({
            url: url,
            type: 'POST'
           // dataType: 'json'
        })
        .then(
            function (likeResult) {
                deferred.resolve(likeResult);
            },
            function (xhr) {
                if (xhr.status == 401) {
                    $('#page').loginManager('login').then(function () {
                        self._postLikeForm(url).then(
                            function (likeResult) {
                                deferred.resolve(likeResult);
                            },
                            function (innerXhr) {
                                deferred.reject(innerXhr);
                            }
                        );
                    });
                }
                else {
                    deferred.reject(xhr);
                }
            }
        );

        return deferred.promise();
    },

    _renderButton: function () {
        if (this.isLiked) {
            this.element.button('option', 'label', this.options.likedLabel);
        }
        else {
            this.element.button('option', 'label', this.options.notLikedLabel);
        }
    }
}); 

})(jQuery);


