[OLINGO-324] add support for geometry and geography types
diff --git a/datajs/src/lib/odata/json.js b/datajs/src/lib/odata/json.js
index aff4d76..26d7a7f 100644
--- a/datajs/src/lib/odata/json.js
+++ b/datajs/src/lib/odata/json.js
@@ -236,7 +236,14 @@
                         }

                     } else if (utils.isObject(data[key])) {

                         if (data[key] !== null) {

-                            readPayloadFull(data[key], model, recognizeDates);

+                            //don't step into geo.. objects

+                            var isGeo = false;

+                            var type = data[key+'@odata.type'];

+                            if (type && (isGeographyEdmType(type) || isGeometryEdmType(type))) {

+                                // is gemometry type

+                            } else {

+                                readPayloadFull(data[key], model, recognizeDates);

+                            }

                         }

                     } else {

                         var type = data[key + '@odata.type'];

@@ -439,6 +446,14 @@
                 }

             }

 

+

+            if (jsonIsPrimitiveType(fragment)) {

+                ret.typeName = fragment;

+                ret.type = null;

+                ret.detectedPayloadKind = PAYLOADTYPE_VALUE;

+                continue;

+            }

+

             var container = lookupDefaultEntityContainer(model);

 

             //check for entity

@@ -463,12 +478,7 @@
                 continue;

             }

 

-            if (jsonIsPrimitiveType(fragment)) {

-                ret.typeName = fragment;

-                ret.type = null;

-                ret.detectedPayloadKind = PAYLOADTYPE_VALUE;

-                continue;

-            }

+            

 

             //TODO throw ERROR

         } else {

@@ -586,6 +596,8 @@
     var payloadInfo = createPayloadInfo(data, model);

 

     switch (payloadInfo.detectedPayloadKind) {

+        case PAYLOADTYPE_VALUE:

+            return readPayloadMinimalProperty(data, model, payloadInfo, baseURI, recognizeDates);

         case PAYLOADTYPE_FEED:

             return readPayloadMinimalFeed(data, model, payloadInfo, baseURI, recognizeDates);

         case PAYLOADTYPE_ENTRY:

diff --git a/datajs/src/lib/odata/utils.js b/datajs/src/lib/odata/utils.js
index df88e2e..f92e9f7 100644
--- a/datajs/src/lib/odata/utils.js
+++ b/datajs/src/lib/odata/utils.js
@@ -59,7 +59,8 @@
 var EDM_STRING = EDM + "String";
 var EDM_TIME = EDM + "Time";
 
-var EDM_GEOGRAPHY = EDM + "Geography";
+var GEOGRAPHY = "Geography";
+var EDM_GEOGRAPHY = EDM + GEOGRAPHY;
 var EDM_GEOGRAPHY_POINT = EDM_GEOGRAPHY + "Point";
 var EDM_GEOGRAPHY_LINESTRING = EDM_GEOGRAPHY + "LineString";
 var EDM_GEOGRAPHY_POLYGON = EDM_GEOGRAPHY + "Polygon";
@@ -68,7 +69,16 @@
 var EDM_GEOGRAPHY_MULTILINESTRING = EDM_GEOGRAPHY + "MultiLineString";
 var EDM_GEOGRAPHY_MULTIPOINT = EDM_GEOGRAPHY + "MultiPoint";
 
-var EDM_GEOMETRY = EDM + "Geometry";
+var GEOGRAPHY_POINT = GEOGRAPHY + "Point";
+var GEOGRAPHY_LINESTRING = GEOGRAPHY + "LineString";
+var GEOGRAPHY_POLYGON = GEOGRAPHY + "Polygon";
+var GEOGRAPHY_COLLECTION = GEOGRAPHY + "Collection";
+var GEOGRAPHY_MULTIPOLYGON = GEOGRAPHY + "MultiPolygon";
+var GEOGRAPHY_MULTILINESTRING = GEOGRAPHY + "MultiLineString";
+var GEOGRAPHY_MULTIPOINT = GEOGRAPHY + "MultiPoint";
+
+var GEOMETRY = "Geometry";
+var EDM_GEOMETRY = EDM + GEOMETRY;
 var EDM_GEOMETRY_POINT = EDM_GEOMETRY + "Point";
 var EDM_GEOMETRY_LINESTRING = EDM_GEOMETRY + "LineString";
 var EDM_GEOMETRY_POLYGON = EDM_GEOMETRY + "Polygon";
@@ -77,6 +87,14 @@
 var EDM_GEOMETRY_MULTILINESTRING = EDM_GEOMETRY + "MultiLineString";
 var EDM_GEOMETRY_MULTIPOINT = EDM_GEOMETRY + "MultiPoint";
 
+var GEOMETRY_POINT = GEOMETRY + "Point";
+var GEOMETRY_LINESTRING = GEOMETRY + "LineString";
+var GEOMETRY_POLYGON = GEOMETRY + "Polygon";
+var GEOMETRY_COLLECTION = GEOMETRY + "Collection";
+var GEOMETRY_MULTIPOLYGON = GEOMETRY + "MultiPolygon";
+var GEOMETRY_MULTILINESTRING = GEOMETRY + "MultiLineString";
+var GEOMETRY_MULTIPOINT = GEOMETRY + "MultiPoint";
+
 var GEOJSON_POINT = "Point";
 var GEOJSON_LINESTRING = "LineString";
 var GEOJSON_POLYGON = "Polygon";
@@ -114,6 +132,17 @@
     EDM_GEOMETRY_MULTIPOINT
 ];
 
+var geometryTypes = [
+    GEOMETRY,
+    GEOMETRY_POINT,
+    GEOMETRY_LINESTRING,
+    GEOMETRY_POLYGON,
+    GEOMETRY_COLLECTION,
+    GEOMETRY_MULTIPOLYGON,
+    GEOMETRY_MULTILINESTRING,
+    GEOMETRY_MULTIPOINT
+];
+
 var geographyEdmTypes = [
     EDM_GEOGRAPHY,
     EDM_GEOGRAPHY_POINT,
@@ -125,6 +154,17 @@
     EDM_GEOGRAPHY_MULTIPOINT
 ];
 
+var geographyTypes = [
+    GEOGRAPHY,
+    GEOGRAPHY_POINT,
+    GEOGRAPHY_LINESTRING,
+    GEOGRAPHY_POLYGON,
+    GEOGRAPHY_COLLECTION,
+    GEOGRAPHY_MULTIPOLYGON,
+    GEOGRAPHY_MULTILINESTRING,
+    GEOGRAPHY_MULTIPOINT
+];
+
 var forEachSchema = function (metadata, callback) {
     /// <summary>Invokes a function once per schema in metadata.</summary>
     /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
@@ -423,7 +463,11 @@
     /// <param name="typeName" type="String">Name of type to check.</param>
     /// <returns type="Boolean">True if the type is a geography EDM type; false otherwise.</returns>
 
-    return contains(geographyEdmTypes, typeName);
+    //check with edm
+    var ret = contains(geographyEdmTypes, typeName) || 
+        (typeName.indexOf('.') === -1 && contains(geographyTypes, typeName));
+    return ret; 
+        
 };
 
 var isGeometryEdmType = function (typeName) {
@@ -431,7 +475,9 @@
     /// <param name="typeName" type="String">Name of type to check.</param>
     /// <returns type="Boolean">True if the type is a geometry EDM type; false otherwise.</returns>
 
-    return contains(geometryEdmTypes, typeName);
+    var ret = contains(geometryEdmTypes, typeName) ||
+        (typeName.indexOf('.') === -1 && contains(geometryTypes, typeName));
+    return ret; 
 };
 
 var isNamedStream = function (value) {
diff --git a/datajs/tests/odata-json-tests.js b/datajs/tests/odata-json-tests.js
index 58d8110..630ff55 100644
--- a/datajs/tests/odata-json-tests.js
+++ b/datajs/tests/odata-json-tests.js
@@ -836,4 +836,150 @@
 
     });
 
+    var verifyReadJsonLightDataMetadataFull = function (input, expected, message, model) {
+        var response = { 
+          headers: { 
+            "Content-Type": "application/json;odata.metadata=full",
+             DataServiceVersion: "4.0"
+          },
+          body: JSON.stringify(input) 
+        };
+
+        OData.json.jsonHandler.read(response, { metadata: model });
+        djstest.assertAreEqualDeep(response.data, expected, message);
+    };
+
+
+    var verifyReadJsonLightDataMetadataMinimal= function (input, expected, message, model) {
+        var response = { 
+          headers: { 
+            "Content-Type": "application/json;odata.metadata=minimal",
+             DataServiceVersion: "4.0"
+          },
+          body: JSON.stringify(input) 
+        };
+
+        OData.json.jsonHandler.read(response, { metadata: model });
+        djstest.assertAreEqualDeep(response.data, expected, message);
+    };
+
+    var getPointValue =  { edmType : 'GeographyPoint', value : {
+                type: "Point",
+                coordinates: [1.0, 2.0],
+                crs: {
+                    type: name,
+                    properties: {
+                        name: "EPSG:4326"
+                    }
+                }
+              }};
+
+    var getLineStringValue =  { edmType : 'GeographyLineString', value : {
+                "type": "LineString",
+                "coordinates": [ [100.0, 0.0], [101.0, 1.0] ],
+                crs: {
+                    type: name,
+                    properties: {
+                        name: "EPSG:4326"
+                    }
+                }
+              }};
+
+    var getPolygonValue =  { edmType : 'GeographyPolygon', value : {
+                "type": "Polygon",
+                "coordinates": [
+                  [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
+                  [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
+                  ],
+                crs: {
+                    type: name,
+                    properties: {
+                        name: "EPSG:4326"
+                    }
+                }
+              }};
+
+    var getMultiPointValue =  { edmType : 'GeographyMultiPoint', value : {
+                "type": "MultiPoint",
+                "coordinates": [ [100.0, 0.0], [101.0, 1.0] ],
+                crs: {
+                    type: name,
+                    properties: {
+                        name: "EPSG:4326"
+                    }
+                }
+              }};
+
+    var getMultiLineStringValue =  { edmType : 'GeographyMultiLineString', value : {
+                  "type": "MultiLineString",
+                  "coordinates": [
+                      [ [100.0, 0.0], [101.0, 1.0] ],
+                      [ [102.0, 2.0], [103.0, 3.0] ]
+                    ],
+                crs: {
+                    type: name,
+                    properties: {
+                        name: "EPSG:4326"
+                    }
+                }
+              }};
+      var getMultiPolygonStringValue =  { edmType : 'GeographyMultiPolygon', value : {
+                  "type": "MultiPolygon",
+                  "coordinates": [
+                    [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
+                    [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
+                     [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
+                    ],
+                crs: {
+                    type: name,
+                    properties: {
+                        name: "EPSG:4326"
+                    }
+                }
+              }};
+
+      var getWorkload = [getPointValue, getLineStringValue, getPolygonValue, getMultiPointValue, getMultiLineStringValue, getMultiPolygonStringValue ];
+
+
+      djstest.addTest(function jsonReadGeometryPointFull() {
+
+        for ( var i = 0; i < getWorkload.length; i++) {
+          var item = getWorkload[i]; 
+          var input = {
+            "@odata.context": "http://someUri#Edm."+item.edmType,
+            "value@odata.type" : item.edmType,
+            value: item.value
+          }; 
+
+          var expected = {
+            "@odata.context": "http://someUri#Edm."+item.edmType,
+            "value@odata.type" : item.edmType,
+            value: item.value
+          };
+          verifyReadJsonLightDataMetadataFull(input, expected, "Json light top level primitive property was read properly.");
+        }
+        
+        djstest.done();
+    });
+
+
+    djstest.addTest(function jsonReadGeometryPointMinimal() {
+      for ( var i = 0; i < getWorkload.length; i++) {
+        var item = getWorkload[i]; 
+        var input = {
+            "@odata.context": "http://someUri#Edm."+item.edmType,
+            value: item.value
+        };
+
+        var expected = {
+            "@odata.context": "http://someUri#Edm."+item.edmType,
+            value: item.value,
+            "value@odata.type" : item.edmType,
+        };
+
+        verifyReadJsonLightDataMetadataMinimal(input, expected, "Json light top level primitive property was read properly.", {});
+      }
+      djstest.done();
+    });
+
 })(this);
diff --git a/datajs/tests/odata-qunit-tests.htm b/datajs/tests/odata-qunit-tests.htm
index 696b7bb..427d360 100644
--- a/datajs/tests/odata-qunit-tests.htm
+++ b/datajs/tests/odata-qunit-tests.htm
@@ -42,7 +42,8 @@
     <script type="text/javascript">
         window.TestSynchronizer.init(QUnit);
     </script>
-    <script type="text/javascript" src="../build/datajs-2.0.0.min.js"></script>
+    <!--<script type="text/javascript" src="../build/datajs-2.0.0.min.js"></script>-->
+    <script type="text/javascript" src="../build/datajs-2.0.0.js"></script>
     <script type="text/javascript" src="common/common.js"></script>
 
     <script type="text/javascript" src="./common/mockHttpClient.js"></script>