{"version":3,"sources":["FileTransferStats/filetransferstats.class.js","functions/basicurlvalidate.func.js","functions/extractfileextension.func.js","functions/isempty.func.js","functions/namejoin.func.js","functions/normalizefilesize.func.js","functions/parentpath.func.js","functions/parseerrorresponse.func.js","functions/pathjoin.func.js","functions/responseisunsuccessful.func.js","functions/showresponseerror.func.js","functions/unicodesafebase64.func.js","functions/validatefilename.func.js","functions/versionislessthan.func.js","monsta.js","Authentication/authentication.factory.js","Breadcrumb/breadcrumb.controller.js","CodeMirror/codemirror.factory.js","Configuration/configuration.factory.js","Configuration/localconfiguration.factory.js","Connection/connection.factory.js","DirectorySorting/directorysorting.factory.js","DragDrop/dragdrop.controller.js","FileBrowser/filebrowser.controller.js","FileBrowser/rowmousetracker.factory.js","FileBrowser/selecteditems.factory.js","FileEditor/fileeditor.controller.js","Footer/footer.controller.js","Header/header.controller.js","History/history.controller.js","History/history.factory.js","JQuery/jquery.factory.js","License/license.factory.js","LoginLinkModal/modalloginlink.controller.js","LoginPanel/loginpanel.controller.js","ModalAddons/modaladdons.controller.js","ModalChoice/modalchoice.controller.js","ModalConfirm/modalconfirm.controller.js","ModalError/modalerror.controller.js","ModalPermissions/modalpermissions.controller.js","ModalPrompt/modalprompt.controller.js","ModalProperties/modalproperties.controller.js","ModalSettings/modalsettings.controller.js","ModalTransfer/modaltransfer.controller.js","Permissions/permissions.factory.js","Slidebar/slidebar.controller.js","Spinner/spinner.controller.js","UIOperation/uioperation.factory.js","URLLogin/urllogin.factory.js","Upload/upload.factory.js","UploadUI/uploadui.factory.js","filters/file_last_modified.filter.js","filters/file_size.filter.js","filters/html_safe.filter.js","filters/human_time_since.filter.js","filters/icon.filter.js","filters/item_permission_description.filter.js","filters/sort_description.filter.js","filters/spaces_to_nbsp.filter.js","filters/transfer_percent.filter.js","filters/transfer_rate.filter.js","prototypes/string.prototype.js"],"names":["FileTransferStats","totalBytes","this","completedBytes","previousCompletedBytes","previousSampleTime","_transferRateSamples","basicURLValidate","url","re","RegExp","test","extractFileExtension","fileName","nameComponents","split","length","toLowerCase","isEmpty","val","nameJoin","names","retVal","i","normalizeFileSize","fileSize","units","scaledSize","sizeSteps","toFixed","Math","round","parentPath","inputPath","hasLeadingSlash","substr","normalizedPath","splitPath","pathIndex","pathComponent","push","join","parseErrorResponse","response","action","data","errors","actionMsg","status","pathJoin","prefix","suffix","joiner","responseIsUnsuccessful","undefined","success","showResponseError","$rootScope","$translate","translateErrorDone","translatedError","translatedErrors","expectedTranslations","$broadcast","localizedErrors","context","window","console","error","errorName","then","b64EncodeUnicode","str","btoa","encodeURIComponent","replace","match","p1","String","fromCharCode","parseInt","b64DecodeUnicode","decodeURIComponent","Array","prototype","map","call","atob","c","charCodeAt","toString","slice","validateFileNameNonEmpty","validateFileNameContainsNoSlash","indexOf","mapParseInt","simpleCompare","a","b","betaVersionComponentCompare","component1","component2","component1IsBeta","component2IsBeta","splitComponent1","splitComponent2","c1Compare","versionComponentCompare","versionIsLessThan","version1","version2","splitV1","splitV2","comparison","HISTORY_MAX","TRANSFER_RATE_UPDATE_INTERVAL","TRANSFER_RATE_SAMPLES_MAX","AUTOSAVE_DELAY_MS","MAX_CONCURRENT_UPLOADS","MAX_UPLOAD_BYTES","UPLOAD_ACTION","UPLOAD_ARCHIVE_ACTION","API_PATH","DOWNLOAD_PATH","UPLOAD_PATH","CM_MODE_BASE","EXTRACT_UPLOAD","DEBUG","g_ConnectionDefaults","ftp","port","sftp","angular","module","config","$httpProvider","activeRequestCount","interceptors","$q","handleActiveRequestChange","delta","request","responseError","rejection","reject","$translateProvider","useSanitizeValueStrategy","underTest","useStaticFilesLoader","useMessageFormatInterpolation","fallbackLanguage","localStorage","storedLanguage","getItem","g_defaultLanguage","JSON","parse","e","preferredLanguage","authenticationFactory","configurationKey","connectionTypeKey","initialDirectoryKey","rememberLoginKey","isAuthenticatedKey","hasServerSavedAuthenticationKey","isAuthenticated","rememberLogin","configuration","connectionType","initialDirectory","hasServerSavedAuthentication","_localStorageSupported","getConfigurationAsJSON","stringify","setConfigurationFromJSON","jsonConfig","localStorageSupported","testKey","storage","setItem","removeItem","postLogin","saveSettings","loadSettings","loadMetaConfiguration","loadConfiguration","saveMetaConfiguration","saveConfiguration","clearConfiguration","clearSettings","logout","hasStoredAuthenticationDetails","getActiveConfiguration","activeConfiguration","factory","BreadcrumbController","$scope","jQuery","linkClick","ev","preventDefault","vm","changeDirectoryToItem","makeBreadcrumbItem","linkText","index","$span","$link","text","click","append","renderBreadcrumbs","RIGHT_COMPONENT_BUFFER","RIGHT_FULL_BUFFER","$breadcrumbContainer","$homeLink","historyButton","windowWidth","width","maxWidth","totalWidth","find","remove","lastIndex","pathComponents","$rightSpan","component","after","outerWidth","$initialSpan","charactersRemoved","offset","left","lastComponent","lastComponentLength","trimmedName","setPath","path","splice","itemIndex","joinedPath","newPath","directoryChanged","$on","resize","controller","$inject","codeMirrorFactory","$window","_jQuery","loadedModes","convertFilenameToMode","fileExtension","modeLookup","htm","html","php","asp","aspx","js","css","xhtml","cfm","pl","py","cpp","rb","java","xml","hasOwnProperty","getModeDependencies","modeName","dependencyLookup","htmlmixed","generateModePath","setupCodeMirror","editorElement","postSetupCallback","cm","CodeMirror","fromTextArea","value","mode","lineNumbers","lineWrapping","postScriptLoad","loadModeAfterDependencies","_this","getScript","initiateCodeMirror","dependencies","neededDependencies","dependencyName","configurationFactory","connectionFactory","getSystemConfiguration","promise","lastRequestFailed","getSystemVars","requestSuccess","requestFailure","saveApplicationSettings","setApplicationSettings","applicationSettings","setApplicationSetting","key","keyChanged","getApplicationSetting","localConfigurationFactory","isLocalStorageSupported","getItemFromLocalStorage","rawItem","storeItemInLocalStorage","item","storeItem","inMemoryStorage","getConfigurationItem","getApplicationSettings","systemVars","setConfigurationItem","$http","NETWORK_TIMEOUT_SECONDS","IGNORE_TIMEOUT_TYPES","addRemoteFileRequest","actionName","remotePath","addSourceDestinationRequest","source","destination","_sendRequest","requestBody","timeout","req","method","headers","Content-Type","transformRequest","obj","p","log","getRequestBody","copy","defaultsForConnectionType","defaultName","getEmptyRequestBody","getListDirectoryRequest","showHidden","getFetchFileRequest","getMakeDirectoryRequest","getDeleteDirectoryRequest","getDeleteFileRequest","getCopyRequest","getRenameRequest","getChangePermissionsRequest","getPutFileContentsRequest","fileContents","getGetFileContentsRequest","getTestConnectAndAuthenticateRequest","getCheckSavedAuthExistsRequest","getWriteSavedAuthRequest","password","authData","getReadSavedAuthRequest","getReadLicenseRequest","getGetSystemVarsRequest","getFetchRemoteFileRequest","remoteSource","destinationDirectory","getDownloadMultipleFilesRequest","baseDirectory","items","getSetApplicationSettingsRequest","getDeleteMultipleRequest","pathsAndTypes","getExtractArchiveRequest","fileKey","fileIndexOffset","extractCount","listDirectory","fetchFile","rename","changePermissions","deleteFile","deleteDirectory","makeDirectory","getFileContents","putFileContents","contents","testConnectAndAuthenticate","checkSavedAuthExists","writeSavedAuth","readSavedAuth","getLicense","fetchRemoteFile","downloadMultipleFiles","deleteMultiple","extractArchive","directorySortingFactory","compareByDirectoryFlag","isDirectory","compareByName","directoryCompare","name","compareByModificationDate","modificationDate","compareBySize","size","compareByType","aExt","bExt","_handleReverse","sortedList","reverse","sortByName","unsortedList","sort","sortByModificationDate","sortBySize","sortByType","DragDropController","uploadUIFactory","containsFiles","browserEvent","dataTransfer","types","handleDropEvent","event","handleItemsBasedUpload","handleFilesBasedUpload","files","overDrop","$html","ready","$fileDrop","on","$files","top","position","height","display","show","hide","dragenter","stopPropagation","dragleave","contains","target","dragover","drop","originalEvent","dragend","FileBrowserController","uiOperationFactory","historyFactory","$timeout","selectedItemsFactory","rowMouseTrackerFactory","loggedIn","changeDirectory","contextMenuStyleForEvent","clientX","CONTEXT_MENU_X_OFFSET","clientY","CONTEXT_MENU_Y_OFFSET","margin-left","margin-top","fixContextMenuOffScreen","$dropdownMenu","elementWillExtendPastWindowWidth","CONTEXT_MENU_INSET","elementWillExtendPastWindowHeight","setupContextMenuEvents","contextmenu","$tr","first","dropdown","tagName","selectItem","$fileToobar","currentContextMenu","$dropDownMenuParent","parent","removeClass","outerHeight","addClass","$contextCatcherUl","attr","xOffset","$element","yOffset","doReorder","directoryList","sortDirectoryList","sortName","sortReversed","handleReorderChange","newSortName","sortMethodName","directoryListSuccess","change","currentDirectory","clearSelection","isHistoryChangeDir","addEntry","isFirstLoad","refreshDirectoryList","filesReadyForDownloadCallback","location","fileFetchFailureCallback","downloadFileAtPath","downloadMultiple","selectedItems","getSelectedItems","itemNames","downloadSingle","fullFilePath","joinNameToCurrentDirectory","downloadSelectedFiles","getSelectedPaths","selectedPathCopy","initiateCopyOfPaths","paths","setCopySource","initiateCutOfPaths","setCutSource","initiateCutOfSelectedPaths","initiateCopyOfSelectedPaths","performPaste","cutSource","copySource","sourcePaths","operation","sourcePath","splitSourceFileName","sourceFileName","destinationPath","pasteComplete","deleteComplete","allItems","concat","directoriesToDelete","filesToDelete","confirmDelete","itemsToDelete","isCutOrCopySource","clearCutAndCopySource","cancelDelete","showTranslatedDeleteConfirm","translatedMessage","showDeleteConfirm","fileNames","item_count","message","initiateDeleteOfSelectedPaths","fullPath","clearNewItemTempVars","newItemPath","makeItemType","makeItemSuccessCallback","shouldEditItem","itemIsEditable","makeItemFailureCallback","errorMessage","translations","displayPromptError","getFileNameError","translateAndDisplayPromptError","promptErrorID","makeItemOKCallback","itemName","itemNameError","item_type","initiateMakeItem","itemType","ucItemType","capitalizeFirstLetter","NEW_ITEM_PROMPT_TITLE","NEW_ITEM_NAME_PLACEHOLDER","initiateChmodOfSelectedItems","itemPaths","numericPerms","numericPermissions","fileRenameCallback","finalValue","initialValue","renameSource","showRenamePrompt","RENAME_FILE_PROMPT_TITLE","RENAME_FILE_NAME_PLACEHOLDER","initiateRename","handleChangeDirectory","didLogout","clearHistory","systemVarLoadSuccess","vars","setEditableExtensions","systemVarLoadFailure","editableExtensionStr","splitExtensions","editableExtensions","trimmedExtension","trim","itemPath","extension","navigateUpOneLevel","showProperties","handleBodyClick","$event","which","id","hasPasteSource","$extraDropdownButton","rowMouseDown","mouseDown","rowMouseMove","$index","mouseMove","rowMouseUp","mouseUp","rowMouseLeave","mouseLeave","rowDragStartIndex","isMetaDrag","previousDragOverIndex","reorder","currentTarget","getAttribute","initiateDeleteOfItem","downloadItem","initiateCutOfItem","initiateCopyOfItem","editItem","initiateRenameOfItem","handleClick","directoryPath","parentNode","buttonName","initiateChmodOfItem","mouseIsDown","mouseDownEvent","mouseMovedWhileDown","rowIndex","mouseClick","startDrag","mouseDrag","rowClickTargetElementNames","metaDraggedToIndex","draggedToIndex","ctrlKey","metaKey","metaClickAtIndex","shiftKey","shiftClickAtIndex","standardClickAtIndex","startMetaDraggingAtIndex","startDraggingAtIndex","generateRange","start","stop","range","broadcastSelectionChange","initialSelectedIndex","indexOfIndex","dragStartIndex","metaDragStartIndex","metaSelectedItems","newSelectedItems","lowerBound","min","upperBound","max","FileEditorController","licenseFactory","hideProUpgradeMessages","savedDirectories","modalFileEditorId","modal","editorFiles","setupAdvancedEditor","filePath","codeMode","setTimeout","editorItem","getEditorFileByPath","cmSetup","textAreaId","document","getElementById","cMirror","getValue","textChange","startEditingFile","ensureFileInScope","activeFile","isLicensed","contentsLoadedCallback","filePathIsInScope","editorFile","dirty","saving","loadFileContents","getFileIndexByPath","fileIndex","updateFileContents","file","removeFile","closingFiles","toTextArea","newFileIndex","showTabCloseConfirm","confirmMessage","confirmTabClose","cancelTabClose","initiateConfirmTabClose","pathOfTabToRemove","file_name","contentPutFinish","dirName","beginAutosave","settings","autoSave","autoSaveTimeout","clearTimeout","saveActiveFile","fileListClick","$filePickerMenu","toggleClass","shouldShowProUpgrade","itemsMoved","deletedItems","pathsToRemove","deletedPathIndex","deletedPath","deletedPathAsDirectory","editorFileIndex","removeIndex","activateTab","closeTabForFile","movedItems","moveSources","wasStarted","Date","now","updateTransferAmount","addTransferRate","getInstantaneousTransferRate","calculateTransferRate","sum","rate","elapsedTime","getTransferPercent","complete","hasBeenStarted","FooterController","handleUpload","uploadSingleInput","fileChangeHandler","isArchiveUpload","validateArchiveUpload","showModalError","handleUploadFolder","userAgent","navigator","uploadFolderInput","allowAction","editorActive","actionsRequiringSelection","selectedItemsCount","performRemoteFetch","translatedBusyMessage","setModalPromptError","remoteFetchCallback","final","initiateRemoteFetch","FETCH_FILE_PROMPT_TITLE","FETCH_FILE_URL_PLACEHOLDER","onEditorHide","activeFileCount","showEditor","maxUploadBytes","currentUsername","currentHost","currentVersion","newVersionAvailable","buttonClick","addEventListener","currentConfig","username","host","maxFileUpload","version","MONSTA_LATEST_VERSION","HeaderController","canGoBack","canGoForward","updateScopeFromHistoryFactory","hasPreviousHistoryItem","hasNextHistoryItem","navigateBack","newDir","navigateForward","refresh","HistoryController","updateHistory","history","getUniqueHistory","historyClick","removeEntry","HISTORY_CHANGED_EVENT_NAME","ensureTrailingSlash","_fullHistory","_historyIndex","getFullHistory","getFullHistoryCount","changed","historyItem","getFullHistoryItem","getHistoryIndex","setHistoryIndex","historySize","uniqueHistory","fullHistoryIndex","historyPath","monstaJQuery","isNullLicense","email","expiryDate","purchaseDate","handleGetFailure","handleGetSuccess","licenseData","isLicenseExpired","ModalLoginLinkController","urlLoginFactory","configURL","getConfigURL","type","supportsCopy","browserSupportsCopy","modalId","alertOnCopyFailure","textArea","alert","select","copySuccess","execCommand","err","copyFailureMessage","queryCommandEnabled","LoginPanelController","setStoredAuthenticationErrorMessage","storedAuthenticationErrorMessage","showRemoveProfileConfirm","removeProfile","buildDefaultConfiguration","connectionTypeAllowed","availableConnectionTypes","connectionTypes","ctIndex","modalLoginId","updateHasServerSavedAuth","displayTranslatedError","connectionErrorMessage","handleError","setupInitialDirectory","resumeType","connType","authInitDir","writeAuthenticationToServer","metaConfiguration","masterPassword","savedAuthentication","saveCurrentAuthentication","profileToSave","enteredProfileName","profileArray","savedProfileIndex","initiateAuthenticationSave","saveAuthentication","handleAuthenticationSuccess","handleAuthenticationFailure","transferConfigToAuthFactory","applyRestrictionsToConfiguration","successCallback","handleTestConfiguration","testConfiguration","transferConfigFromAuthFactory","initWithStoredAuth","initWithURLConfig","urlConfig","addDefaultsToConfig","passive","initWithDefaultAuth","init","configFromURL","readURL","getConfigFromCurrentURL","handleCreateAuthSuccess","masterPasswordValid","handleLoadSavedAuthSuccess","handleAuthFileFailure","performCreateAuthFile","defaultAuth","tIndex","initiateLoadOfAuthFile","loadProfileAtIndex","profileIndex","loadNewProfile","configurationSettable","connectionRestrictions","typeConnectionSettings","settingName","Object","shouldShowProfiles","disableMasterLogin","showLoginLink","profileIsSelected","getProfileName","profile","useDefault","remoteUsername","getDefaultProfileName","defaults","systemConfiguration","$","$apply","handleProfileChange","connect","sftpAvailable","handleLoginKeyPress","handleAuthGo","masterPasswordKeypress","selectValue","isNaN","initiateProfileDelete","shouldHideDeleteButton","ModalAddonsController","$filter","formattedExpiryDate","licenseExpired","ModalChoiceController","handleCallback","callbackIndex","callbacks","title","ModalConfirmController","okHandler","modalConfirmId","okCallback","cancelHandler","cancelCallback","ok","cancel","ModalErrorController","modalErrorId","dismissCallback","ModalPermissionsController","permissionsFactory","modalPermissionsEditorId","invalidRange","filePaths","setPermissions","permissions","numericToObject","zeroPadLeft","input","setFormattedPermissions","formattedPermissions","permissionsChange","objectToNumeric","validateFormattedPermission","formattedPermission","formattedPermissionsChange","permissionSaveError","permissionSaveSuccess","initiatePermissionsSave","filesSaved","checkCompleted","$watch","manualFocus","okClick","cancelClick","ModalPromptController","modalPromptId","setVars","initial","placeHolder","translatedTitle","translatedPlaceholder","errorSet","isBusy","busyMessage","updateDismissMessage","translatedDismissMessage","dismissMessage","focus","successClose","handlePromptKeypress","clearError","clearBusy","setBusy","translatedErrorMessage","ModalPropertiesController","modalPropertiesId","ModalSettingsController","previousShowDotFiles","showDotFiles","systemShowDotFiles","applicationSettingsKeys","keys","debug","use","ModalTransferController","uploadFactory","updateUploads","uploads","getUploads","uploadFinished","abortItem","abortAll","fsFilter","itemToAbort","ownerRead","ownerWrite","ownerExecute","groupRead","groupWrite","groupExecute","otherRead","otherWrite","otherExecute","numericPermission","SlidebarController","confirmLogout","slidebars","close","showModalConfirm","initiateLogout","showAddonsModal","showSettingsModal","showLoginPanel","SpinnerController","spinnerVisible","reqCount","newCutSource","newCopySource","$location","encodeConfiguration","configDict","t","compactConfigKeys","decodeConfiguration","encodedConfiguration","uncompactConfigKeys","decodePostHash","postHash","splitURL","decodedConfiguration","usernameKey","getPreHashURL","absURL","absUrl","getTransformLookup","isCompact","compactLookup","to","from","transformLookup","compactAndUncompact","toTransform","transformResult","EXTRACT_PROGRESS_STEPS","_uploads","_activeUploadCount","addUpload","fileObject","isArchive","stats","hasError","archiveExtractMax","archiveExtractCurrent","startUploadOfItemAtIndex","startNextItem","getUploadItem","progressItem","uploadItem","transferredBytes","getUploadRequestBody","encodeRequestBody","jsonRequestBody","getXHR","XMLHttpRequest","startXHR","open","setRequestHeader","send","fileRequestDescription","upload","readyState","OPENED","lengthComputable","loaded","onreadystatechange","DONE","completeItem","responseText","setItemError","progressExtract","fileCount","fileOffset","isPostExtract","responseData","broadcastComplete","abort","_uploadIterator","_itemIndex","_item","callback","showErrorModal","showTooLargeFilesError","tooLargeFiles","fileData","sizeFilter","broadcastExtractMessage","uploadStandardCallback","uploadAndExtractCallback","NAME_INDEX","REMOTE_PATH_INDEX","FILE_INDEX","SIZE_INDEX","IS_ARCHIVE_INDEX","filesToQueue","fileQueueIndex","treeTotalSize","treeProcessed","traverseFinished","processUploadQueue","promptForExtract","file_type","checkTooLargeFiles","performUploads","fileInfo","maximum_size","doUploadAdd","relativeFilePath","traverseFileTree","isFile","dirReader","createReader","readEntries","entries","entryIndex","webkitGetAsEntry","checkedFilesCount","handleFileCheckFinished","webkitRelativePath","FileReader","loadSuccess","reader","onerror","onload","readAsBinaryString","filesLastModified","dateFilter","filter","format","inputDate","currentDate","getDate","getMonth","getFullYear","$sce","htmlCode","trustAsHtml","humanTimeSince","timestampToFormattedDate","timeStamp","dmyFormat","d","scaledTimeDelta","timeDiff","timeSteps","isLink","iconName","description","permissionObject","toUpperCase","tr","charAt"],"mappings":"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","file":"monsta-min.js","sourcesContent":["function FileTransferStats(totalBytes) {\n this.completedBytes = 0;\n this.previousCompletedBytes = 0;\n this.totalBytes = totalBytes;\n this.previousSampleTime = -1;\n this._transferRateSamples = [];\n}\n\nFileTransferStats.prototype.wasStarted = function () {\n this.previousSampleTime = Date.now();\n};\n\nFileTransferStats.prototype.updateTransferAmount = function (completedBytes) {\n if (Date.now() - this.previousSampleTime < TRANSFER_RATE_UPDATE_INTERVAL)\n return;\n\n if (completedBytes < this.completedBytes)\n return;\n\n this.previousCompletedBytes = this.completedBytes;\n this.completedBytes = completedBytes;\n this.addTransferRate();\n};\n\nFileTransferStats.prototype.addTransferRate = function () {\n if (this._transferRateSamples.length == TRANSFER_RATE_SAMPLES_MAX)\n this._transferRateSamples.splice(0, 1);\n\n this._transferRateSamples.push(this.getInstantaneousTransferRate());\n};\n\nFileTransferStats.prototype.calculateTransferRate = function () {\n if (this._transferRateSamples.length == 0)\n return 0;\n\n var sum = 0;\n\n this._transferRateSamples.map(function (rate) {\n sum += rate;\n });\n\n return sum / this._transferRateSamples.length;\n};\n\nFileTransferStats.prototype.getInstantaneousTransferRate = function () {\n var elapsedTime = Date.now() - this.previousSampleTime;\n this.previousSampleTime = Date.now();\n return (this.completedBytes - this.previousCompletedBytes) / (elapsedTime / 1000);\n};\n\nFileTransferStats.prototype.getTransferPercent = function () {\n if (this.totalBytes == 0 || this.totalBytes == null || this.completedBytes == null)\n return 0;\n\n return (100 * this.completedBytes) / this.totalBytes;\n};\n\nFileTransferStats.prototype.complete = function () {\n this.completedBytes = this.totalBytes;\n};\n\nFileTransferStats.prototype.hasBeenStarted = function () {\n return this.previousSampleTime != -1;\n};","function basicURLValidate(url) {\n var re = new RegExp(\"^\\\\s*https?:\\/\\/.+\", \"i\");\n return re.test(url);\n}","function extractFileExtension(fileName) {\n if (typeof (fileName) != 'string')\n return '';\n\n var nameComponents = fileName.split('.');\n\n if (nameComponents.length == 1 || (nameComponents.length == 2 && nameComponents[0] == '')) // case 2 -> it starts with a .\n return '';\n\n return nameComponents[nameComponents.length - 1].toLowerCase();\n}","function isEmpty(val) {\n return val === null || typeof val == 'undefined' || val === '';\n}","function nameJoin(names) {\n switch (names.length) {\n case 0:\n return '';\n case 1:\n return names[0];\n default:\n var retVal = '';\n for (var i = 0; i < names.length - 1; ++i) {\n retVal += names[i];\n if (i < names.length - 2)\n retVal += ', ';\n }\n retVal += ' and ' + names[names.length - 1];\n return retVal;\n }\n}","function normalizeFileSize(fileSize) {\n if (typeof(fileSize) != 'number')\n return '';\n\n var units = 'B', scaledSize = fileSize, sizeSteps = [\n [1099511627776, 'TB'],\n [1073741824, 'GB'],\n [1048576, 'MB'],\n [1024, 'KB']\n ];\n\n for (var i = 0; i < sizeSteps.length; ++i) {\n if (fileSize >= sizeSteps[i][0]) {\n scaledSize = fileSize / sizeSteps[i][0];\n scaledSize = scaledSize.toFixed(1);\n units = sizeSteps[i][1];\n break;\n }\n }\n\n if (units == 'KB')\n scaledSize = Math.round(scaledSize);\n\n return scaledSize + units;\n}","function parentPath(inputPath){\n if(inputPath.length <= 1)\n return '/';\n\n var hasLeadingSlash = inputPath.substr(0, 1) == '/';\n\n while(inputPath.length && inputPath.substr(inputPath.length - 1, 1) == '/')\n inputPath = inputPath.substr(0, inputPath.length - 1);\n\n var normalizedPath = [];\n\n var splitPath = inputPath.split('/');\n\n for(var pathIndex = 0; pathIndex < splitPath.length - 1; ++pathIndex) {\n var pathComponent = splitPath[pathIndex];\n\n if (pathComponent.length == 0)\n continue;\n\n normalizedPath.push(pathComponent);\n }\n\n if (normalizedPath.length == 0)\n return '/';\n\n return (hasLeadingSlash ? '/' : '') + normalizedPath.join('/');\n}","function parseErrorResponse(response, action) {\n if (!response.data || !response.data.errors) {\n var actionMsg = isEmpty(action) ? '' : ' during ' + action;\n\n if(response.status == 408 || response.status == -1)\n return \"OPERATION_TIMEOUT\";\n else\n return \"An unknown error occurred\" + actionMsg + \".\";\n } else {\n return response.data.errors.join(' ');\n }\n}","function pathJoin(prefix, suffix) {\n var joiner = prefix.substr(prefix.length - 1, 1) == '/' ? '' : '/';\n return prefix + joiner + suffix;\n}","function responseIsUnsuccessful(response) {\n return response.data == undefined || response.data.success != true;\n}","function showResponseError(response, action, $rootScope, $translate) {\n if (response.data && response.data.localizedErrors) {\n var expectedTranslations = response.data.localizedErrors.length, translatedErrors = [];\n\n function translateErrorDone(translatedError) {\n translatedErrors.push(translatedError);\n\n if (translatedErrors.length == expectedTranslations)\n $rootScope.$broadcast('modal-error:show', translatedErrors.join(' '));\n }\n\n for (var i = 0; i < expectedTranslations; ++i) {\n if (typeof(response.data.localizedErrors[i].context) == \"undefined\"\n || response.data.localizedErrors[i].context == null || true) {\n if (window.console && window.console.error) {\n console.error(response.data);\n }\n }\n\n $translate(response.data.localizedErrors[i].errorName, response.data.localizedErrors[i].context).then(\n translateErrorDone, translateErrorDone);\n }\n } else\n $rootScope.$broadcast('modal-error:show', parseErrorResponse(response, action), null, {action: action});\n}","function b64EncodeUnicode(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {\n return String.fromCharCode(parseInt('0x' + p1));\n }));\n}\n\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n }).join(''));\n}","function validateFileNameNonEmpty(fileName) {\n return fileName != '';\n}\n\nfunction validateFileNameContainsNoSlash(fileName) {\n return fileName.indexOf('/') == -1;\n}","function mapParseInt(val) {\n return parseInt(val);\n}\n\nfunction simpleCompare(a, b) {\n return a - b;\n}\n\nfunction betaVersionComponentCompare(component1, component2) {\n var component1IsBeta = component1.indexOf('b') != -1;\n var component2IsBeta = component2.indexOf('b') != -1;\n\n var splitComponent1 = component1.split('b').map(mapParseInt);\n var splitComponent2 = component2.split('b').map(mapParseInt);\n\n if (component1IsBeta && component2IsBeta) {\n var c1Compare = simpleCompare(splitComponent1[0], splitComponent2[0]);\n if (c1Compare != 0)\n return c1Compare;\n\n return simpleCompare(splitComponent1[1], splitComponent2[1]);\n } else if (component1IsBeta) {\n return splitComponent1[0] > splitComponent2[0] ? 1 : -1;\n // xby < x\n } else {\n return splitComponent2[0] > splitComponent1[0] ? 1 : -1;\n }\n}\n\nfunction versionComponentCompare(component1, component2) {\n if (component1.indexOf('b') != -1 || component2.indexOf('b') != -1)\n return betaVersionComponentCompare(component1, component2);\n\n return simpleCompare(parseInt(component1), parseInt(component2));\n}\n\nfunction versionIsLessThan(version1, version2) {\n var splitV1 = version1.split('.');\n\n if (splitV1.length == 2)\n splitV1.push('0');\n\n var splitV2 = version2.split('.');\n\n if (splitV2.length == 2)\n splitV2.push('0');\n\n for (var i = 0; i < 3; ++i) {\n var comparison = versionComponentCompare(splitV1[i], splitV2[i]);\n\n if (comparison != 0)\n return comparison < 0;\n }\n\n return false;\n}","var HISTORY_MAX = 5;\nvar TRANSFER_RATE_UPDATE_INTERVAL = 200;\nvar TRANSFER_RATE_SAMPLES_MAX = 10;\nvar AUTOSAVE_DELAY_MS = 3000;\nvar MAX_CONCURRENT_UPLOADS = 1;\nvar MAX_UPLOAD_BYTES = -1;\nvar UPLOAD_ACTION = 'uploadFileToNewDirectory';\nvar UPLOAD_ARCHIVE_ACTION = 'uploadArchive';\nvar API_PATH = 'application/api/api.php';\nvar DOWNLOAD_PATH = 'application/api/download.php';\nvar UPLOAD_PATH = 'application/api/upload.php';\nvar CM_MODE_BASE = \"//cdnjs.cloudflare.com/ajax/libs/codemirror/5.17.0/mode/\";\nvar EXTRACT_UPLOAD = false;\nvar DEBUG = false;\n\nvar g_ConnectionDefaults = {\n ftp: {\n port: 21\n },\n sftp: {\n port: 22\n }\n};\n\nangular.module('MonstaFTP', ['pascalprecht.translate']);\n\nangular.module('MonstaFTP').config(['$httpProvider', function ($httpProvider) {\n 'use strict';\n var activeRequestCount = 0;\n\n $httpProvider.interceptors.push(['$rootScope', '$q', function ($rootScope, $q) {\n var handleActiveRequestChange = function (delta) {\n activeRequestCount += delta;\n $rootScope.$broadcast('request-count-change', activeRequestCount);\n };\n\n return {\n 'request': function (config) {\n handleActiveRequestChange(1);\n return config;\n },\n 'responseError': function (rejection) {\n handleActiveRequestChange(-1);\n return $q.reject(rejection);\n },\n 'response': function (response) {\n handleActiveRequestChange(-1);\n return response;\n }\n };\n }]);\n}]);\n\nangular.module('MonstaFTP').config(['$translateProvider', function ($translateProvider) {\n 'use strict';\n $translateProvider.useSanitizeValueStrategy('escape');\n if (!window.underTest) { // TODO this is a bit hack\n $translateProvider.useStaticFilesLoader({\n prefix: 'application/languages/',\n suffix: '.json'\n });\n }\n\n $translateProvider.useMessageFormatInterpolation();\n $translateProvider.fallbackLanguage('en_us');\n\n if(window.localStorage) {\n try {\n var storedLanguage = localStorage.getItem('monsta-setting-language');\n if(storedLanguage)\n g_defaultLanguage = JSON.parse(storedLanguage);\n } catch (e) {\n\n }\n }\n\n $translateProvider.preferredLanguage(g_defaultLanguage);\n}]);","(function () {\n angular.module('MonstaFTP').factory('authenticationFactory', authenticationFactory);\n\n function authenticationFactory() {\n var configurationKey = 'monsta-configuration',\n connectionTypeKey = 'monsta-connectionType',\n initialDirectoryKey = 'monsta-initialDirectory',\n rememberLoginKey = 'monsta-rememberLogin',\n isAuthenticatedKey = 'monsta-isAuthenticated',\n hasServerSavedAuthenticationKey = 'monsta-hasServerSavedAuthentication';\n\n return {\n isAuthenticated: false,\n rememberLogin: false,\n configuration: null,\n connectionType: null,\n initialDirectory: null,\n hasServerSavedAuthentication: false,\n _localStorageSupported: null,\n getConfigurationAsJSON: function () {\n return JSON.stringify(this.configuration);\n },\n setConfigurationFromJSON: function (jsonConfig) {\n this.configuration = jsonConfig == null ? null : JSON.parse(jsonConfig);\n },\n localStorageSupported: function () {\n if (this._localStorageSupported == null) {\n var testKey = 'test', storage = window.localStorage;\n try {\n storage.setItem(testKey, '1');\n storage.removeItem(testKey);\n this._localStorageSupported = true;\n } catch (error) {\n this._localStorageSupported = false;\n }\n }\n return this._localStorageSupported;\n },\n postLogin: function () {\n this.isAuthenticated = true;\n this.saveSettings();\n },\n loadSettings: function () {\n if (!this.localStorageSupported())\n return;\n\n this.loadMetaConfiguration();\n\n if (this.rememberLogin)\n this.loadConfiguration();\n },\n saveSettings: function () {\n if (!this.localStorageSupported())\n return;\n\n this.saveMetaConfiguration();\n\n if (this.rememberLogin)\n this.saveConfiguration();\n else\n this.clearConfiguration();\n },\n clearSettings: function () {\n if (!this.localStorageSupported())\n return;\n\n if (!this.rememberLogin)\n this.clearConfiguration();\n },\n logout: function () {\n this.isAuthenticated = false;\n this.initialDirectory = null;\n this.saveSettings();\n this.clearSettings(); // looks weird, but we want to save all, then clear out ones we don't want\n this.configuration = null;\n // if config has been saved to localStorage, this will be repopulated, otherwise it clears out the form\n },\n loadConfiguration: function () {\n if (!this.localStorageSupported())\n return;\n\n this.setConfigurationFromJSON(localStorage.getItem(configurationKey));\n this.connectionType = localStorage.getItem(connectionTypeKey);\n this.initialDirectory = localStorage.getItem(initialDirectoryKey);\n },\n saveConfiguration: function () {\n if (!this.localStorageSupported())\n return;\n\n localStorage.setItem(configurationKey, this.getConfigurationAsJSON());\n localStorage.setItem(connectionTypeKey, this.connectionType);\n localStorage.setItem(initialDirectoryKey, this.initialDirectory);\n },\n clearConfiguration: function () {\n localStorage.removeItem(configurationKey);\n localStorage.removeItem(connectionTypeKey);\n localStorage.removeItem(initialDirectoryKey);\n },\n loadMetaConfiguration: function () {\n if (!this.localStorageSupported())\n return;\n\n this.rememberLogin = localStorage.getItem(rememberLoginKey) === 'true';\n this.isAuthenticated = localStorage.getItem(isAuthenticatedKey) === 'true';\n this.hasServerSavedAuthentication = localStorage.getItem(hasServerSavedAuthenticationKey) === 'true';\n },\n saveMetaConfiguration: function () {\n if (!this.localStorageSupported())\n return;\n\n localStorage.setItem(isAuthenticatedKey, this.isAuthenticated == true ? 'true' : 'false');\n localStorage.setItem(rememberLoginKey, this.rememberLogin == true ? 'true' : 'false');\n localStorage.setItem(hasServerSavedAuthenticationKey,\n this.hasServerSavedAuthentication == true ? 'true' : 'false');\n },\n hasStoredAuthenticationDetails: function () {\n return !isEmpty(this.connectionType) && !isEmpty(this.configuration);\n },\n getActiveConfiguration: function () {\n var activeConfiguration = this.configuration[this.connectionType];\n if (typeof(activeConfiguration.port) != 'undefined' && activeConfiguration.port != null)\n activeConfiguration.port = parseInt(activeConfiguration.port);\n return activeConfiguration;\n }\n };\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('BreadcrumbController', BreadcrumbController);\n\n BreadcrumbController.$inject = ['$scope', '$rootScope', 'jQuery'];\n\n function BreadcrumbController($scope, $rootScope, jQuery) {\n var vm = this;\n\n vm.pathComponents = [];\n vm.hasLeadingSlash = false;\n vm.renderBreadcrumbs = renderBreadcrumbs;\n\n this.setPath = setPath;\n this.changeDirectoryToItem = changeDirectoryToItem;\n\n $scope.$on('directory-changed', directoryChanged);\n\n jQuery(window).resize(function () {\n vm.renderBreadcrumbs();\n });\n\n function linkClick(ev) {\n ev.preventDefault();\n vm.changeDirectoryToItem(jQuery(this).data('index'));\n return false;\n }\n\n function makeBreadcrumbItem(linkText, index) {\n var $span = jQuery('
  • ');\n var $link = jQuery('').text(linkText + ' ');\n $link.click(linkClick);\n $span.append($link);\n return $span;\n }\n\n function renderBreadcrumbs() {\n var RIGHT_COMPONENT_BUFFER = 15, RIGHT_FULL_BUFFER = 120;\n // TODO: cache these elements so they aren't looked up every time\n var $breadcrumbContainer = jQuery(\"#breadcrumb-ol\"), $homeLink = jQuery(\"#breadcrumb__home_link\"),\n historyButton = jQuery('#history > button'), windowWidth = jQuery(window).width(),\n maxWidth = windowWidth - historyButton.width() - RIGHT_FULL_BUFFER, totalWidth = 0;\n $breadcrumbContainer.find('.breadcrumb-display').remove();\n\n var lastIndex = vm.pathComponents.length - 1, $rightSpan = null;\n\n for (var i = lastIndex; i >= 0; --i) {\n var component = vm.pathComponents[i];\n\n var $span = makeBreadcrumbItem(component, i + 1);\n\n if ($rightSpan === null)\n $rightSpan = $span;\n\n $homeLink.after($span);\n\n totalWidth += $span.outerWidth();\n\n if (totalWidth > maxWidth) {\n if (i != lastIndex) {\n // only remove it if this isn't the first try\n $span.remove();\n }\n\n if (lastIndex != 0) {\n var $initialSpan = makeBreadcrumbItem(\"…\", i + 1);\n $homeLink.after($initialSpan);\n }\n break;\n }\n }\n\n if (totalWidth > maxWidth) {\n var charactersRemoved = 1;\n\n while ($rightSpan.offset().left + $rightSpan.outerWidth() + RIGHT_COMPONENT_BUFFER > windowWidth) {\n ++charactersRemoved;\n var lastComponent = vm.pathComponents[lastIndex], lastComponentLength = lastComponent.length;\n var trimmedName = lastComponent.substr(0, lastComponentLength - charactersRemoved);\n trimmedName += \"…\";\n $rightSpan.text(trimmedName);\n if (lastComponentLength - charactersRemoved == 1)\n break; // this is safety to prevent infinite loops\n }\n }\n }\n\n function setPath(path) {\n if (typeof(path) != 'string' || path.length == 0) {\n vm.pathComponents = [];\n vm.hasLeadingSlash = false;\n return;\n }\n\n vm.hasLeadingSlash = path.substr(0, 1) == '/';\n\n if (path == '/')\n vm.pathComponents = [];\n else {\n vm.pathComponents = path.split('/');\n if (vm.pathComponents[0] == '')\n vm.pathComponents.splice(0, 1);\n\n if (vm.pathComponents[vm.pathComponents.length - 1] == '')\n vm.pathComponents.splice(vm.pathComponents.length - 1, 1);\n }\n\n vm.renderBreadcrumbs();\n }\n\n function changeDirectoryToItem(itemIndex) {\n var joinedPath = '';\n if (itemIndex != 0)\n joinedPath = vm.pathComponents.slice(0, itemIndex).join('/');\n\n var newPath = (vm.hasLeadingSlash ? '/' : '') + joinedPath;\n $rootScope.$broadcast('change-directory', newPath);\n }\n\n function directoryChanged(ev, path) {\n vm.setPath(path);\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').factory('codeMirrorFactory', codeMirrorFactory);\n\n codeMirrorFactory.$inject = ['$window'];\n\n function codeMirrorFactory($window) {\n var _jQuery = $window.jQuery; // can't inject factory into factory it seems\n return {\n jQuery: _jQuery, // for reference in tests & mocking\n loadedModes: [],\n convertFilenameToMode: function (fileName) {\n var fileExtension = extractFileExtension(fileName);\n\n var modeLookup = {\n htm: 'htmlmixed',\n html: 'htmlmixed',\n php: 'php',\n asp: 'htmlembedded',\n aspx: 'htmlembedded',\n js: 'javascript',\n css: 'css',\n xhtml: 'htmlmixed',\n cfm: 'htmlembedded',\n pl: 'perl',\n py: 'python',\n c: 'clike',\n cpp: 'clike',\n rb: 'ruby',\n java: 'java',\n xml: 'xml'\n };\n\n return modeLookup.hasOwnProperty(fileExtension) ? modeLookup[fileExtension] : null;\n },\n getModeDependencies: function (modeName) {\n var dependencyLookup = {\n 'htmlmixed': ['xml', 'javascript', 'css'],\n 'php': ['xml', 'javascript', 'css', 'htmlmixed', 'clike']\n // todo: make these work recursively instead of coding all deps in\n };\n\n return dependencyLookup.hasOwnProperty(modeName) ? dependencyLookup[modeName] : null;\n },\n generateModePath: function (modeName) {\n return CM_MODE_BASE + modeName + \"/\" + modeName + '.js';\n }, setupCodeMirror: function (modeName, editorElement, postSetupCallback) {\n var cm = CodeMirror.fromTextArea(editorElement, {\n value: editorElement.value,\n mode: modeName,\n lineNumbers: true,\n lineWrapping: true\n });\n\n postSetupCallback(cm);\n }, postScriptLoad: function (modeName, editorElement, postSetupCallback) {\n if (this.loadedModes.indexOf(modeName) == -1)\n this.loadedModes.push(modeName);\n\n this.setupCodeMirror(modeName, editorElement, postSetupCallback);\n }, loadModeAfterDependencies: function (modeName, editorElement, postSetupCallback) {\n if (this.loadedModes.indexOf(modeName) != -1) {\n this.setupCodeMirror(modeName, editorElement, postSetupCallback);\n return;\n }\n var _this = this;\n this.jQuery.getScript(this.generateModePath(modeName), function () {\n _this.postScriptLoad.call(_this, modeName, editorElement, postSetupCallback);\n });\n }, initiateCodeMirror: function (modeName, editorElement, postSetupCallback) {\n var dependencies = this.getModeDependencies(modeName);\n\n var neededDependencies = [];\n\n if (dependencies != null) {\n for (var i = 0; i < dependencies.length; ++i)\n if (this.loadedModes.indexOf(dependencies[i]) == -1)\n neededDependencies.push(dependencies[i]);\n }\n\n if (neededDependencies.length == 0)\n this.loadModeAfterDependencies(modeName, editorElement, postSetupCallback);\n else {\n var dependencyName = neededDependencies[0], _this = this;\n\n this.jQuery.getScript(this.generateModePath(dependencyName), function () {\n _this.loadedModes.push(dependencyName);\n _this.initiateCodeMirror.call(_this, modeName, editorElement, postSetupCallback);\n });\n }\n }\n };\n }\n}());\n\n","(function(){\n angular.module('MonstaFTP').factory('configurationFactory', configurationFactory);\n\n configurationFactory.$inject = ['connectionFactory', '$q', '$rootScope'];\n\n function configurationFactory(connectionFactory, $q, $rootScope) {\n var factory = {\n getSystemConfiguration: getSystemConfiguration,\n saveApplicationSettings: saveApplicationSettings,\n setApplicationSetting: setApplicationSetting,\n getApplicationSetting: getApplicationSetting\n }, promise = null, lastRequestFailed = false, config = null;\n\n function getSystemConfiguration() {\n if(promise === null || lastRequestFailed)\n promise = connectionFactory.getSystemVars().then(requestSuccess, requestFailure);\n\n return promise;\n }\n\n function requestSuccess(response) {\n config = response.data.data;\n return config;\n }\n\n function requestFailure(response) {\n lastRequestFailed = true;\n return $q.reject(response);\n }\n\n function saveApplicationSettings() {\n return connectionFactory.setApplicationSettings(config.applicationSettings);\n }\n\n function setApplicationSetting(key, value) {\n if (config == null)\n return;\n\n if (config.applicationSettings == undefined)\n config.applicationSettings = {};\n\n var keyChanged = config.applicationSettings[key] != value;\n\n config.applicationSettings[key] = value;\n\n if(keyChanged)\n $rootScope.$broadcast('configuration:key-changed', key, value);\n }\n\n function getApplicationSetting(key) {\n if(config == null)\n return null;\n\n return config.applicationSettings[key];\n }\n\n return factory;\n }\n}());","(function () {\n angular.module('MonstaFTP').factory('localConfigurationFactory', localConfigurationFactory);\n\n localConfigurationFactory.$inject = ['configurationFactory', '$rootScope'];\n\n function localConfigurationFactory(configurationFactory, $rootScope) {\n var factory = {\n getApplicationSettings: getApplicationSettings,\n getConfigurationItem: getConfigurationItem,\n setConfigurationItem: setConfigurationItem\n };\n\n var isLocalStorageSupported = null, inMemoryStorage = {}, applicationSettings = {};\n\n function localStorageSupported() {\n if (isLocalStorageSupported == null) {\n var testKey = 'test', storage = window.localStorage;\n try {\n storage.setItem(testKey, '1');\n storage.removeItem(testKey);\n isLocalStorageSupported = true;\n } catch (error) {\n isLocalStorageSupported = false;\n }\n }\n return isLocalStorageSupported;\n }\n\n function getItemFromLocalStorage(key) {\n var rawItem = localStorage.getItem(key);\n\n if (typeof (rawItem) == \"string\")\n return JSON.parse(rawItem);\n\n return rawItem;\n }\n\n function storeItemInLocalStorage(key, item) {\n localStorage.setItem(key, JSON.stringify(item));\n }\n\n function storeItem(key, item) {\n key = \"monsta-setting-\" + key;\n if (localStorageSupported())\n storeItemInLocalStorage(key, item);\n else\n inMemoryStorage[key] = item;\n }\n\n function getItem(key) {\n key = \"monsta-setting-\" + key;\n if (localStorageSupported())\n return getItemFromLocalStorage(key);\n\n return inMemoryStorage[key];\n }\n\n function getConfigurationItem(key) {\n if(getItem(key) == undefined)\n return applicationSettings[key];\n\n return getItem(key);\n }\n\n function getApplicationSettings() {\n return configurationFactory.getSystemConfiguration().then(function (systemVars) {\n applicationSettings = systemVars.applicationSettings;\n }, requestFailure);\n }\n\n function setConfigurationItem(key, item) {\n var keyChanged = getItem(key) != item;\n\n storeItem(key, item);\n\n if(keyChanged)\n $rootScope.$broadcast('configuration:key-changed', key, item);\n }\n\n function requestFailure(response) {\n return $q.reject(response);\n }\n\n return factory;\n }\n}());\n\n","(function () {\n angular.module('MonstaFTP').factory('connectionFactory', connectionFactory);\n\n connectionFactory.$inject = ['$http', 'authenticationFactory'];\n\n function connectionFactory($http, authenticationFactory) {\n var NETWORK_TIMEOUT_SECONDS = 30;\n var IGNORE_TIMEOUT_TYPES = [\n \"downloadMultipleFiles\",\n \"fetchRemoteFile\",\n \"copy\",\n \"extractArchive\",\n \"deleteMultiple\"\n ];\n\n var addRemoteFileRequest = function (request, actionName, remotePath) {\n request['actionName'] = actionName;\n request['context'] = {\n 'remotePath': remotePath\n };\n };\n\n var addSourceDestinationRequest = function (request, actionName, source, destination) {\n request['actionName'] = actionName;\n request['context'] = {\n 'source': source,\n 'destination': destination\n };\n };\n\n return {\n _sendRequest: function (requestBody) {\n var timeout = IGNORE_TIMEOUT_TYPES.indexOf(requestBody.actionName) == -1 ? NETWORK_TIMEOUT_SECONDS * 1000 : null;\n\n var req = {\n method: 'POST',\n url: API_PATH,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n transformRequest: function (obj) {\n var str = [];\n for (var p in obj) {\n if (!obj.hasOwnProperty(p))\n continue;\n str.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(JSON.stringify(obj[p])));\n }\n return str.join(\"&\");\n },\n timeout: timeout,\n data: {\n request: requestBody\n }\n };\n\n if (DEBUG)\n console.log(req);\n\n return $http(req);\n },\n getRequestBody: function () {\n var config = angular.copy(authenticationFactory.getActiveConfiguration());\n\n var defaultsForConnectionType = g_ConnectionDefaults[authenticationFactory.connectionType];\n\n if (defaultsForConnectionType) {\n for (var defaultName in defaultsForConnectionType) {\n if (!defaultsForConnectionType.hasOwnProperty(defaultName))\n continue;\n\n if (config[defaultName] == null || config[defaultName] == undefined || config[defaultName] == '')\n config[defaultName] = defaultsForConnectionType[defaultName];\n }\n }\n\n return {\n connectionType: authenticationFactory.connectionType,\n configuration: config\n };\n },\n getEmptyRequestBody: function () {\n return {connectionType: null, configuration: null};\n },\n getListDirectoryRequest: function (request, path, showHidden) {\n request['actionName'] = 'listDirectory';\n request['context'] = {\n path: path,\n showHidden: showHidden\n };\n },\n getFetchFileRequest: function (request, remotePath) {\n addRemoteFileRequest(request, 'fetchFile', remotePath);\n },\n getMakeDirectoryRequest: function (request, remotePath) {\n addRemoteFileRequest(request, 'makeDirectory', remotePath);\n },\n getDeleteDirectoryRequest: function (request, remotePath) {\n addRemoteFileRequest(request, 'deleteDirectory', remotePath);\n },\n getDeleteFileRequest: function (request, remotePath) {\n addRemoteFileRequest(request, 'deleteFile', remotePath);\n },\n getCopyRequest: function (request, source, destination) {\n addSourceDestinationRequest(request, 'copy', source, destination);\n },\n getRenameRequest: function (request, source, destination) {\n addSourceDestinationRequest(request, 'rename', source, destination);\n },\n getChangePermissionsRequest: function (request, remotePath, mode) {\n addRemoteFileRequest(request, 'changePermissions', remotePath);\n request['context']['mode'] = mode;\n },\n getPutFileContentsRequest: function (request, remotePath, fileContents) {\n request['actionName'] = 'putFileContents';\n request['context'] = {remotePath: remotePath, fileContents: fileContents};\n },\n getGetFileContentsRequest: function (request, remotePath) {\n request['actionName'] = 'getFileContents';\n request['context'] = {remotePath: remotePath};\n },\n getTestConnectAndAuthenticateRequest: function (request) {\n request['actionName'] = 'testConnectAndAuthenticate';\n request['context'] = {}\n },\n getCheckSavedAuthExistsRequest: function (request) {\n request['actionName'] = 'checkSavedAuthExists';\n request['context'] = {};\n },\n getWriteSavedAuthRequest: function (request, password, authData) {\n request['actionName'] = 'writeSavedAuth';\n request['context'] = {\n password: password,\n authData: authData\n };\n },\n getReadSavedAuthRequest: function (request, password) {\n request['actionName'] = 'readSavedAuth';\n request['context'] = {\n password: password\n };\n },\n getReadLicenseRequest: function (request) {\n request['actionName'] = 'readLicense';\n request['context'] = {};\n },\n getGetSystemVarsRequest: function (request) {\n request['actionName'] = 'getSystemVars';\n request['context'] = {};\n },\n getFetchRemoteFileRequest: function (request, remoteSource, destinationDirectory) {\n addSourceDestinationRequest(request, 'fetchRemoteFile', remoteSource, destinationDirectory);\n },\n getDownloadMultipleFilesRequest: function (request, baseDirectory, items) {\n request['actionName'] = 'downloadMultipleFiles';\n request['context'] = {baseDirectory: baseDirectory, items: items};\n },\n getSetApplicationSettingsRequest: function(request, applicationSettings){\n request['actionName'] = 'setApplicationSettings';\n request['context'] = {applicationSettings: applicationSettings};\n },\n getDeleteMultipleRequest: function (request, pathsAndTypes) {\n request['actionName'] = 'deleteMultiple';\n request['context'] = {pathsAndTypes: pathsAndTypes};\n },\n getExtractArchiveRequest: function (request, fileKey, fileIndexOffset, extractCount) {\n request['actionName'] = 'extractArchive';\n request['context'] = {fileKey: fileKey, fileIndexOffset: fileIndexOffset, extractCount: extractCount};\n },\n listDirectory: function (path, showHidden) {\n this.requestBody = this.getRequestBody();\n this.getListDirectoryRequest(this.requestBody, path, showHidden);\n return this._sendRequest(this.requestBody);\n },\n fetchFile: function (path) {\n this.requestBody = this.getRequestBody();\n this.getFetchFileRequest(this.requestBody, path, true);\n return this._sendRequest(this.requestBody);\n },\n rename: function (source, destination) {\n this.requestBody = this.getRequestBody();\n this.getRenameRequest(this.requestBody, source, destination);\n return this._sendRequest(this.requestBody);\n },\n changePermissions: function (path, mode) {\n this.requestBody = this.getRequestBody();\n this.getChangePermissionsRequest(this.requestBody, path, mode);\n return this._sendRequest(this.requestBody);\n },\n copy: function (source, destination) {\n this.requestBody = this.getRequestBody();\n this.getCopyRequest(this.requestBody, source, destination);\n return this._sendRequest(this.requestBody);\n },\n deleteFile: function (path) {\n this.requestBody = this.getRequestBody();\n this.getDeleteFileRequest(this.requestBody, path);\n return this._sendRequest(this.requestBody);\n },\n deleteDirectory: function (path) {\n this.requestBody = this.getRequestBody();\n this.getDeleteDirectoryRequest(this.requestBody, path);\n return this._sendRequest(this.requestBody);\n },\n makeDirectory: function (path) {\n this.requestBody = this.getRequestBody();\n this.getMakeDirectoryRequest(this.requestBody, path);\n return this._sendRequest(this.requestBody);\n },\n getFileContents: function (path) {\n this.requestBody = this.getRequestBody();\n this.getGetFileContentsRequest(this.requestBody, path);\n return this._sendRequest(this.requestBody);\n },\n putFileContents: function (path, contents) {\n this.requestBody = this.getRequestBody();\n this.getPutFileContentsRequest(this.requestBody, path, contents);\n return this._sendRequest(this.requestBody);\n },\n testConnectAndAuthenticate: function () {\n this.requestBody = this.getRequestBody();\n this.getTestConnectAndAuthenticateRequest(this.requestBody);\n return this._sendRequest(this.requestBody);\n },\n checkSavedAuthExists: function () {\n this.requestBody = this.getEmptyRequestBody();\n this.getCheckSavedAuthExistsRequest(this.requestBody);\n return this._sendRequest(this.requestBody);\n }, writeSavedAuth: function (password, authData) {\n this.requestBody = this.getEmptyRequestBody();\n this.getWriteSavedAuthRequest(this.requestBody, password, authData);\n return this._sendRequest(this.requestBody);\n }, readSavedAuth: function (password) {\n this.requestBody = this.getEmptyRequestBody();\n this.getReadSavedAuthRequest(this.requestBody, password);\n return this._sendRequest(this.requestBody);\n }, getLicense: function () {\n this.requestBody = this.getEmptyRequestBody();\n this.getReadLicenseRequest(this.requestBody);\n return this._sendRequest(this.requestBody);\n }, getSystemVars: function () {\n this.requestBody = this.getEmptyRequestBody();\n this.getGetSystemVarsRequest(this.requestBody);\n return this._sendRequest(this.requestBody);\n }, fetchRemoteFile: function (remoteSource, destinationDirectory) {\n this.requestBody = this.getRequestBody();\n this.getFetchRemoteFileRequest(this.requestBody, remoteSource, destinationDirectory);\n return this._sendRequest(this.requestBody);\n }, downloadMultipleFiles: function (baseDirectory, items) {\n this.requestBody = this.getRequestBody();\n this.getDownloadMultipleFilesRequest(this.requestBody, baseDirectory, items);\n return this._sendRequest(this.requestBody);\n }, setApplicationSettings: function(applicationSettings) {\n this.requestBody = this.getRequestBody();\n this.getSetApplicationSettingsRequest(this.requestBody, applicationSettings);\n return this._sendRequest(this.requestBody);\n }, deleteMultiple: function(pathsAndTypes) {\n this.requestBody = this.getRequestBody();\n this.getDeleteMultipleRequest(this.requestBody, pathsAndTypes);\n return this._sendRequest(this.requestBody);\n }, extractArchive: function (fileKey, fileIndexOffset, extractCount) {\n this.requestBody = this.getRequestBody();\n this.getExtractArchiveRequest(this.requestBody, fileKey, fileIndexOffset, extractCount);\n return this._sendRequest(this.requestBody);\n }\n };\n }\n}());","(function () {\n angular.module('MonstaFTP').factory('directorySortingFactory', directorySortingFactory);\n\n function directorySortingFactory() {\n var compareByDirectoryFlag = function (a, b) {\n if (a.isDirectory == b.isDirectory)\n return 0;\n\n return a.isDirectory ? -1 : 1;\n };\n\n var compareByName = function (a, b) {\n var directoryCompare = compareByDirectoryFlag(a, b);\n if (directoryCompare != 0)\n return directoryCompare;\n\n if (a.name.toLowerCase() == b.name.toLowerCase())\n return 0;\n\n return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1;\n };\n\n var compareByModificationDate = function (a, b) {\n var directoryCompare = compareByDirectoryFlag(a, b);\n if (directoryCompare != 0)\n return directoryCompare;\n\n if (a.modificationDate != b.modificationDate)\n return a.modificationDate - b.modificationDate;\n\n return compareByName(a, b);\n };\n\n var compareBySize = function (a, b) {\n var directoryCompare = compareByDirectoryFlag(a, b);\n if (directoryCompare != 0)\n return directoryCompare;\n\n if (a.size != b.size)\n return a.size - b.size;\n\n return compareByName(a, b);\n };\n\n var compareByType = function (a, b) {\n var directoryCompare = compareByDirectoryFlag(a, b);\n if (directoryCompare != 0)\n return directoryCompare;\n\n var aExt = extractFileExtension(a.name), bExt = extractFileExtension(b.name);\n if (aExt != bExt)\n return aExt > bExt ? 1 : -1;\n\n return compareByName(a, b);\n };\n\n return {\n _handleReverse: function (sortedList, reverse) {\n if (reverse)\n sortedList.reverse();\n\n return sortedList;\n },\n sortByName: function (unsortedList, reverse) {\n return this._handleReverse(unsortedList.sort(compareByName), reverse);\n },\n sortByModificationDate: function (unsortedList, reverse) {\n return this._handleReverse(unsortedList.sort(compareByModificationDate), reverse);\n },\n sortBySize: function (unsortedList, reverse) {\n return this._handleReverse(unsortedList.sort(compareBySize), reverse);\n },\n sortByType: function (unsortedList, reverse) {\n return this._handleReverse(unsortedList.sort(compareByType), reverse);\n }\n };\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('DragDropController', DragDropController);\n\n DragDropController.$inject = ['uploadUIFactory', 'jQuery'];\n\n function DragDropController(uploadUIFactory, jQuery) {\n 'use strict';\n var overDrop = false, vm = this, $html = jQuery('html');\n\n vm.handleDropEvent = handleDropEvent;\n\n $html.ready(function () {\n var $fileDrop = jQuery(\"#file-xfer-drop\");\n $html.on('dragenter', function () {\n var $files = jQuery('#files');\n\n $fileDrop.css({\n top: $files.position().top,\n height: $files.height(),\n display: \"table\"\n });\n\n $fileDrop.show();\n });\n\n $html.on('dragend', function () {\n if (overDrop)\n return;\n\n $fileDrop.hide();\n });\n\n $fileDrop.ready(function () {\n $fileDrop.on({\n dragenter: function (e) {\n overDrop = true;\n e.stopPropagation();\n e.preventDefault();\n },\n dragleave: function (e) {\n if (!jQuery.contains($fileDrop, jQuery(e.target)))\n overDrop = false;\n e.stopPropagation();\n e.preventDefault();\n $fileDrop.hide();\n },\n dragover: function (e) {\n e.stopPropagation();\n e.preventDefault();\n },\n drop: function (e) {\n overDrop = false;\n e.stopPropagation();\n e.preventDefault();\n\n var browserEvent = e.originalEvent;\n if (!browserEvent.dataTransfer || !browserEvent.dataTransfer.files)\n return false;\n\n if (!containsFiles(browserEvent))\n return false;\n\n vm.handleDropEvent(browserEvent);\n $fileDrop.hide();\n },\n dragend: function (e) {\n e.stopPropagation();\n e.preventDefault();\n $fileDrop.hide();\n }\n });\n });\n });\n\n function containsFiles(browserEvent) {\n if (browserEvent.dataTransfer.types) {\n for (var i = 0; i < browserEvent.dataTransfer.types.length; i++) {\n if (browserEvent.dataTransfer.types[i] == \"Files\") {\n return true;\n }\n }\n\n return false;\n }\n }\n\n function handleDropEvent(event) {\n debugger;\n\n event.preventDefault();\n\n var items = event.dataTransfer.items;\n\n if (items != undefined)\n uploadUIFactory.handleItemsBasedUpload(items, null);\n else\n uploadUIFactory.handleFilesBasedUpload(event.dataTransfer.files, null);\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('FileBrowserController', FileBrowserController);\n\n\n FileBrowserController.$inject = ['$scope', '$rootScope', 'connectionFactory', 'uiOperationFactory', '$window',\n 'authenticationFactory', 'historyFactory', 'jQuery', '$timeout', 'directorySortingFactory', '$translate',\n 'selectedItemsFactory', 'configurationFactory', 'localConfigurationFactory', 'rowMouseTrackerFactory'];\n\n function FileBrowserController($scope, $rootScope, connectionFactory, uiOperationFactory, $window,\n authenticationFactory, historyFactory, jQuery, $timeout, directorySortingFactory,\n $translate, selectedItemsFactory, configurationFactory, localConfigurationFactory,\n rowMouseTrackerFactory) {\n 'use strict';\n var vm = this, CONTEXT_MENU_X_OFFSET = 7, CONTEXT_MENU_Y_OFFSET = 14, CONTEXT_MENU_INSET = 20,\n systemVars = null, loggedIn = false, editableExtensions = [], currentContextMenu = null;\n\n $scope.directoryList = [];\n $scope.selectedItems = selectedItemsFactory.getSelectedItems();\n $scope.directoriesToDelete = null;\n $scope.filesToDelete = null;\n $scope.isHistoryChangeDir = false;\n $scope.sortName = 'name';\n $scope.sortReversed = false;\n vm.renameSource = null;\n vm.rowDragStartIndex = null;\n vm.isMetaDrag = false;\n vm.previousDragOverIndex = null;\n vm.uiOperationFactory = uiOperationFactory;\n\n vm.didLogout = didLogout;\n vm.doReorder = doReorder;\n vm.cancelDelete = cancelDelete;\n vm.performPaste = performPaste;\n vm.confirmDelete = confirmDelete;\n vm.deleteComplete = deleteComplete;\n vm.downloadSingle = downloadSingle;\n vm.initiateRename = initiateRename;\n vm.changeDirectory = changeDirectory;\n vm.downloadMultiple = downloadMultiple;\n vm.getSelectedPaths = getSelectedPaths;\n vm.initiateMakeItem = initiateMakeItem;\n vm.showDeleteConfirm = showDeleteConfirm;\n vm.sortDirectoryList = sortDirectoryList;\n vm.downloadFileAtPath = downloadFileAtPath;\n vm.fileRenameCallback = fileRenameCallback;\n vm.initiateCutOfPaths = initiateCutOfPaths;\n vm.makeItemOKCallback = makeItemOKCallback;\n vm.handleReorderChange = handleReorderChange;\n vm.initiateCopyOfPaths = initiateCopyOfPaths;\n vm.directoryListSuccess = directoryListSuccess;\n vm.refreshDirectoryList = refreshDirectoryList;\n vm.downloadSelectedFiles = downloadSelectedFiles;\n vm.handleChangeDirectory = handleChangeDirectory;\n vm.makeItemSuccessCallback = makeItemSuccessCallback;\n vm.makeItemFailureCallback = makeItemFailureCallback;\n vm.setupContextMenuEvents = setupContextMenuEvents;\n vm.initiateCutOfSelectedPaths = initiateCutOfSelectedPaths;\n vm.initiateCopyOfSelectedPaths = initiateCopyOfSelectedPaths;\n vm.initiateChmodOfSelectedItems = initiateChmodOfSelectedItems;\n vm.initiateDeleteOfSelectedPaths = initiateDeleteOfSelectedPaths;\n\n vm.rowMouseDown = rowMouseDown;\n vm.rowMouseMove = rowMouseMove;\n vm.rowMouseUp = rowMouseUp;\n vm.rowMouseLeave = rowMouseLeave;\n\n vm.setEditableExtensions = setEditableExtensions;\n vm.itemIsEditable = itemIsEditable;\n vm.navigateUpOneLevel = navigateUpOneLevel;\n vm.showProperties = showProperties;\n vm.handleBodyClick = handleBodyClick;\n\n $scope.reorder = function ($event) {\n vm.handleReorderChange($event.currentTarget.getAttribute('data-sort-name'));\n };\n\n $scope.initiateDeleteOfItem = function (item) {\n var itemPath = uiOperationFactory.joinNameToCurrentDirectory(item.name);\n\n if (item.isDirectory == true) {\n $scope.directoriesToDelete = [itemPath];\n $scope.filesToDelete = null;\n } else {\n $scope.filesToDelete = [itemPath];\n $scope.directoriesToDelete = null;\n }\n\n vm.showDeleteConfirm([item.name]);\n };\n\n $scope.downloadItem = function (item) {\n var fullFilePath = uiOperationFactory.joinNameToCurrentDirectory(item.name);\n vm.downloadFileAtPath(fullFilePath);\n };\n\n $scope.initiateCutOfItem = function (item) {\n var fullFilePath = uiOperationFactory.joinNameToCurrentDirectory(item.name);\n vm.initiateCutOfPaths([fullFilePath]);\n };\n\n $scope.initiateCopyOfItem = function (item) {\n var fullFilePath = uiOperationFactory.joinNameToCurrentDirectory(item.name);\n vm.initiateCopyOfPaths([fullFilePath]);\n };\n\n $scope.editItem = function (item) {\n var fullFilePath = uiOperationFactory.joinNameToCurrentDirectory(item.name);\n $rootScope.$broadcast('file-editor:edit', item.name, fullFilePath);\n };\n\n $scope.initiateRenameOfItem = function (item) {\n vm.renameSource = item.name;\n vm.initiateRename();\n };\n\n $scope.$on('change-directory:on-history', function (ev, path) {\n $scope.isHistoryChangeDir = true;\n vm.handleChangeDirectory(path);\n });\n\n $scope.$on('change-directory', function (ev, path) {\n $scope.isHistoryChangeDir = false;\n vm.handleChangeDirectory(path);\n });\n\n $scope.handleClick = function ($event, index) {\n $event.stopPropagation();\n var item = this.item;\n if (item.isDirectory) {\n var directoryPath = uiOperationFactory.joinNameToCurrentDirectory(item.name);\n vm.changeDirectory(directoryPath);\n } else {\n jQuery($event.target.parentNode.parentNode).find('.context-catcher-button').dropdown('toggle');\n selectedItemsFactory.selectItem(index);\n }\n };\n\n $scope.$on('footer-button-click', function (ev, buttonName) {\n // todo: this doesn't necessarily need to be here as it's a $rootScope.$bc so available anywhere\n switch (buttonName) {\n case 'download':\n vm.downloadSelectedFiles();\n break;\n case 'cut':\n vm.initiateCutOfSelectedPaths();\n break;\n case 'copy':\n vm.initiateCopyOfSelectedPaths();\n break;\n case 'paste':\n vm.performPaste();\n break;\n case 'delete':\n vm.initiateDeleteOfSelectedPaths();\n break;\n case 'new-folder':\n vm.initiateMakeItem('folder');\n break;\n case 'new-file':\n vm.initiateMakeItem('file');\n break;\n case 'chmod':\n vm.initiateChmodOfSelectedItems();\n break;\n default:\n break;\n }\n });\n\n function postLogin() {\n if (systemVars != null && loggedIn == true)\n vm.changeDirectory(authenticationFactory.initialDirectory, true);\n }\n\n $scope.$on('login', function () {\n loggedIn = true;\n postLogin();\n });\n\n $scope.initiateChmodOfItem = function (item) {\n $rootScope.$broadcast('modal-permissions:show', [uiOperationFactory.joinNameToCurrentDirectory(item.name)],\n item.numericPermissions);\n };\n\n $scope.$on('selected-items-changed', function () {\n $scope.selectedItems = selectedItemsFactory.getSelectedItems();\n });\n\n $scope.$on('logout', function () {\n vm.didLogout();\n });\n\n $scope.$on('configuration:key-changed', function (ev, key, value) {\n if (key == 'editableFileExtensions') {\n vm.setEditableExtensions(value);\n }\n });\n\n configurationFactory.getSystemConfiguration().then(systemVarLoadSuccess, systemVarLoadFailure);\n\n function contextMenuStyleForEvent(ev) {\n return {\n position: \"fixed\",\n left: ev.clientX + CONTEXT_MENU_X_OFFSET + \"px\",\n top: ev.clientY + CONTEXT_MENU_Y_OFFSET + \"px\",\n 'margin-left': 0,\n 'margin-top': 0\n };\n }\n\n function fixContextMenuOffScreen(event, $dropdownMenu) {\n if (elementWillExtendPastWindowWidth(event.clientX + CONTEXT_MENU_X_OFFSET, $dropdownMenu))\n $dropdownMenu.css(\"margin-left\", -($dropdownMenu.width() + CONTEXT_MENU_INSET));\n\n if (elementWillExtendPastWindowHeight(event.clientY + CONTEXT_MENU_Y_OFFSET, $dropdownMenu))\n $dropdownMenu.css(\"margin-top\", -($dropdownMenu.height() + CONTEXT_MENU_INSET));\n }\n\n function setupContextMenuEvents() {\n jQuery(\".context-catcher-tr\").contextmenu(function (e) {\n var $tr = jQuery(this);\n var $dropdownMenu = $tr.find('.dropdown-menu').first();\n $dropdownMenu.css(contextMenuStyleForEvent(e));\n\n jQuery(this).find('.context-catcher-button').dropdown('toggle');\n\n fixContextMenuOffScreen(e, $dropdownMenu);\n\n if([\"DIV\", \"TR\", \"TD\"].indexOf(e.target.tagName) == -1)\n selectedItemsFactory.selectItem($tr.data('index'));\n\n return false;\n });\n\n var $fileToobar = jQuery('.file-toolbar');\n\n $fileToobar.on('shown.bs.dropdown', function () {\n var $dropdownMenu = jQuery(this).find('.dropdown-menu');\n currentContextMenu = $dropdownMenu;\n var $dropDownMenuParent = $dropdownMenu.parent().removeClass('dropup');\n\n if ($dropdownMenu.css('position') == 'fixed') // it was shown with rightclick so don't mess with it\n return;\n\n if ($dropdownMenu.offset().top + $dropdownMenu.outerHeight() > jQuery(window).height() - jQuery(\"#footer\").height())\n $dropDownMenuParent.addClass('dropup');\n });\n\n $fileToobar.on('hidden.bs.dropdown', function () {\n var $contextCatcherUl = jQuery(this).find('.dropdown-menu');\n $contextCatcherUl.attr('style', null);\n currentContextMenu = null;\n });\n }\n\n function elementWillExtendPastWindowWidth(xOffset, $element) {\n return xOffset + $element.width() > jQuery(window).width();\n }\n\n function elementWillExtendPastWindowHeight(yOffset, $element) {\n return yOffset + $element.height() > jQuery(window).height()\n }\n\n function doReorder() {\n $scope.directoryList = vm.sortDirectoryList($scope.directoryList, $scope.sortName, $scope.sortReversed);\n }\n\n function handleReorderChange(newSortName) {\n $scope.sortReversed = newSortName == $scope.sortName ? !$scope.sortReversed : false;\n $scope.sortName = newSortName;\n vm.doReorder();\n }\n\n function sortDirectoryList(directoryList, sortName, sortReversed) {\n var sortMethodName = null;\n switch (sortName) {\n case 'name':\n sortMethodName = 'sortByName';\n break;\n case 'modified':\n sortMethodName = 'sortByModificationDate';\n break;\n case 'size':\n sortMethodName = 'sortBySize';\n break;\n case 'type':\n sortMethodName = 'sortByType';\n break;\n default:\n break;\n }\n\n if (sortMethodName == null)\n return directoryList;\n\n return directorySortingFactory[sortMethodName](directoryList, sortReversed);\n }\n\n function directoryListSuccess(path, response, change) {\n $scope.directoryList = vm.sortDirectoryList(response.data.data, $scope.sortName, $scope.sortReversed);\n uiOperationFactory.currentDirectory = path;\n selectedItemsFactory.clearSelection();\n\n if (change) {\n if (!$scope.isHistoryChangeDir)\n historyFactory.addEntry(uiOperationFactory.currentDirectory);\n $scope.isHistoryChangeDir = false;\n $rootScope.$broadcast('directory-changed', path);\n authenticationFactory.initialDirectory = path;\n authenticationFactory.saveSettings();\n }\n $timeout(function () {\n vm.setupContextMenuEvents();\n //DOM has finished rendering\n });\n }\n\n function changeDirectory(path, isFirstLoad) {\n localConfigurationFactory.getApplicationSettings().then(\n function () {\n connectionFactory.listDirectory(path, localConfigurationFactory.getConfigurationItem('showDotFiles')).then(\n function (response) {\n vm.directoryListSuccess(path, response, path != uiOperationFactory.currentDirectory);\n },\n function (response) {\n if (isFirstLoad)\n vm.changeDirectory(\"/\");\n else\n showResponseError(response, 'directory change', $rootScope, $translate);\n }\n );\n },\n function (response) {\n showResponseError(response, 'application settings load', $rootScope, $translate);\n });\n }\n\n function refreshDirectoryList() {\n vm.changeDirectory(uiOperationFactory.currentDirectory);\n }\n\n function filesReadyForDownloadCallback(response) {\n if (responseIsUnsuccessful(response)) {\n showResponseError(response, 'file download', $rootScope, $translate);\n return;\n }\n\n var fileKey = response.data.fileKey;\n $window.location = DOWNLOAD_PATH + '?fileKey=' + fileKey;\n }\n\n function fileFetchFailureCallback(response) {\n showResponseError(response, 'file download', $rootScope, $translate);\n $rootScope.$broadcast('modal-prompt:clear-busy');\n }\n\n function downloadFileAtPath(path) {\n connectionFactory.fetchFile(path).then(filesReadyForDownloadCallback, fileFetchFailureCallback);\n }\n\n function downloadMultiple() {\n var selectedItems = selectedItemsFactory.getSelectedItems();\n var itemNames = [];\n\n selectedItems.map(function (itemIndex) {\n itemNames.push($scope.directoryList[itemIndex].name);\n });\n\n connectionFactory.downloadMultipleFiles(uiOperationFactory.currentDirectory, itemNames).then(\n filesReadyForDownloadCallback, fileFetchFailureCallback);\n }\n\n function downloadSingle() {\n var fullFilePath = uiOperationFactory.joinNameToCurrentDirectory(\n $scope.directoryList[selectedItemsFactory.getSelectedItems()[0]].name);\n vm.downloadFileAtPath(fullFilePath);\n }\n\n function downloadSelectedFiles() {\n var selectedItems = selectedItemsFactory.getSelectedItems();\n if (selectedItems.length > 1 || $scope.directoryList[selectedItems[0]].isDirectory) {\n vm.downloadMultiple();\n } else {\n vm.downloadSingle();\n }\n }\n\n function getSelectedPaths() {\n var selectedPathCopy = selectedItemsFactory.getSelectedItems().slice();\n selectedPathCopy.sort(function (a, b) {\n return a - b;\n });\n return selectedPathCopy.map(function (pathIndex) {\n return uiOperationFactory.joinNameToCurrentDirectory($scope.directoryList[pathIndex].name);\n });\n }\n\n function initiateCopyOfPaths(paths) {\n if (paths.length == 0)\n return;\n\n uiOperationFactory.setCopySource(paths);\n }\n\n function initiateCutOfPaths(paths) {\n if (paths.length == 0)\n return;\n\n uiOperationFactory.setCutSource(paths);\n }\n\n function initiateCutOfSelectedPaths() {\n vm.initiateCutOfPaths(vm.getSelectedPaths());\n }\n\n function initiateCopyOfSelectedPaths() {\n vm.initiateCopyOfPaths(vm.getSelectedPaths());\n }\n\n function performPaste() {\n if (uiOperationFactory.cutSource == null && uiOperationFactory.copySource == null)\n return;\n\n var sourcePaths, operation;\n\n if (uiOperationFactory.cutSource != null) {\n sourcePaths = uiOperationFactory.cutSource;\n operation = 'rename';\n } else {\n sourcePaths = uiOperationFactory.copySource;\n operation = 'copy';\n }\n\n for (var pathIndex = 0; pathIndex < sourcePaths.length; ++pathIndex) {\n var sourcePath = sourcePaths[pathIndex];\n var splitSourceFileName = sourcePath.split('/');\n var sourceFileName = splitSourceFileName[splitSourceFileName.length - 1];\n var destinationPath = uiOperationFactory.joinNameToCurrentDirectory(sourceFileName);\n connectionFactory[operation](sourcePath, destinationPath).then(function () {\n uiOperationFactory.pasteComplete();\n vm.changeDirectory(uiOperationFactory.currentDirectory);\n if (operation == 'rename')\n $rootScope.$broadcast('items-moved', [[sourcePath, destinationPath]]);\n }, function (response) {\n showResponseError(response, 'file paste', $rootScope, $translate);\n });\n }\n }\n\n function deleteComplete() {\n var allItems = [].concat($scope.directoriesToDelete || [], $scope.filesToDelete || []);\n\n $rootScope.$broadcast(\"items-deleted\", allItems);\n\n $scope.directoriesToDelete = null;\n $scope.filesToDelete = null;\n vm.changeDirectory(uiOperationFactory.currentDirectory);\n }\n\n function confirmDelete() {\n var itemsToDelete = [];\n\n if ($scope.filesToDelete != null) {\n $scope.filesToDelete.map(function (path) {\n if (uiOperationFactory.isCutOrCopySource(path))\n uiOperationFactory.clearCutAndCopySource();\n\n itemsToDelete.push([path, false]);\n });\n }\n\n if ($scope.directoriesToDelete != null) {\n $scope.directoriesToDelete.map(function (path) {\n if (uiOperationFactory.isCutOrCopySource(path))\n uiOperationFactory.clearCutAndCopySource();\n\n itemsToDelete.push([path, true]);\n });\n }\n connectionFactory.deleteMultiple(itemsToDelete).then(function () {\n vm.deleteComplete();\n }, function (response) {\n showResponseError(response, 'item deletion', $rootScope, $translate);\n vm.deleteComplete();\n });\n\n /*\n the inner function is needed for testing instead of calling connectionFactory.deleteFile directly in the map\n because the function is actually called with 3 args (item, index, arr) and the real function discards the\n second 2. the spy object doesn't know this so thinks its being called wrong\n */\n }\n\n function cancelDelete() {\n $scope.filesToDelete = null;\n $scope.directoriesToDelete = null;\n }\n\n function showTranslatedDeleteConfirm(translatedMessage) {\n $rootScope.$broadcast('modal-confirm:show', translatedMessage, vm.confirmDelete, vm.cancelDelete);\n }\n\n function showDeleteConfirm(fileNames) {\n $translate('DELETE_CONFIRM_MESSAGE', {\n item_count: fileNames.length\n }).then(function (translatedMessage) {\n showTranslatedDeleteConfirm(translatedMessage);\n }, function (message) {\n showTranslatedDeleteConfirm(message);\n });\n }\n\n function initiateDeleteOfSelectedPaths() {\n var selectedItems = selectedItemsFactory.getSelectedItems();\n if (selectedItems.length == 0)\n return;\n\n var fileNames = [];\n\n $scope.directoriesToDelete = [];\n $scope.filesToDelete = [];\n\n for (var i = 0; i < selectedItems.length; ++i) {\n var itemIndex = selectedItems[i];\n var item = $scope.directoryList[itemIndex];\n\n fileNames.push(item.name);\n\n var fullPath = uiOperationFactory.joinNameToCurrentDirectory(item.name);\n\n if (item.isDirectory)\n $scope.directoriesToDelete.push(fullPath);\n else\n $scope.filesToDelete.push(fullPath);\n }\n\n vm.showDeleteConfirm(fileNames);\n }\n\n function clearNewItemTempVars() {\n vm.newItemPath = null;\n $scope.makeItemType = null;\n }\n\n function makeItemSuccessCallback() {\n $rootScope.$broadcast('modal-prompt:hide');\n vm.refreshDirectoryList();\n\n if ($scope.makeItemType == 'folder') {\n clearNewItemTempVars();\n return;\n }\n\n localConfigurationFactory.getApplicationSettings().then(function () {\n var shouldEditItem = localConfigurationFactory.getConfigurationItem('editNewFilesImmediately');\n if (shouldEditItem && vm.itemIsEditable(false, vm.newItemPath)) {\n var splitPath = vm.newItemPath.split('/');\n $rootScope.$broadcast('file-editor:edit', splitPath[splitPath.length - 1], vm.newItemPath);\n }\n clearNewItemTempVars();\n }, function (response) {\n clearNewItemTempVars();\n showResponseError(response, 'rename', $rootScope, $translate);\n });\n }\n\n function makeItemFailureCallback(errorMessage, context) {\n $rootScope.$broadcast('modal-prompt:clear-busy');\n $translate(['NEW_ITEM_FAILURE_PRECEDING_MESSAGE', errorMessage], context).then(function (translations) {\n displayPromptError(translations['NEW_ITEM_FAILURE_PRECEDING_MESSAGE'] + ' ' +\n translations[errorMessage])\n });\n }\n\n function getFileNameError(fileName) {\n if (!validateFileNameNonEmpty(fileName))\n return 'FILE_NAME_EMPTY_MESSAGE';\n\n if (!validateFileNameContainsNoSlash(fileName))\n return 'FILE_NAME_CONTAINS_SLASH_MESSAGE';\n\n return null;\n }\n\n function translateAndDisplayPromptError(promptErrorID, context) {\n $translate(promptErrorID, context).then(displayPromptError, displayPromptError);\n\n }\n\n function makeItemOKCallback(itemName) {\n $rootScope.$broadcast('modal-prompt:clear-error');\n\n var itemNameError = getFileNameError(itemName);\n\n if (itemNameError != null) {\n translateAndDisplayPromptError(itemNameError, {item_type: $scope.makeItemType});\n return;\n }\n\n vm.newItemPath = uiOperationFactory.joinNameToCurrentDirectory(itemName);\n\n $rootScope.$broadcast('modal-prompt:set-busy', 'CREATING_ACTIVITY_STATUS');\n\n var promise;\n if ($scope.makeItemType == 'folder')\n promise = connectionFactory.makeDirectory(vm.newItemPath);\n else if ($scope.makeItemType == 'file')\n promise = connectionFactory.putFileContents(vm.newItemPath, '');\n\n promise.then(function () {\n vm.makeItemSuccessCallback();\n }, function (response) {\n var action = $scope.makeItemType + ' make';\n vm.makeItemFailureCallback(parseErrorResponse(response, action), {action: action});\n });\n }\n\n function initiateMakeItem(itemType) {\n $scope.makeItemType = itemType;\n var ucItemType = $scope.makeItemType.capitalizeFirstLetter();\n\n $translate(['NEW_ITEM_PROMPT_TITLE', 'NEW_ITEM_NAME_PLACEHOLDER'], {item_type: ucItemType}).then(\n function (translations) {\n $rootScope.$broadcast('modal-prompt:show', translations.NEW_ITEM_PROMPT_TITLE, '',\n translations.NEW_ITEM_NAME_PLACEHOLDER, vm.makeItemOKCallback);\n });\n }\n\n function initiateChmodOfSelectedItems() {\n if ($scope.selectedItems.length == 0)\n return;\n\n var itemPaths = [], numericPerms = -1;\n\n $scope.selectedItems.map(function (itemIndex) {\n var item = $scope.directoryList[itemIndex];\n itemPaths.push(uiOperationFactory.joinNameToCurrentDirectory(item.name));\n if (numericPerms == -1)\n numericPerms = item.numericPermissions;\n else if (item.numericPermissions != numericPerms)\n numericPerms = 0;\n });\n\n $rootScope.$broadcast('modal-permissions:show', itemPaths, numericPerms);\n }\n\n function displayPromptError(error) {\n $rootScope.$broadcast('modal-prompt:set-error', error);\n }\n\n function fileRenameCallback(finalValue, initialValue) {\n $rootScope.$broadcast('modal-prompt:clear-error');\n\n if (initialValue == finalValue)\n return;\n\n var itemNameError = getFileNameError(finalValue);\n\n if (itemNameError != null) {\n translateAndDisplayPromptError(itemNameError, {item_type: 'item'});\n return;\n }\n\n $rootScope.$broadcast('modal-prompt:set-busy', 'RENAMING_ACTIVITY_STATUS');\n\n var sourcePath = uiOperationFactory.joinNameToCurrentDirectory(initialValue);\n var destinationPath = uiOperationFactory.joinNameToCurrentDirectory(finalValue);\n connectionFactory.rename(sourcePath, destinationPath).then(\n function (response) {\n $rootScope.$broadcast('modal-prompt:clear-busy');\n if (responseIsUnsuccessful(response)) {\n showResponseError(response, 'rename', $rootScope, $translate);\n return;\n }\n vm.refreshDirectoryList();\n $rootScope.$broadcast('items-moved', [[sourcePath, destinationPath]]);\n $rootScope.$broadcast('modal-prompt:hide');\n },\n function (response) {\n $rootScope.$broadcast('modal-prompt:clear-busy');\n showResponseError(response, 'rename', $rootScope, $translate);\n }\n );\n vm.renameSource = null;\n }\n\n function showRenamePrompt(translations) {\n $rootScope.$broadcast('modal-prompt:show', translations.RENAME_FILE_PROMPT_TITLE, vm.renameSource,\n translations.RENAME_FILE_NAME_PLACEHOLDER, vm.fileRenameCallback);\n }\n\n function initiateRename() {\n $translate(['RENAME_FILE_PROMPT_TITLE', 'RENAME_FILE_NAME_PLACEHOLDER']).then(showRenamePrompt,\n showRenamePrompt);\n }\n\n function handleChangeDirectory(path) {\n if (path == uiOperationFactory.currentDirectory)\n return;\n if (typeof path == 'undefined' || path == null)\n path = uiOperationFactory.currentDirectory;\n vm.changeDirectory(path);\n }\n\n function didLogout() {\n uiOperationFactory.currentDirectory = null;\n authenticationFactory.initialDirectory\n $scope.directoryList = [];\n historyFactory.clearHistory();\n }\n\n function systemVarLoadSuccess(vars) {\n systemVars = vars;\n vm.setEditableExtensions(configurationFactory.getApplicationSetting('editableFileExtensions'));\n postLogin();\n }\n\n function systemVarLoadFailure(response) {\n showResponseError(response, \"system var load\", $rootScope, $translate);\n }\n\n function setEditableExtensions(editableExtensionStr) {\n var splitExtensions = editableExtensionStr.split(\",\");\n editableExtensions = [];\n for (var i = 0; i < splitExtensions.length; ++i) {\n var trimmedExtension = splitExtensions[i].trim().toLowerCase();\n\n if (trimmedExtension != '')\n editableExtensions.push(trimmedExtension);\n }\n }\n\n function itemIsEditable(isDirectory, itemPath) {\n if (isDirectory)\n return false;\n\n var splitPath = itemPath.split('/');\n var itemName = splitPath[splitPath.length - 1];\n var extension = extractFileExtension(itemName);\n\n if (extension == '')\n return true;\n\n return editableExtensions.indexOf(extension) != -1;\n }\n\n function navigateUpOneLevel() {\n vm.changeDirectory(parentPath(uiOperationFactory.currentDirectory), false);\n }\n\n function showProperties(item) {\n $rootScope.$broadcast('modal-properties:show', item);\n }\n\n function handleBodyClick($event) {\n if ($event.which == 3 && $event.target.id == \"files\") {// right click\n $scope.hasPasteSource = uiOperationFactory.cutSource != null || uiOperationFactory.copySource != null;\n\n if (currentContextMenu)\n currentContextMenu.dropdown('toggle');\n\n var $extraDropdownButton = jQuery('#extras-dropdown-button');\n\n $extraDropdownButton.dropdown('toggle');\n var $dropdownMenu = jQuery('#extras-dropdown');\n $dropdownMenu.css(contextMenuStyleForEvent($event));\n\n fixContextMenuOffScreen($event, $dropdownMenu);\n\n return false;\n }\n }\n\n function rowMouseDown($event) {\n rowMouseTrackerFactory.mouseDown($event);\n }\n\n function rowMouseMove($event, $index) {\n rowMouseTrackerFactory.mouseMove($event, $index);\n }\n\n function rowMouseUp($index) {\n rowMouseTrackerFactory.mouseUp($index);\n }\n\n function rowMouseLeave($event) {\n rowMouseTrackerFactory.mouseLeave($event);\n }\n }\n}());","(function(){\n angular.module('MonstaFTP').factory('rowMouseTrackerFactory', rowMouseTrackerFactory);\n\n rowMouseTrackerFactory.$inject = ['selectedItemsFactory'];\n\n function rowMouseTrackerFactory(selectedItemsFactory) {\n var factory = {}, mouseIsDown = false, mouseMovedWhileDown = false, mouseDownEvent,\n rowClickTargetElementNames = ['DIV', 'TR', 'TD'], rowDragStartIndex = null, isMetaDrag = false;\n\n factory.mouseDown = mouseDown;\n factory.mouseUp = mouseUp;\n factory.mouseMove = mouseMove;\n factory.mouseLeave = mouseLeave;\n\n factory.mouseClick = mouseClick;\n factory.mouseDrag = mouseDrag;\n factory.startDrag = startDrag;\n\n function mouseDown($event) {\n mouseIsDown = true;\n mouseDownEvent = $event;\n mouseMovedWhileDown = false;\n }\n\n function mouseUp(rowIndex) {\n if (mouseIsDown && !mouseMovedWhileDown) {\n factory.mouseClick(mouseDownEvent, rowIndex);\n }\n mouseIsDown = false;\n rowDragStartIndex = null;\n }\n\n function mouseMove($event, rowIndex) {\n if(mouseIsDown) {\n mouseMovedWhileDown = true;\n if(rowDragStartIndex == rowIndex)\n return;\n\n if (rowDragStartIndex == null)\n factory.startDrag($event, rowIndex);\n else\n factory.mouseDrag(rowIndex);\n\n rowDragStartIndex = rowIndex;\n }\n }\n\n function mouseLeave($event) {\n if (rowClickTargetElementNames.indexOf($event.target.tagName) != -1)\n return true;\n\n rowDragStartIndex = null;\n }\n\n function mouseDrag(rowIndex) {\n if (isMetaDrag)\n selectedItemsFactory.metaDraggedToIndex(rowIndex);\n else\n selectedItemsFactory.draggedToIndex(rowIndex);\n }\n\n function mouseClick($event, itemIndex) {\n if (rowClickTargetElementNames.indexOf($event.target.tagName) == -1)\n return true;\n $event.preventDefault();\n if ($event.ctrlKey || $event.metaKey)\n selectedItemsFactory.metaClickAtIndex(itemIndex);\n else if ($event.shiftKey)\n selectedItemsFactory.shiftClickAtIndex(itemIndex);\n else\n selectedItemsFactory.standardClickAtIndex(itemIndex);\n }\n\n function startDrag($event, rowIndex) {\n if ($event.metaKey || $event.ctrlKey) {\n isMetaDrag = true;\n selectedItemsFactory.startMetaDraggingAtIndex(rowIndex);\n } else {\n isMetaDrag = false;\n selectedItemsFactory.startDraggingAtIndex(rowIndex);\n }\n }\n\n return factory;\n }\n}());","(function () {\n angular.module('MonstaFTP').factory('selectedItemsFactory', selectedItemsFactory);\n\n selectedItemsFactory.$inject = ['$rootScope'];\n\n function selectedItemsFactory($rootScope) {\n var selectedItems = [];\n var initialSelectedIndex = 0;\n var dragStartIndex = 0;\n var metaDragStartIndex = 0;\n var metaSelectedItems;\n\n var factory = {\n getSelectedItems: getSelectedItems,\n standardClickAtIndex: standardClickAtIndex,\n shiftClickAtIndex: shiftClickAtIndex,\n metaClickAtIndex: metaClickAtIndex,\n clearSelection: clearSelection,\n startDraggingAtIndex: startDraggingAtIndex,\n draggedToIndex: draggedToIndex,\n startMetaDraggingAtIndex: startMetaDraggingAtIndex,\n metaDraggedToIndex: metaDraggedToIndex,\n selectItem: selectItem\n };\n\n function generateRange(start, stop) {\n if (start == stop)\n return [start];\n\n var delta = 1;\n\n if (start > stop)\n delta = -1;\n\n var range = [start];\n\n do {\n start += delta;\n range.push(start);\n } while(start != stop);\n\n return range;\n }\n\n function getSelectedItems() {\n return selectedItems;\n }\n\n function standardClickAtIndex(index) {\n if(selectedItems.length == 1 && selectedItems[0] == index) {\n selectedItems = [];\n broadcastSelectionChange();\n return;\n }\n\n if(selectedItems.indexOf(index) == -1 || selectedItems.length > 1) {\n // this is just for speed, we could do the below all the time but will be a little fast to skip it\n // unless it's actually necessary\n selectedItems = [index];\n initialSelectedIndex = index;\n broadcastSelectionChange();\n }\n }\n\n function shiftClickAtIndex(index) {\n if(selectedItems.length != 1 || selectedItems.indexOf(index) == -1) {\n selectedItems = generateRange(initialSelectedIndex, index);\n broadcastSelectionChange();\n }\n }\n\n function metaClickAtIndex(index) {\n var indexOfIndex = selectedItems.indexOf(index);\n\n if(indexOfIndex == -1)\n selectedItems.push(index);\n else\n selectedItems.splice(indexOfIndex, 1);\n broadcastSelectionChange();\n }\n\n function clearSelection() {\n selectedItems = [];\n broadcastSelectionChange();\n }\n\n function startDraggingAtIndex(index) {\n clearSelection();\n dragStartIndex = index;\n selectedItems = [index];\n broadcastSelectionChange();\n }\n\n function draggedToIndex(index) {\n selectedItems = generateRange(dragStartIndex, index);\n broadcastSelectionChange();\n }\n\n function startMetaDraggingAtIndex(index){\n metaDragStartIndex = index;\n metaSelectedItems = angular.copy(selectedItems);\n }\n\n function metaDraggedToIndex(index) {\n var newSelectedItems = angular.copy(metaSelectedItems),\n lowerBound = Math.min(index, metaDragStartIndex),\n upperBound = Math.max(index, metaDragStartIndex);\n\n for(; lowerBound <= upperBound; ++lowerBound){\n var indexOfIndex = metaSelectedItems.indexOf(lowerBound);\n\n if(indexOfIndex == -1)\n newSelectedItems.push(lowerBound);\n else\n newSelectedItems.splice(newSelectedItems.indexOf(lowerBound), 1);\n }\n\n selectedItems = newSelectedItems;\n broadcastSelectionChange();\n }\n\n function selectItem(index) {\n selectedItems = [index];\n broadcastSelectionChange();\n }\n\n function broadcastSelectionChange() {\n $rootScope.$broadcast('selected-items-changed');\n }\n\n return factory;\n }\n}());\n\n\n","(function () {\n angular.module('MonstaFTP').controller('FileEditorController', FileEditorController);\n\n FileEditorController.$inject = ['$scope', '$rootScope', 'connectionFactory', 'jQuery', 'licenseFactory',\n 'codeMirrorFactory', '$translate', 'uiOperationFactory', 'configurationFactory'];\n\n function FileEditorController($scope, $rootScope, connectionFactory, jQuery, licenseFactory, codeMirrorFactory,\n $translate, uiOperationFactory, configurationFactory) {\n 'use strict';\n $scope.editorFiles = [];\n $scope.activeFile = null;\n $scope.pathOfTabToRemove = null;\n $scope.licenseFactory = licenseFactory;\n $scope.settings = {autoSave: false};\n\n var modalFileEditorId = '#modal-editor', vm = this, autoSaveTimeout = null, $filePickerMenu = null;\n\n vm.savedDirectories = [];\n vm.hideProUpgradeMessages = false;\n\n vm.show = show;\n vm.hide = hide;\n vm.setupAdvancedEditor = setupAdvancedEditor;\n vm.startEditingFile = startEditingFile;\n vm.ensureFileInScope = ensureFileInScope;\n vm.getFileIndexByPath = getFileIndexByPath;\n vm.filePathIsInScope = filePathIsInScope;\n vm.getEditorFileByPath = getEditorFileByPath;\n vm.updateFileContents = updateFileContents;\n vm.loadFileContents = loadFileContents;\n vm.removeFile = removeFile;\n vm.initiateConfirmTabClose = initiateConfirmTabClose;\n vm.confirmTabClose = confirmTabClose;\n vm.cancelTabClose = cancelTabClose;\n vm.contentPutFinish = contentPutFinish;\n vm.beginAutosave = beginAutosave;\n vm.fileListClick = fileListClick;\n vm.shouldShowProUpgrade = shouldShowProUpgrade;\n vm.itemsMoved = itemsMoved;\n\n $scope.activateTab = function (filePath, $event) {\n if ($event.target.tagName == 'BUTTON')\n return;\n\n $scope.activeFile = vm.getEditorFileByPath(filePath);\n\n if ($filePickerMenu != null)\n $filePickerMenu.removeClass('open')\n };\n\n $scope.closeTabForFile = function (fileName, filePath) {\n var file = vm.getEditorFileByPath(filePath);\n if (!file.dirty) {\n vm.removeFile(filePath);\n return false;\n }\n\n vm.initiateConfirmTabClose(fileName, filePath);\n return false;\n };\n\n $scope.textChange = function (filePath) {\n var file = vm.getEditorFileByPath(filePath);\n if (file == null)\n return;\n\n file.dirty = true;\n\n vm.beginAutosave.call(vm);\n };\n\n $scope.saveActiveFile = function () {\n if ($scope.activeFile == null)\n return;\n $scope.activeFile.saving = true;\n var path = $scope.activeFile.path, contents = $scope.activeFile.contents;\n connectionFactory.putFileContents(path, contents).then(function () {\n vm.contentPutFinish(path, true);\n }, function (response) {\n vm.contentPutFinish(path, false);\n showResponseError(response, 'file save', $rootScope, $translate);\n });\n };\n\n $scope.$on('file-editor:edit', function (ev, fileName, filePath) {\n vm.startEditingFile(fileName, filePath);\n vm.show();\n });\n\n $scope.$on('file-editor:show', function () {\n vm.show();\n });\n\n $scope.$on('logout', function () {\n $scope.editorFiles = [];\n $scope.activeFile = null;\n });\n\n $scope.$on('items-deleted', function (ev, deletedItems) {\n vm.itemsMoved(deletedItems);\n });\n\n $scope.$on('items-moved', function (ev, movedItems) {\n var moveSources = [];\n\n for(var i = 0; i < movedItems.length; ++i)\n moveSources.push(movedItems[i][0])\n\n vm.itemsMoved(moveSources);\n });\n\n function show() {\n vm.hideProUpgradeMessages = configurationFactory.getApplicationSetting('hideProUpgradeMessages');\n vm.savedDirectories = [];\n jQuery(modalFileEditorId).modal('show');\n }\n\n function hide() {\n if (vm.savedDirectories.indexOf(uiOperationFactory.currentDirectory) != -1)\n $rootScope.$broadcast('change-directory'); // refresh directory list if there was a save in current dir\n\n $rootScope.$broadcast('file-editor:hide', $scope.editorFiles.length);\n jQuery(modalFileEditorId).modal('hide');\n }\n\n function setupAdvancedEditor(fileName, filePath) {\n var codeMode = codeMirrorFactory.convertFilenameToMode(fileName);\n window.setTimeout(function () {\n if (codeMode != null) {\n var editorItem = vm.getEditorFileByPath(filePath);\n\n if (editorItem.cmSetup == true)\n return;\n\n var textAreaId = \"editor_ta_\" + filePath;\n codeMirrorFactory.initiateCodeMirror(codeMode, document.getElementById(textAreaId), function (cm) {\n editorItem.cmSetup = true;\n editorItem.cm = cm;\n cm.on('change', function (cMirror) {\n editorItem.contents = cMirror.getValue();\n $scope.textChange(editorItem.path);\n });\n });\n }\n }, 0);\n }\n\n function startEditingFile(fileName, filePath) {\n vm.ensureFileInScope(fileName, filePath, function () {\n $scope.activeFile = vm.getEditorFileByPath(filePath);\n if (licenseFactory.isLicensed())\n vm.setupAdvancedEditor(fileName, filePath);\n });\n }\n\n function ensureFileInScope(fileName, filePath, contentsLoadedCallback) {\n if (vm.filePathIsInScope(filePath)) {\n if (contentsLoadedCallback)\n contentsLoadedCallback();\n return true;\n }\n\n var editorFile = {\n name: fileName,\n path: filePath,\n contents: null,\n dirty: false,\n saving: false,\n cmSetup: false,\n cm: null\n };\n\n if (licenseFactory.isLicensed())\n $scope.editorFiles.push(editorFile);\n else\n $scope.editorFiles = [editorFile];\n\n vm.loadFileContents(filePath, contentsLoadedCallback);\n return false;\n }\n\n function getFileIndexByPath(filePath) {\n for (var fileIndex = 0; fileIndex < $scope.editorFiles.length; ++fileIndex)\n if ($scope.editorFiles[fileIndex].path == filePath)\n return fileIndex;\n\n return null;\n }\n\n function filePathIsInScope(filePath) {\n return vm.getFileIndexByPath(filePath) != null;\n }\n\n function getEditorFileByPath(filePath) {\n var fileIndex = vm.getFileIndexByPath(filePath);\n return fileIndex == null ? null : $scope.editorFiles[fileIndex];\n }\n\n function updateFileContents(filePath, fileContents) {\n var file = vm.getEditorFileByPath(filePath);\n if (file == null)\n return;\n file.contents = fileContents;\n }\n\n function loadFileContents(filePath, contentsLoadedCallback) {\n var file = vm.getEditorFileByPath(filePath);\n if (file == null)\n return;\n\n connectionFactory.getFileContents(filePath).then(\n function (response) {\n vm.updateFileContents(filePath, response.data.data);\n if (contentsLoadedCallback)\n contentsLoadedCallback();\n }, function (response) {\n showResponseError(response, 'file load', $rootScope, $translate);\n });\n }\n\n function removeFile(filePath) {\n var fileIndex = vm.getFileIndexByPath(filePath);\n if (fileIndex == null)\n return;\n\n var closingFiles = $scope.editorFiles.splice(fileIndex, 1);\n\n if (closingFiles.length && closingFiles[0].cm) {\n closingFiles[0].cm.toTextArea();\n closingFiles[0].cm = null;\n }\n\n if ($scope.editorFiles.length == 0) {\n $scope.activeFile = null;\n vm.hide();\n return;\n }\n\n var newFileIndex = Math.min(fileIndex, $scope.editorFiles.length - 1);\n $scope.activeFile = $scope.editorFiles[newFileIndex];\n }\n\n\n function showTabCloseConfirm(confirmMessage) {\n $rootScope.$broadcast('modal-confirm:show', confirmMessage, vm.confirmTabClose, vm.cancelTabClose);\n }\n\n function initiateConfirmTabClose(fileName, filePath) {\n $scope.pathOfTabToRemove = filePath;\n $translate('EDITOR_CLOSE_CONFIRM_MESSAGE', {file_name: fileName}).then(showTabCloseConfirm,\n showTabCloseConfirm);\n }\n\n function confirmTabClose() {\n vm.removeFile($scope.pathOfTabToRemove);\n $scope.pathOfTabToRemove = null;\n }\n\n function cancelTabClose() {\n $scope.pathOfTabToRemove = null;\n }\n\n function contentPutFinish(filePath, success) {\n var file = vm.getEditorFileByPath(filePath);\n if (file == null)\n return;\n\n file.saving = false;\n if (success) {\n file.dirty = false;\n var dirName = filePath.replace(/\\\\/g, '/').replace(/\\/[^\\/]*\\/?$/, '');\n if (dirName == '')\n dirName = '/';\n if (vm.savedDirectories.indexOf(dirName) == -1)\n vm.savedDirectories.push(dirName);\n }\n }\n\n function beginAutosave() {\n if (!$scope.settings.autoSave)\n return;\n\n if (autoSaveTimeout)\n window.clearTimeout(autoSaveTimeout);\n\n autoSaveTimeout = window.setTimeout(function () {\n autoSaveTimeout = null;\n $scope.saveActiveFile();\n }, AUTOSAVE_DELAY_MS);\n }\n\n function fileListClick($event) {\n if ($filePickerMenu == null) {\n $filePickerMenu = jQuery($event.target).parent();\n\n if ($event.target.tagName == \"I\")\n $filePickerMenu = $filePickerMenu.parent();\n }\n\n $filePickerMenu.toggleClass('open');\n }\n\n function shouldShowProUpgrade() {\n if (vm.hideProUpgradeMessages === true)\n return false;\n\n return !licenseFactory.isLicensed();\n }\n\n function itemsMoved(deletedItems) {\n // this really means the item is no longer where we expected it (moved, renamed or deleted)\n var pathsToRemove = [];\n for (var deletedPathIndex = 0; deletedPathIndex < deletedItems.length; ++deletedPathIndex) {\n var deletedPath = deletedItems[deletedPathIndex];\n\n if (deletedPath.length == 0)\n continue;\n\n var deletedPathAsDirectory = deletedPath.substr(deletedPath.length - 1) == \"/\" ? deletedPath : (deletedPath + \"/\");\n\n for (var editorFileIndex = 0; editorFileIndex < $scope.editorFiles.length; ++editorFileIndex) {\n var editorFile = $scope.editorFiles[editorFileIndex];\n if (deletedPath == editorFile.path)\n pathsToRemove.push(editorFile.path);\n else {\n if(editorFile.path.length <= deletedPathAsDirectory.length )\n continue;\n\n if(editorFile.path.substr(0, deletedPathAsDirectory.length) == deletedPathAsDirectory)\n pathsToRemove.push(editorFile.path);\n }\n\n }\n }\n\n for(var removeIndex = 0; removeIndex < pathsToRemove.length; ++removeIndex) {\n vm.removeFile(pathsToRemove[removeIndex], true);\n }\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('FooterController', FooterController);\n\n FooterController.$inject = ['$scope', '$rootScope', 'uiOperationFactory', 'connectionFactory',\n 'authenticationFactory', 'uploadUIFactory', '$translate', 'selectedItemsFactory', 'configurationFactory'];\n\n function FooterController($scope, $rootScope, uiOperationFactory, connectionFactory,\n authenticationFactory, uploadUIFactory, $translate, selectedItemsFactory,\n configurationFactory) {\n var vm = this, actionsRequiringSelection = ['chmod', 'cut', 'copy', 'download'];\n\n vm.isArchiveUpload = false;\n\n $scope.selectedItemsCount = 0;\n $scope.hasPasteSource = false;\n $scope.maxUploadBytes = MAX_UPLOAD_BYTES;\n $scope.currentUsername = null;\n $scope.currentHost = null;\n $scope.currentVersion = 0;\n $scope.newVersionAvailable = false;\n $scope.editorActive = false;\n\n vm.handleUpload = handleUpload;\n vm.handleUploadFolder = handleUploadFolder;\n vm.allowAction = allowAction;\n vm.performRemoteFetch = performRemoteFetch;\n vm.remoteFetchCallback = remoteFetchCallback;\n vm.initiateRemoteFetch = initiateRemoteFetch;\n vm.onEditorHide = onEditorHide;\n vm.showEditor = showEditor;\n vm.validateArchiveUpload = validateArchiveUpload;\n\n $scope.buttonClick = function ($event) {\n var buttonName = ($event.currentTarget.getAttribute('data-name'));\n if (buttonName == 'upload-file') {\n vm.isArchiveUpload = false;\n vm.handleUpload();\n return;\n } else if (buttonName == 'upload-folder') {\n vm.handleUploadFolder();\n return;\n } else if (buttonName == 'upload-archive') {\n vm.isArchiveUpload = true;\n vm.handleUpload();\n return;\n } else if (buttonName == 'fetch-file') {\n vm.initiateRemoteFetch();\n return;\n } else if (buttonName == 'show-editor') {\n if (!vm.allowAction(buttonName))\n return;\n\n vm.showEditor();\n return;\n }\n\n if (!vm.allowAction(buttonName))\n return;\n\n $rootScope.$broadcast('footer-button-click', buttonName);\n };\n\n var uploadSingleInput = document.getElementById('upload-placeholder'),\n uploadFolderInput = document.getElementById('upload-folder-placeholder');\n\n if (uploadSingleInput) {\n uploadSingleInput.addEventListener('change', fileChangeHandler);\n uploadFolderInput.addEventListener('change', fileChangeHandler);\n }\n\n $scope.$on('selected-items-changed', function () {\n $scope.selectedItemsCount = selectedItemsFactory.getSelectedItems().length;\n });\n\n $scope.$on('paste-source:set', function () {\n $scope.hasPasteSource = true;\n });\n\n $scope.$on('paste-source:cleared', function () {\n $scope.hasPasteSource = false;\n });\n\n $scope.$on('login', function () {\n var currentConfig = authenticationFactory.getActiveConfiguration();\n $scope.currentUsername = currentConfig.username || null;\n $scope.currentHost = currentConfig.host || null;\n });\n\n $scope.$on('logout', function () {\n $scope.currentUsername = null;\n $scope.currentHost = null;\n });\n\n $scope.$on('file-editor:hide', function (ev, activeFileCount) {\n vm.onEditorHide(activeFileCount);\n });\n\n configurationFactory.getSystemConfiguration().then(function (config) {\n MAX_UPLOAD_BYTES = config.maxFileUpload;\n $scope.maxUploadBytes = MAX_UPLOAD_BYTES;\n $scope.currentVersion = config.version;\n\n if ($scope.currentVersion && window.MONSTA_LATEST_VERSION)\n $scope.newVersionAvailable = versionIsLessThan($scope.currentVersion, window.MONSTA_LATEST_VERSION);\n }, function (response) {\n\n });\n\n function handleUpload() {\n uploadSingleInput.value = null;\n uploadSingleInput.click();\n }\n\n function fileChangeHandler() {\n if (!this.files || !this.files.length)\n return;\n\n var items = this.items;\n\n if(vm.isArchiveUpload && !validateArchiveUpload(this.files))\n return;\n\n if (items != undefined)\n uploadUIFactory.handleItemsBasedUpload(items, vm.isArchiveUpload);\n else\n uploadUIFactory.handleFilesBasedUpload(this.files, vm.isArchiveUpload);\n }\n\n function showModalError(errorMessage) {\n $rootScope.$broadcast(\"modal-error:show\", errorMessage);\n }\n\n function handleUploadFolder() {\n var userAgent = window.navigator.userAgent;\n\n if (!/chrome/i.test(userAgent)) {\n $translate('FOLDER_UPLOAD_CHROME_ONLY_MESSAGE').then(showModalError, showModalError);\n return;\n }\n\n uploadFolderInput.value = null;\n uploadFolderInput.click();\n }\n\n function allowAction(actionName) {\n if (actionName == 'show-editor')\n return $scope.editorActive;\n\n if (actionName == 'paste')\n return $scope.hasPasteSource;\n\n if (actionsRequiringSelection.indexOf(actionName) == -1)\n return true;\n\n return $scope.selectedItemsCount != 0;\n }\n\n function performRemoteFetch(url) {\n $translate('FETCHING_ACTIVITY_STATUS').then(function (translatedBusyMessage) {\n $rootScope.$broadcast(\"modal-prompt:set-busy\", translatedBusyMessage);\n });\n\n connectionFactory.fetchRemoteFile(url, uiOperationFactory.currentDirectory).then(\n function (response) {\n if (responseIsUnsuccessful(response)) {\n showResponseError(response, 'remote file fetch of ' + url, $rootScope, $translate);\n return;\n }\n $rootScope.$broadcast('change-directory');\n $rootScope.$broadcast('modal-prompt:hide');\n }, function (response) {\n showResponseError(response, 'remote file fetch of ' + url, $rootScope, $translate);\n $rootScope.$broadcast(\"modal-prompt:clear-busy\");\n }\n );\n }\n\n function setModalPromptError(error) {\n $rootScope.$broadcast('modal-prompt:set-error', error);\n }\n\n function remoteFetchCallback(final) {\n $rootScope.$broadcast('modal-prompt:clear-error');\n\n if (!basicURLValidate(final)) {\n $translate('URL_INVALID_MESSAGE').then(setModalPromptError, setModalPromptError);\n return;\n }\n\n var url = final.replace(/^\\s\\s*/, '');\n\n vm.performRemoteFetch.call(vm, url);\n }\n\n function initiateRemoteFetch() {\n $translate(['FETCH_FILE_PROMPT_TITLE', 'FETCH_FILE_URL_PLACEHOLDER']).then(function (translations) {\n $rootScope.$broadcast('modal-prompt:show', translations.FETCH_FILE_PROMPT_TITLE, null,\n translations.FETCH_FILE_URL_PLACEHOLDER, vm.remoteFetchCallback);\n });\n }\n\n function onEditorHide(activeFileCount) {\n $scope.editorActive = activeFileCount != 0;\n }\n\n function showEditor() {\n $rootScope.$broadcast('file-editor:show');\n }\n\n function validateArchiveUpload(files) {\n var errorMessage = null;\n if(files.length != 1)\n errorMessage = \"MULTIPLE_FILE_ARCHIVE_ERROR\";\n else if (extractFileExtension(files[0].name) != 'zip')\n errorMessage = \"INVALID_TYPE_ARCHIVE_ERROR\";\n\n if (errorMessage == null)\n return true;\n\n $rootScope.$broadcast('modal-error:show', errorMessage);\n return false;\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('HeaderController', HeaderController);\n\n HeaderController.$inject = ['$scope', '$rootScope', 'historyFactory'];\n\n function HeaderController($scope, $rootScope, historyFactory) {\n $scope.canGoBack = false;\n $scope.canGoForward = false;\n\n var updateScopeFromHistoryFactory = function () {\n $scope.canGoBack = historyFactory.hasPreviousHistoryItem();\n $scope.canGoForward = historyFactory.hasNextHistoryItem();\n };\n\n $scope.$on('history-changed', function () {\n updateScopeFromHistoryFactory();\n });\n\n $scope.$on('directory-changed', function () {\n updateScopeFromHistoryFactory();\n });\n\n $scope.navigateBack = function () {\n if (!$scope.canGoBack)\n return;\n\n var newDir = historyFactory.navigateBack();\n\n if (newDir)\n $rootScope.$broadcast('change-directory:on-history', newDir);\n };\n\n $scope.navigateForward = function () {\n if (!$scope.canGoForward)\n return;\n\n var newDir = historyFactory.navigateForward();\n\n if (newDir)\n $rootScope.$broadcast('change-directory:on-history', newDir);\n };\n\n $scope.refresh = function () {\n $rootScope.$broadcast('change-directory');\n }\n }\n}());\n","(function () {\n angular.module('MonstaFTP').controller('HistoryController', HistoryController);\n\n HistoryController.$inject = ['$scope', 'historyFactory', '$rootScope', 'uiOperationFactory'];\n\n function HistoryController($scope, historyFactory, $rootScope, uiOperationFactory) {\n $scope.history = [];\n\n $scope.$on('directory-changed', function () {\n updateHistory();\n });\n\n $scope.$on('history-changed', function () {\n updateHistory();\n });\n\n $scope.historyClick = function (path) {\n $rootScope.$broadcast('change-directory', path);\n };\n\n $scope.$on('items-deleted', function (ev, itemPaths) {\n itemPaths.map(function (path) {\n historyFactory.removeEntry(path);\n });\n });\n\n function updateHistory() {\n $scope.history = historyFactory.getUniqueHistory(HISTORY_MAX, uiOperationFactory.currentDirectory);\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').factory('historyFactory', historyFactory);\n\n historyFactory.$inject = ['$rootScope'];\n\n function historyFactory($rootScope) {\n var HISTORY_CHANGED_EVENT_NAME = 'history-changed';\n var ensureTrailingSlash = function (path) {\n return path + (path.substr(path.length - 1) != '/' ? '/' : '');\n };\n\n var factory = {\n _fullHistory: [],\n _historyIndex: -1,\n getFullHistory: function () {\n return this._fullHistory;\n },\n getFullHistoryCount: function () {\n return this._fullHistory.length;\n },\n addEntry: function (path) {\n path = ensureTrailingSlash(path);\n\n if (this._historyIndex != this._fullHistory.length - 1)\n this._fullHistory.splice(this._historyIndex + 1);\n\n this._fullHistory.push(path);\n ++this._historyIndex;\n $rootScope.$broadcast(HISTORY_CHANGED_EVENT_NAME);\n }, removeEntry: function (path) {\n path = ensureTrailingSlash(path);\n var changed = false;\n\n for(var i = this._fullHistory.length - 1; i >= 0; --i) {\n var historyItem = this._fullHistory[i];\n if (historyItem.length < path.length)\n continue;\n\n if (historyItem.substr(0, path.length) == path) {// this will take care of sub folders\n this._fullHistory.splice(i, 1);\n changed = true;\n }\n }\n\n if(changed)\n $rootScope.$broadcast(HISTORY_CHANGED_EVENT_NAME);\n },\n getFullHistoryItem: function (index) {\n return this._fullHistory[index];\n },\n getHistoryIndex: function () {\n return this._historyIndex;\n },\n setHistoryIndex: function (index) {\n this._historyIndex = index;\n $rootScope.$broadcast(HISTORY_CHANGED_EVENT_NAME);\n return this._fullHistory[index];\n },\n hasPreviousHistoryItem: function () {\n return this._historyIndex > 0;\n },\n hasNextHistoryItem: function () {\n return (this._historyIndex > -1) && this._historyIndex < (this._fullHistory.length - 1);\n },\n navigateBack: function () {\n if (!this.hasPreviousHistoryItem())\n return;\n\n return this.setHistoryIndex(this.getHistoryIndex() - 1);\n },\n navigateForward: function () {\n if (!this.hasNextHistoryItem())\n return;\n\n return this.setHistoryIndex(this.getHistoryIndex() + 1);\n },\n getUniqueHistory: function (historySize, currentDirectory) {\n if (currentDirectory != undefined)\n currentDirectory = ensureTrailingSlash(currentDirectory);\n\n if (this.getFullHistoryCount() == 0)\n return [];\n\n var uniqueHistory = [];\n for (var fullHistoryIndex = this.getFullHistoryCount() - 1; fullHistoryIndex >= 0; --fullHistoryIndex) {\n var historyPath = this.getFullHistoryItem(fullHistoryIndex);\n if (historyPath == currentDirectory)\n continue;\n\n if (uniqueHistory.indexOf(historyPath) == -1)\n uniqueHistory.push(historyPath);\n\n if (uniqueHistory.length == historySize)\n break;\n }\n\n return uniqueHistory;\n },\n clearHistory: function () {\n this._fullHistory = [];\n this._historyIndex = -1;\n $rootScope.$broadcast(HISTORY_CHANGED_EVENT_NAME);\n }\n };\n\n return factory;\n }\n}());","(function(){\n angular.module('MonstaFTP').factory('jQuery', monstaJQuery);\n\n monstaJQuery.$inject = ['$window'];\n\n function monstaJQuery($window) {\n return $window.jQuery;\n }\n})();","(function () {\n angular.module('MonstaFTP').factory('licenseFactory', licenseFactory);\n\n licenseFactory.$inject = ['connectionFactory', '$rootScope'];\n\n function licenseFactory(connectionFactory, $rootScope) {\n return {\n isNullLicense: true,\n email: null,\n version: null,\n expiryDate: null,\n purchaseDate: null,\n getLicense: function () {\n var _this = this;\n connectionFactory.getLicense().then(function (response) {\n if (responseIsUnsuccessful(response)) {\n _this.handleGetFailure.call(_this, response);\n return;\n }\n\n _this.handleGetSuccess.call(_this, response);\n }, function (response) {\n _this.handleGetFailure.call(_this, response);\n });\n },\n handleGetSuccess: function (response) {\n var licenseData = response.data.data;\n if (licenseData == null)\n this.isNullLicense = true;\n else {\n this.email = licenseData.email;\n this.version = licenseData.version;\n this.expiryDate = licenseData.expiryDate * 1000;\n this.purchaseDate = licenseData.purchaseDate * 1000;\n this.isNullLicense = false;\n }\n $rootScope.$broadcast('license-loaded');\n }, handleGetFailure: function (response) {\n var action = 'license reading';\n $rootScope.$broadcast('modal-error:show', parseErrorResponse(response, action), null, {action: action});\n }, isLicensed: function () {\n if (this.isNullLicense)\n return false;\n\n return !this.isLicenseExpired();\n }, isLicenseExpired: function () {\n if (this.isNullLicense)\n return false;\n\n if (this.expiryDate == null)\n return false;\n\n return Date.now() > this.expiryDate;\n }\n };\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('ModalLoginLinkController', ModalLoginLinkController);\n\n ModalLoginLinkController.$inject = [\"$rootScope\", \"$scope\", \"jQuery\", \"urlLoginFactory\", \"$element\", \"$window\",\n \"$translate\"];\n\n function ModalLoginLinkController($rootScope, $scope, jQuery, urlLoginFactory, $element, $window, $translate) {\n var vm = this, modalId = '#modal-login-link';\n\n vm.show = show;\n vm.hide = hide;\n vm.copy = copy;\n\n $scope.$on('modal-login-link:show', function(ev, type, configuration){\n vm.type = type;\n vm.configuration = configuration;\n vm.show();\n });\n\n function show() {\n vm.configURL = urlLoginFactory.getConfigURL(vm.type, vm.configuration);\n vm.supportsCopy = browserSupportsCopy();\n jQuery(modalId).modal('show');\n }\n\n function hide() {\n jQuery(modalId).modal('hide');\n $rootScope.$broadcast('modal-login:show');\n }\n\n function alertOnCopyFailure(textArea, message) {\n alert(message);\n textArea.select();\n }\n\n function copy() {\n var textArea = $element.find('textarea')[0];\n textArea.select();\n var copySuccess = false;\n try {\n copySuccess = document.execCommand('copy');\n } catch (err) {\n copySuccess = false;\n }\n\n if(!copySuccess) {\n $translate(\"COPY_FAILURE_MESSAGE\").then(function(copyFailureMessage){\n alertOnCopyFailure(textArea, copyFailureMessage);\n }, function () {\n alertOnCopyFailure(textArea, \"Unfortunately your browser does not support automatic copying, \" +\n \"please copy the address from the text box.\");\n });\n }\n }\n\n function browserSupportsCopy() {\n var userAgent = $window.navigator.userAgent;\n if(/chrome/i.test(userAgent))\n return true;\n\n if(/safari/i.test(userAgent))\n return false;\n\n if(document.queryCommandEnabled == undefined)\n return false;\n\n return document.queryCommandEnabled('copy');\n }\n\n jQuery(modalId).on('shown.bs.modal', function(){\n jQuery(this).find(\"textarea\").select();\n });\n }\n}());\n\n","(function () {\n angular.module('MonstaFTP').controller('LoginPanelController', LoginPanelController);\n\n LoginPanelController.$inject = ['$scope', 'connectionFactory', 'authenticationFactory', '$rootScope', 'jQuery',\n 'licenseFactory', '$translate', 'configurationFactory', 'urlLoginFactory'];\n\n function LoginPanelController($scope, connectionFactory, authenticationFactory, $rootScope, jQuery,\n licenseFactory, $translate, configurationFactory, urlLoginFactory) {\n var modalLoginId = \"#modal-login\", vm = this, readURL = true;\n\n $scope.connectionErrorMessage = null;\n $scope.storedAuthenticationErrorMessage = null;\n $scope.defaults = g_ConnectionDefaults;\n $scope.metaConfiguration = {\n rememberLogin: false,\n masterPassword: null,\n savedProfileIndex: null,\n enteredProfileName: null\n };\n\n $scope.hasServerSavedAuthentication = false;\n $scope.savedAuthentication = null;\n $scope.licenseFactory = licenseFactory;\n $scope.metaConfiguration.saveAuthentication = true; // TODO: this is hardcoded until we have a checkbox for this\n $scope.systemConfiguration = {};\n vm.connectionRestrictions = {};\n vm.applicationSettings = {};\n\n vm.buildDefaultConfiguration = buildDefaultConfiguration;\n vm.hide = hide;\n vm.show = show;\n vm.handleError = handleError;\n vm.setupInitialDirectory = setupInitialDirectory;\n vm.writeAuthenticationToServer = writeAuthenticationToServer;\n vm.saveCurrentAuthentication = saveCurrentAuthentication;\n vm.removeProfile = removeProfile;\n vm.initiateAuthenticationSave = initiateAuthenticationSave;\n vm.handleAuthenticationSuccess = handleAuthenticationSuccess;\n vm.handleAuthenticationFailure = handleAuthenticationFailure;\n vm.transferConfigToAuthFactory = transferConfigToAuthFactory;\n vm.successCallback = successCallback;\n vm.handleTestConfiguration = handleTestConfiguration;\n vm.testConfiguration = testConfiguration;\n vm.transferConfigFromAuthFactory = transferConfigFromAuthFactory;\n vm.initWithStoredAuth = initWithStoredAuth;\n vm.updateHasServerSavedAuth = updateHasServerSavedAuth;\n vm.addDefaultsToConfig = addDefaultsToConfig;\n vm.initWithDefaultAuth = initWithDefaultAuth;\n vm.init = init;\n vm.handleCreateAuthSuccess = handleCreateAuthSuccess;\n vm.handleLoadSavedAuthSuccess = handleLoadSavedAuthSuccess;\n vm.handleAuthFileFailure = handleAuthFileFailure;\n vm.performCreateAuthFile = performCreateAuthFile;\n vm.initiateLoadOfAuthFile = initiateLoadOfAuthFile;\n vm.loadProfileAtIndex = loadProfileAtIndex;\n vm.loadNewProfile = loadNewProfile;\n vm.configurationSettable = configurationSettable;\n vm.applyRestrictionsToConfiguration = applyRestrictionsToConfiguration;\n vm.shouldShowProUpgrade = shouldShowProUpgrade;\n vm.shouldShowProfiles = shouldShowProfiles;\n vm.showLoginLink = showLoginLink;\n vm.initWithURLConfig = initWithURLConfig;\n vm.profileIsSelected = profileIsSelected;\n vm.getProfileName = getProfileName;\n vm.getDefaultProfileName = getDefaultProfileName;\n\n jQuery(document).on('shown.bs.tab', '#login-tab-links a', function (e) {\n $scope.connectionType = $(e.target).attr('data-type');\n $scope.$apply(function(){\n $scope.handleProfileChange();\n });\n\n });\n\n $scope.connect = function () {\n if ($scope.connectionType == 'sftp' && $scope.systemConfiguration.sftpAvailable === false)\n return;\n\n vm.testConfiguration(\"form\");\n };\n\n $scope.handleLoginKeyPress = function ($event) {\n if ($event.which == 13)\n $scope.connect();\n };\n\n $scope.$on('logout', function () {\n readURL = false;\n vm.init();\n });\n\n $scope.$on('modal-login:show', function () {\n vm.show();\n });\n\n function setStoredAuthenticationErrorMessage(errorMessage) {\n $scope.storedAuthenticationErrorMessage = errorMessage;\n }\n\n $scope.handleAuthGo = function () {\n if (isEmpty($scope.metaConfiguration.masterPassword)) {\n $translate('PROFILE_SET_PASSWORD_ERROR').then(setStoredAuthenticationErrorMessage,\n setStoredAuthenticationErrorMessage);\n return;\n }\n\n $scope.storedAuthenticationErrorMessage = '';\n\n if ($scope.hasServerSavedAuthentication)\n vm.initiateLoadOfAuthFile();\n else\n vm.performCreateAuthFile();\n };\n\n $scope.masterPasswordKeypress = function ($event) {\n if ($event.which == 13)\n $scope.handleAuthGo();\n };\n\n $scope.handleProfileChange = function () {\n var selectValue = $scope.metaConfiguration.savedProfileIndex;\n if (selectValue == 'new') {\n vm.loadNewProfile();\n return;\n }\n\n var profileIndex = parseInt(selectValue);\n if (!isNaN(profileIndex))\n vm.loadProfileAtIndex(profileIndex);\n };\n\n function showRemoveProfileConfirm(message) {\n $rootScope.$broadcast('modal-confirm:show', message, vm.removeProfile);\n }\n\n $scope.initiateProfileDelete = function () {\n $translate('PROFILE_DELETE_CONFIRM_MESSAGE').then(showRemoveProfileConfirm, showRemoveProfileConfirm)\n };\n\n $scope.shouldHideDeleteButton = function () {\n if (!shouldShowProfiles())\n return true;\n\n return isNaN(parseInt($scope.metaConfiguration.savedProfileIndex));\n };\n\n $scope.$on('license-loaded', function () {\n vm.init();\n });\n\n configurationFactory.getSystemConfiguration().then(function (systemConfiguration) {\n $scope.systemConfiguration = systemConfiguration;\n vm.applicationSettings = systemConfiguration.applicationSettings;\n vm.connectionRestrictions = systemConfiguration.applicationSettings.connectionRestrictions;\n licenseFactory.getLicense();\n }, function (response) {\n licenseFactory.getLicense();\n });\n\n function buildDefaultConfiguration() {\n connectionTypeAllowed();\n\n var availableConnectionTypes = [\n ['ftp', 'FTP'],\n ['sftp', 'SFTP/SCP']\n ];\n\n if (DEBUG)\n availableConnectionTypes.push(['mock', 'Mock']);\n\n $scope.connectionTypes = [];\n\n for (var ctIndex = 0; ctIndex < availableConnectionTypes.length; ++ctIndex) {\n if (connectionTypeAllowed(availableConnectionTypes[ctIndex][0]))\n $scope.connectionTypes.push(availableConnectionTypes[ctIndex]);\n }\n\n $scope.configuration = {};\n if ($scope.connectionTypes.length)\n $scope.connectionType = $scope.connectionTypes[0][0];\n\n for (ctIndex = 0; ctIndex < $scope.connectionTypes.length; ++ctIndex)\n $scope.configuration[$scope.connectionTypes[ctIndex][0]] = {};\n }\n\n function hide() {\n jQuery(modalLoginId).modal('hide');\n }\n\n function show() {\n vm.updateHasServerSavedAuth();\n jQuery(modalLoginId).modal('show');\n }\n\n function displayTranslatedError(errorMessage, mode) {\n if (mode == 'connection-display')\n $scope.connectionErrorMessage = errorMessage;\n else if (mode == 'saved-profile-display')\n $scope.storedAuthenticationErrorMessage = errorMessage;\n else\n $rootScope.$broadcast('modal-error:show', errorMessage);\n }\n\n function handleError(response, action, mode) {\n var errorMessage = parseErrorResponse(response, action);\n\n $translate(errorMessage, {action: action}).then(function (translatedMessage) {\n displayTranslatedError(translatedMessage, mode);\n }, function () {\n displayTranslatedError(errorMessage, mode);\n });\n }\n\n function setupInitialDirectory(resumeType) {\n var configuration = $scope.configuration, connType = $scope.connectionType; // for shorter refs :)\n if (resumeType == \"resume\") {\n var authInitDir = authenticationFactory.initialDirectory;\n if (isEmpty(authInitDir))\n authInitDir = \"/\";\n configuration[connType].initialDirectory = authInitDir;\n } else {\n if (isEmpty(configuration[connType].initialDirectory))\n configuration[connType].initialDirectory = \"/\";\n\n authenticationFactory.initialDirectory = configuration[connType].initialDirectory;\n }\n }\n\n function writeAuthenticationToServer() {\n connectionFactory.writeSavedAuth($scope.metaConfiguration.masterPassword, $scope.savedAuthentication)\n .then(function (response) {\n if (responseIsUnsuccessful(response))\n vm.handleError(response, 'saving profile');\n }, function (response) {\n vm.handleError(response, 'saving profile');\n });\n }\n\n function saveCurrentAuthentication() {\n if ($scope.savedAuthentication == null || typeof $scope.savedAuthentication != 'object')\n $scope.savedAuthentication = {};\n\n if ($scope.savedAuthentication[$scope.connectionType] == undefined)\n $scope.savedAuthentication[$scope.connectionType] = [];\n\n var profileToSave = angular.copy($scope.configuration[$scope.connectionType]);\n\n profileToSave.name = $scope.metaConfiguration.enteredProfileName;\n\n var profileArray = $scope.savedAuthentication[$scope.connectionType];\n\n if ($scope.metaConfiguration.savedProfileIndex == 'new')\n profileArray.push(profileToSave);\n else\n profileArray[$scope.metaConfiguration.savedProfileIndex] = profileToSave;\n\n vm.writeAuthenticationToServer();\n }\n\n function removeProfile() {\n $scope.savedAuthentication[$scope.connectionType].splice($scope.metaConfiguration.savedProfileIndex, 1);\n\n $scope.metaConfiguration.savedProfileIndex = Math.min($scope.metaConfiguration.savedProfileIndex,\n $scope.savedAuthentication[$scope.connectionType].length - 1);\n\n vm.writeAuthenticationToServer();\n }\n\n function initiateAuthenticationSave() {\n if (isEmpty($scope.metaConfiguration.masterPassword) || !$scope.metaConfiguration.saveAuthentication\n || !$scope.hasServerSavedAuthentication)\n return;\n\n vm.saveCurrentAuthentication();\n }\n\n function handleAuthenticationSuccess() {\n authenticationFactory.postLogin();\n vm.initiateAuthenticationSave();\n vm.hide();\n $rootScope.$broadcast('login');\n }\n\n function handleAuthenticationFailure(resumeType, response) {\n if (resumeType == \"resume\" || resumeType == \"url\") {\n if (resumeType == \"url\") {\n $scope.configuration[$scope.connectionType].password = null;\n authenticationFactory.configuration[$scope.connectionType].password = null;\n }\n vm.show();\n } else\n vm.handleError(response, 'authentication', 'connection-display');\n }\n\n function transferConfigToAuthFactory() {\n var config = angular.copy($scope.configuration);\n vm.applyRestrictionsToConfiguration(config);\n authenticationFactory.configuration = config;\n authenticationFactory.connectionType = $scope.connectionType;\n authenticationFactory.rememberLogin = $scope.metaConfiguration.rememberLogin;\n authenticationFactory.hasServerSavedAuthentication = $scope.hasServerSavedAuthentication;\n }\n\n function successCallback(resumeType, response) {\n if (responseIsUnsuccessful(response))\n vm.handleAuthenticationFailure(resumeType, response);\n else\n vm.handleAuthenticationSuccess();\n }\n\n function handleTestConfiguration(resumeType) {\n connectionFactory.testConnectAndAuthenticate().then(function (response) {\n vm.successCallback(resumeType, response);\n }, function (response) {\n vm.handleAuthenticationFailure(resumeType, response);\n });\n }\n\n function testConfiguration(resumeType) {\n vm.setupInitialDirectory(resumeType);\n vm.transferConfigToAuthFactory();\n vm.handleTestConfiguration(resumeType);\n }\n\n function transferConfigFromAuthFactory() {\n $scope.connectionType = authenticationFactory.connectionType || $scope.connectionTypes[0][0];\n $scope.metaConfiguration.rememberLogin = authenticationFactory.rememberLogin;\n $scope.hasServerSavedAuthentication = authenticationFactory.hasServerSavedAuthentication;\n }\n\n function initWithStoredAuth() {\n $scope.configuration = angular.copy(authenticationFactory.configuration);\n\n if (authenticationFactory.isAuthenticated)\n vm.testConfiguration(\"resume\");\n else\n vm.show();\n }\n\n function initWithURLConfig(urlConfig) {\n var configuration = {};\n\n configuration[urlConfig.type] = urlConfig.configuration;\n\n authenticationFactory.configuration = angular.copy(configuration);\n\n $scope.configuration = angular.copy(configuration);\n $scope.connectionType = urlConfig.type;\n vm.testConfiguration(\"url\");\n }\n\n function updateHasServerSavedAuth() {\n connectionFactory.checkSavedAuthExists().then(function (response) {\n $scope.hasServerSavedAuthentication = (response.data.data === true);\n }, function () {\n $scope.hasServerSavedAuthentication = false;\n });\n }\n\n function addDefaultsToConfig() {\n $scope.configuration.ftp.passive = true;\n }\n\n function initWithDefaultAuth() {\n vm.addDefaultsToConfig();\n vm.show();\n }\n\n function init() {\n vm.buildDefaultConfiguration();\n authenticationFactory.loadSettings();\n vm.transferConfigFromAuthFactory();\n\n var configFromURL = null;\n\n if (readURL && licenseFactory.isLicensed())\n configFromURL = urlLoginFactory.getConfigFromCurrentURL();\n\n if (configFromURL != null)\n vm.initWithURLConfig(configFromURL);\n else if (authenticationFactory.hasStoredAuthenticationDetails())\n vm.initWithStoredAuth();\n else\n vm.initWithDefaultAuth();\n }\n\n function handleCreateAuthSuccess() {\n $scope.masterPasswordValid = true;\n $scope.hasServerSavedAuthentication = true;\n }\n\n function handleLoadSavedAuthSuccess(response) {\n $scope.savedAuthentication = response.data.data;\n $scope.masterPasswordValid = true;\n }\n\n function handleAuthFileFailure(response) {\n $scope.masterPasswordValid = false;\n vm.handleError(response, 'reading/writing the settings file', 'saved-profile-display');\n }\n\n function performCreateAuthFile() {\n var defaultAuth = {};\n\n for (var tIndex = 0; tIndex < $scope.connectionTypes.length; ++tIndex) {\n defaultAuth[$scope.connectionTypes[tIndex][0]] = [];\n }\n\n connectionFactory.writeSavedAuth($scope.metaConfiguration.masterPassword, defaultAuth).then(\n function (response) {\n if (responseIsUnsuccessful(response))\n vm.handleAuthFileFailure(response);\n else\n vm.handleCreateAuthSuccess(response);\n }, function (response) {\n vm.handleAuthFileFailure(response);\n });\n }\n\n function initiateLoadOfAuthFile() {\n connectionFactory.readSavedAuth($scope.metaConfiguration.masterPassword).then(function (response) {\n if (responseIsUnsuccessful(response))\n vm.handleAuthFileFailure(response);\n else\n vm.handleLoadSavedAuthSuccess(response);\n }, function (response) {\n vm.handleAuthFileFailure(response);\n });\n }\n\n function loadProfileAtIndex(profileIndex) {\n $scope.configuration[$scope.connectionType] = angular.copy(\n $scope.savedAuthentication[$scope.connectionType][profileIndex]);\n\n $scope.metaConfiguration.enteredProfileName = $scope.configuration[$scope.connectionType].name;\n }\n\n function loadNewProfile() {\n $scope.configuration[$scope.connectionType] = {};\n $scope.metaConfiguration.enteredProfileName = null;\n vm.addDefaultsToConfig();\n }\n\n function configurationSettable(connectionType, configurationKey) {\n if (vm.connectionRestrictions == null || typeof (vm.connectionRestrictions) != \"object\")\n return true;\n\n if (!vm.connectionRestrictions.hasOwnProperty(connectionType))\n return true;\n\n return !vm.connectionRestrictions[connectionType].hasOwnProperty(configurationKey);\n }\n\n function applyRestrictionsToConfiguration(configuration) {\n if (vm.connectionRestrictions == null || typeof (vm.connectionRestrictions) != \"object\")\n return;\n\n for (var connectionType in vm.connectionRestrictions) {\n if (!vm.connectionRestrictions.hasOwnProperty(connectionType))\n continue;\n\n if (!configuration.hasOwnProperty(connectionType))\n continue;\n\n var typeConnectionSettings = vm.connectionRestrictions[connectionType];\n if (typeConnectionSettings == null || typeof (vm.connectionRestrictions) != \"object\")\n continue;\n\n for (var settingName in typeConnectionSettings) {\n if (!typeConnectionSettings.hasOwnProperty(settingName))\n continue;\n\n configuration[connectionType][settingName] = null;\n }\n }\n }\n\n function connectionTypeAllowed(connectionType) {\n // this function is designed to be very forgiving\n if (vm.connectionRestrictions == null || typeof (vm.connectionRestrictions) != \"object\")\n return true;\n\n if (Object.prototype.toString.call(vm.connectionRestrictions.types) != '[object Array]')\n return true;\n\n if (vm.connectionRestrictions.types.length == 0)\n return true;\n\n return vm.connectionRestrictions.types.indexOf(connectionType) != -1;\n }\n\n function shouldShowProUpgrade() {\n if (vm.applicationSettings.hideProUpgradeMessages === true)\n return false;\n\n return !licenseFactory.isLicensed();\n }\n\n function shouldShowProfiles() {\n if (vm.applicationSettings.disableMasterLogin === true)\n return false;\n\n return licenseFactory.isLicensed();\n }\n\n function showLoginLink() {\n $rootScope.$broadcast(\"modal-login-link:show\", $scope.connectionType,\n $scope.configuration[$scope.connectionType]);\n vm.hide();\n }\n\n function profileIsSelected() {\n return $scope.metaConfiguration.savedProfileIndex !== ''\n && $scope.metaConfiguration.savedProfileIndex !== null;\n }\n\n function getProfileName(profile, useDefault) {\n if (!useDefault && profile.name)\n return profile.name;\n\n if(profile.host == null || (profile.username == null && profile.remoteUsername == null))\n return '';\n\n return (profile.host || 'host') + \" / \" + (profile.username || profile.remoteUsername || 'username');\n }\n\n function getDefaultProfileName() {\n if($scope == null || $scope.configuration == null || $scope.connectionType == null)\n return '';\n\n return getProfileName($scope.configuration[$scope.connectionType], true);\n }\n }\n}());","(function() {\n angular.module('MonstaFTP').controller('ModalAddonsController', ModalAddonsController);\n\n ModalAddonsController.$inject = ['jQuery', 'licenseFactory', '$scope', '$filter'];\n\n function ModalAddonsController(jQuery, licenseFactory, $scope, $filter) {\n var modalId = '#modal-addons', vm = this;\n\n vm.show = show;\n\n $scope.$on('modal-addons:show', function () {\n vm.show();\n });\n\n function show() {\n vm.formattedExpiryDate = $filter('date')(licenseFactory.expiryDate, \"d MMMM, yyyy\");\n vm.licenseExpired = licenseFactory.isLicenseExpired();\n vm.isLicensed = licenseFactory.isLicensed();\n jQuery(modalId).modal('show');\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('ModalChoiceController', ModalChoiceController);\n\n ModalChoiceController.$inject = [\"$scope\", \"jQuery\", '$timeout'];\n\n function ModalChoiceController($scope, jQuery, $timeout) {\n var vm = this, modalId = \"#modal-choice\";\n vm.callbacks = [];\n vm.title = null;\n vm.message = null;\n vm.show = show;\n vm.handleCallback = handleCallback;\n\n $scope.$on('modal-choice:show', function (ev, title, message, callbacks) {\n vm.title = title;\n vm.message = message;\n vm.callbacks = callbacks;\n\n $timeout(function () {\n $scope.$apply(function () {\n vm.show();\n });\n });\n });\n\n function show() {\n jQuery(modalId).modal('show');\n }\n\n function hide() {\n jQuery(modalId).modal('hide');\n }\n\n function handleCallback(callbackIndex) {\n vm.callbacks[callbackIndex][1]();\n hide();\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('ModalConfirmController', ['$scope', 'jQuery', ModalConfirmController]);\n\n function ModalConfirmController($scope, jQuery) {\n var modalConfirmId = '#modal-confirm', vm = this;\n\n vm.message = '';\n vm.okCallback = null;\n vm.cancelCallback = null;\n\n vm.show = show;\n vm.ok = okHandler;\n vm.cancel = cancelHandler;\n\n $scope.$on('modal-confirm:show', function (ev, message, okCallback, cancelCallback) {\n vm.message = message;\n vm.okCallback = (typeof okCallback == 'undefined') ? null : okCallback;\n vm.cancelCallback = (typeof cancelCallback == 'undefined') ? null : cancelCallback;\n vm.show();\n });\n\n function okHandler() {\n jQuery(modalConfirmId).modal('hide');\n if (vm.okCallback != null) {\n vm.okCallback();\n vm.okCallback = null;\n }\n }\n\n function cancelHandler() {\n jQuery(modalConfirmId).modal('hide');\n if (vm.cancelCallback != null) {\n vm.cancelCallback();\n vm.cancelCallback = null;\n }\n }\n\n function show() {\n jQuery(modalConfirmId).modal('show');\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('ModalErrorController', ModalErrorController);\n\n ModalErrorController.$inject = ['$scope', 'jQuery', '$translate'];\n\n function ModalErrorController($scope, jQuery, $translate) {\n var vm = this, modalErrorId = '#modal-error';\n vm.message = '';\n vm.show = show;\n vm.hide = hide;\n vm.dismissCallback = dismissCallback;\n\n $scope.$on('modal-error:show', function (ev, message, dismissCallback, context) {\n $translate(message, context).then(function(translatedMessage){\n vm.message = translatedMessage;\n }, function () {\n vm.message = message;\n });\n\n vm.dismissCallback = dismissCallback;\n jQuery(modalErrorId).modal('show');\n });\n\n jQuery(modalErrorId).on('shown.bs.modal', function () {\n $scope.$apply();\n });\n\n function show() {\n jQuery(modalErrorId).modal('show');\n }\n\n function hide() {\n jQuery(modalErrorId).modal('hide');\n if (vm.dismissCallback)\n vm.dismissCallback();\n }\n\n function dismissCallback() {\n // empty\n }\n }\n\n}());\n","(function () {\n angular.module('MonstaFTP').controller('ModalPermissionsController', ModalPermissionsController);\n\n ModalPermissionsController.$inject = ['$scope', '$rootScope', 'connectionFactory', 'jQuery','permissionsFactory',\n '$translate'];\n\n function ModalPermissionsController($scope, $rootScope, connectionFactory, jQuery, permissionsFactory, $translate) {\n var modalPermissionsEditorId = '#modal-chmod', vm = this;\n $scope.filePaths = null;\n $scope.permissions = null;\n $scope.formattedPermissions = null;\n $scope.invalidRange = false;\n $scope.saving = false;\n\n vm.show = show;\n vm.hide = hide;\n vm.validateFormattedPermission = validateFormattedPermission;\n vm.formattedPermissionsChange = formattedPermissionsChange;\n vm.setPermissions = setPermissions;\n vm.zeroPadLeft = zeroPadLeft;\n vm.setFormattedPermissions = setFormattedPermissions;\n vm.permissionsChange = permissionsChange;\n vm.permissionSaveError = permissionSaveError;\n vm.permissionSaveSuccess = permissionSaveSuccess;\n vm.initiatePermissionsSave = initiatePermissionsSave;\n\n $scope.$on('modal-permissions:show', function (ev, filePaths, numericPermissions) {\n $scope.filePaths = filePaths;\n vm.setPermissions(numericPermissions);\n vm.show();\n });\n\n $scope.$watch('permissions', vm.permissionsChange, true);\n\n $scope.$watch('formattedPermissions', vm.formattedPermissionsChange);\n\n $scope.manualFocus = function () {\n $scope.invalidRange = false;\n };\n\n $scope.okClick = function () {\n if ($scope.invalidRange)\n return;\n\n vm.initiatePermissionsSave();\n };\n\n $scope.cancelClick = function () {\n vm.hide();\n };\n\n function show() {\n jQuery(modalPermissionsEditorId).modal('show');\n $scope.invalidRange = false;\n }\n\n function hide() {\n $scope.filePaths = null;\n $scope.invalidRange = false;\n jQuery(modalPermissionsEditorId).modal('hide');\n }\n\n function setPermissions(numericPermissions) {\n $scope.permissions = permissionsFactory.numericToObject(numericPermissions);\n }\n\n function zeroPadLeft(input) {\n while (input.length < 3)\n input = '0' + input;\n\n return input;\n }\n\n function setFormattedPermissions(numericPermissions) {\n $scope.formattedPermissions = vm.zeroPadLeft(numericPermissions.toString(8));\n }\n\n function permissionsChange() {\n if ($scope.permissions != null)\n vm.setFormattedPermissions(permissionsFactory.objectToNumeric($scope.permissions));\n }\n\n function validateFormattedPermission(formattedPermission) {\n var numericPermissions = parseInt(formattedPermission, 8);\n if (isNaN(numericPermissions) || numericPermissions < 0 || numericPermissions > 511) {\n numericPermissions = 0;\n $scope.invalidRange = true;\n }\n return numericPermissions;\n }\n\n function formattedPermissionsChange() {\n vm.setPermissions(vm.validateFormattedPermission($scope.formattedPermissions));\n }\n\n function permissionSaveError(error, context) {\n $scope.saving = false;\n $translate(['PERMISSIONS_FAILURE_PRECEDING_MESSAGE', error], context).then(function (translations) {\n $rootScope.$broadcast('modal-error:show',\n translations['PERMISSIONS_FAILURE_PRECEDING_MESSAGE'] + ' ' + translations[error]);\n });\n }\n\n function permissionSaveSuccess() {\n $scope.saving = false;\n $rootScope.$broadcast('change-directory');\n vm.hide();\n }\n\n function initiatePermissionsSave() {\n var filesSaved = 0, mode = permissionsFactory.objectToNumeric($scope.permissions);\n\n var checkCompleted = function () {\n ++filesSaved;\n\n if (filesSaved == $scope.filePaths.length)\n vm.permissionSaveSuccess();\n };\n\n $scope.saving = true;\n\n $scope.filePaths.map(function (path) {\n connectionFactory.changePermissions(path, mode).then(function () {\n checkCompleted();\n }, function (response) {\n var action = \"permission save\";\n vm.permissionSaveError(parseErrorResponse(response, action), {action: action});\n });\n });\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('ModalPromptController', ModalPromptController);\n\n ModalPromptController.$inject = ['$scope', 'jQuery', '$translate'];\n\n function ModalPromptController($scope, jQuery, $translate) {\n var modalPromptId = '#modal-prompt', vm = this;\n\n this.setVars = function (title, initial, placeHolder) {\n $translate(title).then(function (translatedTitle) {\n $scope.title = translatedTitle;\n }, function () {\n $scope.title = title;\n });\n\n $translate(placeHolder).then(function (translatedPlaceholder) {\n $scope.placeHolder = translatedPlaceholder;\n }, function () {\n $scope.placeHolder = placeHolder;\n });\n\n $scope.initial = initial;\n $scope.final = initial;\n $scope.errorSet = false;\n $scope.errorMessage = '';\n $scope.isBusy = false;\n $scope.busyMessage = null;\n this.updateDismissMessage();\n };\n\n this.updateDismissMessage = function () {\n $translate($scope.busyMessage || 'DISMISS_OK_ACTION').then(function (translatedDismissMessage) {\n $scope.dismissMessage = translatedDismissMessage;\n }, function (dismissMessage) {\n $scope.dismissMessage = dismissMessage;\n });\n };\n\n jQuery(modalPromptId).on('shown.bs.modal', function () {\n jQuery(this).find('input[type=text]').focus();\n });\n\n this.setVars('', '', '');\n\n this.successCallback = function () {\n // empty\n };\n\n $scope.successClose = function () {\n vm.successCallback($scope.final, $scope.initial);\n };\n\n $scope.handlePromptKeypress = function ($event) {\n if ($event.which == 13)\n $scope.successClose();\n };\n\n this.show = function () {\n jQuery(modalPromptId).modal('show');\n vm.clearError();\n vm.clearBusy();\n };\n\n this.hide = function () {\n jQuery(modalPromptId).modal('hide');\n };\n\n this.clearError = function () {\n $scope.errorSet = false;\n $scope.errorMessage = '';\n };\n\n this.setBusy = function (busyMessage) {\n $scope.isBusy = true;\n $scope.busyMessage = busyMessage;\n this.updateDismissMessage();\n };\n\n this.clearBusy = function () {\n $scope.isBusy = false;\n $scope.busyMessage = null;\n this.updateDismissMessage();\n };\n\n $scope.$on('modal-prompt:show', function (ev, title, initial, placeHolder, successCallback) {\n vm.setVars(title, initial, placeHolder);\n vm.successCallback = successCallback;\n vm.show();\n });\n\n $scope.$on('modal-prompt:set-error', function (ev, errorMessage) {\n $scope.errorSet = true;\n\n $translate(errorMessage).then(function (translatedErrorMessage) {\n $scope.errorMessage = translatedErrorMessage;\n }, function () {\n $scope.errorMessage = errorMessage;\n });\n });\n\n $scope.$on('modal-prompt:clear-error', function () {\n vm.clearError();\n });\n\n $scope.$on('modal-prompt:hide', function () {\n vm.hide();\n });\n\n $scope.$on('modal-prompt:set-busy', function (ev, busyMessage) {\n vm.setBusy(busyMessage);\n });\n\n $scope.$on('modal-prompt:clear-busy', function () {\n vm.clearBusy();\n });\n }\n}());","(function(){\n angular.module('MonstaFTP').controller('ModalPropertiesController', ModalPropertiesController);\n\n ModalPropertiesController.$inject = ['jQuery', '$scope'];\n\n function ModalPropertiesController(jQuery, $scope) {\n var vm = this, modalPropertiesId = \"#modal-properties\";\n vm.item = null;\n\n vm.hide = hide;\n vm.show = show;\n\n $scope.$on('modal-properties:show', function (ev, item) {\n vm.show(item);\n });\n\n function hide() {\n jQuery(modalPropertiesId).modal('hide');\n }\n\n function show(item){\n vm.item = item;\n jQuery(modalPropertiesId).modal('show');\n }\n }\n}());","(function(){\n angular.module('MonstaFTP').controller('ModalSettingsController', ModalSettingsController);\n\n ModalSettingsController.$inject = ['jQuery', '$scope', 'configurationFactory', '$rootScope', '$translate',\n 'localConfigurationFactory'];\n\n function ModalSettingsController(jQuery, $scope, configurationFactory, $rootScope, $translate,\n localConfigurationFactory) {\n var modalId = '#modal-settings', vm = this, applicationSettingsKeys = [], previousShowDotFiles;\n vm.applicationSettings = {};\n vm.show = show;\n vm.saveSettings = saveSettings;\n vm.debug = DEBUG;\n vm.systemShowDotFiles = false;\n\n configurationFactory.getSystemConfiguration().then(systemVarLoadSuccess, systemVarLoadFailure);\n\n $scope.$on('modal-settings:show', function () {\n localConfigurationFactory.getApplicationSettings().then(function(){\n for (var i = 0; i < applicationSettingsKeys.length; ++i) {\n var key = applicationSettingsKeys[i];\n vm.applicationSettings[key] = localConfigurationFactory.getConfigurationItem(key);\n }\n vm.show();\n }, systemVarLoadFailure);\n });\n\n function show() {\n previousShowDotFiles = vm.applicationSettings.showDotFiles;\n jQuery(modalId).modal('show');\n }\n\n function hide() {\n jQuery(modalId).modal('hide');\n }\n\n function systemVarLoadSuccess(vars) {\n vm.systemShowDotFiles = vars.applicationSettings.showDotFiles;\n applicationSettingsKeys = Object.keys(vars.applicationSettings);\n }\n\n function systemVarLoadFailure(response) {\n showResponseError(response, \"system var load\", $rootScope, $translate);\n }\n \n function saveSettings() {\n for(var key in vm.applicationSettings){\n if (vm.applicationSettings.hasOwnProperty(key))\n localConfigurationFactory.setConfigurationItem(key, vm.applicationSettings[key]);\n }\n\n if (vm.applicationSettings.showDotFiles != previousShowDotFiles)\n $rootScope.$broadcast('change-directory');\n\n hide();\n }\n\n $rootScope.$on('configuration:key-changed', function (ev, key, value) {\n if(key == 'language') {\n $translate.use(value);\n }\n });\n }\n}());","(function () {\n angular.module('MonstaFTP').controller('ModalTransferController', ModalTransferController);\n\n ModalTransferController.$inject = ['uploadFactory', '$rootScope', '$scope', 'jQuery', '$timeout',\n '$filter'];\n\n function ModalTransferController(uploadFactory, $rootScope, $scope, jQuery, $timeout, $filter) {\n var modalId = '#modal-transfers', vm = this;\n\n vm.updateUploads = updateUploads;\n vm.uploadFinished = uploadFinished;\n vm.show = show;\n vm.hide = hide;\n vm.abortItem = abortItem;\n vm.abortAll = abortAll\n vm.fsFilter = $filter('file_size');\n\n vm.uploads = [];\n vm.itemToAbort = null;\n\n $scope.$on('upload:start', this.updateUploads);\n $scope.$on('upload:error', this.updateUploads);\n $scope.$on('upload:progress', this.updateUploads);\n $scope.$on('upload:load', this.uploadFinished);\n $scope.$on('upload:add', this.show);\n\n function updateUploads() {\n vm.uploads = uploadFactory.getUploads();\n if (vm.uploads.length == 0)\n vm.hide();\n else {\n $timeout(function() {\n $scope.$apply();\n });\n }\n }\n\n function uploadFinished() {\n vm.updateUploads();\n $rootScope.$broadcast('change-directory'); // refresh directory\n }\n\n function show() {\n vm.updateUploads();\n jQuery(modalId).modal('show');\n }\n\n function hide() {\n jQuery(modalId).modal('hide');\n }\n\n function abortItem(item) {\n uploadFactory.abortItem(item);\n vm.updateUploads();\n }\n\n function abortAll() {\n uploadFactory.abortAll();\n }\n }\n}());","(function () {\n angular.module('MonstaFTP').factory('permissionsFactory', permissionsFactory);\n\n function permissionsFactory() {\n return {\n objectToNumeric: function (permissions) {\n return (permissions.ownerRead ? 0x100 : 0) + (permissions.ownerWrite ? 0x80 : 0) +\n (permissions.ownerExecute ? 0x40 : 0) + (permissions.groupRead ? 0x20 : 0) +\n (permissions.groupWrite ? 0x10 : 0) + (permissions.groupExecute ? 0x8 : 0) +\n (permissions.otherRead ? 0x4 : 0) + (permissions.otherWrite ? 0x2 : 0) +\n (permissions.otherExecute ? 0x1 : 0);\n },\n numericToObject: function (numericPermission) {\n return {\n ownerRead: (numericPermission & 0x100) != 0,\n ownerWrite: (numericPermission & 0x80) != 0,\n ownerExecute: (numericPermission & 0x40) != 0,\n groupRead: (numericPermission & 0x20) != 0,\n groupWrite: (numericPermission & 0x10) != 0,\n groupExecute: (numericPermission & 0x8) != 0,\n otherRead: (numericPermission & 0x4) != 0,\n otherWrite: (numericPermission & 0x2) != 0,\n otherExecute: (numericPermission & 0x1) != 0\n };\n }\n }\n }\n}());\n\n","(function () {\n angular.module('MonstaFTP').controller('SlidebarController', SlidebarController);\n\n SlidebarController.$inject = ['authenticationFactory', '$rootScope', 'jQuery', '$translate'];\n\n function SlidebarController(authenticationFactory, $rootScope, jQuery, $translate) {\n var vm = this;\n\n jQuery('#slidebar').ready(function () {\n jQuery.slidebars();\n });\n\n vm.confirmLogout = confirmLogout;\n\n function confirmLogout() {\n jQuery.slidebars.close('#slidebar');\n authenticationFactory.logout();\n $rootScope.$broadcast('logout');\n }\n\n vm.initiateLogout = initiateLogout;\n vm.showAddonsModal = showAddonsModal;\n vm.showSettingsModal = showSettingsModal;\n vm.showLoginPanel = showLoginPanel;\n\n function showModalConfirm(translatedMessage) {\n $rootScope.$broadcast('modal-confirm:show', translatedMessage, vm.confirmLogout);\n }\n\n function initiateLogout() {\n $translate('LOGOUT_CONFIRM_MESSAGE').then(showModalConfirm, showModalConfirm);\n }\n\n function showAddonsModal() {\n $rootScope.$broadcast('modal-addons:show');\n }\n\n function showSettingsModal() {\n $rootScope.$broadcast('modal-settings:show');\n }\n\n function showLoginPanel() {\n $rootScope.$broadcast('modal-login:show');\n jQuery.slidebars.close('#slidebar');\n }\n }\n}());\n\n","(function () {\n angular.module('MonstaFTP').controller('SpinnerController', SpinnerController);\n\n SpinnerController.$inject = ['$scope'];\n\n function SpinnerController($scope) {\n $scope.spinnerVisible = false;\n\n $scope.$on('request-count-change', function (ev, reqCount) {\n $scope.spinnerVisible = reqCount != 0;\n });\n }\n}());\n","(function () {\n angular.module('MonstaFTP').factory('uiOperationFactory', uiOperationFactory);\n\n uiOperationFactory.$inject = ['$rootScope'];\n\n function uiOperationFactory($rootScope) {\n return {\n cutSource: null,\n copySource: null,\n currentDirectory: \"\",\n setCutSource: function (newCutSource) {\n this.cutSource = newCutSource;\n this.copySource = null;\n\n if (newCutSource != null)\n $rootScope.$broadcast('paste-source:set');\n },\n setCopySource: function (newCopySource) {\n this.copySource = newCopySource;\n this.cutSource = null;\n\n if (newCopySource != null)\n $rootScope.$broadcast('paste-source:set');\n },\n pasteComplete: function () {\n if (this.cutSource != null)\n $rootScope.$broadcast('paste-source:cleared');\n this.cutSource = null;\n },\n clearCutAndCopySource: function () {\n this.copySource = null;\n this.cutSource = null;\n $rootScope.$broadcast('paste-source:cleared');\n },\n isCutOrCopySource: function (path) {\n return path == this.copySource || path == this.cutSource;\n },\n joinNameToCurrentDirectory: function (name) {\n return pathJoin(this.currentDirectory, name);\n }\n };\n }\n}());","(function () {\n angular.module('MonstaFTP').factory('urlLoginFactory', urlLoginFactory);\n\n urlLoginFactory.$inject = [\"$location\"];\n\n function urlLoginFactory($location) {\n var factory = {};\n\n factory.encodeConfiguration = encodeConfiguration;\n factory.decodeConfiguration = decodeConfiguration;\n factory.getPreHashURL = getPreHashURL;\n factory.getConfigURL = getConfigURL;\n factory.compactConfigKeys = compactConfigKeys;\n factory.uncompactConfigKeys = uncompactConfigKeys;\n factory.decodePostHash = decodePostHash;\n factory.getConfigFromCurrentURL = getConfigFromCurrentURL;\n\n function encodeConfiguration(type, configuration) {\n var configDict = {\n t: type,\n c: factory.compactConfigKeys(configuration)\n };\n return encodeURIComponent(b64EncodeUnicode(JSON.stringify(configDict)));\n }\n\n function decodeConfiguration(encodedConfiguration) {\n var configDict = JSON.parse(b64DecodeUnicode(decodeURIComponent(encodedConfiguration)));\n\n return {\n type: configDict.t,\n configuration: factory.uncompactConfigKeys(configDict.c)\n };\n }\n\n function decodePostHash(postHash) {\n if (isEmpty(postHash))\n return null;\n\n if (postHash.substr(0, 1) == \"/\")\n postHash = postHash.substr(1);\n\n var splitURL = postHash.split(\"/\");\n\n if (splitURL.length < 4 || splitURL[0] != 'c')\n return null;\n\n var host = splitURL[1], username = splitURL[2], config = splitURL[3], decodedConfiguration = null;\n\n try {\n decodedConfiguration = factory.decodeConfiguration(config);\n } catch (e) {\n return null;\n }\n\n if (host != \"_\")\n decodedConfiguration.configuration.host = host;\n\n if (username != \"_\") {\n var usernameKey = decodedConfiguration.type == 'sftp' ? 'remoteUsername' : 'username';\n\n decodedConfiguration.configuration[usernameKey] = username;\n }\n\n return decodedConfiguration;\n }\n\n function getPreHashURL() {\n var absURL = $location.absUrl();\n var splitURL = absURL.split('#');\n return splitURL[0];\n }\n\n function getConfigURL(type, configuration) {\n if(configuration == null)\n return null;\n\n configuration = angular.copy(configuration);\n var host = null, username = null;\n\n if (configuration.hasOwnProperty('host')) {\n host = configuration.host;\n delete configuration.host;\n }\n\n var usernameKey = type == 'sftp' ? 'remoteUsername' : 'username';\n\n if (configuration.hasOwnProperty(usernameKey)) {\n username = configuration[usernameKey];\n delete configuration[usernameKey];\n }\n\n if (isEmpty(host))\n host = '_';\n else\n host = encodeURIComponent(host);\n\n if (isEmpty(username))\n username = '_';\n else\n username = encodeURIComponent(username);\n\n var postHash = '/c/' + host + '/' + username + '/' + factory.encodeConfiguration(type, configuration);\n\n return factory.getPreHashURL() + \"#\" + postHash;\n }\n\n function getConfigFromCurrentURL() {\n var absURL = $location.absUrl();\n var splitURL = absURL.split('#');\n if(splitURL.length == 1)\n return null;\n\n return decodePostHash(splitURL[1]);\n }\n\n function getTransformLookup(isCompact) {\n var compactLookup = [\n [\"passive\", \"v\"],\n [\"ssl\", \"s\"],\n [\"password\", \"p\"],\n [\"initialDirectory\", \"i\"],\n [\"port\", \"o\"],\n [\"authenticationModeName\", \"m\"],\n [\"privateKeyFilePath\", \"r\"],\n [\"publicKeyFilePath\", \"q\"]\n ];\n\n var to = isCompact ? 1 : 0;\n var from = isCompact ? 0 : 1;\n\n var transformLookup = {};\n\n for (var i = 0; i < compactLookup.length; ++i) {\n transformLookup[compactLookup[i][from]] = compactLookup[i][to];\n }\n\n return transformLookup;\n }\n\n function compactAndUncompact(isCompact, toTransform) {\n var transformResult = {};\n\n var transformLookup = getTransformLookup(isCompact);\n\n for (var key in toTransform) {\n if (!toTransform.hasOwnProperty(key))\n continue;\n\n var value = toTransform[key];\n\n if (transformLookup.hasOwnProperty(key))\n key = transformLookup[key];\n\n if (isCompact) {\n if (value === true)\n value = 1;\n else if (value === false)\n value = 0;\n } else {\n if (value === 1)\n value = true;\n if (value === 0)\n value = false;\n }\n\n transformResult[key] = value;\n }\n\n return transformResult;\n }\n\n function compactConfigKeys(config) {\n return compactAndUncompact(true, config);\n }\n\n function uncompactConfigKeys(config) {\n return compactAndUncompact(false, config);\n }\n\n return factory;\n }\n}());","(function () {\n angular.module('MonstaFTP').factory('uploadFactory', uploadFactory);\n\n uploadFactory.$inject = ['connectionFactory', '$rootScope', '$translate'];\n\n function uploadFactory(connectionFactory, $rootScope, $translate) {\n var EXTRACT_PROGRESS_STEPS = 8;\n\n return {\n _uploads: [],\n _activeUploadCount: 0,\n addUpload: function (name, remotePath, fileObject, size, isArchive) {\n if(!EXTRACT_UPLOAD)\n isArchive = false;\n\n if (size > MAX_UPLOAD_BYTES)\n return false;\n\n this._uploads.push({\n name: name,\n remotePath: remotePath,\n file: fileObject,\n request: null,\n stats: new FileTransferStats(size),\n hasError: false,\n isArchive: isArchive,\n archiveExtractMax: 0,\n archiveExtractCurrent: -1\n });\n $rootScope.$broadcast('upload:add');\n if (this._activeUploadCount < MAX_CONCURRENT_UPLOADS)\n this.startUploadOfItemAtIndex(this._uploads.length - 1);\n\n return true;\n },\n startNextItem: function () {\n if (this._activeUploadCount >= MAX_CONCURRENT_UPLOADS)\n return;\n\n for (var itemIndex = 0; itemIndex < this._uploads.length; ++itemIndex) {\n if (this._uploads[itemIndex].stats.hasBeenStarted())\n continue;\n\n this.startUploadOfItemAtIndex(itemIndex);\n break;\n }\n },\n getUploads: function () {\n return this._uploads;\n },\n getUploadItem: function (itemIndex) {\n return this._uploads[itemIndex];\n },\n progressItem: function (uploadItem, transferredBytes) {\n uploadItem.stats.updateTransferAmount(transferredBytes);\n $rootScope.$broadcast('upload:progress');\n },\n getUploadRequestBody: function (remotePath, isArchive) {\n var requestBody = connectionFactory.getRequestBody();\n requestBody.actionName = isArchive ? UPLOAD_ARCHIVE_ACTION : UPLOAD_ACTION;\n\n requestBody.context = {\n remotePath: remotePath\n };\n\n return requestBody;\n },\n encodeRequestBody: function (requestBody) {\n var jsonRequestBody = JSON.stringify(requestBody);\n\n return b64EncodeUnicode(jsonRequestBody);\n },\n getXHR: function () {\n return new XMLHttpRequest();\n },\n startXHR: function (request, requestBody, file) {\n ++this._activeUploadCount;\n request.open('POST', UPLOAD_PATH);\n request.setRequestHeader(\"X-Monsta\", this.encodeRequestBody(requestBody));\n request.send(file);\n $rootScope.$broadcast('upload:start');\n },\n startUploadOfItemAtIndex: function (itemIndex) {\n var fileRequestDescription = this._uploads[itemIndex];\n var request = this.getXHR();\n fileRequestDescription.request = request;\n var _this = this;\n\n var requestBody = this.getUploadRequestBody(fileRequestDescription.remotePath,\n fileRequestDescription.isArchive);\n\n request.upload.addEventListener(\"progress\", function (e) {\n if (request.readyState == XMLHttpRequest.OPENED)\n _this.progressItem(fileRequestDescription, e.lengthComputable ? e.loaded : null);\n }, false);\n\n request.upload.addEventListener('load', function () {\n fileRequestDescription.stats.completedBytes = fileRequestDescription.stats.totalBytes;\n $rootScope.$broadcast('upload:progress');\n }, false);\n\n request.onreadystatechange = function () {\n if (request.readyState === XMLHttpRequest.DONE) {\n if (request.status == 200)\n _this.completeItem(fileRequestDescription, request.responseText, false);\n else if (request.status != 0) // is zero on abort\n _this.setItemError(fileRequestDescription);\n }\n };\n this.startXHR(request, requestBody, fileRequestDescription.file);\n fileRequestDescription.stats.wasStarted();\n },\n progressExtract: function (fileKey, uploadItem, fileCount, fileOffset) {\n var _this = this;\n connectionFactory.extractArchive(fileKey, fileOffset, EXTRACT_PROGRESS_STEPS).then(function () {\n uploadItem.archiveExtractCurrent = Math.min(fileOffset + EXTRACT_PROGRESS_STEPS, fileCount);\n\n if((fileOffset + EXTRACT_PROGRESS_STEPS) > (fileCount + 1)) {\n _this.completeItem(uploadItem, null, true);\n } else {\n _this.progressExtract(fileKey, uploadItem, fileCount, fileOffset + EXTRACT_PROGRESS_STEPS);\n }\n }, function (response) {\n showResponseError(response, \"extract archive\", $rootScope, $translate);\n _this.completeItem(uploadItem, null, true);\n });\n },\n completeItem: function (uploadItem, responseText, isPostExtract) {\n var _this = this;\n if(uploadItem.isArchive && !isPostExtract) {\n var responseData = JSON.parse(responseText);\n uploadItem.archiveExtractCurrent = 0;\n uploadItem.archiveExtractMax = responseData.fileCount;\n this.progressExtract(responseData.fileKey, uploadItem, responseData.fileCount, 0);\n } else {\n --this._activeUploadCount;\n uploadItem.request = null;\n uploadItem.stats.complete();\n this.removeItem(uploadItem);\n\n setTimeout(function () {\n _this.broadcastComplete.call(_this);\n }, 0);\n }\n }, broadcastComplete: function () {\n $rootScope.$broadcast('upload:load');\n this.startNextItem();\n },\n abortItem: function (uploadItem) {\n --this._activeUploadCount;\n if (uploadItem.request != null) {\n uploadItem.request.abort();\n uploadItem.request = null;\n }\n\n this.removeItem(uploadItem);\n $rootScope.$broadcast('upload:abort');\n this.startNextItem();\n },\n removeItem: function (uploadItem) {\n this._uploadIterator(function (_itemIndex, _item) {\n if (uploadItem.remotePath == _item.remotePath) {\n if (_item.request != null)\n return false;\n\n this._uploads.splice(_itemIndex, 1);\n return false;\n }\n })\n },\n setItemError: function (uploadItem) {\n uploadItem.hasError = true;\n if (uploadItem.request != null) {\n uploadItem.request = null;\n $rootScope.$broadcast('upload:error');\n }\n },\n _uploadIterator: function (callback) {\n for (var itemIndex = 0; itemIndex < this._uploads.length; ++itemIndex) {\n if (callback.call(this, itemIndex, this._uploads[itemIndex]) === false)\n break;\n }\n },\n abortAll: function () {\n for (var itemIndex = 0; itemIndex < this._uploads.length; ++itemIndex) {\n var uploadItem = this._uploads[itemIndex];\n\n if (uploadItem.request != null) {\n uploadItem.request.abort();\n uploadItem.request = null;\n }\n }\n this._uploads = [];\n $rootScope.$broadcast('upload:abort');\n }\n };\n }\n}());","(function () {\n angular.module('MonstaFTP').factory('uploadUIFactory', uploadUIFactory);\n\n uploadUIFactory.$inject = ['uiOperationFactory', 'uploadFactory', '$filter', '$rootScope', '$translate'];\n\n function uploadUIFactory(uiOperationFactory, uploadFactory, $filter, $rootScope, $translate) {\n var sizeFilter = $filter('file_size'),\n NAME_INDEX = 0,\n REMOTE_PATH_INDEX = 1,\n FILE_INDEX = 2,\n SIZE_INDEX = 3,\n IS_ARCHIVE_INDEX = 4;\n\n function showErrorModal(message) {\n $rootScope.$broadcast('modal-error:show', message, function () {\n \n });\n }\n \n function showTooLargeFilesError(message, tooLargeFiles) {\n\n for (var fileIndex = 0; fileIndex < tooLargeFiles.length; ++fileIndex) {\n var fileData = tooLargeFiles[fileIndex];\n message += \"
        \" + fileData[0] + \" (\" + sizeFilter(fileData[1]) + \")\";\n }\n\n showErrorModal(message);\n }\n\n function broadcastExtractMessage(factory, $rootScope, message) {\n $rootScope.$broadcast(\"modal-choice:show\", \"EXTRACT_AFTER_UPLOAD_TITLE\", message, [\n [\"UPLOAD_STANDARD_ACTION\", function() {\n factory.uploadStandardCallback()\n }],\n [\"UPLOAD_EXTRACT_ACTION\", function () {\n factory.uploadAndExtractCallback()\n }]\n ]);\n }\n\n return {\n tooLargeFiles: [],\n filesToQueue: [],\n fileQueueIndex: 0,\n treeTotalSize: 0,\n treeProcessed: 0,\n traverseFinished: false,\n uploadStandardCallback: function () {\n this.filesToQueue[this.fileQueueIndex][IS_ARCHIVE_INDEX] = false;\n this.processUploadQueue();\n },\n uploadAndExtractCallback: function () {\n this.filesToQueue[this.fileQueueIndex][IS_ARCHIVE_INDEX] = true;\n this.processUploadQueue();\n },\n promptForExtract: function (fileName) {\n var _this = this;\n $translate(\"EXTRACT_AFTER_UPLOAD_MESSAGE\", {\n file_name: fileName,\n file_type: extractFileExtension(fileName)\n }).then(function (translatedMessage) {\n broadcastExtractMessage(_this, $rootScope, translatedMessage);\n }, function () {\n broadcastExtractMessage(_this, $rootScope, \"Extract \" + fileName + \" after uploading?\");\n });\n },\n processUploadQueue: function () {\n if(this.fileQueueIndex >= this.filesToQueue.length) {\n this.checkTooLargeFiles();\n this.performUploads();\n return;\n }\n\n var fileInfo = this.filesToQueue[this.fileQueueIndex];\n\n if(fileInfo[IS_ARCHIVE_INDEX] == null && extractFileExtension(fileInfo[NAME_INDEX]) == \"zip\")\n this.promptForExtract(fileInfo[NAME_INDEX]);\n else {\n ++this.fileQueueIndex;\n this.processUploadQueue();\n }\n },\n performUploads: function() {\n for(var i = 0; i < this.filesToQueue.length; ++i) {\n var fileInfo = this.filesToQueue[i];\n uploadFactory.addUpload(fileInfo[NAME_INDEX], fileInfo[REMOTE_PATH_INDEX], fileInfo[FILE_INDEX],\n fileInfo[SIZE_INDEX], fileInfo[IS_ARCHIVE_INDEX]);\n }\n\n this.filesToQueue = [];\n this.fileQueueIndex = 0;\n this.tooLargeFiles = [];\n },\n checkTooLargeFiles: function () {\n if (this.tooLargeFiles.length != 0) {\n var factory = this;\n $translate('UPLOAD_FILES_TOO_LARGE_MESSAGE', {item_count: this.tooLargeFiles.length,\n maximum_size: sizeFilter(MAX_UPLOAD_BYTES)}).then(function (translatedMessage) {\n showTooLargeFilesError(translatedMessage, factory.tooLargeFiles);\n }, function (message) {\n showTooLargeFilesError(message, factory.tooLargeFiles);\n });\n }\n },\n doUploadAdd: function (file, relativeFilePath, isArchive) {\n var remotePath = uiOperationFactory.joinNameToCurrentDirectory(relativeFilePath);\n\n if (file.size > MAX_UPLOAD_BYTES)\n this.tooLargeFiles.push([relativeFilePath, file.size]);\n else\n this.filesToQueue.push([file.name, remotePath, file, file.size, isArchive]);\n },\n traverseFileTree: function (item, path, isArchive) {\n path = path || \"\";\n var _this = this;\n if (item.isFile) {\n ++_this.treeTotalSize;\n item.file(function (file) {\n ++_this.treeProcessed;\n var relativeFilePath = pathJoin(path, item.name);\n _this.doUploadAdd.call(_this, file, relativeFilePath, isArchive);\n if(_this.traverseFinished && _this.treeProcessed == _this.treeTotalSize) {\n _this.processUploadQueue();\n }\n });\n } else if (item.isDirectory) {\n var dirReader = item.createReader();\n dirReader.readEntries(function (entries) {\n for (var entryIndex = 0; entryIndex < entries.length; ++entryIndex) {\n _this.traverseFileTree.call(_this, entries[entryIndex], pathJoin(path, item.name),\n isArchive);\n }\n });\n }\n },\n handleItemsBasedUpload: function (items, isArchive) {\n if(!EXTRACT_UPLOAD)\n isArchive = false;\n\n this.tooLargeFiles = [];\n this.filesToQueue = [];\n this.fileQueueIndex = 0;\n this.treeTotalSize = 0;\n this.treeProcessed = 0;\n this.traverseFinished = false;\n for (var itemIndex = 0; itemIndex < items.length; ++itemIndex) {\n var item = items[itemIndex].webkitGetAsEntry();\n if (item)\n this.traverseFileTree(item, null, isArchive);\n }\n this.fileQueueIndex = 0;\n this.traverseFinished = true;\n },\n handleFilesBasedUpload: function (files, isArchive) {\n if(!EXTRACT_UPLOAD)\n isArchive = false;\n\n this.tooLargeFiles = [];\n this.filesToQueue = [];\n this.fileQueueIndex = 0;\n var checkedFilesCount = 0, _this = this;\n\n var handleFileCheckFinished = function () {\n if (checkedFilesCount != files.length)\n return;\n\n for (fileIndex = 0; fileIndex < files.length; ++fileIndex) {\n file = files[fileIndex];\n var relativeFilePath = file.webkitRelativePath ? file.webkitRelativePath : file.name;\n _this.doUploadAdd.call(_this, file, relativeFilePath, isArchive);\n }\n _this.processUploadQueue();\n };\n\n if (window.FileReader == undefined) {\n // can't check if it's file or folder so just try to upload and hope for the best\n checkedFilesCount = files.length;\n handleFileCheckFinished();\n return;\n }\n\n var loadSuccess = function() {\n ++checkedFilesCount;\n handleFileCheckFinished();\n };\n\n for (var fileIndex = 0; fileIndex < files.length; ++fileIndex) {\n var file = files[fileIndex];\n\n var reader = new FileReader();\n\n reader.onerror = function () {\n $translate('FOLDER_UPLOAD_CHROME_ONLY_MESSAGE').then(showErrorModal, showErrorModal);\n };\n\n reader.onload = loadSuccess;\n\n if (file.size <= MAX_UPLOAD_BYTES) {\n // we won't be able to upload them anyway so don't bother reading\n try {\n reader.readAsBinaryString(file);\n } catch (e) {\n\n }\n } else\n loadSuccess();\n }\n }\n };\n }\n}());","(function () {\n angular.module('MonstaFTP').filter('file_last_modified', filesLastModified);\n\n filesLastModified.$inject = ['dateFilter'];\n\n function filesLastModified(dateFilter) {\n function filter(input) {\n if (typeof(input) != 'number')\n return '';\n\n var inputDate = new Date(input * 1000);\n var currentDate = new Date();\n var format;\n\n if (inputDate.getDate() == currentDate.getDate() &&\n inputDate.getMonth() == currentDate.getMonth() &&\n inputDate.getFullYear() == currentDate.getFullYear())\n format = 'shortTime';\n else\n format = 'mediumDate';\n\n return dateFilter(inputDate, format)\n }\n\n return filter;\n }\n}());","angular.module('MonstaFTP').filter('file_size', function () {\n return function (input) {\n return normalizeFileSize(input);\n };\n});","angular.module('MonstaFTP').filter(\"html_safe\", ['$sce', function($sce) {\n return function(htmlCode){\n return $sce.trustAsHtml(htmlCode);\n };\n}]);","(function () {\n angular.module('MonstaFTP').filter('human_time_since', humanTimeSince);\n function humanTimeSince() {\n function timestampToFormattedDate(timeStamp, dmyFormat) {\n var d = new Date(timeStamp * 1000);\n if (dmyFormat === true)\n return d.getDate() + '/' + (d.getMonth() + 1) + '/' + d.getFullYear();\n\n return (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();\n }\n\n return function (input, dmyFormat) {\n if (typeof(input) != 'number')\n return '';\n\n var scaledTimeDelta, units,\n timeDiff = Date.now() / 1000 - input,\n timeSteps = [\n [3540, 60, 'minute'], // 59 minutes\n [82800, 3600, 'hour'], // 23 hours\n [2592000, 86400, 'day'] // 30 days\n ];\n\n if (timeDiff < 0 || timeDiff > timeSteps[timeSteps.length - 1][0])\n return timestampToFormattedDate(input, dmyFormat);\n else if (timeDiff <= 60)\n return 'now';\n\n for (var i = 0; i < timeSteps.length; ++i) {\n if (timeDiff > timeSteps[i][0])\n continue;\n\n scaledTimeDelta = Math.round(timeDiff / timeSteps[i][1]);\n units = timeSteps[i][2];\n break;\n }\n\n if (scaledTimeDelta != 1)\n units += 's';\n\n return scaledTimeDelta + ' ' + units + ' ago';\n }\n }\n}());","angular.module('MonstaFTP').filter('icon', function () {\n return function (item) {\n if (item.isDirectory)\n return 'fa-folder';\n\n if (item.isLink)\n return 'fa-long-arrow-right';\n\n var iconName = '';\n\n switch (extractFileExtension(item.name)) {\n case 'doc':\n case 'docx':\n iconName = 'word';\n break;\n case 'xlr':\n case 'xls':\n case 'xlsx':\n iconName = 'excel';\n break;\n case 'ppt':\n case 'pps':\n case 'pptx':\n iconName = 'powerpoint';\n break;\n case 'pdf':\n iconName = 'pdf';\n break;\n case 'txt':\n case 'rtf':\n case 'text':\n iconName = 'text';\n break;\n case 'bmp':\n case 'gif':\n case 'jpg':\n case 'png':\n case 'psd':\n case 'tif':\n case 'ai':\n case 'eps':\n case 'svg':\n case 'ps':\n case 'jpeg':\n iconName = 'image';\n break;\n case 'avi':\n case 'flv':\n case 'm4v':\n case 'mov':\n case 'mp4':\n case 'mkv':\n case 'mpg':\n case 'wmv':\n iconName = 'video';\n break;\n case 'wav':\n case 'mp3':\n case 'wma':\n case 'm4a':\n case 'm4p':\n case 'mpa':\n case 'flac':\n case 'aif':\n case 'aiff':\n iconName = 'audio';\n break;\n case 'tar':\n case 'zip':\n case 'tgz':\n case 'gz':\n case 'gzip':\n case 'rar':\n iconName = 'archive';\n break;\n case 'htm':\n case 'html':\n case 'php':\n case 'asp':\n case 'aspx':\n case 'js':\n case 'css':\n case 'xhtml':\n case 'cfm':\n case 'pl':\n case 'py':\n case 'c':\n case 'cpp':\n case 'rb':\n case 'java':\n case 'xml':\n iconName = 'code';\n break;\n default:\n break;\n }\n\n return 'fa-file' + (iconName == '' ? '' : '-') + iconName + '-o';\n }\n});","angular.module('MonstaFTP').filter('item_permission_description', ['permissionsFactory', function (permissionsFactory) {\n return function (item) {\n var description = item.isDirectory ? 'd' : '-';\n var permissionObject = permissionsFactory.numericToObject(item.numericPermissions);\n description += permissionObject.ownerRead ? 'r' : '-';\n description += permissionObject.ownerWrite ? 'w' : '-';\n description += permissionObject.ownerExecute ? 'x' : '-';\n\n description += permissionObject.groupRead ? 'r' : '-';\n description += permissionObject.groupWrite ? 'w' : '-';\n description += permissionObject.groupExecute ? 'x' : '-';\n\n description += permissionObject.otherRead ? 'r' : '-';\n description += permissionObject.otherWrite ? 'w' : '-';\n description += permissionObject.otherExecute ? 'x' : '-';\n\n return description;\n };\n}]);\n","angular.module('MonstaFTP').filter('sort_description', function () {\n return function (sortName) {\n // these are localized so must be uppercase\n switch (sortName) {\n case 'modified':\n return 'CHANGED';\n default:\n return sortName.toUpperCase();\n }\n };\n});\n","angular.module('MonstaFTP').filter('spaces_to_nbsp', function () {\n return function (input) {\n return input.replace(/ /g, String.fromCharCode(160));\n };\n});\n","angular.module('MonstaFTP').filter('transfer_percent', function () {\n return function (upload) {\n if (!upload.hasError && upload.request == null && !upload.stats.hasBeenStarted()) {\n return 0;\n }\n\n if (upload.stats == null)\n return 0;\n\n if(upload.archiveExtractMax != 0 && upload.archiveExtractCurrent != -1)\n return upload.archiveExtractCurrent / upload.archiveExtractMax * 100;\n\n return upload.stats.getTransferPercent();\n };\n});","angular.module('MonstaFTP').filter('transfer_rate', function () {\n return function (upload) {\n if (upload.stats == null)\n return '-';\n\n var tr = upload.stats.calculateTransferRate();\n\n var fileSize = normalizeFileSize(tr);\n return fileSize == '' ? '-' : fileSize + '/s';\n };\n});","String.prototype.capitalizeFirstLetter = function () {\n return this.charAt(0).toUpperCase() + this.slice(1);\n};\n\nif (typeof String.prototype.trim !== 'function') {\n String.prototype.trim = function () {\n return this.replace(/^\\s+|\\s+$/g, '');\n }\n}"],"sourceRoot":"/source/"}