<!DOCTYPE HTML> <html i18n-values="dir:textdirection;"> <head> <meta charset="utf-8"> <title i18n-content="title"></title> <link rel="icon" href="../../app/theme/downloads_favicon.png"> <style type="text/css"> div.header { border-bottom: 1px solid #7289E2; padding: 8px; margin: 0; width: 100%; left: 0; top: 0; height: 32px; position: absolute; box-sizing: border-box; background-image: -webkit-linear-gradient(#D0DAF8, #A6BAF7); border-bottom-color: #999; border-bottom-width: 1px; border-left-color: #999; border-left-width: 1px; border-right-color: #999; border-right-width: 1px; color: black; } *:-khtml-drag { background-color: rgba(238,238,238, 0.5); } *[draggable] { -khtml-user-drag: element; cursor: move; } .rowlink { height: 100%; width: 90%; cursor: pointer; } .status { position: absolute; display: none; bottom: 0; left: 0; right: 0; height: 24px; border-top-color: #999; border-top-width: 1px; padding-top: 6px; padding-left: 10px; background-image: -webkit-linear-gradient(#D0DAF8, #A6BAF7); } .deleteYesNoContainer { display: -webkit-box; -webkit-box-align: center; -webkit-box-pack: center; } .deleteYes { margin: 4px; text-decoration: underline; color: blue; } .deleteNo { margin: 4px; text-decoration: underline; color: blue; } .confirmdelete { text-align: center; border: 1px solid rgba(0, 0, 0, 0.25); border-radius: 2px; min-height: 36px; padding: 4px; } .link { color: blue; text-decoration: underline; float: left; margin-left: 5px; margin-right: 5px; } .prompt { float: left; text-decoration: none; color: black; margin-left: 5px; margin-right: 5px; cursor: default; } a.iconlink { display: block; font-weight: bold; font-size: 11px; color: white; text-decoration: none; } a.iconlink img { margin-bottom: 5px; } ul.filebrowselist { list-style-type: none; margin: 0; padding: 0; position: relative; } .playbackelement { width: 600px; height: 600px; position: fixed; right: 0; top: 0; z-index: 99999; background: black; } .fullscreenplayback { width: 100%; height: 100%; position: fixed; left: 0; top: 0; z-index: 99999; background: black; } .downloading { background: white; } .imagepreview { width: 600px; position: fixed; right: 0; top: 0; z-index: 99999; background: black; } .fullscreentoggle { top: 0; right: 0; width: 50px; height: 50px; z-index: 999999; cursor: pointer; background: url('shared/images/filebrowse_fullscreen.png'); position: absolute; background-repeat: no-repeat; } li.filebrowserow div.icon { float: left; margin-left: -44px; margin-top: -3px; display: inline position: relative; width: 21px; height: 17px; background-repeat: no-repeat; } .rightarrow { opacity: 0.5; position: absolute; right: 22px; top: 8px; } .menuicon { position: absolute; right: 4px; top: 5px; height: 100%; width: 15px; margin-left: 0; background: url('shared/images/filebrowse_menu.png'); margin-top: 5px; background-repeat: no-repeat; cursor: pointer; opacity: 0.3; -webkit-transition: opacity 0.2s ease-out ; } .spinicon { position: absolute; right: 4px; top: 5px; height: 100%; width: 15px; margin-left: 0; margin-top: 5px; background-repeat: no-repeat; } li.filebrowserow:hover .menuicon { opacity: 0.75; -webkit-transition: opacity 0.0s ease-out ; } li.filebrowserow:hover .menuicon:hover { opacity: 1.0; -webkit-transition: opacity 0.0s ease-out ; } .uploadcomplete { height: 100%; position: absolute; right: 0; top: 5px; height: 100%; width: 70px; margin-left: 5px; margin-top: 5px; } .uploadprogress { position: absolute; right: 0; top: 5px; height: 100%; width: 12px; margin-left: 5px; margin-top: 5px; background-repeat: no-repeat; } li.filebrowserow { border-bottom: 1px solid #f7f7f7; padding: 8px 5px 5px 54px; font-size: .8em; position: relative; background: #fff; } .downloadstatus { width: 100%; font-size: .6em; height: 20px; } .downloadpause { right: 0; bottom: 0; height: 15px; cursor: pointer; color: blue; text-align: center; position: absolute; } li.filebrowserow:hover { background: #ebeff9; cursor: pointer; } li.filebrowserow span.name { margin-top: 10px; margin-left: -22px; position: relative; } li.filebrowserow input.name { margin-top: 0; margin-left: -22px; position: relative; } li.filebrowserow span.namelink { margin-left: -22px; position: relative; display: block; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color:#0D0052; -webkit-transition: color 1.0s ease-out ; } li.filebrowserow:hover span.namelink { text-decoration: underline; color: #20c; -webkit-transition: color 0.0s ease-out ; } li.selected { background-color: #b1c8f2 !important; } div.title { text-align: right; position: relative; font-size: .8em; font-weight: bold; padding-top: 2px; } div.controlbutton { width: 16px; height: 15px; display: inline; position: relative; z-index: 999; border: 1px solid #859EE8; cursor: pointer; padding: 4px; padding-bottom: 0; background: -webkit-linear-gradient(#F4F6FB, #CCD7F8); } div.controlbutton:hover { background: -webkit-linear-gradient(#FFF, #D9E0F6); } div.column { width: 250px; height: 100%; float: left; position: relative; } div.columnlistadv { width: 100%; bottom: 0; top: 32px; position: absolute; overflow-y: scroll; overflow-x: hidden; } div.columnlist { width: 100%; bottom: 0; top: 0; position: absolute; overflow-y: scroll; overflow-x: hidden; } div.iconmedia { background: url('shared/images/icon_media.png'); } div.iconfolder { background: url('shared/images/icon_folder.png'); } div.iconfile { background: url('shared/images/icon_file.png'); } div.iconphoto { background: url('shared/images/icon_photo.png'); } div.iconmusic { background: url('shared/images/icon_media.png'); } div.backbutton { border-radius: 4px; left: 0; top: 0; } div.playbackcontainer { top: 0; left: 0; position: absolute; width: 100%; height: 100%; background: black; } div.scanningcontainer { top: 0; left: 0; position: absolute; width: 100%; height: 100%; } .filenameprompt { top: 8px; left: 13px; font-size: .8em; position: absolute; } .filename { left: 90px; top: 3px; border-radius: 4px; right: 10px; font-size: .8em; position: absolute; } div.buttonscontainer { display: -webkit-box; bottom: 0; right: 10px; position: absolute; } div.openbutton { min-width: 50px; margin: 3px; } div.cancelbutton { min-width: 50px; margin: 3px; } #newfolderbutton { bottom: 3px; left: 10px; position: absolute; } div.disabled { color: gray; cursor: default; } div.opencontainer { width: 100%; bottom: 0; left: 0; height: 30px; position: absolute; background-image: -webkit-linear-gradient(#fcfcfc, #eff1f2 90%); } div.savecontainer { width: 100%; bottom: 0; left: 0; height: 60px; position: absolute; background-image: -webkit-linear-gradient(#fcfcfc, #eff1f2 90%); } div.container { top: 0; position: absolute; width: 100%; left: 0; bottom: 0; } div.containerwithopenbuttons { top: 0; position: absolute; right: 0; border: 1px solid #C2C2C2; margin: 4px; left: 0; bottom: 30px; } div.containerwithsavebuttons { top: 0; position: absolute; right: 0; margin: 4px; border: 1px solid #C2C2C2; left: 0; bottom: 60px; } div.fullcontainer { top: 0px; position: absolute; left: 0; bottom: 0; right: 600px; overflow-y: hidden; overflow-x: scroll; } .popout { right: 10px; top: 10px; width: 15px; text-align: center; height: 10px; font-size: .4em; background: rgb(239, 242, 249); cursor: pointer; z-index: 99999; padding-top: 1px; border: 1px solid #999; position: absolute; border-radius: 5px; } .mediacontainer { top: 0; left: 0; position: absolute; width: 100%; height: 100%; } .menu { top: 14px; right: 2px; width: 180px; -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0px 3px 3px; border-bottom-left-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-top-left-radius: 4px 4px; border-top-right-radius: 0px 0px; position: absolute; display: none; z-index: 999; background: white; border-top-left-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.6); padding: 5px; } .menuitem { width: 100%; height: 20px; text-align: left; cursor: pointer; left: 0; color: #0D0052; -webkit-transition: color 1.0s ease-out ; } .menuitem:hover { text-decoration: underline; color: #20c; background: #ebeff9; -webkit-transition: color 0.0s ease-out ; } .menuitemdisabled { width: 100%; height: 20px; text-align: left; color: gray; left: 0; } .downloading[dangerous] > * > .icon { background: url('../../app/theme/alert_small.png'); } input.error { background-color: #ff6666; } </style> <script src="shared/js/local_strings.js"></script> <script src="shared/js/media_common.js"></script> <script> function $(o) { return document.getElementById(o); } /** * Partial function application. * * Usage: * var g = partial(f, arg1, arg2); * g(arg3, arg4); * * @param {!Function} fn A function to partially apply. * @param {...*} var_args Additional arguments that are partially * applied to fn. * @return {!Function} A partially-applied form of the function partial() was * called with. */ function partial(fn, var_args) { var args = Array.prototype.slice.call(arguments, 1); return function(e) { if (e.stopPropagation) { e.stopPropagation(); } // Prepend the bound arguments to the current arguments. var newArgs = Array.prototype.slice.call(arguments); newArgs.unshift.apply(newArgs, args); return fn.apply(this, newArgs); }; } function supportsPdf() { return 'application/pdf' in navigator.mimeTypes; } var currentSavedPath = ''; var currentNode = -1; var menus = []; var currentImageMenu = ''; var inFullMode = false; var inSelectMode = false; var videoPlaybackElement = null; var photoPreviewElement = null; var numColumns = 0; var divArray = []; var rootsDiv = null; var currentlySelectedItems = []; var currentlySelectedPaths = []; var multiSelect = false; var selectFolder = false; var inSaveMode = false; var currentMenu = null; var mainColumn = null; var localStrings; var downloadList = []; var advancedEnabled = false; var mediaPlayerEnabled = false; // strings var kPauseDownload; var kResumeDownload; function enabledResult(info) { advancedEnabled = info.enabled; mediaPlayerEnabled = info.mpEnabled; mainColumn = $('main'); if (!advancedEnabled) { $('header').style.display = 'none'; } if (document.documentElement.clientWidth <= 600) { inFullMode = false; if (chrome.dialogArguments) { var args = JSON.parse(chrome.dialogArguments); if (args.type == 'open') { multiSelect = false; selectFolder = false; } else if (args.type == 'save') { inSaveMode = true; selectFolder = false; } else if (args.type == 'open_multiple') { multiSelect = true; selectFolder = false; } else if (args.type == 'folder') { multiSelect = false; selectFolder = true; } else { alert('got unknown type' + args.type); } inSelectMode = true; if (inSaveMode) { var main = mainColumn; main.className = 'containerwithsavebuttons'; var savemenu = document.createElement('div'); savemenu.className = 'savecontainer'; // The container is used for placing buttons horizontally. var buttonsContainer = document.createElement('div'); buttonsContainer.className = 'buttonscontainer'; savemenu.appendChild(buttonsContainer); var savebutton = document.createElement('button'); savebutton.id = 'savebutton'; savebutton.className = 'openbutton disabled'; savebutton.onclick = dialogSaveClick; savebutton.textContent = localStrings.getString('save'); buttonsContainer.appendChild(savebutton); var cancelbutton = document.createElement('button'); cancelbutton.className = 'cancelbutton'; cancelbutton.textContent = localStrings.getString('confirmcancel'); cancelbutton.onclick = dialogCancelClick; buttonsContainer.appendChild(cancelbutton); var filenameprompt = document.createElement('div'); filenameprompt.className = 'filenameprompt'; filenameprompt.textContent = localStrings.getString('filenameprompt'); savemenu.appendChild(filenameprompt); var backbutton = $('back'); if (backbutton) { backbutton.style.top = '5px'; } var filename = document.createElement('input'); filename.className = 'filename'; filename.id = 'filename'; filename.value = args.current_file; savemenu.appendChild(filename); if (advancedEnabled) { var newfolderbutton = document.createElement('button'); newfolderbutton.id = 'newfolderbutton'; newfolderbutton.className = 'newfolderbutton disabled'; newfolderbutton.textContent = localStrings.getString('newfolder'); newfolderbutton.onclick = dialogNewFolderClick; savemenu.appendChild(newfolderbutton); } document.body.appendChild(savemenu); // Give focus to the save button. This has to be done after the // parent node is added to document.body. savebutton.focus(); } else { var main = mainColumn; main.className = 'containerwithopenbuttons'; var openmenu = document.createElement('div'); openmenu.className = 'opencontainer'; var openbutton = document.createElement('button'); openbutton.id = 'openbutton'; openbutton.className = 'openbutton disabled'; var cancelbutton = document.createElement('button'); cancelbutton.className = 'cancelbutton'; openmenu.appendChild(openbutton); openbutton.onclick = dialogOkClick; openmenu.appendChild(cancelbutton); cancelbutton.onclick = dialogCancelClick; openbutton.textContent = localStrings.getString('open'); cancelbutton.textContent = localStrings.getString('confirmcancel'); document.body.appendChild(openmenu); var backbutton = $('back'); if (backbutton) { backbutton.style.top = '5px'; } } } } else { var main = mainColumn; main.className = 'fullcontainer'; var innerContainer = document.createElement('div'); innerContainer.className = 'container'; innerContainer.id = 'inner'; main.appendChild(innerContainer); inFullMode = true; $('back').style.display = 'none'; } if (document.location.href.indexOf('#') != -1) { var currentpathArray = document.location.href.split('#'); var path = currentpathArray[1]; if (path == 'scanningdevice') { setUpForScanning(); } else { currentNode++; currentSavedPath = path; getDataForPath(path); } } else { currentNode++; if (advancedEnabled) { currentSavedPath = 'roots'; getDataForPath('roots'); } else { currentSavedPath = localStrings.getString('downloadpath'); getDataForPath(currentSavedPath); } } chrome.send('getDownloads', []); } function isPathUnderRoot(path, includeRoot) { var downloadpath = localStrings.getString('downloadpath'); return (!includeRoot || path !== downloadpath) && path.search(downloadpath) === 0; } function goBackInList() { currentNode--; if (isPathUnderRoot(currentSavedPath, true)) { var c = currentSavedPath.split('/'); c.pop(); currentSavedPath = c.join('/'); } else { currentSavedPath = 'roots'; } getDataForPath(currentSavedPath); } function toggleFullscreen() { if (videoPlaybackElement != null) { if (videoPlaybackElement.className == 'fullscreenplayback') { videoPlaybackElement.className = 'playbackelement'; } else { videoPlaybackElement.className = 'fullscreenplayback'; } } } var lastScrollLeft = 0; function animateScrollRight() { var main = mainColumn; main.scrollLeft += 20; // since if its larger than a size, we know we reached the leftmost part when // it stops growing, so clear it out and no more timeouts. if (lastScrollLeft != main.scrollLeft) { lastScrollLeft = main.scrollLeft; setTimeout('animateScrollRight()', 15); } else { lastScrollLeft = 0; } } function getCurrentContainer() { if (inFullMode) { var newContainer = document.createElement('div'); var main = $('inner'); numColumns++; main.style.width = (numColumns * 250) + 'px'; newContainer.className = 'column'; main.appendChild(newContainer); animateScrollRight(); return newContainer; } else { return mainColumn; } } function clearList(list) { if (list.hasChildNodes()) { while (list.childNodes.length >= 1) { list.removeChild(list.firstChild); } } } function rootsChanged() { if (inFullMode) { chrome.send('getRoots', []); } } function browseFileResult(info, results) { var lastDirArray = info.path.split('/'); var lastDir = lastDirArray[lastDirArray.length - 1]; if (info.functionCall == 'getRoots') { if (rootsDiv) { clearList(rootsDiv); createNewList(lastDir, results, rootsDiv, info.path); } else { var main = getCurrentContainer(); rootsDiv = main; divArray.push(main); createNewList(lastDir, results, main, info.path); } } else if (info.functionCall == 'getChildren') { var main = getCurrentContainer(); main.addEventListener('dragover', function(e) { if (e.preventDefault) e.preventDefault(); e.dataTransfer.dropEffect = 'copy'; return false; }, false); main.addEventListener('drop', function(e) { if (e.stopPropagation) e.stopPropagation(); var src = e.dataTransfer.getData('Text'); var path = getPathAndFilenameForPath(src); var dest = currentSavedPath + '/' + path[2]; var dirId = $('list/dir/' + currentSavedPath); if (dirId) { var element = $(dest); if (!element) { // TODO(dhg): We probably should do some checking for // existance. element = createNewFakeItem(path[2], dest, false, true); } dirId.appendChild(element); element.scrollIntoView(); } chrome.send('copyFile', [src, dest]); return false; }, false); main.id = 'dir/' + info.path; divArray.push(main); document.location.hash = info.path; createNewList(lastDir, results, main, info.path); } else if (info.functionCall == 'refresh') { var main = $('dir/' + info.path); if (main) { clearList(main); createNewList(lastDir, results, main, info.path); } else { // not currently displayed, so just return. return; } } chrome.send('getDownloads', []); } function moveScrollLeft() { var main = mainColumn; main.scrollLeft += 10; } function getClassForPath(path, isDirectory) { if (isDirectory) { return 'icon iconfolder'; } else if (pathIsImageFile(path)) { return 'icon iconphoto'; } else if (pathIsVideoFile(path)) { return 'icon iconmedia'; } else if (pathIsAudioFile(path)) { return 'icon iconmusic'; } return 'icon iconfile'; } function getDataForPath(path) { var newfolderbutton = $('newfolderbutton'); if (newfolderbutton && advancedEnabled) { // Enable newfolder button for paths under downloadpath if (inSaveMode && isPathUnderRoot(path, false)) { newfolderbutton.className = 'newfolderbutton'; } else { newfolderbutton.className = 'newfolderbutton disabled'; } } if (path == 'roots') { if (inSaveMode) { var savebutton = $('savebutton'); savebutton.className = 'openbutton disabled'; } else if (inSelectMode) { var openbutton = $('openbutton'); openbutton.className = 'openbutton disabled'; } chrome.send('getRoots', []); } else { if (inSaveMode) { var savebutton = $('savebutton'); savebutton.className = 'openbutton'; } else if (inSelectMode) { var openbutton = $('openbutton'); openbutton.className = 'openbutton'; } chrome.send('getChildren', [path]); } } function setUpForScanning() { var header = $('header'); document.body.removeChild(header); var main = mainColumn; main.className = 'scanningcontainer'; main.textContent = localStrings.getString('scanning'); } function dialogOkClick() { if (currentlySelectedPaths.length == 0) { return; } if (!multiSelect) { chrome.send('DialogClose', [JSON.stringify({'path' : currentlySelectedPaths[0]})]); } else { chrome.send('DialogClose', [JSON.stringify({'path' : currentlySelectedPaths})]); } } function dialogCancelClick() { chrome.send('DialogClose', ['']); } function dialogSaveClick() { var filenameInput = $('filename'); var filename = filenameInput.value; var currentPath = currentSavedPath; if (currentPath == 'roots') { return; } currentPath += '/'; currentPath += filename; chrome.send('validateSavePath', [currentPath]); filenameInput.disabled = true; $('savebutton').disabled = true; } function onValidatedSavePath(valid, savePath) { var filenameInput = $('filename'); filenameInput.disabled = false; $('savebutton').disabled = false; if (valid) { filenameInput.classList.remove('error'); chrome.send('DialogClose', [JSON.stringify({'path' : savePath})]); } else { filenameInput.classList.add('error'); } } function createNewFormItem( initialName, isDirectory, id, blurcallback, keypresscallback) { var element = document.createElement('li'); element.className = 'filebrowserow'; element.id = 'listItem' + elementIdCounter; elementIdCounter++; var link; link = document.createElement('div'); link.className = 'rowlink'; var icon = document.createElement('div'); icon.className = getClassForPath('', isDirectory); link.appendChild(icon); var input = document.createElement('input'); input.className = 'name'; input.id = 'newfoldername'; input.onblur = blurcallback; input.onkeypress = keypresscallback; input.value = initialName; link.appendChild(input); element.appendChild(link); return element; } function createFolder(elementId) { var currentPath = currentSavedPath; var element = $('newfoldername'); if (!element) { return false; } element.id = ''; var filename = element.value; currentPath += '/'; currentPath += filename; var existingfolder = $(currentPath); var counter = 1; while (existingfolder) { var testfilepath = currentPath; testfilepath = testfilepath + counter; existingfolder = $(testfilepath); if (!existingfolder) { currentPath = testfilepath; filename = filename + counter; break; } counter++; } // Disallow / in folder name. if (filename.match(/^[^\/]+$/) === null) { return false; } var parent = element.parentNode; parent.removeChild(element); listitem = parent.parentNode; parent.onclick = getFunctionForItem(currentPath, listitem.id, true); var span = document.createElement('span'); if (inSelectMode) { span.className = 'name'; } else { span.className = 'namelink'; } span.textContent = filename; parent.appendChild(span); var rightArrow = document.createElement('span'); rightArrow.textContent = '»'; rightArrow.className = 'rightarrow'; parent.appendChild(rightArrow); chrome.send('createNewFolder', [currentPath]); } function deleteFile(path) { chrome.send('deleteFile', [path]); } function removeDeleteConfirm(path) { var element = menus[path]; element.firstChild.removeChild(element.firstChild.lastChild); } function deleteFileConfirm(path) { var element = menus[path]; if (!element || element.querySelector('.confirmdelete')) { return; } var askingDiv = document.createElement('div'); askingDiv.className = 'confirmdelete'; askingDiv.textContent = localStrings.getString('confirmdelete'); yesNoDiv = document.createElement('div'); yesNoDiv.className = 'deleteYesNoContainer'; var yes = document.createElement('div'); yes.className = 'deleteYes'; yes.textContent = localStrings.getString('confirmyes'); yes.onclick = partial(deleteFile, path); var no = document.createElement('div'); no.onclick = partial(removeDeleteConfirm, path); no.textContent = localStrings.getString('confirmcancel'); no.className = 'deleteNo'; yesNoDiv.appendChild(yes); yesNoDiv.appendChild(no); askingDiv.appendChild(yesNoDiv); element.firstChild.appendChild(askingDiv); askingDiv.scrollIntoView(); window.event.stopPropagation(); } function createFolderTyping(elementId) { if (window.event.keyCode == 13) { createFolder(elementId); } } function getDirectoryForPath(path) { var index = path.lastIndexOf('/'); if (index == -1) { return path; } return path.substr(path, index); } function pauseToggleDownload(id) { var element = $('downloaditem' + id); if (element.textContent == kPauseDownload) { element.textContent = kResumeDownload; } else { element.textContent = kPauseDownload; } // Have to convert to a string, the system wasn't accepting ints chrome.send('pauseToggleDownload', ['' + id]); } function allowDownload(id, path) { var element = $(path); element.removeAttribute('dangerous'); var pauseDiv = $('downloaditem' + id); if (pauseDiv) { if (pauseDiv.firstChild) { pauseDiv.removeChild(pauseDiv.firstChild); } pauseDiv.onclick = partial(pauseToggleDownload, id); pauseDiv.textContent = kPauseDownload; } chrome.send('allowDownload', ['' + id]); } function cancelDownload(id, path) { var element = $(path); element.removeAttribute('dangerous'); chrome.send('cancelDownload', ['' + id]); } function getPathAndFilenameForPath(path) { return path.match(/(.*)[\/\\]([^\/\\]+\.\w+)$/); } function newDownload(results) { var x; for (x = 0; x < results.length; x++) { var element = $(results[x].file_path); if (!element && results[x].state != 'CANCELLED' && results[x].state != 'INTERRUPTED') { var extracted = getPathAndFilenameForPath(results[x].file_path); var dirId = $('list/dir/' + extracted[1]); if (dirId) { element = createNewItem(results[x].file_name, results[x].file_path, false); downloadList.push(element); if (dirId.firstChild) { dirId.insertBefore(element, dirId.firstChild); } else { dirId.appendChild(element); } element.scrollIntoView(); } } } } function removeDownload(element, dirId) { var status = undefined; var pause = undefined; for (var x = 0; x < element.children.length; x++) { if (element.children[x].className == 'downloadstatus') { var child = element.children[x]; status = child; } else if (element.children[x].className == 'downloadpause') { var child = element.children[x]; pause = child; } } if (status) { element.removeChild(status); } if (pause) { element.removeChild(pause); } element.className = 'filebrowserow'; var elementList = []; for (var x = 0; x < downloadList.length; x++) { if (element != downloadList[x]) { elementList.push(downloadList[x]); } } downloadList = elementList; if (dirId) { dirId.removeChild(element); } } function downloadsList(results) { var removeDownloads = []; removeDownloads.pushUnique = function(element) { if (this.indexOf(element) === -1) { this.push(element); } }; for (var y = 0; y < downloadList.length; y++) { var found = false; for (var x = 0; x < results.length; x++) { var element = $(results[x].file_path); if (downloadList[y] == element) { found = true; break; } } if (!found) { removeDownloads.pushUnique(downloadList[y]); } } for (var i = 0; i < results.length; ++i) { downloadUpdated(results[i]); } for (var x = 0; x < removeDownloads.length; x++) { var element = removeDownloads[x]; var extracted = getPathAndFilenameForPath(element.id); var dirId = $('list/dir/' + extracted[1]); removeDownload(element, dirId); } } function downloadUpdated(result) { var element = $(result.file_path); var extracted = getPathAndFilenameForPath(result.file_path); var dirId = $('list/dir/' + extracted[1]); if (!element && result.state != 'CANCELLED' && result.state != 'INTERRUPTED') { if (dirId) { element = createNewItem(result.file_name, result.file_path, false); if (dirId.firstChild) { dirId.insertBefore(element, dirId.firstChild); } else { dirId.appendChild(element); } element.scrollIntoView(); } } if (element) { if (result.state == 'CANCELLED' || result.state == 'INTERRUPTED') { element.parentNode.removeChild(element); return; } if (result.percent < 100 || result.state == 'DANGEROUS') { var progressDiv = null; for (var y = 0; y < element.children.length; y++) { if (element.children[y].className == 'downloadstatus') { progressDiv = element.children[y]; } } if (progressDiv == null) { downloadList.push(element); element.className = 'filebrowserow downloading'; fixTitleForItem(element, result); var progressDiv = document.createElement('div'); progressDiv.className = 'downloadstatus'; element.appendChild(progressDiv); var pauseDiv = document.createElement('div'); pauseDiv.onclick = partial(pauseToggleDownload, result.id); pauseDiv.className = 'downloadpause'; if (result.state == 'DANGEROUS') { element.setAttribute('dangerous', 'true'); pauseDiv.onClick = undefined; var prompt = document.createElement('div'); prompt.textContent = localStrings.getString('allowdownload'); prompt.className = 'prompt'; pauseDiv.appendChild(prompt); var yes = document.createElement('div'); yes.className = 'link'; yes.textContent = localStrings.getString('confirmyes'); yes.onclick = partial(allowDownload, result.id, result.file_path); var no = document.createElement('div'); no.onclick = partial(cancelDownload, result.id, result.file_path); no.textContent = localStrings.getString('confirmcancel'); no.className = 'link'; pauseDiv.onclick = undefined; pauseDiv.appendChild(yes); pauseDiv.appendChild(no); progressDiv.textContent = ''; } pauseDiv.id = 'downloaditem' + result.id; element.appendChild(pauseDiv); } var pauseDiv = $('downloaditem' + result.id); if (pauseDiv && result.state == 'PAUSED' && pauseDiv.textContent != kResumeDownload) { pauseDiv.textContent = kResumeDownload; } else if (pauseDiv && result.state == 'IN_PROGRESS' && pauseDiv.textContent != kPauseDownload) { pauseDiv.textContent = kPauseDownload; } if (result.percent < 100 && result.state != 'DANGEROUS') { progressDiv.textContent = result.progress_status_text; } } else { removeDownloadIfDone(element, dirId); } } } function removeDownloadIfDone(element, dirId) { var len = downloadList.length; while (len--) { if (element.title === downloadList[len].title) { if (element.id !== downloadList[len].id) { // Dangerous download. removeDownload(downloadList[len], dirId); } else { removeDownload(downloadList[len]); } break; } } } function dialogNewFolderClick() { var newfolderbutton = $('newfolderbutton'); if (newfolderbutton.className.indexOf('disabled') != -1) { return; } var main = divArray[divArray.length - 1]; var list; for (var x = 0; x < main.childNodes.length; x++) { if (main.childNodes[x].className == 'columnlist' || main.childNodes[x].className == 'columnlistadv') { list = main.childNodes[x].firstChild; break; } } var id = 'listItem' + elementIdCounter; elementIdCounter++; var element = createNewFormItem('', true, id, partial(createFolder, id), partial(createFolderTyping, id)); list.appendChild(element); element.scrollIntoView(); var inputelement = $('newfoldername'); inputelement.focus(); } /////////////////////////////////////////////////////////////////////////////// // Document Functions: /** * Window onload handler, sets up the page. */ function load() { localStrings = new LocalStrings(); kPauseDownload = localStrings.getString('pause'); kResumeDownload = localStrings.getString('resume'); chrome.send('isAdvancedEnabled', ['']); } function jumpToNode(nodeNumber) { if (currentNode == nodeNumber) { return; } if (inFullMode) { var main = $('inner'); for (var x = (nodeNumber + 1); x < divArray.length; x++) { main.removeChild(divArray[x]); numColumns--; } divArray = divArray.slice(0, nodeNumber + 1); } currentNode = nodeNumber; } function descend(path, nodeNumber) { jumpToNode(nodeNumber); currentNode++; if (selectFolder) { currentlySelectedPaths = []; currentlySelectedPaths.push(path); } currentSavedPath = path; getDataForPath(path); } function clearPreviewPane() { if (videoPlaybackElement != null) { document.body.removeChild($('fullscreentoggle')); document.body.removeChild(videoPlaybackElement); videoPlaybackElement = null; } if (photoPreviewElement != null) { document.body.removeChild(photoPreviewElement); photoPreviewElement = null; } } function playMediaFile(path) { var newPath = 'file://' + path; chrome.send('playMediaFile', [newPath]); } function enqueueMediaFile(path) { var newPath = 'file://' + path; chrome.send('enqueueMediaFile', [newPath]); } function showImage(path) { if (inFullMode) { if (photoPreviewElement == null) { photoPreviewElement = document.createElement('img'); photoPreviewElement.className = 'imagepreview'; photoPreviewElement.src = 'file://' + path; document.body.appendChild(photoPreviewElement); } else { photoPreviewElement.src = 'file://' + path; } } else { chrome.send('openNewFullWindow', ['chrome://slideshow#' + path]); } } function showPath(path) { chrome.send('openNewFullWindow', ['file://' + path]); } function clearMenus() { if (currentMenu) { currentMenu.firstChild.style.display = 'none'; currentMenu.style.opacity = ''; currentMenu = null; } } function uploadImage(path) { var status = $('status'); status.style.display = 'block'; var extracted = getPathAndFilenameForPath(path); var main = $('dir/' + extracted[1]); main.style.bottom = '30px'; status.textContent = 'Uploading'; chrome.send('uploadToPicasaweb', [path]); } function showMenu(path) { var element = menus[path]; if (element.firstChild.style.display == 'block') { // Second click should clear the menu. clearMenus(); } else { clearMenus(); element.firstChild.style.display = 'block'; element.style.opacity = '1'; currentMenu = element; currentMenu.scrollIntoView(); } window.event.stopPropagation(); } function uploadComplete(result) { var element = $('status'); if (result.status_code == 201) { element.textContent = ''; var a = document.createElement('a'); a.href = result.url; a.target = '_blank'; //TODO(altimofeev): Should really be localStrings.getString(...) a.textContent = 'Uploaded'; element.appendChild(a); } else { element.textContent = 'Error'; } } function findInArray(arr, element) { for (var x = 0; x < arr.length; x++) { if (arr[x] == element) { return x; } } return -1; } function selectItem(elementid, path) { var element = $(elementid); if (element.className == 'filebrowserow downloading') { return; } var index; if ((index = findInArray(currentlySelectedItems, element)) != -1) { // the user must want to toggle currentlySelectedItems.splice(index, 1); element.classname = 'filebrowserow'; index = findInArray(currentlySelectedPaths, path); currentlySelectedPaths.splice(index, 1); } else { if (!multiSelect) { // clear out previous selected elements for (var x = 0; x < currentlySelectedItems.length; x++) { currentlySelectedItems[x].className = 'filebrowserow'; } currentlySelectedItems = []; currentlySelectedPaths = []; } element.className = 'selected filebrowserow'; currentlySelectedItems.push(element); currentlySelectedPaths.push(path); if (inSaveMode) { var extracted = getPathAndFilenameForPath(path); var file = $('filename'); file.value = extracted[2]; } } } function setItemInfoText(element, text) { var span; if (element.childNodes.length == 2) { span = document.createElement('span'); span.className = 'name'; span.textContent = text; element.appendChild(span); element.childNodes.item(1).style.display = 'none'; } else { span = element.childNodes.item(2); span.textContent = text; } } function getUnknownFileTypeHandler() { return function() { var element = event.currentTarget; setItemInfoText(element, localStrings.getStringF('error_unknown_file_type', element.childNodes.item(1).textContent)); }; } function getFunctionForItem(path, id, isDirectory) { if (isDirectory) { return function() { selectItem(id, path); descend(path, currentNode); }; } if (inSelectMode) { return function() { selectItem(id, path); }; } if (pathIsAudioFile(path)) { return function() { playMediaFile(path); }; } if (pathIsVideoFile(path)) { return function() { playMediaFile(path); }; } if (pathIsImageFile(path)) { return function() { showImage(path); } } if (pathIsHtmlFile(path)) { return function() { showPath(path); } } if (pathIsPdfFile(path) && supportsPdf()) { return function() { showPath(path); } } return getUnknownFileTypeHandler(); } /** * Double click handler for items. * * @param {string} path The file path of the item. * @param {string} id The id for this item. * @param {boolean} isDirectory Whether this item is a directory. * @return {Function} The function to handle the double click. */ function getDoubleClickForItem(path, id, isDirectory) { if (isDirectory) { return function() {}; } if (inSelectMode) { return function() { selectItem(id, path); dialogOkClick(); }; } return function() {}; } var elementIdCounter = 0; function createNewFakeItem(title, path, isDirectory, hasspinner) { var element = document.createElement('li'); element.className = 'filebrowserow'; element.id = path; elementIdCounter++; var link; link = document.createElement('div'); link.className = 'rowlink'; var icon = document.createElement('div'); icon.className = getClassForPath(path, isDirectory); link.appendChild(icon); var span = document.createElement('span'); span.className = 'name'; span.textContent = title; link.appendChild(span); element.appendChild(link); // Setup Menu var currentPath = currentSavedPath; if (hasspinner) { var spinicon = document.createElement('div'); spinicon.align = 'right'; spinicon.className = 'spinicon'; element.appendChild(spinicon); } return element; } function createNewItem(title, path, isDirectory) { var element = document.createElement('li'); element.setAttribute('draggable', 'true'); element.addEventListener('dragstart', function(e) { e.dataTransfer.effectAllowed = 'copy'; e.dataTransfer.setData('Text', this.id); }, false); element.className = 'filebrowserow'; element.title = title; /*element.id = 'listItem' + elementIdCounter;*/ element.id = path; elementIdCounter++; var link; link = document.createElement('div'); link.onclick = getFunctionForItem(path, element.id, isDirectory); link.ondblclick = getDoubleClickForItem(path, element.id, isDirectory); link.className = 'rowlink'; var icon = document.createElement('div'); icon.className = getClassForPath(path, isDirectory); link.appendChild(icon); var span = document.createElement('span'); if (inSelectMode) { span.className = 'name'; } else { span.className = 'namelink'; } span.textContent = title; link.appendChild(span); element.appendChild(link); // Setup Menu var currentPath = currentSavedPath; if (currentPath != 'roots') { var menuicon = document.createElement('div'); var menu = document.createElement('div'); menu.className = 'menu'; if ((pathIsVideoFile(path) || pathIsAudioFile(path)) && mediaPlayerEnabled) { var enqueueitem = document.createElement('div'); enqueueitem.textContent = localStrings.getString('enqueue'); enqueueitem.className = 'menuitem'; enqueueitem.onclick = partial(enqueueMediaFile, path); menu.appendChild(enqueueitem); } var deleteitem = document.createElement('div'); deleteitem.textContent = localStrings.getString('delete'); deleteitem.className = 'menuitem'; deleteitem.onclick = partial(deleteFileConfirm, path); menu.appendChild(deleteitem); menuicon.align = 'right'; menuicon.className = 'menuicon'; menuicon.onclick = partial(showMenu, path); menuicon.appendChild(menu); element.appendChild(menuicon); menus[path] = menuicon; } if (isDirectory) { var rightarrow = document.createElement('span'); rightarrow.innerHTML = ' »'; rightarrow.className = 'rightarrow'; link.appendChild(rightarrow); } return element; } function fixTitleForItem(element, result) { element.title = result.file_name; // This is a bit fragile. element.getElementsByTagName('span')[0].textContent = result.file_name; } function clearChildren(element) { element.innerHTML = ''; } function popout(path) { var newPath = 'chrome://filebrowse#' + path; chrome.send('openNewPopupWindow', [newPath]); } function createNewList(title, results, main, path) { downloadList = []; clearChildren(main); var mainList = document.createElement('div'); if (advancedEnabled) { mainList.className = 'columnlistadv'; } else { mainList.className = 'columnlist'; } var list = document.createElement('ul'); list.className = 'filebrowselist'; list.id = 'list/dir/' + path; // Use the translated title for the Downloads directory. if (path == localStrings.getString('downloadpath')) { document.title = (localStrings.getString('downloadtitle') || title); } else { document.title = title; } if (advancedEnabled) { var header = document.createElement('div'); header.className = 'header'; var divTitle = document.createElement('div'); divTitle.className = 'title'; if (inFullMode) { divTitle.style['text-align'] = 'center'; } divTitle.innerText = title; if (inFullMode && (path.length != 0)) { var popOutButton = document.createElement('div'); popOutButton.innerHTML = '∏'; popOutButton.className = 'popout'; popOutButton.onclick = partial(popout, path); header.appendChild(popOutButton); } header.appendChild(divTitle); main.appendChild(header); } main.appendChild(mainList); for (var x = 0; x < results.length; x++) { var element = createNewItem(results[x].title, results[x].path, results[x].isDirectory); list.appendChild(element); } mainList.appendChild(list); } </script> <body onload='load();' onclick='clearMenus()' onselectstart='return false' i18n-values=".style.fontFamily:fontfamily"> <div id='header' class=''> <div id='back' class='backbutton controlbutton' onclick='goBackInList();return false;'> <img src="shared/images/filebrowse_back.png"> </div> <div id='currenttitle' class=''></div> </div><br> <div id='main' class='container'></div> <div id='status' class='status'></div> </body> </html>