/**
 * This model is used by gallery/explore_users.blade.php, to handle following/unfollowing users profiles.
 * @constructor
 */
function ExploreUsersViewModel(urls)
{
    this.el = '#explore-users-app';

    this.data = {
    };

    this.computed = {
    };

    this.methods = {
        followUser: function(e)
        {
            var userIDToFollow = $(e.target).data('user-id');
            var urlToPost = urls.follow_user_url.replace('/-1/', '/' + userIDToFollow + '/');

            $.post(urlToPost, '', function(data)
            {
                window.location.reload(true);
            });

            e.preventDefault();
            return false;
        },
        unFollowUser: function(e)
        {
            var userIDToUnfollow = $(e.target).data('user-id');
            var urlToPost = urls.unfollow_user_url.replace('/-1/', '/' + userIDToUnfollow + '/');

            $.post(urlToPost, '', function(data)
            {
                window.location.reload(true);
            });

            e.preventDefault();
            return false;
        }
    };
}

/**
 * This model is used by gallery/photo.blade.php, to handle comments and individual photo actions.
 * @constructor
 */
function PhotoViewModel(urls) {
    this.el = '#photo-app';

    this.data = {
        is_reply_form_loading: false,
        reply_comment_id: 0
    };

    this.computed = {
        replyFormStyle: function()
        {
            return {
                'display': this.is_reply_form_loading ? 'none' : 'block'
            };
        }
    };

    this.methods = {
        init: function() {
            var self = this;

            // Load the right comment reply form
            $('#comment-reply-modal').on('show.bs.modal', function (event) {
                var url = urls.reply_comment_form.replace(/-1$/, self.reply_comment_id);
                $.get(url, function(result)
                {
                    $('#comment-reply-form-content').html(result);
                    initTinyMce('#comment-text-reply');
                    self.is_reply_form_loading = false;
                });
            });

            $('#comment-reply-modal').on('hide.bs.modal', function (event) {
                tinymce.remove('#comment-text-reply');
            });
        },
        postCommentReply: function() {
            var form = $('form', '#comment-reply-form-content');
            var formUrl = $(form).attr('action');

            // Seems like the TinyMCE editor in the BS modal does not persist back to the textarea correctly - so do
            // this manually (bit of a hack!)
            $('#comment-text-reply', form).html(tinymce.get('comment-text-reply').getContent());

            var formData = form.serialize();

            $.post(formUrl, formData, function(result)
            {
                if (result.redirect_url)
                {
                    window.location = result.redirect_url;
                }
                else
                {
                    tinymce.remove('#comment-text-reply');
                    $('#comment-reply-form-content').html(result);
                    initTinyMce('#comment-text-reply');
                }
            });
        },
        replyToComment: function(e) {
            var replyButton = $(e.target).closest('.photo-comment');
            this.reply_comment_id = replyButton.data('comment-id');

            this.is_reply_form_loading = true;
            $('#comment-reply-modal').modal('show');

            e.preventDefault();
            return false;
        }
    };
}

/**
 * This model is used by gallery/user_profile.blade.php, to handle a user's profile.
 * @constructor
 */
function UserViewModel(urls)
{
    this.el = '#user-app';

    this.data = {
        feed_items: [],
        is_loading: true,
        selected_view: 'profile',
        user_id: 0
    };

    this.computed = {
        isFeed: function() {
            return this.selected_view === 'feed';
        },
        isProfile: function() {
            return this.selected_view === 'profile';
        }
    };

    this.methods = {
        followUser: function(e)
        {
            $.post(urls.follow_user_url, '', function(data)
            {
                window.location.reload(true);
            });

            e.preventDefault();
            return false;
        },
        loadFeedItems: function(e)
        {
            var self = this;

            $.get(urls.feed_url, function (data)
            {
                for (var i = 0; i < data.length; i++)
                {
                    // User name
                    if (data[i].params.user_name && data[i].params.user_url)
                    {
                        data[i].description = data[i].description
                            .replace(
                                ':user_name',
                                '<a href="' + data[i].params.user_url + '">' + data[i].params.user_name + '</a>'
                            );
                    }

                    // Photo name
                    if (data[i].params.photo_name && data[i].params.photo_url)
                    {
                        data[i].description = data[i].description
                            .replace(
                                ':photo_name',
                                '<a href="' + data[i].params.photo_url + '">' + data[i].params.photo_name + '</a>'
                            );
                    }

                    // Album name
                    if (data[i].params.album_name && data[i].params.album_url)
                    {
                        data[i].description = data[i].description
                            .replace(
                                ':album_name',
                                '<a href="' + data[i].params.album_url + '">' + data[i].params.album_name + '</a>'
                            );
                    }

                    // App name
                    if (data[i].params.app_name && data[i].params.app_url)
                    {
                        data[i].description = data[i].description
                            .replace(
                                ':app_name',
                                '<a href="' + data[i].params.app_url + '">' + data[i].params.app_name + '</a>'
                            );
                    }
                }

                self.feed_items = data;
                self.is_loading = false;
            });
        },
        switchToFeed: function(e) {
            this.selected_view = 'feed';
            history.pushState('', '', urls.current_url + '?tab=feed');

            e.preventDefault();
            return false;
        },
        switchToProfile: function(e) {
            this.selected_view = 'profile';
            history.pushState('', '', urls.current_url + '?tab=profile');

            e.preventDefault();
            return false;
        },
        unFollowUser: function(e)
        {
            $.post(urls.unfollow_user_url, '', function(data)
            {
                window.location.reload(true);
            });

            e.preventDefault();
            return false;
        }
    };
}