Index: /issm/trunk-jpl/src/m/classes/model.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/model.js	(revision 22445)
+++ /issm/trunk-jpl/src/m/classes/model.js	(revision 22446)
@@ -554,4 +554,57 @@
 			return md;
 		} /*}}}*/
+		this.deepCopy = function(md) { //{{{
+			/*
+			 *DEEPCOPY - returns a deep copy of the model.
+			 *
+			 *   This routine creates a new model with new objects 
+			 *   for each corresponding object in the original model,
+			 *   so that changes in one do not affect the other.
+			 *
+			 *   Usage:
+			 *	 md1=deepCopy(md)
+			 *
+			 */
+			var md1;
+
+			switch (typeof obj) {
+				case "object":
+					if (obj === null) {
+						// null => null
+						md1 = null;
+					} else {
+						switch (toString.call(obj)) {
+							case "[object Array]":
+								// It's an array, create a new array with
+								// deep copies of the entries
+								md1 = obj.map(deepCopy);
+								break;
+							case "[object Date]":
+								// Clone the date
+								md1 = new Date(obj);
+								break;
+							case "[object RegExp]":
+								// Clone the RegExp
+								md1 = new RegExp(obj);
+								break;
+							// ...probably a few others
+							default:
+								// Some other kind of object, deep-copy its
+								// properties into a new object
+								md1 = Object.keys(obj).reduce(function(prev, key) {
+									prev[key] = deepCopy(obj[key]);
+									return prev;
+								}, {});
+								break;
+						}
+					}
+					break;
+				default:
+					// It's a primitive, copy via assignment
+					md1 = obj;
+					break;
+			}
+			return md1;
+		} /*}}}*/
 	//properties
 	// {{{
