PageRenderTime 23ms CodeModel.GetById 45ms RepoModel.GetById 0ms app.codeStats 0ms

/node_modules/stackmob-nodejs/stackmob-js-0.1.0.js

https://bitbucket.org/steerapi/orbit-measure
JavaScript | 823 lines | 600 code | 166 blank | 57 comment | 172 complexity | 6ebb1a17b067157c6e5a7af63a551b48 MD5 | raw file
Possible License(s): MIT, Apache-2.0
  1. //Change to suppoer nodejs
  2. _ = require("underscore");
  3. Backbone = require("backbone");
  4. (function() {
  5. var root = this;
  6. /**
  7. * StackMob Object
  8. * This holds configuration information for StackMob
  9. */
  10. //Change to suppoer nodejs
  11. module.exports = StackMob = root.StackMob = {
  12. DEFAULT_API_VERSION: 0,
  13. DEFAULT_LOGIN_SCHEMA: 'user',
  14. DEFAULT_LOGIN_FIELD: 'username',
  15. DEFAULT_PASSWORD_FIELD: 'password',
  16. EARTH_RADIANS_MI: 3956.6,
  17. EARTH_RADIANS_KM: 6367.5,
  18. FORCE_CREATE_REQUEST: 'stackmob_force_create_request',
  19. ARRAY_FIELDNAME: 'stackmob_array_fieldname',
  20. ARRAY_VALUES: 'stackmob_array_values',
  21. CASCADE_DELETE: 'stackmob_cascade_delete',
  22. HARD_DELETE: true,
  23. SOFT_DELETE: false,
  24. apiVersion: 0,
  25. sdkVersion: "0.1.0",
  26. getDevAPIBase: function() { return "/"; },
  27. getProdAPIBase: function() { return "/"; },
  28. getCCAPIBase: function() { return "/"},
  29. METHOD_MAP: {
  30. "create": "POST",
  31. "read": "GET",
  32. "update": "PUT",
  33. "delete": "DELETE",
  34. "appendAndCreate": "POST",
  35. "appendAndSave": "PUT",
  36. "deleteAndSave": "DELETE",
  37. "login": "GET",
  38. "logout": "GET",
  39. "loginWithFacebookToken": "GET",
  40. "createUserWithFacebook": "GET",
  41. "linkUserWithFacebook": "GET",
  42. "cc": "GET"
  43. },
  44. /**
  45. * Convenience method to retrieve the value of a key in an object. If it's a function, give its return value.
  46. */
  47. getProperty: function(object, prop) {
  48. if (!(object && object[prop])) return null;
  49. return _.isFunction(object[prop]) ? object[prop]() : object[prop];
  50. },
  51. /**
  52. * Externally called by user to initialize their StackMob config.
  53. */
  54. init: function(options) {
  55. options = options || {};
  56. this.initStart(options); //placeholder for any actions a developer may want to implement via _extend
  57. this.userSchema = options['userSchema'] || this.DEFAULT_LOGIN_SCHEMA;
  58. this.loginField = options['loginField'] || this.DEFAULT_LOGIN_FIELD;
  59. this.passwordField = options['passwordField'] || this.DEFAULT_PASSWORD_FIELD;
  60. this.apiVersion = options['apiVersion'] || this.DEFAULT_API_VERSION;
  61. this.appName = this.getProperty(options, "appName") || this.throwError("An appName must be specified");
  62. this.clientSubdomain = this.getProperty(options, "clientSubdomain");
  63. if (options['dev'] && options['dev'] == true) {
  64. this.debug = true;
  65. this.urlRoot = options['urlRoot'] || this.getDevAPIBase();
  66. } else {
  67. this.debug = false;
  68. this.urlRoot = options['urlRoot'] || this.getProdAPIBase();
  69. }
  70. this.initEnd(options); //placeholder for any actions a developer may want to implement via _extend
  71. //Change to suppoer nodejs
  72. jsOAuth = require("./jsOAuth-1.3.3").OAuth(options);
  73. return this;
  74. },
  75. initStart: function(options) {},
  76. initEnd: function(options) {}
  77. };
  78. }).call(this);
  79. /**
  80. * StackMob JS SDK
  81. * BackBone.js-based
  82. * Backbone.js Version 0.5.3
  83. * No OAuth - for use with StackMob's HTML5 Product
  84. */
  85. (function(){
  86. var root = this;
  87. var $ = root.jQuery || root.Ext || root.Zepto;
  88. function isSencha() { return root.Ext; }
  89. function isZepto() { return root.Zepto; }
  90. _.extend(StackMob, {
  91. getDevAPIBase: function() { return "/"; },
  92. getProdAPIBase: function() { return "/"; },
  93. throwError: function(msg) {
  94. throw new Error(msg);
  95. },
  96. urlError: function() {
  97. throw new Error('A "url" property or function must be specified');
  98. },
  99. initEnd: function(options) {
  100. createStackMobModel();
  101. createStackMobCollection();
  102. createStackMobUserModel();
  103. },
  104. cc: function(method, params, options) {
  105. this.customcode(method, params, options);
  106. },
  107. customcode: function(method, params, options) {
  108. options = options || {};
  109. options['data'] = options['data'] || {};
  110. _.extend(options['data'], params);
  111. options['url'] = this.debug ? this.getDevAPIBase() : this.getProdAPIBase();
  112. this.sync.call(StackMob, method, null, options);
  113. },
  114. sync: function(method, model, options) {
  115. options = options || {};
  116. //Override to allow 'Model#save' to force create even if the id (primary key) is set in the model and hence !isNew() in BackBone
  117. var forceCreateRequest = options[StackMob.FORCE_CREATE_REQUEST] === true
  118. if (forceCreateRequest) {
  119. method = 'create';
  120. }
  121. function _prepareBaseURL(model, params) {
  122. //User didn't override the URL so use the one defined in the model
  123. if (!params['url']) {
  124. if (model) params['url'] = StackMob.getProperty(model, "url");
  125. }
  126. var notCustomCode = method != 'cc';
  127. var notNewModel = (model && model.isNew && !model.isNew());
  128. var notForcedCreateRequest = !forceCreateRequest;
  129. var isArrayMethod = (method == 'appendAndCreate' || method == 'appendAndSave' || method == 'deleteAndSave');
  130. if (_isExtraMethodVerb(method)) { //Extra Method Verb? Add it to the model url. (e.g. /user/login)
  131. params['url'] += (params['url'].charAt(params['url'].length - 1) == '/' ? '' : '/') + method;
  132. } else if (isArrayMethod || notCustomCode && notNewModel && notForcedCreateRequest) { //append ID in URL if necessary
  133. params['url'] += (params['url'].charAt(params['url'].length - 1) == '/' ? '' : '/') +
  134. encodeURIComponent(model.get(model.getPrimaryKeyField()));
  135. if (isArrayMethod) {
  136. params['url'] += '/' + options[StackMob.ARRAY_FIELDNAME];
  137. }
  138. if (method == 'deleteAndSave') {
  139. var ids = '';
  140. if (_.isArray(options[StackMob.ARRAY_VALUES])) {
  141. ids = _.map(options[StackMob.ARRAY_VALUES], function(id) { return encodeURIComponent(id); }).join(',');
  142. } else {
  143. ids = encodeURIComponent(options[StackMob.ARRAY_VALUES]);
  144. }
  145. params['url'] += '/' + ids
  146. }
  147. }
  148. }
  149. function _prepareHeaders(params, options) {
  150. //Prepare Request Headers
  151. params['headers'] = params['headers'] || {};
  152. //Add API Version Number to Request Headers
  153. _.extend(params['headers'], {
  154. "Accept": 'application/vnd.stackmob+json; version=' + StackMob['apiVersion'],
  155. "X-StackMob-User-Agent": "StackMob (JS; " + StackMob['sdkVersion'] + ")/" + StackMob['appName'],
  156. "X-StackMob-Proxy": "stackmob-api"
  157. });
  158. params['contentType'] = params['headers']['Accept'];
  159. if (!isNaN(options[StackMob.CASCADE_DELETE])) {
  160. params['headers']['X-StackMob-CascadeDelete'] = options[StackMob.CASCADE_DELETE] == true;
  161. }
  162. //If this is an advanced query, check headers
  163. if (options['query']) {
  164. //TODO throw error if no query object given
  165. var queryObj = params['query'] || throwError("No StackMobQuery object provided to the query call.");
  166. //Add Range Headers
  167. if (queryObj.range) {
  168. params['headers']['Range'] = 'objects=' + queryObj['range']['start'] + '-' + queryObj['range']['end'];
  169. }
  170. //Add Query Parameters to Parameter Map
  171. _.extend(params['data'], queryObj['params']);
  172. //Add OrderBy Headers
  173. if (queryObj['orderBy'] && queryObj['orderBy'].length > 0) {
  174. var orderList = queryObj['orderBy'];
  175. var order = '';
  176. var size = orderList.length;
  177. for(var i = 0; i < size; i++) {
  178. order += orderList[i];
  179. if (i + 1 < size) order += ',';
  180. }
  181. params['headers']["X-StackMob-OrderBy"] = order;
  182. }
  183. }
  184. }
  185. function _prepareRequestBody(method, params, options) {
  186. options = options || {};
  187. //Set json content type for POST/PUT calls
  188. //If this is a model, set the data to be the JSON representation of the model
  189. if (params['type'] == 'POST' || params['type'] == 'PUT') {
  190. if (method == 'appendAndCreate' || method == 'appendAndSave') {
  191. if (options && options[StackMob.ARRAY_VALUES]) params['data'] = JSON.stringify(options[StackMob.ARRAY_VALUES]);
  192. } else if (model) {
  193. var json = model.toJSON();
  194. delete json['lastmoddate'];
  195. delete json['createddate'];
  196. params['data'] = JSON.stringify(json);
  197. } else params['data'] = JSON.stringify(params.data);
  198. } else if (params['type'] == "GET") {
  199. if (!_.isEmpty(params['data'])) {
  200. params['url'] += '?';
  201. var keys = _.keys(params['data']);
  202. for (var i = 0; i < keys.length; i++) {
  203. var key = keys[i]
  204. var value = params['data'][key];
  205. params['url'] += key + '=' + value;
  206. if (i + 1 < keys.length) params['url'] += '&';
  207. }
  208. }
  209. delete params['data']; //we shouldn't be passing anything up as data in a GET call
  210. } else {
  211. delete params['data'];
  212. }
  213. }
  214. function _prepareAjaxClientParams(params) {
  215. params = params || {};
  216. //Prepare 3rd party ajax settings
  217. params['processData'] = false;
  218. //Put Accept into the header for jQuery
  219. params['accepts'] = params['headers']["Accept"];
  220. }
  221. function _isExtraMethodVerb(method) {
  222. return method != "create" && method != "update"
  223. && method != "delete" && method != "read" && method != "query" &&
  224. method != "deleteAndSave" && method != "appendAndSave" && method != "appendAndCreate";
  225. }
  226. function _makeOAuthAjaxCall(model, params) {
  227. var success = params['success'];
  228. var defaultSuccess = function(response) {
  229. if (response.text) {
  230. var result = JSON.parse(response.text);
  231. // CHANGE
  232. if(model.clear){
  233. model.clear();
  234. if (!model.set(result)) return false;
  235. success(model);
  236. }else{
  237. success(result);
  238. }
  239. }
  240. else success();
  241. };
  242. params['success'] = defaultSuccess;
  243. var error = params['error'];
  244. var defaultError = function(response) {
  245. var result = response.text ? JSON.parse(response.text) : response;
  246. (function(m, d) { error(d); }).call(StackMob, model, result);
  247. }
  248. params['error'] = defaultError;
  249. var hash = {};
  250. hash['url'] = params['url'];
  251. hash['headers'] = params['headers'];
  252. hash['success'] = params['success'];
  253. hash['failure'] = params['error'];
  254. hash['method'] = params['type'];
  255. hash['data'] = params['data'];
  256. // CHANGE
  257. if (hash['method'] === "PUT" || hash['method'] === "POST") {
  258. hash['headers']["Content-Type"] = "application/json"
  259. }
  260. return jsOAuth.request(hash);
  261. }
  262. function _makeSenchaAjaxCall(model, params) {
  263. var success = params['success'];
  264. var defaultSuccess = function(response, options) {
  265. if (response.responseText) {
  266. var result = JSON.parse(response.responseText);
  267. model.clear();
  268. if (!model.set(result)) return false;
  269. success(model);
  270. }
  271. else success();
  272. };
  273. params['success'] = defaultSuccess;
  274. var error = params['error'];
  275. var defaultError = function(response, request) {
  276. var result = response.responseText ? JSON.parse(response.responseText) : response;
  277. (function(m, d) { error(d); }).call(StackMob, model, result);
  278. }
  279. params['error'] = defaultError;
  280. var hash = {};
  281. hash['url'] = params['url'];
  282. hash['headers'] = params['headers'];
  283. hash['params'] = params['data'];
  284. hash['success'] = params['success'];
  285. hash['failure'] = params['error'];
  286. hash['disableCaching'] = false;
  287. hash['method'] = params['type'];
  288. return $.Ajax.request(hash);
  289. }
  290. function _makeZeptoAjaxCall(model, params) {
  291. var success = params['success'];
  292. var defaultSuccess = function(response, result, xhr) {
  293. if (response) {
  294. var result = JSON.parse(response);
  295. model.clear();
  296. if (!model.set(result)) return false;
  297. success(model);
  298. }
  299. else success();
  300. };
  301. params['success'] = defaultSuccess;
  302. var error = params['error'];
  303. var defaultError = function(response, request) {
  304. var result = response.responseText ? JSON.parse(response.responseText) : response;
  305. (function(m, d) { error(d); }).call(StackMob, model, result);
  306. }
  307. params['error'] = defaultError;
  308. var hash = {};
  309. hash['url'] = params['url'];
  310. hash['headers'] = params['headers'];
  311. hash['type'] = params['type'];
  312. hash['data'] = params['data'];
  313. hash['success'] = defaultSuccess;
  314. hash['error'] = defaultError;
  315. return $.ajax(hash);
  316. }
  317. function _makeJQueryAjaxCall(model, params) {
  318. params['beforeSend'] = function(jqXHR, settings) {
  319. jqXHR.setRequestHeader("Accept", settings['accepts']);
  320. if (!_.isEmpty(settings['headers'])) {
  321. for (key in settings['headers']) {
  322. jqXHR.setRequestHeader(key, settings['headers'][key]);
  323. }
  324. }
  325. };
  326. var success = params['success'];
  327. var defaultSuccess = function(model, response, xhr) {
  328. var result;
  329. if (model && model.toJSON) {
  330. result = model;
  331. } else if (model && (model.responseText || model.text)) {
  332. var json = JSON.parse(model.responseText || model.text);
  333. result = json;
  334. } else if (model) {
  335. result = model;
  336. }
  337. if (success) success(result);
  338. };
  339. params['success'] = defaultSuccess;
  340. var err = params['error'];
  341. params['error'] = function(jqXHR, textStatus, errorThrown) {
  342. if (jqXHR.status == 302 && jqXHR.getResponseHeader("locations")) {
  343. //we have a redirect to a new cluster
  344. //console.log("We should move this to " + jqXHR.getResponseHeader("locations"));
  345. }
  346. var data;
  347. if (jqXHR && (jqXHR.responseText || jqXHR.text)) {
  348. var result = JSON.parse(jqXHR.responseText || jqXHR.text);
  349. data = result;
  350. }
  351. (function(m, d) { err(d); }).call(StackMob, model, data);
  352. }
  353. return $.ajax(params);
  354. }
  355. //Determine what kind of call to make: GET, POST, PUT, DELETE
  356. var type = StackMob.METHOD_MAP[method] || 'GET';
  357. //Prepare query configuration
  358. var params = _.extend({
  359. type: type,
  360. dataType: 'json'
  361. }, options);
  362. params['data'] = params['data'] || {};
  363. _prepareBaseURL(model, params);
  364. _prepareHeaders(params, options);
  365. _prepareRequestBody(method, params, options);
  366. _prepareAjaxClientParams(params);
  367. if (isSencha()) {
  368. return _makeSenchaAjaxCall(model, params);
  369. } else if (isZepto()) {
  370. return _makeZeptoAjaxCall(model, params);
  371. } else {
  372. return _makeOAuthAjaxCall(model, params);
  373. // return _makeJQueryAjaxCall(model, params);
  374. };
  375. }
  376. }); //end of StackMob
  377. var createStackMobModel = function() {
  378. /**
  379. * Abstract Class representing a StackMob Model
  380. */
  381. StackMob.Model = Backbone.Model.extend({
  382. urlRoot: StackMob['urlRoot'],
  383. url: function() {
  384. var base = StackMob['urlRoot'] || StackMob.urlError();
  385. base += this.schemaName;
  386. return base;
  387. },
  388. getPrimaryKeyField: function() {
  389. return this.schemaName + '_id';
  390. },
  391. constructor: function() {
  392. this.setIDAttribute(); //have to do this because I want to set this.id before this.set is called in default constructor
  393. Backbone.Model.prototype.constructor.apply(this, arguments);
  394. },
  395. initialize: function(attributes, options) {
  396. StackMob.getProperty(this, 'schemaName') || StackMob.throwError('A schemaName must be defined');
  397. this.setIDAttribute();
  398. },
  399. setIDAttribute: function() {
  400. this.idAttribute = this.getPrimaryKeyField();
  401. },
  402. parse: function(data, xhr) {
  403. if (!data || (data && (!data['text'] || data['text'] == '') )) return data;
  404. var attrs = JSON.parse(data['text']);
  405. return attrs;
  406. },
  407. sync: function(method, model, options) {
  408. StackMob.sync.call(this, method, this, options);
  409. },
  410. create: function(options) {
  411. var newOptions = {};
  412. newOptions[StackMob.FORCE_CREATE_REQUEST] = true;
  413. _.extend(newOptions, options)
  414. this.save(null, newOptions);
  415. },
  416. fetchExpanded: function(depth, options) {
  417. if (depth < 0 || depth > 3) StackMob.throwError('Depth must be between 0 and 3 inclusive.');
  418. var newOptions = {};
  419. _.extend(newOptions, options);
  420. newOptions['data'] = newOptions['data'] || {};
  421. newOptions['data']['_expand'] = depth;
  422. this.fetch(newOptions);
  423. },
  424. getAsModel: function(fieldName, model) {
  425. var obj = this.get(fieldName);
  426. if (!obj) return {};
  427. else {
  428. if (_.isArray(obj)) {
  429. return _.map(obj, function(o) {
  430. return new model(o);
  431. });
  432. } else {
  433. return new model(obj);
  434. }
  435. }
  436. },
  437. appendAndCreate: function(fieldName, values, options) {
  438. options = options || {};
  439. options[StackMob.ARRAY_FIELDNAME] = fieldName;
  440. options[StackMob.ARRAY_VALUES] = values;
  441. StackMob.sync.call(this, 'appendAndCreate', this, options);
  442. },
  443. appendAndSave: function(fieldName, values, options) {
  444. options = options || {};
  445. options[StackMob.ARRAY_FIELDNAME] = fieldName;
  446. options[StackMob.ARRAY_VALUES] = values;
  447. StackMob.sync.call(this, 'appendAndSave', this, options);
  448. },
  449. deleteAndSave: function(fieldName, values, cascadeDelete, options) {
  450. options = options || {};
  451. options[StackMob.ARRAY_FIELDNAME] = fieldName;
  452. options[StackMob.ARRAY_VALUES] = values;
  453. options[StackMob.CASCADE_DELETE] = cascadeDelete;
  454. StackMob.sync.call(this, 'deleteAndSave', this, options);
  455. }
  456. });
  457. };
  458. var createStackMobCollection = function() {
  459. StackMob.Collection = Backbone.Collection.extend({
  460. initialize: function() {
  461. this.model || StackMob.throwError('Please specify a StackMobModel for this collection via.. var YourCollection = StackMobCollection.extend({ model: YourStackMobModelClass });');
  462. this.schemaName = (new this.model()).schemaName;
  463. },
  464. url: function () {
  465. var base = StackMob['urlRoot'] || StackMob.urlError();
  466. base += this.schemaName;
  467. return base;
  468. },
  469. parse: function(data, xhr) {
  470. if (!data || (data && (!data['text'] || data['text'] == '') )) return data;
  471. var attrs = JSON.parse(data['text']);
  472. return attrs;
  473. },
  474. sync: function(method, model, options) {
  475. StackMob.sync.call(this, method, this, options);
  476. },
  477. query: function(stackMobQuery, options) {
  478. options = options || {};
  479. _.extend(options, { query: stackMobQuery })
  480. this.fetch(options);
  481. },
  482. create: function(model, options) {
  483. var newOptions = {};
  484. newOptions[StackMob.FORCE_CREATE_REQUEST] = true;
  485. _.extend(newOptions, options);
  486. Backbone.Collection.prototype.create.call(this, model, newOptions);
  487. }
  488. });
  489. };
  490. var createStackMobUserModel = function() {
  491. /**
  492. * User object
  493. */
  494. StackMob.User = StackMob.Model.extend({
  495. idAttribute: StackMob['loginField'],
  496. schemaName: 'user',
  497. getPrimaryKeyField: function() { return StackMob.loginField; },
  498. loginWithFacebookToken: function(facebookAccessToken, keepLoggedIn, options) {
  499. options = options || {};
  500. options['data'] = options['data'] || {};
  501. _.extend(options['data'],
  502. {
  503. "fb_at": facebookAccessToken
  504. });
  505. (this.sync || Backbone.sync).call(this, "facebookLogin", this, options);
  506. },
  507. createUserWithFacebook: function(facebookAccessToken, options) {
  508. options = options || {};
  509. options['data'] = options['data'] || {};
  510. _.extend(options['data'],
  511. {
  512. "fb_at": facebookAccessToken
  513. });
  514. options['data'][StackMob.loginField] = options[StackMob['loginField']] || this.get(StackMob['loginField']);
  515. (this.sync || Backbone.sync).call(this, "createUserWithFacebook", this, options);
  516. },
  517. //Use after a user has logged in with a regular user account and you want to add Facebook to their account
  518. linkUserWithFacebook: function(facebookAccessToken, options) {
  519. options = options || {};
  520. options['data'] = options['data'] || {};
  521. _.extend(options['data'],
  522. {
  523. "fb_at": facebookAccessToken
  524. });
  525. (this.sync || Backbone.sync).call(this, "linkUserWithFacebook", this, options);
  526. },
  527. login: function(keepLoggedIn, options) {
  528. options = options || {};
  529. var remember = isNaN(keepLoggedIn) ? false : keepLoggedIn;
  530. options['data'] = options['data'] || {};
  531. options['data'][StackMob.loginField] = this.get(StackMob.loginField);
  532. options['data'][StackMob.passwordField] = this.get(StackMob.passwordField);
  533. (this.sync || Backbone.sync).call(this, "login", this, options);
  534. },
  535. logout: function(options) {
  536. (this.sync || Backbone.sync).call(this, "logout", this, options);
  537. }
  538. });
  539. /**
  540. * Collection of users
  541. */
  542. StackMob.Users = StackMob.Collection.extend({
  543. model: StackMob.User
  544. });
  545. /*
  546. * Object to help users make StackMob Queries
  547. *
  548. * //Example query for users with age < 25, order by age ascending. Return second set of 25 results.
  549. * var q = new StackMob.Query();
  550. * q.lt('age', 25).orderByAsc('age').setRange(25, 49);
  551. */
  552. StackMob.GeoPoint = function(lat, lon) {
  553. if (_.isNumber(lat)) {
  554. this.lat = lat;
  555. this.lon = lon;
  556. } else {
  557. this.lat = lat['lat'];
  558. this.lon = lat['lon'];
  559. }
  560. }
  561. StackMob.GeoPoint.prototype.toJSON = function() {
  562. return {
  563. lat: this.lat,
  564. lon: this.lon
  565. };
  566. }
  567. StackMob.Collection.Query = function() {
  568. this.params = {};
  569. this.orderBy = [];
  570. this.range = null;
  571. }
  572. //Give the StackMobQuery its methods
  573. _.extend(StackMob.Collection.Query.prototype, {
  574. addParam: function(key, value) {
  575. this.params[key] = value;
  576. return this;
  577. },
  578. equals: function(field, value) {
  579. this.params[field] = value;
  580. return this;
  581. },
  582. lt: function(field, value) {
  583. this.params[field + '[lt]'] = value;
  584. return this;
  585. },
  586. lte: function(field, value) {
  587. this.params[field + '[lte]'] = value;
  588. return this;
  589. },
  590. gt: function(field, value) {
  591. this.params[field + '[gt]'] = value;
  592. return this;
  593. },
  594. gte: function(field, value) {
  595. this.params[field + '[gte]'] = value;
  596. return this;
  597. },
  598. mustBeOneOf: function(field, value) {
  599. var inValue = '';
  600. if (_.isArray(value)) {
  601. var newValue = '';
  602. var size = value.length;
  603. for (var i = 0; i < size; i++) {
  604. inValue += value[i];
  605. if (i + 1 < size) inValue += ',';
  606. }
  607. } else inValue = value;
  608. this.params[field + '[in]'] = inValue;
  609. return this;
  610. },
  611. orderAsc: function(field) {
  612. this.orderBy.push(field + ':asc');
  613. return this;
  614. },
  615. orderDesc: function(field) {
  616. this.orderBy.push(field + ':desc');
  617. return this;
  618. },
  619. setRange: function(start, end){
  620. this.range = { 'start': start, 'end': end };
  621. return this;
  622. },
  623. setExpand: function(depth) {
  624. this.params['_expand'] = depth;
  625. return this;
  626. },
  627. mustBeNear: function(field, smGeoPoint, distance) {
  628. this.params[field + '[near]'] = smGeoPoint.lat + ',' + smGeoPoint.lon + ',' + distance;
  629. return this;
  630. },
  631. mustBeNearMi: function(field, smGeoPoint, miles) {
  632. this.mustBeNear(field, smGeoPoint, miles / StackMob.EARTH_RADIANS_MI);
  633. return this;
  634. },
  635. mustBeNearKm: function(field, smGeoPoint, miles) {
  636. this.mustBeNear(field, smGeoPoint, miles / StackMob.EARTH_RADIANS_KM);
  637. return this;
  638. },
  639. isWithin: function(field, smGeoPoint, distance) {
  640. this.params[field + '[within]'] = smGeoPoint.lat + ',' + smGeoPoint.lon + ',' + distance;
  641. return this;
  642. },
  643. isWithinMi: function(field, smGeoPoint, distance) {
  644. this.isWithin(field, smGeoPoint, distance / StackMob.EARTH_RADIANS_MI);
  645. return this;
  646. },
  647. isWithinKm: function(field, smGeoPoint, distance) {
  648. this.isWithin(field, smGeoPoint, distance / StackMob.EARTH_RADIANS_KM);
  649. return this;
  650. },
  651. isWithinBox: function(field, smGeoPoint1, smGeoPoint2) {
  652. this.params[field + '[within]'] = smGeoPoint1.lat + ',' + smGeoPoint1.lon + ',' + smGeoPoint2.lat + ',' + smGeoPoint2.lon;
  653. return this;
  654. }
  655. }); //end extend StackMobQuery.prototype
  656. };
  657. }).call(this);