move stuff out of test and into xosHelper.js for better code reuse
diff --git a/planetstack/core/xoslib/dashboards/test.html b/planetstack/core/xoslib/dashboards/test.html
index 1e41fe9..ca60567 100644
--- a/planetstack/core/xoslib/dashboards/test.html
+++ b/planetstack/core/xoslib/dashboards/test.html
@@ -8,6 +8,7 @@
 <link rel="stylesheet" type="text/css" href="{% static 'css/test.css' %}" media="all" >
 
 <script src="{{ STATIC_URL }}/js/xoslib/xos-backbone.js"></script>
+<script src="{{ STATIC_URL }}/js/xoslib/xosHelper.js"></script>
 <script src="{{ STATIC_URL }}/js/test.js"></script>
 
 <p>This shows all of the things you can see using xosLib</p>
@@ -58,22 +59,4 @@
 </div>
 </div>
 
-<script type="text/template" id="test-error-template">
-  <button id="close-error-box">Close Error Message</button>
-  <h3>An error has occurred.</h3>
-  <table class="test-error-table">
-  <tr><td>Code:</td><td><%= status %></td></tr>
-  <tr><td>Message:</td><td><%= statusText %></td></tr>
-  </table>
-</script>
-
-<script type="text/template" id="test-success-template">
-  <button id="close-success-box">Close Success Message</button>
-  <h3>Success!</h3>
-  <table class="test-success-table">
-  <tr><td>Code:</td><td><%= status %></td></tr>
-  <tr><td>Message:</td><td><%= statusText %></td></tr>
-  </table>
-</script>
-
 {% include 'xosAdmin.html' %}
diff --git a/planetstack/core/xoslib/static/js/test.js b/planetstack/core/xoslib/static/js/test.js
index 9de80b7..c0f4146 100644
--- a/planetstack/core/xoslib/static/js/test.js
+++ b/planetstack/core/xoslib/static/js/test.js
@@ -1,4 +1,4 @@
-TestApp = new Marionette.Application();
+TestApp = new XOSApplication();
 
 TestApp.addRegions({
     deploymentList: "#deploymentList",
@@ -18,59 +18,6 @@
     linkedObjs4: "#linkedObjs4"
 });
 
-TestApp.hideError = function(result) {
-    $("#errorBox").hide();
-    $("#successBox").hide();
-};
-
-TestApp.showSuccess = function(result) {
-     $("#successBox").show();
-     $("#successBox").html(_.template($("#test-success-template").html())(result));
-     $('#close-success-box').unbind().bind('click', function() {
-         $('#successBox').hide();
-     });
-};
-
-TestApp.showError = function(result) {
-     $("#errorBox").show();
-     $("#errorBox").html(_.template($("#test-error-template").html())(result));
-     $('#close-error-box').unbind().bind('click', function() {
-         $('#errorBox').hide();
-     });
-};
-
-idToName = function(id, collectionName, fieldName) {
-    linkedObject = xos[collectionName].get(id);
-    if (linkedObject == undefined) {
-        return "#" + id;
-    } else {
-        return linkedObject.attributes[fieldName];
-    }
-};
-
-idToOptions = function(id, collectionName, fieldName) {
-    result=""
-    for (index in xos[collectionName].models) {
-        linkedObject = xos[collectionName].models[index];
-        linkedId = linkedObject["id"];
-        linkedName = linkedObject.attributes[fieldName];
-        if (linkedId == id) {
-            selected = " selected";
-        } else {
-            selected = "";
-        }
-        result = result + '<option value="' + linkedId + '"' + selected + '>' + linkedName + '</option>';
-    }
-    return result;
-};
-
-idToSelect = function(variable, id, collectionName, fieldName) {
-    result = '<select name="' + variable + '">' +
-             idToOptions(id, collectionName, fieldName) +
-             '</select>';
-    return result;
-}
-
 TestApp.on("start", function() {
      var objs = ['deployment', 'image', 'networkTemplate', 'network', 'networkSliver', 'networkDeployment', 'node', 'service', 'site', 'slice', 'sliceDeployment', 'slicePrivilege', 'sliver', 'user', 'sliceRole', 'userDeployment'];
 
diff --git a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
new file mode 100644
index 0000000..c799794
--- /dev/null
+++ b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
@@ -0,0 +1,81 @@
+XOSApplication = Marionette.Application.extend({
+    errorBoxId: "#errorBox",
+    errorCloseButtonId: "#close-error-box",
+    successBoxId: "#successBox",
+    successCloseButtonId: "#close-success-box",
+    errorTemplate: "#xos-error-template",
+    successTemplate: "#xos-success-template",
+
+    hideError: function(result) {
+        $(this.errorBoxId).hide();
+        $(this.successBoxId).hide();
+    },
+
+    showSuccess: function(result) {
+         $(this.successBoxId).show();
+         $(this.successBoxId).html(_.template($(this.successTemplate).html())(result));
+         $(this.successCloseButtonId).unbind().bind('click', function() {
+             $(this.successBoxId).hide();
+         });
+    },
+
+    showError: function(result) {
+         $(this.errorBoxId).show();
+         $(this.errorBoxId).html(_.template($(this.errorTemplate).html())(result));
+         $(this.errorCloseButtonId).unbind().bind('click', function() {
+             $(this.errorBoxId).hide();
+         });
+    },
+});
+
+/* Give an id, the name of a collection, and the name of a field for models
+   within that collection, lookup the id and return the value of the field.
+*/
+
+idToName = function(id, collectionName, fieldName) {
+    linkedObject = xos[collectionName].get(id);
+    if (linkedObject == undefined) {
+        return "#" + id;
+    } else {
+        return linkedObject.attributes[fieldName];
+    }
+};
+
+/* Constructs lists of <option> html blocks for items in a collection.
+
+   selectedId = the id of an object that should be selected, if any
+   collectionName = name of collection
+   fieldName = name of field within models of collection that will be displayed
+*/
+
+idToOptions = function(selectedId, collectionName, fieldName) {
+    result=""
+    for (index in xos[collectionName].models) {
+        linkedObject = xos[collectionName].models[index];
+        linkedId = linkedObject["id"];
+        linkedName = linkedObject.attributes[fieldName];
+        if (linkedId == selectedId) {
+            selected = " selected";
+        } else {
+            selected = "";
+        }
+        result = result + '<option value="' + linkedId + '"' + selected + '>' + linkedName + '</option>';
+    }
+    return result;
+};
+
+/* Constructs an html <select> and the <option>s to go with it.
+
+   variable = variable name to return to form
+   selectedId = the id of an object that should be selected, if any
+   collectionName = name of collection
+   fieldName = name of field within models of collection that will be displayed
+*/
+
+idToSelect = function(variable, selectedId, collectionName, fieldName) {
+    result = '<select name="' + variable + '">' +
+             idToOptions(selectedId, collectionName, fieldName) +
+             '</select>';
+    return result;
+}
+
diff --git a/planetstack/core/xoslib/templates/xosAdmin.html b/planetstack/core/xoslib/templates/xosAdmin.html
index 0ba63ec..b1c5074 100644
--- a/planetstack/core/xoslib/templates/xosAdmin.html
+++ b/planetstack/core/xoslib/templates/xosAdmin.html
@@ -1,3 +1,23 @@
+<!-- Error and Success templates -->
+
+<script type="text/template" id="test-error-template">
+  <button id="close-error-box">Close Error Message</button>
+  <h3>An error has occurred.</h3>
+  <table class="test-error-table">
+  <tr><td>Code:</td><td><%= status %></td></tr>
+  <tr><td>Message:</td><td><%= statusText %></td></tr>
+  </table>
+</script>
+
+<script type="text/template" id="test-success-template">
+  <button id="close-success-box">Close Success Message</button>
+  <h3>Success!</h3>
+  <table class="test-success-table">
+  <tr><td>Code:</td><td><%= status %></td></tr>
+  <tr><td>Message:</td><td><%= statusText %></td></tr>
+  </table>
+</script>
+
 <!-- Deployment -->
 
 <script type="text/template" id="xosAdmin-deployment-list-template">