(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 $asSpinner = null; var $ssNext = null; var $ssScroller = null; var $ssSpinner = null; var $noActiveSessionsMsgSelector = $('#no-active-sessions'); var $noScheduledSessionsMsgSelector = $('#no-scheduled-sessions'); var currentScheduledSessionsPage = 0; var currentScheduledSessionsQuery = defaultScheduledSessionsQuery(); function getCategoryEnum() { return CATEGORY; } function search() { logger.debug("Searching for sessions..."); clearResults(); buildActiveSessionsQuery(); buildScheduledSessionsQuery(); loadSessions(); } function loadSessions() { $asSpinner.show(); $ssSpinner.show(); $noActiveSessionsMsgSelector.hide(); $noScheduledSessionsMsgSelector.hide(); // get active sessions rest.findActiveSessions(currentActiveSessionsQuery) .done(function(sessions) { renderActiveSessions(sessions); }) .fail(function(xhr, textStatus, errorMessage) { if (xhr.status === 404) { logger.warn("unable to list active sessions (404)") // swallow 404 } else { logger.warn("unable to list active sessions") app.ajaxError(xhr, textStatus, errorMessage); } }) .always(function() { context.JK.bindHoverEvents(); $asSpinner.hide(); }); // 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() { $ssSpinner.hide(); }); // context.JK.bindInstrumentHover($(CATEGORY.ACTIVE.id)); // context.JK.bindInstrumentHover($(CATEGORY.SCHEDULED.id)); } /***************** ACTIVE SESSIONS *****************/ function defaultActiveSessionsQuery() { return {offset:0, limit:SCHEDULED_SESSIONS_LIMIT, page:0}; } function renderActiveSessions(sessions) { $.each(sessions.sessions, function(i, session) { sessionList.renderActiveSession(session, $(CATEGORY.ACTIVE.id), sessions.my_audio_latency); }); afterLoadActiveSessions(sessions.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) { if (sessionList.length === 0) { $noActiveSessionsMsgSelector.show(); } else { $noActiveSessionsMsgSelector.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.sessions, function(i, session) { sessionList.renderInactiveSession(session, $(CATEGORY.SCHEDULED.id), undefined, sessions.my_audio_latency); }); context.JK.bindHoverEvents(); afterLoadScheduledSessions(sessions.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) { if(sessionList.length < SCHEDULED_SESSIONS_LIMIT) { // if we retrieve less results than asked for, end searching $ssScroller.infinitescroll('pause'); $noScheduledSessionsMsgSelector.show(); $('.infinite-scroll-loader').remove(); } else { $noScheduledSessionsMsgSelector.hide(); 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: $('