From 5914c5b2209c4b8daac4249bb76cda5c9314c4e6 Mon Sep 17 00:00:00 2001
From: Jose Antonio Marquez
Date: Thu, 24 May 2012 00:07:23 -0700
Subject: Cleaning up referencing to 'documentRoot' and '_document'

Moved to reference new model in DOM architecture rework. This should not affect anything, just moving the references, and also the setting to the render methods in the design view.
---
 .../layout/bread-crumb.reel/bread-crumb.js         |   4 +-
 js/controllers/document-controller.js              |   2 +-
 js/controllers/selection-controller.js             |   6 +-
 js/controllers/styles-controller.js                |  36 +-
 js/document/_toDelete/html-document.js             | 874 +++++++++++++++++++++
 js/document/_toDelete/text-document.js             | 198 +++++
 js/document/document-html.js                       |  34 +-
 js/document/html-document.js                       | 874 ---------------------
 js/document/models/html.js                         |   5 +
 js/document/text-document.js                       | 198 -----
 js/document/views/design.js                        |   8 +
 js/helper-classes/3D/draw-utils.js                 |  12 +-
 js/helper-classes/3D/snap-manager.js               |   6 +-
 js/helper-classes/3D/view-utils.js                 |  44 +-
 js/mediators/element-mediator.js                   |   4 +-
 js/ninja.reel/ninja.js                             |  14 +-
 .../CSSPanel/CSSPanelBase.reel/CSSPanelBase.js     |   2 +-
 .../Timeline/TimelinePanel.reel/TimelinePanel.js   |   6 +-
 .../Timeline/TimelineTrack.reel/TimelineTrack.js   |   4 +-
 .../components-panel.reel/components-panel.js      |   4 +-
 js/panels/css-panel/styles-view-delegate.js        |   2 +-
 js/panels/properties.reel/properties.js            |  12 +-
 .../properties.reel/sections/custom.reel/custom.js |   2 +-
 .../sections/position-size.reel/position-size.js   |   8 +-
 .../sections/three-d-view.reel/three-d-view.js     |   2 +-
 js/stage/layout.js                                 |   6 +-
 js/stage/stage.reel/stage.js                       |  28 +-
 js/stage/tool-handle.js                            |   4 +-
 js/tools/PanTool.js                                |  16 +-
 js/tools/Rotate3DToolBase.js                       |  12 +-
 js/tools/RotateStage3DTool.js                      |   8 +-
 js/tools/SelectionTool.js                          |   6 +-
 js/tools/Translate3DToolBase.js                    |   4 +-
 js/tools/ZoomTool.js                               |   2 +-
 js/tools/drawing-tool-base.js                      |  12 +-
 js/tools/modifier-tool-base.js                     |   8 +-
 36 files changed, 1232 insertions(+), 1235 deletions(-)
 create mode 100755 js/document/_toDelete/html-document.js
 create mode 100755 js/document/_toDelete/text-document.js
 delete mode 100755 js/document/html-document.js
 delete mode 100755 js/document/text-document.js

diff --git a/js/components/layout/bread-crumb.reel/bread-crumb.js b/js/components/layout/bread-crumb.reel/bread-crumb.js
index d2a6b1e4..2db775eb 100755
--- a/js/components/layout/bread-crumb.reel/bread-crumb.js
+++ b/js/components/layout/bread-crumb.reel/bread-crumb.js
@@ -23,7 +23,7 @@ exports.Breadcrumb = Montage.create(Component, {
         value: function(){
             if(!this.application.ninja.documentController.activeDocument) {
                 this.disabled = true;
-                this.application.ninja.currentSelectedContainer = (this.application.ninja.currentDocument ? this.application.ninja.currentDocument.documentRoot : null);
+                this.application.ninja.currentSelectedContainer = (this.application.ninja.currentDocument ? this.application.ninja.currentDocument.model.documentRoot : null);
             }
         }
     },
@@ -65,7 +65,7 @@ exports.Breadcrumb = Montage.create(Component, {
 
             parentNode = this.container;
 
-            while(parentNode !== this.application.ninja.currentDocument.documentRoot) {
+            while(parentNode !== this.application.ninja.currentDocument.model.documentRoot) {
                 this.containerElements.unshift({"node": parentNode, "nodeUuid":parentNode.uuid, "label": parentNode.nodeName});
                 parentNode = parentNode.parentNode;
             }
diff --git a/js/controllers/document-controller.js b/js/controllers/document-controller.js
index 4edcff48..f84e4da5 100755
--- a/js/controllers/document-controller.js
+++ b/js/controllers/document-controller.js
@@ -475,7 +475,7 @@ var DocumentController = exports.DocumentController = Montage.create(Component,
             this.activeDocument = doc;
 
             // Initialize the documentRoot styles
-            this.initializeRootStyles(doc.documentRoot);
+            this.initializeRootStyles(doc.model.documentRoot);
             // Flag to stop stylesheet dirty event
             this._hackInitialStyles = false;
 
diff --git a/js/controllers/selection-controller.js b/js/controllers/selection-controller.js
index 1092615a..7bef0db8 100755
--- a/js/controllers/selection-controller.js
+++ b/js/controllers/selection-controller.js
@@ -114,7 +114,7 @@ exports.SelectionController = Montage.create(Component, {
         value: function(event) {
             var selected = [], childNodes = [], self = this;
 
-            childNodes = this.application.ninja.currentDocument.documentRoot.childNodes;
+            childNodes = this.application.ninja.currentDocument.model.documentRoot.childNodes;
             childNodes = Array.prototype.slice.call(childNodes, 0);
             childNodes.forEach(function(item) {
                 if(self.isNodeTraversable(item)) {
@@ -256,10 +256,10 @@ exports.SelectionController = Montage.create(Component, {
 
             for(var i=0, uuid; this.application.ninja.selectedElements[i];i++) {
                 // Check for multiple selection and excluding inner elements
-                if(item.parentNode && item.parentNode !== this.application.ninja.currentDocument.documentRoot) {
+                if(item.parentNode && item.parentNode !== this.application.ninja.currentDocument.model.documentRoot) {
                     var outerElement = item.parentNode;
 
-                    while(outerElement.parentNode && outerElement.parentNode !== this.application.ninja.currentDocument.documentRoot) {
+                    while(outerElement.parentNode && outerElement.parentNode !== this.application.ninja.currentDocument.model.documentRoot) {
                         outerElement = outerElement.parentNode;
                     }
 
diff --git a/js/controllers/styles-controller.js b/js/controllers/styles-controller.js
index dcbe0eaf..04e87ba7 100755
--- a/js/controllers/styles-controller.js
+++ b/js/controllers/styles-controller.js
@@ -99,7 +99,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
             // Setter will handle null case
             this.defaultStylesheet = this.getSheetFromElement(this.CONST.DEFAULT_SHEET_ID);
 
-            this.userStyleSheets = nj.toArray(document._document.styleSheets).filter(function(sheet) {
+            this.userStyleSheets = nj.toArray(document.model.views.design.document.styleSheets).filter(function(sheet) {
                 return sheet !== this._stageStylesheet;
             }, this);
 
@@ -132,7 +132,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
                 else if(this._activeDocument.model && this._activeDocument.model.views && this._activeDocument.model.views.design){
                     ///// Use the last stylesheet in the document as the default
 
-                    var sheets = this._activeDocument._document.styleSheets,
+                    var sheets = this._activeDocument.model.views.design.document.styleSheets,
                         lastIndex = sheets.length-1;
 
                     ///// If the only sheet is the stage stylesheet, this will be true
@@ -887,7 +887,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
 
     getAnimationRuleWithName : {
         value: function(name, document) {
-            var doc = document || this._activeDocument._document,
+            var doc = document || this._activeDocument.model.views.design.document,
                 animRules = this.getDocumentAnimationRules(doc),
                 rule, i;
 
@@ -909,7 +909,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
 
     getDocumentAnimationRules : {
         value: function(document) {
-            var sheets = (document) ? document.styleSheets : this._activeDocument._document.styleSheets,
+            var sheets = (document) ? document.styleSheets : this._activeDocument.model.views.design.document.styleSheets,
                 rules = [];
 
             nj.toArray(sheets).forEach(function(sheet) {
@@ -1272,7 +1272,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
     
     createStylesheet : {
         value: function(id, document) {
-            var doc = document || this._activeDocument._document,
+            var doc = document || this._activeDocument.model.views.design.document,
                 sheetElement, sheet;
             
             sheetElement = nj.make('style', {
@@ -1329,7 +1329,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
     
     getSheetFromElement : {
         value : function(element, context) {
-            var doc = context || this._activeDocument._document,
+            var doc = context || this._activeDocument.model.views.design.document,
                 el  = (typeof element === 'string') ? nj.$(element, doc) : element;
                 
             if(el && el.sheet) {
@@ -1572,7 +1572,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
             getStyleTest : function() {
                 var properties = ['background-position', 'width', 'height'];
                 
-                var el = stylesController.activeDocument._document.getElementById('Div_1');
+                var el = stylesController.activeDocument.model.views.design.document.getElementById('Div_1');
                 
                 properties.forEach(function(prop) {
                     console.log('Getting value for "' + prop + '": ' + stylesController.getElementStyle(el, prop, true));
@@ -1591,7 +1591,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
                 });
             },
             getMatchingRulesTest : function() {
-                var el = stylesController.activeDocument._document.getElementById('Div_1'),
+                var el = stylesController.activeDocument.model.views.design.document.getElementById('Div_1'),
                     mRules;
                     
                 this.addRulesTest();
@@ -1606,7 +1606,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
                 ///// apply a new style using setElementStyle, and print out the new
                 ///// value.
                 
-                var el = stylesController.activeDocument._document.getElementById('Div_1'),
+                var el = stylesController.activeDocument.model.views.design.document.getElementById('Div_1'),
                     bg;
                 
                 console.log('----- Set Element Style Test -----');
@@ -1631,14 +1631,14 @@ var stylesController = exports.StylesController = Montage.create(Component, {
                 var rules = ['#UserContent div { background-color: blue }'];
                 rules.forEach(function(rule) { stylesController.addRule(rule); });
 
-                var el = stylesController.activeDocument._document.getElementById('Div_1');
+                var el = stylesController.activeDocument.model.views.design.document.getElementById('Div_1');
                 stylesController.setElementStyle(el, 'color', 'red');
                 
                 ///// the #Div_1 rule created by tag tool should have the color style
             },
             setElementStyle3Test : function() {
                 ///// First, draw a div onto the stage
-                var el = stylesController.activeDocument._document.getElementById('Div_1');
+                var el = stylesController.activeDocument.model.views.design.document.getElementById('Div_1');
 
                 //// now add a multi-target rule overriding the bg color
                 var rules = [
@@ -1655,14 +1655,14 @@ var stylesController = exports.StylesController = Montage.create(Component, {
             },
             setGroupStyleTest : function() {
                 ///// draw 2 divs on stage
-                var el1 = stylesController.activeDocument._document.getElementById('Div_1');
-                var el2 = stylesController.activeDocument._document.getElementById('Div_2');
+                var el1 = stylesController.activeDocument.model.views.design.document.getElementById('Div_1');
+                var el2 = stylesController.activeDocument.model.views.design.document.getElementById('Div_2');
 
                 var dominantRule = stylesController.getDominantRuleForGroup([el1, el2], 'color');
             },
             setElementStylesTest : function() {
                 ///// draw a div on stage
-                var el = stylesController.activeDocument._document.getElementById('Div_1');
+                var el = stylesController.activeDocument.model.views.design.document.getElementById('Div_1');
                 
                 mRules = stylesController.getMatchingRules(el, true);
                 mRules.forEach(function(rule) {
@@ -1681,7 +1681,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
                                 
                 console.log('----- Create Override Rule Test -----');
 
-                var el = stylesController.activeDocument._document.getElementById('Div_1'),
+                var el = stylesController.activeDocument.model.views.design.document.getElementById('Div_1'),
                     rule = stylesController.addRule('#UserContent div { background-color: blue }'),
                     override;
                     
@@ -1693,7 +1693,7 @@ var stylesController = exports.StylesController = Montage.create(Component, {
             },
             deleteRulesTest : function() {
                 // drag one div on stage
-                var el = stylesController.activeDocument._document.getElementById('Div_1');
+                var el = stylesController.activeDocument.model.views.design.document.getElementById('Div_1');
                 this.addRulesTest();
                 
                 mRules = stylesController.getMatchingRules(el, true);
@@ -1705,8 +1705,8 @@ var stylesController = exports.StylesController = Montage.create(Component, {
             matchesElementsExclusivelyTest : function() {
                 /// drag two divs on stage
                 var rule = stylesController.addRule('#Div_1, #Div_3 { color:black; }');
-                var el1 = stylesController.activeDocument._document.getElementById('Div_1');
-                var el2 = stylesController.activeDocument._document.getElementById('Div_2');
+                var el1 = stylesController.activeDocument.model.views.design.document.getElementById('Div_1');
+                var el2 = stylesController.activeDocument.model.views.design.document.getElementById('Div_2');
 
                 console.log('Does rule match elements exclusively? ' + stylesController.matchesElementsExclusively(rule, [el1, el2]));
             }
diff --git a/js/document/_toDelete/html-document.js b/js/document/_toDelete/html-document.js
new file mode 100755
index 00000000..447d90e3
--- /dev/null
+++ b/js/document/_toDelete/html-document.js
@@ -0,0 +1,874 @@
+/* <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,
+    TextDocument =	require("js/document/text-document").TextDocument,
+    NJUtils = 		require("js/lib/NJUtils").NJUtils,
+	GLWorld =			require("js/lib/drawing/world").World,
+    MaterialsModel = require("js/models/materials-model").MaterialsModel;
+////////////////////////////////////////////////////////////////////////
+//
+exports.HTMLDocument = Montage.create(TextDocument, {
+    
+    _selectionExclude: { value: null, enumerable: false },
+    _htmlTemplateUrl: { value: "js/document/templates/montage-html/index.html", enumerable: false},
+    _iframe: { value: null, enumerable: false },
+    _server: { value: null, enumerable: false },
+    _templateDocument: { value: null, enumerable: false },
+    _selectionModel: { value: [], enumerable: false },
+    _undoModel: { value: { "queue" : [], "position" : 0 }, enumerable: false},
+
+    _document: { value: null, enumerable: false },
+    _documentRoot: { value: null, enumerable: false },
+    _liveNodeList: { value: null, enumarable: false },
+    _stageBG: { value: null, enumerable: false },
+    _window: { value: null, enumerable: false },
+    _styles: { value: null, enumerable: false },
+    _stylesheets: { value: null, enumerable: false },
+    _stageStyleSheetId : { value: 'nj-stage-stylesheet', enumerable: false },
+    _userDocument: { value: null, enumerable: false },
+    _htmlSource: {value: "<html></html>", enumerable: false},
+    _glData: {value: null, enumerable: false },
+    _userComponents: { value: {}, enumarable: false},
+
+    _elementCounter: { value: 1, enumerable: false },
+    _snapping : { value: true, enumerable: false },
+    _layoutMode: { value: "all", enumerable: false },
+    _draw3DGrid: { value: false, writable: true },
+    _swfObject: { value: false, enumerable: false },
+
+    _zoomFactor: { value: 100, enumerable: false },
+
+    cssLoadInterval: { value: null, enumerable: false },
+
+    _savedLeftScroll: {value:null},
+    _savedTopScroll: {value:null},
+
+    _codeViewDocument:{
+        writable: true,
+        enumerable: true,
+        value:null
+    },
+
+
+    //drawUtils state
+    _gridHorizontalSpacing: {value:0},
+    _gridVerticalSpacing: {value:0},
+    //end - drawUtils state
+
+    _undoStack: { value: [] },
+    undoStack: {
+        get: function() {
+            return this._undoStack;
+        },
+        set:function(value){
+            this._undoStack = value;
+        }
+    },
+
+    _redoStack: { value: [], enumerable: false },
+
+    redoStack: {
+        get: function() {
+            return this._redoStack;
+        },
+        set:function(value){
+            this._redoStack = value;
+        }
+    },
+
+
+    // GETTERS / SETTERS
+
+    codeViewDocument:{
+        get: function() { return this._codeViewDocument; },
+        set: function(value) { this._codeViewDocument = value}
+    },
+
+    savedLeftScroll:{
+        get: function() { return this._savedLeftScroll; },
+        set: function(value) { this._savedLeftScroll = value}
+    },
+
+    savedTopScroll:{
+        get: function() { return this._savedTopScroll; },
+        set: function(value) { this._savedTopScroll = value}
+    },
+
+    gridHorizontalSpacing:{
+        get: function() { return this._gridHorizontalSpacing; },
+        set: function(value) { this._gridHorizontalSpacing = value}
+    },
+
+    gridVerticalSpacing:{
+        get: function() { return this._gridVerticalSpacing; },
+        set: function(value) { this._gridVerticalSpacing = value}
+    },
+
+    selectionExclude: {
+        get: function() { return this._selectionExclude; },
+        set: function(value) { this._selectionExclude = value; }
+    },
+
+    iframe: {
+        get: function() { return this._iframe; },
+        set: function(value) { this._iframe = value; }
+    },
+
+    server: {
+        get: function() { return this._server; },
+        set: function(value) { this._server = value; }
+    },
+
+    selectionModel: {
+        get: function() { return this._selectionModel; },
+        set: function(value) { this._selectionModel = value; }
+    },
+
+    undoModel: {
+        get: function() { return this._undoModel; },
+        set: function(value) { this._undoModel.queue = value.queue; this._undoModel.position = value.position; }
+    },
+
+    documentRoot: {
+        get: function() { return this._documentRoot; },
+        set: function(value) { this._documentRoot = value; }
+    },
+
+    stageBG: {
+        get: function() { return this._stageBG; },
+        set: function(value) { this._stageBG = value; }
+    },
+
+    elementCounter: {
+        set: function(value) { this._elementCounter = value; },
+        get: function() { return this._elementCounter; }
+    },
+
+    snapping: {
+        get: function() { return this._snapping; },
+        set: function(value) {
+            if(this._snapping !== value) {
+                this._snapping = value;
+            }
+        }
+    },
+
+    // TODO SEND THE EVENT --> Redraw the desired layout
+    layoutMode: {
+        get: function() { return this._layoutMode; },
+        set: function(mode) { this._layoutMode = mode; }
+    },
+
+    draw3DGrid: {
+        get: function() { return this._draw3DGrid; },
+        set: function(value) {
+            if(this._draw3DGrid !== value) {
+                this._draw3DGrid = value;
+            }
+        }
+    },
+
+    userComponents: {
+        get: function() {
+            return this._userComponents;
+        }
+    },
+//    _drawUserComponentsOnOpen:{
+//        value:function(){
+//            for(var i in this._userComponentSet){
+//                console.log(this._userComponentSet[i].control)
+//                this._userComponentSet[i].control.needsDraw = true;
+//            }
+//        }
+//    },
+    
+    glData: {
+    	get: function() {
+			//
+			var elt = this.iframe.contentWindow.document.getElementById("UserContent");
+			//
+			if (elt) {
+                var matLib = MaterialsModel.exportMaterials();
+				this._glData = [matLib];
+				this.collectGLData(elt, this._glData );
+			} else {
+				this._glData = null
+			}
+			//	
+			return this._glData;
+		},
+        set: function(value) {
+			var elt = this.documentRoot;
+			if (elt)
+			{
+				/*
+				// Use this code to test the runtime version of WebGL
+				var cvsDataMngr = Object.create(NinjaCvsRt.CanvasDataManager, {});
+				cvsDataMngr.loadGLData(elt, value);
+				*/
+
+				// /*
+				var nWorlds= value.length;
+				for (var i=0;  i<nWorlds;  i++)
+				{
+					// get the data for the next canvas
+					var importStr = value[i];
+
+					// determine if it is the new (JSON) or old style format
+					var id = null;
+					var jObj = null;
+					var index = importStr.indexOf( ';' );
+					if ((importStr[0] === 'v') && (index < 24))
+					{
+						// JSON format.  pull off the
+						importStr = importStr.substr( index+1 );
+						jObj = JSON.parse( importStr );
+						id = jObj.id;
+					}
+					else
+					{
+                        // at this point the data could be either the materials library or
+                        // an old style world.  We can determine which by converting the string
+                        // to an object via JSON.parse.  That operation will fail if the string
+                        // is an old style world.
+                        var matLibStr = 'materialLibrary;';
+                        index = importStr.indexOf( matLibStr );
+                        if (index == 0)
+                        {
+                            importStr = importStr.substr( matLibStr.length );
+                            var matLibObj = JSON.parse( importStr );
+                            MaterialsModel.importMaterials( matLibObj );
+                        }
+                        else
+                        {
+						    var startIndex = importStr.indexOf( "id: " );
+						    if (startIndex >= 0) {
+							    var endIndex = importStr.indexOf( "\n", startIndex );
+							    if (endIndex > 0)
+								    id = importStr.substring( startIndex+4, endIndex );
+						    }
+                        }
+					}
+
+					if (id != null)
+					{
+						var canvas = this.findCanvasWithID( id, elt );
+						if (canvas)
+						{
+							if (!canvas.elementModel)
+							{
+								NJUtils.makeElementModel(canvas, "Canvas", "shape", true);
+							}
+							if (canvas.elementModel)
+							{
+								if (canvas.elementModel.shapeModel.GLWorld)
+									canvas.elementModel.shapeModel.GLWorld.clearTree();
+
+								if (jObj)
+								{
+									var useWebGL = jObj.webGL;
+									var world = new GLWorld( canvas, useWebGL );
+									world.importJSON( jObj );
+								}
+
+								this.buildShapeModel( canvas.elementModel, world );
+							}
+						}
+					}
+				}
+				// */
+			}
+		}
+    },
+
+	buildShapeModel:
+	{
+		value: function( elementModel, world )
+		{
+            var shapeModel = elementModel.shapeModel;
+			shapeModel.shapeCount	= 1;	// for now...
+			shapeModel.useWebGl		= world._useWebGL;
+			shapeModel.GLWorld		= world;
+			var root = world.getGeomRoot();
+			if (root)
+			{
+				shapeModel.GLGeomObj			= root;
+				shapeModel.strokeSize			= root._strokeWidth;
+				shapeModel.strokeStyle			= "solid";
+				//shapeModel.strokeStyleIndex
+				switch (root.geomType())
+				{
+					case root.GEOM_TYPE_RECTANGLE:
+                        elementModel.selection = "Rectangle";
+                        elementModel.pi = "RectanglePi";
+						shapeModel.tlRadius = root._tlRadius;
+						shapeModel.trRadius = root._trRadius;
+						shapeModel.blRadius = root._blRadius;
+						shapeModel.brRadius = root._brRadius;
+						break;
+
+					case root.GEOM_TYPE_CIRCLE:
+                        elementModel.selection = "Oval";
+                        elementModel.pi = "OvalPi";
+						shapeModel.innerRadius = root._innerRadius;
+						break;
+
+					case root.GEOM_TYPE_LINE:
+                        elementModel.selection = "Line";
+                        elementModel.pi = "LinePi";
+						shapeModel.slope = root._slope;
+						break;
+
+                    case root.GEOM_TYPE_BRUSH_STROKE:
+                        elementModel.selection = "BrushStroke";
+                        elementModel.pi = "BrushStrokePi";
+						break;
+
+                    case root.GEOM_TYPE_CUBIC_BEZIER:
+                        elementModel.selection = "Subpath";
+                        elementModel.pi = "SubpathPi";
+                        break;
+
+					default:
+						console.log( "geometry type not supported for file I/O, " + root.geomType());
+						break;
+				}
+			}
+		}
+	},
+
+    zoomFactor: {
+        get: function() { return this._zoomFactor; },
+        set: function(value) { this._zoomFactor = value; }
+    },
+
+    /**
+     * Add a reference to a component instance to the userComponents hash using the
+     * element UUID
+     */
+    setComponentInstance: {
+        value: function(instance, el) {
+            this.userComponents[el.uuid] = instance;
+        }
+    },
+
+    /**
+     * Returns the component instance obj from the element
+     */
+    getComponentFromElement: {
+        value: function(el) {
+            if(el) {
+                if(el.uuid) return this.userComponents[el.uuid];
+            } else {
+                return null;
+            }
+        }
+    },
+
+    /**
+     * search the DOM tree to find a canvas with the given id
+     */
+	findCanvasWithID:  {
+		value: function( id,  elt )  {
+			var cid = elt.getAttribute( "data-RDGE-id" );
+			if (cid == id)  return elt;
+
+			if (elt.children)
+			{
+				var nKids = elt.children.length;
+				for (var i=0;  i<nKids;  i++)
+				{
+					var child = elt.children[i];
+					var foundElt = this.findCanvasWithID( id, child );
+					if (foundElt)  return foundElt;
+				}
+			}
+		}
+	},
+    
+    
+    
+    ////////////////////////////////////////////////////////////////////
+	//
+    initialize: {
+		value: function(file, uuid, iframe, callback) {
+			this.application.ninja.documentController._hackRootFlag = false;
+			//
+			this._userDocument = file;
+			//
+			this.init(file.name, file.uri, file.extension, iframe, uuid, callback);
+			//
+            this.iframe = iframe;
+            this.selectionExclude = ["HTML", "BODY", "Viewport", "UserContent", "stageBG"];
+            this.currentView = "design";
+			//
+
+            this.iframe.src = this._htmlTemplateUrl;
+            this.iframe.addEventListener("load", this, true);
+        }
+    },
+    ////////////////////////////////////////////////////////////////////
+
+
+	collectGLData: {
+		value: function( elt,  dataArray )
+		{
+			if (elt.elementModel && elt.elementModel.shapeModel && elt.elementModel.shapeModel.GLWorld)
+			{
+				var data = elt.elementModel.shapeModel.GLWorld.exportJSON();
+				dataArray.push( data );
+			}
+
+			if (elt.children)
+			{
+				var nKids = elt.children.length;
+				for (var i=0;  i<nKids;  i++)
+				{
+					var child = elt.children[i];
+					this.collectGLData( child, dataArray );
+				}
+			}
+		}
+	},
+
+
+    // OLD
+
+    inExclusion: {
+        value: function(element) {
+            if(this._selectionExclude.indexOf(element.id) === -1) {
+                if(this._selectionExclude.indexOf(element.nodeName) === -1) {
+                    return -1;
+                }
+            } else if (this._selectionExclude.indexOf(element.id) === -1) {
+                return -1;
+            } else {
+                return 1;
+            }
+        }
+    },
+
+    GetElementFromPoint: {
+        value: function(x, y) {
+            return this._window.getElement(x,y);
+        }
+    },
+    
+    
+    
+    
+    
+    
+    
+    
+	/* 		
+            DOM Mutation Events:
+          		
+            DOMActivate, DOMFocusIn, DOMFocusOut, DOMAttrModified,
+           	DOMCharacterDataModified, DOMNodeInserted, DOMNodeInsertedIntoDocument,
+       		DOMNodeRemoved, DOMNodeRemovedFromDocument, DOMSubtreeModified, DOMContentLoaded
+            		
+  	*/
+  	
+  	
+  	
+  	/*
+//TODO: Remove and clean up event listener (DOMSubtreeModified)
+  	_hackCount: {
+  		value: 0
+  	},
+*/
+	////////////////////////////////////////////////////////////////////
+	//
+    handleEvent: {
+        value: function(event){
+        	//TODO: Clean up, using for prototyping save
+        	this._templateDocument = {};
+        	this._templateDocument.html = this.iframe.contentWindow.document;
+        	this._templateDocument.head = this.iframe.contentWindow.document.getElementById("userHead");
+        	this._templateDocument.body = this.documentRoot = this.iframe.contentWindow.document.getElementById("UserContent");
+        	//TODO: Remove, also for prototyping
+        	this.application.ninja.documentController._hackRootFlag = true;
+        	//
+            this.stageBG = this.iframe.contentWindow.document.getElementById("stageBG");
+            this.stageBG.onclick = null;
+            this._document = this.iframe.contentWindow.document;
+            this._window = this.iframe.contentWindow;
+            //
+            for (var k in this._document.styleSheets) {
+            	if (this._document.styleSheets[k].ownerNode && this._document.styleSheets[k].ownerNode.setAttribute) {
+            		this._document.styleSheets[k].ownerNode.setAttribute('data-ninja-template', 'true');
+            	}
+            }
+            //
+            if(!this.documentRoot.Ninja) this.documentRoot.Ninja = {};
+            
+            
+            
+            //TODO: Clean up, using for prototyping
+            this._templateDocument.head.innerHTML = (this._userDocument.content.head.replace(/\b(href|src)\s*=\s*"([^"]*)"/g, this.application.ninja.ioMediator.getNinjaPropUrlRedirect.bind(this.application.ninja.ioMediator))).replace(/url\(([^"]*)(.+?)\1\)/g, this.application.ninja.ioMediator.getNinjaPropUrlRedirect.bind(this.application.ninja.ioMediator));
+            this._templateDocument.body.innerHTML = (this._userDocument.content.body.replace(/\b(href|src)\s*=\s*"([^"]*)"/g, this.application.ninja.ioMediator.getNinjaPropUrlRedirect.bind(this.application.ninja.ioMediator))).replace(/url\(([^"]*)(.+?)\1\)/g, this.application.ninja.ioMediator.getNinjaPropUrlRedirect.bind(this.application.ninja.ioMediator));            
+           	
+            
+            
+            var scripttags = this._templateDocument.html.getElementsByTagName('script'), webgldata;  //TODO: Use querySelectorAll
+            //
+            for (var w in scripttags) {
+            	if (scripttags[w].getAttribute) {
+            		if (scripttags[w].getAttribute('data-ninja-webgl') !== null) {
+            			//TODO: Add logic to handle more than one data tag
+            			webgldata = JSON.parse((scripttags[w].innerHTML.replace("(", "")).replace(")", ""));
+            		}
+            	}
+            }
+            //
+            if (webgldata) {
+            	for (var n=0; webgldata.data[n]; n++) {
+            		webgldata.data[n] = unescape(webgldata.data[n]);
+            	}
+            	this._templateDocument.webgl = webgldata.data;
+            }
+            
+            
+            
+            //Temporarily checking for disabled special case
+            var stags = this.iframe.contentWindow.document.getElementsByTagName('style'),
+            	ltags = this.iframe.contentWindow.document.getElementsByTagName('link');
+           	//
+            for (var m = 0; m < ltags.length; m++) {
+            	if (ltags[m].getAttribute('data-ninja-template') === null) {
+            		if (ltags[m].getAttribute('disabled')) {
+           				ltags[m].removeAttribute('disabled');
+           				ltags[m].setAttribute('data-ninja-disabled', 'true');
+           			}
+           		}
+           	}
+            //
+           	for (var n = 0; n < stags.length; n++) {
+           		if (stags[n].getAttribute('data-ninja-template') === null) {
+           			if (stags[n].getAttribute('disabled')) {
+           				stags[n].removeAttribute('disabled');
+           				stags[n].setAttribute('data-ninja-disabled', 'true');
+            		}
+            	}
+            }
+            
+            
+            
+            //Adding a handler for the main user document reel to finish loading
+            this._document.body.addEventListener("userTemplateDidLoad",  this.userTemplateDidLoad.bind(this), false);
+
+            // Live node list of the current loaded document
+            this._liveNodeList = this.documentRoot.getElementsByTagName('*');
+
+            // TODO Move this to the appropriate location
+            var len = this._liveNodeList.length;
+
+            for(var i = 0; i < len; i++) {
+                NJUtils.makeModelFromElement(this._liveNodeList[i]);
+            }
+
+            /* this.iframe.contentWindow.document.addEventListener('DOMSubtreeModified', function (e) { */ //TODO: Remove events upon loading once
+
+            //TODO: When re-written, the best way to initialize the document is to listen for the DOM tree being modified
+            setTimeout(function () {
+            	
+            	
+            	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            	if(this._document.styleSheets.length > 1) {
+					//Checking all styleSheets in document
+					for (var i in this._document.styleSheets) {
+						//If rules are null, assuming cross-origin issue
+						if(this._document.styleSheets[i].rules === null) {
+							//TODO: Revisit URLs and URI creation logic, very hack right now
+							var fileUri, cssUrl, cssData, query, prefixUrl, fileCouldDirUrl, docRootUrl;
+							//
+            				docRootUrl = this.application.ninja.coreIoApi.rootUrl+escape((this.application.ninja.documentController.documentHackReference.root.split(this.application.ninja.coreIoApi.cloudData.root)[1]).replace(/\/\//gi, '/'));
+							//TODO: Parse out relative URLs and map them to absolute
+							if (this._document.styleSheets[i].href.indexOf(this.application.ninja.coreIoApi.rootUrl) !== -1) {
+								//
+								cssUrl = this._document.styleSheets[i].href.split(this.application.ninja.coreIoApi.rootUrl)[1];
+								fileUri = this.application.ninja.coreIoApi.cloudData.root+cssUrl;
+								//TODO: Add error handling for reading file
+								cssData = this.application.ninja.coreIoApi.readFile({uri: fileUri});
+								//
+								var tag = this.iframe.contentWindow.document.createElement('style');
+								tag.setAttribute('type', 'text/css');
+								tag.setAttribute('data-ninja-uri', fileUri);
+								tag.setAttribute('data-ninja-file-url', cssUrl);
+								tag.setAttribute('data-ninja-file-read-only', JSON.parse(this.application.ninja.coreIoApi.isFileWritable({uri: fileUri}).content).readOnly);
+								tag.setAttribute('data-ninja-file-name', cssUrl.split('/')[cssUrl.split('/').length-1]);
+								//Copying attributes to maintain same properties as the <link>
+								for (var n in this._document.styleSheets[i].ownerNode.attributes) {
+									if (this._document.styleSheets[i].ownerNode.attributes[n].value && this._document.styleSheets[i].ownerNode.attributes[n].name !== 'disabled' && this._document.styleSheets[i].ownerNode.attributes[n].name !== 'disabled') {
+										if (this._document.styleSheets[i].ownerNode.attributes[n].value.indexOf(docRootUrl) !== -1) {
+											tag.setAttribute(this._document.styleSheets[i].ownerNode.attributes[n].name, this._document.styleSheets[i].ownerNode.attributes[n].value.split(docRootUrl)[1]);
+										} else {
+											tag.setAttribute(this._document.styleSheets[i].ownerNode.attributes[n].name, this._document.styleSheets[i].ownerNode.attributes[n].value);
+										}
+									}
+								}
+								//
+								fileCouldDirUrl = this._document.styleSheets[i].href.split(this._document.styleSheets[i].href.split('/')[this._document.styleSheets[i].href.split('/').length-1])[0];
+								
+								//TODO: Make public version of this.application.ninja.ioMediator.getNinjaPropUrlRedirect with dynamic ROOT
+								tag.innerHTML = cssData.content.replace(/url\(()(.+?)\1\)/g, detectUrl);
+								
+								function detectUrl (prop) {
+									return prop.replace(/[^()\\""\\'']+/g, prefixUrl);;
+								}
+								
+								function prefixUrl (url) {
+									if (url !== 'url') {
+										if (!url.match(/(\b(?:(?:https?|ftp|file|[A-Za-z]+):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$]))/gi)) {
+											url = fileCouldDirUrl+url;
+										}
+									}
+									return url;
+								}
+								
+								//Looping through DOM to insert style tag at location of link element
+								query = this._templateDocument.html.querySelectorAll(['link']);
+								for (var j in query) {
+									if (query[j].href === this._document.styleSheets[i].href) {
+										//Disabling style sheet to reload via inserting in style tag
+										query[j].setAttribute('disabled', 'true');
+										//Inserting tag
+										this._templateDocument.head.insertBefore(tag, query[j]);
+									}
+								}
+							} else {
+								console.log('ERROR: Cross-Domain-Stylesheet detected, unable to load in Ninja');
+								//None local stylesheet, probably on a CDN (locked)
+								var tag = this.iframe.contentWindow.document.createElement('style');
+								tag.setAttribute('type', 'text/css');
+								tag.setAttribute('data-ninja-external-url', this._document.styleSheets[i].href);
+								tag.setAttribute('data-ninja-file-read-only', "true");
+								tag.setAttribute('data-ninja-file-name', this._document.styleSheets[i].href.split('/')[this._document.styleSheets[i].href.split('/').length-1]);
+								//Copying attributes to maintain same properties as the <link>
+								for (var n in this._document.styleSheets[i].ownerNode.attributes) {
+									if (this._document.styleSheets[i].ownerNode.attributes[n].value && this._document.styleSheets[i].ownerNode.attributes[n].name !== 'disabled' && this._document.styleSheets[i].ownerNode.attributes[n].name !== 'disabled') {
+										if (this._document.styleSheets[i].ownerNode.attributes[n].value.indexOf(docRootUrl) !== -1) {
+											tag.setAttribute(this._document.styleSheets[i].ownerNode.attributes[n].name, this._document.styleSheets[i].ownerNode.attributes[n].value.split(docRootUrl)[1]);
+										} else {
+											tag.setAttribute(this._document.styleSheets[i].ownerNode.attributes[n].name, this._document.styleSheets[i].ownerNode.attributes[n].value);
+										}
+									}
+								}
+								/*
+								
+								//TODO: Figure out cross-domain XHR issue, might need cloud to handle
+								var xhr = new XMLHttpRequest();
+                    			xhr.open("GET", this._document.styleSheets[i].href, true);
+                    			xhr.send();
+                    			//
+                    			if (xhr.readyState === 4) {
+                        			console.log(xhr);
+                    			}
+                    			//tag.innerHTML = xhr.responseText //xhr.response;
+								*/
+                    			//Temp rule so it's registered in the array
+                    			tag.innerHTML = 'noRULEjustHACK{background: #000}';
+								//Disabling external style sheets
+								query = this._templateDocument.html.querySelectorAll(['link']);
+								for (var k in query) {
+									if (query[k].href === this._document.styleSheets[i].href) {
+										
+										//TODO: Removed the temp insertion of the stylesheet
+										//because it wasn't the proper way to do it
+										//need to be handled via XHR with proxy in Cloud Sim
+										
+										//Disabling style sheet to reload via inserting in style tag
+										//var tempCSS = query[k].cloneNode(true);
+										//tempCSS.setAttribute('data-ninja-template', 'true');
+										query[k].setAttribute('disabled', 'true');
+										//this.iframe.contentWindow.document.head.appendChild(tempCSS);
+										//Inserting tag
+										this._templateDocument.head.insertBefore(tag, query[k]);
+									}
+								}
+							}
+                    	}
+					}
+					////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////
+					
+					//TODO: Check if this is needed
+					this._stylesheets = this._document.styleSheets;
+					
+					////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////
+					
+					//TODO Finish this implementation once we start caching Core Elements
+					// Assign a model to the UserContent and add the ViewPort reference to it.
+					NJUtils.makeElementModel(this.documentRoot, "Stage", "stage");
+                    NJUtils.makeElementModel(this.stageBG, "Stage", "stage");
+					NJUtils.makeElementModel(this.iframe.contentWindow.document.getElementById("Viewport"), "Stage", "stage");
+
+                    // Initialize the 3D properties
+                    this.documentRoot.elementModel.props3D.init(this.documentRoot, true);
+                    this.stageBG.elementModel.props3D.init(this.stageBG, true);
+                    this.iframe.contentWindow.document.getElementById("Viewport").elementModel.props3D.init(this.iframe.contentWindow.document.getElementById("Viewport"), true);
+
+					for(i = 0; i < this._stylesheets.length; i++) {
+						if(this._stylesheets[i].ownerNode.id === this._stageStyleSheetId) {
+							this.documentRoot.elementModel.defaultRule = this._stylesheets[i];
+							break;
+						}
+					}
+					 
+					//Temporary create properties for each rule we need to save the index of the rule
+					var len = this.documentRoot.elementModel.defaultRule.cssRules.length;
+					for(var j = 0; j < len; j++) {
+						//console.log(this.documentRoot.elementModel.defaultRule.cssRules[j].selectorText);
+						if(this.documentRoot.elementModel.defaultRule.cssRules[j].selectorText === "*") {
+						
+							this.documentRoot.elementModel.transitionStopRule = this.documentRoot.elementModel.defaultRule.cssRules[j];
+						
+						} else if(this.documentRoot.elementModel.defaultRule.cssRules[j].selectorText === "body") {
+							
+							this.documentRoot.elementModel.body = this.documentRoot.elementModel.defaultRule.cssRules[j];
+						
+						} else if(this.documentRoot.elementModel.defaultRule.cssRules[j].selectorText === "#Viewport") {
+						
+							this.documentRoot.elementModel.viewPort = this.documentRoot.elementModel.defaultRule.cssRules[j];
+							
+						} else if(this.documentRoot.elementModel.defaultRule.cssRules[j].selectorText === ".stageDimension") {
+						
+							this.documentRoot.elementModel.stageDimension = this.documentRoot.elementModel.defaultRule.cssRules[j];
+							
+						} else if(this.documentRoot.elementModel.defaultRule.cssRules[j].selectorText === ".stageView") {
+							
+							this.documentRoot.elementModel.stageView = this.documentRoot.elementModel.defaultRule.cssRules[j];
+							
+						} else if(this.documentRoot.elementModel.defaultRule.cssRules[j].selectorText === "#stageBG") {
+							
+							this.documentRoot.elementModel.stageBackground = this.documentRoot.elementModel.defaultRule.cssRules[j];
+						}
+					}
+					
+					this.callback(this);
+					
+					//Setting webGL data
+					if (this._templateDocument.webgl) {
+						this.glData = this._templateDocument.webgl;
+					}
+				}
+				////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+				////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+				////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+			
+			
+			
+			
+			
+			}.bind(this), 1000);
+			
+			
+            
+            
+     	}
+    },
+
+    ////////////////////////////////////////////////////////////////////
+
+    // Handler for user content main reel. Gets called once the main reel of the template
+    // gets deserialized.
+    // Setting up the currentSelectedContainer to the document body.
+    userTemplateDidLoad: {
+        value: function(){
+            //this.application.ninja.currentSelectedContainer = this.documentRoot;
+        }
+    },
+    
+    
+    ////////////////////////////////////////////////////////////////////
+    _setSWFObjectScript: {
+        value: function() {
+            if(!this._swfObject) {
+                /*
+                var swfObj = document.createElement("script");
+                swfObj.type = "text/javascript";
+                swfObj.src = "../../user-document-templates/external-libs/swf-object/swfobject.js";
+                swfObj.id = "swfObject";
+                var head= this._document.getElementsByTagName('head')[0];
+                head.appendChild(swfObj);
+                this._swfObject = true;
+                */
+            }
+        }
+    },
+    
+    
+    
+    
+    
+    ////////////////////////////////////////////////////////////////////
+	//
+    livePreview: {
+    	enumerable: false,
+    	value: function () {
+    		//TODO: Add logic to handle save before preview
+    		this.application.ninja.documentController.handleExecuteSaveAll(null);
+    		//Temp check for webGL Hack
+    		window.open(this.application.ninja.coreIoApi.rootUrl + this.application.ninja.documentController._activeDocument.uri.split(this.application.ninja.coreIoApi.cloudData.root)[1]);
+    		//chrome.tabs.create({url: this.application.ninja.coreIoApi.rootUrl+this.application.ninja.documentController._activeDocument.uri.split(this.application.ninja.coreIoApi.cloudData.root)[1]});		
+    	}
+    },
+	////////////////////////////////////////////////////////////////////
+	//
+	save: {
+		enumerable: false,
+    	value: function () {
+    		//TODO: Add code view logic and also styles for HTML
+    		if (this.currentView === 'design') {
+    			var styles = [];
+    			for (var k in this._document.styleSheets) {
+    				if (this._document.styleSheets[k].ownerNode && this._document.styleSheets[k].ownerNode.getAttribute) {
+            			if (this._document.styleSheets[k].ownerNode.getAttribute('ninjatemplate') === null) {
+            				styles.push(this._document.styleSheets[k]);
+            			}
+            		}
+            	}
+    			//return {mode: 'html', document: this._userDocument, mjs: this._userComponents, webgl: this.glData, styles: styles, head: this._templateDocument.head.innerHTML, body: this._templateDocument.body.innerHTML};
+    			return {mode: 'html', document: this._userDocument, webgl: this.glData, styles: styles, head: this._templateDocument.head.innerHTML, body: this._templateDocument.body.innerHTML};
+    		} else if (this.currentView === "code"){
+    			//TODO: Would this get call when we are in code of HTML?
+    		} else {
+    			//Error
+    		}
+    	}
+	},
+	////////////////////////////////////////////////////////////////////
+	//
+	saveAll: {
+		enumerable: false,
+    	value: function () {
+    		//TODO: Add code view logic and also styles for HTML
+    		if (this.currentView === 'design') {
+    			var css = [];
+    			for (var k in this._document.styleSheets) {
+    				if (this._document.styleSheets[k].ownerNode && this._document.styleSheets[k].ownerNode.getAttribute) {
+            			if (this._document.styleSheets[k].ownerNode.getAttribute('ninjatemplate') === null) {
+            				css.push(this._document.styleSheets[k]);
+            			}
+            		}
+            	}
+    			//return {mode: 'html', document: this._userDocument, mjs: this._userComponents, webgl: this.glData, css: css, head: this._templateDocument.head.innerHTML, body: this._templateDocument.body.innerHTML};
+    			return {mode: 'html', document: this._userDocument, webgl: this.glData, css: css, head: this._templateDocument.head.innerHTML, body: this._templateDocument.body.innerHTML};
+    		} else if (this.currentView === "code"){
+    			//TODO: Would this get call when we are in code of HTML?
+    		} else {
+    			//Error
+    		}
+    	}
+	}
+});
\ No newline at end of file
diff --git a/js/document/_toDelete/text-document.js b/js/document/_toDelete/text-document.js
new file mode 100755
index 00000000..2574b67c
--- /dev/null
+++ b/js/document/_toDelete/text-document.js
@@ -0,0 +1,198 @@
+/* <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> */
+
+//BaseDocument Object for all files types and base class for HTML documents.
+
+var Montage = 	require("montage/core/core").Montage,
+	Component = require("montage/ui/component").Component;
+
+var TextDocument = exports.TextDocument = Montage.create(Component, {
+	
+	
+	//TODO: Clean up, test
+	
+	
+	
+	
+	
+	////////////////////////////////////////////////////////////////////
+	////////////////////////////////////////////////////////////////////
+	////////////////////////////////////////////////////////////////////
+	////////////////////////////////////////////////////////////////////
+	//Taken from text-document, which shouldn't be needed
+
+	// PRIVATE MEMBERS
+    _codeEditor: {
+        value: {
+            "editor": { value: null, enumerable: false }
+
+        }
+    },
+
+    _editor: { value: null, enumerable: false },
+    _hline: { value: null, enumerable: false },
+
+    _textArea: {value: null, enumerable: false },
+	
+	_userDocument: {value: null, enumerable: false },
+	
+    _source: { value: null, enumerable: false},
+
+    source: {
+        get: function() { return this._source;},
+        set: function(value) { this._source = value;}
+    },
+
+    // PUBLIC MEMBERS
+
+    _savedLeftScroll: {value:null},
+    _savedTopScroll: {value:null},
+
+    //****************************************//
+    //PUBLIC API
+
+
+    // GETTERS / SETTERS
+
+    savedLeftScroll:{
+        get: function() { return this._savedLeftScroll; },
+        set: function(value) { this._savedLeftScroll = value}
+    },
+
+    savedTopScroll:{
+        get: function() { return this._savedTopScroll; },
+        set: function(value) { this._savedTopScroll = value}
+    },
+
+    textArea: {
+        get: function() { return this._textArea; },
+        set: function(value) { this._textArea = value; }
+    },
+    editor: {
+        get: function() { return this._editor; },
+        set: function(value) { this._editor = value}
+    },
+
+    hline: {
+        get: function() { return this._hline; },
+        set: function(value) {this._hline = value; }
+    },
+
+    
+    ////////////////////////////////////////////////////////////////////
+	//
+    initialize: {
+    	value: function(file, uuid, textArea, container, callback) {
+        	//
+			this._userDocument = file;
+			//
+			this.init(file.name, file.uri, file.extension, container, uuid, callback);
+	        //
+    	    this.currentView = "code";
+        	this.textArea = textArea;
+        }
+    },
+    ////////////////////////////////////////////////////////////////////
+    //
+	save: {
+		enumerable: false,
+    	value: function () {
+    		//TODO: Improve sequence
+    		this.editor.save();
+    		return {mode: this._userDocument.extension, document: this._userDocument, content: this.textArea.value};
+    	}
+	},
+	////////////////////////////////////////////////////////////////////
+	////////////////////////////////////////////////////////////////////
+	////////////////////////////////////////////////////////////////////
+	////////////////////////////////////////////////////////////////////
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+    /** Private Members **/
+    _name:          { value: null, enumerable: false },
+    _uri:           { value: null, enumerable: false },
+    _documentType:  { value: null, enumerable: false },
+    _container:     { value: null, enumerable: false },
+    _uuid:          { value: null, enumerable: false },
+    _isActive:      { value: true, enumerable: false },
+    _needsSave:     { value: false, enumarable: false },
+    _callback:      { value: null, enumerable: false },
+    _currentView:   { value: null, enumerable: false},
+
+    /** Getters/Setters **/
+    name: {
+        get: function() { return this._name; },
+        set: function(value) { this._name = value; }
+    },
+
+    uri: {
+        get: function() { return this._uri; },
+        set: function(value) { this._uri = value; }
+    },
+
+    documentType: {
+        get: function() { return this._documentType; },
+        set: function(value) { this._documentType = value;  }
+    },
+
+    container: {
+        get: function() { return this._container; },
+        set: function(value) { this._container = value; }
+    },
+
+    uuid: {
+        get: function() { return this._uuid; },
+        set: function(value) { this._uuid = value; }
+    },
+
+    isActive: {
+        get: function() { return this._isActive; },
+        set: function(value) { this._isActive = value; }
+    },
+
+    needsSave: {
+        get: function() { return this._needsSave; },
+        set: function(value) {
+            this._needsSave = value;
+        }
+    },
+
+    callback: {
+        get: function() { return this._callback; },
+        set: function(value) { this._callback = value; }
+    },
+
+    currentView: {
+        get: function() { return this._currentView; },
+        set: function(value) { this._currentView = value }
+    },
+
+    /** Base Methods **/
+    init: {
+        value: function(name, uri, type, container, uuid, callback) {
+            this.name = name;
+            this.uri = uri;
+            this.documentType = type;
+            this.container = container;
+            this.uuid = uuid;
+            this.callback = callback;
+        }
+    },
+
+    loadDocument: {
+        value: function() {
+            // Have the XHR here?
+        }
+    }
+});
\ No newline at end of file
diff --git a/js/document/document-html.js b/js/document/document-html.js
index f92a425c..2375632c 100755
--- a/js/document/document-html.js
+++ b/js/document/document-html.js
@@ -6,10 +6,10 @@ No rights, expressed or implied, whatsoever to this software are provided by Mot
 
 ////////////////////////////////////////////////////////////////////////
 //
-var Montage = 	        require("montage/core/core").Montage,
-	Component =         require("montage/ui/component").Component,
-    HtmlDocumentModel = require("js/document/models/html").HtmlDocumentModel,
-    DesignDocumentView = require("js/document/views/design").DesignDocumentView;
+var Montage = 	        	require("montage/core/core").Montage,
+	Component =         	require("montage/ui/component").Component,
+    HtmlDocumentModel = 	require("js/document/models/html").HtmlDocumentModel,
+    DesignDocumentView = 	require("js/document/views/design").DesignDocumentView;
 ////////////////////////////////////////////////////////////////////////
 //	
 exports.HtmlDocument = Montage.create(Component, {
@@ -32,16 +32,11 @@ exports.HtmlDocument = Montage.create(Component, {
 	//
     _observer: {
         value: null
-    },
-    ////////////////////////////////////////////////////////////////////
-	//
-    _document: {
-        value: null //TODO: Figure out if this will be needed, probably not
     },
 	////////////////////////////////////////////////////////////////////
 	//
     exclusionList: {
-        value: ["HTML", "BODY", "NINJA-CONTENT"] //TODO: Update to correct list
+        value: ["HTML", "BODY", "NINJA-CONTENT"]
     },
     ////////////////////////////////////////////////////////////////////
 	//
@@ -72,7 +67,7 @@ exports.HtmlDocument = Montage.create(Component, {
            		//Hiding iFrame, just initiliazing
            		this.model.views.design.hide();
            	} else {
-           		//ERROR: Design View not initilized
+           		//ERROR: Design View not initialized
            	}
             //
             if (view === 'design') {
@@ -84,23 +79,12 @@ exports.HtmlDocument = Montage.create(Component, {
             	this.model.views.design.show();
             	this.model.views.design.iframe.style.opacity = 0;
             	this.model.views.design.content = this.model.file.content;
-            	//TODO: Improve reference
+            	//TODO: Improve reference (probably through binding values)
             	this.model.views.design.model = this.model;
-            	//
-            	//TODO: Clean up
+            	//Rendering design view, using observers to know when template is ready
             	this.model.views.design.render(function () {
-            		//TODO: Identify and remove usage of '_document'
-            		this._document = this.model.views.design.document;
-            		//TODO: Remove usage, seems as not needed
-    				if (template && template.type === 'banner') {
-    					this.documentRoot = this.model.views.design.document.body.getElementsByTagName('ninja-content')[0];
-    				} else {
-    					this.documentRoot = this.model.views.design.document.body;
-    				}
             		//TODO: Why is this needed?
-            		this._liveNodeList = this.documentRoot.getElementsByTagName('*');
-            		//Initiliazing document model
-            		document.application.njUtils.makeElementModel(this.documentRoot, "Body", "body");
+            		this._liveNodeList = this.model.documentRoot.getElementsByTagName('*');
             		//Adding observer to know when template is ready
             		this._observer = new WebKitMutationObserver(this.handleTemplateReady.bind(this));
         			this._observer.observe(this.model.views.design.document.head, {childList: true});
diff --git a/js/document/html-document.js b/js/document/html-document.js
deleted file mode 100755
index 447d90e3..00000000
--- a/js/document/html-document.js
+++ /dev/null
@@ -1,874 +0,0 @@
-/* <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,
-    TextDocument =	require("js/document/text-document").TextDocument,
-    NJUtils = 		require("js/lib/NJUtils").NJUtils,
-	GLWorld =			require("js/lib/drawing/world").World,
-    MaterialsModel = require("js/models/materials-model").MaterialsModel;
-////////////////////////////////////////////////////////////////////////
-//
-exports.HTMLDocument = Montage.create(TextDocument, {
-    
-    _selectionExclude: { value: null, enumerable: false },
-    _htmlTemplateUrl: { value: "js/document/templates/montage-html/index.html", enumerable: false},
-    _iframe: { value: null, enumerable: false },
-    _server: { value: null, enumerable: false },
-    _templateDocument: { value: null, enumerable: false },
-    _selectionModel: { value: [], enumerable: false },
-    _undoModel: { value: { "queue" : [], "position" : 0 }, enumerable: false},
-
-    _document: { value: null, enumerable: false },
-    _documentRoot: { value: null, enumerable: false },
-    _liveNodeList: { value: null, enumarable: false },
-    _stageBG: { value: null, enumerable: false },
-    _window: { value: null, enumerable: false },
-    _styles: { value: null, enumerable: false },
-    _stylesheets: { value: null, enumerable: false },
-    _stageStyleSheetId : { value: 'nj-stage-stylesheet', enumerable: false },
-    _userDocument: { value: null, enumerable: false },
-    _htmlSource: {value: "<html></html>", enumerable: false},
-    _glData: {value: null, enumerable: false },
-    _userComponents: { value: {}, enumarable: false},
-
-    _elementCounter: { value: 1, enumerable: false },
-    _snapping : { value: true, enumerable: false },
-    _layoutMode: { value: "all", enumerable: false },
-    _draw3DGrid: { value: false, writable: true },
-    _swfObject: { value: false, enumerable: false },
-
-    _zoomFactor: { value: 100, enumerable: false },
-
-    cssLoadInterval: { value: null, enumerable: false },
-
-    _savedLeftScroll: {value:null},
-    _savedTopScroll: {value:null},
-
-    _codeViewDocument:{
-        writable: true,
-        enumerable: true,
-        value:null
-    },
-
-
-    //drawUtils state
-    _gridHorizontalSpacing: {value:0},
-    _gridVerticalSpacing: {value:0},
-    //end - drawUtils state
-
-    _undoStack: { value: [] },
-    undoStack: {
-        get: function() {
-            return this._undoStack;
-        },
-        set:function(value){
-            this._undoStack = value;
-        }
-    },
-
-    _redoStack: { value: [], enumerable: false },
-
-    redoStack: {
-        get: function() {
-            return this._redoStack;
-        },
-        set:function(value){
-            this._redoStack = value;
-        }
-    },
-
-
-    // GETTERS / SETTERS
-
-    codeViewDocument:{
-        get: function() { return this._codeViewDocument; },
-        set: function(value) { this._codeViewDocument = value}
-    },
-
-    savedLeftScroll:{
-        get: function() { return this._savedLeftScroll; },
-        set: function(value) { this._savedLeftScroll = value}
-    },
-
-    savedTopScroll:{
-        get: function() { return this._savedTopScroll; },
-        set: function(value) { this._savedTopScroll = value}
-    },
-
-    gridHorizontalSpacing:{
-        get: function() { return this._gridHorizontalSpacing; },
-        set: function(value) { this._gridHorizontalSpacing = value}
-    },
-
-    gridVerticalSpacing:{
-        get: function() { return this._gridVerticalSpacing; },
-        set: function(value) { this._gridVerticalSpacing = value}
-    },
-
-    selectionExclude: {
-        get: function() { return this._selectionExclude; },
-        set: function(value) { this._selectionExclude = value; }
-    },
-
-    iframe: {
-        get: function() { return this._iframe; },
-        set: function(value) { this._iframe = value; }
-    },
-
-    server: {
-        get: function() { return this._server; },
-        set: function(value) { this._server = value; }
-    },
-
-    selectionModel: {
-        get: function() { return this._selectionModel; },
-        set: function(value) { this._selectionModel = value; }
-    },
-
-    undoModel: {
-        get: function() { return this._undoM