Converting JavaScript objects to Java
 Converting between native JavaScript objects and GWT Java objects is something the Smart GWT
 framework needs to do very frequently (see also 
JavaToJavaScriptConversion).
 It is less common for application code to do such conversions, but the need can arise.  The 
 
JSOHelper class contains many utility methods for 
 sophisticated conversion from native JS objects to GWT Java objects.  This article describes 
 the common rules used when such conversions are run.
 - Conversion is recursive; nested JavaScript objects and arrays will have their members converted as well
- Circular references (where an object is referred to by its own children, grandchildren, etc) are not
     tolerated.  If you try to convert a JS object that contains circular references, your program will crash
- This general prohibition of circular references includes native browser objects such as HTML elements 
     retrieved by the getElementById()API, amd common objects likewindowand the JSNI$wndobject.  These DOM elements contain references to both parent and children, which are 
     inherently circular
- null values, including undefined, are returned as null
- JavaScript strings are returned as Java Strings
- JavaScript numbers are returned as
   - Java Doubles if the number contains a decimal point, else
- Java Integers if the number is in the range of an Integer (between -2147483648 and 2147483647 inclusive), else
- Java Longs
 
- JavaScript dates are returned as java.util.Dates
- JavaScript arrays are converted by converting each array element according to the other rules described here, and then
     converting the results into either a Java Object[]or ajava.util.ArrayList, depending on the 
     value of the "listAsArray" parameter (an array if that param is true, anArrayListif it is false)
- JavaScript objects are converted as follows:
   - If the GWT condition "object instanceof JavaScriptObject" is true, the object itself is returned
- If Smart GWT detects that the object has a GWT Java wrapper object created by Smart GWT, that GWT wrapper object is returned
- If the object has a "_constructor" property set to "DateRange" convert to DateRange
- If the object has a "_constructor" property set to "RelativeDate" convert to RelativeDate
- If the object is an instance of the SmartClient Canvasclass, return the result of callingCanvas.getById(java.lang.String).  This will result in a Smart GWT Java object
       equivalent to the SmartClient Canvas - for example a SmartClientListGridwill be returned as aListGrid
- If the object has a "name" property and a "form" property such that isc.isA.DynamicForm(object.form)is true:
     - Create a DynamicForm object by passing the object's "form" property as a parameter to 
         DynamicForm.getOrCreateRef(JavaScriptObject)
- Return the result of calling getField() on that form, passing in the object's "name" property
- This process means that SmartClient FormItems are returned as equivalent Smart GWT objects (subclasses of 
         FormItem)
 
- If the SmartClient call "isc.isAn.Instance(object)" returns true and the object has agetClassName()method, returns the result of passing the object as a parameter tocreateInstance()
- If the SmartClient call "isc.isA.Class(object)" returns true and the object has agetClassName()method, returns the equivalent Java class if it exists; otherwise returns null,
       callinggetSmartGWTClass()
- If none of the above conversions apply, the JavaScript object will be converted to a Java Mapby running 
       each property of the JavaScript object through the conversion process.  Note, if SmartClient detects that the object 
       is the JS form of aTreeNode(which is done by checking for the presence of an 
       internal-only property), the SmartClient methodisc.Tree.getCleanNodeData()is called on it before conversion 
       starts; this obtains a clean version of the node data, free of any additional properties scribbled on by the Tree