/* This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
*/ var Montage = require("montage/core/core").Montage, Component = require("montage/ui/component").Component; var SaveAsDialog = exports.SaveAsDialog = Montage.create(Component, { hasReel: { value: true }, fileName : { enumerable: true, writable: true, value: null }, folderUri:{ enumerable: true, writable: true, value: null }, callback : { enumerable: true, writable: true, value: null }, callbackScope : { enumerable: true, writable: true, value: null }, prepareForDraw: { value: function() { this.newFileName.value = this.fileName; this.fileInputField.newFileDirectory.value = this.folderUri; } }, willDraw: { enumerable: false, value: function() {} }, draw: { enumerable: false, value: function() {} }, didDraw: { enumerable: false, value: function() { var self = this; this.fileInputField.selectDirectory = true; this.fileInputField.pickerName = "saveAsDirectoryPicker"; this.addPropertyChangeListener("newFileName.value", this.handleNewFileNameChange, false); this.newFileName.element.addEventListener("keyup", this, false); this.eventManager.addEventListener("newFileDirectorySet", function(evt){self.handleNewFileDirectorySet(evt);}, false); this.okButton.addEventListener("click", function(evt){self.handleOkButtonAction(evt);}, false); this.cancelButton.addEventListener("click", function(evt){self.handleCancelButtonAction(evt);}, false); this.eventManager.addEventListener("enterKey", this, false); this.eventManager.addEventListener("escKey", this, false); this.enableOk(); this.element.addEventListener("keyup", function(evt){ if(evt.keyCode == 27) {//ESC key if(self.application.ninja.newFileController.saveAsDialog !== null){ self.handleCancelButtonAction(); } }else if((evt.keyCode == 13) && !(evt.ctrlKey || evt.metaKey)){//ENTER key if((self.application.ninja.newFileController.saveAsDialog !== null) && !self.okButton.hasAttribute("disabled")){ self.handleOkButtonAction(); } } }, true); this.newFileName.element.focus(); this.newFileName.element.select(); } }, handleNewFileDirectorySet:{ value:function(evt){ this.folderUri = evt._event.newFileDirectory; if(this.isValidUri(this.folderUri)){ this.enableOk(); } } }, handleNewFileNameChange:{ value:function(evt){ this.fileName = this.newFileName.value; if(this.isValidFileName(this.fileName)){ this.enableOk(); } } }, handleKeyup:{ value: function(evt){ if(evt.keyCode === 13){ if(!this.okButton.hasAttribute("disabled")){ this.handleOkButtonAction(evt); } }else if(evt.keyCode === 27){ this.handleCancelButtonAction(evt); } } }, handleEnterKey:{ value: function(evt){ if((this.application.ninja.newFileController.saveAsDialog !== null) && !this.okButton.hasAttribute("disabled")){ this.handleOkButtonAction(evt); } } }, handleEscKey:{ value: function(evt){ if(this.application.ninja.newFileController.saveAsDialog !== null){ this.handleCancelButtonAction(evt); } } }, enableOk:{ value: function(){ if(this.isValidFileName(this.fileName) && this.isValidUri(this.folderUri)){ this.okButton.removeAttribute("disabled"); this.error.innerHTML=""; } } }, handleCancelButtonAction :{ value:function(evt){ //clean up memory this.cleanup(); if(this.popup){ this.popup.hide(); } } }, handleOkButtonAction:{ value: function(evt){ var filename = this.fileName, newFileDirectory = this.folderUri, success = true; if(this.isValidFileName(this.fileName) && this.isValidUri(this.folderUri) && !this.checkFileExists(this.fileName, this.folderUri)){ try{ //validate file name and folder path //check if file already exists if(!!this.callback){//inform document-controller if save successful this.callback({"filename":filename, "destination": newFileDirectory});//document-controller api }else{ //send save as event var saveAsEvent = document.createEvent("Events"); saveAsEvent.initEvent("saveAsFile", false, false); saveAsEvent.saveAsOptions = {"filename":filename, "destination": newFileDirectory}; this.eventManager.dispatchEvent(saveAsEvent); } }catch(e){ success = false; console.log("[ERROR] Failed to save: "+ this.fileName + " at "+ newFileDirectory); console.log(e.stack); } if(success){ //clean up memory this.cleanup(); if(this.popup){ this.popup.hide(); } } }else{ if(this.error.innerHTML === ""){ this.showError("! Name and Location should be valid."); } //disable ok if(!this.okButton.hasAttribute("disabled")){ this.okButton.setAttribute("disabled", "true"); } } } }, isValidUri:{ value: function(uri){ var status= this.application.ninja.coreIoApi.isValidUri(uri); if((uri !== null) && !status){ this.showError("! Invalid directory."); } return status; } }, isValidFileName:{ value: function(fileName){ var status = this.validateFileName(fileName); if((fileName !== null) && !status){ this.showError("! Invalid file name."); } return status; } }, checkFileExists:{ value: function(fileName, folderUri, fileType){ var uri = "", response=null, status=true; //prepare absolute uri if(/[^/\\]$/g.test(folderUri)){ folderUri = folderUri + "/"; } if(!!fileType && (fileName.lastIndexOf(fileType) !== (fileName.length - fileType.length))){ fileName = fileName+fileType; } uri = ""+folderUri+fileName; response= this.application.ninja.coreIoApi.fileExists({"uri":uri}); if(!!response && response.success && (response.status === 204)){ status = true; }else if(!!response && response.success && (response.status === 404)){ status = false; }else{ status = false; } if(status){ this.showError("! File already exists."); } return status; } }, showError:{ value:function(errorString){ this.error.innerHTML = ""; this.error.innerHTML=errorString; //disable ok if(!this.okButton.hasAttribute("disabled")){ this.okButton.setAttribute("disabled", "true"); } } }, /*** * file name validation */ validateFileName:{ value: function(fileName){ var status = false; if((fileName !== null) && (fileName !== "")){ fileName = fileName.replace(/^\s+|\s+$/g,""); if(fileName === ""){return false;} status = !(/[/\\]/g.test(fileName)); if(status && navigator.userAgent.indexOf("Macintosh") != -1){//for Mac files beginning with . are hidden status = !(/^\./g.test(fileName)); } } return status; } }, cleanup:{ value:function(){ var self = this; //remove event listener this.newFileName.removeEventListener("keyup", function(evt){self.handleNewFileNameOnkeyup(evt);}, false); this.eventManager.removeEventListener("newFileDirectorySet", function(evt){self.handleNewFileDirectorySet(evt);}, false); this.okButton.removeEventListener("click", function(evt){self.handleOkButtonAction(evt);}, false); this.cancelButton.removeEventListener("click", function(evt){self.handleCancelButtonAction(evt);}, false); this.application.ninja.newFileController.saveAsDialog = null; } } });