Moved measurement objects to subfolder measruements
Moved measurement objects to subfolder measruements
Created contect menu functions for right click on front view
Improved item properties dialog flow
Created molding object to store molding information for cabinets
Made Modling settings dialog fully functional
Front view now renders horizantal lines for crown, light rail and base
accessories list partialy working

--- /dev/null
+++ b/source/lib/Dialogs/AddAccessory.html
@@ -1,1 +1,6 @@
-
+<div id="accessories-list"></div>
+<div style="width:360px;">
+	<button id="add-accessories-button" class= "pure-button pure-button-primary">+</button>
+	<button id="accessories-save" style="float: right;" class="pure-button pure-button-primary">Save</button>
+</div>
+<br/>

--- /dev/null
+++ b/source/lib/Dialogs/AddAccessory.js
@@ -1,1 +1,93 @@
+define(
+	[
 
+	 	'Util/DOM',
+	 	'Util/UI',
+
+	 	'CabinetEditor/Schematic/Cabinet/AccessoryList',
+	 	'CabinetEditor/Defines/Layer',
+
+	 	'require/text!Dialogs/AddAccessory.html'
+
+ 	],
+	function(
+
+		DOM,
+		UI,
+
+		AccessoryList,
+		Layer,
+
+		AddAccessoryHTML
+
+	){
+
+	var AddAccessory = {};
+
+	AddAccessory.newAccessoryHTML = '.&nbsp;&nbsp;<select><option value="Shelf">Shelf</option><option value="Roll-outs">Roll-outs</option><option value = "Cookie Sheet Divider">Cookie Sheet Divider</option><option value="Spice Rack">Spice Rack</option></select>&nbsp;&nbsp;&nbsp;<select><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option></select>&nbsp;&nbsp;&nbsp;<button id="add-accessories-button">-</button><br/><br/>';
+
+	AddAccessory.activate = function(editor, cab){
+
+		var addAccessoryDialog = UI.dialog(
+				AddAccessoryHTML,
+				{
+					title:		'Accessories',
+					height:		'auto',
+					width:		400,
+					modal:		false,
+					position:	['top', 100]
+				}
+			);
+
+		AddAccessory.initalize(addAccessoryDialog, editor, cab);
+
+	};
+
+	AddAccessory.initalize = function(dialog, editor, cab){
+
+		DOM.id('add-accessories-button').onclick = function(){
+			var div;
+			div = document.createElement('div');
+			div.innerHTML = (DOM.id('accessories-list').children.length + 1) + AddAccessory.newAccessoryHTML;
+			DOM.id('accessories-list').appendChild(div);
+		}
+
+		DOM.id('accessories-save').onclick = function(){
+
+			var i, schem, accessoryList,
+				acc = cab.accessoriesReference;
+
+			if(!acc){
+
+				schem = editor.getSchematic();
+
+				acc = new AccessoryList(schem.newID(), Layer.MEASURE, cab.x, cab.y, 0, 0, 0, 0, 0);
+
+				schem.addObject(acc);
+
+				cab.accessoriesID = acc.getID();
+				cab.accessoriesReference = acc;
+
+			}
+
+			accessoryList = DOM.id('accessories-list');
+			acc.accessories = [];
+
+			for(i = 0; i < accessoryList.children.length; i++){
+
+				acc.accessories.push(
+					{
+						name: accessoryList.children[i].children[0].value,
+						count: accessoryList.children[i].children[1].value
+					}
+				);
+
+			}
+
+		}
+		
+	};
+
+	return AddAccessory;
+
+});

--- a/source/lib/Dialogs/FinishSelector.js
+++ b/source/lib/Dialogs/FinishSelector.js
@@ -1,1 +1,44 @@
+define(
+	[
 
+	 	'Util/DOM',
+	 	'Util/UI',
+
+	 	'require/text!Dialogs/FinishSelector.html',
+
+ 	],
+	function(
+
+		DOM,
+		UI,
+
+	    FinishSelectorHTML
+
+	){
+
+	var FinishSelector = {};
+
+	FinishSelector.activate = function(e){
+
+		var finishSelectorDialog = UI.dialog(
+				FinishSelectorHTML,
+				{
+					title:		'Finish Selector',
+					height:		'auto',
+					width:		600,
+					modal:		false,
+					position:	['top', 100]
+				}
+			);
+
+		FinishSelector.initalize(finishSelectorDialog);
+
+	};
+		
+	FinishSelector.initalize = function(dialog){
+
+	};
+
+	return FinishSelector;
+
+});

--- /dev/null
+++ b/source/lib/Dialogs/ItemProperties.html
@@ -1,1 +1,21 @@
+<div>
 
+	<div class="ce-item-properties-group">
+		<label for="finish">Finish</label>
+		<input name="finish" type="text" value="Project Default" readonly />
+		<button id="change-finish-button" class="pure-button">Change</button>
+	</div>
+
+	<div class="ce-item-properties-group">
+		<label for="style">Style</label>
+		<input name="style" type="text" value="Project Default" readonly />
+		<button id="change-style-button" class="pure-button">Change</button>
+	</div>
+
+	<div class="ce-item-properties-button">
+			<button id="molding-settings-button" class="pure-button">Molding Properties</button>
+	</div>
+
+	<button class="pure-button pure-button-primary ce-item-settings-button">Save</button>
+
+</div>

--- /dev/null
+++ b/source/lib/Dialogs/ItemProperties.js
@@ -1,1 +1,61 @@
+define(
+	[
 
+	 	'Util/DOM',
+	 	'Util/UI',
+
+	 	'Dialogs/StyleSelector',
+	 	'Dialogs/FinishSelector',
+	 	'Dialogs/MoldingSettings',
+
+	 	'require/text!Dialogs/ItemProperties.html'
+
+ 	],
+	function(
+
+		DOM,
+		UI,
+
+	    StyleSelector,
+	    FinishSelector,
+	    MoldingSettings,
+
+	    ItemPropertiesHTML
+
+	){
+
+	var ItemProperties = {};
+
+	ItemProperties.activate = function(editor, cab){
+
+		var itemPropertiesDialog = UI.dialog(
+				ItemPropertiesHTML,
+				{
+					title:		'Item Settings',
+					height:		'auto',
+					width:		400,
+					modal:		true,
+					position:	['top', 100]
+				}
+			);
+
+		ItemProperties.initalize(itemPropertiesDialog, editor, cab);
+
+	};
+
+	ItemProperties.initalize = function(dialog, editor, cab){
+
+		DOM.id('change-finish-button').onclick = FinishSelector.activate;
+		DOM.id('change-style-button').onclick = StyleSelector.activate;
+
+		DOM.id('molding-settings-button').onclick = function(){
+
+			MoldingSettings.activate(editor, cab);
+
+		};
+
+	};
+
+	return ItemProperties;
+
+});

--- /dev/null
+++ b/source/lib/Dialogs/MoldingSettings.html
@@ -1,1 +1,65 @@
+<div style="width:400px;">
 
+	<div id="crown-settings" class="ce-molding-properties-group">
+		<label for="crown">Crown</label>
+		<div class="ce-molding-properties-group-offset">
+			<label for="crown-style">Style</label>
+			<select name="crown-style" id="crown-style">
+				<option value="N/A">N/A</option>
+				<option value="Standard">Standard</option>
+			</select>
+		</div>
+		<div class="ce-molding-properties-group-offset">
+			<label for="crown-size">Size</label>
+			<select name="crown-size" id="crown-size">
+				<option value="Small">Small</option>
+				<option value="Medium">Medium</option>
+				<option value="Large">Large</option>
+				<option value="Very Large">Very Large</option>
+			</select>
+		</div>
+		<br/>
+	</div>
+
+	<div id="light-rail-settings" class="ce-molding-properties-group">
+		<label for="light-rail">Light Rail</label>
+		<div class="ce-molding-properties-group-offset">
+			<label for="light-rail-style">Style</label>
+			<select name="light-rail-style" id="light-rail-style">
+				<option value="N/A">N/A</option>
+				<option value="Standard">Standard</option>
+				<option value="Simple">Simple</option>
+			</select>
+
+		</div>
+		<br/>
+	</div>
+
+	<div id="base-settings" class="ce-molding-properties-group">
+		<label for="base">Base</label>
+		<div class="ce-molding-properties-group-offset">
+			<label for="base-style">Style</label>
+			<select name="base-style" id="base-style">
+				<option value="N/A">N/A</option>
+				<option value="Standard">Standard</option>
+			</select>
+		</div>
+		<br/>
+	</div>
+
+	<div id="scribe-settings" class="ce-molding-properties-group">
+		<label for="scribe">Scribe</label>
+		<div class="ce-molding-properties-group-offset">
+			<label for="scribe-style">Style</label>
+			<select name="scribe-style" id="scribe-style">
+				<option value="N/A">N/A</option>
+				<option value="Standard">Standard</option>
+			</select>
+		</div>
+		<br/>
+	</div>
+
+	<button id="molding-settings-save" class="pure-button pure-button-primary ce-item-settings-button">Save</button>
+
+</div>
+

--- /dev/null
+++ b/source/lib/Dialogs/MoldingSettings.js
@@ -1,1 +1,92 @@
+define(
+	[
 
+	 	'Util/DOM',
+	 	'Util/UI',
+
+	 	'CabinetEditor/Defines/Layer',
+
+	 	'require/text!Dialogs/MoldingSettings.html'
+
+ 	],
+	function(
+
+		DOM,
+		UI,
+
+		Layer,
+
+		MoldingSettingsHTML
+
+	){
+
+	var MoldingSettings = {};
+
+	MoldingSettings.activate = function(editor, cab){
+
+		var moldingSettingsDialog = UI.dialog(
+				MoldingSettingsHTML,
+				{
+					title:		'Molding Settings',
+					height:		'auto',
+					width:		400,
+					modal:		false,
+					position:	['top', 100]
+				}
+			);
+
+		MoldingSettings.initalize(moldingSettingsDialog, editor, cab);
+
+	};
+
+	MoldingSettings.initalize = function(dialog, editor, cab){
+
+		var layer = cab.getLayer();
+
+		if(Layer.UPPER == layer || !cab.hasKick()){
+
+			DOM.id('base-settings').style.display = "none";
+
+		}
+		if(Layer.LOWER == layer){
+
+			DOM.id('crown-settings').style.display = "none";
+			DOM.id('light-rail-settings').style.display = "none";
+
+		} else if(Layer.FULL == layer){
+
+			DOM.id('light-rail-settings').style.display = "none";
+
+		}
+
+		DOM.id('crown-style').value = cab.molding.crownStyle;
+		DOM.id('crown-size').value = cab.molding.crownSize;
+
+		DOM.id('light-rail-style').value = cab.molding.lightRailStyle;
+
+		DOM.id('base-style').value = cab.molding.baseStyle;
+
+		DOM.id('scribe-style').value = cab.molding.scribe;
+
+		DOM.id('molding-settings-save').onclick = function(){
+
+			cab.molding.crownStyle = DOM.id('crown-style').value;
+			cab.molding.crownSize = DOM.id('crown-size').value;
+
+			cab.molding.lightRailStyle = DOM.id('light-rail-style').value;
+
+			cab.molding.baseStyle = DOM.id('base-style').value;
+
+			cab.molding.scribe = DOM.id('scribe-style').value;
+
+			editor.autoSave();
+
+			dialog.close();
+
+		}
+
+	};
+
+	return MoldingSettings;
+
+});

--- a/source/lib/scripts/CabinetEditor/CabinetEditor.js
+++ b/source/lib/scripts/CabinetEditor/CabinetEditor.js
@@ -105,6 +105,12 @@
 

 	};

 

+	CabinetEditor.prototype.getSelected = function(){

+

+		return this.selected_cabinet;

+

+	};

+

 	CabinetEditor.prototype.setSelected = function(cabinet){

 

 		this.selected_cabinet = cabinet;

@@ -153,7 +159,7 @@
 	 */

 	CabinetEditor.prototype.addObject = function(obj){

 

-		this.schematic.objects.push(obj);

+		this.schematic.addObject(obj);

 

 	};

 

@@ -275,6 +281,12 @@
 		} else this.tv_canvas.attachEvent("onmousewheel", function(t){return function(e){t.mouseScroll(e);};}(this));

 

 		// Setup events for Front View Canvas

+		this.fv_canvas.oncontextmenu = function(t){

+			return function(e){

+				t.active_tool.contextMenuFrontView(e);

+				e.preventDefault();

+			};

+		}(this);

 		this.fv_canvas.onmousedown = function(t){

 			return function(e){

 				t.active_tool.mouseDownFrontView(e);


--- a/source/lib/scripts/CabinetEditor/Defines/Layer.js
+++ b/source/lib/scripts/CabinetEditor/Defines/Layer.js
@@ -22,7 +22,9 @@
 			FULL:  3,
 			/** Wall */
 			WALL:  4,
-			MEASURE: 5
+
+			MEASURE: 5 // TODO change to text layer
+
 	};
 
 	return Layer;

--- /dev/null
+++ b/source/lib/scripts/CabinetEditor/Schematic/Cabinet/AccessoryList.js
@@ -1,1 +1,84 @@
+// Accessories list
+	// Position Angle object
+		// Renders as numbered list of accessories
+		// Text Layer
+	// types: Cookie sheet divider, roll outs, shelves? show this?, spice rack
+	// count: 1, 2, 3, etc...
 
+define(
+	[
+
+	 	'CabinetEditor/Schematic/PositionAngleObject',
+
+	 	'Util/Class'
+
+	 	],
+
+	 function(
+
+		PositionAngleObject,
+
+		Class
+
+	 ){
+
+		var AccessoryList = function(id, layer, x, y, w, h, z, d, angle, accessories){
+
+			PositionAngleObject.call(this, id, layer, x, y, w, h, z, d, angle);
+
+			if(accessories)
+				this.accessories = accessories
+			else
+				this.accessories = [];
+
+		}
+
+		Class.extend(PositionAngleObject, AccessoryList);
+
+		AccessoryList.fromData = function(data){
+
+			return new AccessoryList(data.id, data.layer, data.x, data.y, data.w, data.h, data.z, data.d, data.angle, data.accessories);
+
+		};
+
+		AccessoryList.prototype.data = function(){
+
+			var data;
+
+			data = PositionAngleObject.prototype.data.call(this);
+			data.accessories = this.accessories;
+
+			return data;
+
+		};
+
+		AccessoryList.prototype.className = function(){
+			return 'AccessoryList';
+		};
+
+		AccessoryList.prototype.renderTopView = function(ctx){
+
+			var i, txt;
+
+			ctx.save();
+			ctx.translate(this.x, this.y);
+			ctx.rotate(this.angle);
+
+			for(i = 0; i < this.accessories.length; i++){
+
+				txt = this.accessories[0].name + ": " + this.accessories[0].count;
+
+				ctx.fillText(txt, 0, i*10);
+
+			}
+
+			ctx.restore();
+
+		};
+
+		Class.register(AccessoryList);
+
+		return AccessoryList;
+
+	}
+);

--- a/source/lib/scripts/CabinetEditor/Schematic/Cabinet/Cabinet.js
+++ b/source/lib/scripts/CabinetEditor/Schematic/Cabinet/Cabinet.js
@@ -13,10 +13,15 @@
 	 	'CabinetEditor/Schematic/Cabinet/Face/FrameFace',
 	 	'CabinetEditor/Schematic/Cabinet/Face/Kick',
 
+	 	'CabinetEditor/Schematic/Cabinet/Molding',
+	 	'CabinetEditor/Schematic/Cabinet/AccessoryList',
+
 	 	'CabinetEditor/Defines/Layer',
 	 	'CabinetEditor/Defines/Cardinal',
 
 	 	'CabinetEditor/Helper',
+
+	 	'Dialogs/AddAccessory',
 
 	 	'Util/Class'
 
@@ -29,10 +34,15 @@
 		FrameFace,
 		Kick,
 
+		Molding,
+		AccessoryList,
+
 		Layer,
 		Cardinal,
 
 		Helper,
+
+		AddAccessory,
 
 		Class
 
@@ -44,12 +54,15 @@
 	 * @augments SchematicObject
 	 * @param {Array} face Representation of the face of the cabinet
 	 */
-	function Cabinet(id, insertID, layer, x, y, w, h, z, d, angle, faces){
+	function Cabinet(id, insertID, layer, x, y, w, h, z, d, angle, faces, molding, accessoriesID){
 
 		PositionAngleObject.call(this, id, layer, x, y, w, h, z, d, angle);
 
 		this.insertID = insertID;
 		this.insertReference = null;
+
+		this.accessoriesID = accessoriesID;
+		this.accessoriesReference = null;
 
 		/**
 		 * Representation of the faces of the cabinet
@@ -62,6 +75,15 @@
 		 */
 		this.faces = faces;
 
+		if(molding)
+			this.molding = molding;
+		else {
+			var kick = true;
+			if(this.faces)
+				kick = this.hasKick();
+			this.molding = Molding.fromLayer(layer, kick);
+		}
+
 		this.style = "Project Default";
 		this.finish = "Project Default";
 
@@ -91,7 +113,7 @@
 
 	Cabinet.prototype.clone = function(){
 
-		return new Cabinet(-1, -1, this.getLayer(), this.x, this.y, this.w, this.h, this.z, this.d, this.angle, this.cloneFaces());
+		return new Cabinet(-1, -1, this.getLayer(), this.x, this.y, this.w, this.h, this.z, this.d, this.angle, this.cloneFaces(), this.molding.clone());
 
 	};
 
@@ -137,6 +159,7 @@
 		data = PositionAngleObject.prototype.data.call(this);
 		data.faces = this.facesToData();
 		data.insertID = this.insertID;
+		data.molding = this.molding.data();
 
 		return data;
 
@@ -164,7 +187,7 @@
 
 	Cabinet.fromData = function(data){
 
-		return new Cabinet(data.id, data.insertID, data.layer, data.x, data.y, data.w, data.h, data.z, data.d, data.angle, Cabinet.facesFromData(data));
+		return new Cabinet(data.id, data.insertID, data.layer, data.x, data.y, data.w, data.h, data.z, data.d, data.angle, Cabinet.facesFromData(data), Molding.fromData(data.molding));
 
 	};
 
@@ -255,6 +278,9 @@
 
 		ctx.restore();
 
+		// TODO render molding
+		this.molding.renderFrontView(ctx, this.z, this.d, frame_width);
+
 	};
 
 	Cabinet.prototype.renderDetailView = function(ctx, cvs){
@@ -352,6 +378,13 @@
 		return null;
 
 	};
+
+	Cabinet.prototype.hasKick = function(){
+
+		var face = this.faces.front_face;
+		return face.fronts[face.fronts.length-1] instanceof Kick;
+
+	}
 
 	/**
 	 * Creates array buffer to draw object
@@ -478,6 +511,42 @@
 
 	};
 
+	Cabinet.prototype.getContextMenu = function(windowPoint, schematicPoint, editor){
+
+		var menu = Cabinet.superClass.prototype.getContextMenu.call(this, windowPoint, schematicPoint, editor),
+			t = this;
+
+		if(menu){
+
+			// TODO show/hide accessories text
+			// only show the show/hide if there is an accesorie and
+			// hide the add accessory if there are accessories and they are hidden
+			// Change accessories list dialog
+			menu.add(
+				{
+					text: "Change Accessories",
+					callback: function(){
+						AddAccessory.activate(editor, t);
+					}
+				}
+			);
+
+		}
+
+		return menu;
+
+	};
+
+	Cabinet.prototype.getContextMenuFrontView = function(){
+
+		// Set molding types
+			// Molding dialog
+		// Add accessory
+
+		return null;
+
+	};
+
 	Cabinet.prototype.centerAttachmentRotation = function(){
 		return 0;
 	};

--- a/source/lib/scripts/CabinetEditor/Schematic/Cabinet/CornerCabinet.js
+++ b/source/lib/scripts/CabinetEditor/Schematic/Cabinet/CornerCabinet.js
@@ -11,7 +11,7 @@
 	 	'CabinetEditor/Schematic/SchematicObject',
 	 	'CabinetEditor/Schematic/Cabinet/Cabinet',
 	 	'CabinetEditor/Schematic/Cabinet/Face/Kick',
-	 	'CabinetEditor/Schematic/Other/ObjMeasurement',
+	 	'CabinetEditor/Schematic/Other/Measurements/ObjMeasurement',
 	 	'CabinetEditor/Defines/Cardinal',
 
 	 	'Geometry/LineSegment2D',

--- a/source/lib/scripts/CabinetEditor/Schematic/Cabinet/LCabinet.js
+++ b/source/lib/scripts/CabinetEditor/Schematic/Cabinet/LCabinet.js
@@ -9,7 +9,7 @@
 	 	'CabinetEditor/Schematic/SchematicObject',
 	 	'CabinetEditor/Schematic/Cabinet/Cabinet',
 	 	'CabinetEditor/Schematic/Cabinet/Face/Kick',
-	 	'CabinetEditor/Schematic/Other/ObjMeasurement',
+	 	'CabinetEditor/Schematic/Other/Measurements/ObjMeasurement',
 
 	 	'CabinetEditor/Picks/Item/Top/DragPick',
 

--- /dev/null
+++ b/source/lib/scripts/CabinetEditor/Schematic/Cabinet/Molding.js
@@ -1,1 +1,180 @@
+// Molding configuration
+	// Upper only / Full Height
+		// Default: Standard, Large
+		// Crown
+			// type: default
+			// size: small, medium?, large, very large
+		// Default: standard
+		// Light Rail
+			// type: default, simple
+	// Base Only / Full Height / has to have kick
+		// Default: standard, large
+		// Base
+			// type: default
+	// Both
+		// Default: on
+		// Scribe?, sticks out 1/4 inch, hard to render, only on sides with nothing touching for full height
+		// Left and right
+		// Probably auto fill with this as on off option per side
 
+define(
+	[
+
+	 	'CabinetEditor/Defines/Layer',
+
+	 	'Util/Class'
+
+ 	],
+	function(
+
+		Layer,
+
+		Class
+
+	){
+
+		var Molding = function(crownStyle, crownSize, lightRailStyle, baseStyle, scribe){
+
+			this.crownStyle = crownStyle;
+			this.crownSize = crownSize;
+			this.lightRailStyle = lightRailStyle;
+			this.baseStyle = baseStyle;
+			this.scribe = scribe;
+
+		};
+
+		Molding.fromLayer = function(layer, kick){
+
+			var crownStyle, crownSize, lightRailStyle, baseStyle, scribe;
+
+			if(Layer.UPPER == layer || Layer.FULL == layer){
+
+				crownStyle = "Standard";
+				crownSize = "Large";
+
+				if(Layer.FULL == layer)
+					lightRailStyle = "N/A";
+				else
+					lightRailStyle = "Standard";
+
+			} else {
+
+				crownStyle = "N/A";
+				lightRailStyle = "N/A";
+
+			}
+
+			if((Layer.LOWER == layer || Layer.FULL == layer) && kick){
+
+				baseStyle = "Standard";
+
+			} else {
+
+				baseStyle = "N/A";
+
+			}
+
+			scribe = "Standard";
+
+			return new Molding(crownStyle, crownSize, lightRailStyle, baseStyle, scribe);
+
+		}
+		
+		Molding.prototype.clone = function(){
+
+			return new Molding(this.crownStyle, this.crownSize, this.lightRailStyle, this.baseStyle, this.scribe);
+
+		};
+
+		Molding.prototype.data = function(){
+
+			var data = {};
+
+			data.proto = this.className();
+			data.crownStyle = this.crownStyle;
+			data.crownSize = this.crownSize;
+			data.lightRailStyle = this.lightRailStyle;
+			data.baseStyle = this.baseStyle;
+			data.scribe = this.scribe;
+
+			return data;
+
+		};
+
+		Molding.fromData = function(data){
+
+			return new Molding(data.crownStyle, data.crownSize, data.lightRailStyle, data.baseStyle, data.scribe);
+
+		};
+
+		Molding.prototype.className = function(){
+
+			return 'Molding';
+
+		};
+
+		Molding.prototype.renderFrontView = function(ctx, z, d, w){
+
+			ctx.lineWidth = 0.125;
+
+			ctx.beginPath();
+
+			if(this.crownStyle === "Standard"){
+
+				if(this.crownSize === "Large"){
+					
+					ctx.moveTo(0, -z - d - 0.25);
+					ctx.lineTo(w, -z - d - 0.25);
+
+					ctx.moveTo(0, -z - d - 1);
+					ctx.lineTo(w, -z - d - 1);
+
+					ctx.moveTo(0, -z - d - 2.5);
+					ctx.lineTo(w, -z - d - 2.5);
+
+					ctx.moveTo(0, -z - d - 3.5);
+					ctx.lineTo(w, -z - d - 3.5);
+
+				}
+
+			}
+
+			if(this.lightRailStyle === "Standard"){
+
+				ctx.moveTo(0, -z + 0.25);
+				ctx.lineTo(w, -z + 0.25);
+
+				ctx.moveTo(0, -z + 1);
+				ctx.lineTo(w, -z + 1);
+
+				ctx.moveTo(0, -z + 1.25);
+				ctx.lineTo(w, -z + 1.25);
+
+			}
+
+			if(this.baseStyle === "Standard"){
+
+				ctx.moveTo(0, -z - 0.25);
+				ctx.lineTo(w, -z - 0.25);
+
+				ctx.moveTo(0, -z - 2.75);
+				ctx.lineTo(w, -z - 2.75);
+
+				ctx.moveTo(0, -z - 3.25);
+				ctx.lineTo(w, -z - 3.25);
+
+			}
+
+			// TODO Render Scribe
+			// TODO render right left edges if not adjacent to same level object
+
+			ctx.stroke();
+
+		};
+
+		Class.register(Molding);
+
+		return Molding;
+
+	}
+);

--- a/source/lib/scripts/CabinetEditor/Schematic/Other/Measurement.js
+++ /dev/null
@@ -1,279 +1,1 @@
-define(
-	[
-	 	'CabinetEditor/Schematic/SchematicObject',
-	 	'CabinetEditor/Defines/Layer',
 
-	 	'CabinetEditor/Picks/MeasurementDragPick',
-
-	 	'CabinetEditor/Helper',
-	 	'CabinetEditor/Config',
-
-	 	'Geometry/Point2D',
-	 	'Geometry/LineSegment2D',
-
-	 	'Util/UI',
-	 	'Util/UMath',
-	 	'Util/Class'
-	],
-	function(
-		SchematicObject,
-		Layer,
-
-		MeasurementDragPick,
-
-		Helper,
-		Config,
-
-		Point,
-		LineSegment,
-
-		UI,
-		UMath,
-		Class
-	){
-
-		var Measurement = function(id, x, y, visible){
-
-			SchematicObject.call(this, id, Layer.MEASURE);
-
-			// Rotated Offset from object to draw measurment at
-			this.x = x;
-			this.y = y;
-
-			this.visible = visible;
-
-			this.objectID = -1;
-			this.objectReference = null;
-
-		};
-
-		Class.extend(SchematicObject, Measurement);
-		
-		Measurement.prototype.data = function(){
-
-			var data;
-
-			data = SchematicObject.prototype.data.call(this);
-			data.layer = undefined;
-			data.x = this.x;
-			data.y = this.y;
-			data.visible = this.visible;
-			data.objectID = this.objectID;
-
-			return data;
-
-		};
-
-		Measurement.prototype.className = function(){
-			return 'Measurement';
-		};
-
-		Measurement.prototype.rebuildReferences = function(schematic){
-
-			this.objectReference = schematic.getByID(this.objectID);
-			if(this.objectReference === null) throw "Reference Object ID " + this.objectID + " not found";
-
-		};
-
-		Measurement.prototype.has3D = function(){
-			return false;
-		};
-
-		Measurement.prototype.hasFrontView = function(){
-			return false;
-		};
-
-		Measurement.prototype.collides = function(){
-			return false;
-		};
-
-		Measurement.prototype.getLine = function(){
-			throw "Measurment.getLine virtual function call";
-		};
-
-		Measurement.prototype.getCenter = function(){
-			throw "Measurment.getCenter virtual function call";
-		};
-
-		Measurement.prototype.getAngle = function(){
-			throw "Measurment.getRotation virtual function call";
-		};
-
-		Measurement.prototype.removeReferences = function(){
-			throw "Measurment.removeReferences virtual function call";
-		};
-
-		Measurement.prototype.getContextMenu = function(windowPoint, schematicPoint, editor){
-
-			var t, offset;
-
-			t = this;
-
-			offset = this.getCenter();
-			offset = Point.add(offset, new Point(this.x, this.y)).rotateAboutPoint(-this.getAngle(), offset);
-
-			if(this.visible && schematicPoint.distanceToPoint(offset) < 4){
-
-				return UI.contextMenu(
-					windowPoint.x,
-					windowPoint.y,
-					[
-					 	{
-					 		text: 'Hide Measurment',
-					 		callback: function(){
-					 			t.visible = false;
-					 			editor.animate();
-					 			editor.autoSave();
-					 		}
-					 	},
-					 	{
-					 		text: 'Delete Measurment',
-					 		callback: function(){
-					 			t.removeReferences();
-					 			editor.schematic.removeByID(t.getID(), editor);
-					 			editor.animate();
-					 			editor.autoSave();
-					 		}
-					 	}
-					]
-				);
-			}
-
-			return null;
-
-		};
-
-		Measurement.prototype.getPick = function(x, y){
-
-			var offset, dragDistance;
-
-			offset = this.getCenter();
-			offset = Point.add(offset, new Point(this.x, this.y)).rotateAboutPoint(-this.getAngle(), offset);
-
-			dragDistance = 4;
-
-			if(this.visible && new Point(x, y).distanceToPoint(offset) < dragDistance){
-				return new MeasurementDragPick(x, y, this);
-			}
-
-			return null;
-
-		};
-
-		Measurement.prototype.renderTopView = function(ctx){
-
-			var line, length, lengthText, angle, angleOff, lineToMeasure, angleToMeasure, distance, endPoint, leftPoint, rightPoint, d1, d2,
-			cosATM, distAdd, offset, oldLineWidth;
-
-			if(this.visible){
-	
-				offset = this.getCenter();
-				offset = Point.add(offset, new Point(this.x, this.y)).rotateAboutPoint(-this.getAngle(), offset);
-	
-				// Get reference Object Points
-				line = this.getLine();
-				length = Helper.nearestMultiple(line.length(), Config.minimumUnit);
-				lengthText = length.toString() + ' "';
-				ctx.font = "4px Arial";
-				length = ctx.measureText(lengthText).width;
-	
-				oldLineWidth = ctx.lineWidth;
-				ctx.lineWidth = oldLineWidth/4;
-
-				// find the angle perpindiclar to the line between those points
-				angleOff = line.getAngle();
-				angle = angleOff - (Math.PI / 2);
-	
-				// draw perpendicular lines 2 inches past the distance to the x, y
-				lineToMeasure = new LineSegment(offset, new Point(line.point1.x, line.point1.y));
-				angleToMeasure = lineToMeasure.getAngle();
-	
-				angleToMeasure = UMath.subtractRadians(angleToMeasure, angle);
-				angleToMeasure = Math.abs(angleToMeasure);
-	
-				cosATM = Math.cos(angleToMeasure);
-				distAdd = 2;
-				if(cosATM < 0) distAdd = -2;
-	
-				distance = (lineToMeasure.length() * cosATM) + distAdd;
-				endPoint = new Point(line.point1.x + Math.cos(angle) * distance, line.point1.y + Math.sin(angle) * distance);
-	
-				ctx.beginPath();
-				ctx.moveTo(line.point1.x, line.point1.y);
-				ctx.lineTo(endPoint.x, endPoint.y);
-				ctx.stroke();
-	
-				distance = (lineToMeasure.length() * Math.cos(angleToMeasure));
-				endPoint = new Point(line.point1.x + Math.cos(angle) * distance, line.point1.y + Math.sin(angle) * distance);
-	
-				distance = endPoint.distanceToPoint(offset) - (length * 1.4 / 2);
-				angleOff = new LineSegment(endPoint, offset).getAngle();
-				leftPoint = new Point(endPoint.x - Math.cos(angleOff) * distance, endPoint.y - Math.sin(angleOff) * distance);
-				distance += length * 1.4;
-				rightPoint = new Point(endPoint.x - Math.cos(angleOff) * distance, endPoint.y - Math.sin(angleOff) * distance);
-	
-				d1 = leftPoint.distanceToPoint(endPoint);
-				d2 = rightPoint.distanceToPoint(endPoint);
-				if(d1 > d2){
-					ctx.beginPath();
-					ctx.moveTo(endPoint.x, endPoint.y);
-					ctx.lineTo(rightPoint.x, rightPoint.y);
-					ctx.stroke();
-				} else {
-					ctx.beginPath();
-					ctx.moveTo(endPoint.x, endPoint.y);
-					ctx.lineTo(leftPoint.x, leftPoint.y);
-					ctx.stroke();
-				}
-	
-				lineToMeasure = new LineSegment(offset, new Point(line.point2.x, line.point2.y));
-				angleToMeasure = lineToMeasure.getAngle();
-	
-				angleToMeasure = UMath.subtractRadians(angleToMeasure, angle);
-				angleToMeasure = Math.abs(angleToMeasure);
-	
-				cosATM = Math.cos(angleToMeasure);
-				distAdd = 2;
-				if(cosATM < 0) distAdd = -2;
-	
-				distance = (lineToMeasure.length() * cosATM) + distAdd;
-				endPoint = new Point(line.point2.x + Math.cos(angle) * distance, line.point2.y + Math.sin(angle) * distance);
-	
-				ctx.beginPath();
-				ctx.moveTo(line.point2.x, line.point2.y);
-				ctx.lineTo(endPoint.x, endPoint.y);
-				ctx.stroke();
-	
-				distance = (lineToMeasure.length() * Math.cos(angleToMeasure));
-				endPoint = new Point(line.point2.x + Math.cos(angle) * distance, line.point2.y + Math.sin(angle) * distance);
-	
-				d1 = leftPoint.distanceToPoint(endPoint);
-				d2 = rightPoint.distanceToPoint(endPoint);
-				if(d1 > d2){
-					ctx.beginPath();
-					ctx.moveTo(endPoint.x, endPoint.y);
-					ctx.lineTo(rightPoint.x, rightPoint.y);
-					ctx.stroke();
-				} else {
-					ctx.beginPath();
-					ctx.moveTo(endPoint.x, endPoint.y);
-					ctx.lineTo(leftPoint.x, leftPoint.y);
-					ctx.stroke();
-				}
-	
-				// draw the text at x, y
-				ctx.fillStyle = ctx.strokeStyle;
-				ctx.fillText(lengthText, offset.x - (length / 2), offset.y + 2);
-
-				ctx.lineWidth = oldLineWidth;
-
-			}
-
-		};
-
-		Class.register(Measurement);
-
-		return Measurement;
-
-	}
-);

--- /dev/null
+++ b/source/lib/scripts/CabinetEditor/Schematic/Other/Measurements/Measurement.js
@@ -1,1 +1,279 @@
-
+define(
+	[
+	 	'CabinetEditor/Schematic/SchematicObject',
+	 	'CabinetEditor/Defines/Layer',
+
+	 	'CabinetEditor/Picks/MeasurementDragPick',
+
+	 	'CabinetEditor/Helper',
+	 	'CabinetEditor/Config',
+
+	 	'Geometry/Point2D',
+	 	'Geometry/LineSegment2D',
+
+	 	'Util/UI',
+	 	'Util/UMath',
+	 	'Util/Class'
+	],
+	function(
+		SchematicObject,
+		Layer,
+
+		MeasurementDragPick,
+
+		Helper,
+		Config,
+
+		Point,
+		LineSegment,
+
+		UI,
+		UMath,
+		Class
+	){
+
+		var Measurement = function(id, x, y, visible){
+
+			SchematicObject.call(this, id, Layer.MEASURE);
+
+			// Rotated Offset from object to draw measurment at
+			this.x = x;
+			this.y = y;
+
+			this.visible = visible;
+
+			this.objectID = -1;
+			this.objectReference = null;
+
+		};
+
+		Class.extend(SchematicObject, Measurement);
+		
+		Measurement.prototype.data = function(){
+
+			var data;
+
+			data = SchematicObject.prototype.data.call(this);
+			data.layer = undefined;
+			data.x = this.x;
+			data.y = this.y;
+			data.visible = this.visible;
+			data.objectID = this.objectID;
+
+			return data;
+
+		};
+
+		Measurement.prototype.className = function(){
+			return 'Measurement';
+		};
+
+		Measurement.prototype.rebuildReferences = function(schematic){
+
+			this.objectReference = schematic.getByID(this.objectID);
+			if(this.objectReference === null) throw "Reference Object ID " + this.objectID + " not found";
+
+		};
+
+		Measurement.prototype.has3D = function(){
+			return false;
+		};
+
+		Measurement.prototype.hasFrontView = function(){
+			return false;
+		};
+
+		Measurement.prototype.collides = function(){
+			return false;
+		};
+
+		Measurement.prototype.getLine = function(){
+			throw "Measurment.getLine virtual function call";
+		};
+
+		Measurement.prototype.getCenter = function(){
+			throw "Measurment.getCenter virtual function call";
+		};
+
+		Measurement.prototype.getAngle = function(){
+			throw "Measurment.getRotation virtual function call";
+		};
+
+		Measurement.prototype.removeReferences = function(){
+			throw "Measurment.removeReferences virtual function call";
+		};
+
+		Measurement.prototype.getContextMenu = function(windowPoint, schematicPoint, editor){
+
+			var t, offset;
+
+			t = this;
+
+			offset = this.getCenter();
+			offset = Point.add(offset, new Point(this.x, this.y)).rotateAboutPoint(-this.getAngle(), offset);
+
+			if(this.visible && schematicPoint.distanceToPoint(offset) < 4){
+
+				return UI.contextMenu(
+					windowPoint.x,
+					windowPoint.y,
+					[
+					 	{
+					 		text: 'Hide Measurment',
+					 		callback: function(){
+					 			t.visible = false;
+					 			editor.animate();
+					 			editor.autoSave();
+					 		}
+					 	},
+					 	{
+					 		text: 'Delete Measurment',
+					 		callback: function(){
+					 			t.removeReferences();
+					 			editor.schematic.removeByID(t.getID(), editor);
+					 			editor.animate();
+					 			editor.autoSave();
+					 		}
+					 	}
+					]
+				);
+			}
+
+			return null;
+
+		};
+
+		Measurement.prototype.getPick = function(x, y){
+
+			var offset, dragDistance;
+
+			offset = this.getCenter();
+			offset = Point.add(offset, new Point(this.x, this.y)).rotateAboutPoint(-this.getAngle(), offset);
+
+			dragDistance = 4;
+
+			if(this.visible && new Point(x, y).distanceToPoint(offset) < dragDistance){
+				return new MeasurementDragPick(x, y, this);
+			}
+
+			return null;
+
+		};
+
+		Measurement.prototype.renderTopView = function(ctx){
+
+			var line, length, lengthText, angle, angleOff, lineToMeasure, angleToMeasure, distance, endPoint, leftPoint, rightPoint, d1, d2,
+			cosATM, distAdd, offset, oldLineWidth;
+
+			if(this.visible){
+	
+				offset = this.getCenter();
+				offset = Point.add(offset, new Point(this.x, this.y)).rotateAboutPoint(-this.getAngle(), offset);
+	
+				// Get reference Object Points
+				line = this.getLine();
+				length = Helper.nearestMultiple(line.length(), Config.minimumUnit);
+				lengthText = length.toString() + ' "';
+				ctx.font = "4px Arial";
+				length = ctx.measureText(lengthText).width;
+	
+				oldLineWidth = ctx.lineWidth;
+				ctx.lineWidth = oldLineWidth/4;
+
+				// find the angle perpindiclar to the line between those points
+				angleOff = line.getAngle();
+				angle = angleOff - (Math.PI / 2);
+	
+				// draw perpendicular lines 2 inches past the distance to the x, y
+				lineToMeasure = new LineSegment(offset, new Point(line.point1.x, line.point1.y));
+				angleToMeasure = lineToMeasure.getAngle();
+	
+				angleToMeasure = UMath.subtractRadians(angleToMeasure, angle);
+				angleToMeasure = Math.abs(angleToMeasure);
+	
+				cosATM = Math.cos(angleToMeasure);
+				distAdd = 2;
+				if(cosATM < 0) distAdd = -2;
+	
+				distance = (lineToMeasure.length() * cosATM) + distAdd;
+				endPoint = new Point(line.point1.x + Math.cos(angle) * distance, line.point1.y + Math.sin(angle) * distance);
+	
+				ctx.beginPath();
+				ctx.moveTo(line.point1.x, line.point1.y);
+				ctx.lineTo(endPoint.x, endPoint.y);
+				ctx.stroke();
+	
+				distance = (lineToMeasure.length() * Math.cos(angleToMeasure));
+				endPoint = new Point(line.point1.x + Math.cos(angle) * distance, line.point1.y + Math.sin(angle) * distance);
+	
+				distance = endPoint.distanceToPoint(offset) - (length * 1.4 / 2);
+				angleOff = new LineSegment(endPoint, offset).getAngle();
+				leftPoint = new Point(endPoint.x - Math.cos(angleOff) * distance, endPoint.y - Math.sin(angleOff) * distance);
+				distance += length * 1.4;
+				rightPoint = new Point(endPoint.x - Math.cos(angleOff) * distance, endPoint.y - Math.sin(angleOff) * distance);
+	
+				d1 = leftPoint.distanceToPoint(endPoint);
+				d2 = rightPoint.distanceToPoint(endPoint);
+				if(d1 > d2){
+					ctx.beginPath();
+					ctx.moveTo(endPoint.x, endPoint.y);
+					ctx.lineTo(rightPoint.x, rightPoint.y);
+					ctx.stroke();
+				} else {
+					ctx.beginPath();
+					ctx.moveTo(endPoint.x, endPoint.y);
+					ctx.lineTo(leftPoint.x, leftPoint.y);
+					ctx.stroke();
+				}
+	
+				lineToMeasure = new LineSegment(offset, new Point(line.point2.x, line.point2.y));
+				angleToMeasure = lineToMeasure.getAngle();
+	
+				angleToMeasure = UMath.subtractRadians(angleToMeasure, angle);
+				angleToMeasure = Math.abs(angleToMeasure);
+	
+				cosATM = Math.cos(angleToMeasure);
+				distAdd = 2;
+				if(cosATM < 0) distAdd = -2;
+	
+				distance = (lineToMeasure.length() * cosATM) + distAdd;
+				endPoint = new Point(line.point2.x + Math.cos(angle) * distance, line.point2.y + Math.sin(angle) * distance);
+	
+				ctx.beginPath();
+				ctx.moveTo(line.point2.x, line.point2.y);
+				ctx.lineTo(endPoint.x, endPoint.y);
+				ctx.stroke();
+	
+				distance = (lineToMeasure.length() * Math.cos(angleToMeasure));
+				endPoint = new Point(line.point2.x + Math.cos(angle) * distance, line.point2.y + Math.sin(angle) * distance);
+	
+				d1 = leftPoint.distanceToPoint(endPoint);
+				d2 = rightPoint.distanceToPoint(endPoint);
+				if(d1 > d2){
+					ctx.beginPath();
+					ctx.moveTo(endPoint.x, endPoint.y);
+					ctx.lineTo(rightPoint.x, rightPoint.y);
+					ctx.stroke();
+				} else {
+					ctx.beginPath();
+					ctx.moveTo(endPoint.x, endPoint.y);
+					ctx.lineTo(leftPoint.x, leftPoint.y);
+					ctx.stroke();
+				}
+	
+				// draw the text at x, y
+				ctx.fillStyle = ctx.strokeStyle;
+				ctx.fillText(lengthText, offset.x - (length / 2), offset.y + 2);
+
+				ctx.lineWidth = oldLineWidth;
+
+			}
+
+		};
+
+		Class.register(Measurement);
+
+		return Measurement;
+
+	}
+);

--- /dev/null
+++ b/source/lib/scripts/CabinetEditor/Schematic/Other/Measurements/ObjMeasurement.js
@@ -1,1 +1,154 @@
+define(
+	[
+	 	'CabinetEditor/Schematic/Other/Measurements/Measurement',
 
+	 	'Geometry/Point2D',
+
+	 	'Util/Class'
+	],
+	function(
+		Measurement,
+
+		Point,
+
+		Class
+	){
+
+		var ObjMeasurement = function(id, x, y, visible, side){
+
+			Measurement.call(this, id, x, y, visible);
+
+			this.objectSide = side; // Cardinal Side: N, S, E, W, NE, NW, SE, SW
+
+		};
+
+		Class.extend(Measurement, ObjMeasurement);
+
+		ObjMeasurement.prototype.data = function(){
+
+			var data;
+
+			data = Measurement.prototype.data.call(this);
+			data.objectSide = this.objectSide;
+
+			return data;
+
+		};
+
+		ObjMeasurement.fromData = function(data){
+
+			var obj = new ObjMeasurement(data.id, data.x, data.y, data.visible, data.objectSide);
+			obj.objectID = data.objectID;
+			return obj;
+
+		};
+
+		ObjMeasurement.prototype.className = function(){
+			return 'ObjMeasurement';
+		};
+
+		ObjMeasurement.prototype.removeReferences = function(){
+
+			var i;
+
+			for(i = 0; i < this.objectReference.measurements.length; i++){
+				if(this.objectReference.measurements[i] === this){
+					this.objectReference.measurements.splice(i, 1);
+					return;
+				}
+			}
+
+		};
+
+		ObjMeasurement.prototype.rebuildReferences = function(schematic){
+
+			Measurement.prototype.rebuildReferences.call(this, schematic);
+
+			// Give objects references to the measurments
+			this.objectReference.measurements.push(this);
+
+		};
+
+		ObjMeasurement.prototype.getLine = function(){
+
+			var line;
+
+			if(this.objectReference !== null){
+
+				line = this.objectReference.getLine(this.objectSide);
+
+				if(line !== undefined){
+
+					return line;
+
+				} else {
+					throw "Cardinal side " + this.objectSide + " does not exist for object with ID " + this.objectID;
+				}
+
+			}
+
+			throw "Object Reference is null can't generate measurment ID " + this.id + " points";
+
+		};
+
+		ObjMeasurement.prototype.getCenter = function(){
+
+			return new Point(this.objectReference.x, this.objectReference.y);
+
+		};
+
+		ObjMeasurement.prototype.getAngle = function(){
+
+			return this.objectReference.getAngle();
+
+		};
+
+		ObjMeasurement.createMeasurmentContextMenuOptions = function(object, measure, editor, options, name, x, y, side){
+
+			if(measure !== null){
+				if(measure.visible){
+					options.push(
+						{
+							text: 'Hide ' + name + ' Measurement',
+							callback: function(){
+								measure.visible = false;
+								editor.animate();
+								editor.autoSave();
+							}
+						}
+					);
+				} else {
+					options.push(
+						{
+							text: 'Show ' + name + ' Measurement',
+							callback: function(){
+								measure.visible = true;
+								editor.animate();
+								editor.autoSave();
+							}
+						}
+					);
+				}
+			} else {
+				options.push(
+					{
+				 		text: 'Show ' + name + ' Measurement',
+				 		callback: function(){
+				 			var measurement = new ObjMeasurement(editor.schematic.newID(), x, y, true, side);
+				 			measurement.objectID = object.id;
+				 			measurement.rebuildReferences(editor.schematic);
+				 			editor.addObject(measurement);
+				 			editor.animate();
+				 		}
+				 	}
+				);
+			}
+
+		};
+
+		Class.register(ObjMeasurement);
+
+		return ObjMeasurement;
+
+	}
+);

--- /dev/null
+++ b/source/lib/scripts/CabinetEditor/Schematic/Other/Measurements/P2PMeasurement.js
@@ -1,1 +1,133 @@
+define(
+	[
+	 	'CabinetEditor/Schematic/SchematicObject',
+	 	'CabinetEditor/Defines/Layer',
+	 	'CabinetEditor/Helper',
+	 	'CabinetEditor/Config',
 
+	 	'Geometry/LineSegment2D',
+	 	'Geometry/Point2D',
+
+	 	'Util/UI',
+	 	'Util/Class'
+	],
+	function(
+		SchematicObject,
+		Layer,
+		Helper,
+		Config,
+
+		LineSegment,
+		Point,
+
+		UI,
+		Class
+	){
+
+		var P2PMeasurement = function(id, pt1, pt2, textPoint){
+
+			SchematicObject.call(this, id, Layer.MEASURE);
+			this.pt1 = pt1;
+			this.pt2 = pt2;
+			this.textPoint = textPoint;
+
+		};
+
+		Class.extend(SchematicObject, P2PMeasurement);
+
+		P2PMeasurement.prototype.data = function(){
+
+			var data;
+
+			data = SchematicObject.prototype.data.call(this);
+			data.layer = undefined;
+			data.pt1 = this.pt1.data();
+			data.pt2 = this.pt2.data();
+			data.textPoint = this.textPoint.data();
+
+			return data;
+
+		};
+
+		P2PMeasurement.fromData = function(data){
+
+			return new P2PMeasurement(data.id, Point.fromData(data.pt1), Point.fromData(data.pt2), Point.fromData(data.textPoint));
+
+		};
+
+		P2PMeasurement.prototype.className = function(){
+			return 'P2PMeasurement';
+		};
+
+		P2PMeasurement.prototype.has3D = function(){
+			return false;
+		};
+
+		P2PMeasurement.prototype.hasFrontView = function(){
+			return false;
+		};
+
+		P2PMeasurement.prototype.collides = function(){
+			return false;
+		};
+
+		P2PMeasurement.prototype.getContextMenu = function(windowPoint, schematicPoint, editor){
+
+			var t = this;
+
+			if(schematicPoint.distanceToPoint(this.textPoint) < 4){
+
+				return UI.contextMenu(
+					windowPoint.x,
+					windowPoint.y,
+					[
+					 	{
+					 		text: 'Delete Measurment',
+					 		callback: function(){
+					 			editor.schematic.removeByID(t.getID(), editor);
+					 			editor.animate();
+					 			editor.autoSave();
+					 		}
+					 	}
+					]
+				);
+			}
+
+			return null;
+
+		};
+
+		P2PMeasurement.prototype.renderTopView = function(ctx){
+
+			var length, lengthText, line, lp, rp;
+
+			line = new LineSegment(this.pt1, this.pt2);
+			length = Helper.nearestMultiple(line.length(), Config.minimumUnit);
+			lengthText = length.toString() + ' "';
+			ctx.font = "4px Arial";
+			length = ctx.measureText(lengthText).width;
+
+			lp = line.midpointFromCenter(length / 2);
+			rp = line.midpointFromCenter(- length / 2);
+
+			ctx.strokeStyle = '#000000';
+			ctx.lineWidth /= 2;
+			ctx.beginPath();
+			ctx.moveTo(this.pt1.x, this.pt1.y);
+			ctx.lineTo(lp.x, lp.y);
+			ctx.moveTo(rp.x, rp.y);
+			ctx.lineTo(this.pt2.x, this.pt2.y);
+			ctx.stroke();
+			ctx.lineWidth *= 2;
+
+			ctx.fillStyle = ctx.strokeStyle;
+			ctx.fillText(lengthText, this.textPoint.x - length/2, this.textPoint.y + 2);
+
+		};
+
+		Class.register(P2PMeasurement);
+
+		return P2PMeasurement;
+
+	}
+);

--- /dev/null
+++ b/source/lib/scripts/CabinetEditor/Schematic/Other/Measurements/WallMeasurement.js
@@ -1,1 +1,192 @@
+define(
+	[
+	 	'CabinetEditor/Schematic/Other/Measurements/Measurement',
 
+	 	'Geometry/LineSegment2D',
+
+	 	'Util/UMath',
+	 	'Util/Class'
+	],
+	function(
+		Measurement,
+
+		LineSegment,
+
+		UMath,
+		Class
+	){
+
+		var WallMeasurement = function(id, x, y, visible, wallSide){
+
+			Measurement.call(this, id, x, y, visible);
+
+			this.wallSide = wallSide; // A int indicating if this measurment is for side 1: dp1-3 or 2: dp2-4
+
+			this.cachedLine = null;
+			this.cachedCenter = null;
+			this.cachedAngle = Number.NaN;
+
+			this.wallList = [];
+
+		};
+
+		Class.extend(Measurement, WallMeasurement);
+
+		WallMeasurement.prototype.data = function(){
+
+			var data;
+
+			data = Measurement.prototype.data.call(this);
+			data.wallSide = this.wallSide;
+
+			return data;
+
+		};
+
+		WallMeasurement.fromData = function(data){
+
+			var obj = new WallMeasurement(data.id, data.x, data.y, data.visible, data.wallSide);
+			obj.objectID = data.objectID;
+			return obj;
+
+		};
+
+		WallMeasurement.prototype.className = function(){
+			return 'WallMeasurement';
+		};
+
+		WallMeasurement.prototype.removeReferences = function(){
+
+			var i;
+
+			for(i = 0; i < this.wallList.length; i++){
+				if(this.wallList[i].measureSide1 == this){
+					this.wallList[i].measureSide1 = null;
+				}
+				else if(this.wallList[i].measureSide2 == this){
+					this.wallList[i].measureSide2 = null;
+				}
+			}
+
+		};
+
+		WallMeasurement.prototype.recalculateCachedProperties = function(){
+
+			var line, p1 =  null, p2 = null;
+
+			// Calculate Line
+			// first we figure out what points we are using based on side
+			if(this.wallSide === 1){
+				this.objectReference.measureSide1 = this;
+				p1 = this.objectReference.dp1;
+				p2 = this.objectReference.dp2;
+			} else if(this.wallSide === 2) {
+				this.objectReference.measureSide2 = this;
+				p1 = this.objectReference.dp3;
+				p2 = this.objectReference.dp4;
+			}
+
+			this.wallList = [];
+			this.wallList.push(this.objectReference);
+			// Now we look at the neighbor lists for each wall and see
+			// if any of there points match
+			p1 = this.findEndpoint(this.objectReference, p1, this.objectReference.n1);
+			p2 = this.findEndpoint(this.objectReference, p2, this.objectReference.n2);
+			// If a matching point is found we compare the angle of the
+			// neighbor wall and if it is equal or 180 degrees off
+			// then we repeate for the end of that line
+			line = new LineSegment(p1, p2);
+			this.cachedLine = line;
+
+			// Calculate Angle (Easy its just the wall's angle)
+			this.cachedAngle = this.objectReference.angle();
+
+			// Calculate Center (Easy its just the lines midpoint)
+			this.cachedCenter = line.midpoint();
+
+		};
+
+		WallMeasurement.prototype.getLine = function(){
+
+			return this.cachedLine;
+
+		};
+
+		WallMeasurement.prototype.getCenter = function(){
+
+			return this.cachedCenter;
+
+		};
+
+		WallMeasurement.prototype.getAngle = function(){
+
+			return this.cachedAngle;
+
+		};
+
+		WallMeasurement.prototype.findEndpoint = function(startingWall, startingPoint, startingNeighborList){
+
+			var i, wall, side, nextPoint, nextNeighborList, angle, angleDifference;
+
+			side = -1;
+
+			nextPoint = null;
+			nextNeighborList = null;
+
+			angle = startingWall.angle();
+
+			for(i = 0; i < startingNeighborList.length; i++){
+				
+				wall = startingNeighborList[i];
+
+				if(wall.dp1.equals(startingPoint)){
+					side = 1;
+					nextPoint = wall.dp2;
+					nextNeighborList = wall.n2;
+				} else if(wall.dp2.equals(startingPoint)){
+					side = 1;
+					nextPoint = wall.dp1;
+					nextNeighborList = wall.n1;
+				} else if(wall.dp3.equals(startingPoint)){
+					side = 2;
+					nextPoint = wall.dp4;
+					nextNeighborList = wall.n2;
+				} else if(wall.dp4.equals(startingPoint)){
+					side = 2;
+					nextPoint = wall.dp3;
+					nextNeighborList = wall.n1;
+				}
+
+				if(nextPoint !== null){
+
+					angleDifference = UMath.subtractRadians(angle, wall.angle());
+
+					if(angleDifference === 0 || angleDifference === Math.PI || angleDifference === -Math.PI){
+
+						this.wallList.push(wall);
+
+						if(side === 1){
+							wall.measureSide1 = this;
+						} else if(side === 2){
+							wall.measureSide2 = this;
+						}
+
+						// If we found a continuing wall
+						// recursivly call this function
+						return this.findEndpoint(wall, nextPoint, nextNeighborList);
+					}
+
+					break;
+				}
+			}
+
+			return startingPoint;
+
+		};
+
+		Class.register(WallMeasurement);
+
+		return WallMeasurement;
+
+	}
+);

--- a/source/lib/scripts/CabinetEditor/Schematic/Other/ObjMeasurement.js
+++ /dev/null
@@ -1,154 +1,1 @@
-define(
-	[
-	 	'CabinetEditor/Schematic/Other/Measurement',
 
-	 	'Geometry/Point2D',
-
-	 	'Util/Class'
-	],
-	function(
-		Measurement,
-
-		Point,
-
-		Class
-	){
-
-		var ObjMeasurement = function(id, x, y, visible, side){
-
-			Measurement.call(this, id, x, y, visible);
-
-			this.objectSide = side; // Cardinal Side: N, S, E, W, NE, NW, SE, SW
-
-		};
-
-		Class.extend(Measurement, ObjMeasurement);
-
-		ObjMeasurement.prototype.data = function(){
-
-			var data;
-
-			data = Measurement.prototype.data.call(this);
-			data.objectSide = this.objectSide;
-
-			return data;
-
-		};
-
-		ObjMeasurement.fromData = function(data){
-
-			var obj = new ObjMeasurement(data.id, data.x, data.y, data.visible, data.objectSide);
-			obj.objectID = data.objectID;
-			return obj;
-
-		};
-
-		ObjMeasurement.prototype.className = function(){
-			return 'ObjMeasurement';
-		};
-
-		ObjMeasurement.prototype.removeReferences = function(){
-
-			var i;
-
-			for(i = 0; i < this.objectReference.measurements.length; i++){
-				if(this.objectReference.measurements[i] === this){
-					this.objectReference.measurements.splice(i, 1);
-					return;
-				}
-			}
-
-		};
-
-		ObjMeasurement.prototype.rebuildReferences = function(schematic){
-
-			Measurement.prototype.rebuildReferences.call(this, schematic);
-
-			// Give objects references to the measurments
-			this.objectReference.measurements.push(this);
-
-		};
-
-		ObjMeasurement.prototype.getLine = function(){
-
-			var line;
-
-			if(this.objectReference !== null){
-
-				line = this.objectReference.getLine(this.objectSide);
-
-				if(line !== undefined){
-
-					return line;
-
-				} else {
-					throw "Cardinal side " + this.objectSide + " does not exist for object with ID " + this.objectID;
-				}
-
-			}
-
-			throw "Object Reference is null can't generate measurment ID " + this.id + " points";
-
-		};
-
-		ObjMeasurement.prototype.getCenter = function(){
-
-			return new Point(this.objectReference.x, this.objectReference.y);
-
-		};
-
-		ObjMeasurement.prototype.getAngle = function(){
-
-			return this.objectReference.getAngle();
-
-		};
-
-		ObjMeasurement.createMeasurmentContextMenuOptions = function(object, measure, editor, options, name, x, y, side){
-
-			if(measure !== null){
-				if(measure.visible){
-					options.push(
-						{
-							text: 'Hide ' + name + ' Measurement',
-							callback: function(){
-								measure.visible = false;
-								editor.animate();
-								editor.autoSave();
-							}
-						}
-					);
-				} else {
-					options.push(
-						{
-							text: 'Show ' + name + ' Measurement',
-							callback: function(){
-								measure.visible = true;
-								editor.animate();
-								editor.autoSave();
-							}
-						}
-					);
-				}
-			} else {
-				options.push(
-					{
-				 		text: 'Show ' + name + ' Measurement',
-				 		callback: function(){
-				 			var measurement = new ObjMeasurement(editor.schematic.newID(), x, y, true, side);
-				 			measurement.objectID = object.id;
-				 			measurement.rebuildReferences(editor.schematic);
-				 			editor.addObject(measurement);
-				 			editor.animate();
-				 		}
-				 	}
-				);
-			}
-
-		};
-
-		Class.register(ObjMeasurement);
-
-		return ObjMeasurement;
-
-	}
-);

--- a/source/lib/scripts/CabinetEditor/Schematic/Other/P2PMeasurement.js
+++ /dev/null
@@ -1,133 +1,1 @@
-define(
-	[
-	 	'CabinetEditor/Schematic/SchematicObject',
-	 	'CabinetEditor/Defines/Layer',
-	 	'CabinetEditor/Helper',
-	 	'CabinetEditor/Config',
 
-	 	'Geometry/LineSegment2D',
-	 	'Geometry/Point2D',
-
-	 	'Util/UI',
-	 	'Util/Class'
-	],
-	function(
-		SchematicObject,
-		Layer,
-		Helper,
-		Config,
-
-		LineSegment,
-		Point,
-
-		UI,
-		Class
-	){
-
-		var P2PMeasurement = function(id, pt1, pt2, textPoint){
-
-			SchematicObject.call(this, id, Layer.MEASURE);
-			this.pt1 = pt1;
-			this.pt2 = pt2;
-			this.textPoint = textPoint;
-
-		};
-
-		Class.extend(SchematicObject, P2PMeasurement);
-
-		P2PMeasurement.prototype.data = function(){
-
-			var data;
-
-			data = SchematicObject.prototype.data.call(this);
-			data.layer = undefined;
-			data.pt1 = this.pt1.data();
-			data.pt2 = this.pt2.data();
-			data.textPoint = this.textPoint.data();
-
-			return data;
-
-		};
-
-		P2PMeasurement.fromData = function(data){
-
-			return new P2PMeasurement(data.id, Point.fromData(data.pt1), Point.fromData(data.pt2), Point.fromData(data.textPoint));
-
-		};
-
-		P2PMeasurement.prototype.className = function(){
-			return 'P2PMeasurement';
-		};
-
-		P2PMeasurement.prototype.has3D = function(){
-			return false;
-		};
-
-		P2PMeasurement.prototype.hasFrontView = function(){
-			return false;
-		};
-
-		P2PMeasurement.prototype.collides = function(){
-			return false;
-		};
-
-		P2PMeasurement.prototype.getContextMenu = function(windowPoint, schematicPoint, editor){
-
-			var t = this;
-
-			if(schematicPoint.distanceToPoint(this.textPoint) < 4){
-
-				return UI.contextMenu(
-					windowPoint.x,
-					windowPoint.y,
-					[
-					 	{
-					 		text: 'Delete Measurment',
-					 		callback: function(){
-					 			editor.schematic.removeByID(t.getID(), editor);
-					 			editor.animate();
-					 			editor.autoSave();
-					 		}
-					 	}
-					]
-				);
-			}
-
-			return null;
-
-		};
-
-		P2PMeasurement.prototype.renderTopView = function(ctx){
-
-			var length, lengthText, line, lp, rp;
-
-			line = new LineSegment(this.pt1, this.pt2);
-			length = Helper.nearestMultiple(line.length(), Config.minimumUnit);
-			lengthText = length.toString() + ' "';
-			ctx.font = "4px Arial";
-			length = ctx.measureText(lengthText).width;
-
-			lp = line.midpointFromCenter(length / 2);
-			rp = line.midpointFromCenter(- length / 2);
-
-			ctx.strokeStyle = '#000000';
-			ctx.lineWidth /= 2;
-			ctx.beginPath();
-			ctx.moveTo(this.pt1.x, this.pt1.y);
-			ctx.lineTo(lp.x, lp.y);
-			ctx.moveTo(rp.x, rp.y);
-			ctx.lineTo(this.pt2.x, this.pt2.y);
-			ctx.stroke();
-			ctx.lineWidth *= 2;
-
-			ctx.fillStyle = ctx.strokeStyle;
-			ctx.fillText(lengthText, this.textPoint.x - length/2, this.textPoint.y + 2);
-
-		};
-
-		Class.register(P2PMeasurement);
-
-		return P2PMeasurement;
-
-	}
-);

--- a/source/lib/scripts/CabinetEditor/Schematic/Other/Wall.js
+++ b/source/lib/scripts/CabinetEditor/Schematic/Other/Wall.js
@@ -11,7 +11,7 @@
 	 	'Geometry/LineSegment2D',
 
 	 	'CabinetEditor/Schematic/SchematicObject',
-	 	'CabinetEditor/Schematic/Other/WallMeasurement',
+	 	'CabinetEditor/Schematic/Other/Measurements/WallMeasurement',
 
 	 	'CabinetEditor/Defines/Layer',
 	 	'CabinetEditor/3D/Texture/Texture',

--- a/source/lib/scripts/CabinetEditor/Schematic/Other/WallMeasurement.js
+++ /dev/null
@@ -1,192 +1,1 @@
-define(
-	[
-	 	'CabinetEditor/Schematic/Other/Measurement',
 
-	 	'Geometry/LineSegment2D',
-
-	 	'Util/UMath',
-	 	'Util/Class'
-	],
-	function(
-		Measurement,
-
-		LineSegment,
-
-		UMath,
-		Class
-	){
-
-		var WallMeasurement = function(id, x, y, visible, wallSide){
-
-			Measurement.call(this, id, x, y, visible);
-
-			this.wallSide = wallSide; // A int indicating if this measurment is for side 1: dp1-3 or 2: dp2-4
-
-			this.cachedLine = null;
-			this.cachedCenter = null;
-			this.cachedAngle = Number.NaN;
-
-			this.wallList = [];
-
-		};
-
-		Class.extend(Measurement, WallMeasurement);
-
-		WallMeasurement.prototype.data = function(){
-
-			var data;
-
-			data = Measurement.prototype.data.call(this);
-			data.wallSide = this.wallSide;
-
-			return data;
-
-		};
-
-		WallMeasurement.fromData = function(data){
-
-			var obj = new WallMeasurement(data.id, data.x, data.y, data.visible, data.wallSide);
-			obj.objectID = data.objectID;
-			return obj;
-
-		};
-
-		WallMeasurement.prototype.className = function(){
-			return 'WallMeasurement';
-		};
-
-		WallMeasurement.prototype.removeReferences = function(){
-
-			var i;
-
-			for(i = 0; i < this.wallList.length; i++){
-				if(this.wallList[i].measureSide1 == this){
-					this.wallList[i].measureSide1 = null;
-				}
-				else if(this.wallList[i].measureSide2 == this){
-					this.wallList[i].measureSide2 = null;
-				}
-			}
-
-		};
-
-		WallMeasurement.prototype.recalculateCachedProperties = function(){
-
-			var line, p1 =  null, p2 = null;
-
-			// Calculate Line
-			// first we figure out what points we are using based on side
-			if(this.wallSide === 1){
-				this.objectReference.measureSide1 = this;
-				p1 = this.objectReference.dp1;
-				p2 = this.objectReference.dp2;
-			} else if(this.wallSide === 2) {
-				this.objectReference.measureSide2 = this;
-				p1 = this.objectReference.dp3;
-				p2 = this.objectReference.dp4;
-			}
-
-			this.wallList = [];
-			this.wallList.push(this.objectReference);
-			// Now we look at the neighbor lists for each wall and see
-			// if any of there points match
-			p1 = this.findEndpoint(this.objectReference, p1, this.objectReference.n1);
-			p2 = this.findEndpoint(this.objectReference, p2, this.objectReference.n2);
-			// If a matching point is found we compare the angle of the
-			// neighbor wall and if it is equal or 180 degrees off
-			// then we repeate for the end of that line
-			line = new LineSegment(p1, p2);
-			this.cachedLine = line;
-
-			// Calculate Angle (Easy its just the wall's angle)
-			this.cachedAngle = this.objectReference.angle();
-
-			// Calculate Center (Easy its just the lines midpoint)
-			this.cachedCenter = line.midpoint();
-
-		};
-
-		WallMeasurement.prototype.getLine = function(){
-
-			return this.cachedLine;
-
-		};
-
-		WallMeasurement.prototype.getCenter = function(){
-
-			return this.cachedCenter;
-
-		};
-
-		WallMeasurement.prototype.getAngle = function(){
-
-			return this.cachedAngle;
-
-		};
-
-		WallMeasurement.prototype.findEndpoint = function(startingWall, startingPoint, startingNeighborList){
-
-			var i, wall, side, nextPoint, nextNeighborList, angle, angleDifference;
-
-			side = -1;
-
-			nextPoint = null;
-			nextNeighborList = null;
-
-			angle = startingWall.angle();
-
-			for(i = 0; i < startingNeighborList.length; i++){
-				
-				wall = startingNeighborList[i];
-
-				if(wall.dp1.equals(startingPoint)){
-					side = 1;
-					nextPoint = wall.dp2;
-					nextNeighborList = wall.n2;
-				} else if(wall.dp2.equals(startingPoint)){
-					side = 1;
-					nextPoint = wall.dp1;
-					nextNeighborList = wall.n1;
-				} else if(wall.dp3.equals(startingPoint)){
-					side = 2;
-					nextPoint = wall.dp4;
-					nextNeighborList = wall.n2;
-				} else if(wall.dp4.equals(startingPoint)){
-					side = 2;
-					nextPoint = wall.dp3;
-					nextNeighborList = wall.n1;
-				}
-
-				if(nextPoint !== null){
-
-					angleDifference = UMath.subtractRadians(angle, wall.angle());
-
-					if(angleDifference === 0 || angleDifference === Math.PI || angleDifference === -Math.PI){
-
-						this.wallList.push(wall);
-
-						if(side === 1){
-							wall.measureSide1 = this;
-						} else if(side === 2){
-							wall.measureSide2 = this;
-						}
-
-						// If we found a continuing wall
-						// recursivly call this function
-						return this.findEndpoint(wall, nextPoint, nextNeighborList);
-					}
-
-					break;
-				}
-			}
-
-			return startingPoint;
-
-		};
-
-		Class.register(WallMeasurement);
-
-		return WallMeasurement;
-
-	}
-);

--- a/source/lib/scripts/CabinetEditor/Schematic/PositionAngleObject.js
+++ b/source/lib/scripts/CabinetEditor/Schematic/PositionAngleObject.js
@@ -2,7 +2,7 @@
 	[
 	 	'CabinetEditor/Schematic/SchematicObject',
 
-	 	'CabinetEditor/Schematic/Other/ObjMeasurement',
+	 	'CabinetEditor/Schematic/Other/Measurements/ObjMeasurement',
 
 	 	'CabinetEditor/Picks/Item/Top/DragPick',
 	 	'CabinetEditor/Picks/Item/Top/ScalePick',
@@ -148,6 +148,14 @@
 					options
 				);
 			}
+
+			return null;
+
+		};
+
+		PositionAngleObject.prototype.getContextMenuFrontView = function(){
+
+			// show/hide front view measurement
 
 			return null;
 
@@ -545,6 +553,17 @@
 
 		};
 
+		PositionAngleObject.prototype.isMouseOverFrontView = function(x, y){
+			if(	   x >= this.fv_x
+				&& x <= this.fv_x+this.getFrameWidth()
+				&& y >= this.z
+				&& y <= this.z+this.d)
+					return true;
+
+			return false;
+
+		};
+
 		PositionAngleObject.prototype.setXY = function(point){
 			this.x = point.x;
 			this.y = point.y;

--- a/source/lib/scripts/CabinetEditor/Schematic/Schematic.js
+++ b/source/lib/scripts/CabinetEditor/Schematic/Schematic.js
@@ -9,6 +9,7 @@
 	 	'CabinetEditor/Schematic/Cabinet/Cabinet',
 	 	'CabinetEditor/Schematic/Cabinet/CornerCabinet',
 	 	'CabinetEditor/Schematic/Cabinet/LCabinet',
+	 	'CabinetEditor/Schematic/Cabinet/AccessoryList',
 
 	 	'CabinetEditor/Schematic/Other/Appliance',
 	 	'CabinetEditor/Schematic/Other/Hood',
@@ -22,8 +23,8 @@
 	 	'CabinetEditor/Schematic/Attachments/Cooktop',
 	 	'CabinetEditor/Schematic/Attachments/Sink',
 
-        'CabinetEditor/Schematic/Other/ObjMeasurement',
-        'CabinetEditor/Schematic/Other/WallMeasurement',
+        'CabinetEditor/Schematic/Other/Measurements/ObjMeasurement',
+        'CabinetEditor/Schematic/Other/Measurements/WallMeasurement',
 
 	 	'CabinetEditor/Defines/Layer',
 
@@ -40,6 +41,7 @@
 		Cabinet,
 		Corner_Cabinet,
 		L_Cabinet,
+		AccessoryList,
 
 		Appliance,
 		Hood,
@@ -195,6 +197,12 @@
 
 	};
 
+	Schematic.prototype.addObject = function(obj){
+
+		this.objects.push(obj);
+
+	};
+	
 	Schematic.prototype.newID = function(){
 
 		return this.pool.get();

--- a/source/lib/scripts/CabinetEditor/Schematic/SchematicObject.js
+++ b/source/lib/scripts/CabinetEditor/Schematic/SchematicObject.js
@@ -325,16 +325,12 @@
 		return null;
 	};
 
+	SchematicObject.prototype.getContextMenuFrontView = function(){
+		return null;
+	};
+
 	SchematicObject.prototype.isMouseOverFrontView = function(x, y){
-
-		if(	   x >= this.fv_x
-			&& x <= this.fv_x+this.getFrameWidth()
-			&& y >= this.z
-			&& y <= this.z+this.d)
-				return true;
-
 		return false;
-
 	};
 
 	/**

--- a/source/lib/scripts/CabinetEditor/Tools/Item/EditCabinetTool.js
+++ b/source/lib/scripts/CabinetEditor/Tools/Item/EditCabinetTool.js
@@ -147,6 +147,34 @@
 
 	};
 
+	EditCabinetTool.prototype.contextMenuFrontView = function(e){
+
+		var windowPoint, pt, correct_x, correct_y, menu;
+
+		windowPoint = new Point(e.pageX, e.pageY);
+		pt = UI.correctOffset(this.editor.fv_canvas, new Point(e.pageX, e.pageY)),
+		correct_x = pt.x/this.editor.scale_fv-this.editor.schematic.offset_x_fv,
+		correct_y = pt.y/-this.editor.scale_fv+(this.editor.schematic.ceiling_height+10.0),	// TODO: +10 shift global variable
+
+		menu = null;
+
+		it = editor.schematic.objectIterator();
+		while(it.hasNext()){
+			obj = it.next();
+
+			if(obj.isMouseOverFrontView(correct_x, correct_y)){
+
+				menu = obj.getContextMenuFrontView();
+				if(menu !== null)
+					menu.open();
+				return;
+
+			}
+
+		}
+
+	};
+
 	EditCabinetTool.prototype.mouseDownFrontView = function(e){
 
 		if(e.which == 1){

--- a/source/lib/scripts/CabinetEditor/Tools/Measure/MeasureTool.js
+++ b/source/lib/scripts/CabinetEditor/Tools/Measure/MeasureTool.js
@@ -8,7 +8,7 @@
 	[
 	 	'CabinetEditor/Tools/Tool',
 	 	'CabinetEditor/Schematic/SchematicObject',
-	 	'CabinetEditor/Schematic/Other/P2PMeasurement',
+	 	'CabinetEditor/Schematic/Other/Measurements/P2PMeasurement',
 	 	'CabinetEditor/Helper',
 
 	 	'Geometry/LineSegment2D',

--- a/source/lib/scripts/CabinetEditor/Tools/Tool.js
+++ b/source/lib/scripts/CabinetEditor/Tools/Tool.js
@@ -54,49 +54,44 @@
 
 	Tool.prototype.renderTopViewHUD = function(ctx){};
 
+	Tool.prototype.contextMenuFrontView = function(e){};
 	/**
 	 * Mouse down event on Front View Canvas
 	 * @function
 	 * @param {mouse_event} e Contains the location of the mouse
 	 */
-	Tool.prototype.mouseDownFrontView = function(e){
-	};
+	Tool.prototype.mouseDownFrontView = function(e){};
 	/**
 	 * Mouse move event on Front View Canvas
 	 * @function
 	 * @param {mouse_event} e Contains the location of the mouse
 	 */
-	Tool.prototype.mouseMoveFrontView = function(e){
-	};
+	Tool.prototype.mouseMoveFrontView = function(e){};
 	/**
 	 * Render tool info on Front View
 	 * @function
 	 * @param {context} ctx Rendering context for Front view
 	 */
-	Tool.prototype.renderFrontView = function(ctx){
-	};
+	Tool.prototype.renderFrontView = function(ctx){};
 
 	/**
 	 * Mouse down event on Detail View Canvas
 	 * @function
 	 * @param {mouse_event} e Contains the location of the mouse
 	 */
-	Tool.prototype.mouseDownDetailView = function(e){
-	};
+	Tool.prototype.mouseDownDetailView = function(e){};
 	/**
 	 * Mouse move event on Detail View Canvas
 	 * @function
 	 * @param {mouse_event} e Contains the location of the mouse
 	 */
-	Tool.prototype.mouseMoveDetailView = function(e){
-	};
+	Tool.prototype.mouseMoveDetailView = function(e){};
 	/**
 	 * Render tool on the Detail View Canvas
 	 * @function
 	 * @param {context} ctx Rendering context for Detail view
 	 */
-	Tool.prototype.renderDetailView = function(ctx){
-	};
+	Tool.prototype.renderDetailView = function(ctx){};
 
 	Tool.prototype.handleFrontViewDrag = function(pt){
 

--- a/source/lib/scripts/GUI/Toolbar.js
+++ b/source/lib/scripts/GUI/Toolbar.js
@@ -17,9 +17,7 @@
 
 	 	'Login/Forms',
 
-	 	'Dialogs/StyleSelector',
-	 	'Dialogs/FinishSelector',
-	 	'require/text!Dialogs/FinishSelector.html',
+	 	'Dialogs/ItemProperties',
 	 	'Dialogs/ProjectSettings',
 	 	'require/text!Dialogs/ProjectSettings.html',
 	 	'Dialogs/Export',
@@ -43,9 +41,7 @@
 
 	    forms,
 
-	    style_selector,
-	    finish_selector,
-	    finish_selector_html,
+	    ItemProperties,
 		project_settings,
 		project_settings_html,
 		Export,
@@ -253,38 +249,11 @@
 
 		wall_tool.onclick();
 
-		var change_finish = function(e){
-
-			var change_finish_dialog = Util.ui.dialog(
-					finish_selector_html,
-					{
-						title:		'Finish Selector',
-						height:		'auto',
-						width:		600,
-						modal:		false,
-						position:	['top', 100]
-					}
-				);
-
-			finish_selector.initalize(change_finish_dialog);
-
-		};
-
 		Util.dom.id('item_properties').onclick = function(){
 
-			var item_prop_dialog = Util.ui.dialog(
-					'<div><div class="ce-item-properties-group"><label for="finish">Finish</label><input name="finish" type="text" value="Project Default" readonly /><button id="change-finish-button" class="pure-button">Change</button></div><div class="ce-item-properties-group"><label for="style">Style</label><input name="style" type="text" value="Project Default" readonly /><button id="change-style-button" class="pure-button">Change</button></div><button class="pure-button pure-button-primary ce-item-settings-button">Save</button></div>',
-					{
-						title:		'Item Settings',
-						height:		'auto',
-						width:		400,
-						modal:		true,
-						position:	['top', 100]
-					}
-				);
-
-			Util.dom.id('change-finish-button').onclick = change_finish;
-			Util.dom.id('change-style-button').onclick = style_selector.activate;
+			var cab = editor.getSelected();
+			if(cab !== null)
+				ItemProperties.activate(editor, cab);
 
 		};
 		

--- a/source/lib/scripts/Util/UI.js
+++ b/source/lib/scripts/Util/UI.js
@@ -67,24 +67,27 @@
 		contextMenu.div.style.top = y + 'px';
 		contextMenu.div.style.left = x + 'px';
 
+		contextMenu.add = function(option){
+
+			optionDiv = document.createElement('div');
+
+			optionDiv.innerHTML = option.text;
+
+			optionDiv.onclick = function(e){
+
+				if(option.callback !== undefined){
+					option.callback();
+				}
+				contextMenu.close();
+
+			};
+			contextMenu.div.appendChild(optionDiv);
+
+		}
+
 		for(var i = 0; i < options.length; i++){
 
-			optionDiv = document.createElement('div');
-
-			optionDiv.innerHTML = options[i].text;
-
-			(function(optionDiv, op, i){
-				optionDiv.onclick = function(e){
-
-					if(op.callback !== undefined){
-						op.callback();
-					}
-					contextMenu.close();
-
-				};
-			})(optionDiv, options[i], i);
-
-			contextMenu.div.appendChild(optionDiv);
+			contextMenu.add(options[i]);
 
 		}
 

--- a/source/lib/styles/design_center.css
+++ b/source/lib/styles/design_center.css
@@ -268,6 +268,44 @@
 
 	width: 8em;
 	margin: .5em;
+
+}
+
+.ce-item-properties-button {
+
+	height: 50px;
+	padding: 5px;
+	text-align: center;
+
+}
+
+.ce-item-properties-button button {
+
+	margin: 0 auto;
+
+}
+
+.ce-molding-properties-group label {
+
+	display: inline-block;
+	width: 5em;	
+
+	text-align: left;
+	margin: 0.5em;
+
+}
+
+.ce-molding-properties-group-offset label {
+
+	width: 4em;	
+
+	text-align: right;
+
+}
+
+.ce-molding-properties-group-offset {
+
+	padding-left: 2em;
 
 }