/* <copyright> This file contains proprietary software owned by Motorola Mobility, Inc.<br/> No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/> (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. </copyright> */ //////////////////////////////////////////////////////////////////////// // var Montage = require("montage/core/core").Montage, Component = require("montage/ui/component").Component, NinjaPrompt = require("js/components/prompt.reel").NinjaPrompt; //////////////////////////////////////////////////////////////////////// // exports.BaseDocumentModel = Montage.create(Component, { //////////////////////////////////////////////////////////////////// // hasTemplate: { value: false }, //////////////////////////////////////////////////////////////////// // _file: { value: null }, //////////////////////////////////////////////////////////////////// // file: { get: function() {return this._file;}, set: function(value) {this._file = value;} }, //////////////////////////////////////////////////////////////////// // _isActive: { value: true }, //////////////////////////////////////////////////////////////////// // isActive: { get: function() {return this._isActive;}, set: function(value) {this._isActive = value;} }, //////////////////////////////////////////////////////////////////// // _needsSave: { value: null }, //////////////////////////////////////////////////////////////////// // needsSave: { get: function() {return this._needsSave;}, set: function(value) {this._needsSave = value;} }, //////////////////////////////////////////////////////////////////// // _currentView: { value: null }, //////////////////////////////////////////////////////////////////// // currentView: { get: function() {return this._currentView;}, set: function(value) {this._currentView = value;} }, //////////////////////////////////////////////////////////////////// // _selection: { value: [] }, domContainer: { value: null }, //////////////////////////////////////////////////////////////////// // selection: { get: function() {return this._selection;}, set: function(value) {this._selection = value;} }, //////////////////////////////////////////////////////////////////// // fileTemplate: { value: null }, //////////////////////////////////////////////////////////////////// // parentContainer: { value: null }, //////////////////////////////////////////////////////////////////// // views: { value: null }, //////////////////////////////////////////////////////////////////// // libs: { value: null }, _mObjects: { value: [] }, mObjects: { get: function() { return this._mObjects; }, set: function(value) { this._mObjects = value; } }, //////////////////////////////////////////////////////////////////// // switchViewTo: { value: function (view) { // } }, //////////////////////////////////////////////////////////////////// //TODO: Add API to allow other browser support browserPreview: { value: function (browser, screen, context) { //Making call to show feedback screen if (screen) screen.show(context); //Generating URL for document var url = this.application.ninja.coreIoApi.rootUrl + this.file.uri.split(this.application.ninja.coreIoApi.cloudData.root)[1]; //TODO: Add logic to prompt user to save (all) before preview this.saveAll(null,function (success) { //Making call to show feedback screen if (screen) screen.hide(context); //TODO: Add error handling logic if (!success) { console.log('Error!'); return; } //Currently only supporting current browser (Chrome, obviously) switch (this.browser) { case 'chrome': if (this.template && (this.template.type === 'banner' || this.template.type === 'animation')) { window.open('/js/document/templates/preview/banner.html?width='+this.template.size.width+'&height='+this.template.size.height+'&url='+this.url); } else { window.open(this.url); } break; default: if (this.template && (this.template.type === 'banner' || this.template.type === 'animation')) { window.open('/js/document/templates/preview/banner.html?width='+this.template.size.width+'&height='+this.template.size.height+'&url='+this.url); } else { window.open(this.url); } break; } }.bind({browser: browser, url: url, template: this.fileTemplate})); } }, //////////////////////////////////////////////////////////////////// //Gets all stylesheets in document getStyleSheets: { value: function () { //Array to store styles (style and link tags) var styles = []; //Looping through document sytles for (var k in this.views.design.iframe.contentWindow.document.styleSheets) { //Check for styles to has proper propeties if (this.views.design.iframe.contentWindow.document.styleSheets[k].ownerNode && this.views.design.iframe.contentWindow.document.styleSheets[k].ownerNode.getAttribute) { //Check for ninja-template styles, if so, exclude if (this.views.design.iframe.contentWindow.document.styleSheets[k].ownerNode.getAttribute('data-ninja-template') === null) { styles.push(this.views.design.iframe.contentWindow.document.styleSheets[k]); } } } //Returning filtered results return styles; } }, //////////////////////////////////////////////////////////////////// // save: { value: function (callback, libCopyCallback) { //TODO: Implement on demand logic if (this.needsSave) { //Save } else { //Ignore command } // if (this.currentView === this.views.design) { // var save = this.application.ninja.ioMediator.fileSave({ mode: 'html', libs: this.libs, file: this.file, webgl: this.webGlHelper.glData, styles: this.getStyleSheets(), template: this.fileTemplate, document: this.views.design.iframe.contentWindow.document, head: this.views.design.iframe.contentWindow.document.head, body: this.views.design.iframe.contentWindow.document.body, mjsTemplateCreator: this.views.design.iframe.contentWindow.mjsTemplateCreator }, this.handleSaved.bind({callback: callback, model: this}), libCopyCallback); //TODO: Improve detection during save routine if (save) { if (save.montageId) { this.libs.montageId = save.montageId; this.libs.montage = true; } if (save.canvasId) { this.libs.canvasId = save.canvasId; this.libs.canvas = true; } } } else { //TODO: Add logic to save code view data } } }, //////////////////////////////////////////////////////////////////// // saveAll: { value: function (callback, libCopyCallback) { //TODO: Implement on demand logic if (this.needsSave) { //Save } else { //Ignore command } // if (this.currentView === this.views.design) { // var save = this.application.ninja.ioMediator.fileSave({ mode: 'html', libs: this.libs, file: this.file, webgl: this.webGlHelper.glData, css: this.getStyleSheets(), template: this.fileTemplate, document: this.views.design.iframe.contentWindow.document, head: this.views.design.iframe.contentWindow.document.head, body: this.views.design.iframe.contentWindow.document.body, mjsTemplateCreator: this.views.design.iframe.contentWindow.mjsTemplateCreator }, this.handleSaved.bind({callback: callback, model: this}), libCopyCallback); //TODO: Improve detection during save routine if (save) { if (save.montageId) { this.libs.montageId = save.montageId; this.libs.montage = true; } if (save.canvasId) { this.libs.canvasId = save.canvasId; this.libs.canvas = true; } } } else { //TODO: Add logic to save code view data } } }, //////////////////////////////////////////////////////////////////// // saveAs: { value: function (callback) { //TODO: Implement on demand logic if (this.needsSave) { //Save current file on memory } else { //Copy file from disk } //TODO: Add functionality } }, //////////////////////////////////////////////////////////////////// // handleSaved: { value: function (result) { //Checking for success code in save if (result.status === 204) { //Clearing flag with successful save this.model.needsSave = false; } //Making callback call if specifed with results of operation if (this.callback) this.callback(result); } }, //////////////////////////////////////////////////////////////////// // handleSavePrompt: { value: function (continueToClose, callback) { //TODO: Perhaps add logic to save the file is the user wants if (continueToClose) { if (callback) callback(); } else { //User canceled //this.saveAll(null, callback); } } }, //////////////////////////////////////////////////////////////////// //TODO: Implement better logic to include different views on single document close: { value: function (view, callback) { //Checking if files needs to be saved to avoid losing data if (this.needsSave) { //Creating prompt to ask user to save the file var prompt = NinjaPrompt.create(); prompt.initialize('confirm', {message: 'Do you want to save the changes you made in the document '+this.file.name+'?\n\nYour changes will be lost if you do not save them.'}, function (result){this.handleSavePrompt(result, callback);}.bind(this)); //Showing the prompt, it will make callback with user input prompt.show(); } else { //TODO: Add support for other views if (!view || view === 'design') { this.closeView('design'); } //Making callback if (callback) callback(); } } }, //////////////////////////////////////////////////////////////////// // closeView: { value: function (view) { //Checking for view mode to close switch (view.toLowerCase()) { case 'design': //TODO: Make into clean method in the design view this.views.design.pauseAndStopVideos(); this.parentContainer.removeChild(this.views.design.iframe); this.views.design = null; break; default: //TODO: Error? break; } } } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// }); //////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////