(function(define) { 'use strict'; define(['backbone', 'js/discovery/models/search_state', 'js/discovery/collections/filters', 'js/discovery/views/search_form', 'js/discovery/views/courses_listing', 'js/discovery/views/filter_bar', 'js/discovery/views/refine_sidebar'], function(Backbone, SearchState, Filters, SearchForm, CoursesListing, FilterBar, RefineSidebar) { return function(meanings, searchQuery, userLanguage, userTimezone) { var dispatcher = _.extend({}, Backbone.Events); var search = new SearchState(); var filters = new Filters(); var form = new SearchForm(); var filterBar = new FilterBar({collection: filters}); var refineSidebar = new RefineSidebar({ collection: search.discovery.facetOptions, meanings: meanings }); var listing; var courseListingModel = search.discovery; courseListingModel.userPreferences = { userLanguage: userLanguage, userTimezone: userTimezone }; listing = new CoursesListing({model: courseListingModel}); dispatcher.listenTo(form, 'search', function(query) { filters.reset(); form.showLoadingIndicator(); search.performSearch(query, filters.getTerms()); }); dispatcher.listenTo(refineSidebar, 'selectOption', function(type, query, name) { form.showLoadingIndicator(); if (filters.get(type)) { removeFilter(type); } else { filters.add({type: type, query: query, name: name}); search.refineSearch(filters.getTerms()); } }); dispatcher.listenTo(filterBar, 'clearFilter', removeFilter); dispatcher.listenTo(filterBar, 'clearAll', function() { form.doSearch(''); }); dispatcher.listenTo(listing, 'next', function() { search.loadNextPage(); }); dispatcher.listenTo(search, 'next', function() { listing.renderNext(); }); dispatcher.listenTo(search, 'search', function(query, total) { if (total > 0) { form.showFoundMessage(total); if (query) { filters.add( {type: 'search_query', query: query, name: quote(query)}, {merge: true} ); } } else { form.showNotFoundMessage(query); filters.reset(); } form.hideLoadingIndicator(); listing.render(); refineSidebar.render(); }); dispatcher.listenTo(search, 'error', function() { form.showErrorMessage(search.errorMessage); form.hideLoadingIndicator(); }); // kick off search on page refresh form.doSearch(searchQuery); function removeFilter(type) { form.showLoadingIndicator(); filters.remove(type); if (type === 'search_query') { form.doSearch(''); } else { search.refineSearch(filters.getTerms()); } } function quote(string) { return '"' + string + '"'; } }; }); }(define || RequireJS.define));