Changed zouba directory heirarchy.
[ptas] / zouba / misc / rss / preview / script / lib / sapi / Landmarks.js
diff --git a/zouba/misc/rss/preview/script/lib/sapi/Landmarks.js b/zouba/misc/rss/preview/script/lib/sapi/Landmarks.js
new file mode 100644 (file)
index 0000000..991dea3
--- /dev/null
@@ -0,0 +1,556 @@
+/**\r
+ * Landmarks.js\r
+ * \r
+ * Nokia Web Runtime Service API emulation \r
+ * WRT v1.1\r
+ * \r
+ * Copyright 2009 Nokia Corporation. All rights reserved.\r
+*/\r
+\r
\r
+(function(){\r
+       \r
+       var provider = 'Service.Landmarks',\r
+               Interface = 'IDataSource';\r
+\r
+       /**\r
+        * Landmark service\r
+        */\r
+       var LandmarkService = function(){\r
+               this.New                = __New;\r
+               this.GetList    = __GetList;\r
+               this.Add                = __Add;\r
+               this.Delete             = __Delete;             \r
+               this.Import     = __Import;\r
+               this.Export             = __Export;\r
+               this.Organise   = __Organise;\r
+               this.Cancel             = __Cancel;                             \r
+       }\r
+\r
+       device.implementation.extend(provider, Interface, new LandmarkService() );\r
+\r
+\r
+       /******************************************************/        \r
+       /******************************************************/        \r
+       /******************************************************/        \r
+\r
+       var     context = device.implementation.context,\r
+               _t = context._t,\r
+               method = '',\r
+               result = false,\r
+               DBase = null;\r
+\r
+       /**\r
+        * Landmarks: New\r
+        * @param {Object} criteria\r
+        */\r
+       function __New(criteria){\r
+               if ((result = validator.apply('New', arguments)) !== false)\r
+                       return result; \r
+\r
+               if (typeof criteria.Type == 'undefined') \r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
+\r
+               if (!/^(Landmark|Category)$/i.test(criteria.Type)) \r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);          \r
+               \r
+               var returnValue;\r
+               \r
+               if(criteria.Type == 'Landmark')\r
+               {\r
+                       returnValue = {\r
+                               'LandmarkName'          : '',\r
+                               'id'                            : '',\r
+                               'CategoryInfo'          : '',\r
+                               'LandmarkDesc'          : '',\r
+                               'LandmarkPosition'      : {\r
+                                                                               'Latitude'      : '',\r
+                                                                               'Longitude' : '',\r
+                                                                               'Altitude'      : '',\r
+                                                                               'HAccuracy' : '',\r
+                                                                               'VAccuracy' : '',\r
+                                                                               'VAccuracy' : ''\r
+                                                                         },\r
+                               'CoverageRadius'        : '',\r
+                               'IconFile'                      : '',\r
+                               'IconIndex'                     : '',\r
+                               'IconMaskIndex'         : '',\r
+                               'LandmarkFields'        : {\r
+                                                                               'Street'                : '',\r
+                                                                               'BuildingName'  : '',\r
+                                                                               'District'              : '',\r
+                                                                               'City'                  : '',\r
+                                                                               'AreaCode'              : '',\r
+                                                                               'Telephone'             : '',\r
+                                                                               'Country'               : ''\r
+                                                                         }\r
+                       };\r
+               }\r
+               else //Category\r
+               {\r
+                       returnValue = {\r
+                               'CategoryName'  : '',\r
+                               'id'                    : '',\r
+                               'GlobalId'              : '',\r
+                               'IconFile'              : '',\r
+                               'IconIndex'             : '',\r
+                               'IconMaskIndex' : ''\r
+                       };\r
+               }\r
+\r
+               return context.Result(returnValue);\r
+       }\r
+       \r
+       /**\r
+        * Landmarks: GetList\r
+        * @param {Object} criteria\r
+        * @param {Function} [callback] function for async call (optional)\r
+        */\r
+       function __GetList(criteria, callback){\r
+               \r
+               if ((result = validator.apply('GetList', arguments)) !== false)\r
+                       return result; \r
+\r
+               if (typeof criteria.Type == 'undefined') \r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
+\r
+               if (!/^(Landmark|Category|Database)$/i.test(criteria.Type)) \r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
+\r
+               if (criteria.Filter)\r
+                       context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));\r
+\r
+               if(criteria.Sort)\r
+                       context.notify(_t('%s:: GetList : Sort is not implemented in preview').arg(provider));\r
+\r
+               if (typeof callback == 'function') {\r
+                       return context.callAsync(this, arguments.callee, criteria, callback);\r
+               }\r
+               \r
+               var returnValue = [], \r
+                       match = null,\r
+                       filter = criteria.Filter || null;\r
\r
+               DBase = context.getData(provider);\r
+\r
+\r
+               if (/Database/i.test(criteria.Type)) {                          // Type = Database\r
+                       \r
+                       returnValue = context.Iterator( DBase.Database || [] );\r
+                       \r
+               } else if (/Landmark/i.test(criteria.Type)){            // Type = Landmark\r
+                       \r
+                       returnValue = context.Iterator( DBase[criteria.Type] || [] );\r
+                       \r
+               } else {                                                                                        // Type = Category\r
+               \r
+                       // @todo: apply filter criteria\r
+                       returnValue = context.Iterator( DBase[criteria.Type] || [] );\r
+               }\r
+               return context.Result(returnValue);\r
+       }\r
+\r
+       /**\r
+        * Landmarks: Add\r
+        * @param {Object} criteria\r
+        */\r
+       function __Add(criteria){\r
+               \r
+               if ((result = validator.apply('Add', arguments)) !== false)\r
+                       return result; \r
+\r
+               if (!/^(Landmark|Category)$/i.test(criteria.Type))\r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
+\r
+\r
+               var Data = criteria.Data || false; \r
+               if(!Data){\r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingData);\r
+               }\r
+\r
+               DBase = context.getData(provider);\r
+               \r
+               // unsupported!                 \r
+               if (Data.DatabaseURI) {\r
+                       context.notify(_t('%s:: Add : Data.DatabaseURI not implemented in preview').arg(provider));\r
+               }\r
+               \r
+               var item;\r
+               \r
+               // Type = Landmark\r
+               if (/Landmark/i.test(criteria.Type)){\r
+\r
+                        if (!Data.LandmarkName)\r
+                               Data.LandmarkName="";\r
+                       \r
+                       var landmarkPos = Data.LandmarkPosition;\r
+                       if (typeof landmarkPos != 'undefined') {\r
+                               if ((typeof landmarkPos.Latitude == 'undefined' || typeof landmarkPos.Latitude != 'number') &&\r
+                                       (typeof landmarkPos.Longitude == 'undefined' || typeof landmarkPos.Longitude != 'number') &&\r
+                                       (typeof landmarkPos.Altitude == 'undefined' || typeof landmarkPos.Altitude != 'number') &&\r
+                                       (typeof landmarkPos.HAccuracy == 'undefined' || typeof landmarkPos.HAccuracy != 'number') &&\r
+                                       (typeof landmarkPos.VAccuracy == 'undefined' || typeof landmarkPos.VAccuracy != 'number')) {\r
+                                               \r
+                                               return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);\r
+                               }\r
+                       }\r
+                       // update\r
+                       if (typeof Data.id != 'undefined') {\r
+                               if(typeof Data.id != 'string')\r
+                                               return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
+                               \r
+                               var retIndex = findById(DBase.Landmark, Data.id); \r
+                               if (retIndex == -1)\r
+                                       return error(device.implementation.ERR_NOT_FOUND);\r
+                               DBase.Landmark[retIndex] = Data;\r
+                               item = Data;\r
+                       }\r
+                       // new\r
+                       else {\r
+                               item = context.extend({}, Data); \r
+                               item.id = String(context.getUniqueID());\r
+                               DBase.Landmark.push(item);\r
+                       }\r
+               } else { // Type = Category\r
+//                     alert(typeof Data.CategoryName);\r
+\r
+                       //alert("Data.id : "+Data.id);\r
+                       // update\r
+                       if (typeof Data.id != 'undefined') {\r
+                               if(typeof Data.id != 'string')\r
+                                               return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
+       \r
+                               var retIndex = findById(DBase.Category, Data.id); \r
+                               if (retIndex == -1)\r
+                                       return error(device.implementation.ERR_NOT_FOUND);\r
+\r
+                               DBase.Category[retIndex] = Data;                                        \r
+                               item = Data;\r
+                       }\r
+                       // new\r
+                       else {\r
+                               if (typeof Data.CategoryName == 'undefined')\r
+                                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingCategoryName);      \r
+       \r
+                               if(typeof Data.CategoryName != 'string' || Data.CategoryName.length <= 0)\r
+                                       return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);\r
+\r
+                               var retIndex = findByName(DBase.Category, Data.CategoryName); \r
+                               if (retIndex !=  -1)\r
+                                       return error(device.implementation.ERR_ENTRY_EXISTS);\r
+                                       \r
+                               item = context.extend({}, Data); \r
+                               item.id = String(context.getUniqueID());\r
+                               DBase.Category.push(item);\r
+                       }\r
+               } \r
+               // return success\r
+               return context.Result(item.id, device.implementation.ERR_SUCCESS);\r
+       }\r
+                       \r
+       /**\r
+        * Landmarks: Delete\r
+        * @param {Object} criteria\r
+        */\r
+       function __Delete(criteria){\r
+\r
+               if ((result = validator.apply('Delete', arguments)) !== false)\r
+                       return result; \r
+\r
+               if (!/^(Landmark|Category)$/i.test(criteria.Type))\r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
+\r
+               var Data = criteria.Data || false; \r
+               if(!Data){\r
+                       return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
+               }\r
+\r
+               if (typeof Data.id == 'undefined') {\r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId);\r
+                       }\r
+\r
+               if (typeof Data.id != 'undefined' && typeof Data.id != 'string') {\r
+                       return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
+               }\r
+               if(Data.id.length <= 0 )\r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);\r
+                       \r
+               DBase = context.getData(provider);\r
+               \r
+               var type = criteria.Type;\r
+\r
+               // unsupported!                 \r
+               if (Data.DBUri) {\r
+                       context.notify(_t('%s:: Delete : Data.DBUri not implemented in preview').arg(provider));\r
+               }\r
+\r
+               // for both Landmark & Category:\r
+               var i,item;\r
+\r
+               for (i in DBase[type]) {\r
+                       item = DBase[type][i];\r
+                       if (Data.id == item.id) {\r
+                               DBase[type].splice(i, 1);\r
+                       }\r
+               }\r
+\r
+               // return success\r
+               return error(device.implementation.ERR_SUCCESS);                                \r
+       }\r
+               \r
+       /**\r
+        * Landmarks: Import\r
+        * @param {Object} criteria\r
+        */\r
+       function __Import(criteria){\r
+               \r
+               if ((result = validator.apply('Import', arguments)) !== false)\r
+                       return result; \r
+\r
+               if (!/^(Landmark)$/i.test(criteria.Type))\r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
+\r
+               context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));\r
+\r
+               var Data = criteria.Data || false; \r
+               if(!Data)\r
+                       return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
+\r
+               if (!Data.SourceFile)\r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingSourceFile);\r
+\r
+               if (!Data.MimeType)\r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);\r
+\r
+               if (!/^(application\/vnd.nokia.landmarkcollection\+xml|application\/vnd.nokia.landmark\+wbxml)$/i.test(Data.MimeType))\r
+                       return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.invalidMime);\r
+\r
+               return error(device.implementation.ERR_SUCCESS);                \r
+       }\r
+                       \r
+\r
+       /**\r
+        * Landmarks: Export\r
+        * @param {Object} criteria\r
+        */\r
+       function __Export(criteria){\r
+\r
+               if ((result = validator.apply('Export', arguments)) !== false)\r
+                       return result; \r
+\r
+               context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));\r
+               if (!/^(Landmark)$/i.test(criteria.Type))\r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
+\r
+               var Data = criteria.Data || false; \r
+               if(!Data){\r
+                       return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
+               }\r
+\r
+               if (!Data.DestinationFile)\r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDestFile);\r
+                       \r
+               if (!Data.MimeType)\r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);\r
+\r
+               if (!Data.IdList)\r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);\r
+\r
+               return error(device.implementation.ERR_SUCCESS);                \r
+       }\r
+                       \r
+\r
+       /**\r
+        * Landmarks: Organise\r
+        * @param {Object} criteria\r
+        */\r
+       function __Organise(criteria){\r
+\r
+               if ((result = validator.apply('Organise', arguments)) !== false)\r
+                       return result; \r
+\r
+               if (!/^(Landmark)$/i.test(criteria.Type))\r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
+\r
+               var Data = criteria.Data || false; \r
+               if(!Data){\r
+                       return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
+               }\r
+\r
+               if (!Data.id || Data.id == "")\r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);\r
+               \r
+               DBase = context.getData(provider);\r
+               var categories = DBase['Category'];\r
+               var landmarks  = DBase['Landmark'];\r
+               var found = false;\r
+               \r
+               \r
+               for(var i=0;i<categories.length;i++)\r
+               {\r
+                       var category = categories[i];\r
+                       if (category.id == Data.id) {\r
+                               found = true;\r
+                               break;\r
+                       }\r
+               }\r
+               if(!found)\r
+                       return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
+\r
+               try{\r
+                       if(!Data.IdList || Data.IdList.length <=0)\r
+                       {\r
+                               return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
+                       }\r
+               }catch(e){\r
+                       return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
+               }\r
+               \r
+               if (!/^(Associate|Disassociate)$/i.test(criteria.OperationType))\r
+                       return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidOpType);\r
+               \r
+               context.notify(_t('%s:: Organise : not implemented in preview.').arg(provider));\r
+               if(/^Associate$/i.test(criteria.OperationType))\r
+               {\r
+                       for(var i=0;i<landmarks.length;i++)\r
+                       {\r
+                               for(var j=0;j<Data.IdList.length;j++)\r
+                               {\r
+                                       if(landmarks[i] == Data.IdList[j])\r
+                                       {\r
+                                               if(!landmarks[i].CategoryInfo)\r
+                                               {\r
+                                                       landmarks[i].CategoryInfo = new Array();\r
+                                                       landmarks[i].CategoryInfo.push(Data.id);                                        \r
+                                               }\r
+                                               else{\r
+                                                       var landmark = landmarks[i];\r
+                                                       var found = false;\r
+                                                       for(var k=0;k<landmark.CategoryInfo.length;k++)\r
+                                                       {\r
+                                                               if(landmark.CategoryInfo[k] == Data.id)\r
+                                                                       found = true;\r
+                                                       }\r
+                                                       if(!found)\r
+                                                               landmark.CategoryInfo.push(Data.id);\r
+                                               }\r
+                                               \r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       for(var i=0;i<landmarks.length;i++)\r
+                       {\r
+                               for(var j=0;j<Data.IdList.length;j++)\r
+                               {\r
+                                       if(landmarks[i] == Data.IdList[j] && landmarks[i].CategoryInfo != undefined)\r
+                                       {\r
+                                               var landmark = landmarks[i];\r
+                                               for(var k=0;k<landmark.CategoryInfo.length;k++)\r
+                                               {\r
+                                                       if(landmark.CategoryInfo[k] == Data.id)\r
+                                                               landmark.CategoryInfo.splice(k,1);\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               return error(device.implementation.ERR_SUCCESS);                \r
+       }\r
+               \r
+\r
+       /**\r
+        * Landmarks: Cancel\r
+        * @param {Object} criteria\r
+        */\r
+       function __Cancel(criteria){\r
+               method = 'Cancel';\r
+               \r
+               if ((result = validator.apply('Cancel', arguments)) !== false)\r
+                       return result;          \r
+                       \r
+               if (!criteria.TransactionID)\r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);\r
+               \r
+               clearTimeout(criteria.TransactionID);\r
+               return context.ErrorResult(device.implementation.ERR_SUCCESS);\r
+       }\r
+\r
+\r
+       \r
+       /*******************************\r
+        * helper functions\r
+        *******************************/\r
+       function error(code, msg /*, args...*/){\r
+\r
+               var args = ['Landmarks',method].concat([].slice.call(arguments,2));\r
+               msg = msg ? _t().arg.apply(msg,args) : undefined;\r
+               return context.ErrorResult(code, msg);\r
+       }\r
+\r
+       /**\r
+        * validate common input arguments\r
+        * 'this' is string (object) name of calling function\r
+        * \r
+        * @param {arguments} arguments of calling function\r
+        * @return {Result} Result object if error, false if no error.\r
+        */\r
+       function validator() {\r
+               method = ''+this;\r
+               var     failed = false,\r
+                       criteria = arguments[0] || false;\r
+                       \r
+               if (!criteria || typeof criteria != 'object')\r
+                       return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
+\r
+               return failed;\r
+       }\r
+       \r
+       function findById(dbase, id){\r
+               for (var i in dbase) {\r
+                       if (id == dbase[i]['id']) {\r
+                               return i;\r
+                       }\r
+               }\r
+               return -1;\r
+       }       \r
+\r
+       function findByName(dbase, name){\r
+               for (var i in dbase) {\r
+                       if (name == dbase[i]['CategoryName']) {\r
+                               return i;\r
+                       }\r
+               }\r
+               return -1;\r
+       }       \r
+\r
+\r
+       /** \r
+        * error messages\r
+        * order of %s args: Service name, method name, parameter name \r
+        */\r
+       var msg = {\r
+               missingType                     : '%s%s : Type is missing',\r
+               badType                         : '%s%s : Type is invalid',             \r
+               missingData                     : '%s%s : Type or Data is missing',\r
+               missingId                       : '%s%s : Id is missing',\r
+               invalidId                       : '%s%s : id is invalid',\r
+               missingLandmarkName     : '%s%s : Landmrak name Missing',\r
+               missingCategoryName     : '%s%s : CategoryName is missing',\r
+               missingSourceFile       : '%s%s : Import Source Filename is Missing',\r
+               missingMimeType         : '%s%s : MIME type for source file is Missing',\r
+               missingDestFile         : '%s%s : DestinationFile is missing',\r
+               invalidOpType           : '%s%s : OperationType is invalid',\r
+               missingIdList           : '%s%s : Id list is Missing',\r
+               missingTID                      : '%s%s : TransactionID is missing',\r
+               invalidMime                     : '%s%s : MimeType is missing',\r
+               msgNoMsg                        : '',\r
+               \r
+       };\r
+               \r
+\r
+}) ()\r
+\r