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