1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
'use strict';
// This is the jQuery Algolia Search module
// It's using $.ajax to do requests with a JSONP fallback
// jQuery promises are returned
var inherits = require('inherits');
var AlgoliaSearch = require('../../AlgoliaSearch');
var errors = require('../../errors');
var inlineHeaders = require('../inline-headers');
var jsonpRequest = require('../jsonp-request');
var places = require('../../places.js');
// expose original algoliasearch fn in window
window.algoliasearch = require('./algoliasearch');
if (process.env.NODE_ENV === 'debug') {
require('debug').enable('algoliasearch*');
}
function algoliasearch(applicationID, apiKey, opts) {
var cloneDeep = require('../../clone.js');
opts = cloneDeep(opts || {});
opts._ua = opts._ua || algoliasearch.ua;
return new AlgoliaSearchJQuery(applicationID, apiKey, opts);
}
algoliasearch.version = require('../../version.js');
algoliasearch.ua = 'Algolia for jQuery ' + algoliasearch.version;
algoliasearch.initPlaces = places(algoliasearch);
// we expose into window no matter how we are used, this will allow
// us to easily debug any website running algolia
window.__algolia = {
debug: require('debug'),
algoliasearch: algoliasearch
};
var $ = window.jQuery;
$.algolia = {
Client: algoliasearch,
ua: algoliasearch.ua,
version: algoliasearch.version
};
function AlgoliaSearchJQuery() {
// call AlgoliaSearch constructor
AlgoliaSearch.apply(this, arguments);
}
inherits(AlgoliaSearchJQuery, AlgoliaSearch);
AlgoliaSearchJQuery.prototype._request = function request(url, opts) {
return new $.Deferred(function(deferred) {
var body = opts.body;
url = inlineHeaders(url, opts.headers);
var requestHeaders = {
accept: 'application/json'
};
if (body) {
if (opts.method === 'POST') {
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Simple_requests
requestHeaders['content-type'] = 'application/x-www-form-urlencoded';
} else {
requestHeaders['content-type'] = 'application/json';
}
}
$.ajax(url, {
type: opts.method,
timeout: opts.timeouts.complete,
dataType: 'json',
data: body,
headers: requestHeaders,
complete: function onComplete(jqXHR, textStatus/* , error*/) {
if (textStatus === 'timeout') {
deferred.reject(new errors.RequestTimeout());
return;
}
if (jqXHR.status === 0) {
deferred.reject(
new errors.Network({
more: jqXHR
})
);
return;
}
deferred.resolve({
statusCode: jqXHR.status,
body: jqXHR.responseJSON,
responseText: jqXHR.responseText,
headers: jqXHR.getAllResponseHeaders()
});
}
});
}).promise();
};
// using IE8 or IE9 we will always end up here
// jQuery does not not fallback to XDomainRequest
AlgoliaSearchJQuery.prototype._request.fallback = function requestFallback(url, opts) {
url = inlineHeaders(url, opts.headers);
return new $.Deferred(function wrapJsonpRequest(deferred) {
jsonpRequest(url, opts, function jsonpRequestDone(err, content) {
if (err) {
deferred.reject(err);
return;
}
deferred.resolve(content);
});
}).promise();
};
AlgoliaSearchJQuery.prototype._promise = {
reject: function reject(val) {
return new $.Deferred(function rejectDeferred(deferred) {
deferred.reject(val);
}).promise();
},
resolve: function resolve(val) {
return new $.Deferred(function resolveDeferred(deferred) {
deferred.resolve(val);
}).promise();
},
delay: function delay(ms) {
return new $.Deferred(function delayResolve(deferred) {
setTimeout(function resolveDeferred() {
deferred.resolve();
}, ms);
}).promise();
},
all: function all(promises) {
return $.when.apply(null, promises);
}
};
|