(function () { "use strict"; angular.module('laz.videoLibrary') .provider('videos', function() { var preloadedCurrentVideo = null; var preloadedCategories = null; var currentVideoId = null; function videosFactory(videoApi, $q, EventEmitter){ var eventEmitter = new EventEmitter(); var CURRENT_VIDEO_CHANGE_EVENT = 'currentVideoChange'; var videoPromisesByVideoId = {}; var videoCategoriesPromise = null; if(preloadedCurrentVideo){ currentVideoId = preloadedCurrentVideo.id; videoPromisesByVideoId[currentVideoId] = $q.resolve(preloadedCurrentVideo); } if(preloadedCategories){ videoCategoriesPromise = $q.resolve(preloadedCategories); } return { getCurrentVideoId: getCurrentVideoId, setCurrentVideo: setCurrentVideo, getCurrentVideo: getCurrentVideo, onCurrentVideoChanged: onCurrentVideoChanged, getVideoCardCategories: getVideoCardCategories, clearCache: clearCache }; function getCurrentVideoId(){ return currentVideoId; } function setCurrentVideo(videoId){ if(videoId && (isNaN(parseInt(videoId)) || parseInt(currentVideoId) === parseInt(videoId))){ return; } console.debug("current: " + currentVideoId + " => new: " + videoId); currentVideoId = videoId || undefined; eventEmitter.emit(CURRENT_VIDEO_CHANGE_EVENT, currentVideoId); } function getCurrentVideo(){ var FEATURED_SENTINEL_ID = videoApi.FEATURED_SENTINEL_ID; var idToSearch = currentVideoId || FEATURED_SENTINEL_ID; if(!videoPromisesByVideoId[idToSearch]){ var videoPromise = videoApi.findById(idToSearch, videoApi.VIEW_TYPES.PLAYABLE); if(idToSearch === FEATURED_SENTINEL_ID){ videoPromise = videoPromise.then(function(video){ videoPromisesByVideoId[video.id] = videoPromisesByVideoId[video.id] || videoPromisesByVideoId[FEATURED_SENTINEL_ID]; return video; }); } videoPromisesByVideoId[idToSearch] = videoPromise; } console.debug(videoPromisesByVideoId); return videoPromisesByVideoId[idToSearch]; } function onCurrentVideoChanged(callback){ eventEmitter.on(CURRENT_VIDEO_CHANGE_EVENT, callback); return function(){ eventEmitter.off(CURRENT_VIDEO_CHANGE_EVENT, callback); }; } function getVideoCardCategories(){ if(!videoCategoriesPromise){ videoCategoriesPromise = videoApi.findCategories(videoApi.VIEW_TYPES.CARD); } return videoCategoriesPromise; } function clearCache(){ videoPromisesByVideoId = {}; videoCategoriesPromise = null; } } function loadCurrentVideo(video){ preloadedCurrentVideo = video; } function loadVideoCardCategories(categories){ preloadedCategories = categories; } return { loadCurrentVideo: loadCurrentVideo, loadVideoCardCategories: loadVideoCardCategories, $get: ['videoApi', '$q', 'EventEmitter', videosFactory ] }; }) })();