set dirty if users edited, warning message if change slice while dirty
diff --git a/planetstack/core/xoslib/static/js/xosTenant.js b/planetstack/core/xoslib/static/js/xosTenant.js
index 10e70e6..286537d 100644
--- a/planetstack/core/xoslib/static/js/xosTenant.js
+++ b/planetstack/core/xoslib/static/js/xosTenant.js
@@ -102,6 +102,7 @@
     logTableId: "#logTable",
     statusMsgId: "#statusMsg",
     hideTabsByDefault: true,
+    dirty: false,
     varName: "XOSTenantApp",
 });
 
@@ -115,6 +116,7 @@
 });
 
 XOSTenantApp.setDirty = function(dirty) {
+    XOSTenantApp.dirty = dirty;
     if (dirty) {
         $("button.btn-tenant-save").addClass("btn-success");
     } else {
@@ -253,6 +255,9 @@
               var editDialog = this;
               user_ids = all_options($("#tenant-edit-users-dialog").find(".select-picker-to"));
               user_ids = user_ids.map( function(x) { return parseInt(x,10); } );
+              if (!array_same_elements(user_ids, model.usersBuffer)) {
+                  XOSTenantApp.setDirty(true);
+              }
               model.usersBuffer = user_ids;
               $(editDialog).dialog("close");
             },
@@ -270,6 +275,15 @@
 };

 

 XOSTenantApp.viewSlice = function(model) {

+    if (XOSTenantApp.dirty) {

+        if (!confirm("The current sliver has unsaved data -- view new sliver anyway ?")) {

+            $("#tenantSliceSelector select").val(XOSTenantApp.currentSlice.id);

+            return;

+        }

+    }

+

+    XOSTenantApp.setDirty(false);

+

     if (!model && xos.slicesPlus.models.length > 0) {

         model = xos.slicesPlus.models[0];

     }

@@ -303,6 +317,8 @@
 

         XOSTenantApp.tenantButtons.show( new XOSTenantButtonView( { app: XOSTenantApp,

                                                                     linkedView: tenantSummary } ) );

+

+        XOSTenantApp.currentSlice = model;

     } else {

         XOSTenantApp.tenantSliceSelector.show(new HTMLView({html: ""}));

         XOSTenantApp.tenantSummary.show(new HTMLView({html: "You have no slices"}));

diff --git a/planetstack/core/xoslib/static/js/xoslib/xos-util.js b/planetstack/core/xoslib/static/js/xoslib/xos-util.js
index 59fb06e..1c42e26 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xos-util.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xos-util.js
@@ -105,6 +105,12 @@
     return result;
 }
 
+function array_same_elements(arr1, arr2)
+{
+    // return true if arrays have same elements, even if order is different
+    return ($(arr1).not(arr2).length == 0 && $(arr2).not(arr1).length == 0);
+}
+
 function array_pair_lookup(x, names, values)
 {
     for (index in values) {