From 86837d69186bc4d1d6f54fc893c523de0972a0b9 Mon Sep 17 00:00:00 2001
From: Jose Antonio Marquez
Date: Fri, 1 Jun 2012 11:53:57 -0700
Subject: Creating template mediator class

This is to simplify code, more to be changed and added.
---
 js/mediators/io-mediator.js | 658 +-------------------------------------------
 1 file changed, 9 insertions(+), 649 deletions(-)

(limited to 'js/mediators')

diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js
index 4dbf32d5..4535cad6 100644
--- a/js/mediators/io-mediator.js
+++ b/js/mediators/io-mediator.js
@@ -10,49 +10,40 @@ var Montage = 			require("montage/core/core").Montage,
 	Component = 		require("montage/ui/component").Component,
 	FileIo = 			require("js/io/system/fileio").FileIo,
 	ProjectIo = 		require("js/io/system/projectio").ProjectIo,
-	TemplateCreator = 	require("node_modules/tools/template/template-creator").TemplateCreator;
+	TemplateMediator = 	require("js/document/mediators/template").TemplateDocumentMediator;
 ////////////////////////////////////////////////////////////////////////
 //
 exports.IoMediator = Montage.create(Component, {
     ////////////////////////////////////////////////////////////////////
     //
     hasTemplate: {
-        enumerable: false,
         value: false
     },
     ////////////////////////////////////////////////////////////////////
     //
     deserializedFromTemplate: {
-        enumerable: false,
         value: function () {
             //
         }
     },
     ////////////////////////////////////////////////////////////////////
     //
+    tmplt: {
+        value: TemplateMediator
+    },
+    ////////////////////////////////////////////////////////////////////
+    //
     fio: {
-        enumerable: false,
         value: FileIo
     },
     ////////////////////////////////////////////////////////////////////
     //
     pio: {
-        enumerable: false,
         value: ProjectIo
     },
     ////////////////////////////////////////////////////////////////////
     //
-    getAppTemplatesUrlRegEx: {
-        enumerable: false,
-        value: function () {
-            var regex = new RegExp(chrome.extension.getURL('js/document/templates/montage-html').replace(/\//gi, '\\\/'), 'gi');
-            return regex;
-        }
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
     fileNew: {
-        enumerable: false,
         value: function (file, url, callback, template) {
             //Loading template from template URL
             var xhr = new XMLHttpRequest(), result;
@@ -102,7 +93,6 @@ exports.IoMediator = Montage.create(Component, {
     ////////////////////////////////////////////////////////////////////
     //
     fileOpen: {
-        enumerable: false,
         value: function (file, callback) {
             //Reading file (Ninja doesn't really open a file, all in browser memory)
             var read = this.fio.readFile({ uri: file }), result;
@@ -118,7 +108,7 @@ exports.IoMediator = Montage.create(Component, {
                         result.content = read.file.content;
                     } else {
                         //Object to be used by Ninja Template
-                        result.content = this.parseHtmlToNinjaTemplate(read.file.content);
+                        result.content = this.tmplt.parseHtmlToNinjaTemplate(read.file.content);
                     }
                     //Status of call
                     result.status = read.status;
@@ -161,7 +151,6 @@ exports.IoMediator = Montage.create(Component, {
     ////////////////////////////////////////////////////////////////////
     //
     fileSave: {
-        enumerable: false,
         value: function (doc, callback) {
             //
             var contents, save;
@@ -170,9 +159,9 @@ exports.IoMediator = Montage.create(Component, {
                 case 'html':
                     //Getting content from function to properly handle saving assets (as in external if flagged)
                     if (doc.template && (doc.template.type === 'banner' || doc.template.type === 'animation')) {
-                    	contents = this.parseNinjaTemplateToHtml(doc, true);
+                    	contents = this.tmplt.parseNinjaTemplateToHtml(doc, true);
                     } else {
-                    	contents = this.parseNinjaTemplateToHtml(doc);
+                    	contents = this.tmplt.parseNinjaTemplateToHtml(doc);
                     }
                     break;
                 default:
@@ -200,635 +189,6 @@ exports.IoMediator = Montage.create(Component, {
         value: function (file, callback) {
             //TODO: Implement Delete functionality
         }
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
-    getDataDirectory: {
-    	value: function (path) {
-    		//TODO: Implement user overwrite
-        	return this._getUserDirectory(path+'data/');
-    	}
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
-    getNinjaDirectory: {
-    	value: function (path) {
-    		//TODO: Implement user overwrite
-    		return this._getUserDirectory(this.getDataDirectory(path)+'ninja/');
-    	}
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
-    getCanvasDirectory: {
-    	value: function (path) {
-    		//TODO: Implement user overwrite
-    		return this._getUserDirectory(this.getNinjaDirectory(path)+'canvas/');
-    	}
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
-    _getUserDirectory: {
-    	value: function (path) {
-    		//Checking for data directory
-            var check = this.application.ninja.coreIoApi.fileExists({uri: path}), directory;
-            //Creating directory if doesn't exists
-            switch (check.status) {
-            	case 204: //Exists
-            		directory = path;
-            		break;
-            	case 404: //Doesn't exists
-            		directory = this.application.ninja.coreIoApi.createDirectory({uri: path});
-            		//Checking for success
-            		if (directory.status === 201) {
-            			directory = path;
-            		} else {
-            			//Error
-            			directory = null;
-            		}
-            		break;
-            	default: //Error
-            		directory = null;
-            		break;
-            }
-            //Returning the path to the directory on disk (null for any error)
-            return directory;
-    	}
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
-    parseHtmlToNinjaTemplate: {
-        enumerable: false,
-        value: function (html) {
-            //Creating temp object to mimic HTML
-            var doc = window.document.implementation.createHTMLDocument(), template;
-            //Setting content to temp
-            doc.getElementsByTagName('html')[0].innerHTML = html;
-            //Creating return object
-            return {head: doc.head.innerHTML, body: doc.body.innerHTML, document: doc};
-        }
-    },
-    ////////////////////////////////////////////////////////////////////
-    //TODO: Expand to allow more templates, clean up variables
-    parseNinjaTemplateToHtml: {
-        enumerable: false,
-        value: function (template, ninjaWrapper) {
-        	//TODO: Improve reference for rootUrl
-            var regexRootUrl,
-            	rootUrl = this.application.ninja.coreIoApi.rootUrl + escape((this.application.ninja.documentController.documentHackReference.root.split(this.application.ninja.coreIoApi.cloudData.root)[1])),
-            	mjsCreator = template.mjsTemplateCreator.create(),
-            	mJsSerialization,
-            	toremovetags = [],
-            	presentNodes,
-            	montageTemplate;
-            //Creating instance of template creator
-            montageTemplate = mjsCreator.initWithDocument(template.document);
-            //Setting up expression for parsing URLs
-            regexRootUrl = new RegExp(rootUrl.replace(/\//gi, '\\\/'), 'gi');
-            //Injecting head and body into old document
-            if (montageTemplate._ownerSerialization.length > 0) {
-            	template.file.content.document.head.innerHTML = montageTemplate._document.head.innerHTML.replace(regexRootUrl, '');
-	            template.file.content.document.body.innerHTML = montageTemplate._document.body.innerHTML.replace(regexRootUrl, '');
-	            //
-	            mJsSerialization = montageTemplate._ownerSerialization;
-            } else {
-            	template.file.content.document.head.innerHTML = template.head.innerHTML.replace(regexRootUrl, '');
-	            template.file.content.document.body.innerHTML = template.body.innerHTML.replace(regexRootUrl, '');
-            }
-            //Copying attributes to maintain same properties as the <body>
-			for (var n in template.body.attributes) {
-				if (template.body.attributes[n].value) {
-					//
-					template.file.content.document.body.setAttribute(template.body.attributes[n].name, template.body.attributes[n].value);
-				}				
-			}
-            
-            
-            
-            //TODO: Add attribute copying for <HEAD> and <HTML>
-            
-            
-            
-            //Getting list of current nodes (Ninja DOM)
-            presentNodes = template.file.content.document.getElementsByTagName('*');
-            //Looping through nodes to determine origin and removing if not inserted by Ninja
-            for (var n in presentNodes) {
-	    		if (presentNodes[n].getAttribute && presentNodes[n].getAttribute('data-ninja-node') === null) {
-		    	 	toremovetags.push(presentNodes[n]);	
-	    		} else if (presentNodes[n].getAttribute && presentNodes[n].getAttribute('data-ninja-node') !== null) {
-	    			//Removing attribute
-		    		presentNodes[n].removeAttribute('data-ninja-node');
-	    		}
-    		}
-            //Getting all CSS (style or link) tags
-            var styletags = template.file.content.document.getElementsByTagName('style'),
-    			linktags = template.file.content.document.getElementsByTagName('link'),
-    			njtemplatetags = template.file.content.document.querySelectorAll('[data-ninja-template]');
-    		
-    		//////////////////////////////////////////////////
-    		//TODO: Remove, temp hack, this is to be fixed by Montage
-    		var basetags = template.file.content.document.getElementsByTagName('base');
-    		for (var g in basetags) {
-    			if (basetags[g].getAttribute && basetags[g].href && basetags[g].href.indexOf('chrome-extension://') !== -1) toremovetags.push(basetags[g]);
-    		}
-    		//////////////////////////////////////////////////
-    		
-    		//Adding to tags to be removed form template
-    		for (var f in njtemplatetags) {
-    			if (njtemplatetags[f].getAttribute) toremovetags.push(njtemplatetags[f]);
-    		}
-            //Getting styles tags to be removed from document
-            if (styletags.length) {
-                for (var j = 0; j < styletags.length; j++) {
-                    if (styletags[j].getAttribute) {
-                        if (styletags[j].getAttribute('data-ninja-uri') !== null && !styletags[j].getAttribute('data-ninja-template')) {
-                            toremovetags.push(styletags[j]);
-                        } else if (styletags[j].getAttribute('data-ninja-external-url')) {
-                            toremovetags.push(styletags[j]);
-                        }
-                    }
-                }
-            }
-            //Removing styles tags from document
-            for (var h = 0; toremovetags[h]; h++) {
-                try {
-                    //Checking head first
-                    template.file.content.document.head.removeChild(toremovetags[h]);
-                } catch (e) {
-                    
-                }
-                try {
-                        //Checking body if not in head
-                        template.file.content.document.body.removeChild(toremovetags[h]);
-                    } catch (e) {
-                        //Error, not found!
-                    }
-            }
-            //Removing disabled tags from tags that were not originally disabled by user (Ninja enables all)
-            for (var l in linktags) {
-                if (linktags[l].getAttribute && linktags[l].getAttribute('disabled')) {//TODO: Use querySelectorAll
-                    for (var p = 0; toremovetags[p]; p++) {
-                        if (toremovetags[p].getAttribute('href') === linktags[l].getAttribute('href')) {
-                            if (!toremovetags[p].getAttribute('data-ninja-disabled')) {
-                                linktags[l].removeAttribute('disabled');
-                            }
-                        }
-                    }
-                }
-            }
-            //Checking for type of save: styles = <style> only | css = <style> and <link> (all CSS)
-            if (template.styles) {
-                //Getting all style tags
-                var styleCounter = 0,
-    				docStyles = template.file.content.document.getElementsByTagName('style');
-                //Looping through all style tags
-                for (var i in template.styles) {
-                    if (template.styles[i].ownerNode) {
-                        if (template.styles[i].ownerNode.getAttribute) {
-                            //Checking for node not to be loaded from file
-                            if (template.styles[i].ownerNode.getAttribute('data-ninja-uri') === null && !template.styles[i].ownerNode.getAttribute('data-ninja-template') && !template.styles[i].ownerNode.getAttribute('data-ninja-external-url')) {
-                                if (docStyles[styleCounter]) {
-                                    //Inseting data from rules array into tag as string
-                                    docStyles[styleCounter].innerHTML = this.getCssFromRules(template.styles[i].cssRules);
-                                    //Syncing <style> tags count since it might be mixed with <link>
-                                    styleCounter++;
-                                }
-                            }
-                        }
-                    }
-                }
-            } else if (template.css) {
-                //Getting all style and link tags
-                var styleCounter = 0,
-    				docStyles = template.file.content.document.getElementsByTagName('style'),
-    				docLinks = template.file.content.document.getElementsByTagName('link');
-                //Removing Ninja Data Attributes
-                for (var n in docLinks) {
-                    if (docLinks[n].attributes) {
-                        for (var m in docLinks[n].attributes) {
-                            if (docLinks[n].attributes[m].name && docLinks[n].attributes[m].name.indexOf('data-ninja') !== -1) {
-                                docLinks[n].removeAttribute(docLinks[n].attributes[m].name);
-                            }
-                        }
-                    }
-                }
-                //
-                for (var i in template.css) {
-                    if (template.css[i].ownerNode) {
-                        if (template.css[i].ownerNode.getAttribute) {
-                            if (template.css[i].ownerNode.getAttribute('data-ninja-uri') === null && !template.css[i].ownerNode.getAttribute('data-ninja-template')) {//TODO: Use querySelectorAll
-                                //Inseting data from rules array into <style> as string
-                                if (docStyles[styleCounter] && !template.css[i].ownerNode.getAttribute('data-ninja-external-url') && template.css[i].ownerNode.getAttribute('data-ninja-node')) {
-                                    docStyles[styleCounter].innerHTML = this.getCssFromRules(template.css[i].cssRules);
-                                    styleCounter++;
-                                }
-                            } else if (!template.css[i].ownerNode.getAttribute('data-ninja-template')) {
-                                //Checking for attributes to be added to tag upon saving
-                                for (var k in docLinks) {
-                                    if (docLinks[k].getAttribute) {
-                                        if (docLinks[k].getAttribute('href') && ('/' + docLinks[k].getAttribute('href')) === template.css[i].ownerNode.getAttribute('data-ninja-file-url')) {
-                                            for (var l in template.css[i].ownerNode.attributes) {
-                                                if (template.css[i].ownerNode.attributes[l].value) {
-                                                    if (template.css[i].ownerNode.attributes[l].name.indexOf('data-ninja') != -1) {
-                                                        //Ninja attribute...
-                                                    } else {
-                                                        docLinks[k].setAttribute(template.css[i].ownerNode.attributes[l].name, template.css[i].ownerNode.attributes[l].value);
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-
-                                ///////////////////////////////////////////////////////////////////////////////////////////
-                                ///////////////////////////////////////////////////////////////////////////////////////////
-
-
-                                var cleanedCss,
-    								dirtyCss = this.getCssFromRules(template.css[i].cssRules),
-    								fileUrl = template.css[i].ownerNode.getAttribute('data-ninja-file-url'),
-    								fileRootUrl = this.application.ninja.coreIoApi.rootUrl + fileUrl.split(fileUrl.split('/')[fileUrl.split('/').length - 1])[0],
-    								cleanedCss = dirtyCss.replace(/(\b(?:(?:https?|ftp|file|[A-Za-z]+):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$]))/gi, parseNinjaUrl.bind(this));
-
-                                function parseNinjaUrl(url) {
-                                    if (url.indexOf(this.application.ninja.coreIoApi.rootUrl) !== -1) {
-                                        return this.getUrlfromNinjaUrl(url, fileRootUrl, fileUrl);
-                                    } else {
-                                        return url;
-                                    }
-                                }
-
-                                ///////////////////////////////////////////////////////////////////////////////////////////
-                                ///////////////////////////////////////////////////////////////////////////////////////////
-
-
-
-
-                                //Saving data from rules array converted to string into <link> file
-                                var save = this.fio.saveFile({ uri: template.css[i].ownerNode.getAttribute('data-ninja-uri'), contents: cleanedCss });
-                                //TODO: Add error handling for saving files
-                            }
-                        }
-                    }
-                }
-            }
-            //
-            var matchingtags = [], scripts = template.file.content.document.getElementsByTagName('script'), webgltag, webgllibtag, webglrdgetag, mjstag, mjslibtag;
-           	//this.getDataDirectory(template.file.root)
-           	//this.getNinjaDirectory(template.file.root)
-            //
-            for (var i in scripts) {
-            	if (scripts[i].getAttribute) {
-               		if (scripts[i].getAttribute('data-ninja-canvas') !== null) {//TODO: Use querySelectorAll
-               			matchingtags.push(scripts[i]);
-                    }
-                    if (scripts[i].getAttribute('data-ninja-canvas-lib') !== null) {
-                        webgllibtag = scripts[i]; // TODO: Add logic to delete unneccesary tags
-                    }
-                    if (scripts[i].getAttribute('data-ninja-canvas-rdge') !== null) {
-               	        webglrdgetag = scripts[i]; // TODO: Add logic to delete unneccesary tags
-                    }
-                    if (scripts[i].getAttribute('type') === 'text/montage-serialization') {
-                        mjstag = scripts[i]; // TODO: Add logic to delete unneccesary tags
-                    }
-                    if (scripts[i].getAttribute('data-mjs-lib') !== null) {
-                     	mjslibtag = scripts[i]; // TODO: Add logic to delete unneccesary tags
-                    }
-                }
-            }
-            //Checking for webGL elements in document
-            if (template.webgl && template.webgl.length > 1) {//TODO: Should be length 0, hack for a temp fix
-                var rdgeDirName, rdgeVersion, cvsDataDir = this.getCanvasDirectory(template.file.root), fileCvsDir, fileCvsDirAppend, cvsDirCounter = 1;
-                //
-                if (cvsDataDir && !matchingtags.length) {
-                	fileCvsDir = cvsDataDir+template.file.name.split('.'+template.file.extension)[0];
-                	if (!this._getUserDirectory(fileCvsDir)) {
-                		fileCvsDirAppend = fileCvsDir+cvsDirCounter;
-                		while (!this._getUserDirectory(fileCvsDirAppend)) {
-                			fileCvsDirAppend = fileCvsDir+(cvsDirCounter++);
-                		}
-                	}
-                	//TODO: Allow user overwrite
-                	fileCvsDir += '/';
-                }
-                //Copy webGL library if needed
-                for (var i in this.application.ninja.coreIoApi.ninjaLibrary.libs) {
-                    //Checking for RDGE library to be available
-                    if (this.application.ninja.coreIoApi.ninjaLibrary.libs[i].name === 'RDGE') {
-                        rdgeDirName = (this.application.ninja.coreIoApi.ninjaLibrary.libs[i].name + this.application.ninja.coreIoApi.ninjaLibrary.libs[i].version).toLowerCase();
-                        rdgeVersion = this.application.ninja.coreIoApi.ninjaLibrary.libs[i].version;
-                        this.application.ninja.coreIoApi.ninjaLibrary.copyLibToCloud(template.file.root, rdgeDirName);
-                    } else {
-                        //TODO: Error handle no available library to copy
-                    }
-                }
-                //
-                if (matchingtags.length) {
-                    if (matchingtags.length === 1) {
-                        webgltag = matchingtags[0];
-                    } else {
-                        //TODO: Add logic to handle multiple tags, perhaps combine to one
-                        webgltag = matchingtags[matchingtags.length - 1]; //Saving all data to last one...
-                    }
-                }
-                //TODO: Add check for file needed
-                if (!webglrdgetag) {
-                    webglrdgetag = template.file.content.document.createElement('script');
-                    webglrdgetag.setAttribute('type', 'text/javascript');
-                    webglrdgetag.setAttribute('src', rdgeDirName + '/rdge-compiled.js');
-                    webglrdgetag.setAttribute('data-ninja-canvas-rdge', 'true');
-                    if (ninjaWrapper) {
-                    	template.file.content.document.body.getElementsByTagName('ninja-content')[0].appendChild(webglrdgetag);
-                    } else {
-                    	template.file.content.document.head.appendChild(webglrdgetag);
-                    }
-                }
-                //
-                if (!webgllibtag) {
-                    webgllibtag = template.file.content.document.createElement('script');
-                    webgllibtag.setAttribute('type', 'text/javascript');
-                    webgllibtag.setAttribute('src', rdgeDirName + '/canvas-runtime.js');
-                    webgllibtag.setAttribute('data-ninja-canvas-lib', 'true');
-                    if (ninjaWrapper) {
-                    	template.file.content.document.body.getElementsByTagName('ninja-content')[0].appendChild(webgllibtag);
-                    } else {
-                    	template.file.content.document.head.appendChild(webgllibtag);
-                    }
-                }
-                //
-                if (!webgltag && !fileCvsDir) {
-                    webgltag = template.file.content.document.createElement('script');
-                    webgltag.setAttribute('data-ninja-canvas', 'true');
-                    if (ninjaWrapper) {
-                    	template.file.content.document.body.getElementsByTagName('ninja-content')[0].appendChild(webgltag);
-                    } else {
-	                    template.file.content.document.head.appendChild(webgltag);
-	                }
-                }
-                
-                //TODO: Decide if this should be over-writter or only written on creation
-                var rootElement = 'document.body'; //TODO: Set actual root element
-                
-                //TODO: This data should be saved to a JSON file eventually
-                var json = '\n({\n\t"version": "' + rdgeVersion + '",\n\t"directory": "' + rdgeDirName + '/",\n\t"data": [';
-                //Looping through data to create escaped array
-                for (var j = 0; template.webgl[j]; j++) {
-                    if (j === 0) {
-                    	//if (fileCvsDir) {
-                    	//	json += '\n\t\t\t"' + template.webgl[j] + '"';
-                    	//} else {
-                    		json += '\n\t\t\t"' + escape(template.webgl[j]) + '"';
-                    	//}
-                    } else {
-                    	//if (fileCvsDir) {
-                    	//	json += ',\n\t\t\t"' + template.webgl[j] + '"';
-                    	//} else {
-                    		json += ',\n\t\t\t"' + escape(template.webgl[j]) + '"';
-                    	//}
-                    }
-                }
-                //Closing array (make-shift JSON string to validate data in <script> tag)
-                json += '\n\t\t]\n})\n';
-                //Setting string in tag
-                if (fileCvsDir) {
-                	//
-                	var cvsDataFilePath = fileCvsDir+'data.json', cvsDataFileUrl, cvsDataFileCheck, cvsDataFileOperation;
-                	//
-                	cvsDataFileUrl = this.getNinjaPropUrlRedirect(cvsDataFilePath.split(this.application.ninja.coreIoApi.cloudData.root+'/')[1]),
-                	cvsDataFileCheck = this.application.ninja.coreIoApi.fileExists({uri: cvsDataFilePath}),
-                	//Setting the local path to the JSON file
-                	webgllibtag.setAttribute('data-ninja-canvas-json', this.application.ninja.coreIoApi.rootUrl+'/'+cvsDataFileUrl);
-                	webgllibtag.setAttribute('data-ninja-canvas-libpath', rdgeDirName);
-                	//
-                	if (cvsDataFileCheck.status === 404 || cvsDataFileCheck.status === 204) {
-                		//Saving file
-                		cvsDataFileOperation = this.fio.saveFile({uri: cvsDataFilePath, contents: json});
-                	} else {
-                		//Error
-                	}
-                	
-                	
-                } else {
-                	webgllibtag.setAttribute('data-ninja-canvas-libpath', rdgeDirName);
-                	webgltag.innerHTML = json;
-                }
-            }
-			//Checking for Montage
-			if (mJsSerialization) {
-				//Copy Montage library if needed
-                for (var i in this.application.ninja.coreIoApi.ninjaLibrary.libs) {
-                    //Checking for Montage library to be available
-                    if (this.application.ninja.coreIoApi.ninjaLibrary.libs[i].name === 'Montage') {
-                        mjsDirName = (this.application.ninja.coreIoApi.ninjaLibrary.libs[i].name + this.application.ninja.coreIoApi.ninjaLibrary.libs[i].version).toLowerCase();
-                        mjsVersion = this.application.ninja.coreIoApi.ninjaLibrary.libs[i].version;
-                        this.application.ninja.coreIoApi.ninjaLibrary.copyLibToCloud(template.file.root, mjsDirName);
-                        
-                        
-                        
-                        //TODO: Fix to allow no overwrite and nested locations
-                        var mjsCheck, mjsPath = template.file.root + 'package.json';
-                        mjsCheck = this.application.ninja.coreIoApi.fileExists({uri: mjsPath});
-                        //
-                        if (!mjsCheck || mjsCheck.status !== 204) {
-	                        var packjson = this.application.ninja.coreIoApi.createFile({ uri: mjsPath, contents: '{"mappings": {\n\t\t"montage": "' + mjsDirName + '/montage/",\n\t\t"montage-google": "' + mjsDirName + '/montage-google/"\n\t}\n}' });
-                        } else {
-                        	//Already exists
-                        }
-                        
-                        
-                        
-                    } else {
-                        //TODO: Error handle no available library to copy
-                    }
-                }
-                //
-                if (!mjslibtag) {
-                    mjslibtag = template.file.content.document.createElement('script');
-                    mjslibtag.setAttribute('type', 'text/javascript');
-                    mjslibtag.setAttribute('src', mjsDirName + '/montage/montage.js');
-                    mjslibtag.setAttribute('data-package', '.');
-                    mjslibtag.setAttribute('data-mjs-lib', 'true');
-                    if (ninjaWrapper) {
-                    	template.file.content.document.body.getElementsByTagName('ninja-content')[0].appendChild(mjslibtag);
-                    } else {
-                    	template.file.content.document.head.appendChild(mjslibtag);
-                    }
-                    
-                }
-                //
-                if (!mjstag) {
-                    mjstag = template.file.content.document.createElement('script');
-                    mjstag.setAttribute('type', 'text/montage-serialization');
-                    if (ninjaWrapper) {
-                    	template.file.content.document.body.getElementsByTagName('ninja-content')[0].appendChild(mjstag);
-                    } else {
-                    	template.file.content.document.head.appendChild(mjstag);
-                    }
-                    
-                }
-                //
-                mjstag.innerHTML = mJsSerialization;
-                mjsCreator = null;
-			}
-            //Cleaning URLs from HTML
-            var cleanHTML;
-            if (ninjaWrapper) {
-            	cleanHTML = template.file.content.document.body.innerHTML.replace(/(\b(?:(?:https?|ftp|file|[A-Za-z]+):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$]))/gi, parseNinjaRootUrl.bind(this));
-            } else {
-            	cleanHTML = template.file.content.document.documentElement.outerHTML.replace(/(\b(?:(?:https?|ftp|file|[A-Za-z]+):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$]))/gi, parseNinjaRootUrl.bind(this));
-      	    }
-            //
-            function parseNinjaRootUrl(url) {
-                if (url.indexOf(this.application.ninja.coreIoApi.rootUrl) !== -1) {
-                    return this.getUrlfromNinjaUrl(url, rootUrl, rootUrl.replace(new RegExp((this.application.ninja.coreIoApi.rootUrl).replace(/\//gi, '\\\/'), 'gi'), '') + 'file.ext');
-                } else {
-                    return url;
-                }
-            }
-            //
-            if (ninjaWrapper) {
-            	cleanHTML = cleanHTML.replace(/ninja-viewport/gi, 'div');
-            	cleanHTML = cleanHTML.replace(/ninja-content/gi, 'div');
-            }
-            //
-            return this.getPrettyHtml(cleanHTML.replace(this.getAppTemplatesUrlRegEx(), ''));
-        }
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
-    getUrlfromNinjaUrl: {
-        enumerable: false,
-        value: function (url, fileRootUrl, fileUrl) {
-            //
-            if (url.indexOf(fileRootUrl) !== -1) {
-                url = url.replace(new RegExp(fileRootUrl.replace(/\//gi, '\\\/'), 'gi'), '');
-            } else {
-                //TODO: Clean up vars
-                var assetsDirs = (url.replace(new RegExp((this.application.ninja.coreIoApi.rootUrl).replace(/\//gi, '\\\/'), 'gi'), '')).split('/');
-                var fileDirs = (fileUrl.split(fileUrl.split('/')[fileUrl.split('/').length - 1])[0]).split('/');
-                var counter = 0;
-                var path = '';
-                var newURL = '';
-                //
-                for (var p = 0; p < fileDirs.length - 1; p++) {
-                    if (fileDirs[p] === assetsDirs[p]) {
-                        counter++;
-                    }
-                }
-                //
-                for (var p = 0; p < (fileDirs.length - counter) - 1; p++) {
-                    path += '../';
-                }
-                //
-                for (var p = counter; p < assetsDirs.length; p++) {
-                    newURL += '/' + assetsDirs[p];
-                }
-                //
-                url = (path + newURL).replace(/\/\//gi, '/');
-            }
-            //
-            return url;
-        }
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
-    getDocRootUrl: {
-        value: function () {
-        	//TODO: Add support for model.baseHref (base tag)
-        	return this.application.ninja.coreIoApi.rootUrl + escape((this.application.ninja.documentController.documentHackReference.root.split(this.application.ninja.coreIoApi.cloudData.root)[1]).replace(/\/\//gi, '/'));
-        }
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
-    getNinjaPropUrlRedirect: {
-        enumerable: false,
-        value: function (prop/* , root */) {
-            //Checking for property value to not contain a full direct URL
-            if (!prop.match(/(\b(?:(?:https?|ftp|file|[A-Za-z]+):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$]))/gi)) {
-                //Checking for attributes and type of source
-                if (prop.indexOf('href') !== -1 || prop.indexOf('src') !== -1) {
-                    //From HTML attribute
-                    //if (root) {
-                    //prop = (root+prop).replace(/"([^"]*)"/gi, this.getNinjaUrlPrepend.bind(this));
-                    //} else {
-                    prop = prop.replace(/"([^"]*)"/gi, this.getNinjaUrlPrepend.bind(this));
-                    //}
-                } else if (prop.indexOf('url') !== -1) {
-                    //From CSS property
-                    //if (root) {
-                    //prop = (root+prop).replace(/[^()\\""\\'']+/g, cssUrlToNinjaUrl.bind(this));
-                    //} else {
-                    prop = prop.replace(/[^()\\""\\'']+/g, cssUrlToNinjaUrl.bind(this));
-                    //}
-                    function cssUrlToNinjaUrl(s) {
-                        if (s !== 'url') {
-                            s = this.getDocRootUrl() + s;
-                        }
-                        return s;
-                    }
-                }
-            }
-            return prop;
-        }
-    },
-    ////////////////////////////////////////////////////////////////////
-    //
-    getNinjaUrlPrepend: {
-        enumerable: false,
-        value: function (url) {
-            if (url.indexOf('data:') !== -1) {
-                return url;
-            } else {
-                return '"' + this.getDocRootUrl() + url.replace(/\"/gi, '') + '"';
-            }
-        }
-    },
-    ////////////////////////////////////////////////////////////////////
-    //Method to return a string from CSS rules (to be saved to a file)
-    getCssFromRules: {
-        enumerable: false,
-        value: function (list) {
-            //Variable to store CSS definitions
-            var i, str, css = '';
-            //Looping through list
-            if (list && list.length > 0) {
-                //Adding each list item to string and also adding breaks
-                for (i = 0; list[i]; i++) {
-                    css += list[i].cssText;
-                }
-            }
-            //Returning the CSS string
-            return this.getPrettyCss(css.replace(this.getAppTemplatesUrlRegEx(), ''));
-        }
-    },
-    ////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////
-    //Pretty methods (minified)
-    /*
-    is-beautify javascript code courtesy of Einar Lielmanis:
-    Code from https://github.com/einars/js-beautify
-    License https://github.com/einars/js-beautify/blob/master/license.txt
-    Used with author's permission, as stated below
-		
-    Copyright (c) 2009 - 2011, Einar Lielmanis
-    Permission is hereby granted, free of charge, to any person
-    obtaining a copy of this software and associated documentation
-    files (the "Software"), to deal in the Software without
-    restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the
-    Software is furnished to do so, subject to the following
-    conditions:The above copyright notice and this permission notice shall be
-    included in all copies or substantial portions of the Software.
-    */
-    //For HTML, including any JS or CSS (single string/file)
-    getPrettyHtml: {
-        enumerable: false,
-        value: function (a, b) { function h() { this.pos = 0; this.token = ""; this.current_mode = "CONTENT"; this.tags = { parent: "parent1", parentcount: 1, parent1: "" }; this.tag_type = ""; this.token_text = this.last_token = this.last_text = this.token_type = ""; this.Utils = { whitespace: "\n\r\t ".split(""), single_token: "br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed".split(","), extra_liners: "head,body,/html".split(","), in_array: function (a, b) { for (var c = 0; c < b.length; c++) { if (a === b[c]) { return true } } return false } }; this.get_content = function () { var a = ""; var b = []; var c = false; while (this.input.charAt(this.pos) !== "<") { if (this.pos >= this.input.length) { return b.length ? b.join("") : ["", "TK_EOF"] } a = this.input.charAt(this.pos); this.pos++; this.line_char_count++; if (this.Utils.in_array(a, this.Utils.whitespace)) { if (b.length) { c = true } this.line_char_count--; continue } else if (c) { if (this.line_char_count >= this.max_char) { b.push("\n"); for (var d = 0; d < this.indent_level; d++) { b.push(this.indent_string) } this.line_char_count = 0 } else { b.push(" "); this.line_char_count++ } c = false } b.push(a) } return b.length ? b.join("") : "" }; this.get_contents_to = function (a) { if (this.pos == this.input.length) { return ["", "TK_EOF"] } var b = ""; var c = ""; var d = new RegExp("</" + a + "\\s*>", "igm"); d.lastIndex = this.pos; var e = d.exec(this.input); var f = e ? e.index : this.input.length; if (this.pos < f) { c = this.input.substring(this.pos, f); this.pos = f } return c }; this.record_tag = function (a) { if (this.tags[a + "count"]) { this.tags[a + "count"]++; this.tags[a + this.tags[a + "count"]] = this.indent_level } else { this.tags[a + "count"] = 1; this.tags[a + this.tags[a + "count"]] = this.indent_level } this.tags[a + this.tags[a + "count"] + "parent"] = this.tags.parent; this.tags.parent = a + this.tags[a + "count"] }; this.retrieve_tag = function (a) { if (this.tags[a + "count"]) { var b = this.tags.parent; while (b) { if (a + this.tags[a + "count"] === b) { break } b = this.tags[b + "parent"] } if (b) { this.indent_level = this.tags[a + this.tags[a + "count"]]; this.tags.parent = this.tags[b + "parent"] } delete this.tags[a + this.tags[a + "count"] + "parent"]; delete this.tags[a + this.tags[a + "count"]]; if (this.tags[a + "count"] == 1) { delete this.tags[a + "count"] } else { this.tags[a + "count"]-- } } }; this.get_tag = function () { var a = ""; var b = []; var c = false; do { if (this.pos >= this.input.length) { return b.length ? b.join("") : ["", "TK_EOF"] } a = this.input.charAt(this.pos); this.pos++; this.line_char_count++; if (this.Utils.in_array(a, this.Utils.whitespace)) { c = true; this.line_char_count--; continue } if (a === "'" || a === '"') { if (!b[1] || b[1] !== "!") { a += this.get_unformatted(a); c = true } } if (a === "=") { c = false } if (b.length && b[b.length - 1] !== "=" && a !== ">" && c) { if (this.line_char_count >= this.max_char) { this.print_newline(false, b); this.line_char_count = 0 } else { b.push(" "); this.line_char_count++ } c = false } b.push(a) } while (a !== ">"); var d = b.join(""); var e; if (d.indexOf(" ") != -1) { e = d.indexOf(" ") } else { e = d.indexOf(">") } var f = d.substring(1, e).toLowerCase(); if (d.charAt(d.length - 2) === "/" || this.Utils.in_array(f, this.Utils.single_token)) { this.tag_type = "SINGLE" } else if (f === "script") { this.record_tag(f); this.tag_type = "SCRIPT" } else if (f === "style") { this.record_tag(f); this.tag_type = "STYLE" } else if (this.Utils.in_array(f, unformatted)) { var g = this.get_unformatted("</" + f + ">", d); b.push(g); this.tag_type = "SINGLE" } else if (f.charAt(0) === "!") { if (f.indexOf("[if") != -1) { if (d.indexOf("!IE") != -1) { var g = this.get_unformatted("-->", d); b.push(g) } this.tag_type = "START" } else if (f.indexOf("[endif") != -1) { this.tag_type = "END"; this.unindent() } else if (f.indexOf("[cdata[") != -1) { var g = this.get_unformatted("]]>", d); b.push(g); this.tag_type = "SINGLE" } else { var g = this.get_unformatted("-->", d); b.push(g); this.tag_type = "SINGLE" } } else { if (f.charAt(0) === "/") { this.retrieve_tag(f.substring(1)); this.tag_type = "END" } else { this.record_tag(f); this.tag_type = "START" } if (this.Utils.in_array(f, this.Utils.extra_liners)) { this.print_newline(true, this.output) } } return b.join("") }; this.get_unformatted = function (a, b) { if (b && b.indexOf(a) != -1) { return "" } var c = ""; var d = ""; var e = true; do { if (this.pos >= this.input.length) { return d } c = this.input.charAt(this.pos); this.pos++; if (this.Utils.in_array(c, this.Utils.whitespace)) { if (!e) { this.line_char_count--; continue } if (c === "\n" || c === "\r") { d += "\n"; this.line_char_count = 0; continue } } d += c; this.line_char_count++; e = true } while (d.indexOf(a) == -1); return d }; this.get_token = function () { var a; if (this.last_token === "TK_TAG_SCRIPT" || this.last_token === "TK_TAG_STYLE") { var b = this.last_token.substr(7); a = this.get_contents_to(b); if (typeof a !== "string") { return a } return [a, "TK_" + b] } if (this.current_mode === "CONTENT") { a = this.get_content(); if (typeof a !== "string") { return a } else { return [a, "TK_CONTENT"] } } if (this.current_mode === "TAG") { a = this.get_tag(); if (typeof a !== "string") { return a } else { var c = "TK_TAG_" + this.tag_type; return [a, c] } } }; this.get_full_indent = function (a) { a = this.indent_level + a || 0; if (a < 1) return ""; return Array(a + 1).join(this.indent_string) }; this.printer = function (a, b, c, d, e) { this.input = a || ""; this.output = []; this.indent_character = b; this.indent_string = ""; this.indent_size = c; this.brace_style = e; this.indent_level = 0; this.max_char = d; this.line_char_count = 0; for (var f = 0; f < this.indent_size; f++) { this.indent_string += this.indent_character } this.print_newline = function (a, b) { this.line_char_count = 0; if (!b || !b.length) { return } if (!a) { while (this.Utils.in_array(b[b.length - 1], this.Utils.whitespace)) { b.pop() } } b.push("\n"); for (var c = 0; c < this.indent_level; c++) { b.push(this.indent_string) } }; this.print_token = function (a) { this.output.push(a) }; this.indent = function () { this.indent_level++ }; this.unindent = function () { if (this.indent_level > 0) { this.indent_level-- } } }; return this } var c, d, e, f, g; b = b || {}; d = b.indent_size || 4; e = b.indent_char || " "; g = b.brace_style || "collapse"; f = b.max_char || "999999"; unformatted = b.unformatted || ["a"]; c = new h; c.printer(a, e, d, f, g); while (true) { var i = c.get_token(); c.token_text = i[0]; c.token_type = i[1]; if (c.token_type === "TK_EOF") { break } switch (c.token_type) { case "TK_TAG_START": c.print_newline(false, c.output); c.print_token(c.token_text); c.indent(); c.current_mode = "CONTENT"; break; case "TK_TAG_STYLE": case "TK_TAG_SCRIPT": c.print_newline(false, c.output); c.print_token(c.token_text); c.current_mode = "CONTENT"; break; case "TK_TAG_END": if (c.last_token === "TK_CONTENT" && c.last_text === "") { var j = c.token_text.match(/\w+/)[0]; var k = c.output[c.output.length - 1].match(/<\s*(\w+)/); if (k === null || k[1] !== j) c.print_newline(true, c.output) } c.print_token(c.token_text); c.current_mode = "CONTENT"; break; case "TK_TAG_SINGLE": c.print_newline(false, c.output); c.print_token(c.token_text); c.current_mode = "CONTENT"; break; case "TK_CONTENT": if (c.token_text !== "") { c.print_token(c.token_text) } c.current_mode = "TAG"; break; case "TK_STYLE": case "TK_SCRIPT": if (c.token_text !== "") { c.output.push("\n"); var l = c.token_text; if (c.token_type == "TK_SCRIPT") { var m = typeof js_beautify == "function" && js_beautify } else if (c.token_type == "TK_STYLE") { var m = typeof this.getPrettyCss == "function" && this.getPrettyCss } if (b.indent_scripts == "keep") { var n = 0 } else if (b.indent_scripts == "separate") { var n = -c.indent_level } else { var n = 1 } var o = c.get_full_indent(n); if (m) { l = m(l.replace(/^\s*/, o), b) } else { var p = l.match(/^\s*/)[0]; var q = p.match(/[^\n\r]*$/)[0].split(c.indent_string).length - 1; var r = c.get_full_indent(n - q); l = l.replace(/^\s*/, o).replace(/\r\n|\r|\n/g, "\n" + r).replace(/\s*$/, "") } if (l) { c.print_token(l); c.print_newline(true, c.output) } } c.current_mode = "TAG"; break } c.last_token = c.token_type; c.last_text = c.token_text } return c.output.join("") }
-    },
-    //For CSS (single string/file)
-    getPrettyCss: {
-        enumerable: false,
-        value: function (a, b) { function t() { r--; p = p.slice(0, -c) } function s() { r++; p += q } function o(a, b) { return u.slice(-a.length + (b || 0), b).join("").toLowerCase() == a } function n() { var b = g; i(); while (i()) { if (h == "*" && j() == "/") { g++; break } } return a.substring(b, g + 1) } function m() { var a = g; do { } while (e.test(i())); return g != a + 1 } function l() { var a = g; while (e.test(j())) g++; return g != a } function k(b) { var c = g; while (i()) { if (h == "\\") { i(); i() } else if (h == b) { break } else if (h == "\n") { break } } return a.substring(c, g + 1) } function j() { return a.charAt(g + 1) } function i() { return h = a.charAt(++g) } b = b || {}; var c = b.indent_size || 4; var d = b.indent_char || " "; if (typeof c == "string") c = parseInt(c); var e = /^\s+$/; var f = /[\w$\-_]/; var g = -1, h; var p = a.match(/^[\r\n]*[\t ]*/)[0]; var q = Array(c + 1).join(d); var r = 0; print = {}; print["{"] = function (a) { print.singleSpace(); u.push(a); print.newLine() }; print["}"] = function (a) { print.newLine(); u.push(a); print.newLine() }; print.newLine = function (a) { if (!a) while (e.test(u[u.length - 1])) u.pop(); if (u.length) u.push("\n"); if (p) u.push(p) }; print.singleSpace = function () { if (u.length && !e.test(u[u.length - 1])) u.push(" ") }; var u = []; if (p) u.push(p); while (true) { var v = m(); if (!h) break; if (h == "{") { s(); print["{"](h) } else if (h == "}") { t(); print["}"](h) } else if (h == '"' || h == "'") { u.push(k(h)) } else if (h == ";") { u.push(h, "\n", p) } else if (h == "/" && j() == "*") { print.newLine(); u.push(n(), "\n", p) } else if (h == "(") { u.push(h); l(); if (o("url", -1) && i()) { if (h != ")" && h != '"' && h != "'") u.push(k(")")); else g-- } } else if (h == ")") { u.push(h) } else if (h == ",") { l(); u.push(h); print.singleSpace() } else if (h == "]") { u.push(h) } else if (h == "[" || h == "=") { l(); u.push(h) } else { if (v) print.singleSpace(); u.push(h) } } var w = u.join("").replace(/[\n ]+$/, ""); return w }
     }
     ////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////
-- 
cgit v1.2.3


From 3f9cbffd7986cc5f42720ba38ca82c6424ba8916 Mon Sep 17 00:00:00 2001
From: Jose Antonio Marquez
Date: Mon, 4 Jun 2012 11:58:53 -0700
Subject: Adding lib copy blocking to preview

This fixes an issue with launching preview before libraries were copied, hence, first time run would fail. Need to add a feedback screen for this process.
---
 js/mediators/io-mediator.js | 41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)

(limited to 'js/mediators')

diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js
index 4535cad6..c5ec951e 100644
--- a/js/mediators/io-mediator.js
+++ b/js/mediators/io-mediator.js
@@ -43,6 +43,24 @@ exports.IoMediator = Montage.create(Component, {
     },
     ////////////////////////////////////////////////////////////////////
     //
+    parseToTemplate: {
+	    value: function(content, template) {
+		    //
+            if (template.name.toLowerCase() === 'banner' || template.name.toLowerCase() === 'animation') {
+            	//Getting dimensions of banner
+           		var dimensions = template.id.split('x');
+                dimensions = {width: String(dimensions[0])+'px', height: String(dimensions[1])+'px'};
+                //
+                content = content.replace(/Dimensions@@@/gi, "Dimensions@@@"+template.id);
+                content = content.replace(/ninja-banner {}/gi, "ninja-banner {overflow: visible; width: "+dimensions.width+"; height: "+dimensions.height+"}");
+                content = content.replace(/ninja-content-wrapper {}/gi, "ninja-content-wrapper {overflow: hidden; width: "+dimensions.width+"; height: "+dimensions.height+"}");
+            }
+            //
+            return content;
+	    }
+    },
+    ////////////////////////////////////////////////////////////////////
+    //
     fileNew: {
         value: function (file, url, callback, template) {
             //Loading template from template URL
@@ -51,7 +69,7 @@ exports.IoMediator = Montage.create(Component, {
             xhr.send();
             if (xhr.readyState === 4) {
                 //Making call to create file, checking for return code
-                switch (this.fio.newFile({ uri: file, contents: parseTemplate(xhr.response, template) })) {
+                switch (this.fio.newFile({ uri: file, contents: this.parseToTemplate(xhr.response, template) })) {
                     case 201:
                         result = { status: 201, success: true, uri: file };
                         break;
@@ -65,21 +83,6 @@ exports.IoMediator = Montage.create(Component, {
                         result = { status: 500, success: false, uri: file };
                         break;
                 }
-                //TODO: Improve template data injection
-                function parseTemplate (content, template) {
-                	//
-                	if (template.name.toLowerCase() === 'banner' || template.name.toLowerCase() === 'animation') {
-                		//Getting dimensions of banner
-                		var dimensions = template.id.split('x');
-                		dimensions = {width: String(dimensions[0])+'px', height: String(dimensions[1])+'px'};
-                		//
-                		content = content.replace(/Dimensions@@@/gi, "Dimensions@@@"+template.id);
-                		content = content.replace(/ninja-banner {}/gi, "ninja-banner {overflow: visible; width: "+dimensions.width+"; height: "+dimensions.height+"}");
-                		content = content.replace(/ninja-content-wrapper {}/gi, "ninja-content-wrapper {overflow: hidden; width: "+dimensions.width+"; height: "+dimensions.height+"}");
-                	}
-                	//
-                	return content;
-                }
             } else {
                 result = { status: 500, success: false, uri: file };
             }
@@ -151,7 +154,7 @@ exports.IoMediator = Montage.create(Component, {
     ////////////////////////////////////////////////////////////////////
     //
     fileSave: {
-        value: function (doc, callback) {
+        value: function (doc, callback, libCopyCallback) {
             //
             var contents, save;
             //
@@ -159,9 +162,9 @@ exports.IoMediator = Montage.create(Component, {
                 case 'html':
                     //Getting content from function to properly handle saving assets (as in external if flagged)
                     if (doc.template && (doc.template.type === 'banner' || doc.template.type === 'animation')) {
-                    	contents = this.tmplt.parseNinjaTemplateToHtml(doc, true);
+                    	contents = this.tmplt.parseNinjaTemplateToHtml(doc, true, libCopyCallback);
                     } else {
-                    	contents = this.tmplt.parseNinjaTemplateToHtml(doc);
+                    	contents = this.tmplt.parseNinjaTemplateToHtml(doc, false, libCopyCallback);
                     }
                     break;
                 default:
-- 
cgit v1.2.3


From 1b8586c07951accbc3c0f3951966e4e258b0c5d9 Mon Sep 17 00:00:00 2001
From: Jose Antonio Marquez
Date: Mon, 4 Jun 2012 15:34:57 -0700
Subject: Adding saving blocking screen

This is for chrome preview, also fixed other preview bug with plain files not opening in preview.
---
 js/mediators/io-mediator.js | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

(limited to 'js/mediators')

diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js
index c5ec951e..c9e10896 100644
--- a/js/mediators/io-mediator.js
+++ b/js/mediators/io-mediator.js
@@ -152,29 +152,38 @@ exports.IoMediator = Montage.create(Component, {
         }
     },
     ////////////////////////////////////////////////////////////////////
-    //
+    //TODO: Optimize
     fileSave: {
         value: function (doc, callback, libCopyCallback) {
             //
-            var contents, save;
+            var content, parsedDoc, save;
             //
             switch (doc.mode) {
                 case 'html':
                     //Getting content from function to properly handle saving assets (as in external if flagged)
                     if (doc.template && (doc.template.type === 'banner' || doc.template.type === 'animation')) {
-                    	contents = this.tmplt.parseNinjaTemplateToHtml(doc, true, libCopyCallback);
+                    	parsedDoc = this.tmplt.parseNinjaTemplateToHtml(doc, true, libCopyCallback);
                     } else {
-                    	contents = this.tmplt.parseNinjaTemplateToHtml(doc, false, libCopyCallback);
+                    	parsedDoc = this.tmplt.parseNinjaTemplateToHtml(doc, false, libCopyCallback);
                     }
                     break;
                 default:
-                    contents = doc.content;
+                    content = doc.content;
                     break;
             }
-            //Making call to save file
-            save = this.fio.saveFile({ uri: doc.file.uri, contents: contents });
-            //Checking for callback
-            if (callback) callback(save);
+            if (parsedDoc) {
+            	//Making call to save file
+            	save = this.fio.saveFile({uri: doc.file.uri, contents: parsedDoc.content});
+            	//Checking for callback
+            	if (callback) callback(save);
+            	//
+            	if (!parsedDoc.libs && libCopyCallback) libCopyCallback(true); 
+            } else {
+	            //Making call to save file
+            	save = this.fio.saveFile({uri: doc.file.uri, contents: content});
+            	//Checking for callback
+            	if (callback) callback(save);
+            }
         }
     },
     ////////////////////////////////////////////////////////////////////
-- 
cgit v1.2.3


From d44f3196c925332dcaf45f7cf8c64e22a1994bb9 Mon Sep 17 00:00:00 2001
From: Nivesh Rajbhandari
Date: Mon, 4 Jun 2012 17:11:06 -0700
Subject: Fill and Ink-Bottle fixes.

Signed-off-by: Nivesh Rajbhandari <mqg734@motorola.com>
---
 js/mediators/element-mediator.js | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

(limited to 'js/mediators')

diff --git a/js/mediators/element-mediator.js b/js/mediators/element-mediator.js
index 1d5e9ade..7244b58e 100755
--- a/js/mediators/element-mediator.js
+++ b/js/mediators/element-mediator.js
@@ -389,7 +389,6 @@ exports.ElementMediator = Montage.create(Component, {
      @param eventType: Change/Changing. Will be passed to the dispatched event
      @param source: String for the source object making the call
      @param currentValue *OPTIONAL*: current value array. If not found the current value is calculated
-     @param stageRedraw: *OPTIONAL*: True. If set to false the stage will not redraw the selection/outline
      */
     setStroke: {
         value: function(els, value, eventType, source, currentValue) {
@@ -448,6 +447,44 @@ exports.ElementMediator = Montage.create(Component, {
         }
     },
 
+    getFill: {
+        value: function(el, fillProperties) {
+            return el.elementModel.controller["getFill"](el, fillProperties);
+        }
+    },
+
+
+    /**
+     Set a property change command for an element or array of elements
+     @param els: Array of elements. Can contain 1 or more elements
+     @param value: Value to be set. This is the fill info
+     @param eventType: Change/Changing. Will be passed to the dispatched event
+     @param source: String for the source object making the call
+     @param currentValue *OPTIONAL*: current value array. If not found the current value is calculated
+     */
+    setFill: {
+        value: function(els, value, eventType, source, currentValue) {
+
+            if(eventType !== "Changing") {
+                // Calculate currentValue if not found for each element
+                if(!currentValue) {
+                    var that = this,
+                        val = value;
+                    currentValue = els.map(function(item) {
+                        return that.getFill(item, val);
+                    });
+                }
+                document.application.undoManager.add("Set fill", this.setFill, this, els, currentValue, eventType, source, value);
+            }
+
+            for(var i=0, item; item = els[i]; i++) {
+                item.elementModel.controller["setFill"](item, (value[i] || value), eventType, source);
+            }
+
+            NJevent("element" + eventType, {type : "setFill", source: source, data: {"els": els, "prop": "fill", "value": value}, redraw: null});
+        }
+    },
+
     //--------------------------------------------------------------------------------------------------------
     // Routines to get/set 3D properties
     get3DProperty: {
-- 
cgit v1.2.3


From 945fac7b1593260757b6f2864810ca9916d7d698 Mon Sep 17 00:00:00 2001
From: Nivesh Rajbhandari
Date: Tue, 5 Jun 2012 11:36:03 -0700
Subject: Updated ink bottle tool to support color-chip's checkbox and
 undo/redo for strokes/borders.

Signed-off-by: Nivesh Rajbhandari <mqg734@motorola.com>
---
 js/mediators/element-mediator.js | 61 ++++++++--------------------------------
 1 file changed, 11 insertions(+), 50 deletions(-)

(limited to 'js/mediators')

diff --git a/js/mediators/element-mediator.js b/js/mediators/element-mediator.js
index 7244b58e..da8cbb76 100755
--- a/js/mediators/element-mediator.js
+++ b/js/mediators/element-mediator.js
@@ -373,17 +373,13 @@ exports.ElementMediator = Montage.create(Component, {
     },
 
     getStroke: {
-        value: function(el) {
-            if(!el.elementModel) {
-                NJUtils.makeElementModel(el, "Div", "block");
-            }
-            return el.elementModel.controller["getStroke"](el);
+        value: function(el, strokeProperties) {
+            return el.elementModel.controller["getStroke"](el, strokeProperties);
         }
     },
 
-
     /**
-     Set a property change command for an element or array of elements
+     Set stroke/border properties on an element or array of elements
      @param els: Array of elements. Can contain 1 or more elements
      @param value: Value to be set. This is the stroke info
      @param eventType: Change/Changing. Will be passed to the dispatched event
@@ -393,54 +389,20 @@ exports.ElementMediator = Montage.create(Component, {
     setStroke: {
         value: function(els, value, eventType, source, currentValue) {
 
-            if(eventType === "Changing") {
-                this._setStroke(els, value, isFill, eventType, source);
-            } else {
+            if(eventType !== "Changing") {
                 // Calculate currentValue if not found for each element
                 if(!currentValue) {
-                    var that = this;
+                    var that = this,
+                        val = value;
                     currentValue = els.map(function(item) {
-                        return that.getStroke(item);
+                        return that.getStroke(item, val);
                     });
                 }
-
-                var command = Montage.create(Command, {
-                    _els:               { value: els },
-                    _value:             { value: value },
-                    _previous:          { value: currentValue },
-                    _eventType:         { value: eventType},
-                    _source:            { value: "undo-redo"},
-                    description:        { value: "Set Color"},
-                    receiver:           { value: this},
-
-                    execute: {
-                        value: function(senderObject) {
-                            if(senderObject) this._source = senderObject;
-                            this.receiver._setStroke(this._els, this._value, this._eventType, this._source);
-                            this._source = "undo-redo";
-                            return "";
-                        }
-                    },
-
-                    unexecute: {
-                        value: function() {
-                            this.receiver._setStroke(this._els, this._previous, this._eventType, this._source);
-                            return "";
-                        }
-                    }
-                });
-
-                NJevent("sendToUndo", command);
-                command.execute(source);
+                document.application.undoManager.add("Set stroke", this.setStroke, this, els, currentValue, eventType, source, value);
             }
 
-        }
-    },
-
-    _setStroke: {
-        value: function(els, value, eventType, source) {
             for(var i=0, item; item = els[i]; i++) {
-                item.elementModel.controller["setStroke"](item, value);
+                item.elementModel.controller["setStroke"](item, (value[i] || value), eventType, source);
             }
 
             NJevent("element" + eventType, {type : "setStroke", source: source, data: {"els": els, "prop": "stroke", "value": value}, redraw: null});
@@ -453,9 +415,8 @@ exports.ElementMediator = Montage.create(Component, {
         }
     },
 
-
     /**
-     Set a property change command for an element or array of elements
+     Set fill/background properties for an element or array of elements
      @param els: Array of elements. Can contain 1 or more elements
      @param value: Value to be set. This is the fill info
      @param eventType: Change/Changing. Will be passed to the dispatched event
@@ -478,7 +439,7 @@ exports.ElementMediator = Montage.create(Component, {
             }
 
             for(var i=0, item; item = els[i]; i++) {
-                item.elementModel.controller["setFill"](item, (value[i] || value), eventType, source);
+                item.elementModel.controller["setFill"](item, (value[i] || value));
             }
 
             NJevent("element" + eventType, {type : "setFill", source: source, data: {"els": els, "prop": "fill", "value": value}, redraw: null});
-- 
cgit v1.2.3