(function (context, $) { "use strict"; context.JK = context.JK || {}; context.JK.FindSessionScreen = function(app) { var CATEGORY = { ACTIVE: {index: 0, id: "table#sessions-active"}, SCHEDULED: {index: 1, id: "table#sessions-scheduled"} }; var $screen = null; var $dateFilter = $("#session-date-filter"); var $sessionLanguageFilter = $('#session-language-filter'); var logger = context.JK.logger; var rest = context.JK.Rest(); var sessionList; var ACTIVE_SESSIONS_LIMIT = 50; var SCHEDULED_SESSIONS_LIMIT = 20; var currentActiveSessionsQuery = defaultActiveSessionsQuery(); var $ssNext = null; var $ssScroller = null; var $ssNoMoreEntries = null; var currentScheduledSessionsPage = 0; var currentScheduledSessionsQuery = defaultScheduledSessionsQuery(); function getCategoryEnum() { return CATEGORY; } function removeSpinner($selector) { $('div[layout-id=findSession] .content .spinner').remove();// remove any existing spinners } function addSpinner($selector) { removeSpinner(); $selector.append('
') } function search() { logger.debug("Searching for sessions..."); clearResults(); buildActiveSessionsQuery(); buildScheduledSessionsQuery(); loadSessions(); } function loadSessions() { addSpinner($('#sessions-active')); addSpinner($('#sessions-scheduled')); // get active sessions rest.findActiveSessions(currentActiveSessionsQuery) .done(function(sessions) { renderActiveSessions(sessions); }) .fail(function(xhr, textStatus, errorMessage) { if (xhr.status === 404) { // swallow 404 } else { app.ajaxError(xhr, textStatus, errorMessage); } }) .always(function() { removeSpinner($('#sessions-active')); }); // get scheduled sessions rest.findInactiveSessions(currentScheduledSessionsQuery) .done(function(sessions) { renderScheduledSessions(sessions); }) .fail(function(xhr, textStatus, errorMessage) { if (xhr.status === 404) { // swallow 404 } else { app.ajaxError(xhr, textStatus, errorMessage); } }) .always(function() { removeSpinner($('#sessions-scheduled')); }); } /***************** ACTIVE SESSIONS *****************/ function defaultActiveSessionsQuery() { return {offset:0, limit:SCHEDULED_SESSIONS_LIMIT, page:0}; } function renderActiveSessions(sessions) { $.each(sessions, function(i, session) { sessionList.renderActiveSession(session, $(CATEGORY.ACTIVE.id)); }); afterLoadActiveSessions(sessions); } function buildActiveSessionsQuery() { currentActiveSessionsQuery = defaultActiveSessionsQuery(); // genre filter var genres = context.JK.GenreSelectorHelper.getSelectedGenres('#find-session-genre'); if (genres !== null && genres.length > 0) { currentActiveSessionsQuery.genre = genres.join(','); } // date filter var date = $('#session-date-filter').val(); if (date !== null && date.length > 0) { currentActiveSessionsQuery.day = context.JK.formatDateYYYYMMDD(date); currentActiveSessionsQuery.timezone_offset = (new Date().getTimezoneOffset()) / 60; } // language filter var language = $sessionLanguageFilter.val(); if (language !== null && language.length > 0) { currentActiveSessionsQuery.lang = language; } // keyword filter var keyword = $('#session-keyword-srch').val(); if (keyword !== null && keyword.length > 0 && keyword !== 'Search by Keyword') { currentActiveSessionsQuery.keyword = $('#session-keyword-srch').val(); } // always set client ID (required on server) currentActiveSessionsQuery.client_id = context.JK.clientId; console.log("currentActiveSessionsQuery = %o", currentActiveSessionsQuery); return currentActiveSessionsQuery; } function afterLoadActiveSessions(sessionList) { var $noSessionsMsgSelector = $('#no-active-sessions'); if (sessionList.length === 0) { $(CATEGORY.ACTIVE.id).hide(); $noSessionsMsgSelector.show(); } else { $(CATEGORY.ACTIVE.id).show(); $noSessionsMsgSelector.hide(); } buildActiveSessionsQuery(); context.JK.GA.trackFindSessions(sessionList.length); } /***************** SCHEDULED SESSIONS *****************/ function defaultScheduledSessionsQuery() { return {offset:currentScheduledSessionsPage * SCHEDULED_SESSIONS_LIMIT, limit:SCHEDULED_SESSIONS_LIMIT, page:currentScheduledSessionsPage}; } function renderScheduledSessions(sessions) { $.each(sessions, function(i, session) { sessionList.renderInactiveSession(session, $(CATEGORY.SCHEDULED.id)); }); afterLoadScheduledSessions(sessions); } function buildScheduledSessionsQuery() { currentScheduledSessionsQuery = defaultScheduledSessionsQuery(); // genre filter var genres = context.JK.GenreSelectorHelper.getSelectedGenres('#find-session-genre'); if (genres !== null && genres.length > 0) { currentScheduledSessionsQuery.genre = genres.join(','); } // date filter var date = $('#session-date-filter').val(); if (date !== null && date.length > 0) { currentScheduledSessionsQuery.day = context.JK.formatDateYYYYMMDD(date); currentScheduledSessionsQuery.timezone_offset = (new Date().getTimezoneOffset()) / 60; } // language filter var language = $sessionLanguageFilter.val(); if (language !== null && language.length > 0) { currentScheduledSessionsQuery.lang = language; } // keyword filter var keyword = $('#session-keyword-srch').val(); if (keyword !== null && keyword.length > 0 && keyword !== 'Search by Keyword') { currentScheduledSessionsQuery.keyword = $('#session-keyword-srch').val(); } // always set client ID (required on server) currentScheduledSessionsQuery.client_id = context.JK.clientId; console.log("currentScheduledSessionsQuery = %o", currentScheduledSessionsQuery); return currentScheduledSessionsQuery; } function afterLoadScheduledSessions(sessionList) { var $noSessionsMsgSelector = $('#no-scheduled-sessions'); if (sessionList.length === 0 && currentScheduledSessionsPage === 0) { $(CATEGORY.SCHEDULED.id).hide(); $noSessionsMsgSelector.show(); } else { $(CATEGORY.SCHEDULED.id).show(); $noSessionsMsgSelector.hide(); } if(sessionList.length < SCHEDULED_SESSIONS_LIMIT) { // if we retrieve less results than asked for, end searching $ssScroller.infinitescroll('pause'); $ssNoMoreEntries.show(); $('.infinite-scroll-loader').remove(); } else { currentScheduledSessionsPage++; buildScheduledSessionsQuery(); registerScheduledSessionInfiniteScroll(); } context.JK.GA.trackFindSessions(sessionList.length); } function registerScheduledSessionInfiniteScroll() { $ssScroller.infinitescroll({ behavior: 'local', navSelector: '#sessions-scheduled .btn-next-wrapper', nextSelector: '#sessions-scheduled .btn-next', binder: $ssScroller, dataType: 'json', appendCallback: false, debug: true, prefill: false, bufferPx:100, loading: { msg: $('