{"version":3,"file":"assetCommon.min.js","sources":["angularModule.js","assetCommonConfig.js","directives/dragDrop.js","directives/fileSelect.js","mappers/assetMapper.js","mappers/facetMapper.js","mappers/fileMapper.js","mappers/formatMapper.js","mappers/revisionMapper.js","mappers/shareMapper.js","mappers/userMapper.js","services/assetService.js","services/bucketService.js","services/cancellationService.js","services/fileService.js","services/fileUploadManager.js","services/fileUploadService.js","services/jobService.js","services/localSettingsService.js","services/logBuffer.js","services/promiseUtilityService.js","services/tooltipService.js","services/userService.js","utility/assetUtility.js","utility/environmentUtility.js","utility/geometryUtility.js","utility/httpUtility.js","utility/layoutUtility.js","utility/mimeTypeUtility.js"],"names":["angular","module","assetCommonConfig","config","previewFormatPrefix","extractedTextFormatName","assetServiceBaseUri","logBufferSize","dropEventName","filesSelectedEventName","accountServicesBaseUri","signInUri","signOutUri","singleSignInScriptUri","this","setLogBufferSize","value","setAssetServiceBaseUri","setAccountServicesBaseUri","setSignInUri","setSignOutUri","setSingleSignInScriptUri","setPreviewFormatPrefix","setExtractedTextFormatName","setDropEventName","setFilesSelectedEventName","$get","provider","dragDropMonitor","$timeout","restrict","controller","$scope","currentDragOverTarget","vm","dragOver","showDragDropOutline","shouldShowDragDropOutline","show","setDragOver","targetElement","over","setIsDragOverDropTarget","isDragOverDropTarget","link","scope","elem","attrs","broadcastStatus","$broadcast","dragStatusEventName","isDragging","timer","on","e","$eval","dragEnabled","stopPropagation","preventDefault","originalEvent","dataTransfer","dropEffect","cancel","$apply","dragDropDropTarget","$rootScope","$parse","_","mimeTypeUtility","areValidFileTypes","fileTypes","acceptedFileTypes","length","acceptedTypes","map","type","splitMimeType","all","fileType","fileTypeResult","acceptedType","subType","require","dragDropController","dragOutTimer","dataTransferEffect","datatransferEffect","callback","dropAction","dragover dragenter","isAllowed","contains","types","pluck","items","acceptedFiles","split","isDragOver","window","clearTimeout","setTimeout","dragleave","drop","files","$on","event","status","directive","$inject","fileSelect","transclude","template","find","attr","multiple","selectAction","assetMapper","assetUtility","uriUtility","formatMapper","userMapper","fileMapper","revisionMapper","getDownloadPathForFile","baseUrl","fileId","revId","fromPattern","rev","mapAsset","source","undefined","isArray","file","DEFAULT_PRIMARY_FILE","metadata","license","creation","appMetadata","appData","userMetadata","userData","formats","format","id","revision","families","familyName","name","data","cloneDeep","bucket","kind","title","description","date","language","authors","headline","note","tags","categories","copyright","publisher","familyMetadata","familyData","location","webStatement","licenseTerms","usageTerms","rights","favorite","dateCreated","uploadId","other","isDeleted","rating","views","stats","count","downloads","reduce","sum","x","counter",{"end":{"file":"mappers/assetMapper.js","comments_before":[],"nlb":false,"endpos":2424,"endcol":20,"endline":78,"pos":2412,"col":8,"line":78,"value":"globalRating","type":"name"},"start":{"file":"mappers/assetMapper.js","comments_before":[],"nlb":false,"endpos":2424,"endcol":20,"endline":78,"pos":2412,"col":8,"line":78,"value":"globalRating","type":"name"},"name":"globalRating"},"globalRating","ratingTotal","ratingCount","globalRatingCount","globalFavoriteCount","favoriteCount","fileUrl","sourceUrl","getBestThumbnailForSize","size","getBestFormatForSize","getVideoSourcesForSize","getAudioSources","creator","agent","user","boardIds","factory","facetMapper","mapFacet","field","terms","none","utility","computeImageDimensions","image","width","height","mapFile","assetId","revisionId","byteCount","lastModified","mediaType","omit","defineLazyProperty","filteredMetadata","clone","updated","Error","mapFormat","f","isSystemFormat","startsWith","mapRevision","changes","ops","shareMapper","mapShare","token","shareUrl","mapUser","avatarUri","isAnonymous","mapUserDetails","String","profileToken","email","alias","avatarUrls","avatarUrlLarge","about","organization","mapDetails","assetService","$http","$q","fileUploadService","bucketService","cancellationService","jobService","promiseUtilityService","dateTimeUtility","httpUtility","updateAssetAsync","collectChanges","cancellationToken","shareToken","updateOriginal","push","op","update","updateSource","createFormat","formatOptions","asset","createFormatOperation","codec","audioVideoFormats","videoCodec","audioCodec","resize","fileName","removeFormats","fileIds","forEach","edit","editAssetsAsync","shouldAwaitCompletion","then","results","fromResult","createShareAsync","expirationDate","post","expires","response","getShareAssetIdAsync","get","reject","getAssetUri","options","share","getAssetExifToolAsync","timeout","awaitBulkJobCompletionAsync","multiGetJobsAsync","jobs","content","error","addToFavoritesAsync","assetIds","doSimpleAssetOperationAsync","removeFromFavoritesAsync","deleteAssetsAsync","undeleteAssetsAsync","fireAndForget","addToBoardAsync","boardId","removeFromBoardAsync","getAssetRevisionsUri","limit","next","getAssetAsync","fields","assetFieldFilter","getErrorReason","getAssetsAsync","request","assetsFieldFilter","assets","item","getFileLinksForAssetsAsync","assetFileIds","getRevisionsAsync","revisions","revisionRequestLimit","newerRevision","differenceInSeconds","mergeWithinMinutes","concat","searchAssetsAsync","extend","getCurrentBucket","hits","total","hitTotal","facets","createAssetAsync","uploadedFile","operations","waitForIndexing","revertAssetToRevisionAsync","revertTo","reportAssetView","reportAssetDownload","getLastSaveDate","lastSaveStartDate","lastSaveEndDate","Date","now","params","responseFormatter","result","assetFieldsToRemove","audio/mpeg","audio/ogg","video/mp4","video/webm","localSettingsService","mapBucket","toTitleCase","breakCamelCaseWords","replace","readPermission","writePermission","currentBucket","savedBucket","setting","buckets","defaultBucket","setCurrentBucket","set","getBucketsAsync","getBucketsPromise","getBucketAsync","bucketId","createSettingAccessor","createCancellationSource","deferred","defer","promise","isCancelled","whenCanceled","resolve","withToken","partialRight","cancelWhenDestroyed","cancellationSource","unwatch","fileService","getFileAsync","fileUploadManager","$log","createProgressTracker","getFileProgressReport","getProgressReport","statusGroups","groupBy","minStatus","statusList","fileReports","updateProgressSoon","throttle","notify","addFile","fileSize","uploadedSize","setFileStatus","setUploadProgress","isUndefined","Math","max","min","monitorProgress","uploadFilesAndCreateOrUpdateAssetsAsync","progressTracker","uploads","getFileBatchUploadIdAsync","batchId","index","forEachAsync","parallelForEach","maxDegreeOfParallelism","upload","log","info","uploadFileAsync","unshift","path","fileUploadProgress","loaded","job","warn","progress","uploadFilesAndCreateAssetsAsync","getLogger","$","form","FormData","append","toIso8601","lastModifiedDate","lengthComputable","jqXhr","ajax","url","processData","contentType","xhr","ajaxSettings","addEventListener","success","complete","$digest","abort","ids","Object","freeze","EventEmitter","beginWaitingForJob","waitingCount","endWaitingForJob","isJobComplete","finished","jobIds","updateInterval","intervalRequestCount","requestsPerStep","pollingIntervalStep","jobCompletionPollIntervalSteps","pollingInterval","jobStatuses","acc","jobId","waiting","awaitJobCompletionAsyncCore","shouldIncludeFullResponse","remainingJobIds","changedJobs","isJobPending","jobStatus","pick","updatedJobs","values","any","cancelJobAsync","runnerId","runner","restartJobAsync","adminGetJobServerStatusAsync","service","servers","responses","adminGetJobsAsync","join","adminGetJobUri","adminStartJobServerAsync","serverId","adminPauseJobServerAsync","adminStopJobServerAsync","adminStartJobServiceAsync","adminPauseJobServiceAsync","addStatusChangedHandler","handler","events","addListener","jobChangeEventName","jobChangeCancellationSource","createJobChangeWsConnection","removeStatusChangedHandler","removeListener","listenersAny","jobChangeWSConnection","WebSocket","onopen","onmessage","JSON","parse","emit","onclose","reconnect","close","wildcard","isAwaiting","isStorageSupported","storage","key","setItem","removeItem","localStorage","sessionStorage","db","getItem","api","stringify","settingName","defaultValue","hasRead","logBuffer","bufferSize","logs","getRecentLogs","addLog","level","obj","splice","rejectWith","collection","processItemSoon","processItem","pop","toArray","parallelOptions","continueWork","first","promises","when","reason","compact","arguments","tooltipService","$document","$animate","createTooltip","initializeTooltip","beginShowTooltip","onShow","mouseLeavePromise","mouseEnterPromise","tooltip","showTooltip","tooltipInitializationAborter","tooltipElem","tooltipDisplayDelay","beginHideTooltip","hideTooltip","tooltipHideDelay","enter","body","lastChild","reposition","destroyTooltip","onDestroy","remove","leave","destroy","opts","my","tooltipOffset","at","of","within","container","collision","using","position","feedback","toggleClass","horizontal","css","defaults","beginShow","beginHide","tooltipFadeDuration","userService","getCurrentUserAsync","getUserDetailsAsync","searchUsersAsync","search","trim","q","users","signin","password","method","getSingleSignInScriptAsync","script","getBestFormatsForSize","desiredSize","formatPrefix","closestSize","bestFormats","filter","firstFile","previewSize","substring","parseInt","formatsLargerThanDesired","formatsSmallerThanDesired","sortBy","abs","take","bestFormat","previewFile","src","sort","a","b","indexOf","environmentUtility","$location","getEnvironment","host","subdomains","substr","local","internal","geometryUtility","getBestFitForConstraint","constraintWidth","constraintHeight","bounds","displayWidth","displayHeight","constraintAspectRatio","aspectRatio","isNumber","layoutUtility","isSmallScreen","innerWidth","getFileKind","findKey","mediaKinds","patterns","pattern","RegExp","test","mimeType","parts","subtype","doc","xls","pdf","zip","psd","ai","fw","indd","application","video","audio","text"],"mappings":"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","sourcesContent":["(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon', []);\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.provider('assetCommonConfig', assetCommonConfig);\r\n\r\n\tfunction assetCommonConfig() {\r\n\t\tvar previewFormatPrefix = 'Amber Preview';\r\n\t\tvar extractedTextFormatName = 'Extracted Text';\r\n\t\tvar dropEventName = 'dropTarget.dropped';\r\n\t\tvar filesSelectedEventName = 'fileSelect.filesSelected';\r\n\t\tvar logBufferSize = 50;\r\n\t\tvar assetServiceBaseUri;\r\n\t\tvar accountServicesBaseUri;\r\n\t\tvar signInUri;\r\n\t\tvar signOutUri;\r\n\t\tvar singleSignInScriptUri;\r\n\r\n\t\tthis.setLogBufferSize = function (value) {\r\n\t\t\tlogBufferSize = value;\r\n\t\t};\r\n\r\n\t\tthis.setAssetServiceBaseUri = function (value) {\r\n\t\t\tassetServiceBaseUri = value;\r\n\t\t};\r\n\r\n\t\tthis.setAccountServicesBaseUri = function (value) {\r\n\t\t\taccountServicesBaseUri = value;\r\n\t\t};\r\n\r\n\t\tthis.setSignInUri = function (value) {\r\n\t\t\tsignInUri = value;\r\n\t\t};\r\n\r\n\t\tthis.setSignOutUri = function (value) {\r\n\t\t\tsignOutUri = value;\r\n\t\t};\r\n\r\n\t\tthis.setSingleSignInScriptUri = function (value) {\r\n\t\t\tsingleSignInScriptUri = value;\r\n\t\t};\r\n\r\n\t\tthis.setPreviewFormatPrefix = function (value) {\r\n\t\t\tpreviewFormatPrefix = value;\r\n\t\t};\r\n\r\n\t\tthis.setExtractedTextFormatName = function (value) {\r\n\t\t\textractedTextFormatName = value;\r\n\t\t};\r\n\r\n\t\tthis.setDropEventName = function (value) {\r\n\t\t\tdropEventName = value;\r\n\t\t};\r\n\r\n\t\tthis.setFilesSelectedEventName = function (value) {\r\n\t\t\tfilesSelectedEventName = value;\r\n\t\t};\r\n\t\tthis.$get = config;\r\n\r\n\t\tfunction config() {\r\n\t\t\treturn {\r\n\t\t\t\tpreviewFormatPrefix: previewFormatPrefix,\r\n\t\t\t\textractedTextFormatName: extractedTextFormatName,\r\n\t\t\t\tassetServiceBaseUri: assetServiceBaseUri,\r\n\t\t\t\tlogBufferSize: logBufferSize,\r\n\t\t\t\tdropEventName: dropEventName,\r\n\t\t\t\tfilesSelectedEventName: filesSelectedEventName,\r\n\t\t\t\taccountServicesBaseUri: accountServicesBaseUri,\r\n\t\t\t\tsignInUri: signInUri,\r\n\t\t\t\tsignOutUri: signOutUri,\r\n\t\t\t\tsingleSignInScriptUri: singleSignInScriptUri\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.directive('dragDropMonitor', dragDropMonitor)\r\n\t\t.directive('dragDropDropTarget', dragDropDropTarget);\r\n\r\n\tvar dragStatusEventName = 'dragdrop.window.dragging';\r\n\r\n\tfunction dragDropMonitor($timeout) {\r\n\t\treturn {\r\n\t\t\trestrict: 'A',\r\n\t\t\tcontroller: ['$scope', function ($scope) {\r\n\t\t\t\tvar vm = this;\r\n\t\t\t\tvar currentDragOverTarget;\r\n\r\n\t\t\t\t$scope.dragOver = false;\r\n\t\t\t\t$scope.showDragDropOutline = false;\r\n\r\n\t\t\t\tvm.shouldShowDragDropOutline = function (show) {\r\n\t\t\t\t\t$scope.showDragDropOutline = show;\r\n\t\t\t\t};\r\n\r\n\t\t\t\tvm.setDragOver = function (targetElement, over) {\r\n\t\t\t\t\tif (over) {\r\n\t\t\t\t\t\tcurrentDragOverTarget = targetElement;\r\n\t\t\t\t\t\t$scope.dragOver = over;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (currentDragOverTarget === targetElement) {\r\n\t\t\t\t\t\t$scope.dragOver = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tcurrentDragOverTarget = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tvm.setIsDragOverDropTarget = function (targetElement, value) {\r\n\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\tcurrentDragOverTarget = targetElement;\r\n\t\t\t\t\t\t$scope.isDragOverDropTarget = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (currentDragOverTarget === targetElement) {\r\n\t\t\t\t\t\t$scope.isDragOverDropTarget = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tcurrentDragOverTarget = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t}],\r\n\t\t\tlink: function (scope, elem, attrs) {\r\n\t\t\t\tvar timer;\r\n\t\t\t\tvar isDragging = false;\r\n\r\n\t\t\t\tfunction broadcastStatus() {\r\n\t\t\t\t\tscope.$broadcast(dragStatusEventName, { isDragging: isDragging });\r\n\t\t\t\t}\r\n\r\n\t\t\t\telem.on('dragover', function (e) {\r\n\t\t\t\t\tif (!scope.$eval(attrs.dragEnabled))\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\tif (!scope.isDragOverDropTarget)\r\n\t\t\t\t\t\te.originalEvent.dataTransfer.dropEffect = 'none';\r\n\r\n\t\t\t\t\tif (isDragging) {\r\n\t\t\t\t\t\t$timeout.cancel(timer);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\t\tisDragging = true;\r\n\t\t\t\t\t\t\tscope.showDragDropOutline = true;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tbroadcastStatus();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttimer = $timeout(function () {\r\n\t\t\t\t\t\tisDragging = false;\r\n\t\t\t\t\t\tscope.showDragDropOutline = false;\r\n\t\t\t\t\t\tbroadcastStatus();\r\n\t\t\t\t\t}, 100);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t}\n\tdragDropMonitor.$inject = ['$timeout'];\r\n\r\n\tfunction dragDropDropTarget($rootScope, $parse, _, mimeTypeUtility, assetCommonConfig) {\r\n\t\tvar dropEventName = assetCommonConfig.dropEventName;\r\n\r\n\t\tfunction areValidFileTypes(fileTypes, acceptedFileTypes) {\r\n\t\t\tif (!acceptedFileTypes || acceptedFileTypes.length === 0)\r\n\t\t\t\treturn true;\r\n\r\n\t\t\tvar acceptedTypes = _.map(acceptedFileTypes, function(type) {\r\n\t\t\t\treturn mimeTypeUtility.splitMimeType(type);\r\n\t\t\t});\r\n\r\n\t\t\treturn _.all(fileTypes, function (fileType) {\r\n\t\t\t\tvar fileTypeResult = mimeTypeUtility.splitMimeType(fileType);\r\n\t\t\t\treturn _.all(acceptedTypes, function(acceptedType) {\r\n\t\t\t\t\treturn fileTypeResult.type === acceptedType.type && (acceptedType.subType === '*' || acceptedType.subType === fileTypeResult.subType);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\trestrict: 'A',\r\n\t\t\trequire: '^dragDropMonitor',\r\n\t\t\tlink: function (scope, elem, attrs, dragDropController) {\r\n\t\t\t\tvar dataTransferEffect = attrs.datatransferEffect;\r\n\t\t\t\tvar dragOutTimer;\r\n\r\n\t\t\t\tvar callback = attrs.dropAction && $parse(attrs.dropAction);\r\n\r\n\t\t\t\telem.on({\r\n\t\t\t\t\t'dragover dragenter': function (e) {\r\n\t\t\t\t\t\tvar dataTransfer = e.originalEvent.dataTransfer;\r\n\t\t\t\t\t\tvar isAllowed = _.contains(dataTransfer.types, 'Files') && areValidFileTypes(_.pluck(dataTransfer.items, 'type'), attrs.acceptedFiles ? attrs.acceptedFiles.split(',') : null);\r\n\r\n\t\t\t\t\t\tdataTransfer.dropEffect = isAllowed ? dataTransferEffect : 'none';\r\n\r\n\t\t\t\t\t\tif (scope.isDragOver) {\r\n\t\t\t\t\t\t\twindow.clearTimeout(dragOutTimer);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\t\t\tvar over = attrs.over;\r\n\t\t\t\t\t\t\t\tif (over) {\r\n\t\t\t\t\t\t\t\t\tdragDropController.setDragOver(elem, over);\r\n\t\t\t\t\t\t\t\t\tdragDropController.shouldShowDragDropOutline(false);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tdragDropController.setIsDragOverDropTarget(elem, true);\r\n\t\t\t\t\t\t\t\tscope.isDragOver = true;\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tdragOutTimer = window.setTimeout(function () {\r\n\t\t\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\t\t\tscope.isDragOver = false;\r\n\t\t\t\t\t\t\t\tdragDropController.setIsDragOverDropTarget(elem, false);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}, 100);\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'dragleave': function () {\r\n\t\t\t\t\t\tif (attrs.over) {\r\n\t\t\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\t\t\tdragDropController.setDragOver(elem, false);\r\n\t\t\t\t\t\t\t\tdragDropController.shouldShowDragDropOutline(true);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\t\tscope.isDragOver = false;\r\n\t\t\t\t\t\t\tdragDropController.setIsDragOverDropTarget(elem, false);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'drop': function (e) {\r\n\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\t\tvar files = e.originalEvent.dataTransfer.files;\r\n\r\n\t\t\t\t\t\tif (!callback) {\r\n\t\t\t\t\t\t\t$rootScope.$broadcast(dropEventName, { files: files });\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\t\t\tcallback(scope, { files: files });\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tscope.$on(dragStatusEventName, function (event, status) {\r\n\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\tscope.isDragging = status.isDragging;\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t}\n\tdragDropDropTarget.$inject = ['$rootScope', '$parse', '_', 'mimeTypeUtility', 'assetCommonConfig'];\r\n})();","(function() {\n\t'use strict';\n\n\tangular\n\t\t.module('assetCommon')\n\t\t.directive('fileSelect', fileSelect);\n\n\tfunction fileSelect($parse, $rootScope, assetCommonConfig) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\ttransclude: true,\n\t\t\ttemplate: '
',\n\t\t\tlink: function (scope, elem, attrs) {\n\n\t\t\t\telem.find('input').attr('multiple', attrs.multiple);\n\n\t\t\t\t// reading selectAction this way, because when we declare the `scope` property on this directive,\n\t\t\t\t// the new isolate scope blows away the scope of any directly attached controllers\n\t\t\t\tvar callback = attrs.selectAction && $parse(attrs.selectAction);\n\n\t\t\t\telem.on('change', 'input[type=\"file\"]', function () {\n\t\t\t\t\tvar files = this.files;\n\n\t\t\t\t\tif (!callback) {\n\t\t\t\t\t\t// if no callback is specified, broadcast the selected files\n\t\t\t\t\t\t$rootScope.$broadcast(assetCommonConfig.filesSelectedEventName, { files: files });\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tscope.$apply(function () {\n\t\t\t\t\t\t\tcallback(scope, { files: files });\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n\tfileSelect.$inject = ['$parse', '$rootScope', 'assetCommonConfig'];\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tvar DEFAULT_PRIMARY_FILE = {\r\n\t\tname: '(No file)'\r\n\t};\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('assetMapper', assetMapper);\r\n\r\n\tfunction assetMapper(_, assetUtility, uriUtility, formatMapper, userMapper, fileMapper, revisionMapper) {\r\n\t\tfunction getDownloadPathForFile(baseUrl, fileId, revId) {\r\n\t\t\treturn uriUtility.fromPattern(baseUrl + '/files/{fileId}/content', { fileId: fileId, rev: revId });\r\n\t\t}\r\n\r\n\t\tfunction mapAsset(source, assetServiceBaseUri) {\r\n\t\t\tif (!source)\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\tif (_.isArray(source))\r\n\t\t\t\treturn source.map(mapAsset);\r\n\r\n\t\t\tif (!source.file)\r\n\t\t\t\tsource.file = DEFAULT_PRIMARY_FILE;\r\n\r\n\t\t\tvar metadata = source.metadata || {};\r\n\t\t\tvar license = metadata.license || {};\r\n\t\t\tvar creation = source.creation || {};\r\n\t\t\tvar appMetadata = source.appData && source.appData.metadata || {};\r\n\t\t\tvar userMetadata = source.userData && source.userData.metadata || {};\r\n\r\n\t\t\tvar formats = source.formats && source.formats.map(function (format) {\r\n\t\t\t\treturn formatMapper.map(format, source.id, source.revision.id);\r\n\t\t\t});\r\n\r\n\t\t\tvar families = _.map(metadata.families || [], function (familyName) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: familyName,\r\n\t\t\t\t\tdata: _.cloneDeep(metadata[familyName] || {})\r\n\t\t\t\t};\r\n\t\t\t});\r\n\r\n\t\t\treturn {\r\n\t\t\t\tid: source.id,\r\n\t\t\t\tbucket: source.bucket,\r\n\t\t\t\tkind: source.kind,\r\n\t\t\t\ttitle: metadata.title,\r\n\t\t\t\tdescription: metadata.description,\r\n\t\t\t\tdate: metadata.date,\r\n\t\t\t\tlanguage: metadata.language,\r\n\t\t\t\tauthors: metadata.authors,\r\n\t\t\t\theadline: metadata.headline,\r\n\t\t\t\tnote: metadata.note,\r\n\t\t\t\tstatus: metadata.status,\r\n\t\t\t\ttags: metadata.tags,\r\n\t\t\t\tcategories: metadata.categories,\r\n\t\t\t\tcopyright: metadata.copyright,\r\n\t\t\t\tpublisher: metadata.publisher,\r\n\t\t\t\tfamilyMetadata: metadata.familyData,\r\n\t\t\t\tlocation: metadata.location,\r\n\t\t\t\twebStatement: license.webStatement,\r\n\t\t\t\tlicenseTerms: license.usageTerms,\r\n\t\t\t\trights: license.rights,\r\n\t\t\t\tfavorite: userMetadata.favorite,\r\n\t\t\t\tdateCreated: creation.date,\r\n\t\t\t\tuploadId: metadata.uploadId,\r\n\t\t\t\tother: metadata.other,\r\n\t\t\t\tisDeleted: !!source.isDeleted,\r\n\t\t\t\tformats: formats,\r\n\t\t\t\tfamilies: families,\r\n\t\t\t\trating: userMetadata.rating,\r\n\t\t\t\tviews: source.stats && source.stats.views.count,\r\n\t\t\t\tdownloads: source.stats && source.stats.downloads && _.reduce(source.stats.downloads, function (sum, x) {\r\n\t\t\t\t\treturn sum + x.counter.count;\r\n\t\t\t\t}, 0),\r\n\r\n\t\t\t\tget globalRating() { return appMetadata.ratingTotal && appMetadata.ratingCount && (appMetadata.ratingTotal / appMetadata.ratingCount); },\r\n\r\n\t\t\t\tglobalRatingCount: appMetadata.ratingCount || 0,\r\n\t\t\t\tglobalFavoriteCount: appMetadata.favoriteCount || 0,\r\n\r\n\t\t\t\tget baseUrl() { return uriUtility.fromPattern(assetServiceBaseUri + 'assets/{id}', { id: this.id }); },\r\n\t\t\t\tget fileUrl() { return this.file && getDownloadPathForFile(this.baseUrl, this.file.id, this.revision.id); },\r\n\t\t\t\tget sourceUrl() { return this.source && getDownloadPathForFile(this.baseUrl, this.source.id, this.revision.id); },\r\n\r\n\t\t\t\tgetBestThumbnailForSize: function (size) {\r\n\t\t\t\t\treturn assetUtility.getBestThumbnailForSize(this, size, assetServiceBaseUri);\r\n\t\t\t\t},\r\n\t\t\t\tgetBestFormatForSize: function (size) {\r\n\t\t\t\t\treturn assetUtility.getBestFormatForSize(this, size);\r\n\t\t\t\t},\r\n\t\t\t\tgetVideoSourcesForSize: function (size) {\r\n\t\t\t\t\treturn assetUtility.getVideoSourcesForSize(this, size, assetServiceBaseUri);\r\n\t\t\t\t},\r\n\t\t\t\tgetAudioSources: function () {\r\n\t\t\t\t\treturn assetUtility.getAudioSources(this, assetServiceBaseUri);\r\n\t\t\t\t},\r\n\t\t\t\tgetDownloadPathForFile: function (file) {\r\n\t\t\t\t\treturn getDownloadPathForFile(this.baseUrl, file.id, this.revision.id);\r\n\t\t\t\t},\r\n\r\n\t\t\t\tcreator: userMapper.map(creation.agent && creation.agent.user),\r\n\t\t\t\tfile: fileMapper.map(source.file, source.id, source.revision && source.revision.id),\r\n\t\t\t\tsource: fileMapper.map(source.source, source.id, source.revision && source.revision.id),\r\n\t\t\t\trevision: revisionMapper.map(source.revision),\r\n\t\t\t\tboardIds: appMetadata.boardIds\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tmap: mapAsset\r\n\t\t};\r\n\t}\n\tassetMapper.$inject = ['_', 'assetUtility', 'uriUtility', 'formatMapper', 'userMapper', 'fileMapper', 'revisionMapper'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('facetMapper', facetMapper);\r\n\r\n\tfunction facetMapper(_) {\r\n\t\tfunction mapFacet(source) {\r\n\t\t\tif (!source)\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\tif (_.isArray(source))\r\n\t\t\t\treturn source.map(mapFacet);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tname: source.field,\r\n\t\t\t\tterms: source.terms,\r\n\t\t\t\tnone: source.none,\r\n\t\t\t\tother: source.other\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tmap: mapFacet\r\n\t\t};\r\n\t}\n\tfacetMapper.$inject = ['_'];\r\n})();\r\n","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('fileMapper', fileMapper);\r\n\r\n\tfunction fileMapper(_, utility, uriUtility, assetCommonConfig) {\r\n\r\n\t\tfunction computeImageDimensions(file) {\r\n\t\t\tif (!file.metadata)\r\n\t\t\t\treturn null;\r\n\r\n\t\t\tvar image = file.metadata.image;\r\n\t\t\tvar width = image && image.width;\r\n\t\t\tvar height = image && image.height;\r\n\t\t\tif (!(width > 0 && height > 0))\r\n\t\t\t\treturn null;\r\n\r\n\t\t\treturn {\r\n\t\t\t\twidth: width,\r\n\t\t\t\theight: height\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tfunction mapFile(source, assetId, revisionId) {\r\n\t\t\tif (!source)\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\tif (_.isArray(source)) {\r\n\t\t\t\treturn source.map(function (x) {\r\n\t\t\t\t\treturn mapFile(x, assetId, revisionId);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tvar file = {\r\n\t\t\t\tid: source.id,\r\n\t\t\t\tname: source.name,\r\n\t\t\t\tbyteCount: source.byteCount,\r\n\t\t\t\tlastModified: source.lastModified,\r\n\t\t\t\tmediaType: source.mediaType,\r\n\t\t\t\tmetadata: _.omit(source.metadata, 'title', 'authors', 'description', 'headline', 'copyright', 'license', 'workflow', 'contact', 'tags', 'categories', 'location')\r\n\t\t\t};\r\n\r\n\t\t\tutility.defineLazyProperty(file,\r\n\t\t\t\t'dimensions', function () {\r\n\t\t\t\t\treturn computeImageDimensions(this);\r\n\t\t\t\t});\r\n\r\n\t\t\tutility.defineLazyProperty(file,\r\n\t\t\t\t'primaryMetadata', function () {\r\n\t\t\t\t\tif (!this.metadata)\r\n\t\t\t\t\t\treturn null;\r\n\r\n\t\t\t\t\tvar filteredMetadata = _.clone(this.metadata);\r\n\t\t\t\t\tdelete filteredMetadata.lastModified; // moved to file\r\n\t\t\t\t\tdelete filteredMetadata.updated; // not interesting to users\r\n\t\t\t\t\treturn filteredMetadata;\r\n\t\t\t\t});\r\n\r\n\t\t\tutility.defineLazyProperty(file,\r\n\t\t\t\t'url', function () {\r\n\t\t\t\t\tif (!assetId)\r\n\t\t\t\t\t\tthrow new Error('File must be attached to an asset.');\r\n\r\n\t\t\t\t\treturn uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'assets/{assetId}/files/{fileId}/content', { assetId: assetId, fileId: this.id, rev: revisionId });\r\n\t\t\t\t});\r\n\r\n\t\t\treturn file;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tmap: mapFile\r\n\t\t};\r\n\t}\n\tfileMapper.$inject = ['_', 'utility', 'uriUtility', 'assetCommonConfig'];\r\n})();\r\n","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('formatMapper', formatMapper);\r\n\r\n\tfunction formatMapper(_, utility, uriUtility, fileMapper, assetCommonConfig) {\r\n\r\n\t\tfunction mapFormat(source, assetId, revisionId) {\r\n\t\t\tif (!source)\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\tif (_.isArray(source))\r\n\t\t\t\treturn source.map(function (f) { return mapFormat(f, assetId, revisionId); });\r\n\r\n\t\t\treturn {\r\n\t\t\t\tname: source.name,\r\n\t\t\t\tfile: source.file && fileMapper.map(source.file, assetId, revisionId),\r\n\t\t\t\tfiles: source.files && fileMapper.map(source.files, assetId, revisionId),\r\n\t\t\t\tisSystemFormat: source.name && utility.startsWith(source.name, assetCommonConfig.previewFormatPrefix) || source.name === assetCommonConfig.extractedTextFormatName\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tmap: mapFormat\r\n\t\t};\r\n\t}\n\tformatMapper.$inject = ['_', 'utility', 'uriUtility', 'fileMapper', 'assetCommonConfig'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('revisionMapper', revisionMapper);\r\n\r\n\tfunction revisionMapper(_, userMapper) {\r\n\t\tfunction mapRevision(source) {\r\n\t\t\tif (!source)\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\tif (_.isArray(source))\r\n\t\t\t\treturn source.map(mapRevision);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tid: source.id,\r\n\t\t\t\tdate: source.date,\r\n\t\t\t\tchanges: source.changes && source.changes.ops,\r\n\t\t\t\tcreator: userMapper.map(source.agent.user)\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tmap: mapRevision\r\n\t\t};\r\n\t}\n\trevisionMapper.$inject = ['_', 'userMapper'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('shareMapper', shareMapper);\r\n\r\n\tfunction shareMapper(_, uriUtility) {\r\n\t\tfunction mapShare(source) {\r\n\t\t\tif (!source)\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\tif (_.isArray(source))\r\n\t\t\t\treturn source.map(mapShare);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tid: source.id,\r\n\t\t\t\ttoken: source.token,\r\n\t\t\t\tassetId: source.assetId,\r\n\t\t\t\tshareUrl: uriUtility.fromPattern('/shares/{token}', { token: source.token })\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tmap: mapShare\r\n\t\t};\r\n\t}\n\tshareMapper.$inject = ['_', 'uriUtility'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('userMapper', userMapper);\r\n\r\n\tfunction userMapper(_) {\r\n\t\tfunction mapUser(source) {\r\n\t\t\tif (!source)\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\tif (_.isArray(source))\r\n\t\t\t\treturn source.map(mapUser);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tid: source.id,\r\n\t\t\t\ttoken: source.token,\r\n\t\t\t\tname: source.name,\r\n\t\t\t\tavatarUri: source.avatarUri,\r\n\t\t\t\tisAnonymous: source.id === -1\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tfunction mapUserDetails(source) {\r\n\t\t\tif (!source)\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\tif (_.isArray(source))\r\n\t\t\t\treturn source.map(mapUserDetails);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tid: String(source.id),\r\n\t\t\t\ttoken: source.profileToken && source.profileToken.value,\r\n\t\t\t\temail: source.email && source.email.value,\r\n\t\t\t\tname: source.name && source.name.value || source.alias && source.alias.value,\r\n\t\t\t\tavatarUri: source.avatarUrls && source.avatarUrls.value.avatarUrlLarge,\r\n\t\t\t\tabout: source.about && source.about.value,\r\n\t\t\t\torganization: source.organization && source.organization.value,\r\n\t\t\t\ttitle: source.title && source.title.value,\r\n\t\t\t\tisAnonymous: source.id === -1\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tmap: mapUser,\r\n\t\t\tmapDetails: mapUserDetails\r\n\t\t};\r\n\t}\n\tuserMapper.$inject = ['_'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('assetService', assetService);\r\n\r\n\tfunction assetService($http, $q, fileUploadService, bucketService, cancellationService, jobService, promiseUtilityService, _, assetMapper, revisionMapper, shareMapper, facetMapper, dateTimeUtility, utility, uriUtility, httpUtility, assetCommonConfig) {\r\n\t\t\tvar revisionRequestLimit = 1024;\r\n\t\t\tvar mergeWithinMinutes = 5;\r\n\r\n\t\t\tvar assetFieldsToRemove = '(file.(metadata.exiftool,creation),formats.(files.(metadata.exiftool,creation,sha1Hash),ops),revision.changes)';\r\n\t\t\tvar assetFieldFilter = '!' + assetFieldsToRemove;\r\n\t\t\tvar assetsFieldFilter = '!items.' + assetFieldsToRemove;\r\n\t\t\tvar audioVideoFormats = {\r\n\t\t\t\t'audio/mpeg': { audioCodec: 'libmp3lame' },\r\n\t\t\t\t'audio/ogg': { audioCodec: 'libvorbis' },\r\n\t\t\t\t'video/mp4': { audioCodec: 'libfdk_aac', videoCodec: 'libx264' },\r\n\t\t\t\t'video/webm': { audioCodec: 'libvorbis', videoCodec: 'libvpx' }\r\n\t\t\t};\r\n\r\n\t\t\tfunction updateAssetAsync(assetId, collectChanges, cancellationToken, shareToken) {\r\n\t\t\t\tvar ops = [];\r\n\r\n\t\t\t\tfunction updateOriginal(fileId) {\r\n\t\t\t\t\t// clearing original is not supported\r\n\t\t\t\t\tif (!fileId)\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\tops.push({ op: 'setFile', fileId: fileId, update: true });\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction updateSource(fileId) {\r\n\t\t\t\t\tvar op = { op: 'setSource' };\r\n\t\t\t\t\tif (fileId)\r\n\t\t\t\t\t\top.fileId = fileId;\r\n\r\n\t\t\t\t\tops.push(op);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction createFormat(formatOptions) {\r\n\t\t\t\t\tif (formatOptions.asset.kind !== 'image' && formatOptions.asset.kind !== 'audio' && formatOptions.asset.kind !== 'video')\r\n\t\t\t\t\t\tthrow 'Can only create formats for image, audio, or video assets.';\r\n\r\n\t\t\t\t\tvar createFormatOperation = {\r\n\t\t\t\t\t\top: 'createFormat',\r\n\t\t\t\t\t\tname: formatOptions.name,\r\n\t\t\t\t\t\tops: []\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif (formatOptions.format && formatOptions.format !== formatOptions.asset.file.mediaType) {\r\n\t\t\t\t\t\tif (formatOptions.asset.kind === 'video')\r\n\t\t\t\t\t\t\tcreateFormatOperation.ops.push({ op: 'video', codec: audioVideoFormats[formatOptions.format].videoCodec });\r\n\r\n\t\t\t\t\t\tif (formatOptions.asset.kind !== 'image')\r\n\t\t\t\t\t\t\tcreateFormatOperation.ops.push({ op: 'audio', codec: audioVideoFormats[formatOptions.format].audioCodec });\r\n\r\n\t\t\t\t\t\tcreateFormatOperation.ops.push({ op: 'convert', mediaType: formatOptions.format });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (formatOptions.resize && (formatOptions.resize.width || formatOptions.resize.height))\r\n\t\t\t\t\t\tcreateFormatOperation.ops.push({ op: 'resize', width: formatOptions.resize.width, height: formatOptions.resize.height });\r\n\r\n\t\t\t\t\tif (createFormatOperation.ops.length) {\r\n\r\n\t\t\t\t\t\t// add a name operation as the last operation; see http://git/Logos/AssetDesk/blob/master/docs/FileOperations.md\r\n\t\t\t\t\t\tif (formatOptions.fileName)\r\n\t\t\t\t\t\t\tcreateFormatOperation.ops.push({ op: 'setName', value: formatOptions.fileName });\r\n\r\n\t\t\t\t\t\tops.push(createFormatOperation);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction removeFormats(fileIds) {\r\n\t\t\t\t\t(fileIds || [])\r\n\t\t\t\t\t\t.map(function (f) {\r\n\t\t\t\t\t\t\treturn { op: 'removeFormat', fileId: f };\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.forEach(function (op) {\r\n\t\t\t\t\t\t\tops.push(op);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar edit = {\r\n\t\t\t\t\tupdateOriginal: updateOriginal,\r\n\t\t\t\t\tupdateSource: updateSource,\r\n\t\t\t\t\tcreateFormat: createFormat,\r\n\t\t\t\t\tremoveFormats: removeFormats\r\n\t\t\t\t};\r\n\r\n\t\t\t\tcollectChanges(edit);\r\n\r\n\t\t\t\treturn ops.length ?\r\n\t\t\t\t\teditAssetsAsync([assetId], ops, { shouldAwaitCompletion: true, cancellationToken: cancellationToken }, shareToken)\r\n\t\t\t\t\t\t.then(function (results) {\r\n\t\t\t\t\t\t\treturn results[0];\r\n\t\t\t\t\t\t}) : promiseUtilityService.fromResult(null);\r\n\t\t\t}\r\n\r\n\t\t\tfunction createShareAsync(assetId, expirationDate) {\r\n\t\t\t\treturn $http.post(assetCommonConfig.assetServiceBaseUri + 'shares', { assetId: assetId, expires: expirationDate })\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn shareMapper.map(response.data);\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction getShareAssetIdAsync(shareToken) {\r\n\t\t\t\treturn $http.get(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'shares', { token: shareToken }))\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\tif (!response.data.items || response.data.items.length !== 1)\r\n\t\t\t\t\t\t\treturn $q.reject({ status: 'notfound' });\r\n\t\t\t\t\t\treturn response.data.items[0].assetId;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(function () {\r\n\t\t\t\t\t\treturn $q.reject({ status: 'error' });\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction getAssetUri(id, options) {\r\n\t\t\t\toptions = options || {};\r\n\t\t\t\treturn uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'assets/{id}', { id: id, rev: options.revision, share: options.shareToken });\r\n\t\t\t}\r\n\r\n\t\t\tfunction getAssetExifToolAsync(id, fileId, cancellationToken) {\r\n\t\t\t\treturn $http.get(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'assets/{id}/files/{fileId}/exiftool', { id: id, fileId: fileId }, { timeout: cancellationToken }))\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn response.data;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn jobService.awaitBulkJobCompletionAsync([response.id]);\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn jobService.multiGetJobsAsync([response.jobs[0].id]);\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn response.items[0].response.content;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(function (error) {\r\n\t\t\t\t\t\treturn $q.reject({\r\n\t\t\t\t\t\t\tstatus: error.status === 404 ? 'notfound' : 'error'\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction addToFavoritesAsync(assetIds) {\r\n\t\t\t\treturn doSimpleAssetOperationAsync(assetIds, 'addToFavorites');\r\n\t\t\t}\r\n\r\n\t\t\tfunction removeFromFavoritesAsync(assetIds) {\r\n\t\t\t\treturn doSimpleAssetOperationAsync(assetIds, 'removeFromFavorites');\r\n\t\t\t}\r\n\r\n\t\t\tfunction deleteAssetsAsync(assetIds) {\r\n\t\t\t\treturn doSimpleAssetOperationAsync(assetIds, 'deleteAsset');\r\n\t\t\t}\r\n\r\n\t\t\tfunction undeleteAssetsAsync(assetIds) {\r\n\t\t\t\treturn doSimpleAssetOperationAsync(assetIds, 'undeleteAsset');\r\n\t\t\t}\r\n\r\n\t\t\tfunction doSimpleAssetOperationAsync(assetIds, op) {\r\n\t\t\t\treturn editAssetsAsync(assetIds, [{ op: op }], { fireAndForget: true })\r\n\t\t\t\t\t.catch(function (error) {\r\n\t\t\t\t\t\treturn $q.reject({\r\n\t\t\t\t\t\t\tstatus: error.status === 404 ? 'notfound' : 'error'\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction addToBoardAsync(assetIds, boardId, cancellationToken) {\r\n\t\t\t\treturn editAssetsAsync(assetIds, [{ op: 'addToBoard', boardId: boardId }], { cancellationToken: cancellationToken });\r\n\t\t\t}\r\n\r\n\t\t\tfunction removeFromBoardAsync(assetIds, boardId, cancellationToken) {\r\n\t\t\t\treturn editAssetsAsync(assetIds, [{ op: 'removeFromBoard', boardId: boardId }], { cancellationToken: cancellationToken });\r\n\t\t\t}\r\n\r\n\t\t\tfunction getAssetRevisionsUri(id, options) {\r\n\t\t\t\toptions = options || {};\r\n\t\t\t\treturn uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'assets/{id}/revisions', { id: id, limit: options.limit, next: options.next });\r\n\t\t\t}\r\n\r\n\t\t\tfunction getAssetAsync(id, options, cancellationToken) {\r\n\t\t\t\treturn $http.get(uriUtility.fromPattern(getAssetUri(id, options), { fields: assetFieldFilter }), { timeout: cancellationToken })\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn assetMapper.map(response.data, assetCommonConfig.assetServiceBaseUri);\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(function (response) {\r\n\t\t\t\t\t\treturn $q.reject(httpUtility.getErrorReason(response));\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction getAssetsAsync(assetIds, cancellationToken) {\r\n\t\t\t\tvar request = { items: _.map(assetIds, function (id) { return { id: id }; }) };\r\n\t\t\t\treturn $http.post(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'assets/get', { fields: assetsFieldFilter }), request, { timeout: cancellationToken })\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tassets: _.map(response.data.items, function (item) { return assetMapper.map(item, assetCommonConfig.assetServiceBaseUri); })\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(function (response) {\r\n\t\t\t\t\t\treturn $q.reject(httpUtility.getErrorReason(response));\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction getFileLinksForAssetsAsync(assetFileIds, cancellationToken) {\r\n\t\t\t\treturn $http.post(assetCommonConfig.assetServiceBaseUri + 'assets/files/links/get', { items: assetFileIds }, { timeout: cancellationToken })\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn response && response.data && response.data.items;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(function (response) {\r\n\t\t\t\t\t\treturn $q.reject(httpUtility.getErrorReason(response));\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction getRevisionsAsync(id, revisions, next) {\r\n\t\t\t\trevisions = revisions || [];\r\n\t\t\t\treturn $http.get(getAssetRevisionsUri(id, { limit: revisionRequestLimit, next: next }))\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\tvar newerRevision = revisions.length === 0 ? null : revisions[revisions.length - 1];\r\n\t\t\t\t\t\t_.forEach(response.data.items, function (revision) {\r\n\t\t\t\t\t\t\tif (newerRevision && newerRevision.agent && newerRevision.agent.user && revision.agent && revision.agent.user &&\r\n\t\t\t\t\t\t\t\tnewerRevision.date && revision.date &&\r\n\t\t\t\t\t\t\t\tnewerRevision.changes && newerRevision.changes.ops && revision.changes && revision.changes.ops &&\r\n\t\t\t\t\t\t\t\tnewerRevision.agent.user.id === revision.agent.user.id &&\r\n\t\t\t\t\t\t\t\tdateTimeUtility.differenceInSeconds(newerRevision.date, revision.date) <= mergeWithinMinutes * 60) {\r\n\t\t\t\t\t\t\t\t// merge operations of revisions of the same user near the same time\r\n\t\t\t\t\t\t\t\tnewerRevision.changes.ops = revision.changes.ops.concat(newerRevision.changes.ops);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\trevisions.push(revision);\r\n\t\t\t\t\t\t\t\tnewerRevision = revision;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t// get more revisions if necessary\r\n\t\t\t\t\t\tif (response.data.next)\r\n\t\t\t\t\t\t\treturn getRevisionsAsync(id, revisions, response.data.next);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\treturn revisionMapper.map(revisions);\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction searchAssetsAsync(options, cancellationToken) {\r\n\t\t\t\toptions = _.extend({}, options, { bucket: bucketService.getCurrentBucket().id });\r\n\r\n\t\t\t\treturn $http.get(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'assets/search', options), { timeout: cancellationToken })\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\thits: _(response.data.hits).pluck('asset').map(function (item) { return assetMapper.map(item, assetCommonConfig.assetServiceBaseUri); }).value(),\r\n\t\t\t\t\t\t\ttotal: response.data.hitTotal,\r\n\t\t\t\t\t\t\tfacets: facetMapper.map(response.data.facets)\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(function (response) {\r\n\t\t\t\t\t\treturn $q.reject(httpUtility.getErrorReason(response));\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction createAssetAsync(uploadedFile, operations, options) {\r\n\t\t\t\tvar request = {\r\n\t\t\t\t\tbucket: bucketService.getCurrentBucket().id,\r\n\t\t\t\t\tops: operations,\r\n\t\t\t\t\twaitForIndexing: true\r\n\t\t\t\t};\r\n\r\n\t\t\t\treturn $http.post(assetCommonConfig.assetServiceBaseUri + 'assets/create', request, { timeout: options && options.cancellationToken })\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\treturn response.data;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(function () {\r\n\t\t\t\t\t\treturn $q.reject('Error creating asset.');\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction revertAssetToRevisionAsync(assetId, revertTo) {\r\n\t\t\t\treturn editAssetsAsync([assetId], [{ op: 'revertAsset', revisionId: revertTo }], { shouldAwaitCompletion: true });\r\n\t\t\t}\r\n\r\n\t\t\tfunction reportAssetView(assetId, share) {\r\n\t\t\t\treturn $http.post(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'assets/{id}/viewed', { id: assetId, share: share }))\r\n\t\t\t\t\t.then(function () {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(function () { });\r\n\t\t\t}\r\n\r\n\t\t\tfunction reportAssetDownload(assetId, fileId, share) {\r\n\t\t\t\treturn $http.post(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'assets/{id}/files/{fileId}/downloaded', { id: assetId, fileId: fileId, share: share }))\r\n\t\t\t\t\t.then(function () {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(function () { });\r\n\t\t\t}\r\n\r\n\t\t\tvar lastSaveStartDate = null;\r\n\t\t\tvar lastSaveEndDate = null;\r\n\t\t\tfunction getLastSaveDate() {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tlastSaveStartDate: lastSaveStartDate,\r\n\t\t\t\t\tlastSaveEndDate: lastSaveEndDate\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tfunction editAssetsAsync(assetIds, operations, options, shareToken) {\r\n\t\t\t\tlastSaveStartDate = Date.now();\r\n\r\n\t\t\t\toptions = options || {};\r\n\t\t\t\tvar request = {\r\n\t\t\t\t\tassetIds: assetIds,\r\n\t\t\t\t\tops: operations\r\n\t\t\t\t};\r\n\r\n\t\t\t\tvar params = {};\r\n\t\t\t\tif (shareToken)\r\n\t\t\t\t\tparams.share = shareToken;\r\n\r\n\t\t\t\tif (options.fireAndForget)\r\n\t\t\t\t\tparams.fields = '!items';\r\n\t\t\t\telse\r\n\t\t\t\t\tparams.fields = 'items.asset.(id,revision)';\r\n\r\n\t\t\t\treturn $http.post(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'assets/edit', params), request, { timeout: options.cancellationToken })\r\n\t\t\t\t\t.then(function (response) {\r\n\r\n\t\t\t\t\t\tif (options.fireAndForget)\r\n\t\t\t\t\t\t\treturn null;\r\n\r\n\t\t\t\t\t\tif (response.status === 202) {\r\n\t\t\t\t\t\t\tif (options.shouldAwaitCompletion) {\r\n\t\t\t\t\t\t\t\treturn jobService.awaitBulkJobCompletionAsync([response.data.id], {\r\n\t\t\t\t\t\t\t\t\tcancellationToken: options.cancellationToken,\r\n\t\t\t\t\t\t\t\t\tresponseFormatter: function (result) {\r\n\t\t\t\t\t\t\t\t\t\treturn assetMapper.map(result, assetCommonConfig.assetServiceBaseUri);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\treturn response.data;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\treturn response.data.items.map(function (x) { return assetMapper.map(x.asset, assetCommonConfig.assetServiceBaseUri); });\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.finally(function () {\r\n\t\t\t\t\t\tlastSaveEndDate = Date.now();\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\tgetAssetUri: getAssetUri,\r\n\t\t\t\tgetAssetExifToolAsync: getAssetExifToolAsync,\r\n\t\t\t\taddToFavoritesAsync: addToFavoritesAsync,\r\n\t\t\t\tremoveFromFavoritesAsync: removeFromFavoritesAsync,\r\n\t\t\t\taddToBoardAsync: addToBoardAsync,\r\n\t\t\t\tremoveFromBoardAsync: removeFromBoardAsync,\r\n\t\t\t\tgetAssetRevisionsUri: getAssetRevisionsUri,\r\n\t\t\t\tgetAssetAsync: getAssetAsync,\r\n\t\t\t\tgetAssetsAsync: getAssetsAsync,\r\n\t\t\t\tgetFileLinksForAssetsAsync: getFileLinksForAssetsAsync,\r\n\t\t\t\tgetRevisionsAsync: getRevisionsAsync,\r\n\t\t\t\tsearchAssetsAsync: searchAssetsAsync,\r\n\t\t\t\tcreateAssetAsync: createAssetAsync,\r\n\t\t\t\tupdateAssetAsync: updateAssetAsync,\r\n\t\t\t\trevertAssetToRevisionAsync: revertAssetToRevisionAsync,\r\n\t\t\t\tdeleteAssetsAsync: deleteAssetsAsync,\r\n\t\t\t\tundeleteAssetsAsync: undeleteAssetsAsync,\r\n\t\t\t\tcreateShareAsync: createShareAsync,\r\n\t\t\t\tgetShareAssetIdAsync: getShareAssetIdAsync,\r\n\t\t\t\treportAssetView: reportAssetView,\r\n\t\t\t\treportAssetDownload: reportAssetDownload,\r\n\t\t\t\teditAssetsAsync: editAssetsAsync,\r\n\t\t\t\tgetLastSaveDate: getLastSaveDate\r\n\t\t\t};\r\n\t\t}\n\t\tassetService.$inject = ['$http', '$q', 'fileUploadService', 'bucketService', 'cancellationService', 'jobService', 'promiseUtilityService', '_', 'assetMapper', 'revisionMapper', 'shareMapper', 'facetMapper', 'dateTimeUtility', 'utility', 'uriUtility', 'httpUtility', 'assetCommonConfig'];\r\n})();\r\n","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('bucketService', bucketService);\r\n\r\n\tfunction bucketService($http, $q, localSettingsService, _, utility, uriUtility, assetCommonConfig) {\r\n\t\tvar buckets = null;\r\n\t\tvar defaultBucket = { id: 'LogosInternal' };\r\n\t\tvar currentBucket = null;\r\n\r\n\t\tvar setting = localSettingsService.createSettingAccessor('bucket', function () {\r\n\t\t\treturn buckets === null ? defaultBucket : buckets[0] || defaultBucket;\r\n\t\t});\r\n\r\n\t\tfunction mapBucket(bucket) {\r\n\t\t\treturn {\r\n\t\t\t\tid: bucket.id,\r\n\t\t\t\tname: utility.toTitleCase(utility.breakCamelCaseWords(bucket.id).replace(/-/g, ' ')),\r\n\t\t\t\treadPermission: bucket.readPermission,\r\n\t\t\t\twritePermission: bucket.writePermission\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tfunction getCurrentBucket() {\r\n\t\t\tif (currentBucket)\r\n\t\t\t\treturn currentBucket;\r\n\r\n\t\t\tvar savedBucket = setting.get();\r\n\t\t\tcurrentBucket = savedBucket && _.find(buckets, { id: savedBucket.id }) || (buckets && buckets[0]) || defaultBucket;\r\n\t\t\treturn currentBucket;\r\n\t\t}\r\n\r\n\t\tfunction setCurrentBucket(bucket) {\r\n\t\t\tcurrentBucket = _.find(buckets, { id: bucket.id });\r\n\t\t\tsetting.set(currentBucket);\r\n\t\t}\r\n\r\n\t\tvar getBucketsPromise;\r\n\t\tfunction getBucketsAsync() {\r\n\t\t\tif (getBucketsPromise)\r\n\t\t\t\treturn getBucketsPromise;\r\n\r\n\t\t\tgetBucketsPromise = $http.get(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'buckets?limit=100'))\r\n\t\t\t\t.then(function (response) {\r\n\t\t\t\t\tbuckets = response.data.items.map(mapBucket);\r\n\t\t\t\t\treturn buckets;\r\n\t\t\t\t});\r\n\r\n\t\t\treturn getBucketsPromise;\r\n\t\t}\r\n\r\n\t\tfunction getBucketAsync(bucketId, cancellationToken) {\r\n\t\t\treturn $http.get(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'buckets/{id}', { id: bucketId }), { token: cancellationToken })\r\n\t\t\t\t.then(function (response) {\r\n\t\t\t\t\treturn mapBucket(response.data);\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tgetCurrentBucket: getCurrentBucket,\r\n\t\t\tsetCurrentBucket: setCurrentBucket,\r\n\t\t\tgetBucketsAsync: getBucketsAsync,\r\n\t\t\tgetBucketAsync: getBucketAsync\r\n\t\t};\r\n\t}\n\tbucketService.$inject = ['$http', '$q', 'localSettingsService', '_', 'utility', 'uriUtility', 'assetCommonConfig'];\r\n})();\r\n","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('cancellationService', cancellationService);\r\n\r\n\tfunction cancellationService($q, _) {\r\n\t\tfunction createCancellationSource() {\r\n\t\t\tvar deferred = $q.defer();\r\n\t\t\tvar token = deferred.promise;\r\n\t\t\ttoken.isCancelled = false;\r\n\r\n\t\t\ttoken.whenCanceled = function (callback) {\r\n\t\t\t\treturn token.then(callback);\r\n\t\t\t};\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttoken: token,\r\n\t\t\t\tcancel: function () {\r\n\t\t\t\t\tdeferred.resolve();\r\n\t\t\t\t\ttoken.isCancelled = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tfunction withToken(callback, token) {\r\n\t\t\treturn _.partialRight(callback, token);\r\n\t\t}\r\n\r\n\t\tfunction cancelWhenDestroyed(cancellationSource, scope) {\r\n\t\t\tvar unwatch = scope.$on('$destroy', cancellationSource.cancel);\r\n\t\t\treturn unwatch;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcreateCancellationSource: createCancellationSource,\r\n\t\t\twithToken: withToken,\r\n\t\t\tcancelWhenDestroyed: cancelWhenDestroyed\r\n\t\t};\r\n\t}\n\tcancellationService.$inject = ['$q', '_'];\r\n})();","(function() {\n\t'use strict';\n\n\tangular\n\t\t.module('assetCommon')\n\t\t.factory('fileService', fileService);\n\n\tfunction fileService($http, assetCommonConfig, uriUtility) {\n\n\t\tfunction getFileAsync(fileId, cancellationToken) {\n\t\t\treturn $http.get(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'files/{id}', { id: fileId }), { timeout: cancellationToken })\n\t\t\t\t.then(function(response) { return response.data; });\n\t\t}\n\n\t\treturn {\n\t\t\tgetFileAsync: getFileAsync\n\t\t};\n\t}\n\tfileService.$inject = ['$http', 'assetCommonConfig', 'uriUtility'];\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('fileUploadManager', fileUploadManager);\r\n\r\n\tfunction fileUploadManager($q, $log, assetService, fileUploadService, cancellationService, promiseUtilityService, _) {\r\n\t\tvar log = $log.getLogger('fileUploadManager');\r\n\r\n\t\tfunction createProgressTracker() {\r\n\t\t\tvar statusList = ['preparing', 'uploading', 'complete', 'error'];\r\n\t\t\tvar files = {};\r\n\t\t\tvar deferred = $q.defer();\r\n\r\n\t\t\tfunction getFileProgressReport(file) {\r\n\t\t\t\treturn _.clone(file);\r\n\t\t\t}\r\n\r\n\t\t\tfunction getProgressReport() {\r\n\t\t\t\tvar statusGroups = _.groupBy(files, 'status');\r\n\t\t\t\tvar minStatus = _.find(statusList, function (status) { return statusGroups[status] && statusGroups[status].length; });\r\n\t\t\t\tvar fileReports = _.map(files, getFileProgressReport);\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tfiles: fileReports,\r\n\t\t\t\t\tstatus: minStatus\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tvar updateProgressSoon = _.throttle(function () {\r\n\t\t\t\tdeferred.notify(getProgressReport());\r\n\t\t\t}, 100);\r\n\r\n\t\t\treturn {\r\n\t\t\t\taddFile: function (fileId, fileSize) {\r\n\t\t\t\t\tfiles[fileId] = {\r\n\t\t\t\t\t\tid: fileId,\r\n\t\t\t\t\t\tstatus: statusList[0],\r\n\t\t\t\t\t\tfileSize: fileSize,\r\n\t\t\t\t\t\tuploadedSize: 0.0\r\n\t\t\t\t\t};\r\n\t\t\t\t},\r\n\t\t\t\tsetFileStatus: function (fileId, status) {\r\n\t\t\t\t\tvar file = files[fileId];\r\n\t\t\t\t\tfile.status = status;\r\n\r\n\t\t\t\t\tif (status === 'error')\r\n\t\t\t\t\t\tfile.uploadedSize = file.fileSize;\r\n\r\n\t\t\t\t\tupdateProgressSoon();\r\n\t\t\t\t},\r\n\t\t\t\tsetUploadProgress: function (fileId, uploadedSize, fileSize) {\r\n\t\t\t\t\tif (!_.isUndefined(fileSize))\r\n\t\t\t\t\t\tfiles[fileId].fileSize = Math.max(fileSize, 0.01);\r\n\r\n\t\t\t\t\tfiles[fileId].uploadedSize = Math.min(uploadedSize, files[fileId].fileSize);\r\n\r\n\t\t\t\t\tupdateProgressSoon();\r\n\t\t\t\t},\r\n\t\t\t\tmonitorProgress: function () {\r\n\t\t\t\t\treturn deferred.promise;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tfunction createAssetAsync(fileId, uploadedFile, operations, cancellationToken) {\r\n\t\t\treturn assetService.createAssetAsync(uploadedFile, operations, { cancellationToken: cancellationToken });\r\n\t\t}\r\n\r\n\t\tfunction updateAssetAsync(assetId, operations, cancellationToken) {\r\n\t\t\treturn assetService.editAssetsAsync([ assetId ], operations, { cancellationToken: cancellationToken });\r\n\t\t}\r\n\r\n\t\tfunction uploadFilesAndCreateOrUpdateAssetsAsync(files, cancellationToken) {\r\n\t\t\tvar progressTracker = createProgressTracker();\r\n\t\t\tvar deferred = $q.defer();\r\n\t\t\tvar uploads = [];\r\n\t\t\tvar uploadId;\r\n\r\n\t\t\tif (cancellationToken) {\r\n\t\t\t\tcancellationToken.whenCanceled(function () {\r\n\t\t\t\t\tdeferred.reject('abort');\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfileUploadService.getFileBatchUploadIdAsync()\r\n\t\t\t\t.then(function(batchId) {\r\n\t\t\t\t\tvar index = 0;\r\n\t\t\t\t\tuploadId = batchId;\r\n\r\n\t\t\t\t\t// read file size to calculate totals for progress meter\r\n\t\t\t\t\t// async to avoid blocking the UI\r\n\t\t\t\t\treturn promiseUtilityService.forEachAsync(files, function(file) {\r\n\t\t\t\t\t\tvar fileId = index++;\r\n\r\n\t\t\t\t\t\tprogressTracker.addFile(fileId, file.file.size);\r\n\t\t\t\t\t\tprogressTracker.setFileStatus(fileId, 'uploading');\r\n\r\n\t\t\t\t\t\tuploads.push({ id: fileId, file: file.file, operations: file.operations, assetId: file.assetId });\r\n\t\t\t\t\t}, cancellationToken);\r\n\t\t\t\t})\r\n\t\t\t\t.then(function () {\r\n\t\t\t\t\t// upload files and create assets in parallel\r\n\t\t\t\t\treturn promiseUtilityService\r\n\t\t\t\t\t\t.parallelForEach(uploads, { maxDegreeOfParallelism: 2, cancellationToken: cancellationToken }, function (upload) {\r\n\t\t\t\t\t\t\tvar fileId = upload.id;\r\n\t\t\t\t\t\t\tvar file = upload.file;\r\n\t\t\t\t\t\t\tvar assetId = upload.assetId;\r\n\r\n\t\t\t\t\t\t\tlog.info('Uploading file ' + fileId);\r\n\r\n\t\t\t\t\t\t\t// upload file\r\n\t\t\t\t\t\t\treturn fileUploadService.uploadFileAsync(file, cancellationToken)\r\n\t\t\t\t\t\t\t\t.then(function (uploadedFile) {\r\n\t\t\t\t\t\t\t\t\t\tvar operations = upload.operations;\r\n\t\t\t\t\t\t\t\t\t\toperations.unshift({ op: 'setFile', fileId: uploadedFile.id, update: true });\r\n\t\t\t\t\t\t\t\t\t\toperations.push({ op: 'setMetadata', path: 'uploadId', value: uploadId });\r\n\r\n\t\t\t\t\t\t\t\t\t\tif (assetId) {\r\n\t\t\t\t\t\t\t\t\t\t\t// update asset\r\n\t\t\t\t\t\t\t\t\t\t\tlog.info('Updating asset for file ' + fileId);\r\n\t\t\t\t\t\t\t\t\t\t\treturn updateAssetAsync(assetId, operations, cancellationToken);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\t\t\t// create asset\r\n\t\t\t\t\t\t\t\t\t\t\tlog.info('Creating asset for file ' + fileId);\r\n\t\t\t\t\t\t\t\t\t\t\treturn createAssetAsync(fileId, uploadedFile, operations, cancellationToken);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\tfunction (fileUploadProgress) {\r\n\t\t\t\t\t\t\t\t\t\tprogressTracker.setUploadProgress(fileId, fileUploadProgress.loaded, fileUploadProgress.total);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t.then(function(job) {\r\n\t\t\t\t\t\t\t\t\t// report file completed\r\n\t\t\t\t\t\t\t\t\tprogressTracker.setUploadProgress(fileId, file.size, file.size);\r\n\t\t\t\t\t\t\t\t\tprogressTracker.setFileStatus(fileId, 'complete');\r\n\t\t\t\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\t\t\t\tjob: job,\r\n\t\t\t\t\t\t\t\t\t\tfile: file\r\n\t\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.catch(function (error) {\r\n\t\t\t\t\t\t\t\t\t// report file error\r\n\t\t\t\t\t\t\t\t\tlog.warn('Error uploading file ' + fileId + ': ' + error);\r\n\t\t\t\t\t\t\t\t\tprogressTracker.setFileStatus(fileId, 'error');\r\n\t\t\t\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\t\t\t\terror: error || 'unknown error',\r\n\t\t\t\t\t\t\t\t\t\tfile: file\r\n\t\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}, cancellationToken);\r\n\t\t\t\t})\r\n\t\t\t\t.then(function (result) {\r\n\t\t\t\t\t// upload batch complete\r\n\t\t\t\t\tlog.info('Batch upload complete.');\r\n\t\t\t\t\tdeferred.resolve({\r\n\t\t\t\t\t\tjobs: result,\r\n\t\t\t\t\t\tbatchId: uploadId\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\r\n\t\t\tprogressTracker.monitorProgress()\r\n\t\t\t\t.then(null, null, function (progress) {\r\n\t\t\t\t\tdeferred.notify(progress);\r\n\t\t\t\t});\r\n\r\n\t\t\treturn deferred.promise;\r\n\t\t}\r\n\r\n\t\tfunction uploadFilesAndCreateAssetsAsync(files, cancellationToken) {\r\n\t\t\treturn uploadFilesAndCreateOrUpdateAssetsAsync(files, cancellationToken);\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tuploadFilesAndCreateAssetsAsync: uploadFilesAndCreateAssetsAsync,\r\n\t\t\tuploadFilesAndCreateOrUpdateAssetsAsync: uploadFilesAndCreateOrUpdateAssetsAsync\r\n\t\t};\r\n\t}\n\tfileUploadManager.$inject = ['$q', '$log', 'assetService', 'fileUploadService', 'cancellationService', 'promiseUtilityService', '_'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('fileUploadService', fileUploadService);\r\n\r\n\tfunction fileUploadService($q, $http, $rootScope, $timeout, _, $, fileMapper, dateTimeUtility, assetCommonConfig) {\r\n\r\n\t\tfunction uploadFileAsync(file, cancellationToken) {\r\n\t\t\tvar deferred = $q.defer();\r\n\r\n\t\t\tvar form = new FormData();\r\n\t\t\tform.append('file', file);\r\n\t\t\tform.append('lastModified', dateTimeUtility.toIso8601(file.lastModifiedDate));\r\n\r\n\t\t\tvar updateProgressSoon = _.throttle(function (e) {\r\n\t\t\t\tif (e.lengthComputable)\r\n\t\t\t\t\tdeferred.notify({ loaded: e.loaded, total: e.total });\r\n\t\t\t}, 50);\r\n\r\n\t\t\t// Angular's $http service makes it difficult to use FormData and progress events\r\n\t\t\tvar jqXhr = $.ajax({\r\n\t\t\t\turl: assetCommonConfig.assetServiceBaseUri + 'files',\r\n\t\t\t\ttype: 'POST',\r\n\t\t\t\tprocessData: false,\r\n\t\t\t\tcontentType: false,\r\n\t\t\t\tdata: form,\r\n\t\t\t\txhr: function () {\r\n\t\t\t\t\tvar xhr = $.ajaxSettings.xhr();\r\n\t\t\t\t\tif (xhr.upload)\r\n\t\t\t\t\t\txhr.upload.addEventListener('progress', updateProgressSoon, false);\r\n\r\n\t\t\t\t\treturn xhr;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.success(function (result) {\r\n\t\t\t\tdeferred.resolve(fileMapper.map(result));\r\n\t\t\t})\r\n\t\t\t.error(function (jqXhr, status, error) {\r\n\t\t\t\tdeferred.reject(error);\r\n\t\t\t})\r\n\t\t\t.complete(function () {\r\n\t\t\t\t$rootScope.$digest();\r\n\t\t\t});\r\n\r\n\t\t\tif (cancellationToken) {\r\n\t\t\t\tcancellationToken.whenCanceled(function () {\r\n\t\t\t\t\t$timeout(function () {\r\n\t\t\t\t\t\tjqXhr.abort();\r\n\t\t\t\t\t}, 0, false);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn deferred.promise;\r\n\t\t}\r\n\r\n\t\tfunction getFileBatchUploadIdAsync() {\r\n\t\t\treturn $http.get(assetCommonConfig.assetServiceBaseUri + 'newids?count=1')\r\n\t\t\t\t.then(function (result) {\r\n\t\t\t\t\treturn result.data.ids[0];\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn Object.freeze({\r\n\t\t\tuploadFileAsync: uploadFileAsync,\r\n\t\t\tgetFileBatchUploadIdAsync: getFileBatchUploadIdAsync\r\n\t\t});\r\n\t}\n\tfileUploadService.$inject = ['$q', '$http', '$rootScope', '$timeout', '_', '$', 'fileMapper', 'dateTimeUtility', 'assetCommonConfig'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('jobService', jobService);\r\n\r\n\tfunction jobService($http, $q, $timeout, $log, _, uriUtility, httpUtility, assetCommonConfig, cancellationService, EventEmitter) {\r\n\t\tvar jobCompletionPollIntervalSteps = [500, 1000, 5000];\r\n\t\tvar requestsPerStep = 10;\r\n\t\tvar waitingCount = 0;\r\n\t\tvar jobChangeCancellationSource;\r\n\t\tvar jobChangeEventName = 'job.change';\r\n\t\tvar events = new EventEmitter({\r\n\t\t\twildcard: false\r\n\t\t});\r\n\r\n\t\tfunction beginWaitingForJob() {\r\n\t\t\twaitingCount++;\r\n\t\t\treturn {\r\n\t\t\t\tendWaitingForJob: function () {\r\n\t\t\t\t\twaitingCount--;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tfunction isJobComplete(job) {\r\n\t\t\treturn !!job.finished;\r\n\t\t}\r\n\r\n\t\tfunction awaitBulkJobCompletionAsync(jobIds, options) {\r\n\t\t\t// return promise that\r\n\t\t\t// -- resolves when all jobs complete successfully\r\n\t\t\t// -- rejects when all jobs complete, not all successfully\r\n\t\t\t// -- progress when any job changes status\r\n\r\n\t\t\toptions = options || {};\r\n\r\n\t\t\tvar pollingIntervalStep = 0;\r\n\t\t\tvar intervalRequestCount = 0;\r\n\t\t\tvar pollingInterval;\r\n\r\n\t\t\tfunction updateInterval() {\r\n\t\t\t\tif (intervalRequestCount >= requestsPerStep && pollingIntervalStep < jobCompletionPollIntervalSteps.length - 1) {\r\n\t\t\t\t\tpollingIntervalStep++;\r\n\t\t\t\t\tintervalRequestCount = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpollingInterval = jobCompletionPollIntervalSteps[pollingIntervalStep];\r\n\t\t\t\tintervalRequestCount++;\r\n\t\t\t}\r\n\r\n\t\t\tvar jobStatuses = jobIds.reduce(function (acc, jobId) {\r\n\t\t\t\tacc[jobId] = { id: jobId, status: null };\r\n\t\t\t\treturn acc;\r\n\t\t\t}, {});\r\n\r\n\t\t\tvar deferred = $q.defer();\r\n\t\t\tvar waiting = beginWaitingForJob();\r\n\r\n\t\t\t(function awaitJobCompletionAsyncCore(jobIds, options) {\r\n\t\t\t\treturn multiGetJobsAsync(jobIds, { cancellationToken: options.cancellationToken, shouldIncludeFullResponse: options.shouldIncludeFullResponse || options.responseFormatter })\r\n\t\t\t\t\t.then(function (response) {\r\n\t\t\t\t\t\tvar remainingJobIds = [];\r\n\r\n\t\t\t\t\t\tvar changedJobs = [];\r\n\r\n\t\t\t\t\t\tresponse.items.forEach(function (job) {\r\n\t\t\t\t\t\t\tvar isJobPending = !isJobComplete(job);\r\n\t\t\t\t\t\t\tif (jobStatuses[job.id].status !== job.status && !isJobPending)\r\n\t\t\t\t\t\t\t\tchangedJobs.push(job.id);\r\n\r\n\t\t\t\t\t\t\tvar jobStatus = (options.shouldIncludeFullResponse || options.responseFormatter) ? job : _.pick(job, ['id', 'status']);\r\n\t\t\t\t\t\t\tif (options.responseFormatter && jobStatus.response && jobStatus.response.content)\r\n\t\t\t\t\t\t\t\tjobStatus.response.content = options.responseFormatter(jobStatus.response.content);\r\n\r\n\t\t\t\t\t\t\tjobStatuses[job.id] = jobStatus;\r\n\t\t\t\t\t\t\tif (isJobPending)\r\n\t\t\t\t\t\t\t\tremainingJobIds.push(job.id);\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tif (changedJobs.length)\r\n\t\t\t\t\t\t\tdeferred.notify({ updatedJobs: changedJobs.map(function (id) { return jobStatuses[id]; }) });\r\n\r\n\t\t\t\t\t\tif (remainingJobIds.length) {\r\n\t\t\t\t\t\t\tupdateInterval();\r\n\r\n\t\t\t\t\t\t\treturn $timeout(function () {\r\n\t\t\t\t\t\t\t\treturn awaitJobCompletionAsyncCore(remainingJobIds, options);\r\n\t\t\t\t\t\t\t}, pollingInterval, false);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\t\tjobs: _.values(jobStatuses)\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t})(jobIds, options)\r\n\t\t\t\t.then(function (result) {\r\n\t\t\t\t\tif (!_.any(result.jobs, { status: 'failed' }))\r\n\t\t\t\t\t\tdeferred.resolve(result);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tdeferred.reject(result);\r\n\t\t\t\t})\r\n\t\t\t\t.catch(function (response) {\r\n\t\t\t\t\tdeferred.reject(httpUtility.getErrorReason(response));\r\n\t\t\t\t})\r\n\t\t\t\t.finally(waiting.endWaitingForJob);\r\n\r\n\t\t\treturn deferred.promise;\r\n\t\t}\r\n\r\n\t\tfunction multiGetJobsAsync(jobIds, options) {\r\n\t\t\toptions = options || {};\r\n\r\n\t\t\tvar request = {\r\n\t\t\t\titems: _.map(jobIds, function (id) { return { id: id }; })\r\n\t\t\t};\r\n\r\n\t\t\treturn $http.post(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'jobs/get', { fields: '!items.request' }), request, { timeout: options.cancellationToken })\r\n\t\t\t\t.then(function (response) {\r\n\t\t\t\t\treturn response.data;\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction cancelJobAsync(jobId, runnerId) {\r\n\t\t\treturn $http.post(assetCommonConfig.assetServiceBaseUri + uriUtility.fromPattern('jobs/{id}/cancel', { id: jobId, runner: runnerId }), null);\r\n\t\t}\r\n\r\n\t\tfunction restartJobAsync(jobId, runnerId) {\r\n\t\t\treturn $http.post(assetCommonConfig.assetServiceBaseUri + uriUtility.fromPattern('jobs/{id}/restart', { id: jobId, runner: runnerId }), null);\r\n\t\t}\r\n\r\n\t\tfunction adminGetJobServerStatusAsync(cancellationToken) {\r\n\t\t\treturn $q.all({\r\n\t\t\t\tservice: $http.get(assetCommonConfig.assetServiceBaseUri + 'jobs/service', { timeout: cancellationToken }),\r\n\t\t\t\tservers: $http.get(assetCommonConfig.assetServiceBaseUri + 'jobs/servers?status=paused,running&limit=100', { timeout: cancellationToken })\r\n\t\t\t})\r\n\t\t\t.then(function (responses) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tservice: responses.service.data,\r\n\t\t\t\t\tservers: responses.servers.data.items\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction adminGetJobsAsync(status, cancellationToken) {\r\n\t\t\tvar params = {\r\n\t\t\t\tstatus: _.isArray(status) ? status.join(',') : status,\r\n\t\t\t\tlimit: 100,\r\n\t\t\t\tfields: 'items.(id,bucketId,status,agent,created,started,serverId,runnerId,request.content.(assetIds,ops.op))'\r\n\t\t\t};\r\n\r\n\t\t\treturn $http.get(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'jobs/', params), { timeout: cancellationToken })\r\n\t\t\t\t.then(function (response) {\r\n\t\t\t\t\treturn response.data;\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction adminGetJobUri(jobId) {\r\n\t\t\treturn uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'jobs/{id}', { id: jobId });\r\n\t\t}\r\n\r\n\t\tfunction adminStartJobServerAsync(serverId) {\r\n\t\t\treturn $http.post(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'jobs/servers/{id}/start', { id: serverId }), null);\r\n\t\t}\r\n\r\n\t\tfunction adminPauseJobServerAsync(serverId) {\r\n\t\t\treturn $http.post(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'jobs/servers/{id}/pause', { id: serverId }), null);\r\n\t\t}\r\n\r\n\t\tfunction adminStopJobServerAsync(serverId) {\r\n\t\t\treturn $http.post(uriUtility.fromPattern(assetCommonConfig.assetServiceBaseUri + 'jobs/servers/{id}/stop', { id: serverId }), null);\r\n\t\t}\r\n\r\n\t\tfunction adminStartJobServiceAsync() {\r\n\t\t\treturn $http.post(assetCommonConfig.assetServiceBaseUri + 'jobs/service/start', null);\r\n\t\t}\r\n\r\n\t\tfunction adminPauseJobServiceAsync() {\r\n\t\t\treturn $http.post(assetCommonConfig.assetServiceBaseUri + 'jobs/service/pause', null);\r\n\t\t}\r\n\r\n\t\tfunction addStatusChangedHandler(options, handler) {\r\n\t\t\tevents.addListener(jobChangeEventName, handler);\r\n\r\n\t\t\t// create connection only when there is a client listening\r\n\t\t\tif (!jobChangeCancellationSource || jobChangeCancellationSource.token.isCancelled) {\r\n\t\t\t\tjobChangeCancellationSource = cancellationService.createCancellationSource();\r\n\t\t\t\tcreateJobChangeWsConnection(options, jobChangeCancellationSource.token);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction removeStatusChangedHandler(handler) {\r\n\t\t\tevents.removeListener(jobChangeEventName, handler);\r\n\r\n\t\t\t// close connection if no client is listening\r\n\t\t\tif (jobChangeCancellationSource && events.listenersAny(jobChangeEventName).length === 0) {\r\n\t\t\t\tjobChangeCancellationSource.cancel();\r\n\t\t\t\tjobChangeCancellationSource = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction createJobChangeWsConnection(options, cancellationToken) {\r\n\t\t\tvar params = {\r\n\t\t\t\tstatus: options.status || 'Pending,Running',\r\n\t\t\t\tlimit: options.limit || 25,\r\n\t\t\t\tfields: options.fields || 'items.(id,bucketId,status,agent,created,started,finished,request.content.(ops),response.content.(id,metadata,file,kind))'\r\n\t\t\t};\r\n\r\n\t\t\treturn $http.post(uriUtility.fromPattern('/proxy/websockets/files/v1/jobs/me', params), null)\r\n\t\t\t\t.then(function(response) {\r\n\t\t\t\t\tvar jobChangeWSConnection = new WebSocket(response.data.url);\r\n\t\t\t\t\tjobChangeWSConnection.onopen = function() {\r\n\t\t\t\t\t\t$log.info('Job WebSocket connection opened!');\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tjobChangeWSConnection.onmessage = function(event) {\r\n\t\t\t\t\t\tvar data = JSON.parse(event.data);\r\n\t\t\t\t\t\t$log.info('Job WebSocket message recieved!');\r\n\t\t\t\t\t\tevents.emit(jobChangeEventName, data.items ? data.items : [data]);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tjobChangeWSConnection.onclose = function(event) {\r\n\t\t\t\t\t\t$log.info('Job WebSocket connection closed!');\r\n\t\t\t\t\t\t$log.log(event);\r\n\r\n\t\t\t\t\t\treconnect(options, cancellationToken);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tcancellationToken.whenCanceled(function() {\r\n\t\t\t\t\t\tjobChangeWSConnection.close();\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction reconnect(options, cancellationToken) {\r\n\t\t\t// if connection was not cancelled, attempt to reconnect after 3 seconds.\r\n\t\t\tif (cancellationToken.isCancelled)\r\n\t\t\t\treturn;\r\n\r\n\t\t\t$timeout(function() {\r\n\t\t\t\t$log.info('Job WebSocket connection reconnecting in 3 seconds!');\r\n\t\t\t\tcreateJobChangeWsConnection(options, cancellationToken);\r\n\t\t\t}, 3000, false);\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tawaitBulkJobCompletionAsync: awaitBulkJobCompletionAsync,\r\n\t\t\tmultiGetJobsAsync: multiGetJobsAsync,\r\n\t\t\tget isAwaiting() {\r\n\t\t\t\treturn !!waitingCount;\r\n\t\t\t},\r\n\t\t\tcancelJobAsync: cancelJobAsync,\r\n\t\t\trestartJobAsync: restartJobAsync,\r\n\t\t\tadminGetJobServerStatusAsync: adminGetJobServerStatusAsync,\r\n\t\t\tadminGetJobsAsync: adminGetJobsAsync,\r\n\t\t\tadminGetJobUri: adminGetJobUri,\r\n\t\t\tadminStartJobServerAsync: adminStartJobServerAsync,\r\n\t\t\tadminPauseJobServerAsync: adminPauseJobServerAsync,\r\n\t\t\tadminStopJobServerAsync: adminStopJobServerAsync,\r\n\t\t\tadminStartJobServiceAsync: adminStartJobServiceAsync,\r\n\t\t\tadminPauseJobServiceAsync: adminPauseJobServiceAsync,\r\n\t\t\taddStatusChangedHandler: addStatusChangedHandler,\r\n\t\t\tremoveStatusChangedHandler: removeStatusChangedHandler\r\n\t\t};\r\n\t}\n\tjobService.$inject = ['$http', '$q', '$timeout', '$log', '_', 'uriUtility', 'httpUtility', 'assetCommonConfig', 'cancellationService', 'EventEmitter'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('localSettingsService', localSettingsService);\r\n\r\n\tfunction localSettingsService($log) {\r\n\t\tvar storage;\r\n\r\n\t\tfunction isStorageSupported(storage) {\r\n\t\t\tvar key = 'storage_test';\r\n\t\t\ttry {\r\n\t\t\t\twindow[storage].setItem(key, key);\r\n\t\t\t\twindow[storage].removeItem(key);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tcatch (e) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// We assign `storage` this way to avoid \"Access Denied\" errors in newer IEs.\r\n\t\tif (isStorageSupported('localStorage')) {\r\n\t\t\tstorage = localStorage;\r\n\t\t}\r\n\t\telse if (isStorageSupported('sessionStorage')) {\r\n\t\t\t$log.warn('Local settings will only persist through a refresh due to lack of localStorage support.');\r\n\t\t\tstorage = sessionStorage;\r\n\t\t}\r\n\t\telse {\r\n\t\t\t$log.warn('Local settings will not persist due to lack of localStorage support.');\r\n\t\t\tstorage = (function () {\r\n\t\t\t\tvar db = {};\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tgetItem: function getItem(key) { return db[key]; },\r\n\t\t\t\t\tsetItem: function setItem(key, value) { db[key] = value; }\r\n\t\t\t\t};\r\n\t\t\t}());\r\n\t\t}\r\n\r\n\t\tvar api = {\r\n\t\t\tget: function (key) {\r\n\t\t\t\tvar value = storage.getItem(key);\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn JSON.parse(value);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (e) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tset: function (key, value) {\r\n\t\t\t\tstorage.setItem(key, JSON.stringify(value));\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tapi.createSettingAccessor = function (settingName, defaultValue) {\r\n\t\t\tvar hasRead = false;\r\n\t\t\tvar setting;\r\n\t\t\treturn {\r\n\t\t\t\tget: function () {\r\n\t\t\t\t\tif (!hasRead) {\r\n\t\t\t\t\t\tsetting = api.get(settingName);\r\n\t\t\t\t\t\tif (setting === null)\r\n\t\t\t\t\t\t\tsetting = typeof defaultValue === 'function' ? defaultValue() : defaultValue;\r\n\r\n\t\t\t\t\t\thasRead = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn setting;\r\n\t\t\t\t},\r\n\t\t\t\tset: function (value) {\r\n\t\t\t\t\tsetting = value;\r\n\t\t\t\t\tapi.set(settingName, value);\r\n\t\t\t\t\thasRead = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\treturn api;\r\n\t}\n\tlocalSettingsService.$inject = ['$log'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('logBuffer', logBuffer);\r\n\r\n\tfunction logBuffer(_, assetCommonConfig) {\r\n\t\tvar bufferSize = assetCommonConfig.logBufferSize;\r\n\t\tvar logs = [];\r\n\r\n\t\treturn {\r\n\t\t\tgetRecentLogs: function () {\r\n\t\t\t\treturn logs;\r\n\t\t\t},\r\n\t\t\taddLog: function (level, data) {\r\n\t\t\t\tif (level === 'debug')\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\tvar obj = {};\r\n\t\t\t\tobj[level] = _.isArray(data) ? data[0] : data;\r\n\r\n\t\t\t\tlogs.push(obj);\r\n\r\n\t\t\t\tif (logs.length > bufferSize)\r\n\t\t\t\t\tlogs.splice(-bufferSize, logs.length - bufferSize);\r\n\t\t\t}\r\n\t\t};\r\n\t}\n\tlogBuffer.$inject = ['_', 'assetCommonConfig'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('promiseUtilityService', promiseUtilityService);\r\n\r\n\tfunction promiseUtilityService($q, $timeout, _) {\r\n\t\tfunction fromResult(result) {\r\n\t\t\tvar deferred = $q.defer();\r\n\t\t\tdeferred.resolve(result);\r\n\t\t\treturn deferred.promise;\r\n\t\t}\r\n\r\n\t\tfunction rejectWith(result) {\r\n\t\t\tvar deferred = $q.defer();\r\n\t\t\tdeferred.reject(result);\r\n\t\t\treturn deferred.promise;\r\n\t\t}\r\n\r\n\t\tfunction forEachAsync(collection, callback, cancellationToken) {\r\n\t\t\tcollection = _.toArray(collection);\r\n\t\t\tvar deferred = $q.defer();\r\n\t\t\tvar timer;\r\n\t\t\tvar index = 0;\r\n\r\n\t\t\tif (cancellationToken) {\r\n\t\t\t\tcancellationToken.whenCanceled(function () {\r\n\t\t\t\t\t$timeout.cancel(timer);\r\n\t\t\t\t\tdeferred.reject();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction processItemSoon() {\r\n\t\t\t\ttimer = $timeout(processItem, 0, false);\r\n\t\t\t}\r\n\r\n\t\t\tfunction processItem() {\r\n\t\t\t\tif (!collection.length) {\r\n\t\t\t\t\tdeferred.resolve();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (callback(collection.pop(), index++) === false)\r\n\t\t\t\t\tdeferred.resolve();\r\n\t\t\t\telse\r\n\t\t\t\t\tprocessItemSoon();\r\n\t\t\t}\r\n\r\n\t\t\tprocessItemSoon();\r\n\t\t\treturn deferred.promise;\r\n\t\t}\r\n\r\n\t\tfunction parallelForEach(source, parallelOptions, callback) {\r\n\t\t\tvar deferred = $q.defer();\r\n\t\t\tvar promises = [];\r\n\r\n\t\t\tfunction continueWork(count) {\r\n\t\t\t\tif (!source.length) {\r\n\t\t\t\t\t$q.all(promises)\r\n\t\t\t\t\t\t.then(function (result) {\r\n\t\t\t\t\t\t\tdeferred.resolve(result);\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.catch(function (reason) {\r\n\t\t\t\t\t\t\tdeferred.reject(reason);\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (parallelOptions.cancellationToken && parallelOptions.cancellationToken.isCancelled) {\r\n\t\t\t\t\tdeferred.reject('cancelled');\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_.first(source, count).forEach(function (f) {\r\n\t\t\t\t\tpromises.push(\r\n\t\t\t\t\t\t$q.when(callback(f))\r\n\t\t\t\t\t\t\t.finally(function () {\r\n\t\t\t\t\t\t\t\tcontinueWork(1);\r\n\t\t\t\t\t\t\t}));\r\n\t\t\t\t});\r\n\r\n\t\t\t\tsource = _.drop(source, count);\r\n\t\t\t}\r\n\r\n\t\t\tcontinueWork(parallelOptions.maxDegreeOfParallelism);\r\n\r\n\t\t\treturn deferred.promise;\r\n\t\t}\r\n\r\n\t\tfunction any(promises) {\r\n\t\t\tpromises = _.compact(_.isArray(promises) ? promises : _.toArray(arguments));\r\n\t\t\tif (!promises.length)\r\n\t\t\t\treturn fromResult(null);\r\n\r\n\t\t\tvar deferred = $q.defer();\r\n\r\n\t\t\tpromises.forEach(function(promise) {\r\n\t\t\t\tpromise.then(deferred.resolve);\r\n\t\t\t});\r\n\r\n\t\t\treturn deferred.promise;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tfromResult: fromResult,\r\n\t\t\trejectWith: rejectWith,\r\n\t\t\tforEachAsync: forEachAsync,\r\n\t\t\tparallelForEach: parallelForEach,\r\n\t\t\tany: any\r\n\t\t};\r\n\t}\n\tpromiseUtilityService.$inject = ['$q', '$timeout', '_'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('tooltipService', tooltipService);\r\n\r\n\tfunction tooltipService($q, $timeout, $document, $animate, _, $) {\r\n\t\tvar defaults = {\r\n\t\t\ttooltipDisplayDelay: 300,\r\n\t\t\ttooltipHideDelay: 100,\r\n\t\t\ttooltipFadeDuration: 200,\r\n\t\t\ttooltipOffset: 0,\r\n\t\t\tonDestroy: function () { }\r\n\t\t};\r\n\r\n\t\tvar body = $document.find('body');\r\n\t\tfunction createTooltip(elem, initializeTooltip, options) {\r\n\t\t\tvar mouseEnterPromise;\r\n\t\t\tvar mouseLeavePromise;\r\n\t\t\tvar tooltip = null;\r\n\t\t\tvar tooltipInitializationAborter;\r\n\r\n\t\t\toptions = _.extend({}, defaults, options);\r\n\r\n\t\t\tfunction beginShowTooltip(onShow) {\r\n\t\t\t\t$timeout.cancel(mouseLeavePromise);\r\n\t\t\t\tmouseEnterPromise = $timeout(function () {\r\n\t\t\t\t\tif (!tooltip) {\r\n\t\t\t\t\t\ttooltipInitializationAborter = $q.defer();\r\n\r\n\t\t\t\t\t\tinitializeTooltip(tooltipInitializationAborter.promise)\r\n\t\t\t\t\t\t\t.then(function (tooltipElem) {\r\n\t\t\t\t\t\t\t\ttooltipInitializationAborter = null;\r\n\t\t\t\t\t\t\t\tif (!tooltipElem)\r\n\t\t\t\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t\t\t\ttooltip = tooltipElem;\r\n\t\t\t\t\t\t\t\tshowTooltip();\r\n\r\n\t\t\t\t\t\t\t\tif (onShow)\r\n\t\t\t\t\t\t\t\t\tonShow();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tshowTooltip();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}, options.tooltipDisplayDelay, false);\r\n\t\t\t}\r\n\r\n\t\t\tfunction beginHideTooltip() {\r\n\t\t\t\t$timeout.cancel(mouseEnterPromise);\r\n\t\t\t\tmouseLeavePromise = $timeout(hideTooltip, options.tooltipHideDelay);\r\n\t\t\t}\r\n\r\n\t\t\tfunction showTooltip() {\r\n\t\t\t\tif (!tooltip)\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t$animate.enter(tooltip, body, $(body[0].lastChild));\r\n\r\n\t\t\t\treposition();\r\n\t\t\t}\r\n\r\n\t\t\tfunction destroyTooltip() {\r\n\t\t\t\tif (tooltip) {\r\n\t\t\t\t\toptions.onDestroy(tooltip);\r\n\t\t\t\t\ttooltip.remove();\r\n\t\t\t\t\ttooltip = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfunction hideTooltip() {\r\n\t\t\t\tif (tooltipInitializationAborter)\r\n\t\t\t\t\ttooltipInitializationAborter.resolve();\r\n\t\t\t\tif (tooltip)\r\n\t\t\t\t\t$animate.leave(tooltip).then(function() { destroyTooltip(); });\r\n\t\t\t}\r\n\r\n\t\t\tfunction destroy() {\r\n\t\t\t\t$timeout.cancel(mouseEnterPromise);\r\n\t\t\t\t$timeout.cancel(mouseLeavePromise);\r\n\t\t\t\tdestroyTooltip();\r\n\t\t\t}\r\n\r\n\t\t\tfunction reposition() {\r\n\t\t\t\tif (!tooltip)\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\tvar opts = {\r\n\t\t\t\t\tmy: 'left+' + (17 + options.tooltipOffset) + ' center',\r\n\t\t\t\t\tat: 'right center',\r\n\t\t\t\t\tof: elem,\r\n\t\t\t\t\twithin: options.container,\r\n\t\t\t\t\tcollision: 'flip fit',\r\n\t\t\t\t\tusing: function (position, feedback) {\r\n\t\t\t\t\t\t$(this)\r\n\t\t\t\t\t\t\t// remember whether the tooltip is flipped so that we can show the arrow on the correct side\r\n\t\t\t\t\t\t\t.toggleClass('tooltip-arrow-right', feedback.horizontal === 'right')\r\n\t\t\t\t\t\t\t.css(position);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t$timeout(function () {\r\n\t\t\t\t\tif (tooltip)\r\n\t\t\t\t\t\ttooltip.position(opts);\r\n\t\t\t\t}, 0, false);\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\tbeginShow: beginShowTooltip,\r\n\t\t\t\tbeginHide: beginHideTooltip,\r\n\t\t\t\tdestroy: destroy\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcreateTooltip: createTooltip\r\n\t\t};\r\n\t}\n\ttooltipService.$inject = ['$q', '$timeout', '$document', '$animate', '_', '$'];\r\n})();","(function() {\n\t'use strict';\n\n\tangular\n\t\t.module('assetCommon')\n\t\t.factory('userService', userService);\n\n\tfunction userService($http, $q, promiseUtilityService, _, assetCommonConfig, userMapper, uriUtility) {\n\t\treturn {\n\t\t\tgetCurrentUserAsync: function () {\n\t\t\t\treturn $http.get(assetCommonConfig.accountServicesBaseUri + 'users/me')\n\t\t\t\t\t.then(function(response) {\n\t\t\t\t\t\treturn userMapper.mapDetails(response.data);\n\t\t\t\t\t})\n\t\t\t\t\t.catch(function() {\n\t\t\t\t\t\treturn $q.reject('error fetching current user');\n\t\t\t\t\t});\n\t\t\t},\n\n\t\t\tgetUserDetailsAsync: function (id) {\n\t\t\t\treturn $http.get(uriUtility.fromPattern(assetCommonConfig.accountServicesBaseUri + 'users/{id}', { id: id }))\n\t\t\t\t\t.then(function (response) {\n\t\t\t\t\t\treturn userMapper.mapDetails(response.data);\n\t\t\t\t\t});\n\t\t\t},\n\n\t\t\tsearchUsersAsync: function (search, cancellationToken) {\n\t\t\t\tsearch = search && search.trim();\n\t\t\t\tif (!search)\n\t\t\t\t\treturn promiseUtilityService.fromResult(null);\n\n\t\t\t\treturn $http.get(uriUtility.fromPattern(assetCommonConfig.accountServicesBaseUri + 'users', { q: search }), { timeout: cancellationToken })\n\t\t\t\t\t.then(function (response) {\n\t\t\t\t\t\treturn response && response.data &&\n\t\t\t\t\t\t\tuserMapper.mapDetails(response.data.users);\n\t\t\t\t\t});\n\t\t\t},\n\n\t\t\tsignin: function (email, password) {\n\t\t\t\treturn $http({\n\t\t\t\t\tmethod: 'post',\n\t\t\t\t\turl: assetCommonConfig.signInUri,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\temail: email,\n\t\t\t\t\t\tpassword: password\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tgetSingleSignInScriptAsync: function () {\n\t\t\t\treturn $http.get(assetCommonConfig.singleSignInScriptUri)\n\t\t\t\t\t.then(function (response) {\n\t\t\t\t\t\treturn response && response.data && response.data.script;\n\t\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n\tuserService.$inject = ['$http', '$q', 'promiseUtilityService', '_', 'assetCommonConfig', 'userMapper', 'uriUtility'];\n})();\n","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('assetUtility', assetUtility);\r\n\r\n\tfunction assetUtility(_, utility, uriUtility, assetCommonConfig) {\r\n\t\tfunction getBestFormatsForSize(asset, desiredSize, formatPrefix) {\r\n\t\t\tvar closestSize = null;\r\n\t\t\tvar bestFormats = _(asset.formats || [])\r\n\t\t\t\t.filter(function (f) {\r\n\t\t\t\t\tvar firstFile = f.file || (f.files && f.files[0]);\r\n\t\t\t\t\treturn f.name && utility.startsWith(f.name, assetCommonConfig.previewFormatPrefix) && firstFile && firstFile.mediaType && utility.startsWith(firstFile.mediaType, formatPrefix + '/');\r\n\t\t\t\t})\r\n\t\t\t\t.map(function (f) {\r\n\t\t\t\t\tvar previewSize = f.name.substring(assetCommonConfig.previewFormatPrefix.length);\r\n\t\t\t\t\tpreviewSize = parseInt(previewSize.trim(), 10);\r\n\r\n\t\t\t\t\treturn previewSize && {\r\n\t\t\t\t\t\tformat: f,\r\n\t\t\t\t\t\tsize: previewSize\r\n\t\t\t\t\t};\r\n\t\t\t\t})\r\n\t\t\t\t.compact()\r\n\t\t\t\t.groupBy(function (f) {\r\n\t\t\t\t\treturn f.size >= desiredSize ? 'formatsLargerThanDesired' : 'formatsSmallerThanDesired';\r\n\t\t\t\t})\r\n\t\t\t\t.value();\r\n\r\n\t\t\treturn _(bestFormats.formatsLargerThanDesired ?\r\n\t\t\t\t\tbestFormats.formatsLargerThanDesired :\r\n\t\t\t\t\tbestFormats.formatsSmallerThanDesired ?\r\n\t\t\t\t\t\tbestFormats.formatsSmallerThanDesired : [])\r\n\t\t\t\t.sortBy(function (f) {\r\n\t\t\t\t\treturn Math.abs(desiredSize - f.size);\r\n\t\t\t\t})\r\n\t\t\t\t.take(function (f) {\r\n\t\t\t\t\tif (closestSize === null)\r\n\t\t\t\t\t\tclosestSize = f.size;\r\n\r\n\t\t\t\t\treturn f.size === closestSize;\r\n\t\t\t\t})\r\n\t\t\t\t.value();\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tgetBestFormatForSize: function (asset, size) {\r\n\t\t\t\tvar bestFormats = getBestFormatsForSize(asset, size, 'image');\r\n\t\t\t\treturn bestFormats && bestFormats[0] && bestFormats[0].format;\r\n\t\t\t},\r\n\t\t\tgetBestThumbnailForSize: function (asset, size, assetServiceBaseUri) {\r\n\t\t\t\tvar formats = getBestFormatsForSize(asset, size, 'image');\r\n\t\t\t\tvar bestFormat = formats[0] && formats[0].format;\r\n\r\n\t\t\t\tvar previewFile = bestFormat && (bestFormat.file || bestFormat.files && bestFormat.files[0]);\r\n\r\n\t\t\t\treturn previewFile && {\r\n\t\t\t\t\tfileId: previewFile.id,\r\n\t\t\t\t\twidth: previewFile.metadata.image.width,\r\n\t\t\t\t\theight: previewFile.metadata.image.height,\r\n\t\t\t\t\turl: uriUtility.fromPattern(assetServiceBaseUri + 'assets/{assetId}/files/{fileId}/content', { assetId: asset.id, fileId: previewFile.id, rev: asset.revision.id })\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\tgetVideoSourcesForSize: function (asset, size, assetServiceBaseUri) {\r\n\t\t\t\tif (!asset.formats)\r\n\t\t\t\t\treturn [];\r\n\r\n\t\t\t\treturn _(getBestFormatsForSize(asset, size, 'video'))\r\n\t\t\t\t\t.map(function (f) {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tsrc: uriUtility.fromPattern(assetServiceBaseUri + 'assets/{assetId}/files/{fileId}/content', { assetId: asset.id, fileId: f.format.file.id, rev: asset.revision.id }),\r\n\t\t\t\t\t\t\ttype: f.format.file.mediaType,\r\n\t\t\t\t\t\t\theight: f.size\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.sort(function (a, b) {\r\n\t\t\t\t\t\t// Video playback is flaky in Chrome when webm isn't first in the list\r\n\t\t\t\t\t\treturn a.type.indexOf('webm') >= 0 ?\r\n\t\t\t\t\t\t\t-1 :\r\n\t\t\t\t\t\t\tb.type.indexOf('webm') >= 0 ?\r\n\t\t\t\t\t\t\t\t1 : 0;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.value();\r\n\t\t\t},\r\n\t\t\tgetAudioSources: function (asset, assetServiceBaseUri) {\r\n\t\t\t\tvar formats = asset.formats || [];\r\n\t\t\t\tvar files = [asset.file].concat(formats.map(function (format) { return format.file; }));\r\n\r\n\t\t\t\treturn _(files)\r\n\t\t\t\t\t.filter(function (file) {\r\n\t\t\t\t\t\treturn file.mediaType && utility.startsWith(file.mediaType, 'audio/');\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.map(function (file) {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tsrc: uriUtility.fromPattern(assetServiceBaseUri + 'assets/{assetId}/files/{fileId}/content', { assetId: asset.id, fileId: file.id, rev: asset.revision.id }),\r\n\t\t\t\t\t\t\ttype: file.mediaType\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.value();\r\n\t\t\t}\r\n\t\t};\r\n\t}\n\tassetUtility.$inject = ['_', 'utility', 'uriUtility', 'assetCommonConfig'];\r\n})();\r\n","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('environmentUtility', environmentUtility);\r\n\r\n\tfunction environmentUtility($location) {\r\n\t\tvar subdomains = {\r\n\t\t\t'local': 'local',\r\n\t\t\t'internal': 'internal'\r\n\t\t};\r\n\r\n\t\tfunction getEnvironment() {\r\n\t\t\tvar host = $location.host();\r\n\t\t\tvar index = host.indexOf('.');\r\n\t\t\treturn (index !== -1 && subdomains[host.substr(0, index)]) || 'production';\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tgetEnvironment: getEnvironment\r\n\t\t};\r\n\t}\n\tenvironmentUtility.$inject = ['$location'];\r\n})();\r\n","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('geometryUtility', geometryUtility);\r\n\r\n\tfunction geometryUtility() {\r\n\t\tfunction getBestFitForConstraint(constraintWidth, constraintHeight, width, height) {\r\n\t\t\tif (!constraintHeight && !constraintWidth)\r\n\t\t\t\treturn { width: width, height: height };\r\n\r\n\t\t\tvar bounds, displayWidth, displayHeight;\r\n\t\t\tvar constraintAspectRatio = constraintWidth / constraintHeight;\r\n\t\t\tvar aspectRatio = width / height;\r\n\r\n\t\t\tif (constraintWidth && (!constraintHeight || (aspectRatio > constraintAspectRatio))) {\r\n\t\t\t\tdisplayWidth = Math.min(width, constraintWidth);\r\n\t\t\t\tbounds = {\r\n\t\t\t\t\twidth: displayWidth,\r\n\t\t\t\t\theight: displayWidth / aspectRatio\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tdisplayHeight = Math.min(height, constraintHeight);\r\n\t\t\t\tbounds = {\r\n\t\t\t\t\twidth: displayHeight * aspectRatio,\r\n\t\t\t\t\theight: displayHeight\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\treturn bounds;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tgetBestFitForConstraint: getBestFitForConstraint\r\n\t\t};\r\n\t}\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('httpUtility', httpUtility);\r\n\r\n\tfunction httpUtility(_) {\r\n\t\tfunction getErrorReason(response) {\r\n\t\t\tif (response && _.isNumber(response.status)) {\r\n\t\t\t\tif (response.status <= 0)\r\n\t\t\t\t\treturn 'abort';\r\n\t\t\t\tif (response.status === 404)\r\n\t\t\t\t\treturn 'notfound';\r\n\t\t\t}\r\n\t\t\treturn 'error';\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tgetErrorReason: getErrorReason\r\n\t\t};\r\n\t}\n\thttpUtility.$inject = ['_'];\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('layoutUtility', layoutUtility);\r\n\r\n\tfunction layoutUtility() {\r\n\t\tfunction isSmallScreen() {\r\n\t\t\treturn window.innerWidth < 1024;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tisSmallScreen: isSmallScreen\r\n\t\t};\r\n\t}\r\n})();","(function() {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('assetCommon')\r\n\t\t.factory('mimeTypeUtility', mimeTypeUtility);\r\n\r\n\tfunction mimeTypeUtility(_) {\r\n\t\tvar mediaKinds = {\r\n\t\t\tdoc: ['msword', 'wordprocessing', 'opendocument[.]text', 'powerpoint', 'presentation', 'opendocument[.]presentation'],\r\n\t\t\txls: ['excel', 'spreadsheet'],\r\n\t\t\tpdf: ['pdf'],\r\n\t\t\tzip: ['zip', 'x-rar-compressed', 'x-tar'],\r\n\t\t\tpsd: [],\r\n\t\t\tai: [],\r\n\t\t\tfw: [],\r\n\t\t\tindd: [],\r\n\t\t\tapplication: [],\r\n\t\t\timage: [],\r\n\t\t\tvideo: [],\r\n\t\t\taudio: [],\r\n\t\t\ttext: []\r\n\t\t};\r\n\r\n\t\tfunction getFileKind(mediaType) {\r\n\t\t\tvar kind = _.findKey(mediaKinds, function (patterns) {\r\n\t\t\t\treturn _.any(patterns, function (pattern) {\r\n\t\t\t\t\treturn new RegExp(pattern, 'gi').test(mediaType);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\tif (!kind) {\r\n\t\t\t\tvar mimeType = splitMimeType(mediaType);\r\n\t\t\t\tif (mimeType)\r\n\t\t\t\t\tkind = mimeType.type;\r\n\t\t\t}\r\n\r\n\t\t\treturn kind || 'unknown';\r\n\t\t}\r\n\r\n\t\tfunction splitMimeType(mimeType) {\r\n\t\t\tif (!mimeType)\r\n\t\t\t\treturn null;\r\n\r\n\t\t\tvar parts = mimeType.split('/');\r\n\t\t\tif (parts.length !== 2)\r\n\t\t\t\treturn null;\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype: parts[0],\r\n\t\t\t\tsubtype: parts[1]\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tgetFileKind: getFileKind,\r\n\t\t\tsplitMimeType: splitMimeType\r\n\t\t};\r\n\t}\n\tmimeTypeUtility.$inject = ['_'];\r\n})();"]}