add raw error dialog support, only add model to collection once it has been saved
diff --git a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js
index 2930014..918e4a2 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js
@@ -70,7 +70,7 @@
                 return res;

             },
 
-            validate: function(attrs, options) {
+            xosValidate: function(attrs, options) {
                 errors = {};
                 foundErrors = false;
                 _.each(this.validators, function(validatorList, fieldName) {
diff --git a/planetstack/core/xoslib/static/js/xoslib/xos-util.js b/planetstack/core/xoslib/static/js/xoslib/xos-util.js
index d03ab14..5e91a3d 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xos-util.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xos-util.js
@@ -22,7 +22,7 @@
     }
 }
 
-function validateField(validatorName, value) {
+function validateField(validatorName, value, obj) {
     if (validatorName=="notBlank") {
         if ((value==undefined) || (value=="")) {
             return "can not be blank";
@@ -41,5 +41,6 @@
             }
             break;
     }
+
     return true;
 }
diff --git a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
index 2fa9554..2eb3e42 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
@@ -68,9 +68,23 @@
     },
 
     popupErrorDialog: function(responseText) {
-        $("#xos-error-dialog").html(templateFromId("#xos-error-response")($.parseJSON(responseText)));
+        try {
+            parsed_error=$.parseJSON(responseText);
+            width=300;
+        }
+        catch(err) {
+            parsed_error=undefined;
+            width=640;    // django stacktraces like wide width
+        }
+        if (parsed_error) {
+            $("#xos-error-dialog").html(templateFromId("#xos-error-response")(json));
+        } else {
+            $("#xos-error-dialog").html(templateFromId("#xos-error-rawresponse")({responseText: responseText}))
+        }
+
         $("#xos-error-dialog").dialog({
             modal: true,
+            width: width,
             buttons: {
                 Ok: function() { $(this).dialog("close"); }
             }
@@ -222,7 +236,12 @@
                 this.app.showError(result);

             },

 

-            saveSuccess: function(model, result, xhr, infoMsgId) {

+            saveSuccess: function(model, result, xhr, infoMsgId, isNew) {

+                console.log("saveSuccess");

+                if (isNew) {

+                    this.collection.add(model);

+                    this.collection.sort();

+                }

                 result = {status: xhr.xhr.status, statusText: xhr.xhr.statusText};

                 result["what"] = "save " + model.modelName + " " + model.attributes.humanReadableName;

                 result["infoMsgId"] = infoMsgId;

@@ -274,21 +293,25 @@
                    model.save, we call it ourselves, so we can throw up our

                    validation error before creating the infoMsg in the log

                 */

-                errors =  this.model.validate(data);

+                errors =  this.model.xosValidate(data);

                 if (errors) {

                     this.onFormDataInvalid(errors);

                     return;

                 }

 

+                if (isNew) {

+                    this.model.attributes.humanReadableName = "new " + model.modelName;

+                }

+

                 var infoMsgId = this.app.showInformational( {what: "save " + model.modelName + " " + model.attributes.humanReadableName, status: "", statusText: "in progress..."} );

 

                 this.model.save(data, {error: function(model, result, xhr) { that.saveError(model,result,xhr,infoMsgId);},

-                                       success: function(model, result, xhr) { that.saveSuccess(model,result,xhr,infoMsgId);}});

-                if (isNew) {

-                    console.log(this.model);

+                                       invalid: function(model, result, xhr) { console.log("invalid!"); that.saveError(model,result,xhr,infoMsgId);},

+                                       success: function(model, result, xhr) { that.saveSuccess(model,result,xhr,infoMsgId, isNew);}});

+                /*if (isNew) {

                     this.collection.add(this.model);

                     this.collection.sort();

-                }

+                }*/

                 this.dirty = false;

             },
 
diff --git a/planetstack/core/xoslib/templates/xosAdmin.html b/planetstack/core/xoslib/templates/xosAdmin.html
index daccf88..8e0448d 100644
--- a/planetstack/core/xoslib/templates/xosAdmin.html
+++ b/planetstack/core/xoslib/templates/xosAdmin.html
@@ -16,6 +16,12 @@
       </table>
 </script>
 
+<script type="text/template" id="xos-error-rawresponse">
+  <h5>Error</h5>
+  <pre>The server returned:
+"<%= responseText %>"</pre>
+</script>
+
 <script type="text/template" id="xos-error-template">
   <button id="close-error-box">Close Error Message</button>
   <h3>An error has occurred.</h3>