(function() { "use strict"; angular.module('shared') .service('folderTreeViewService', ['folders','currentSubFolders', function (folders, currentSubFolders) { var keyboardKeys = { enter: 13, asterisk: 56, space: 32, left: 37, up: 38, right: 39, down: 40, home: 36, end: 35, escape: 27, tab: 9 }; var intialFolders = null; var selectFunction = null; var preventDefault = true; var isToggleButtonTarget = false; var isToggleButtonCollapsed = false; function keyDown(event,folder,folders,cancelFunction,selFunction,saveFunction,hamburgerMenuClass) { preventDefault = true; intialFolders = folders; selectFunction = selFunction; isToggleButtonTarget = isTargetButton(event); isToggleButtonCollapsed = isToggleCollapsed(event); switch (event.keyCode) { case keyboardKeys.tab: tab(folder,event,cancelFunction,hamburgerMenuClass); break; case keyboardKeys.escape: escape(cancelFunction,hamburgerMenuClass); break; case keyboardKeys.down: downArrow(folder); break; case keyboardKeys.up: upArrow(folder); break; case keyboardKeys.right: rightArrow(folder); break; case keyboardKeys.left: leftArrow(folder); break; case keyboardKeys.space: case keyboardKeys.enter: enterOrSpace(event,folder,saveFunction); break; case keyboardKeys.home: home(); break; case keyboardKeys.end: end(); break; case keyboardKeys.asterisk: asterisk(folder); break; default: searchKey(folder,event); break; } if (preventDefault) { event.preventDefault(); } } function isTargetButton(event) { return $j(event.target).is('button'); } function isToggleCollapsed(event) { return isToggleButtonTarget && $j(event.target).hasClass('fileCabinetNav_toggle-collapsed'); } function tab(folder,event,cancelFunction,hamburgerMenuClass) { var inBounds = event.shiftKey ? upArrow(folder) : downArrow(folder); if (!inBounds) { escape(cancelFunction,hamburgerMenuClass); preventDefault = false; } } function escape(cancelFunction,hamburgerMenuClass) { if (!cancelFunction) { return; } cancelFunction(); if (hamburgerMenuClass != null) { var element = $j('.' + hamburgerMenuClass); if (element != null && element.length > 0) { element.focus(); } } } function asterisk(folder) { var parentId = folder.parent_resource_collection_id; var folderList = getFlattenedOpenFolderList(true); for (var counter = 0;counter < folderList.length;counter++) { if (folderList[counter].parent_resource_collection_id == parentId) { rightArrow(folderList[counter]); } } setFocus(folder.id); } function searchKey(folder,event) { var key = event.key.toLowerCase(); if (key.length != 1) { return; } var idList = getFlattenedOpenFolderList(false); var startingPoint = idList.indexOf(folder.id); var folderList = getFlattenedOpenFolderList(true); for (var counter = startingPoint + 1;counter < folderList.length;counter++) { if (key == folderList[counter].name.toLowerCase().charAt(0)) { setFocus(folderList[counter].id); return; } } for (var counter = 0;counter < startingPoint;counter++) { if (key == folderList[counter].name.toLowerCase().charAt(0)) { setFocus(folderList[counter].id); return; } } } function enterOrSpace(event, folder, saveFunction) { if (isToggleButtonTarget) { saveFunction(event, folder); return; } if (saveFunction != null) { saveFunction(); return; } currentSubFolders.setCurrentSubFolders(folder, currentSubFolders.getAreFoldersPublic() ? 'public' : 'user'); currentSubFolders.setLastFolderID(currentSubFolders.getAreFoldersPublic() ? null : folder); } function setFocus(id) { var element = $j(classPreface() + id); if (element != null && element.length > 0) { element.focus(); } } function selectFolder(position) { var folders = getFlattenedOpenFolderList(true); for (var counter = 0;counter < folders.length;counter++) { folders[counter].selected = false; } folders[position].selected = true; if (selectFunction == null) { return; } var folder = folders[position]; selectFunction(folder); } function focusOnToggleButton(folderId) { var folderElement = $j(classPreface() + folderId); var buttonElement = folderElement.children().first(); if (folderElement && folderElement.length > 0 && buttonElement && buttonElement.length > 0) { if (buttonElement.is('button')) { buttonElement.focus(); return true; } } } function findNextFolderId(folder, down) { var baseFilter = 'ul.js-menu-sublevel li.navItem a'; var folderItems = down ? $j(baseFilter) : $j($j(baseFilter).get().reverse()); var folderFilter = baseFilter + classPreface() + folder.id; var folderIndex = folderItems.index($j(folderFilter)); var nextFolderIndex = folderIndex + 1; var nextFolder = folderItems.eq(nextFolderIndex); var nextFolderId = nextFolder.attr("class").toString().split(classPreface().slice(1)).pop(); return nextFolder.hasClass('is-selected') ? nextFolderId.split(' ').shift() : nextFolderId; } function checkToggleFolderButton(folder, down) { var nextFolderId = down ? findNextFolderId(folder, down) : folder.id; if (nextFolderId && isNumeric(nextFolderId)) { var folderList = getFlattenedOpenFolderList(false); var position = folderList.indexOf(nextFolderId); setFocus(nextFolderId); selectFolder(position); return true; } return false; } function home() { var ids = getFlattenedOpenFolderList(false); if (ids.length < 1) { return; } setFocus(ids[0]); selectFolder(0); } function end() { var ids = getFlattenedOpenFolderList(false); if (ids.length < 1) { return; } setFocus(ids[ids.length - 1]); selectFolder(ids.length - 1); } function rightArrow(folder) { if (folder.children != undefined && folder.children.length > 0) { if (folder.folderOpen != undefined && folder.folderOpen == true) { downArrow(folder); } else { folder.folderOpen = true; } } } function leftArrow(folder) { if (intialFolders != null) { return; } if (folder.children != undefined && folder.children.length > 0) { if (folder.folderOpen != undefined && folder.folderOpen == true) { folder.folderOpen = false; return; } } if (folder.parent_resource_collection_id != undefined && folder.parent_resource_collection_id != null) { setFocus(folder.parent_resource_collection_id); } } function downArrow(folder) { if (isToggleButtonTarget) { return checkToggleFolderButton(folder, true); } if (folder.children && folder.children.length > 0) { if (focusOnToggleButton(folder.id)) { return true; } } var ids = getFlattenedOpenFolderList(false); if (ids.length < 1) { return; } var pos = ids.indexOf(folder.id); if (pos >= 0 && pos < (ids.length - 1)) { setFocus(ids[pos + 1]); selectFolder(pos + 1); return true; } return false; } function upArrow(folder) { if (isToggleButtonTarget) { return checkToggleFolderButton(folder, false); } var nextFolderId = findNextFolderId(folder, false); if (nextFolderId) { if (focusOnToggleButton(nextFolderId)) { return true; } } var ids = getFlattenedOpenFolderList(false); if (ids.length < 1) { return; } var pos = ids.indexOf(folder.id); if (pos > 0) { setFocus(ids[pos - 1]); selectFolder(pos - 1); return true; } return false; } function classPreface() { if (intialFolders != null) { return '.js-copy-'; } else if (currentSubFolders.getAreFoldersForEveryone()) { return '.js-everyone-'; } else if (currentSubFolders.getAreFoldersPublic()) { return '.js-public-'; } else { return '.js-'; } } function getFlattenedOpenFolderList(includeFolder) { var ids = []; var folderList = intialFolders; if (folderList == null) { if (currentSubFolders.getAreFoldersPublic()) { folderList = folders.getPublicFolders(); } else if (currentSubFolders.getAreFoldersForEveryone()) { folderList = folders.getEveryoneFolders(); } else { folderList = folders.getMyFolders(); } } getFlattenedOpenFolders(folderList,ids,includeFolder); return ids; } function getFlattenedOpenFolders(folderList,ids,includeFolder) { for (var counter = 0;counter < folderList.length;counter++) { var folder = folderList[counter]; if (folder.skipInScrollView == undefined || !folder.skipInScrollView) { if (includeFolder) { ids.push(folder); } else { ids.push(folder.id); } } if (folder.folderOpen != undefined && folder.folderOpen == true) { if (folder.children != undefined && folder.children.length > 0) { getFlattenedOpenFolders(folder.children,ids,includeFolder); } } } } function isNumeric(number) { return !isNaN(number); } return { keyDown: keyDown, isTargetButton: isTargetButton } }]); }());