algoliasearch-rails 1.11.13 → 1.11.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9be5a5fb846cd1b9ed0d12c44095c61a835ce7a5
4
- data.tar.gz: cedec1523035e705924bec9e8daa8b8f9a78ef21
3
+ metadata.gz: a7b3d9e0a8e4c99410af478ac78778874106386d
4
+ data.tar.gz: f683877fcee4845908424990bf29ae2f127bb2e7
5
5
  SHA512:
6
- metadata.gz: 54ec71dcde9a65f9eac7c3b682ec4ff226fe6637e00185a740e4b85adafb556fcebd636b31b1199e1c1cc6c8e72ba05e302c9ed744e7becbab7c8baf546ada55
7
- data.tar.gz: d53d349f96bdf6b56c2998f649d4f8ecdae68cf354178b9d59eca05e3f9403c2f1caa1da8999bf9334dbbf5089a908f29fd6080bcbacc5679dae5e3bc6363984
6
+ metadata.gz: 739b503dc381838bc5a3da1b5c44063175fafcc024f71802050d97abe2b6bf814344ddf3abaecfb105425ef3c750bcfab1d8addf99c8897e52c222073910070d
7
+ data.tar.gz: f99ed457e8a65e38703862da6bd619f8a11e2213b3c25b767f537d41873d09f5161fc51de0bd0d258b5454e0af34449ad82a648e53442d67aae11b43ae27171c
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.11.13
1
+ 1.11.14
@@ -21,7 +21,7 @@
21
21
  * THE SOFTWARE.
22
22
  */
23
23
 
24
- var ALGOLIA_VERSION = '2.8.6';
24
+ var ALGOLIA_VERSION = '2.9.2';
25
25
 
26
26
  /*
27
27
  * Copyright (c) 2013 Algolia
@@ -68,6 +68,10 @@ var AlgoliaSearch = function(applicationID, apiKey, methodOrOptions, resolveDNS,
68
68
  this.requestTimeoutInMs = 2000;
69
69
  this.extraHeaders = [];
70
70
  this.jsonp = null;
71
+ this.options = {};
72
+
73
+ // make sure every client instance has it's own cache
74
+ this.cache = {};
71
75
 
72
76
  var method;
73
77
  var tld = 'net';
@@ -76,6 +80,7 @@ var AlgoliaSearch = function(applicationID, apiKey, methodOrOptions, resolveDNS,
76
80
  } else {
77
81
  // Take all option from the hash
78
82
  var options = methodOrOptions || {};
83
+ this.options = options;
79
84
  if (!this._isUndefined(options.method)) {
80
85
  method = options.method;
81
86
  }
@@ -131,6 +136,13 @@ var AlgoliaSearch = function(applicationID, apiKey, methodOrOptions, resolveDNS,
131
136
  this.hosts.unshift(this.host_protocol + this.applicationID + '-dsn.algolia.' + tld);
132
137
  }
133
138
  }
139
+ // angular dependencies injection
140
+ if (this.options.angular) {
141
+ this.options.angular.$injector.invoke(['$http', '$q', function ($http, $q) {
142
+ self.options.angular.$q = $q;
143
+ self.options.angular.$http = $http;
144
+ }]);
145
+ }
134
146
  };
135
147
 
136
148
  function AlgoliaExplainResults(hit, titleAttribute, otherAttributes) {
@@ -163,7 +175,7 @@ function AlgoliaExplainResults(hit, titleAttribute, otherAttributes) {
163
175
  }
164
176
  return res;
165
177
  }
166
-
178
+
167
179
  function _getHitExplanationForOneAttr(hit, foundWords, attr) {
168
180
  var base = hit._highlightResult || hit;
169
181
  if (attr.indexOf('.') === -1) {
@@ -219,7 +231,7 @@ AlgoliaSearch.prototype = {
219
231
  * content: the server answer that contains the task ID
220
232
  */
221
233
  deleteIndex: function(indexName, callback) {
222
- this._jsonRequest({ method: 'DELETE',
234
+ return this._jsonRequest({ method: 'DELETE',
223
235
  url: '/1/indexes/' + encodeURIComponent(indexName),
224
236
  callback: callback });
225
237
  },
@@ -233,7 +245,7 @@ AlgoliaSearch.prototype = {
233
245
  */
234
246
  moveIndex: function(srcIndexName, dstIndexName, callback) {
235
247
  var postObj = {operation: 'move', destination: dstIndexName};
236
- this._jsonRequest({ method: 'POST',
248
+ return this._jsonRequest({ method: 'POST',
237
249
  url: '/1/indexes/' + encodeURIComponent(srcIndexName) + '/operation',
238
250
  body: postObj,
239
251
  callback: callback });
@@ -249,7 +261,7 @@ AlgoliaSearch.prototype = {
249
261
  */
250
262
  copyIndex: function(srcIndexName, dstIndexName, callback) {
251
263
  var postObj = {operation: 'copy', destination: dstIndexName};
252
- this._jsonRequest({ method: 'POST',
264
+ return this._jsonRequest({ method: 'POST',
253
265
  url: '/1/indexes/' + encodeURIComponent(srcIndexName) + '/operation',
254
266
  body: postObj,
255
267
  callback: callback });
@@ -270,7 +282,7 @@ AlgoliaSearch.prototype = {
270
282
  length = 10;
271
283
  }
272
284
 
273
- this._jsonRequest({ method: 'GET',
285
+ return this._jsonRequest({ method: 'GET',
274
286
  url: '/1/logs?offset=' + offset + '&length=' + length,
275
287
  callback: callback });
276
288
  },
@@ -283,8 +295,8 @@ AlgoliaSearch.prototype = {
283
295
  * @param page The page to retrieve, starting at 0.
284
296
  */
285
297
  listIndexes: function(callback, page) {
286
- var params = page ? '?page=' + page : '';
287
- this._jsonRequest({ method: 'GET',
298
+ var params = typeof page !== 'undefined' ? '?page=' + page : '';
299
+ return this._jsonRequest({ method: 'GET',
288
300
  url: '/1/indexes' + params,
289
301
  callback: callback });
290
302
  },
@@ -306,7 +318,7 @@ AlgoliaSearch.prototype = {
306
318
  * content: the server answer with user keys list or error description if success is false.
307
319
  */
308
320
  listUserKeys: function(callback) {
309
- this._jsonRequest({ method: 'GET',
321
+ return this._jsonRequest({ method: 'GET',
310
322
  url: '/1/keys',
311
323
  callback: callback });
312
324
  },
@@ -318,7 +330,7 @@ AlgoliaSearch.prototype = {
318
330
  * content: the server answer with user keys list or error description if success is false.
319
331
  */
320
332
  getUserKeyACL: function(key, callback) {
321
- this._jsonRequest({ method: 'GET',
333
+ return this._jsonRequest({ method: 'GET',
322
334
  url: '/1/keys/' + key,
323
335
  callback: callback });
324
336
  },
@@ -330,7 +342,7 @@ AlgoliaSearch.prototype = {
330
342
  * content: the server answer with user keys list or error description if success is false.
331
343
  */
332
344
  deleteUserKey: function(key, callback) {
333
- this._jsonRequest({ method: 'DELETE',
345
+ return this._jsonRequest({ method: 'DELETE',
334
346
  url: '/1/keys/' + key,
335
347
  callback: callback });
336
348
  },
@@ -352,7 +364,7 @@ AlgoliaSearch.prototype = {
352
364
  addUserKey: function(acls, callback) {
353
365
  var aclsObject = {};
354
366
  aclsObject.acl = acls;
355
- this._jsonRequest({ method: 'POST',
367
+ return this._jsonRequest({ method: 'POST',
356
368
  url: '/1/keys',
357
369
  body: aclsObject,
358
370
  callback: callback });
@@ -382,7 +394,7 @@ AlgoliaSearch.prototype = {
382
394
  aclsObject.validity = validity;
383
395
  aclsObject.maxQueriesPerIPPerHour = maxQueriesPerIPPerHour;
384
396
  aclsObject.maxHitsPerQuery = maxHitsPerQuery;
385
- this._jsonRequest({ method: 'POST',
397
+ return this._jsonRequest({ method: 'POST',
386
398
  url: '/1/indexes/' + indexObj.indexName + '/keys',
387
399
  body: aclsObject,
388
400
  callback: callback });
@@ -476,13 +488,13 @@ AlgoliaSearch.prototype = {
476
488
  }, delay);
477
489
  as.onDelayTrigger = onDelayTrigger;
478
490
  } else {
479
- this._sendQueriesBatch(params, callback);
491
+ return this._sendQueriesBatch(params, callback);
480
492
  }
481
493
  },
482
494
 
483
495
  /**
484
496
  * Set the number of milliseconds a request can take before automatically being terminated.
485
- *
497
+ *
486
498
  * @param {Number} milliseconds
487
499
  */
488
500
  setRequestTimeout: function(milliseconds)
@@ -501,10 +513,13 @@ AlgoliaSearch.prototype = {
501
513
  this.as = algoliasearch;
502
514
  this.typeAheadArgs = null;
503
515
  this.typeAheadValueOption = null;
516
+
517
+ // make sure every index instance has it's own cache
518
+ this.cache = {};
504
519
  },
505
520
  /**
506
521
  * Add an extra field to the HTTP request
507
- *
522
+ *
508
523
  * @param key the header field name
509
524
  * @param value the header field value
510
525
  */
@@ -516,7 +531,7 @@ AlgoliaSearch.prototype = {
516
531
 
517
532
  if (this.jsonp === null) {
518
533
  var self = this;
519
- this._jsonRequest({ cache: this.cache,
534
+ return this._jsonRequest({ cache: this.cache,
520
535
  method: 'POST',
521
536
  url: '/1/indexes/*/queries',
522
537
  body: params,
@@ -538,13 +553,13 @@ AlgoliaSearch.prototype = {
538
553
  jsonpParams += i + '=' + encodeURIComponent(q) + '&';
539
554
  }
540
555
  var pObj = {params: jsonpParams};
541
- this._jsonRequest({ cache: this.cache,
556
+ return this._jsonRequest({ cache: this.cache,
542
557
  method: 'GET',
543
558
  url: '/1/indexes/*',
544
- body: pObj,
559
+ body: pObj,
545
560
  callback: callback });
546
561
  } else {
547
- this._jsonRequest({ cache: this.cache,
562
+ return this._jsonRequest({ cache: this.cache,
548
563
  method: 'POST',
549
564
  url: '/1/indexes/*/queries',
550
565
  body: params,
@@ -559,32 +574,40 @@ AlgoliaSearch.prototype = {
559
574
  var callback = opts.callback;
560
575
  var cache = null;
561
576
  var cacheID = opts.url;
577
+ var deferred = null;
578
+ if (this.options.jQuery) {
579
+ deferred = this.options.jQuery.$.Deferred();
580
+ deferred.promise = deferred.promise(); // promise is a property in angular
581
+ } else if (this.options.angular) {
582
+ deferred = this.options.angular.$q.defer();
583
+ }
584
+
562
585
  if (!this._isUndefined(opts.body)) {
563
586
  cacheID = opts.url + '_body_' + JSON.stringify(opts.body);
564
587
  }
565
588
  if (!this._isUndefined(opts.cache)) {
566
589
  cache = opts.cache;
567
590
  if (!this._isUndefined(cache[cacheID])) {
568
- if (!this._isUndefined(callback)) {
591
+ if (!this._isUndefined(callback) && callback) {
569
592
  setTimeout(function () { callback(true, cache[cacheID]); }, 1);
570
593
  }
571
- return;
594
+ deferred && deferred.resolve(cache[cacheID]);
595
+ return deferred && deferred.promise;
572
596
  }
573
597
  }
574
598
 
575
599
  opts.successiveRetryCount = 0;
576
600
  var impl = function() {
577
601
  if (opts.successiveRetryCount >= self.hosts.length) {
578
- if (!self._isUndefined(callback)) {
602
+ var error = { message: 'Cannot connect the Algolia\'s Search API. Please send an email to support@algolia.com to report the issue.' };
603
+ if (!self._isUndefined(callback) && callback) {
579
604
  opts.successiveRetryCount = 0;
580
- callback(false, { message: 'Cannot connect the Algolia\'s Search API. Please send an email to support@algolia.com to report the issue.' });
605
+ callback(false, error);
581
606
  }
607
+ deferred && deferred.reject(error);
582
608
  return;
583
609
  }
584
- opts.callback = function(retry, success, res, body) {
585
- if (!success && !self._isUndefined(body)) {
586
- window.console && console.log('Error: ' + body.message);
587
- }
610
+ opts.callback = function(retry, success, obj, body) {
588
611
  if (success && !self._isUndefined(opts.cache)) {
589
612
  cache[cacheID] = body;
590
613
  }
@@ -594,7 +617,8 @@ AlgoliaSearch.prototype = {
594
617
  impl();
595
618
  } else {
596
619
  opts.successiveRetryCount = 0;
597
- if (!self._isUndefined(callback)) {
620
+ deferred && (success ? deferred.resolve(body) : deferred.reject(body));
621
+ if (!self._isUndefined(callback) && callback) {
598
622
  callback(success, body);
599
623
  }
600
624
  }
@@ -603,6 +627,8 @@ AlgoliaSearch.prototype = {
603
627
  self._jsonRequestByHost(opts);
604
628
  };
605
629
  impl();
630
+
631
+ return deferred && deferred.promise;
606
632
  },
607
633
 
608
634
  _jsonRequestByHost: function(opts) {
@@ -611,11 +637,106 @@ AlgoliaSearch.prototype = {
611
637
 
612
638
  if (this.jsonp) {
613
639
  this._makeJsonpRequestByHost(url, opts);
640
+ } else if (this.options.jQuery) {
641
+ this._makejQueryRequestByHost(url, opts);
642
+ } else if (this.options.angular) {
643
+ this._makeAngularRequestByHost(url, opts);
614
644
  } else {
615
645
  this._makeXmlHttpRequestByHost(url, opts);
616
646
  }
617
647
  },
618
648
 
649
+ /**
650
+ * Make a $http
651
+ *
652
+ * @param url request url (includes endpoint and path)
653
+ * @param opts all request opts
654
+ */
655
+ _makeAngularRequestByHost: function(url, opts) {
656
+ var self = this;
657
+ var body = null;
658
+
659
+ if (!this._isUndefined(opts.body)) {
660
+ body = JSON.stringify(opts.body);
661
+ }
662
+
663
+ url += ((url.indexOf('?') === -1) ? '?' : '&') + 'X-Algolia-API-Key=' + this.apiKey;
664
+ url += '&X-Algolia-Application-Id=' + this.applicationID;
665
+ if (this.userToken) {
666
+ url += '&X-Algolia-UserToken=' + encodeURIComponent(this.userToken);
667
+ }
668
+ if (this.tagFilters) {
669
+ url += '&X-Algolia-TagFilters=' + encodeURIComponent(this.tagFilters);
670
+ }
671
+ for (var i = 0; i < this.extraHeaders.length; ++i) {
672
+ url += '&' + this.extraHeaders[i].key + '=' + this.extraHeaders[i].value;
673
+ }
674
+ this.options.angular.$http({
675
+ url: url,
676
+ method: opts.method,
677
+ data: body,
678
+ cache: false,
679
+ timeout: (this.requestTimeoutInMs * (opts.successiveRetryCount + 1))
680
+ }).then(function(response) {
681
+ opts.callback(false, true, null, response.data);
682
+ }, function(response) {
683
+ if (response.status === 0) {
684
+ // xhr.timeout is not handled by Angular.js right now
685
+ // let's retry
686
+ opts.callback(true, false, null, response.data);
687
+ } else if (response.status == 400 || response.status === 403 || response.status === 404) {
688
+ opts.callback(false, false, null, response.data);
689
+ } else {
690
+ opts.callback(true, false, null, response.data);
691
+ }
692
+ });
693
+ },
694
+
695
+ /**
696
+ * Make a $.ajax
697
+ *
698
+ * @param url request url (includes endpoint and path)
699
+ * @param opts all request opts
700
+ */
701
+ _makejQueryRequestByHost: function(url, opts) {
702
+ var self = this;
703
+ var body = null;
704
+
705
+ if (!this._isUndefined(opts.body)) {
706
+ body = JSON.stringify(opts.body);
707
+ }
708
+
709
+ url += ((url.indexOf('?') === -1) ? '?' : '&') + 'X-Algolia-API-Key=' + this.apiKey;
710
+ url += '&X-Algolia-Application-Id=' + this.applicationID;
711
+ if (this.userToken) {
712
+ url += '&X-Algolia-UserToken=' + encodeURIComponent(this.userToken);
713
+ }
714
+ if (this.tagFilters) {
715
+ url += '&X-Algolia-TagFilters=' + encodeURIComponent(this.tagFilters);
716
+ }
717
+ for (var i = 0; i < this.extraHeaders.length; ++i) {
718
+ url += '&' + this.extraHeaders[i].key + '=' + this.extraHeaders[i].value;
719
+ }
720
+ this.options.jQuery.$.ajax(url, {
721
+ type: opts.method,
722
+ timeout: (this.requestTimeoutInMs * (opts.successiveRetryCount + 1)),
723
+ dataType: 'json',
724
+ data: body,
725
+ error: function(xhr, textStatus, error) {
726
+ if (textStatus === 'timeout') {
727
+ opts.callback(true, false, null, { 'message': 'Timeout - Could not connect to endpoint ' + url } );
728
+ } else if (xhr.status === 400 || xhr.status === 403 || xhr.status === 404) {
729
+ opts.callback(false, false, null, xhr.responseJSON );
730
+ } else {
731
+ opts.callback(true, false, null, { 'message': error } );
732
+ }
733
+ },
734
+ success: function(data, textStatus, xhr) {
735
+ opts.callback(false, true, null, data);
736
+ }
737
+ });
738
+ },
739
+
619
740
  /**
620
741
  * Make a JSONP request
621
742
  *
@@ -706,7 +827,7 @@ AlgoliaSearch.prototype = {
706
827
 
707
828
  /**
708
829
  * Make a XmlHttpRequest
709
- *
830
+ *
710
831
  * @param url request url (includes endpoint and path)
711
832
  * @param opts all request opts
712
833
  */
@@ -768,7 +889,6 @@ AlgoliaSearch.prototype = {
768
889
  ontimeout = null;
769
890
 
770
891
  if (!self._isUndefined(event) && event.target !== null) {
771
- var retry = (event.target.status === 0 || event.target.status === 503);
772
892
  var success = false;
773
893
  var response = null;
774
894
 
@@ -776,12 +896,12 @@ AlgoliaSearch.prototype = {
776
896
  // Handle CORS requests IE8/IE9
777
897
  response = event.target.responseText;
778
898
  success = (response && response.length > 0);
779
- }
780
- else {
899
+ } else {
781
900
  response = event.target.response;
782
901
  success = (event.target.status === 200 || event.target.status === 201);
783
902
  }
784
903
 
904
+ var retry = !success && event.target.status !== 400 && event.target.status !== 403 && event.target.status !== 404;
785
905
  opts.callback(retry, success, event.target, response ? JSON.parse(response) : null);
786
906
  } else {
787
907
  opts.callback(false, true, event, JSON.parse(xmlHttp.responseText));
@@ -823,7 +943,6 @@ AlgoliaSearch.prototype = {
823
943
  tagFilters: null,
824
944
  userToken: null,
825
945
  hosts: [],
826
- cache: {},
827
946
  extraHeaders: []
828
947
  };
829
948
 
@@ -851,12 +970,12 @@ AlgoliaSearch.prototype.Index.prototype = {
851
970
  addObject: function(content, callback, objectID) {
852
971
  var indexObj = this;
853
972
  if (this.as._isUndefined(objectID)) {
854
- this.as._jsonRequest({ method: 'POST',
973
+ return this.as._jsonRequest({ method: 'POST',
855
974
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName),
856
975
  body: content,
857
976
  callback: callback });
858
977
  } else {
859
- this.as._jsonRequest({ method: 'PUT',
978
+ return this.as._jsonRequest({ method: 'PUT',
860
979
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(objectID),
861
980
  body: content,
862
981
  callback: callback });
@@ -879,7 +998,7 @@ AlgoliaSearch.prototype.Index.prototype = {
879
998
  body: objects[i] };
880
999
  postObj.requests.push(request);
881
1000
  }
882
- this.as._jsonRequest({ method: 'POST',
1001
+ return this.as._jsonRequest({ method: 'POST',
883
1002
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/batch',
884
1003
  body: postObj,
885
1004
  callback: callback });
@@ -894,6 +1013,10 @@ AlgoliaSearch.prototype.Index.prototype = {
894
1013
  * @param attributes (optional) if set, contains the array of attribute names to retrieve
895
1014
  */
896
1015
  getObject: function(objectID, callback, attributes) {
1016
+ if (Object.prototype.toString.call(callback) === '[object Array]' && !attributes) {
1017
+ attributes = callback;
1018
+ callback = null;
1019
+ }
897
1020
  var indexObj = this;
898
1021
  var params = '';
899
1022
  if (!this.as._isUndefined(attributes)) {
@@ -906,12 +1029,12 @@ AlgoliaSearch.prototype.Index.prototype = {
906
1029
  }
907
1030
  }
908
1031
  if (this.as.jsonp === null) {
909
- this.as._jsonRequest({ method: 'GET',
1032
+ return this.as._jsonRequest({ method: 'GET',
910
1033
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(objectID) + params,
911
1034
  callback: callback });
912
1035
  } else {
913
1036
  var pObj = {params: params};
914
- this.as._jsonRequest({ method: 'GET',
1037
+ return this.as._jsonRequest({ method: 'GET',
915
1038
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(objectID),
916
1039
  callback: callback,
917
1040
  body: pObj});
@@ -929,7 +1052,7 @@ AlgoliaSearch.prototype.Index.prototype = {
929
1052
  */
930
1053
  partialUpdateObject: function(partialObject, callback) {
931
1054
  var indexObj = this;
932
- this.as._jsonRequest({ method: 'POST',
1055
+ return this.as._jsonRequest({ method: 'POST',
933
1056
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(partialObject.objectID) + '/partial',
934
1057
  body: partialObject,
935
1058
  callback: callback });
@@ -951,7 +1074,7 @@ AlgoliaSearch.prototype.Index.prototype = {
951
1074
  body: objects[i] };
952
1075
  postObj.requests.push(request);
953
1076
  }
954
- this.as._jsonRequest({ method: 'POST',
1077
+ return this.as._jsonRequest({ method: 'POST',
955
1078
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/batch',
956
1079
  body: postObj,
957
1080
  callback: callback });
@@ -966,7 +1089,7 @@ AlgoliaSearch.prototype.Index.prototype = {
966
1089
  */
967
1090
  saveObject: function(object, callback) {
968
1091
  var indexObj = this;
969
- this.as._jsonRequest({ method: 'PUT',
1092
+ return this.as._jsonRequest({ method: 'PUT',
970
1093
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(object.objectID),
971
1094
  body: object,
972
1095
  callback: callback });
@@ -988,7 +1111,7 @@ AlgoliaSearch.prototype.Index.prototype = {
988
1111
  body: objects[i] };
989
1112
  postObj.requests.push(request);
990
1113
  }
991
- this.as._jsonRequest({ method: 'POST',
1114
+ return this.as._jsonRequest({ method: 'POST',
992
1115
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/batch',
993
1116
  body: postObj,
994
1117
  callback: callback });
@@ -1007,7 +1130,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1007
1130
  return;
1008
1131
  }
1009
1132
  var indexObj = this;
1010
- this.as._jsonRequest({ method: 'DELETE',
1133
+ return this.as._jsonRequest({ method: 'DELETE',
1011
1134
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(objectID),
1012
1135
  callback: callback });
1013
1136
  },
@@ -1080,6 +1203,21 @@ AlgoliaSearch.prototype.Index.prototype = {
1080
1203
  * @param delay (optional) if set, wait for this delay (in ms) and only send the query if there was no other in the meantime.
1081
1204
  */
1082
1205
  search: function(query, callback, args, delay) {
1206
+ if (query === undefined || query === null) {
1207
+ query = '';
1208
+ }
1209
+
1210
+ // no query = getAllObjects
1211
+ if (typeof query === 'function') {
1212
+ callback = query;
1213
+ query = '';
1214
+ }
1215
+
1216
+ if (typeof callback === 'object' && (this.as._isUndefined(args) || !args)) {
1217
+ args = callback;
1218
+ callback = null;
1219
+ }
1220
+
1083
1221
  var indexObj = this;
1084
1222
  var params = 'query=' + encodeURIComponent(query);
1085
1223
  if (!this.as._isUndefined(args) && args !== null) {
@@ -1092,7 +1230,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1092
1230
  }, delay);
1093
1231
  indexObj.onDelayTrigger = onDelayTrigger;
1094
1232
  } else {
1095
- this._search(params, callback);
1233
+ return this._search(params, callback);
1096
1234
  }
1097
1235
  },
1098
1236
 
@@ -1104,12 +1242,16 @@ AlgoliaSearch.prototype.Index.prototype = {
1104
1242
  * @param hitsPerPage: Pagination parameter used to select the number of hits per page. Defaults to 1000.
1105
1243
  */
1106
1244
  browse: function(page, callback, hitsPerPage) {
1245
+ if (+callback > 0 && (this.as._isUndefined(hitsPerPage) || !hitsPerPage)) {
1246
+ hitsPerPage = callback;
1247
+ callback = null;
1248
+ }
1107
1249
  var indexObj = this;
1108
1250
  var params = '?page=' + page;
1109
1251
  if (!this.as._isUndefined(hitsPerPage)) {
1110
1252
  params += '&hitsPerPage=' + hitsPerPage;
1111
1253
  }
1112
- this.as._jsonRequest({ method: 'GET',
1254
+ return this.as._jsonRequest({ method: 'GET',
1113
1255
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/browse' + params,
1114
1256
  callback: callback });
1115
1257
  },
@@ -1140,7 +1282,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1140
1282
  */
1141
1283
  waitTask: function(taskID, callback) {
1142
1284
  var indexObj = this;
1143
- this.as._jsonRequest({ method: 'GET',
1285
+ return this.as._jsonRequest({ method: 'GET',
1144
1286
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/task/' + taskID,
1145
1287
  callback: function(success, body) {
1146
1288
  if (success) {
@@ -1164,7 +1306,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1164
1306
  */
1165
1307
  clearIndex: function(callback) {
1166
1308
  var indexObj = this;
1167
- this.as._jsonRequest({ method: 'POST',
1309
+ return this.as._jsonRequest({ method: 'POST',
1168
1310
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/clear',
1169
1311
  callback: callback });
1170
1312
  },
@@ -1177,7 +1319,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1177
1319
  */
1178
1320
  getSettings: function(callback) {
1179
1321
  var indexObj = this;
1180
- this.as._jsonRequest({ method: 'GET',
1322
+ return this.as._jsonRequest({ method: 'GET',
1181
1323
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/settings',
1182
1324
  callback: callback });
1183
1325
  },
@@ -1238,7 +1380,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1238
1380
  */
1239
1381
  setSettings: function(settings, callback) {
1240
1382
  var indexObj = this;
1241
- this.as._jsonRequest({ method: 'PUT',
1383
+ return this.as._jsonRequest({ method: 'PUT',
1242
1384
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/settings',
1243
1385
  body: settings,
1244
1386
  callback: callback });
@@ -1252,7 +1394,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1252
1394
  */
1253
1395
  listUserKeys: function(callback) {
1254
1396
  var indexObj = this;
1255
- this.as._jsonRequest({ method: 'GET',
1397
+ return this.as._jsonRequest({ method: 'GET',
1256
1398
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/keys',
1257
1399
  callback: callback });
1258
1400
  },
@@ -1265,7 +1407,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1265
1407
  */
1266
1408
  getUserKeyACL: function(key, callback) {
1267
1409
  var indexObj = this;
1268
- this.as._jsonRequest({ method: 'GET',
1410
+ return this.as._jsonRequest({ method: 'GET',
1269
1411
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/keys/' + key,
1270
1412
  callback: callback });
1271
1413
  },
@@ -1278,7 +1420,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1278
1420
  */
1279
1421
  deleteUserKey: function(key, callback) {
1280
1422
  var indexObj = this;
1281
- this.as._jsonRequest({ method: 'DELETE',
1423
+ return this.as._jsonRequest({ method: 'DELETE',
1282
1424
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/keys/' + key,
1283
1425
  callback: callback });
1284
1426
  },
@@ -1301,7 +1443,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1301
1443
  var indexObj = this;
1302
1444
  var aclsObject = {};
1303
1445
  aclsObject.acl = acls;
1304
- this.as._jsonRequest({ method: 'POST',
1446
+ return this.as._jsonRequest({ method: 'POST',
1305
1447
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/keys',
1306
1448
  body: aclsObject,
1307
1449
  callback: callback });
@@ -1331,7 +1473,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1331
1473
  aclsObject.validity = validity;
1332
1474
  aclsObject.maxQueriesPerIPPerHour = maxQueriesPerIPPerHour;
1333
1475
  aclsObject.maxHitsPerQuery = maxHitsPerQuery;
1334
- this.as._jsonRequest({ method: 'POST',
1476
+ return this.as._jsonRequest({ method: 'POST',
1335
1477
  url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/keys',
1336
1478
  body: aclsObject,
1337
1479
  callback: callback });
@@ -1343,7 +1485,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1343
1485
  var pObj = {params: params};
1344
1486
  if (this.as.jsonp === null) {
1345
1487
  var self = this;
1346
- this.as._jsonRequest({ cache: this.cache,
1488
+ return this.as._jsonRequest({ cache: this.cache,
1347
1489
  method: 'POST',
1348
1490
  url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/query',
1349
1491
  body: pObj,
@@ -1359,13 +1501,13 @@ AlgoliaSearch.prototype.Index.prototype = {
1359
1501
  }
1360
1502
  });
1361
1503
  } else if (this.as.jsonp) {
1362
- this.as._jsonRequest({ cache: this.cache,
1504
+ return this.as._jsonRequest({ cache: this.cache,
1363
1505
  method: 'GET',
1364
1506
  url: '/1/indexes/' + encodeURIComponent(this.indexName),
1365
1507
  body: pObj,
1366
1508
  callback: callback });
1367
1509
  } else {
1368
- this.as._jsonRequest({ cache: this.cache,
1510
+ return this.as._jsonRequest({ cache: this.cache,
1369
1511
  method: 'POST',
1370
1512
  url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/query',
1371
1513
  body: pObj,
@@ -1376,10 +1518,8 @@ AlgoliaSearch.prototype.Index.prototype = {
1376
1518
  // internal attributes
1377
1519
  as: null,
1378
1520
  indexName: null,
1379
- cache: {},
1380
1521
  typeAheadArgs: null,
1381
- typeAheadValueOption: null,
1382
- emptyConstructor: function() {}
1522
+ typeAheadValueOption: null
1383
1523
  };
1384
1524
 
1385
1525
  /*
@@ -1453,6 +1593,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1453
1593
  this.options = options;
1454
1594
  this.page = 0;
1455
1595
  this.refinements = {};
1596
+ this.excludes = {};
1456
1597
  this.disjunctiveRefinements = {};
1457
1598
  this.extraQueries = [];
1458
1599
  },
@@ -1530,6 +1671,47 @@ AlgoliaSearch.prototype.Index.prototype = {
1530
1671
  this.refinements[refinement] = false;
1531
1672
  },
1532
1673
 
1674
+ /**
1675
+ * Ensure a facet exclude exists
1676
+ * @param {string} facet the facet to refine
1677
+ * @param {string} value the associated value
1678
+ */
1679
+ addExclude: function(facet, value) {
1680
+ var refinement = facet + ':-' + value;
1681
+ this.excludes = this.excludes || {};
1682
+ this.excludes[refinement] = true;
1683
+ },
1684
+
1685
+ /**
1686
+ * Ensure a facet exclude does not exist
1687
+ * @param {string} facet the facet to refine
1688
+ * @param {string} value the associated value
1689
+ */
1690
+ removeExclude: function(facet, value) {
1691
+ var refinement = facet + ':-' + value;
1692
+ this.excludes = this.excludes || {};
1693
+ this.excludes[refinement] = false;
1694
+ },
1695
+
1696
+ /**
1697
+ * Toggle refinement state of an exclude
1698
+ * @param {string} facet the facet to refine
1699
+ * @param {string} value the associated value
1700
+ * @return {boolean} true if the facet has been found
1701
+ */
1702
+ toggleExclude: function(facet, value) {
1703
+ for (var i = 0; i < this.options.facets.length; ++i) {
1704
+ if (this.options.facets[i] == facet) {
1705
+ var refinement = facet + ':-' + value;
1706
+ this.excludes[refinement] = !this.excludes[refinement];
1707
+ this.page = 0;
1708
+ this._search();
1709
+ return true;
1710
+ }
1711
+ }
1712
+ return false;
1713
+ },
1714
+
1533
1715
  /**
1534
1716
  * Toggle refinement state of a facet
1535
1717
  * @param {string} facet the facet to refine
@@ -1575,6 +1757,20 @@ AlgoliaSearch.prototype.Index.prototype = {
1575
1757
  return false;
1576
1758
  },
1577
1759
 
1760
+ /**
1761
+ * Check the exclude state of a facet
1762
+ * @param {string} facet the facet
1763
+ * @param {string} value the associated value
1764
+ * @return {boolean} true if refined
1765
+ */
1766
+ isExcluded: function(facet, value) {
1767
+ var refinement = facet + ':-' + value;
1768
+ if (this.excludes[refinement]) {
1769
+ return true;
1770
+ }
1771
+ return false;
1772
+ },
1773
+
1578
1774
  /**
1579
1775
  * Go to next page
1580
1776
  */
@@ -1657,7 +1853,8 @@ AlgoliaSearch.prototype.Index.prototype = {
1657
1853
  this.client.addQueryInBatch(this.index, this.q, this._getHitsSearchParams());
1658
1854
  var disjunctiveFacets = [];
1659
1855
  var unusedDisjunctiveFacets = {};
1660
- for (var i = 0; i < this.options.disjunctiveFacets.length; ++i) {
1856
+ var i = 0;
1857
+ for (i = 0; i < this.options.disjunctiveFacets.length; ++i) {
1661
1858
  var facet = this.options.disjunctiveFacets[i];
1662
1859
  if (this._hasDisjunctiveRefinements(facet)) {
1663
1860
  disjunctiveFacets.push(facet);
@@ -1665,10 +1862,10 @@ AlgoliaSearch.prototype.Index.prototype = {
1665
1862
  unusedDisjunctiveFacets[facet] = true;
1666
1863
  }
1667
1864
  }
1668
- for (var i = 0; i < disjunctiveFacets.length; ++i) {
1865
+ for (i = 0; i < disjunctiveFacets.length; ++i) {
1669
1866
  this.client.addQueryInBatch(this.index, this.q, this._getDisjunctiveFacetSearchParams(disjunctiveFacets[i]));
1670
1867
  }
1671
- for (var i = 0; i < this.extraQueries.length; ++i) {
1868
+ for (i = 0; i < this.extraQueries.length; ++i) {
1672
1869
  this.client.addQueryInBatch(this.extraQueries[i].index, this.extraQueries[i].query, this.extraQueries[i].params);
1673
1870
  }
1674
1871
  var self = this;
@@ -1680,6 +1877,7 @@ AlgoliaSearch.prototype.Index.prototype = {
1680
1877
  var aggregatedAnswer = content.results[0];
1681
1878
  aggregatedAnswer.disjunctiveFacets = aggregatedAnswer.disjunctiveFacets || {};
1682
1879
  aggregatedAnswer.facetStats = aggregatedAnswer.facetStats || {};
1880
+ // create disjunctive facets from facets (disjunctive facets without refinements)
1683
1881
  for (var facet in unusedDisjunctiveFacets) {
1684
1882
  if (aggregatedAnswer.facets[facet] && !aggregatedAnswer.disjunctiveFacets[facet]) {
1685
1883
  aggregatedAnswer.disjunctiveFacets[facet] = aggregatedAnswer.facets[facet];
@@ -1690,26 +1888,43 @@ AlgoliaSearch.prototype.Index.prototype = {
1690
1888
  }
1691
1889
  }
1692
1890
  }
1693
- for (var i = 0; i < disjunctiveFacets.length; ++i) {
1694
- for (var facet in content.results[i + 1].facets) {
1695
- aggregatedAnswer.disjunctiveFacets[facet] = content.results[i + 1].facets[facet];
1696
- if (self.disjunctiveRefinements[facet]) {
1697
- for (var value in self.disjunctiveRefinements[facet]) {
1698
- if (!aggregatedAnswer.disjunctiveFacets[facet][value] && self.disjunctiveRefinements[facet][value]) {
1699
- aggregatedAnswer.disjunctiveFacets[facet][value] = 0;
1891
+ // aggregate the disjunctive facets
1892
+ for (i = 0; i < disjunctiveFacets.length; ++i) {
1893
+ for (var dfacet in content.results[i + 1].facets) {
1894
+ aggregatedAnswer.disjunctiveFacets[dfacet] = content.results[i + 1].facets[dfacet];
1895
+ if (self.disjunctiveRefinements[dfacet]) {
1896
+ for (var value in self.disjunctiveRefinements[dfacet]) {
1897
+ // add the disjunctive reginements if it is no more retrieved
1898
+ if (!aggregatedAnswer.disjunctiveFacets[dfacet][value] && self.disjunctiveRefinements[dfacet][value]) {
1899
+ aggregatedAnswer.disjunctiveFacets[dfacet][value] = 0;
1700
1900
  }
1701
1901
  }
1702
1902
  }
1703
1903
  }
1904
+ // aggregate the disjunctive facets stats
1704
1905
  for (var stats in content.results[i + 1].facets_stats) {
1705
1906
  aggregatedAnswer.facetStats[stats] = content.results[i + 1].facets_stats[stats];
1706
1907
  }
1707
1908
  }
1909
+ // add the excludes
1910
+ for (var exclude in self.excludes) {
1911
+ if (self.excludes[exclude]) {
1912
+ var e = exclude.indexOf(':-');
1913
+ var facet = exclude.slice(0, e);
1914
+ var value = exclude.slice(e + 2);
1915
+ aggregatedAnswer.facets[facet] = aggregatedAnswer.facets[facet] || {};
1916
+ if (!aggregatedAnswer.facets[facet][value]) {
1917
+ aggregatedAnswer.facets[facet][value] = 0;
1918
+ }
1919
+ }
1920
+ }
1921
+ // call the actual callback
1708
1922
  if (self.extraQueries.length === 0) {
1709
1923
  self.searchCallback(true, aggregatedAnswer);
1710
1924
  } else {
1925
+ // append the extra queries
1711
1926
  var c = { results: [ aggregatedAnswer ] };
1712
- for (var i = 0; i < self.extraQueries.length; ++i) {
1927
+ for (i = 0; i < self.extraQueries.length; ++i) {
1713
1928
  c.results.push(content.results[1 + disjunctiveFacets.length + i]);
1714
1929
  }
1715
1930
  self.searchCallback(true, c);
@@ -1723,10 +1938,11 @@ AlgoliaSearch.prototype.Index.prototype = {
1723
1938
  */
1724
1939
  _getHitsSearchParams: function() {
1725
1940
  var facets = [];
1726
- for (var i = 0; i < this.options.facets.length; ++i) {
1941
+ var i = 0;
1942
+ for (i = 0; i < this.options.facets.length; ++i) {
1727
1943
  facets.push(this.options.facets[i]);
1728
1944
  }
1729
- for (var i = 0; i < this.options.disjunctiveFacets.length; ++i) {
1945
+ for (i = 0; i < this.options.disjunctiveFacets.length; ++i) {
1730
1946
  var facet = this.options.disjunctiveFacets[i];
1731
1947
  if (!this._hasDisjunctiveRefinements(facet)) {
1732
1948
  facets.push(facet);
@@ -1786,6 +2002,11 @@ AlgoliaSearch.prototype.Index.prototype = {
1786
2002
  facetFilters.push(refinement);
1787
2003
  }
1788
2004
  }
2005
+ for (var refinement in this.excludes) {
2006
+ if (this.excludes[refinement]) {
2007
+ facetFilters.push(refinement);
2008
+ }
2009
+ }
1789
2010
  for (var disjunctiveRefinement in this.disjunctiveRefinements) {
1790
2011
  if (disjunctiveRefinement != facet) {
1791
2012
  var refinements = [];
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * algoliasearch 2.8.6
2
+ * algoliasearch 2.9.2
3
3
  * https://github.com/algolia/algoliasearch-client-js
4
4
  * Copyright 2014 Algolia SAS; Licensed MIT
5
5
  */
6
6
 
7
- function AlgoliaExplainResults(a,b,c){function d(a,b){var c=[];if("object"==typeof a&&"matchedWords"in a&&"value"in a){for(var e=!1,f=0;f<a.matchedWords.length;++f){var g=a.matchedWords[f];g in b||(b[g]=1,e=!0)}e&&c.push(a.value)}else if("[object Array]"===Object.prototype.toString.call(a))for(var h=0;h<a.length;++h){var i=d(a[h],b);c=c.concat(i)}else if("object"==typeof a)for(var j in a)a.hasOwnProperty(j)&&(c=c.concat(d(a[j],b)));return c}function e(a,b,c){var f=a._highlightResult||a;if(-1===c.indexOf("."))return c in f?d(f[c],b):[];for(var g=c.split("."),h=f,i=0;i<g.length;++i){if("[object Array]"===Object.prototype.toString.call(h)){for(var j=[],k=0;k<h.length;++k)j=j.concat(e(h[k],b,g.slice(i).join(".")));return j}if(!(g[i]in h))return[];h=h[g[i]]}return d(h,b)}var f={},g={},h=e(a,g,b);if(f.title=h.length>0?h[0]:"",f.subtitles=[],"undefined"!=typeof c)for(var i=0;i<c.length;++i)for(var j=e(a,g,c[i]),k=0;k<j.length;++k)f.subtitles.push({attr:c[i],value:j[k]});return f}var ALGOLIA_VERSION="2.8.6",AlgoliaSearch=function(a,b,c,d,e){this.applicationID=a,this.apiKey=b,this.dsn=!0,this.dsnHost=null,this.hosts=[],this.currentHostIndex=0,this.requestTimeoutInMs=2e3,this.extraHeaders=[],this.jsonp=null;var f,g="net";if("string"==typeof c)f=c;else{var h=c||{};this._isUndefined(h.method)||(f=h.method),this._isUndefined(h.tld)||(g=h.tld),this._isUndefined(h.dsn)||(this.dsn=h.dsn),this._isUndefined(h.hosts)||(e=h.hosts),this._isUndefined(h.dsnHost)||(this.dsnHost=h.dsnHost),this._isUndefined(h.requestTimeoutInMs)||(this.requestTimeoutInMs=+h.requestTimeoutInMs),this._isUndefined(h.jsonp)||(this.jsonp=h.jsonp)}this._isUndefined(e)&&(e=[this.applicationID+"-1.algolia."+g,this.applicationID+"-2.algolia."+g,this.applicationID+"-3.algolia."+g]),this.host_protocol="http://",this._isUndefined(f)||null===f?this.host_protocol=("https:"==document.location.protocol?"https":"http")+"://":("https"===f||"HTTPS"===f)&&(this.host_protocol="https://");for(var i=0;i<e.length;++i)Math.random()>.5&&this.hosts.reverse(),this.hosts.push(this.host_protocol+e[i]);Math.random()>.5&&this.hosts.reverse(),(this.dsn||null!=this.dsnHost)&&this.hosts.unshift(this.dsnHost?this.host_protocol+this.dsnHost:this.host_protocol+this.applicationID+"-dsn.algolia."+g)};AlgoliaSearch.prototype={deleteIndex:function(a,b){this._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(a),callback:b})},moveIndex:function(a,b,c){var d={operation:"move",destination:b};this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},copyIndex:function(a,b,c){var d={operation:"copy",destination:b};this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},getLogs:function(a,b,c){this._isUndefined(b)&&(b=0),this._isUndefined(c)&&(c=10),this._jsonRequest({method:"GET",url:"/1/logs?offset="+b+"&length="+c,callback:a})},listIndexes:function(a,b){var c=b?"?page="+b:"";this._jsonRequest({method:"GET",url:"/1/indexes"+c,callback:a})},initIndex:function(a){return new this.Index(this,a)},listUserKeys:function(a){this._jsonRequest({method:"GET",url:"/1/keys",callback:a})},getUserKeyACL:function(a,b){this._jsonRequest({method:"GET",url:"/1/keys/"+a,callback:b})},deleteUserKey:function(a,b){this._jsonRequest({method:"DELETE",url:"/1/keys/"+a,callback:b})},addUserKey:function(a,b){var c={};c.acl=a,this._jsonRequest({method:"POST",url:"/1/keys",body:c,callback:b})},addUserKeyWithValidity:function(a,b,c,d,e){var f=this,g={};g.acl=a,g.validity=b,g.maxQueriesPerIPPerHour=c,g.maxHitsPerQuery=d,this._jsonRequest({method:"POST",url:"/1/indexes/"+f.indexName+"/keys",body:g,callback:e})},setSecurityTags:function(a){if("[object Array]"===Object.prototype.toString.call(a)){for(var b=[],c=0;c<a.length;++c)if("[object Array]"===Object.prototype.toString.call(a[c])){for(var d=[],e=0;e<a[c].length;++e)d.push(a[c][e]);b.push("("+d.join(",")+")")}else b.push(a[c]);a=b.join(",")}this.tagFilters=a},setUserToken:function(a){this.userToken=a},startQueriesBatch:function(){this.batch=[]},addQueryInBatch:function(a,b,c){var d="query="+encodeURIComponent(b);this._isUndefined(c)||null===c||(d=this._getSearchParams(c,d)),this.batch.push({indexName:a,params:d})},clearCache:function(){this.cache={}},sendQueriesBatch:function(a,b){for(var c=this,d={requests:[]},e=0;e<c.batch.length;++e)d.requests.push(c.batch[e]);if(window.clearTimeout(c.onDelayTrigger),!this._isUndefined(b)&&null!==b&&b>0){var f=window.setTimeout(function(){c._sendQueriesBatch(d,a)},b);c.onDelayTrigger=f}else this._sendQueriesBatch(d,a)},setRequestTimeout:function(a){a&&(this.requestTimeoutInMs=parseInt(a,10))},Index:function(a,b){this.indexName=b,this.as=a,this.typeAheadArgs=null,this.typeAheadValueOption=null},setExtraHeader:function(a,b){this.extraHeaders.push({key:a,value:b})},_sendQueriesBatch:function(a,b){if(null===this.jsonp){var c=this;this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:function(d,e){d?(c.jsonp=!1,b&&b(d,e)):(c.jsonp=!0,c._sendQueriesBatch(a,b))}})}else if(this.jsonp){for(var d="",e=0;e<a.requests.length;++e){var f="/1/indexes/"+encodeURIComponent(a.requests[e].indexName)+"?"+a.requests[e].params;d+=e+"="+encodeURIComponent(f)+"&"}var g={params:d};this._jsonRequest({cache:this.cache,method:"GET",url:"/1/indexes/*",body:g,callback:b})}else this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:b})},_jsonRequest:function(a){var b=this,c=a.callback,d=null,e=a.url;if(this._isUndefined(a.body)||(e=a.url+"_body_"+JSON.stringify(a.body)),!this._isUndefined(a.cache)&&(d=a.cache,!this._isUndefined(d[e])))return void(this._isUndefined(c)||setTimeout(function(){c(!0,d[e])},1));a.successiveRetryCount=0;var f=function(){return a.successiveRetryCount>=b.hosts.length?void(b._isUndefined(c)||(a.successiveRetryCount=0,c(!1,{message:"Cannot connect the Algolia's Search API. Please send an email to support@algolia.com to report the issue."}))):(a.callback=function(g,h,i,j){h||b._isUndefined(j)||window.console&&console.log("Error: "+j.message),h&&!b._isUndefined(a.cache)&&(d[e]=j),!h&&g?(b.currentHostIndex=++b.currentHostIndex%b.hosts.length,a.successiveRetryCount+=1,f()):(a.successiveRetryCount=0,b._isUndefined(c)||c(h,j))},a.hostname=b.hosts[b.currentHostIndex],void b._jsonRequestByHost(a))};f()},_jsonRequestByHost:function(a){var b=a.hostname+a.url;this.jsonp?this._makeJsonpRequestByHost(b,a):this._makeXmlHttpRequestByHost(b,a)},_makeJsonpRequestByHost:function(a,b){if("GET"!==b.method)return void b.callback(!0,!1,null,{message:"Method "+b.method+" "+a+" is not supported by JSONP."});this.jsonpCounter=this.jsonpCounter||0,this.jsonpCounter+=1;var c=document.getElementsByTagName("head")[0],d=document.createElement("script"),e="algoliaJSONP_"+this.jsonpCounter,f=!1,g=null;window[e]=function(a){b.callback(!1,!0,null,a);try{delete window[e]}catch(c){window[e]=void 0}},d.type="text/javascript",d.src=a+"?callback="+e+"&X-Algolia-Application-Id="+this.applicationID+"&X-Algolia-API-Key="+this.apiKey,this.tagFilters&&(d.src+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),this.userToken&&(d.src+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken));for(var h=0;h<this.extraHeaders.length;++h)d.src+="&"+this.extraHeaders[h].key+"="+this.extraHeaders[h].value;b.body&&b.body.params&&(d.src+="&"+b.body.params),g=setTimeout(function(){d.onload=d.onreadystatechange=d.onerror=null,window[e]=function(){try{delete window[e]}catch(a){window[e]=void 0}},b.callback(!0,!1,null,{message:"Timeout - Failed to load JSONP script."}),c.removeChild(d),clearTimeout(g),g=null},this.requestTimeoutInMs),d.onload=d.onreadystatechange=function(){if(clearTimeout(g),g=null,!(f||this.readyState&&"loaded"!=this.readyState&&"complete"!=this.readyState)){if(f=!0,"undefined"==typeof window[e+"_loaded"]){b.callback(!0,!1,null,{message:"Failed to load JSONP script."});try{delete window[e]}catch(a){window[e]=void 0}}else try{delete window[e+"_loaded"]}catch(a){window[e+"_loaded"]=void 0}d.onload=d.onreadystatechange=null,c.removeChild(d)}},d.onerror=function(){clearTimeout(g),g=null,b.callback(!0,!1,null,{message:"Failed to load JSONP script."}),c.removeChild(d);try{delete window[e]}catch(a){window[e]=void 0}},c.appendChild(d)},_makeXmlHttpRequestByHost:function(a,b){var c=this,d=window.XMLHttpRequest?new XMLHttpRequest:{},e=null,f=null;this._isUndefined(b.body)||(e=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var g=0;g<this.extraHeaders.length;++g)a+="&"+this.extraHeaders[g].key+"="+this.extraHeaders[g].value;if("withCredentials"in d)d.open(b.method,a,!0),d.timeout=this.requestTimeoutInMs*(b.successiveRetryCount+1),null!==e&&d.setRequestHeader("Content-type","application/x-www-form-urlencoded");else{if("undefined"==typeof XDomainRequest)return void b.callback(!1,!1,null,{message:"CORS not supported"});d=new XDomainRequest,d.open(b.method,a)}f=setTimeout(function(){return d.abort(),d.aborted===!0?void stopLoadAnimation():(b.callback(!0,!1,null,{message:"Timeout - Could not connect to endpoint "+a}),clearTimeout(f),void(f=null))},this.requestTimeoutInMs*(b.successiveRetryCount+1)),d.onload=function(a){if(clearTimeout(f),f=null,c._isUndefined(a)||null===a.target)b.callback(!1,!0,a,JSON.parse(d.responseText));else{var e=0===a.target.status||503===a.target.status,g=!1,h=null;"undefined"!=typeof XDomainRequest?(h=a.target.responseText,g=h&&h.length>0):(h=a.target.response,g=200===a.target.status||201===a.target.status),b.callback(e,g,a.target,h?JSON.parse(h):null)}},d.ontimeout=function(){},d.onerror=function(a){clearTimeout(f),f=null,b.callback(!0,!1,null,{message:"Could not connect to host",error:a})},d.send(e)},_getSearchParams:function(a,b){if(this._isUndefined(a)||null===a)return b;for(var c in a)null!==c&&a.hasOwnProperty(c)&&(b+=0===b.length?"?":"&",b+=c+"="+encodeURIComponent("[object Array]"===Object.prototype.toString.call(a[c])?JSON.stringify(a[c]):a[c]));return b},_isUndefined:function(a){return void 0===a},applicationID:null,apiKey:null,tagFilters:null,userToken:null,hosts:[],cache:{},extraHeaders:[]},AlgoliaSearch.prototype.Index.prototype={clearCache:function(){this.cache={}},addObject:function(a,b,c){var d=this;this.as._jsonRequest(this.as._isUndefined(c)?{method:"POST",url:"/1/indexes/"+encodeURIComponent(d.indexName),body:a,callback:b}:{method:"PUT",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(c),body:a,callback:b})},addObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"addObject",body:a[e]};d.requests.push(f)}this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},getObject:function(a,b,c){var d=this,e="";if(!this.as._isUndefined(c)){e="?attributes=";for(var f=0;f<c.length;++f)0!==f&&(e+=","),e+=c[f]}if(null===this.as.jsonp)this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(a)+e,callback:b});else{var g={params:e};this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(a),callback:b,body:g})}},partialUpdateObject:function(a,b){var c=this;this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID)+"/partial",body:a,callback:b})},partialUpdateObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"partialUpdateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},saveObject:function(a,b){var c=this;this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID),body:a,callback:b})},saveObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"updateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},deleteObject:function(a,b){if(null===a||0===a.length)return void b(!1,{message:"empty objectID"});var c=this;this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a),callback:b})},search:function(a,b,c,d){var e=this,f="query="+encodeURIComponent(a);if(this.as._isUndefined(c)||null===c||(f=this.as._getSearchParams(c,f)),window.clearTimeout(e.onDelayTrigger),!this.as._isUndefined(d)&&null!==d&&d>0){var g=window.setTimeout(function(){e._search(f,b)},d);e.onDelayTrigger=g}else this._search(f,b)},browse:function(a,b,c){var d=this,e="?page="+a;this.as._isUndefined(c)||(e+="&hitsPerPage="+c),this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/browse"+e,callback:b})},ttAdapter:function(a){var b=this;return function(c,d){b.search(c,function(a,b){a&&d(b.hits)},a)}},waitTask:function(a,b){var c=this;this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/task/"+a,callback:function(d,e){d?"published"===e.status?b(!0,e):setTimeout(function(){c.waitTask(a,b)},100):b(!1,e)}})},clearIndex:function(a){var b=this;this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/clear",callback:a})},getSettings:function(a){var b=this;this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/settings",callback:a})},setSettings:function(a,b){var c=this;this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/settings",body:a,callback:b})},listUserKeys:function(a){var b=this;this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/keys",callback:a})},getUserKeyACL:function(a,b){var c=this;this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},deleteUserKey:function(a,b){var c=this;this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},addUserKey:function(a,b){var c=this,d={};d.acl=a,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys",body:d,callback:b})},addUserKeyWithValidity:function(a,b,c,d,e){var f=this,g={};g.acl=a,g.validity=b,g.maxQueriesPerIPPerHour=c,g.maxHitsPerQuery=d,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(f.indexName)+"/keys",body:g,callback:e})},_search:function(a,b){var c={params:a};if(null===this.as.jsonp){var d=this;this.as._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:function(c,e){c?(d.as.jsonp=!1,b&&b(c,e)):(d.as.jsonp=!0,d._search(a,b))}})}else this.as._jsonRequest(this.as.jsonp?{cache:this.cache,method:"GET",url:"/1/indexes/"+encodeURIComponent(this.indexName),body:c,callback:b}:{cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:b})},as:null,indexName:null,cache:{},typeAheadArgs:null,typeAheadValueOption:null,emptyConstructor:function(){}},function(){var a=function(a){a=a||{};for(var b=1;b<arguments.length;b++)if(arguments[b])for(var c in arguments[b])arguments[b].hasOwnProperty(c)&&(a[c]=arguments[b][c]);return a};window.AlgoliaSearchHelper=function(b,c,d){var e={facets:[],disjunctiveFacets:[],hitsPerPage:20,defaultFacetFilters:[]};this.init(b,c,a({},e,d))},AlgoliaSearchHelper.prototype={init:function(a,b,c){this.client=a,this.index=b,this.options=c,this.page=0,this.refinements={},this.disjunctiveRefinements={},this.extraQueries=[]},search:function(a,b,c){this.q=a,this.searchCallback=b,this.searchParams=c||{},this.page=this.page||0,this.refinements=this.refinements||{},this.disjunctiveRefinements=this.disjunctiveRefinements||{},this._search()},clearRefinements:function(){this.disjunctiveRefinements={},this.refinements={}},addDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{},this.disjunctiveRefinements[a][b]=!0},removeDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};try{delete this.disjunctiveRefinements[a][b]}catch(c){this.disjunctiveRefinements[a][b]=void 0}},addRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!0},removeRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!1},toggleRefine:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":"+b;return this.refinements[d]=!this.refinements[d],this.page=0,this._search(),!0}this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};for(var e=0;e<this.options.disjunctiveFacets.length;++e)if(this.options.disjunctiveFacets[e]==a)return this.disjunctiveRefinements[a][b]=!this.disjunctiveRefinements[a][b],this.page=0,this._search(),!0;return!1},isRefined:function(a,b){var c=a+":"+b;return this.refinements[c]?!0:this.disjunctiveRefinements[a]&&this.disjunctiveRefinements[a][b]?!0:!1},nextPage:function(){this._gotoPage(this.page+1)},previousPage:function(){this.page>0&&this._gotoPage(this.page-1)},gotoPage:function(a){this._gotoPage(a)},setPage:function(a){this.page=a},setIndex:function(a){this.index=a},getIndex:function(){return this.index},clearExtraQueries:function(){this.extraQueries=[]},addExtraQuery:function(a,b,c){this.extraQueries.push({index:a,query:b,params:c||{}})},_gotoPage:function(a){this.page=a,this._search()},_search:function(){this.client.startQueriesBatch(),this.client.addQueryInBatch(this.index,this.q,this._getHitsSearchParams());for(var a=[],b={},c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)?a.push(d):b[d]=!0}for(var c=0;c<a.length;++c)this.client.addQueryInBatch(this.index,this.q,this._getDisjunctiveFacetSearchParams(a[c]));for(var c=0;c<this.extraQueries.length;++c)this.client.addQueryInBatch(this.extraQueries[c].index,this.extraQueries[c].query,this.extraQueries[c].params);var e=this;this.client.sendQueriesBatch(function(c,d){if(!c)return void e.searchCallback(!1,d);var f=d.results[0];f.disjunctiveFacets=f.disjunctiveFacets||{},f.facetStats=f.facetStats||{};for(var g in b)if(f.facets[g]&&!f.disjunctiveFacets[g]){f.disjunctiveFacets[g]=f.facets[g];try{delete f.facets[g]}catch(h){f.facets[g]=void 0}}for(var i=0;i<a.length;++i){for(var g in d.results[i+1].facets)if(f.disjunctiveFacets[g]=d.results[i+1].facets[g],e.disjunctiveRefinements[g])for(var j in e.disjunctiveRefinements[g])!f.disjunctiveFacets[g][j]&&e.disjunctiveRefinements[g][j]&&(f.disjunctiveFacets[g][j]=0);for(var k in d.results[i+1].facets_stats)f.facetStats[k]=d.results[i+1].facets_stats[k]}if(0===e.extraQueries.length)e.searchCallback(!0,f);else{for(var l={results:[f]},i=0;i<e.extraQueries.length;++i)l.results.push(d.results[1+a.length+i]);e.searchCallback(!0,l)}})},_getHitsSearchParams:function(){for(var b=[],c=0;c<this.options.facets.length;++c)b.push(this.options.facets[c]);for(var c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)||b.push(d)}return a({},{hitsPerPage:this.options.hitsPerPage,page:this.page,facets:b,facetFilters:this._getFacetFilters()},this.searchParams)},_getDisjunctiveFacetSearchParams:function(b){return a({},this.searchParams,{hitsPerPage:1,page:0,attributesToRetrieve:[],attributesToHighlight:[],attributesToSnippet:[],facets:b,facetFilters:this._getFacetFilters(b)})},_hasDisjunctiveRefinements:function(a){for(var b in this.disjunctiveRefinements[a])if(this.disjunctiveRefinements[a][b])return!0;return!1},_getFacetFilters:function(a){var b=[];if(this.options.defaultFacetFilters)for(var c=0;c<this.options.defaultFacetFilters.length;++c)b.push(this.options.defaultFacetFilters[c]);for(var d in this.refinements)this.refinements[d]&&b.push(d);for(var e in this.disjunctiveRefinements)if(e!=a){var f=[];for(var g in this.disjunctiveRefinements[e])this.disjunctiveRefinements[e][g]&&f.push(e+":"+g);f.length>0&&b.push(f)}return b}}}(),function(){window.AlgoliaPlaces=function(a,b){this.init(a,b)},AlgoliaPlaces.prototype={init:function(a,b){this.client=new AlgoliaSearch(a,b,"http",!0,["places-1.algolia.io","places-2.algolia.io","places-3.algolia.io"]),this.cache={}},search:function(a,b,c){var d="query="+encodeURIComponent(a);this.client._isUndefined(c)||null==c||(d=this.client._getSearchParams(c,d));var e={params:d,apiKey:this.client.apiKey,appID:this.client.applicationID};this.client._jsonRequest({cache:this.cache,method:"POST",url:"/1/places/query",body:e,callback:b,removeCustomHTTPHeaders:!0})}}}(),"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(a){return 10>a?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return"string"==typeof b?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g,h=gap,i=b[a];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(a)),"function"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,g=[],"[object Array]"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;f>c;c+=1)g[c]=str(c,i)||"null";return e=0===g.length?"[]":gap?"[\n"+gap+g.join(",\n"+gap)+"\n"+h+"]":"["+g.join(",")+"]",gap=h,e}if(rep&&"object"==typeof rep)for(f=rep.length,c=0;f>c;c+=1)"string"==typeof rep[c]&&(d=rep[c],e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));else for(d in i)Object.prototype.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));return e=0===g.length?"{}":gap?"{\n"+gap+g.join(",\n"+gap)+"\n"+h+"}":"{"+g.join(",")+"}",gap=h,e}}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var cx,escapable,gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(a,b,c){var d;if(gap="",indent="","number"==typeof c)for(d=0;c>d;d+=1)indent+=" ";else"string"==typeof c&&(indent=c);if(rep=b,b&&"function"!=typeof b&&("object"!=typeof b||"number"!=typeof b.length))throw new Error("JSON.stringify");return str("",{"":a})}),"function"!=typeof JSON.parse&&(cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
7
+ function AlgoliaExplainResults(a,b,c){function d(a,b){var c=[];if("object"==typeof a&&"matchedWords"in a&&"value"in a){for(var e=!1,f=0;f<a.matchedWords.length;++f){var g=a.matchedWords[f];g in b||(b[g]=1,e=!0)}e&&c.push(a.value)}else if("[object Array]"===Object.prototype.toString.call(a))for(var h=0;h<a.length;++h){var i=d(a[h],b);c=c.concat(i)}else if("object"==typeof a)for(var j in a)a.hasOwnProperty(j)&&(c=c.concat(d(a[j],b)));return c}function e(a,b,c){var f=a._highlightResult||a;if(-1===c.indexOf("."))return c in f?d(f[c],b):[];for(var g=c.split("."),h=f,i=0;i<g.length;++i){if("[object Array]"===Object.prototype.toString.call(h)){for(var j=[],k=0;k<h.length;++k)j=j.concat(e(h[k],b,g.slice(i).join(".")));return j}if(!(g[i]in h))return[];h=h[g[i]]}return d(h,b)}var f={},g={},h=e(a,g,b);if(f.title=h.length>0?h[0]:"",f.subtitles=[],"undefined"!=typeof c)for(var i=0;i<c.length;++i)for(var j=e(a,g,c[i]),k=0;k<j.length;++k)f.subtitles.push({attr:c[i],value:j[k]});return f}var ALGOLIA_VERSION="2.9.2",AlgoliaSearch=function(a,b,c,d,e){var f=this;this.applicationID=a,this.apiKey=b,this.dsn=!0,this.dsnHost=null,this.hosts=[],this.currentHostIndex=0,this.requestTimeoutInMs=2e3,this.extraHeaders=[],this.jsonp=null,this.options={},this.cache={};var g,h="net";if("string"==typeof c)g=c;else{var i=c||{};this.options=i,this._isUndefined(i.method)||(g=i.method),this._isUndefined(i.tld)||(h=i.tld),this._isUndefined(i.dsn)||(this.dsn=i.dsn),this._isUndefined(i.hosts)||(e=i.hosts),this._isUndefined(i.dsnHost)||(this.dsnHost=i.dsnHost),this._isUndefined(i.requestTimeoutInMs)||(this.requestTimeoutInMs=+i.requestTimeoutInMs),this._isUndefined(i.jsonp)||(this.jsonp=i.jsonp)}this._isUndefined(e)&&(e=[this.applicationID+"-1.algolia."+h,this.applicationID+"-2.algolia."+h,this.applicationID+"-3.algolia."+h]),this.host_protocol="http://",this._isUndefined(g)||null===g?this.host_protocol=("https:"==document.location.protocol?"https":"http")+"://":("https"===g||"HTTPS"===g)&&(this.host_protocol="https://");for(var j=0;j<e.length;++j)Math.random()>.5&&this.hosts.reverse(),this.hosts.push(this.host_protocol+e[j]);Math.random()>.5&&this.hosts.reverse(),(this.dsn||null!=this.dsnHost)&&this.hosts.unshift(this.dsnHost?this.host_protocol+this.dsnHost:this.host_protocol+this.applicationID+"-dsn.algolia."+h),this.options.angular&&this.options.angular.$injector.invoke(["$http","$q",function(a,b){f.options.angular.$q=b,f.options.angular.$http=a}])};AlgoliaSearch.prototype={deleteIndex:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(a),callback:b})},moveIndex:function(a,b,c){var d={operation:"move",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},copyIndex:function(a,b,c){var d={operation:"copy",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},getLogs:function(a,b,c){return this._isUndefined(b)&&(b=0),this._isUndefined(c)&&(c=10),this._jsonRequest({method:"GET",url:"/1/logs?offset="+b+"&length="+c,callback:a})},listIndexes:function(a,b){var c="undefined"!=typeof b?"?page="+b:"";return this._jsonRequest({method:"GET",url:"/1/indexes"+c,callback:a})},initIndex:function(a){return new this.Index(this,a)},listUserKeys:function(a){return this._jsonRequest({method:"GET",url:"/1/keys",callback:a})},getUserKeyACL:function(a,b){return this._jsonRequest({method:"GET",url:"/1/keys/"+a,callback:b})},deleteUserKey:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/keys/"+a,callback:b})},addUserKey:function(a,b){var c={};return c.acl=a,this._jsonRequest({method:"POST",url:"/1/keys",body:c,callback:b})},addUserKeyWithValidity:function(a,b,c,d,e){var f=this,g={};return g.acl=a,g.validity=b,g.maxQueriesPerIPPerHour=c,g.maxHitsPerQuery=d,this._jsonRequest({method:"POST",url:"/1/indexes/"+f.indexName+"/keys",body:g,callback:e})},setSecurityTags:function(a){if("[object Array]"===Object.prototype.toString.call(a)){for(var b=[],c=0;c<a.length;++c)if("[object Array]"===Object.prototype.toString.call(a[c])){for(var d=[],e=0;e<a[c].length;++e)d.push(a[c][e]);b.push("("+d.join(",")+")")}else b.push(a[c]);a=b.join(",")}this.tagFilters=a},setUserToken:function(a){this.userToken=a},startQueriesBatch:function(){this.batch=[]},addQueryInBatch:function(a,b,c){var d="query="+encodeURIComponent(b);this._isUndefined(c)||null===c||(d=this._getSearchParams(c,d)),this.batch.push({indexName:a,params:d})},clearCache:function(){this.cache={}},sendQueriesBatch:function(a,b){for(var c=this,d={requests:[]},e=0;e<c.batch.length;++e)d.requests.push(c.batch[e]);if(window.clearTimeout(c.onDelayTrigger),this._isUndefined(b)||null===b||!(b>0))return this._sendQueriesBatch(d,a);var f=window.setTimeout(function(){c._sendQueriesBatch(d,a)},b);c.onDelayTrigger=f},setRequestTimeout:function(a){a&&(this.requestTimeoutInMs=parseInt(a,10))},Index:function(a,b){this.indexName=b,this.as=a,this.typeAheadArgs=null,this.typeAheadValueOption=null,this.cache={}},setExtraHeader:function(a,b){this.extraHeaders.push({key:a,value:b})},_sendQueriesBatch:function(a,b){if(null===this.jsonp){var c=this;return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:function(d,e){d?(c.jsonp=!1,b&&b(d,e)):(c.jsonp=!0,c._sendQueriesBatch(a,b))}})}if(this.jsonp){for(var d="",e=0;e<a.requests.length;++e){var f="/1/indexes/"+encodeURIComponent(a.requests[e].indexName)+"?"+a.requests[e].params;d+=e+"="+encodeURIComponent(f)+"&"}var g={params:d};return this._jsonRequest({cache:this.cache,method:"GET",url:"/1/indexes/*",body:g,callback:b})}return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:b})},_jsonRequest:function(a){var b=this,c=a.callback,d=null,e=a.url,f=null;if(this.options.jQuery?(f=this.options.jQuery.$.Deferred(),f.promise=f.promise()):this.options.angular&&(f=this.options.angular.$q.defer()),this._isUndefined(a.body)||(e=a.url+"_body_"+JSON.stringify(a.body)),!this._isUndefined(a.cache)&&(d=a.cache,!this._isUndefined(d[e])))return!this._isUndefined(c)&&c&&setTimeout(function(){c(!0,d[e])},1),f&&f.resolve(d[e]),f&&f.promise;a.successiveRetryCount=0;var g=function(){if(a.successiveRetryCount>=b.hosts.length){var h={message:"Cannot connect the Algolia's Search API. Please send an email to support@algolia.com to report the issue."};return!b._isUndefined(c)&&c&&(a.successiveRetryCount=0,c(!1,h)),void(f&&f.reject(h))}a.callback=function(h,i,j,k){i&&!b._isUndefined(a.cache)&&(d[e]=k),!i&&h?(b.currentHostIndex=++b.currentHostIndex%b.hosts.length,a.successiveRetryCount+=1,g()):(a.successiveRetryCount=0,f&&(i?f.resolve(k):f.reject(k)),!b._isUndefined(c)&&c&&c(i,k))},a.hostname=b.hosts[b.currentHostIndex],b._jsonRequestByHost(a)};return g(),f&&f.promise},_jsonRequestByHost:function(a){var b=a.hostname+a.url;this.jsonp?this._makeJsonpRequestByHost(b,a):this.options.jQuery?this._makejQueryRequestByHost(b,a):this.options.angular?this._makeAngularRequestByHost(b,a):this._makeXmlHttpRequestByHost(b,a)},_makeAngularRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.angular.$http({url:a,method:b.method,data:c,cache:!1,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1)}).then(function(a){b.callback(!1,!0,null,a.data)},function(a){0===a.status?b.callback(!0,!1,null,a.data):400==a.status||403===a.status||404===a.status?b.callback(!1,!1,null,a.data):b.callback(!0,!1,null,a.data)})},_makejQueryRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.jQuery.$.ajax(a,{type:b.method,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1),dataType:"json",data:c,error:function(c,d,e){"timeout"===d?b.callback(!0,!1,null,{message:"Timeout - Could not connect to endpoint "+a}):400===c.status||403===c.status||404===c.status?b.callback(!1,!1,null,c.responseJSON):b.callback(!0,!1,null,{message:e})},success:function(a){b.callback(!1,!0,null,a)}})},_makeJsonpRequestByHost:function(a,b){if("GET"!==b.method)return void b.callback(!0,!1,null,{message:"Method "+b.method+" "+a+" is not supported by JSONP."});this.jsonpCounter=this.jsonpCounter||0,this.jsonpCounter+=1;var c=document.getElementsByTagName("head")[0],d=document.createElement("script"),e="algoliaJSONP_"+this.jsonpCounter,f=!1,g=null;window[e]=function(a){b.callback(!1,!0,null,a);try{delete window[e]}catch(c){window[e]=void 0}},d.type="text/javascript",d.src=a+"?callback="+e+"&X-Algolia-Application-Id="+this.applicationID+"&X-Algolia-API-Key="+this.apiKey,this.tagFilters&&(d.src+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),this.userToken&&(d.src+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken));for(var h=0;h<this.extraHeaders.length;++h)d.src+="&"+this.extraHeaders[h].key+"="+this.extraHeaders[h].value;b.body&&b.body.params&&(d.src+="&"+b.body.params),g=setTimeout(function(){d.onload=d.onreadystatechange=d.onerror=null,window[e]=function(){try{delete window[e]}catch(a){window[e]=void 0}},b.callback(!0,!1,null,{message:"Timeout - Failed to load JSONP script."}),c.removeChild(d),clearTimeout(g),g=null},this.requestTimeoutInMs),d.onload=d.onreadystatechange=function(){if(clearTimeout(g),g=null,!(f||this.readyState&&"loaded"!=this.readyState&&"complete"!=this.readyState)){if(f=!0,"undefined"==typeof window[e+"_loaded"]){b.callback(!0,!1,null,{message:"Failed to load JSONP script."});try{delete window[e]}catch(a){window[e]=void 0}}else try{delete window[e+"_loaded"]}catch(a){window[e+"_loaded"]=void 0}d.onload=d.onreadystatechange=null,c.removeChild(d)}},d.onerror=function(){clearTimeout(g),g=null,b.callback(!0,!1,null,{message:"Failed to load JSONP script."}),c.removeChild(d);try{delete window[e]}catch(a){window[e]=void 0}},c.appendChild(d)},_makeXmlHttpRequestByHost:function(a,b){var c=this,d=window.XMLHttpRequest?new XMLHttpRequest:{},e=null,f=null;this._isUndefined(b.body)||(e=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var g=0;g<this.extraHeaders.length;++g)a+="&"+this.extraHeaders[g].key+"="+this.extraHeaders[g].value;if("withCredentials"in d)d.open(b.method,a,!0),d.timeout=this.requestTimeoutInMs*(b.successiveRetryCount+1),null!==e&&d.setRequestHeader("Content-type","application/x-www-form-urlencoded");else{if("undefined"==typeof XDomainRequest)return void b.callback(!1,!1,null,{message:"CORS not supported"});d=new XDomainRequest,d.open(b.method,a)}f=setTimeout(function(){return d.abort(),d.aborted===!0?void stopLoadAnimation():(b.callback(!0,!1,null,{message:"Timeout - Could not connect to endpoint "+a}),clearTimeout(f),void(f=null))},this.requestTimeoutInMs*(b.successiveRetryCount+1)),d.onload=function(a){if(clearTimeout(f),f=null,c._isUndefined(a)||null===a.target)b.callback(!1,!0,a,JSON.parse(d.responseText));else{var e=!1,g=null;"undefined"!=typeof XDomainRequest?(g=a.target.responseText,e=g&&g.length>0):(g=a.target.response,e=200===a.target.status||201===a.target.status);var h=!e&&400!==a.target.status&&403!==a.target.status&&404!==a.target.status;b.callback(h,e,a.target,g?JSON.parse(g):null)}},d.ontimeout=function(){},d.onerror=function(a){clearTimeout(f),f=null,b.callback(!0,!1,null,{message:"Could not connect to host",error:a})},d.send(e)},_getSearchParams:function(a,b){if(this._isUndefined(a)||null===a)return b;for(var c in a)null!==c&&a.hasOwnProperty(c)&&(b+=0===b.length?"?":"&",b+=c+"="+encodeURIComponent("[object Array]"===Object.prototype.toString.call(a[c])?JSON.stringify(a[c]):a[c]));return b},_isUndefined:function(a){return void 0===a},applicationID:null,apiKey:null,tagFilters:null,userToken:null,hosts:[],extraHeaders:[]},AlgoliaSearch.prototype.Index.prototype={clearCache:function(){this.cache={}},addObject:function(a,b,c){var d=this;return this.as._jsonRequest(this.as._isUndefined(c)?{method:"POST",url:"/1/indexes/"+encodeURIComponent(d.indexName),body:a,callback:b}:{method:"PUT",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(c),body:a,callback:b})},addObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"addObject",body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},getObject:function(a,b,c){"[object Array]"!==Object.prototype.toString.call(b)||c||(c=b,b=null);var d=this,e="";if(!this.as._isUndefined(c)){e="?attributes=";for(var f=0;f<c.length;++f)0!==f&&(e+=","),e+=c[f]}if(null===this.as.jsonp)return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(a)+e,callback:b});var g={params:e};return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(a),callback:b,body:g})},partialUpdateObject:function(a,b){var c=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID)+"/partial",body:a,callback:b})},partialUpdateObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"partialUpdateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},saveObject:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID),body:a,callback:b})},saveObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"updateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},deleteObject:function(a,b){if(null===a||0===a.length)return void b(!1,{message:"empty objectID"});var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a),callback:b})},search:function(a,b,c,d){(void 0===a||null===a)&&(a=""),"function"==typeof a&&(b=a,a=""),"object"!=typeof b||!this.as._isUndefined(c)&&c||(c=b,b=null);var e=this,f="query="+encodeURIComponent(a);if(this.as._isUndefined(c)||null===c||(f=this.as._getSearchParams(c,f)),window.clearTimeout(e.onDelayTrigger),this.as._isUndefined(d)||null===d||!(d>0))return this._search(f,b);var g=window.setTimeout(function(){e._search(f,b)},d);e.onDelayTrigger=g},browse:function(a,b,c){+b>0&&(this.as._isUndefined(c)||!c)&&(c=b,b=null);var d=this,e="?page="+a;return this.as._isUndefined(c)||(e+="&hitsPerPage="+c),this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/browse"+e,callback:b})},ttAdapter:function(a){var b=this;return function(c,d){b.search(c,function(a,b){a&&d(b.hits)},a)}},waitTask:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/task/"+a,callback:function(d,e){d?"published"===e.status?b(!0,e):setTimeout(function(){c.waitTask(a,b)},100):b(!1,e)}})},clearIndex:function(a){var b=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/clear",callback:a})},getSettings:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/settings",callback:a})},setSettings:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/settings",body:a,callback:b})},listUserKeys:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/keys",callback:a})},getUserKeyACL:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},deleteUserKey:function(a,b){var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},addUserKey:function(a,b){var c=this,d={};return d.acl=a,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys",body:d,callback:b})},addUserKeyWithValidity:function(a,b,c,d,e){var f=this,g={};return g.acl=a,g.validity=b,g.maxQueriesPerIPPerHour=c,g.maxHitsPerQuery=d,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(f.indexName)+"/keys",body:g,callback:e})},_search:function(a,b){var c={params:a};if(null===this.as.jsonp){var d=this;return this.as._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:function(c,e){c?(d.as.jsonp=!1,b&&b(c,e)):(d.as.jsonp=!0,d._search(a,b))}})}return this.as._jsonRequest(this.as.jsonp?{cache:this.cache,method:"GET",url:"/1/indexes/"+encodeURIComponent(this.indexName),body:c,callback:b}:{cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:b})},as:null,indexName:null,typeAheadArgs:null,typeAheadValueOption:null},function(){var a=function(a){a=a||{};for(var b=1;b<arguments.length;b++)if(arguments[b])for(var c in arguments[b])arguments[b].hasOwnProperty(c)&&(a[c]=arguments[b][c]);return a};window.AlgoliaSearchHelper=function(b,c,d){var e={facets:[],disjunctiveFacets:[],hitsPerPage:20,defaultFacetFilters:[]};this.init(b,c,a({},e,d))},AlgoliaSearchHelper.prototype={init:function(a,b,c){this.client=a,this.index=b,this.options=c,this.page=0,this.refinements={},this.excludes={},this.disjunctiveRefinements={},this.extraQueries=[]},search:function(a,b,c){this.q=a,this.searchCallback=b,this.searchParams=c||{},this.page=this.page||0,this.refinements=this.refinements||{},this.disjunctiveRefinements=this.disjunctiveRefinements||{},this._search()},clearRefinements:function(){this.disjunctiveRefinements={},this.refinements={}},addDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{},this.disjunctiveRefinements[a][b]=!0},removeDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};try{delete this.disjunctiveRefinements[a][b]}catch(c){this.disjunctiveRefinements[a][b]=void 0}},addRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!0},removeRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!1},addExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!0},removeExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!1},toggleExclude:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":-"+b;return this.excludes[d]=!this.excludes[d],this.page=0,this._search(),!0}return!1},toggleRefine:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":"+b;return this.refinements[d]=!this.refinements[d],this.page=0,this._search(),!0}this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};for(var e=0;e<this.options.disjunctiveFacets.length;++e)if(this.options.disjunctiveFacets[e]==a)return this.disjunctiveRefinements[a][b]=!this.disjunctiveRefinements[a][b],this.page=0,this._search(),!0;return!1},isRefined:function(a,b){var c=a+":"+b;return this.refinements[c]?!0:this.disjunctiveRefinements[a]&&this.disjunctiveRefinements[a][b]?!0:!1},isExcluded:function(a,b){var c=a+":-"+b;return this.excludes[c]?!0:!1},nextPage:function(){this._gotoPage(this.page+1)},previousPage:function(){this.page>0&&this._gotoPage(this.page-1)},gotoPage:function(a){this._gotoPage(a)},setPage:function(a){this.page=a},setIndex:function(a){this.index=a},getIndex:function(){return this.index},clearExtraQueries:function(){this.extraQueries=[]},addExtraQuery:function(a,b,c){this.extraQueries.push({index:a,query:b,params:c||{}})},_gotoPage:function(a){this.page=a,this._search()},_search:function(){this.client.startQueriesBatch(),this.client.addQueryInBatch(this.index,this.q,this._getHitsSearchParams());var a=[],b={},c=0;for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)?a.push(d):b[d]=!0}for(c=0;c<a.length;++c)this.client.addQueryInBatch(this.index,this.q,this._getDisjunctiveFacetSearchParams(a[c]));for(c=0;c<this.extraQueries.length;++c)this.client.addQueryInBatch(this.extraQueries[c].index,this.extraQueries[c].query,this.extraQueries[c].params);var e=this;this.client.sendQueriesBatch(function(d,f){if(!d)return void e.searchCallback(!1,f);var g=f.results[0];g.disjunctiveFacets=g.disjunctiveFacets||{},g.facetStats=g.facetStats||{};for(var h in b)if(g.facets[h]&&!g.disjunctiveFacets[h]){g.disjunctiveFacets[h]=g.facets[h];try{delete g.facets[h]}catch(i){g.facets[h]=void 0}}for(c=0;c<a.length;++c){for(var j in f.results[c+1].facets)if(g.disjunctiveFacets[j]=f.results[c+1].facets[j],e.disjunctiveRefinements[j])for(var k in e.disjunctiveRefinements[j])!g.disjunctiveFacets[j][k]&&e.disjunctiveRefinements[j][k]&&(g.disjunctiveFacets[j][k]=0);for(var l in f.results[c+1].facets_stats)g.facetStats[l]=f.results[c+1].facets_stats[l]}for(var m in e.excludes)if(e.excludes[m]){var i=m.indexOf(":-"),h=m.slice(0,i),k=m.slice(i+2);g.facets[h]=g.facets[h]||{},g.facets[h][k]||(g.facets[h][k]=0)}if(0===e.extraQueries.length)e.searchCallback(!0,g);else{var n={results:[g]};for(c=0;c<e.extraQueries.length;++c)n.results.push(f.results[1+a.length+c]);e.searchCallback(!0,n)}})},_getHitsSearchParams:function(){var b=[],c=0;for(c=0;c<this.options.facets.length;++c)b.push(this.options.facets[c]);for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)||b.push(d)}return a({},{hitsPerPage:this.options.hitsPerPage,page:this.page,facets:b,facetFilters:this._getFacetFilters()},this.searchParams)},_getDisjunctiveFacetSearchParams:function(b){return a({},this.searchParams,{hitsPerPage:1,page:0,attributesToRetrieve:[],attributesToHighlight:[],attributesToSnippet:[],facets:b,facetFilters:this._getFacetFilters(b)})},_hasDisjunctiveRefinements:function(a){for(var b in this.disjunctiveRefinements[a])if(this.disjunctiveRefinements[a][b])return!0;return!1},_getFacetFilters:function(a){var b=[];if(this.options.defaultFacetFilters)for(var c=0;c<this.options.defaultFacetFilters.length;++c)b.push(this.options.defaultFacetFilters[c]);for(var d in this.refinements)this.refinements[d]&&b.push(d);for(var d in this.excludes)this.excludes[d]&&b.push(d);for(var e in this.disjunctiveRefinements)if(e!=a){var f=[];for(var g in this.disjunctiveRefinements[e])this.disjunctiveRefinements[e][g]&&f.push(e+":"+g);f.length>0&&b.push(f)}return b}}}(),function(){window.AlgoliaPlaces=function(a,b){this.init(a,b)},AlgoliaPlaces.prototype={init:function(a,b){this.client=new AlgoliaSearch(a,b,"http",!0,["places-1.algolia.io","places-2.algolia.io","places-3.algolia.io"]),this.cache={}},search:function(a,b,c){var d="query="+encodeURIComponent(a);this.client._isUndefined(c)||null==c||(d=this.client._getSearchParams(c,d));var e={params:d,apiKey:this.client.apiKey,appID:this.client.applicationID};this.client._jsonRequest({cache:this.cache,method:"POST",url:"/1/places/query",body:e,callback:b,removeCustomHTTPHeaders:!0})}}}(),"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(a){return 10>a?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return"string"==typeof b?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g,h=gap,i=b[a];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(a)),"function"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,g=[],"[object Array]"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;f>c;c+=1)g[c]=str(c,i)||"null";return e=0===g.length?"[]":gap?"[\n"+gap+g.join(",\n"+gap)+"\n"+h+"]":"["+g.join(",")+"]",gap=h,e}if(rep&&"object"==typeof rep)for(f=rep.length,c=0;f>c;c+=1)"string"==typeof rep[c]&&(d=rep[c],e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));else for(d in i)Object.prototype.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));return e=0===g.length?"{}":gap?"{\n"+gap+g.join(",\n"+gap)+"\n"+h+"}":"{"+g.join(",")+"}",gap=h,e}}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var cx,escapable,gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(a,b,c){var d;if(gap="",indent="","number"==typeof c)for(d=0;c>d;d+=1)indent+=" ";else"string"==typeof c&&(indent=c);if(rep=b,b&&"function"!=typeof b&&("object"!=typeof b||"number"!=typeof b.length))throw new Error("JSON.stringify");return str("",{"":a})}),"function"!=typeof JSON.parse&&(cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: algoliasearch-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.13
4
+ version: 1.11.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Algolia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-03 00:00:00.000000000 Z
11
+ date: 2015-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
164
  version: '0'
165
165
  requirements: []
166
166
  rubyforge_project:
167
- rubygems_version: 2.2.2
167
+ rubygems_version: 2.4.5
168
168
  signing_key:
169
169
  specification_version: 4
170
170
  summary: AlgoliaSearch integration to your favorite ORM