(function (){ "use strict"; angular.module('shared') .factory('folderListItemAmbassador', ['$rootScope', '_', dataService]); function dataService($rootScope, _) { var activeFolderListItem = {id: 0, isChecked: false}; var selectedFolderListItem = {id: 0, isChecked: false}; var previousShownFolders = {}; var ACTIVE_FOLDER_LIST_ITEM_CHANGED = "folderListItemActiveChanged"; var SELECTED_FOLDER_LIST_ITEM_CHANGED = "folderListItemSelectedChanged"; return { registerOnActiveFolderListItemChanged: registerOnActiveFolderListItemChanged, registerOnSelectedFolderListItemChanged: registerOnSelectedFolderListItemChanged, setActiveFolderListItem: setActiveFolderListItem, setSelectedFolderListItem: setSelectedFolderListItem, getActiveFolderListItem: getActiveFolderListItem, getSelectedFolderListItem: getSelectedFolderListItem, resetActiveFolderListItem: resetActiveFolderListItem, resetSelectedFolderListItem: resetSelectedFolderListItem, getPreviousShownFolders: getPreviousShownFolders, findPreviousShownFolders: findPreviousShownFolders, savePreviousShownFolders: savePreviousShownFolders, reinstateShownFolders: reinstateShownFolders, expandLastSavedFolderForShownFolders: expandLastSavedFolderForShownFolders }; function registerOnActiveFolderListItemChanged(scope, callback) { var eventListenDestructor = $rootScope.$on(ACTIVE_FOLDER_LIST_ITEM_CHANGED, callback); scope.$on('$destroy', eventListenDestructor); } function registerOnSelectedFolderListItemChanged(scope, callback) { var eventListenDestructor = $rootScope.$on(SELECTED_FOLDER_LIST_ITEM_CHANGED, callback); scope.$on('$destroy', eventListenDestructor); } function setActiveFolderListItem(folderListItem) { resetSelectedFolderListItem(); if (activeFolderListItem.id === folderListItem.id) { return; } activeFolderListItem = folderListItem; emitActiveFolderListItemChanged(); } function setSelectedFolderListItem(folderListItem) { resetActiveFolderListItem(); if (selectedFolderListItem.id === folderListItem.id) { return; } selectedFolderListItem = folderListItem; emitSelectedFolderListItemChanged(); } function getActiveFolderListItem() { return activeFolderListItem; } function getSelectedFolderListItem() { return selectedFolderListItem; } function resetActiveFolderListItem() { if (activeFolderListItem.id === 0) { return; } activeFolderListItem = {id: 0, isChecked: false}; emitActiveFolderListItemChanged(); } function resetSelectedFolderListItem() { if (selectedFolderListItem.id === 0) { return; } selectedFolderListItem = {id: 0, isChecked: false}; emitSelectedFolderListItemChanged(); } function emitActiveFolderListItemChanged() { $rootScope.$emit(ACTIVE_FOLDER_LIST_ITEM_CHANGED); } function emitSelectedFolderListItemChanged() { $rootScope.$emit(SELECTED_FOLDER_LIST_ITEM_CHANGED); } function getPreviousShownFolders() { return previousShownFolders; } function findPreviousShownFolders(folderId) { var showFolders = true; if (folderId && previousShownFolders && previousShownFolders[folderId]) { showFolders = previousShownFolders[folderId].showFolders; } return showFolders; } function savePreviousShownFolders(folderList) { folderList.forEach(function (folder) { previousShownFolders[folder.id] = []; previousShownFolders[folder.id].showFolders = folder.showFolders; if (folder.children) { savePreviousShownFolders(folder.children); } }); } function reinstateShownFolders(folderList, newFolderId) { folderList.forEach(function (folder, index) { if (folder.id && previousShownFolders && previousShownFolders[folder.id]) { this[index].showFolders = previousShownFolders[folder.id].showFolders; } if (parseInt(this[index].id, 10) === parseInt(newFolderId, 10)) { previousShownFolders[this[index].id].showFolders = true; this[index].showFolders = true; } if (folder.children) { reinstateShownFolders(folder.children); } }, folderList); return folderList; } function expandLastSavedFolderForShownFolders(folderList, folderIdsToSave) { folderList.forEach(function (folder, index) { previousShownFolders[folder.id] = []; if (folder.id && folderIdsToSave.indexOf(folder.id) !== -1) { this[index].showFolders = true; previousShownFolders[folder.id].showFolders = true; } else { this[index].showFolders = false; previousShownFolders[folder.id].showFolders = false; } if (folder.children) { expandLastSavedFolderForShownFolders(folder.children, folderIdsToSave); } }, folderList); } } })();