(function(define) {
    'use strict';

    define(['backbone', 'js/search/base/routers/search_router', 'js/search/dashboard/views/search_form',
            'js/search/base/collections/search_collection', 'js/search/dashboard/views/search_results_view'],
        function(Backbone, SearchRouter, SearchForm, SearchCollection, SearchListView) {
            return function() {
                var router = new SearchRouter();
                var form = new SearchForm();
                var collection = new SearchCollection([]);
                var results = new SearchListView({collection: collection});
                var dispatcher = _.clone(Backbone.Events);

                dispatcher.listenTo(router, 'search', function(query) {
                    form.doSearch(query);
                });

                dispatcher.listenTo(form, 'search', function(query) {
                    results.showLoadingMessage();
                    collection.performSearch(query);
                    router.navigate('search/' + query, {replace: true});
                });

                dispatcher.listenTo(form, 'clear', function() {
                    collection.cancelSearch();
                    results.clear();
                    router.navigate('');
                });

                dispatcher.listenTo(results, 'next', function() {
                    collection.loadNextPage();
                });

                dispatcher.listenTo(results, 'reset', function() {
                    form.resetSearchForm();
                });

                dispatcher.listenTo(collection, 'search', function() {
                    results.render();
                });

                dispatcher.listenTo(collection, 'next', function() {
                    results.renderNext();
                });

                dispatcher.listenTo(collection, 'error', function() {
                    results.showErrorMessage();
                });
            };
        });
})(define || RequireJS.define);