Changed zouba directory heirarchy.
[ptas] / zouba / misc / rss / preview / script / lib / sapi / Landmarks.js
1 /**\r
2  * Landmarks.js\r
3  * \r
4  * Nokia Web Runtime Service API emulation \r
5  * WRT v1.1\r
6  * \r
7  * Copyright 2009 Nokia Corporation. All rights reserved.\r
8 */\r
9 \r
10  \r
11 (function(){\r
12         \r
13         var provider = 'Service.Landmarks',\r
14                 Interface = 'IDataSource';\r
15 \r
16         /**\r
17          * Landmark service\r
18          */\r
19         var LandmarkService = function(){\r
20                 this.New                = __New;\r
21                 this.GetList    = __GetList;\r
22                 this.Add                = __Add;\r
23                 this.Delete             = __Delete;             \r
24                 this.Import     = __Import;\r
25                 this.Export             = __Export;\r
26                 this.Organise   = __Organise;\r
27                 this.Cancel             = __Cancel;                             \r
28         }\r
29 \r
30         device.implementation.extend(provider, Interface, new LandmarkService() );\r
31 \r
32 \r
33         /******************************************************/        \r
34         /******************************************************/        \r
35         /******************************************************/        \r
36 \r
37         var     context = device.implementation.context,\r
38                 _t = context._t,\r
39                 method = '',\r
40                 result = false,\r
41                 DBase = null;\r
42 \r
43         /**\r
44          * Landmarks: New\r
45          * @param {Object} criteria\r
46          */\r
47         function __New(criteria){\r
48                 if ((result = validator.apply('New', arguments)) !== false)\r
49                         return result; \r
50 \r
51                 if (typeof criteria.Type == 'undefined') \r
52                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
53 \r
54                 if (!/^(Landmark|Category)$/i.test(criteria.Type)) \r
55                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);          \r
56                 \r
57                 var returnValue;\r
58                 \r
59                 if(criteria.Type == 'Landmark')\r
60                 {\r
61                         returnValue = {\r
62                                 'LandmarkName'          : '',\r
63                                 'id'                            : '',\r
64                                 'CategoryInfo'          : '',\r
65                                 'LandmarkDesc'          : '',\r
66                                 'LandmarkPosition'      : {\r
67                                                                                 'Latitude'      : '',\r
68                                                                                 'Longitude' : '',\r
69                                                                                 'Altitude'      : '',\r
70                                                                                 'HAccuracy' : '',\r
71                                                                                 'VAccuracy' : '',\r
72                                                                                 'VAccuracy' : ''\r
73                                                                           },\r
74                                 'CoverageRadius'        : '',\r
75                                 'IconFile'                      : '',\r
76                                 'IconIndex'                     : '',\r
77                                 'IconMaskIndex'         : '',\r
78                                 'LandmarkFields'        : {\r
79                                                                                 'Street'                : '',\r
80                                                                                 'BuildingName'  : '',\r
81                                                                                 'District'              : '',\r
82                                                                                 'City'                  : '',\r
83                                                                                 'AreaCode'              : '',\r
84                                                                                 'Telephone'             : '',\r
85                                                                                 'Country'               : ''\r
86                                                                           }\r
87                         };\r
88                 }\r
89                 else //Category\r
90                 {\r
91                         returnValue = {\r
92                                 'CategoryName'  : '',\r
93                                 'id'                    : '',\r
94                                 'GlobalId'              : '',\r
95                                 'IconFile'              : '',\r
96                                 'IconIndex'             : '',\r
97                                 'IconMaskIndex' : ''\r
98                         };\r
99                 }\r
100 \r
101                 return context.Result(returnValue);\r
102         }\r
103         \r
104         /**\r
105          * Landmarks: GetList\r
106          * @param {Object} criteria\r
107          * @param {Function} [callback] function for async call (optional)\r
108          */\r
109         function __GetList(criteria, callback){\r
110                 \r
111                 if ((result = validator.apply('GetList', arguments)) !== false)\r
112                         return result; \r
113 \r
114                 if (typeof criteria.Type == 'undefined') \r
115                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
116 \r
117                 if (!/^(Landmark|Category|Database)$/i.test(criteria.Type)) \r
118                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
119 \r
120                 if (criteria.Filter)\r
121                         context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));\r
122 \r
123                 if(criteria.Sort)\r
124                         context.notify(_t('%s:: GetList : Sort is not implemented in preview').arg(provider));\r
125 \r
126                 if (typeof callback == 'function') {\r
127                         return context.callAsync(this, arguments.callee, criteria, callback);\r
128                 }\r
129                 \r
130                 var returnValue = [], \r
131                         match = null,\r
132                         filter = criteria.Filter || null;\r
133  \r
134                 DBase = context.getData(provider);\r
135 \r
136 \r
137                 if (/Database/i.test(criteria.Type)) {                          // Type = Database\r
138                         \r
139                         returnValue = context.Iterator( DBase.Database || [] );\r
140                         \r
141                 } else if (/Landmark/i.test(criteria.Type)){            // Type = Landmark\r
142                         \r
143                         returnValue = context.Iterator( DBase[criteria.Type] || [] );\r
144                         \r
145                 } else {                                                                                        // Type = Category\r
146                 \r
147                         // @todo: apply filter criteria\r
148                         returnValue = context.Iterator( DBase[criteria.Type] || [] );\r
149                 }\r
150                 return context.Result(returnValue);\r
151         }\r
152 \r
153         /**\r
154          * Landmarks: Add\r
155          * @param {Object} criteria\r
156          */\r
157         function __Add(criteria){\r
158                 \r
159                 if ((result = validator.apply('Add', arguments)) !== false)\r
160                         return result; \r
161 \r
162                 if (!/^(Landmark|Category)$/i.test(criteria.Type))\r
163                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
164 \r
165 \r
166                 var Data = criteria.Data || false; \r
167                 if(!Data){\r
168                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingData);\r
169                 }\r
170 \r
171                 DBase = context.getData(provider);\r
172                 \r
173                 // unsupported!                 \r
174                 if (Data.DatabaseURI) {\r
175                         context.notify(_t('%s:: Add : Data.DatabaseURI not implemented in preview').arg(provider));\r
176                 }\r
177                 \r
178                 var item;\r
179                 \r
180                 // Type = Landmark\r
181                 if (/Landmark/i.test(criteria.Type)){\r
182 \r
183                          if (!Data.LandmarkName)\r
184                                 Data.LandmarkName="";\r
185                         \r
186                         var landmarkPos = Data.LandmarkPosition;\r
187                         if (typeof landmarkPos != 'undefined') {\r
188                                 if ((typeof landmarkPos.Latitude == 'undefined' || typeof landmarkPos.Latitude != 'number') &&\r
189                                         (typeof landmarkPos.Longitude == 'undefined' || typeof landmarkPos.Longitude != 'number') &&\r
190                                         (typeof landmarkPos.Altitude == 'undefined' || typeof landmarkPos.Altitude != 'number') &&\r
191                                         (typeof landmarkPos.HAccuracy == 'undefined' || typeof landmarkPos.HAccuracy != 'number') &&\r
192                                         (typeof landmarkPos.VAccuracy == 'undefined' || typeof landmarkPos.VAccuracy != 'number')) {\r
193                                                 \r
194                                                 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);\r
195                                 }\r
196                         }\r
197                         // update\r
198                         if (typeof Data.id != 'undefined') {\r
199                                 if(typeof Data.id != 'string')\r
200                                                 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
201                                 \r
202                                 var retIndex = findById(DBase.Landmark, Data.id); \r
203                                 if (retIndex == -1)\r
204                                         return error(device.implementation.ERR_NOT_FOUND);\r
205                                 DBase.Landmark[retIndex] = Data;\r
206                                 item = Data;\r
207                         }\r
208                         // new\r
209                         else {\r
210                                 item = context.extend({}, Data); \r
211                                 item.id = String(context.getUniqueID());\r
212                                 DBase.Landmark.push(item);\r
213                         }\r
214                 } else { // Type = Category\r
215 //                      alert(typeof Data.CategoryName);\r
216 \r
217                         //alert("Data.id : "+Data.id);\r
218                         // update\r
219                         if (typeof Data.id != 'undefined') {\r
220                                 if(typeof Data.id != 'string')\r
221                                                 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
222         \r
223                                 var retIndex = findById(DBase.Category, Data.id); \r
224                                 if (retIndex == -1)\r
225                                         return error(device.implementation.ERR_NOT_FOUND);\r
226 \r
227                                 DBase.Category[retIndex] = Data;                                        \r
228                                 item = Data;\r
229                         }\r
230                         // new\r
231                         else {\r
232                                 if (typeof Data.CategoryName == 'undefined')\r
233                                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingCategoryName);      \r
234         \r
235                                 if(typeof Data.CategoryName != 'string' || Data.CategoryName.length <= 0)\r
236                                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);\r
237 \r
238                                 var retIndex = findByName(DBase.Category, Data.CategoryName); \r
239                                 if (retIndex !=  -1)\r
240                                         return error(device.implementation.ERR_ENTRY_EXISTS);\r
241                                         \r
242                                 item = context.extend({}, Data); \r
243                                 item.id = String(context.getUniqueID());\r
244                                 DBase.Category.push(item);\r
245                         }\r
246                 } \r
247                 // return success\r
248                 return context.Result(item.id, device.implementation.ERR_SUCCESS);\r
249         }\r
250                         \r
251         /**\r
252          * Landmarks: Delete\r
253          * @param {Object} criteria\r
254          */\r
255         function __Delete(criteria){\r
256 \r
257                 if ((result = validator.apply('Delete', arguments)) !== false)\r
258                         return result; \r
259 \r
260                 if (!/^(Landmark|Category)$/i.test(criteria.Type))\r
261                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
262 \r
263                 var Data = criteria.Data || false; \r
264                 if(!Data){\r
265                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
266                 }\r
267 \r
268                 if (typeof Data.id == 'undefined') {\r
269                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId);\r
270                         }\r
271 \r
272                 if (typeof Data.id != 'undefined' && typeof Data.id != 'string') {\r
273                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
274                 }\r
275                 if(Data.id.length <= 0 )\r
276                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);\r
277                         \r
278                 DBase = context.getData(provider);\r
279                 \r
280                 var type = criteria.Type;\r
281 \r
282                 // unsupported!                 \r
283                 if (Data.DBUri) {\r
284                         context.notify(_t('%s:: Delete : Data.DBUri not implemented in preview').arg(provider));\r
285                 }\r
286 \r
287                 // for both Landmark & Category:\r
288                 var i,item;\r
289 \r
290                 for (i in DBase[type]) {\r
291                         item = DBase[type][i];\r
292                         if (Data.id == item.id) {\r
293                                 DBase[type].splice(i, 1);\r
294                         }\r
295                 }\r
296 \r
297                 // return success\r
298                 return error(device.implementation.ERR_SUCCESS);                                \r
299         }\r
300                 \r
301         /**\r
302          * Landmarks: Import\r
303          * @param {Object} criteria\r
304          */\r
305         function __Import(criteria){\r
306                 \r
307                 if ((result = validator.apply('Import', arguments)) !== false)\r
308                         return result; \r
309 \r
310                 if (!/^(Landmark)$/i.test(criteria.Type))\r
311                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
312 \r
313                 context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));\r
314 \r
315                 var Data = criteria.Data || false; \r
316                 if(!Data)\r
317                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
318 \r
319                 if (!Data.SourceFile)\r
320                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingSourceFile);\r
321 \r
322                 if (!Data.MimeType)\r
323                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);\r
324 \r
325                 if (!/^(application\/vnd.nokia.landmarkcollection\+xml|application\/vnd.nokia.landmark\+wbxml)$/i.test(Data.MimeType))\r
326                         return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.invalidMime);\r
327 \r
328                 return error(device.implementation.ERR_SUCCESS);                \r
329         }\r
330                         \r
331 \r
332         /**\r
333          * Landmarks: Export\r
334          * @param {Object} criteria\r
335          */\r
336         function __Export(criteria){\r
337 \r
338                 if ((result = validator.apply('Export', arguments)) !== false)\r
339                         return result; \r
340 \r
341                 context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));\r
342                 if (!/^(Landmark)$/i.test(criteria.Type))\r
343                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
344 \r
345                 var Data = criteria.Data || false; \r
346                 if(!Data){\r
347                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
348                 }\r
349 \r
350                 if (!Data.DestinationFile)\r
351                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDestFile);\r
352                         \r
353                 if (!Data.MimeType)\r
354                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);\r
355 \r
356                 if (!Data.IdList)\r
357                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);\r
358 \r
359                 return error(device.implementation.ERR_SUCCESS);                \r
360         }\r
361                         \r
362 \r
363         /**\r
364          * Landmarks: Organise\r
365          * @param {Object} criteria\r
366          */\r
367         function __Organise(criteria){\r
368 \r
369                 if ((result = validator.apply('Organise', arguments)) !== false)\r
370                         return result; \r
371 \r
372                 if (!/^(Landmark)$/i.test(criteria.Type))\r
373                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
374 \r
375                 var Data = criteria.Data || false; \r
376                 if(!Data){\r
377                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
378                 }\r
379 \r
380                 if (!Data.id || Data.id == "")\r
381                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);\r
382                 \r
383                 DBase = context.getData(provider);\r
384                 var categories = DBase['Category'];\r
385                 var landmarks  = DBase['Landmark'];\r
386                 var found = false;\r
387                 \r
388                 \r
389                 for(var i=0;i<categories.length;i++)\r
390                 {\r
391                         var category = categories[i];\r
392                         if (category.id == Data.id) {\r
393                                 found = true;\r
394                                 break;\r
395                         }\r
396                 }\r
397                 if(!found)\r
398                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
399 \r
400                 try{\r
401                         if(!Data.IdList || Data.IdList.length <=0)\r
402                         {\r
403                                 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
404                         }\r
405                 }catch(e){\r
406                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
407                 }\r
408                 \r
409                 if (!/^(Associate|Disassociate)$/i.test(criteria.OperationType))\r
410                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidOpType);\r
411                 \r
412                 context.notify(_t('%s:: Organise : not implemented in preview.').arg(provider));\r
413                 if(/^Associate$/i.test(criteria.OperationType))\r
414                 {\r
415                         for(var i=0;i<landmarks.length;i++)\r
416                         {\r
417                                 for(var j=0;j<Data.IdList.length;j++)\r
418                                 {\r
419                                         if(landmarks[i] == Data.IdList[j])\r
420                                         {\r
421                                                 if(!landmarks[i].CategoryInfo)\r
422                                                 {\r
423                                                         landmarks[i].CategoryInfo = new Array();\r
424                                                         landmarks[i].CategoryInfo.push(Data.id);                                        \r
425                                                 }\r
426                                                 else{\r
427                                                         var landmark = landmarks[i];\r
428                                                         var found = false;\r
429                                                         for(var k=0;k<landmark.CategoryInfo.length;k++)\r
430                                                         {\r
431                                                                 if(landmark.CategoryInfo[k] == Data.id)\r
432                                                                         found = true;\r
433                                                         }\r
434                                                         if(!found)\r
435                                                                 landmark.CategoryInfo.push(Data.id);\r
436                                                 }\r
437                                                 \r
438                                         }\r
439                                 }\r
440                         }\r
441                 }\r
442                 else\r
443                 {\r
444                         for(var i=0;i<landmarks.length;i++)\r
445                         {\r
446                                 for(var j=0;j<Data.IdList.length;j++)\r
447                                 {\r
448                                         if(landmarks[i] == Data.IdList[j] && landmarks[i].CategoryInfo != undefined)\r
449                                         {\r
450                                                 var landmark = landmarks[i];\r
451                                                 for(var k=0;k<landmark.CategoryInfo.length;k++)\r
452                                                 {\r
453                                                         if(landmark.CategoryInfo[k] == Data.id)\r
454                                                                 landmark.CategoryInfo.splice(k,1);\r
455                                                 }\r
456                                         }\r
457                                 }\r
458                         }\r
459                 }\r
460                 \r
461                 return error(device.implementation.ERR_SUCCESS);                \r
462         }\r
463                 \r
464 \r
465         /**\r
466          * Landmarks: Cancel\r
467          * @param {Object} criteria\r
468          */\r
469         function __Cancel(criteria){\r
470                 method = 'Cancel';\r
471                 \r
472                 if ((result = validator.apply('Cancel', arguments)) !== false)\r
473                         return result;          \r
474                         \r
475                 if (!criteria.TransactionID)\r
476                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);\r
477                 \r
478                 clearTimeout(criteria.TransactionID);\r
479                 return context.ErrorResult(device.implementation.ERR_SUCCESS);\r
480         }\r
481 \r
482 \r
483         \r
484         /*******************************\r
485          * helper functions\r
486          *******************************/\r
487         function error(code, msg /*, args...*/){\r
488 \r
489                 var args = ['Landmarks',method].concat([].slice.call(arguments,2));\r
490                 msg = msg ? _t().arg.apply(msg,args) : undefined;\r
491                 return context.ErrorResult(code, msg);\r
492         }\r
493 \r
494         /**\r
495          * validate common input arguments\r
496          * 'this' is string (object) name of calling function\r
497          * \r
498          * @param {arguments} arguments of calling function\r
499          * @return {Result} Result object if error, false if no error.\r
500          */\r
501         function validator() {\r
502                 method = ''+this;\r
503                 var     failed = false,\r
504                         criteria = arguments[0] || false;\r
505                         \r
506                 if (!criteria || typeof criteria != 'object')\r
507                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
508 \r
509                 return failed;\r
510         }\r
511         \r
512         function findById(dbase, id){\r
513                 for (var i in dbase) {\r
514                         if (id == dbase[i]['id']) {\r
515                                 return i;\r
516                         }\r
517                 }\r
518                 return -1;\r
519         }       \r
520 \r
521         function findByName(dbase, name){\r
522                 for (var i in dbase) {\r
523                         if (name == dbase[i]['CategoryName']) {\r
524                                 return i;\r
525                         }\r
526                 }\r
527                 return -1;\r
528         }       \r
529 \r
530 \r
531         /** \r
532          * error messages\r
533          * order of %s args: Service name, method name, parameter name \r
534          */\r
535         var msg = {\r
536                 missingType                     : '%s%s : Type is missing',\r
537                 badType                         : '%s%s : Type is invalid',             \r
538                 missingData                     : '%s%s : Type or Data is missing',\r
539                 missingId                       : '%s%s : Id is missing',\r
540                 invalidId                       : '%s%s : id is invalid',\r
541                 missingLandmarkName     : '%s%s : Landmrak name Missing',\r
542                 missingCategoryName     : '%s%s : CategoryName is missing',\r
543                 missingSourceFile       : '%s%s : Import Source Filename is Missing',\r
544                 missingMimeType         : '%s%s : MIME type for source file is Missing',\r
545                 missingDestFile         : '%s%s : DestinationFile is missing',\r
546                 invalidOpType           : '%s%s : OperationType is invalid',\r
547                 missingIdList           : '%s%s : Id list is Missing',\r
548                 missingTID                      : '%s%s : TransactionID is missing',\r
549                 invalidMime                     : '%s%s : MimeType is missing',\r
550                 msgNoMsg                        : '',\r
551                 \r
552         };\r
553                 \r
554 \r
555 }) ()\r
556 \r