selectivity-rails 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9962649945a0f217355e4e18ea370d25b1aec02
4
- data.tar.gz: 7e58ef158675932c42c21c7683d0030fabd2bdae
3
+ metadata.gz: 9d7c74200a4009b6c4523c5d5e2e9df35121bfba
4
+ data.tar.gz: 974239a9e5a5741fe860924024e0f43933bb2a67
5
5
  SHA512:
6
- metadata.gz: d5bd4d195d05ddee4d51a35234ae4e7db8d4da1980573dac036a3fcb426ff33bd2605f3941da9d072f3111872a6caccbccb09e7de0ebf561dd0fc56b2e60c885
7
- data.tar.gz: 3e0a5c418e0efbda4a8815e4d7e7c7cc3a7b7fabd32e3b0df2e1d99e35220b754cc85d02d556c7e57e2e42e72a03ef0b9d7d2da6719d35ddfedf726323a678bb
6
+ metadata.gz: d5856966a409c802589e8d08d92223604219204be9b846beb4e5070c474bd41bfe4c1996021d4f43a19e1d53086161296a6919fcce9ea5d44cf7b43e27cdc712
7
+ data.tar.gz: 945a04f91a285cfc8da1f3fc6afafc105e9008408a11e48aa046ef612981a9c205353b938cc59a874edd73d5837db3ca0f44c64be24776b6e9576340540228be
@@ -1,5 +1,5 @@
1
1
  module Selectivity
2
2
  module Rails
3
- VERSION = '0.1.8'
3
+ VERSION = '0.1.9'
4
4
  end
5
5
  end
@@ -5,9 +5,597 @@
5
5
  * (c) 2016 Speakap BV
6
6
  * Available under MIT license <https://github.com/arendjr/selectivity/blob/master/LICENSE>
7
7
  */
8
- !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.selectivity=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
9
- _dereq_(5);_dereq_(6);_dereq_(7);_dereq_(9);_dereq_(10);_dereq_(11);_dereq_(12);_dereq_(13);_dereq_(14);_dereq_(15);_dereq_(16);_dereq_(17);_dereq_(18);_dereq_(19);module.exports=_dereq_(8);
10
- },{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"5":5,"6":6,"7":7,"8":8,"9":9}],2:[function(_dereq_,module,exports){
8
+ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.selectivity = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
9
+ var root = _dereq_(4);
10
+
11
+ /** Built-in value references. */
12
+ var Symbol = root.Symbol;
13
+
14
+ module.exports = Symbol;
15
+
16
+ },{"4":4}],2:[function(_dereq_,module,exports){
17
+ /**
18
+ * Checks if `value` is a global object.
19
+ *
20
+ * @private
21
+ * @param {*} value The value to check.
22
+ * @returns {null|Object} Returns `value` if it's a global object, else `null`.
23
+ */
24
+ function checkGlobal(value) {
25
+ return (value && value.Object === Object) ? value : null;
26
+ }
27
+
28
+ module.exports = checkGlobal;
29
+
30
+ },{}],3:[function(_dereq_,module,exports){
31
+ /** Used to map characters to HTML entities. */
32
+ var htmlEscapes = {
33
+ '&': '&amp;',
34
+ '<': '&lt;',
35
+ '>': '&gt;',
36
+ '"': '&quot;',
37
+ "'": '&#39;',
38
+ '`': '&#96;'
39
+ };
40
+
41
+ /**
42
+ * Used by `_.escape` to convert characters to HTML entities.
43
+ *
44
+ * @private
45
+ * @param {string} chr The matched character to escape.
46
+ * @returns {string} Returns the escaped character.
47
+ */
48
+ function escapeHtmlChar(chr) {
49
+ return htmlEscapes[chr];
50
+ }
51
+
52
+ module.exports = escapeHtmlChar;
53
+
54
+ },{}],4:[function(_dereq_,module,exports){
55
+ (function (global){
56
+ var checkGlobal = _dereq_(2);
57
+
58
+ /** Used to determine if values are of the language type `Object`. */
59
+ var objectTypes = {
60
+ 'function': true,
61
+ 'object': true
62
+ };
63
+
64
+ /** Detect free variable `exports`. */
65
+ var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType)
66
+ ? exports
67
+ : undefined;
68
+
69
+ /** Detect free variable `module`. */
70
+ var freeModule = (objectTypes[typeof module] && module && !module.nodeType)
71
+ ? module
72
+ : undefined;
73
+
74
+ /** Detect free variable `global` from Node.js. */
75
+ var freeGlobal = checkGlobal(freeExports && freeModule && typeof global == 'object' && global);
76
+
77
+ /** Detect free variable `self`. */
78
+ var freeSelf = checkGlobal(objectTypes[typeof self] && self);
79
+
80
+ /** Detect free variable `window`. */
81
+ var freeWindow = checkGlobal(objectTypes[typeof window] && window);
82
+
83
+ /** Detect `this` as the global object. */
84
+ var thisGlobal = checkGlobal(objectTypes[typeof this] && this);
85
+
86
+ /**
87
+ * Used as a reference to the global object.
88
+ *
89
+ * The `this` value is used if it's the global object to avoid Greasemonkey's
90
+ * restricted `window` object, otherwise the `window` object is used.
91
+ */
92
+ var root = freeGlobal ||
93
+ ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) ||
94
+ freeSelf || thisGlobal || Function('return this')();
95
+
96
+ module.exports = root;
97
+
98
+ }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
99
+ },{"2":2}],5:[function(_dereq_,module,exports){
100
+ var isObject = _dereq_(8),
101
+ now = _dereq_(11),
102
+ toNumber = _dereq_(12);
103
+
104
+ /** Used as the `TypeError` message for "Functions" methods. */
105
+ var FUNC_ERROR_TEXT = 'Expected a function';
106
+
107
+ /* Built-in method references for those with the same name as other `lodash` methods. */
108
+ var nativeMax = Math.max;
109
+
110
+ /**
111
+ * Creates a debounced function that delays invoking `func` until after `wait`
112
+ * milliseconds have elapsed since the last time the debounced function was
113
+ * invoked. The debounced function comes with a `cancel` method to cancel
114
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
115
+ * Provide an options object to indicate whether `func` should be invoked on
116
+ * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked
117
+ * with the last arguments provided to the debounced function. Subsequent calls
118
+ * to the debounced function return the result of the last `func` invocation.
119
+ *
120
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
121
+ * on the trailing edge of the timeout only if the debounced function is
122
+ * invoked more than once during the `wait` timeout.
123
+ *
124
+ * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
125
+ * for details over the differences between `_.debounce` and `_.throttle`.
126
+ *
127
+ * @static
128
+ * @memberOf _
129
+ * @category Function
130
+ * @param {Function} func The function to debounce.
131
+ * @param {number} [wait=0] The number of milliseconds to delay.
132
+ * @param {Object} [options] The options object.
133
+ * @param {boolean} [options.leading=false] Specify invoking on the leading
134
+ * edge of the timeout.
135
+ * @param {number} [options.maxWait] The maximum time `func` is allowed to be
136
+ * delayed before it's invoked.
137
+ * @param {boolean} [options.trailing=true] Specify invoking on the trailing
138
+ * edge of the timeout.
139
+ * @returns {Function} Returns the new debounced function.
140
+ * @example
141
+ *
142
+ * // Avoid costly calculations while the window size is in flux.
143
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
144
+ *
145
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
146
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
147
+ * 'leading': true,
148
+ * 'trailing': false
149
+ * }));
150
+ *
151
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
152
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
153
+ * var source = new EventSource('/stream');
154
+ * jQuery(source).on('message', debounced);
155
+ *
156
+ * // Cancel the trailing debounced invocation.
157
+ * jQuery(window).on('popstate', debounced.cancel);
158
+ */
159
+ function debounce(func, wait, options) {
160
+ var args,
161
+ maxTimeoutId,
162
+ result,
163
+ stamp,
164
+ thisArg,
165
+ timeoutId,
166
+ trailingCall,
167
+ lastCalled = 0,
168
+ leading = false,
169
+ maxWait = false,
170
+ trailing = true;
171
+
172
+ if (typeof func != 'function') {
173
+ throw new TypeError(FUNC_ERROR_TEXT);
174
+ }
175
+ wait = toNumber(wait) || 0;
176
+ if (isObject(options)) {
177
+ leading = !!options.leading;
178
+ maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);
179
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
180
+ }
181
+
182
+ function cancel() {
183
+ if (timeoutId) {
184
+ clearTimeout(timeoutId);
185
+ }
186
+ if (maxTimeoutId) {
187
+ clearTimeout(maxTimeoutId);
188
+ }
189
+ lastCalled = 0;
190
+ args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;
191
+ }
192
+
193
+ function complete(isCalled, id) {
194
+ if (id) {
195
+ clearTimeout(id);
196
+ }
197
+ maxTimeoutId = timeoutId = trailingCall = undefined;
198
+ if (isCalled) {
199
+ lastCalled = now();
200
+ result = func.apply(thisArg, args);
201
+ if (!timeoutId && !maxTimeoutId) {
202
+ args = thisArg = undefined;
203
+ }
204
+ }
205
+ }
206
+
207
+ function delayed() {
208
+ var remaining = wait - (now() - stamp);
209
+ if (remaining <= 0 || remaining > wait) {
210
+ complete(trailingCall, maxTimeoutId);
211
+ } else {
212
+ timeoutId = setTimeout(delayed, remaining);
213
+ }
214
+ }
215
+
216
+ function flush() {
217
+ if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {
218
+ result = func.apply(thisArg, args);
219
+ }
220
+ cancel();
221
+ return result;
222
+ }
223
+
224
+ function maxDelayed() {
225
+ complete(trailing, timeoutId);
226
+ }
227
+
228
+ function debounced() {
229
+ args = arguments;
230
+ stamp = now();
231
+ thisArg = this;
232
+ trailingCall = trailing && (timeoutId || !leading);
233
+
234
+ if (maxWait === false) {
235
+ var leadingCall = leading && !timeoutId;
236
+ } else {
237
+ if (!lastCalled && !maxTimeoutId && !leading) {
238
+ lastCalled = stamp;
239
+ }
240
+ var remaining = maxWait - (stamp - lastCalled);
241
+
242
+ var isCalled = (remaining <= 0 || remaining > maxWait) &&
243
+ (leading || maxTimeoutId);
244
+
245
+ if (isCalled) {
246
+ if (maxTimeoutId) {
247
+ maxTimeoutId = clearTimeout(maxTimeoutId);
248
+ }
249
+ lastCalled = stamp;
250
+ result = func.apply(thisArg, args);
251
+ }
252
+ else if (!maxTimeoutId) {
253
+ maxTimeoutId = setTimeout(maxDelayed, remaining);
254
+ }
255
+ }
256
+ if (isCalled && timeoutId) {
257
+ timeoutId = clearTimeout(timeoutId);
258
+ }
259
+ else if (!timeoutId && wait !== maxWait) {
260
+ timeoutId = setTimeout(delayed, wait);
261
+ }
262
+ if (leadingCall) {
263
+ isCalled = true;
264
+ result = func.apply(thisArg, args);
265
+ }
266
+ if (isCalled && !timeoutId && !maxTimeoutId) {
267
+ args = thisArg = undefined;
268
+ }
269
+ return result;
270
+ }
271
+ debounced.cancel = cancel;
272
+ debounced.flush = flush;
273
+ return debounced;
274
+ }
275
+
276
+ module.exports = debounce;
277
+
278
+ },{"11":11,"12":12,"8":8}],6:[function(_dereq_,module,exports){
279
+ var escapeHtmlChar = _dereq_(3),
280
+ toString = _dereq_(13);
281
+
282
+ /** Used to match HTML entities and HTML characters. */
283
+ var reUnescapedHtml = /[&<>"'`]/g,
284
+ reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
285
+
286
+ /**
287
+ * Converts the characters "&", "<", ">", '"', "'", and "\`" in `string` to
288
+ * their corresponding HTML entities.
289
+ *
290
+ * **Note:** No other characters are escaped. To escape additional
291
+ * characters use a third-party library like [_he_](https://mths.be/he).
292
+ *
293
+ * Though the ">" character is escaped for symmetry, characters like
294
+ * ">" and "/" don't need escaping in HTML and have no special meaning
295
+ * unless they're part of a tag or unquoted attribute value.
296
+ * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
297
+ * (under "semi-related fun fact") for more details.
298
+ *
299
+ * Backticks are escaped because in IE < 9, they can break out of
300
+ * attribute values or HTML comments. See [#59](https://html5sec.org/#59),
301
+ * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and
302
+ * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)
303
+ * for more details.
304
+ *
305
+ * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)
306
+ * to reduce XSS vectors.
307
+ *
308
+ * @static
309
+ * @memberOf _
310
+ * @category String
311
+ * @param {string} [string=''] The string to escape.
312
+ * @returns {string} Returns the escaped string.
313
+ * @example
314
+ *
315
+ * _.escape('fred, barney, & pebbles');
316
+ * // => 'fred, barney, &amp; pebbles'
317
+ */
318
+ function escape(string) {
319
+ string = toString(string);
320
+ return (string && reHasUnescapedHtml.test(string))
321
+ ? string.replace(reUnescapedHtml, escapeHtmlChar)
322
+ : string;
323
+ }
324
+
325
+ module.exports = escape;
326
+
327
+ },{"13":13,"3":3}],7:[function(_dereq_,module,exports){
328
+ var isObject = _dereq_(8);
329
+
330
+ /** `Object#toString` result references. */
331
+ var funcTag = '[object Function]',
332
+ genTag = '[object GeneratorFunction]';
333
+
334
+ /** Used for built-in method references. */
335
+ var objectProto = Object.prototype;
336
+
337
+ /**
338
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
339
+ * of values.
340
+ */
341
+ var objectToString = objectProto.toString;
342
+
343
+ /**
344
+ * Checks if `value` is classified as a `Function` object.
345
+ *
346
+ * @static
347
+ * @memberOf _
348
+ * @category Lang
349
+ * @param {*} value The value to check.
350
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
351
+ * @example
352
+ *
353
+ * _.isFunction(_);
354
+ * // => true
355
+ *
356
+ * _.isFunction(/abc/);
357
+ * // => false
358
+ */
359
+ function isFunction(value) {
360
+ // The use of `Object#toString` avoids issues with the `typeof` operator
361
+ // in Safari 8 which returns 'object' for typed array and weak map constructors,
362
+ // and PhantomJS 1.9 which returns 'function' for `NodeList` instances.
363
+ var tag = isObject(value) ? objectToString.call(value) : '';
364
+ return tag == funcTag || tag == genTag;
365
+ }
366
+
367
+ module.exports = isFunction;
368
+
369
+ },{"8":8}],8:[function(_dereq_,module,exports){
370
+ /**
371
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
372
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
373
+ *
374
+ * @static
375
+ * @memberOf _
376
+ * @category Lang
377
+ * @param {*} value The value to check.
378
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
379
+ * @example
380
+ *
381
+ * _.isObject({});
382
+ * // => true
383
+ *
384
+ * _.isObject([1, 2, 3]);
385
+ * // => true
386
+ *
387
+ * _.isObject(_.noop);
388
+ * // => true
389
+ *
390
+ * _.isObject(null);
391
+ * // => false
392
+ */
393
+ function isObject(value) {
394
+ var type = typeof value;
395
+ return !!value && (type == 'object' || type == 'function');
396
+ }
397
+
398
+ module.exports = isObject;
399
+
400
+ },{}],9:[function(_dereq_,module,exports){
401
+ /**
402
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
403
+ * and has a `typeof` result of "object".
404
+ *
405
+ * @static
406
+ * @memberOf _
407
+ * @category Lang
408
+ * @param {*} value The value to check.
409
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
410
+ * @example
411
+ *
412
+ * _.isObjectLike({});
413
+ * // => true
414
+ *
415
+ * _.isObjectLike([1, 2, 3]);
416
+ * // => true
417
+ *
418
+ * _.isObjectLike(_.noop);
419
+ * // => false
420
+ *
421
+ * _.isObjectLike(null);
422
+ * // => false
423
+ */
424
+ function isObjectLike(value) {
425
+ return !!value && typeof value == 'object';
426
+ }
427
+
428
+ module.exports = isObjectLike;
429
+
430
+ },{}],10:[function(_dereq_,module,exports){
431
+ var isObjectLike = _dereq_(9);
432
+
433
+ /** `Object#toString` result references. */
434
+ var symbolTag = '[object Symbol]';
435
+
436
+ /** Used for built-in method references. */
437
+ var objectProto = Object.prototype;
438
+
439
+ /**
440
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
441
+ * of values.
442
+ */
443
+ var objectToString = objectProto.toString;
444
+
445
+ /**
446
+ * Checks if `value` is classified as a `Symbol` primitive or object.
447
+ *
448
+ * @static
449
+ * @memberOf _
450
+ * @category Lang
451
+ * @param {*} value The value to check.
452
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
453
+ * @example
454
+ *
455
+ * _.isSymbol(Symbol.iterator);
456
+ * // => true
457
+ *
458
+ * _.isSymbol('abc');
459
+ * // => false
460
+ */
461
+ function isSymbol(value) {
462
+ return typeof value == 'symbol' ||
463
+ (isObjectLike(value) && objectToString.call(value) == symbolTag);
464
+ }
465
+
466
+ module.exports = isSymbol;
467
+
468
+ },{"9":9}],11:[function(_dereq_,module,exports){
469
+ /**
470
+ * Gets the timestamp of the number of milliseconds that have elapsed since
471
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
472
+ *
473
+ * @static
474
+ * @memberOf _
475
+ * @type {Function}
476
+ * @category Date
477
+ * @returns {number} Returns the timestamp.
478
+ * @example
479
+ *
480
+ * _.defer(function(stamp) {
481
+ * console.log(_.now() - stamp);
482
+ * }, _.now());
483
+ * // => logs the number of milliseconds it took for the deferred function to be invoked
484
+ */
485
+ var now = Date.now;
486
+
487
+ module.exports = now;
488
+
489
+ },{}],12:[function(_dereq_,module,exports){
490
+ var isFunction = _dereq_(7),
491
+ isObject = _dereq_(8);
492
+
493
+ /** Used as references for various `Number` constants. */
494
+ var NAN = 0 / 0;
495
+
496
+ /** Used to match leading and trailing whitespace. */
497
+ var reTrim = /^\s+|\s+$/g;
498
+
499
+ /** Used to detect bad signed hexadecimal string values. */
500
+ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
501
+
502
+ /** Used to detect binary string values. */
503
+ var reIsBinary = /^0b[01]+$/i;
504
+
505
+ /** Used to detect octal string values. */
506
+ var reIsOctal = /^0o[0-7]+$/i;
507
+
508
+ /** Built-in method references without a dependency on `root`. */
509
+ var freeParseInt = parseInt;
510
+
511
+ /**
512
+ * Converts `value` to a number.
513
+ *
514
+ * @static
515
+ * @memberOf _
516
+ * @category Lang
517
+ * @param {*} value The value to process.
518
+ * @returns {number} Returns the number.
519
+ * @example
520
+ *
521
+ * _.toNumber(3);
522
+ * // => 3
523
+ *
524
+ * _.toNumber(Number.MIN_VALUE);
525
+ * // => 5e-324
526
+ *
527
+ * _.toNumber(Infinity);
528
+ * // => Infinity
529
+ *
530
+ * _.toNumber('3');
531
+ * // => 3
532
+ */
533
+ function toNumber(value) {
534
+ if (isObject(value)) {
535
+ var other = isFunction(value.valueOf) ? value.valueOf() : value;
536
+ value = isObject(other) ? (other + '') : other;
537
+ }
538
+ if (typeof value != 'string') {
539
+ return value === 0 ? value : +value;
540
+ }
541
+ value = value.replace(reTrim, '');
542
+ var isBinary = reIsBinary.test(value);
543
+ return (isBinary || reIsOctal.test(value))
544
+ ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
545
+ : (reIsBadHex.test(value) ? NAN : +value);
546
+ }
547
+
548
+ module.exports = toNumber;
549
+
550
+ },{"7":7,"8":8}],13:[function(_dereq_,module,exports){
551
+ var Symbol = _dereq_(1),
552
+ isSymbol = _dereq_(10);
553
+
554
+ /** Used as references for various `Number` constants. */
555
+ var INFINITY = 1 / 0;
556
+
557
+ /** Used to convert symbols to primitives and strings. */
558
+ var symbolProto = Symbol ? Symbol.prototype : undefined,
559
+ symbolToString = symbolProto ? symbolProto.toString : undefined;
560
+
561
+ /**
562
+ * Converts `value` to a string if it's not one. An empty string is returned
563
+ * for `null` and `undefined` values. The sign of `-0` is preserved.
564
+ *
565
+ * @static
566
+ * @memberOf _
567
+ * @category Lang
568
+ * @param {*} value The value to process.
569
+ * @returns {string} Returns the string.
570
+ * @example
571
+ *
572
+ * _.toString(null);
573
+ * // => ''
574
+ *
575
+ * _.toString(-0);
576
+ * // => '-0'
577
+ *
578
+ * _.toString([1, 2, 3]);
579
+ * // => '1,2,3'
580
+ */
581
+ function toString(value) {
582
+ // Exit early for strings to avoid a performance hit in some environments.
583
+ if (typeof value == 'string') {
584
+ return value;
585
+ }
586
+ if (value == null) {
587
+ return '';
588
+ }
589
+ if (isSymbol(value)) {
590
+ return symbolToString ? symbolToString.call(value) : '';
591
+ }
592
+ var result = (value + '');
593
+ return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
594
+ }
595
+
596
+ module.exports = toString;
597
+
598
+ },{"1":1,"10":10}],14:[function(_dereq_,module,exports){
11
599
  'use strict';
12
600
 
13
601
  var $ = window.jQuery || window.Zepto;
@@ -80,158 +668,15 @@ $.extend(EventDelegator.prototype, {
80
668
 
81
669
  module.exports = EventDelegator;
82
670
 
83
- },{"jquery":"jquery"}],3:[function(_dereq_,module,exports){
84
- 'use strict';
85
-
86
- /**
87
- * @license
88
- * lodash 3.3.1 (Custom Build) <https://lodash.com/>
89
- * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
90
- * Based on Underscore.js 1.8.2 <http://underscorejs.org/LICENSE>
91
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
92
- * Available under MIT license <https://lodash.com/license>
93
- */
94
-
95
- /**
96
- * Gets the number of milliseconds that have elapsed since the Unix epoch
97
- * (1 January 1970 00:00:00 UTC).
98
- *
99
- * @static
100
- * @memberOf _
101
- * @category Date
102
- * @example
103
- *
104
- * _.defer(function(stamp) {
105
- * console.log(_.now() - stamp);
106
- * }, _.now());
107
- * // => logs the number of milliseconds it took for the deferred function to be invoked
108
- */
109
- var now = Date.now;
110
-
111
- /**
112
- * Creates a function that delays invoking `func` until after `wait` milliseconds
113
- * have elapsed since the last time it was invoked.
114
- *
115
- * See [David Corbacho's article]
116
- * (http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
117
- * for details over the differences between `_.debounce` and `_.throttle`.
118
- *
119
- * @static
120
- * @memberOf _
121
- * @category Function
122
- * @param {Function} func The function to debounce.
123
- * @param {number} [wait=0] The number of milliseconds to delay.
124
- * @returns {Function} Returns the new debounced function.
125
- * @example
126
- *
127
- * // avoid costly calculations while the window size is in flux
128
- * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
129
- */
130
- function debounce(func, wait) {
131
- var args,
132
- result,
133
- stamp,
134
- timeoutId,
135
- trailingCall,
136
- lastCalled = 0;
137
-
138
- wait = wait < 0 ? 0 : (+wait || 0);
139
-
140
- function delayed() {
141
- var remaining = wait - (now() - stamp);
142
- if (remaining <= 0 || remaining > wait) {
143
- var isCalled = trailingCall;
144
- timeoutId = trailingCall = undefined;
145
- if (isCalled) {
146
- lastCalled = now();
147
- result = func.apply(null, args);
148
- if (!timeoutId) {
149
- args = null;
150
- }
151
- }
152
- } else {
153
- timeoutId = setTimeout(delayed, remaining);
154
- }
155
- }
156
-
157
- function debounced() {
158
- args = arguments;
159
- stamp = now();
160
- trailingCall = true;
161
-
162
- if (!timeoutId) {
163
- timeoutId = setTimeout(delayed, wait);
164
- }
165
- return result;
166
- }
167
- return debounced;
168
- }
169
-
170
- module.exports = debounce;
171
-
172
- },{}],4:[function(_dereq_,module,exports){
173
- 'use strict';
174
-
175
- /**
176
- * @license
177
- * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
178
- * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
179
- * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
180
- * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
181
- * Available under MIT license <http://lodash.com/license>
182
- */
183
-
184
- var htmlEscapes = {
185
- '&': '&amp;',
186
- '<': '&lt;',
187
- '>': '&gt;',
188
- '"': '&quot;',
189
- "'": '&#39;'
190
- };
191
-
192
- /**
193
- * Used by `escape` to convert characters to HTML entities.
194
- *
195
- * @private
196
- * @param {string} match The matched character to escape.
197
- * @returns {string} Returns the escaped character.
198
- */
199
- function escapeHtmlChar(match) {
200
- return htmlEscapes[match];
201
- }
202
-
203
- var reUnescapedHtml = new RegExp('[' + Object.keys(htmlEscapes).join('') + ']', 'g');
204
-
205
- /**
206
- * Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their
207
- * corresponding HTML entities.
208
- *
209
- * @static
210
- * @memberOf _
211
- * @category Utilities
212
- * @param {string} string The string to escape.
213
- * @returns {string} Returns the escaped string.
214
- * @example
215
- *
216
- * _.escape('Fred, Wilma, & Pebbles');
217
- * // => 'Fred, Wilma, &amp; Pebbles'
218
- */
219
- function escape(string) {
220
- return string ? String(string).replace(reUnescapedHtml, escapeHtmlChar) : '';
221
- }
222
-
223
- module.exports = escape;
224
-
225
- },{}],5:[function(_dereq_,module,exports){
671
+ },{"jquery":"jquery"}],15:[function(_dereq_,module,exports){
226
672
  'use strict';
227
673
 
228
674
  var $ = window.jQuery || window.Zepto;
675
+ var debounce = _dereq_(5);
229
676
 
230
- var debounce = _dereq_(3);
231
-
232
- var Selectivity = _dereq_(8);
677
+ var Selectivity = _dereq_(17);
233
678
 
234
- _dereq_(13);
679
+ _dereq_(23);
235
680
 
236
681
  /**
237
682
  * Option listener that implements a convenience query function for performing AJAX requests.
@@ -276,7 +721,7 @@ Selectivity.OptionListeners.unshift(function(selectivity, options) {
276
721
  }
277
722
 
278
723
  var results = resultsCb(data, offset);
279
- results.results = results.results.map(processItem);
724
+ results.results = $.map(results.results, processItem);
280
725
  queryOptions.callback(results);
281
726
  },
282
727
  error: function(jqXHR, textStatus, errorThrown) {
@@ -295,10 +740,10 @@ Selectivity.OptionListeners.unshift(function(selectivity, options) {
295
740
  }
296
741
  });
297
742
 
298
- },{"13":13,"3":3,"8":8,"jquery":"jquery"}],6:[function(_dereq_,module,exports){
743
+ },{"17":17,"23":23,"5":5,"jquery":"jquery"}],16:[function(_dereq_,module,exports){
299
744
  'use strict';
300
745
 
301
- var Selectivity = _dereq_(8);
746
+ var Selectivity = _dereq_(17);
302
747
 
303
748
  var latestQueryNum = 0;
304
749
 
@@ -332,56 +777,12 @@ Selectivity.OptionListeners.push(function(selectivity, options) {
332
777
  }
333
778
  });
334
779
 
335
- },{"8":8}],7:[function(_dereq_,module,exports){
780
+ },{"17":17}],17:[function(_dereq_,module,exports){
336
781
  'use strict';
337
782
 
338
783
  var $ = window.jQuery || window.Zepto;
339
784
 
340
- var SelectivityDropdown = _dereq_(10);
341
-
342
- /**
343
- * Methods.
344
- */
345
- $.extend(SelectivityDropdown.prototype, {
346
-
347
- /**
348
- * @inherit
349
- */
350
- removeCloseHandler: function() {
351
-
352
- if (this._$backdrop && !this.parentMenu) {
353
- this._$backdrop.remove();
354
- this._$backdrop = null;
355
- }
356
- },
357
-
358
- /**
359
- * @inherit
360
- */
361
- setupCloseHandler: function() {
362
-
363
- var $backdrop;
364
- if (this.parentMenu) {
365
- $backdrop = this.parentMenu._$backdrop;
366
- } else {
367
- $backdrop = $('<div>').addClass('selectivity-backdrop');
368
-
369
- $('body').append($backdrop);
370
- }
371
-
372
- $backdrop.on('click', this.close.bind(this));
373
-
374
- this._$backdrop = $backdrop;
375
- }
376
-
377
- });
378
-
379
- },{"10":10,"jquery":"jquery"}],8:[function(_dereq_,module,exports){
380
- 'use strict';
381
-
382
- var $ = window.jQuery || window.Zepto;
383
-
384
- var EventDelegator = _dereq_(2);
785
+ var EventDelegator = _dereq_(14);
385
786
 
386
787
  /**
387
788
  * Create a new Selectivity instance or invoke a method on an instance.
@@ -406,7 +807,6 @@ var EventDelegator = _dereq_(2);
406
807
  * executed on the first element in the set of matched elements.
407
808
  */
408
809
  function selectivity(methodName, options) {
409
- /* jshint validthis: true */
410
810
 
411
811
  var methodArgs = Array.prototype.slice.call(arguments, 1);
412
812
  var result;
@@ -560,15 +960,20 @@ function Selectivity(options) {
560
960
 
561
961
  this.setOptions(options);
562
962
 
963
+ this.$el.attr('tabindex', options.tabindex || 0);
964
+
563
965
  if (options.value) {
564
966
  this.value(options.value, { triggerChange: false });
565
967
  } else {
566
968
  this.data(options.data || null, { triggerChange: false });
567
969
  }
568
970
 
569
- this.$el.on('mouseover', this._mouseover.bind(this));
570
- this.$el.on('mouseleave', this._mouseout.bind(this));
971
+ this._blur = this._blur.bind(this);
972
+
973
+ this.$el.on('mouseenter', this._mouseenter.bind(this));
974
+ this.$el.on('mouseleave', this._mouseleave.bind(this));
571
975
  this.$el.on('selectivity-close', this._closed.bind(this));
976
+ this.$el.on('blur', this._blur);
572
977
 
573
978
  EventDelegator.call(this);
574
979
  }
@@ -709,6 +1114,8 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
709
1114
  listener(this, $input);
710
1115
  }.bind(this));
711
1116
 
1117
+ $input.on('blur', this._blur);
1118
+
712
1119
  if (!options || !options.noSearch) {
713
1120
  $input.on('keyup', function(event) {
714
1121
  if (!event.isDefaultPrevented()) {
@@ -730,28 +1137,30 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
730
1137
  */
731
1138
  open: function(options) {
732
1139
 
733
- options = options || {};
1140
+ if (this.dropdown || !this.triggerEvent('selectivity-opening')) {
1141
+ return;
1142
+ }
734
1143
 
735
- if (!this.dropdown) {
736
- if (this.triggerEvent('selectivity-opening')) {
737
- var Dropdown = this.options.dropdown || Selectivity.Dropdown;
738
- if (Dropdown) {
739
- this.dropdown = new Dropdown({
740
- items: this.items,
741
- position: this.options.positionDropdown,
742
- query: this.options.query,
743
- selectivity: this,
744
- showSearchInput: options.showSearchInput
745
- });
746
- }
1144
+ options = options || {};
747
1145
 
748
- if (options.search !== false) {
749
- this.search('');
750
- }
751
- }
1146
+ var Dropdown = this.options.dropdown || Selectivity.Dropdown;
1147
+ if (Dropdown) {
1148
+ this.dropdown = new Dropdown({
1149
+ items: this.items,
1150
+ position: this.options.positionDropdown,
1151
+ query: this.options.query,
1152
+ selectivity: this,
1153
+ showSearchInput: options.showSearchInput
1154
+ });
1155
+ }
752
1156
 
753
- this.$el.children().toggleClass('open', true);
1157
+ if (options.search !== false) {
1158
+ this.search('');
754
1159
  }
1160
+
1161
+ this.focus();
1162
+
1163
+ this.$el.toggleClass('open', true);
755
1164
  },
756
1165
 
757
1166
  /**
@@ -1035,6 +1444,16 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
1035
1444
  }
1036
1445
  },
1037
1446
 
1447
+ /**
1448
+ * @private
1449
+ */
1450
+ _blur: function() {
1451
+
1452
+ if (!this.$el.hasClass('hover')) {
1453
+ this.close();
1454
+ }
1455
+ },
1456
+
1038
1457
  /**
1039
1458
  * @private
1040
1459
  */
@@ -1042,7 +1461,7 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
1042
1461
 
1043
1462
  this.dropdown = null;
1044
1463
 
1045
- this.$el.children().toggleClass('open', false);
1464
+ this.$el.toggleClass('open', false);
1046
1465
  },
1047
1466
 
1048
1467
  /**
@@ -1091,17 +1510,17 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
1091
1510
  /**
1092
1511
  * @private
1093
1512
  */
1094
- _mouseout: function() {
1513
+ _mouseleave: function() {
1095
1514
 
1096
- this.$el.children().toggleClass('hover', false);
1515
+ this.$el.toggleClass('hover', false);
1097
1516
  },
1098
1517
 
1099
1518
  /**
1100
1519
  * @private
1101
1520
  */
1102
- _mouseover: function() {
1521
+ _mouseenter: function() {
1103
1522
 
1104
- this.$el.children().toggleClass('hover', true);
1523
+ this.$el.toggleClass('hover', true);
1105
1524
  }
1106
1525
 
1107
1526
  });
@@ -1350,7 +1769,9 @@ Selectivity.transformText = function(string) {
1350
1769
 
1351
1770
  module.exports = $.fn.selectivity = Selectivity;
1352
1771
 
1353
- },{"2":2,"jquery":"jquery"}],9:[function(_dereq_,module,exports){
1772
+ },{"14":14,"jquery":"jquery"}],18:[function(_dereq_,module,exports){
1773
+ _dereq_(15);_dereq_(16);_dereq_(19);_dereq_(20);_dereq_(21);_dereq_(22);_dereq_(23);_dereq_(24);_dereq_(25);_dereq_(26);_dereq_(27);_dereq_(28);_dereq_(29);module.exports=_dereq_(17);
1774
+ },{"15":15,"16":16,"17":17,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29}],19:[function(_dereq_,module,exports){
1354
1775
  'use strict';
1355
1776
 
1356
1777
  var DIACRITICS = {
@@ -2195,7 +2616,7 @@ var DIACRITICS = {
2195
2616
  '\u03C2': '\u03C3'
2196
2617
  };
2197
2618
 
2198
- var Selectivity = _dereq_(8);
2619
+ var Selectivity = _dereq_(17);
2199
2620
  var previousTransform = Selectivity.transformText;
2200
2621
 
2201
2622
  /**
@@ -2214,16 +2635,17 @@ Selectivity.transformText = function(string) {
2214
2635
  return previousTransform(result);
2215
2636
  };
2216
2637
 
2217
- },{"8":8}],10:[function(_dereq_,module,exports){
2638
+ },{"17":17}],20:[function(_dereq_,module,exports){
2218
2639
  'use strict';
2219
2640
 
2220
2641
  var $ = window.jQuery || window.Zepto;
2642
+ var debounce = _dereq_(5);
2221
2643
 
2222
- var debounce = _dereq_(3);
2644
+ var EventDelegator = _dereq_(14);
2223
2645
 
2224
- var EventDelegator = _dereq_(2);
2646
+ var Selectivity = _dereq_(17);
2225
2647
 
2226
- var Selectivity = _dereq_(8);
2648
+ var SCROLL_EVENTS = ['scroll', 'touchend', 'touchmove'];
2227
2649
 
2228
2650
  /**
2229
2651
  * selectivity Dropdown Constructor.
@@ -2280,16 +2702,17 @@ function SelectivityDropdown(options) {
2280
2702
 
2281
2703
  this._closed = false;
2282
2704
 
2283
- this._closeProxy = this.close.bind(this);
2705
+ this.close = this.close.bind(this);
2706
+ this.position = this.position.bind(this);
2707
+
2284
2708
  if (selectivity.options.closeOnSelect !== false) {
2285
- selectivity.$el.on('selectivity-selecting', this._closeProxy);
2709
+ selectivity.$el.on('selectivity-selecting', this.close);
2286
2710
  }
2287
2711
 
2288
2712
  this._lastMousePosition = {};
2289
2713
 
2290
2714
  this.addToDom();
2291
2715
  this.position();
2292
- this.setupCloseHandler();
2293
2716
 
2294
2717
  this._suppressMouseWheel();
2295
2718
 
@@ -2300,7 +2723,9 @@ function SelectivityDropdown(options) {
2300
2723
 
2301
2724
  EventDelegator.call(this);
2302
2725
 
2303
- this.$results.on('scroll touchmove touchend', debounce(this._scrolled.bind(this), 50));
2726
+ this.$results.on(SCROLL_EVENTS.join(' '), debounce(this._scrolled.bind(this), 50));
2727
+
2728
+ this._attachAncestorScrollListeners();
2304
2729
 
2305
2730
  this.showLoading();
2306
2731
 
@@ -2330,7 +2755,8 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2330
2755
  while (($next = $anchor.next('.selectivity-dropdown')).length) {
2331
2756
  $anchor = $next;
2332
2757
  }
2333
- this.$el.insertAfter($anchor);
2758
+
2759
+ $anchor.append(this.$el);
2334
2760
  },
2335
2761
 
2336
2762
  /**
@@ -2343,11 +2769,11 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2343
2769
 
2344
2770
  this.$el.remove();
2345
2771
 
2346
- this.removeCloseHandler();
2347
-
2348
- this.selectivity.$el.off('selectivity-selecting', this._closeProxy);
2772
+ this.selectivity.$el.off('selectivity-selecting', this.close);
2349
2773
 
2350
2774
  this.triggerClose();
2775
+
2776
+ this._removeAncestorScrollListeners();
2351
2777
  }
2352
2778
  },
2353
2779
 
@@ -2438,14 +2864,6 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2438
2864
  this._scrolled();
2439
2865
  },
2440
2866
 
2441
- /**
2442
- * Removes the event handler to close the dropdown.
2443
- */
2444
- removeCloseHandler: function() {
2445
-
2446
- $('body').off('click', this._closeProxy);
2447
- },
2448
-
2449
2867
  /**
2450
2868
  * Renders an array of result items.
2451
2869
  *
@@ -2539,15 +2957,6 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2539
2957
  }
2540
2958
  },
2541
2959
 
2542
- /**
2543
- * Sets up an event handler that will close the dropdown when the Selectivity control loses
2544
- * focus.
2545
- */
2546
- setupCloseHandler: function() {
2547
-
2548
- $('body').on('click', this._closeProxy);
2549
- },
2550
-
2551
2960
  /**
2552
2961
  * Shows an error message.
2553
2962
  *
@@ -2624,7 +3033,13 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2624
3033
 
2625
3034
  this.hasMore = options.hasMore;
2626
3035
 
2627
- if (!options.add || this.loadMoreHighlighted) {
3036
+ var value = this.selectivity.value();
3037
+ if (value && $.type(value) !== 'array') {
3038
+ var item = Selectivity.findNestedById(results, value);
3039
+ if (item) {
3040
+ this.highlight(item);
3041
+ }
3042
+ } else if (!options.add || this.loadMoreHighlighted) {
2628
3043
  this._highlightFirstItem(results);
2629
3044
  }
2630
3045
 
@@ -2647,6 +3062,37 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2647
3062
  this.selectivity.$el.trigger('selectivity-open');
2648
3063
  },
2649
3064
 
3065
+ /**
3066
+ * @private
3067
+ */
3068
+ _attachAncestorScrollListeners: function() {
3069
+
3070
+ var position = this.position;
3071
+ var scrollElements = [];
3072
+
3073
+ function attach(el) {
3074
+ for (var i = 0; i < SCROLL_EVENTS.length; i++) {
3075
+ el.addEventListener(SCROLL_EVENTS[i], position);
3076
+ }
3077
+ scrollElements.push(el);
3078
+ }
3079
+
3080
+ if (typeof window !== 'undefined') {
3081
+ var el = this.selectivity.$el[0];
3082
+ while ((el = el.parentElement)) {
3083
+ var style = window.getComputedStyle(el);
3084
+ if (style.overflowX === 'auto' || style.overflowX === 'scroll' ||
3085
+ style.overflowY === 'auto' || style.overflowY === 'scroll') {
3086
+ attach(el);
3087
+ }
3088
+ }
3089
+
3090
+ attach(window);
3091
+ }
3092
+
3093
+ this._ancestorScrollElements = scrollElements;
3094
+ },
3095
+
2650
3096
  /**
2651
3097
  * @private
2652
3098
  */
@@ -2684,8 +3130,6 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2684
3130
 
2685
3131
  this.loadMore();
2686
3132
 
2687
- this.selectivity.focus();
2688
-
2689
3133
  return false;
2690
3134
  },
2691
3135
 
@@ -2710,6 +3154,20 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2710
3154
  this._lastMousePosition = { x: event.screenX, y: event.screenY };
2711
3155
  },
2712
3156
 
3157
+ /**
3158
+ * @private
3159
+ */
3160
+ _removeAncestorScrollListeners: function() {
3161
+
3162
+ this._ancestorScrollElements.forEach(function(el) {
3163
+ for (var i = 0; i < SCROLL_EVENTS.length; i++) {
3164
+ el.removeEventListener(SCROLL_EVENTS[i], this.position);
3165
+ }
3166
+ }, this);
3167
+
3168
+ this._ancestorScrollElements = [];
3169
+ },
3170
+
2713
3171
  /**
2714
3172
  * @private
2715
3173
  */
@@ -2808,13 +3266,13 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2808
3266
 
2809
3267
  module.exports = Selectivity.Dropdown = SelectivityDropdown;
2810
3268
 
2811
- },{"2":2,"3":3,"8":8,"jquery":"jquery"}],11:[function(_dereq_,module,exports){
3269
+ },{"14":14,"17":17,"5":5,"jquery":"jquery"}],21:[function(_dereq_,module,exports){
2812
3270
  'use strict';
2813
3271
 
2814
3272
  var $ = window.jQuery || window.Zepto;
2815
3273
 
2816
- var Selectivity = _dereq_(8);
2817
- var MultipleSelectivity = _dereq_(14);
3274
+ var Selectivity = _dereq_(17);
3275
+ var MultipleSelectivity = _dereq_(24);
2818
3276
 
2819
3277
  function isValidEmail(email) {
2820
3278
 
@@ -2875,7 +3333,7 @@ function emailTokenizer(input, selection, createToken) {
2875
3333
  }
2876
3334
  break;
2877
3335
  case '"':
2878
- do { i++; } while(i < length && input[i] !== '"');
3336
+ do { i++; } while (i < length && input[i] !== '"');
2879
3337
  break;
2880
3338
  default:
2881
3339
  continue;
@@ -2899,7 +3357,7 @@ function emailTokenizer(input, selection, createToken) {
2899
3357
  }
2900
3358
  break;
2901
3359
  case '"':
2902
- do { i++; } while(i < length && input[i] !== '"');
3360
+ do { i++; } while (i < length && input[i] !== '"');
2903
3361
  break;
2904
3362
  default:
2905
3363
  continue;
@@ -2973,10 +3431,10 @@ var callSuper = Selectivity.inherits(Emailselectivity, MultipleSelectivity, {
2973
3431
 
2974
3432
  module.exports = Selectivity.InputTypes.Email = Emailselectivity;
2975
3433
 
2976
- },{"14":14,"8":8,"jquery":"jquery"}],12:[function(_dereq_,module,exports){
3434
+ },{"17":17,"24":24,"jquery":"jquery"}],22:[function(_dereq_,module,exports){
2977
3435
  'use strict';
2978
3436
 
2979
- var Selectivity = _dereq_(8);
3437
+ var Selectivity = _dereq_(17);
2980
3438
 
2981
3439
  var KEY_BACKSPACE = 8;
2982
3440
  var KEY_DOWN_ARROW = 40;
@@ -3091,7 +3549,7 @@ function listener(selectivity, $input) {
3091
3549
  moveHighlight(dropdown, -1);
3092
3550
  } else if (event.keyCode === KEY_TAB) {
3093
3551
  setTimeout(function() {
3094
- selectivity.close({ keepFocus: false });
3552
+ selectivity.close();
3095
3553
  }, 1);
3096
3554
  } else if (event.keyCode === KEY_ENTER) {
3097
3555
  event.preventDefault(); // don't submit forms on keydown
@@ -3150,11 +3608,12 @@ function listener(selectivity, $input) {
3150
3608
 
3151
3609
  Selectivity.SearchInputListeners.push(listener);
3152
3610
 
3153
- },{"8":8}],13:[function(_dereq_,module,exports){
3611
+ },{"17":17}],23:[function(_dereq_,module,exports){
3154
3612
  'use strict';
3155
3613
 
3156
- var escape = _dereq_(4);
3157
- var Selectivity = _dereq_(8);
3614
+ var escape = _dereq_(6);
3615
+
3616
+ var Selectivity = _dereq_(17);
3158
3617
 
3159
3618
  /**
3160
3619
  * Localizable elements of the Selectivity Templates.
@@ -3175,12 +3634,12 @@ Selectivity.Locale = {
3175
3634
 
3176
3635
  };
3177
3636
 
3178
- },{"4":4,"8":8}],14:[function(_dereq_,module,exports){
3637
+ },{"17":17,"6":6}],24:[function(_dereq_,module,exports){
3179
3638
  'use strict';
3180
3639
 
3181
3640
  var $ = window.jQuery || window.Zepto;
3182
3641
 
3183
- var Selectivity = _dereq_(8);
3642
+ var Selectivity = _dereq_(17);
3184
3643
 
3185
3644
  var KEY_BACKSPACE = 8;
3186
3645
  var KEY_DELETE = 46;
@@ -3210,18 +3669,16 @@ function MultipleSelectivity(options) {
3210
3669
  // unless there is not enough space below, but there is space enough above, then it should
3211
3670
  // open upwards
3212
3671
  this.options.positionDropdown = function($el, $selectEl) {
3213
- var position = $selectEl.position(),
3214
- dropdownHeight = $el.height(),
3215
- selectHeight = $selectEl.height(),
3216
- top = $selectEl[0].getBoundingClientRect().top,
3217
- bottom = top + selectHeight + dropdownHeight,
3218
- openUpwards = (typeof window !== 'undefined' && bottom > $(window).height() &&
3219
- top - dropdownHeight > 0);
3672
+ var rect = $selectEl[0].getBoundingClientRect();
3673
+ var dropdownHeight = $el.height();
3674
+ var openUpwards = (typeof window !== 'undefined' &&
3675
+ rect.bottom + dropdownHeight > window.innerHeight &&
3676
+ rect.top - dropdownHeight > 0);
3220
3677
 
3221
3678
  var width = $selectEl.outerWidth ? $selectEl.outerWidth() : $selectEl.width();
3222
3679
  $el.css({
3223
- left: position.left + 'px',
3224
- top: position.top + (openUpwards ? -dropdownHeight : selectHeight) + 'px'
3680
+ left: rect.left + 'px',
3681
+ top: (openUpwards ? rect.top - dropdownHeight : rect.bottom) + 'px'
3225
3682
  }).width(width);
3226
3683
  };
3227
3684
  }
@@ -3542,10 +3999,8 @@ var callSuper = Selectivity.inherits(MultipleSelectivity, {
3542
3999
  */
3543
4000
  _clicked: function() {
3544
4001
 
3545
- if (this.enabled) {
3546
- this.focus();
3547
-
3548
- this._open();
4002
+ if (this.enabled && this.options.showDropdown !== false) {
4003
+ this.open();
3549
4004
 
3550
4005
  return false;
3551
4006
  }
@@ -3659,16 +4114,6 @@ var callSuper = Selectivity.inherits(MultipleSelectivity, {
3659
4114
  }.bind(this), 10);
3660
4115
  },
3661
4116
 
3662
- /**
3663
- * @private
3664
- */
3665
- _open: function() {
3666
-
3667
- if (this.options.showDropdown !== false) {
3668
- this.open();
3669
- }
3670
- },
3671
-
3672
4117
  _renderSelectedItem: function(item) {
3673
4118
 
3674
4119
  this.$searchInput.before(this.template('multipleSelectedItem', $.extend({
@@ -3736,12 +4181,12 @@ var callSuper = Selectivity.inherits(MultipleSelectivity, {
3736
4181
 
3737
4182
  module.exports = Selectivity.InputTypes.Multiple = MultipleSelectivity;
3738
4183
 
3739
- },{"8":8,"jquery":"jquery"}],15:[function(_dereq_,module,exports){
4184
+ },{"17":17,"jquery":"jquery"}],25:[function(_dereq_,module,exports){
3740
4185
  'use strict';
3741
4186
 
3742
4187
  var $ = window.jQuery || window.Zepto;
3743
4188
 
3744
- var Selectivity = _dereq_(8);
4189
+ var Selectivity = _dereq_(17);
3745
4190
 
3746
4191
  /**
3747
4192
  * SingleSelectivity Constructor.
@@ -3763,22 +4208,21 @@ function SingleSelectivity(options) {
3763
4208
  // unless there is not enough space below, in which case the dropdown should be moved up
3764
4209
  // just enough so it fits in the window, but never so much that it reaches above the top
3765
4210
  this.options.positionDropdown = function($el, $selectEl) {
3766
- var position = $selectEl.position(),
3767
- dropdownHeight = $el.height(),
3768
- selectHeight = $selectEl.height(),
3769
- top = $selectEl[0].getBoundingClientRect().top,
3770
- bottom = top + selectHeight + dropdownHeight,
3771
- deltaUp = 0;
4211
+ var rect = $selectEl[0].getBoundingClientRect();
4212
+ var dropdownTop = rect.bottom;
3772
4213
 
4214
+ var deltaUp = 0;
3773
4215
  if (typeof window !== 'undefined') {
3774
- deltaUp = Math.min(Math.max(bottom - $(window).height(), 0), top + selectHeight);
4216
+ deltaUp = Math.min(
4217
+ Math.max(dropdownTop + $el.height() - window.innerHeight, 0),
4218
+ rect.top + rect.height
4219
+ );
3775
4220
  }
3776
4221
 
3777
- var width = $selectEl.outerWidth ? $selectEl.outerWidth() : $selectEl.width();
3778
4222
  $el.css({
3779
- left: position.left + 'px',
3780
- top: (position.top + selectHeight - deltaUp) + 'px'
3781
- }).width(width);
4223
+ left: rect.left + 'px',
4224
+ top: dropdownTop - deltaUp + 'px'
4225
+ }).width(rect.width);
3782
4226
  };
3783
4227
  }
3784
4228
 
@@ -3816,7 +4260,7 @@ var callSuper = Selectivity.inherits(SingleSelectivity, {
3816
4260
  * @inherit
3817
4261
  *
3818
4262
  * @param options Optional options object. May contain the following property:
3819
- * keepFocus - If false, the focus won't remain on the input.
4263
+ * keepFocus - If true, the focus will remain on the input.
3820
4264
  */
3821
4265
  close: function(options) {
3822
4266
 
@@ -3824,7 +4268,7 @@ var callSuper = Selectivity.inherits(SingleSelectivity, {
3824
4268
 
3825
4269
  callSuper(this, 'close');
3826
4270
 
3827
- if (!options || options.keepFocus !== false) {
4271
+ if (options && options.keepFocus && this.$searchInput) {
3828
4272
  this.$searchInput.focus();
3829
4273
  }
3830
4274
 
@@ -3868,10 +4312,6 @@ var callSuper = Selectivity.inherits(SingleSelectivity, {
3868
4312
 
3869
4313
  callSuper(this, 'open', $.extend({ showSearchInput: showSearchInput }, options));
3870
4314
 
3871
- if (!showSearchInput) {
3872
- this.focus();
3873
- }
3874
-
3875
4315
  this._opening = false;
3876
4316
  },
3877
4317
 
@@ -3954,11 +4394,15 @@ var callSuper = Selectivity.inherits(SingleSelectivity, {
3954
4394
  /**
3955
4395
  * @private
3956
4396
  */
3957
- _clicked: function() {
4397
+ _clicked: function(event) {
4398
+
4399
+ if ($(event.target).closest('.selectivity-search-input').length) {
4400
+ return true;
4401
+ }
3958
4402
 
3959
4403
  if (this.enabled) {
3960
4404
  if (this.dropdown) {
3961
- this.close();
4405
+ this.close({ keepFocus: true });
3962
4406
  } else if (this.options.showDropdown !== false) {
3963
4407
  this.open();
3964
4408
  }
@@ -3995,18 +4439,18 @@ var callSuper = Selectivity.inherits(SingleSelectivity, {
3995
4439
 
3996
4440
  this.data(event.item);
3997
4441
 
3998
- this.close();
4442
+ this.close({ keepFocus: true });
3999
4443
  }
4000
4444
 
4001
4445
  });
4002
4446
 
4003
4447
  module.exports = Selectivity.InputTypes.Single = SingleSelectivity;
4004
4448
 
4005
- },{"8":8,"jquery":"jquery"}],16:[function(_dereq_,module,exports){
4449
+ },{"17":17,"jquery":"jquery"}],26:[function(_dereq_,module,exports){
4006
4450
  'use strict';
4007
4451
 
4008
- var Selectivity = _dereq_(8);
4009
- var SelectivityDropdown = _dereq_(10);
4452
+ var Selectivity = _dereq_(17);
4453
+ var SelectivityDropdown = _dereq_(20);
4010
4454
 
4011
4455
  /**
4012
4456
  * Extended dropdown that supports submenus.
@@ -4185,12 +4629,11 @@ var callSuper = Selectivity.inherits(SelectivitySubmenu, SelectivityDropdown, {
4185
4629
  items: item.submenu.items || null,
4186
4630
  parentMenu: this,
4187
4631
  position: item.submenu.positionDropdown || function($el) {
4188
- var dropdownPosition = $dropdownEl.position();
4189
- var width = $dropdownEl.width();
4632
+ var rect = $dropdownEl[0].getBoundingClientRect();
4190
4633
  $el.css({
4191
- left: dropdownPosition.left + width + 'px',
4192
- top: $item.position().top + dropdownPosition.top + 'px'
4193
- }).width(width);
4634
+ left: rect.right + 'px',
4635
+ top: $item.position().top + rect.top + 'px'
4636
+ }).width(rect.width);
4194
4637
  },
4195
4638
  query: item.submenu.query || null,
4196
4639
  selectivity: selectivity,
@@ -4226,14 +4669,14 @@ Selectivity.findNestedById = function(array, id) {
4226
4669
 
4227
4670
  module.exports = SelectivitySubmenu;
4228
4671
 
4229
- },{"10":10,"8":8}],17:[function(_dereq_,module,exports){
4672
+ },{"17":17,"20":20}],27:[function(_dereq_,module,exports){
4230
4673
  'use strict';
4231
4674
 
4232
- var escape = _dereq_(4);
4675
+ var escape = _dereq_(6);
4233
4676
 
4234
- var Selectivity = _dereq_(8);
4677
+ var Selectivity = _dereq_(17);
4235
4678
 
4236
- _dereq_(13);
4679
+ _dereq_(23);
4237
4680
 
4238
4681
  /**
4239
4682
  * Default set of templates to use with Selectivity.js.
@@ -4536,12 +4979,12 @@ Selectivity.Templates = {
4536
4979
 
4537
4980
  };
4538
4981
 
4539
- },{"13":13,"4":4,"8":8}],18:[function(_dereq_,module,exports){
4982
+ },{"17":17,"23":23,"6":6}],28:[function(_dereq_,module,exports){
4540
4983
  'use strict';
4541
4984
 
4542
4985
  var $ = window.jQuery || window.Zepto;
4543
4986
 
4544
- var Selectivity = _dereq_(8);
4987
+ var Selectivity = _dereq_(17);
4545
4988
 
4546
4989
  function defaultTokenizer(input, selection, createToken, options) {
4547
4990
 
@@ -4603,14 +5046,14 @@ Selectivity.OptionListeners.push(function(selectivity, options) {
4603
5046
  }
4604
5047
  });
4605
5048
 
4606
- },{"8":8,"jquery":"jquery"}],19:[function(_dereq_,module,exports){
5049
+ },{"17":17,"jquery":"jquery"}],29:[function(_dereq_,module,exports){
4607
5050
  'use strict';
4608
5051
 
4609
5052
  var $ = window.jQuery || window.Zepto;
4610
5053
 
4611
- var Selectivity = _dereq_(8);
5054
+ var Selectivity = _dereq_(17);
4612
5055
 
4613
- function replaceSelectElement($el, options) {
5056
+ function createSelectivityNextToSelectElement($el, options) {
4614
5057
 
4615
5058
  var data = (options.multiple ? [] : null);
4616
5059
 
@@ -4618,7 +5061,10 @@ function replaceSelectElement($el, options) {
4618
5061
  var $this = $(this);
4619
5062
  if ($this.is('option')) {
4620
5063
  var text = $this.text();
4621
- var id = $this.attr('value') || text;
5064
+ var id = $this.attr('value');
5065
+ if (id === undefined) {
5066
+ id = text;
5067
+ }
4622
5068
  if ($this.prop('selected')) {
4623
5069
  var item = { id: id, text: text };
4624
5070
  if (options.multiple) {
@@ -4660,36 +5106,18 @@ function replaceSelectElement($el, options) {
4660
5106
  'style': $el.attr('style'),
4661
5107
  'data-name': $el.attr('name')
4662
5108
  });
4663
- $el.replaceWith($div);
5109
+ $div.insertAfter($el);
5110
+ $el.hide();
4664
5111
  return $div;
4665
5112
  }
4666
5113
 
4667
5114
  function bindTraditionalSelectEvents(selectivity) {
4668
-
4669
5115
  var $el = selectivity.$el;
4670
-
4671
- $el.on('selectivity-init', function(event, mode) {
4672
- $el.append(selectivity.template('selectCompliance', {
4673
- mode: mode,
4674
- name: $el.attr('data-name')
4675
- })).removeAttr('data-name');
4676
- }).on('selectivity-init change', function() {
4677
- var data = selectivity._data;
4678
- var $select = $el.find('select');
4679
-
4680
- if (data instanceof Array) {
4681
- $select.empty();
4682
-
4683
- data.forEach(function(item) {
4684
- $select.append(selectivity.template('selectOptionCompliance', item));
4685
- });
4686
- } else {
4687
- if (data) {
4688
- $select.html(selectivity.template('selectOptionCompliance', data));
4689
- } else {
4690
- $select.empty();
4691
- }
4692
- }
5116
+ $el.on('selectivity-selected', function(event) {
5117
+ var value = selectivity.value();
5118
+ $el.prev('select')
5119
+ .val($.type(value) === 'array' ? [event.item.id].concat(value) : event.item.id)
5120
+ .change();
4693
5121
  });
4694
5122
  }
4695
5123
 
@@ -4707,12 +5135,12 @@ Selectivity.OptionListeners.push(function(selectivity, options) {
4707
5135
  }, 1);
4708
5136
  }
4709
5137
 
4710
- selectivity.$el = replaceSelectElement($el, options);
5138
+ selectivity.$el = createSelectivityNextToSelectElement($el, options);
4711
5139
  selectivity.$el[0].selectivity = selectivity;
4712
5140
 
4713
5141
  bindTraditionalSelectEvents(selectivity);
4714
5142
  }
4715
5143
  });
4716
5144
 
4717
- },{"8":8,"jquery":"jquery"}]},{},[1])(1)
5145
+ },{"17":17,"jquery":"jquery"}]},{},[18])(18)
4718
5146
  });