      1 // ==========================================================================
      2 // Project:   The M-Project - Mobile HTML5 Application Framework
      3 // Copyright: (c) 2010 M-Way Solutions GmbH. All rights reserved.
      4 // Creator:   Sebastian
      5 // Date:      02.12.2010
      6 // License:   Dual licensed under the MIT or GPL Version 2 licenses.
      7 //            http://github.com/mwaylabs/The-M-Project/blob/master/MIT-LICENSE
      8 //            http://github.com/mwaylabs/The-M-Project/blob/master/GPL-LICENSE
      9 // ==========================================================================
     10
     11 m_require('core/datastore/data_provider.js');
     12
     13 /**
     14  * @class
     15  *
     16  * Encapsulates access to a remote storage, a json based webservice.
     17  *
     18  * @extends M.DataProvider
     19  */
     20 M.RemoteStorageProvider = M.DataProvider.extend(
     21 /** @scope M.RemoteStorageProvider.prototype */ {
     22
     23     /**
     24      * The type of this object.
     25      * @type String
     26      */
     27     type: 'M.RemoteStorageProvider',
     28
     29     /**
     30      * The type of this object.
     31      * @type Object
     32      */
     33     config: null,
     34
     35     /* CRUD methods */
     36
     37     save: function(obj) {
     38
     39         var config = this.config[obj.model.name];
     40         var result = null;
     41         var dataPattern = null;
     42         var dataResult = null;
     43
     44         if(obj.model.state === M.STATE_NEW) {   /* if the model is new we need to make a create request, if not new then we make an update request */
     45
     46             /* the given dataPattern must be a valid JSON string that is then transformed into an object structure*/
     47             dataPattern = JSON.parse(config.create.dataPattern);
     48             dataResult = this.deepObjectReplacement(dataPattern, obj.model.record, result);
     49
     50             M.Request.init({
     51                 url: config.location + config.create.url,
     52                 type: config.create.httpMethod,
     53                 isJSON: YES,
     54                 contentType: 'application/JSON',
     55                 data: dataResult,
     56                 onSuccess: function(data) {
     57                     obj.onSuccess(data);
     58                 },
     59                 onError: function() {
     60                     obj.onError();
     61                 }
     62             }).send();
     63
     64         } else { // make an update request
     65             dataPattern = JSON.parse(config.create.dataPattern);
     66             dataResult = this.deepObjectReplacement(dataPattern, obj.model.record, result);
     67
     68
     69             /* make generic */
     70             var updateURL = config.update.url.replace(/<%=\s+([.|_|-|$|�|a-zA-Z]+[0-9]*[.|_|-|$|�|a-zA-Z]*)\s*%>/, object.model.record.ID);
     71
     72             M.Request.init({
     73                 url: config.location + updateUrl,
     74                 type: config.update.httpMethod,
     75                 isJSON: YES,
     76                 contentType: 'application/JSON',
     77                 data: dataResult,
     78                 onSuccess: function(data) {
     79                     obj.onSuccess(data);
     80                 },
     81                 onError: function() {
     82                     obj.onError();
     83                 },
     84                 beforeSend: function(xhr) {
     85                   xhr.setRequestHeader("X-Http-Method-Override", config.update.httpMethod);
     86                 }
     87             }).send();
     88
     89         }
     90
     91     },
     92
     93     del: function(obj) {
     94
     95     },
     96
     97     find: function(obj) {
     98         var config = this.config[obj.model.name];
     99         var readUrl = obj.ID ? config.read.url.one.replace(/<%=\s+([.|_|-|$|�|a-zA-Z]+[0-9]*[.|_|-|$|�|a-zA-Z]*)\s*%>/,obj.ID) : config.read.url.all;
    100
    101         console.log(config.location + readUrl+ '.json');
    102
    103         M.Request.init({
    104             url: config.location + readUrl + '.json',
    105             type: config.read.httpMethod,
    106             isJSON: YES,
    107             contentType: 'application/JSON',
    108             onSuccess: function(data) {
    109                 obj.onSuccess(data);
    110             },
    111             onError: function() {
    112                 obj.onError();
    113             }
    114         }).send();
    115     },
    116
    117     remoteQuery: function(onSuccess, onError) {
    118
    119     },
    120
    121     /**
    122      * creates a new data provider instance with the passed configuration parameters
    123      * @param obj
    124      */
    125     configure: function(obj) {
    126         console.log('configure() called.');
    127         // maybe some value checking
    128         return this.extend({
    129             config:obj
    130         });
    131     },
    132
    133
    134     /**
    135      * Creates result as an object passed to the request containing the request data.
    136      *
    137      * @param dataPattern
    138      * @param record
    139      * @param result
    140      */
    141     deepObjectReplacement: function(dataPattern, record, result) {
    142         for(var i in dataPattern) {
    143             if(typeof(dataPattern[i]) === 'object') {
    144                 this.deepObjectReplacement(dataPattern[i], record, result);
    145             }
    146             var valueRegEx = /<%=\s+([.|_|-|$|�|a-zA-Z]+[0-9]*[.|_|-|$|�|a-zA-Z]*)\s*%>/;
    147
    148             if(typeof(dataPattern[i]) != 'object') {
    149                 var regExResult = valueRegEx.exec(dataPattern[i]);
    150                 dataPattern[i] = record[i];
    151                 console.log(dataPattern[i]);
    152             }
    153         }
    154         return dataPattern;
    155     }
    156
    157 });