client/lib/underscore.js
author cavaliet
Thu, 13 Feb 2014 16:38:51 +0100
changeset 262 f6d0fa1db02a
parent 211 d87f6bdee43d
permissions -rw-r--r--
update libs and debug resize
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
     1
//     Underscore.js 1.6.0
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
//     http://underscorejs.org
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
     3
//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
//     Underscore may be freely distributed under the MIT license.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
(function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
  // Baseline setup
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
  // --------------
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
  // Establish the root object, `window` in the browser, or `exports` on the server.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
  var root = this;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
  // Save the previous value of the `_` variable.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
  var previousUnderscore = root._;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
  // Establish the object that gets returned to break out of a loop iteration.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
  var breaker = {};
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
  // Save bytes in the minified (but not gzipped) version:
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
  // Create quick reference variables for speed access to core prototypes.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
  var
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    push             = ArrayProto.push,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    slice            = ArrayProto.slice,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    concat           = ArrayProto.concat,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    toString         = ObjProto.toString,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    hasOwnProperty   = ObjProto.hasOwnProperty;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
  // All **ECMAScript 5** native function implementations that we hope to use
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
  // are declared here.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
  var
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    nativeForEach      = ArrayProto.forEach,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    nativeMap          = ArrayProto.map,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    nativeReduce       = ArrayProto.reduce,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    nativeReduceRight  = ArrayProto.reduceRight,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    nativeFilter       = ArrayProto.filter,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    nativeEvery        = ArrayProto.every,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    nativeSome         = ArrayProto.some,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    nativeIndexOf      = ArrayProto.indexOf,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    nativeLastIndexOf  = ArrayProto.lastIndexOf,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    nativeIsArray      = Array.isArray,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    nativeKeys         = Object.keys,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    nativeBind         = FuncProto.bind;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
  // Create a safe reference to the Underscore object for use below.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
  var _ = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    if (obj instanceof _) return obj;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    if (!(this instanceof _)) return new _(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    this._wrapped = obj;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
  // Export the Underscore object for **Node.js**, with
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
  // backwards-compatibility for the old `require()` API. If we're in
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
  // the browser, add `_` as a global object via a string identifier,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
  // for Closure Compiler "advanced" mode.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
  if (typeof exports !== 'undefined') {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    if (typeof module !== 'undefined' && module.exports) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
      exports = module.exports = _;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    exports._ = _;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
  } else {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    root._ = _;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
  }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
  // Current version.
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
    68
  _.VERSION = '1.6.0';
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
  // Collection Functions
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
  // --------------------
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
  // The cornerstone, an `each` implementation, aka `forEach`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
  // Handles objects with the built-in `forEach`, arrays, and raw objects.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
  // Delegates to **ECMAScript 5**'s native `forEach` if available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
  var each = _.each = _.forEach = function(obj, iterator, context) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
    77
    if (obj == null) return obj;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    if (nativeForEach && obj.forEach === nativeForEach) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
      obj.forEach(iterator, context);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    } else if (obj.length === +obj.length) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
      for (var i = 0, length = obj.length; i < length; i++) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        if (iterator.call(context, obj[i], i, obj) === breaker) return;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    } else {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
      var keys = _.keys(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
      for (var i = 0, length = keys.length; i < length; i++) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    }
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
    90
    return obj;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
  // Return the results of applying the iterator to each element.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
  // Delegates to **ECMAScript 5**'s native `map` if available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
  _.map = _.collect = function(obj, iterator, context) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    var results = [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
    if (obj == null) return results;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    each(obj, function(value, index, list) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
      results.push(iterator.call(context, value, index, list));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    return results;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
  var reduceError = 'Reduce of empty array with no initial value';
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
  // **Reduce** builds up a single result from a list of values, aka `inject`,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    var initial = arguments.length > 2;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    if (obj == null) obj = [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
    if (nativeReduce && obj.reduce === nativeReduce) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
      if (context) iterator = _.bind(iterator, context);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    each(obj, function(value, index, list) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
      if (!initial) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        memo = value;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        initial = true;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
      } else {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        memo = iterator.call(context, memo, value, index, list);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    if (!initial) throw new TypeError(reduceError);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    return memo;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
  // The right-associative version of reduce, also known as `foldr`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    var initial = arguments.length > 2;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    if (obj == null) obj = [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
      if (context) iterator = _.bind(iterator, context);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
    var length = obj.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    if (length !== +length) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
      var keys = _.keys(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
      length = keys.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
    each(obj, function(value, index, list) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
      index = keys ? keys[--length] : --length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
      if (!initial) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
        memo = obj[index];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
        initial = true;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
      } else {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
        memo = iterator.call(context, memo, obj[index], index, list);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    if (!initial) throw new TypeError(reduceError);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    return memo;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
  // Return the first value which passes a truth test. Aliased as `detect`.
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   156
  _.find = _.detect = function(obj, predicate, context) {
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
    var result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
    any(obj, function(value, index, list) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   159
      if (predicate.call(context, value, index, list)) {
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
        result = value;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
        return true;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
    return result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
  // Return all the elements that pass a truth test.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
  // Delegates to **ECMAScript 5**'s native `filter` if available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
  // Aliased as `select`.
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   170
  _.filter = _.select = function(obj, predicate, context) {
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
    var results = [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
    if (obj == null) return results;
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   173
    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
    each(obj, function(value, index, list) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   175
      if (predicate.call(context, value, index, list)) results.push(value);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
    return results;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
  // Return all the elements for which a truth test fails.
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   181
  _.reject = function(obj, predicate, context) {
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
    return _.filter(obj, function(value, index, list) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   183
      return !predicate.call(context, value, index, list);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
    }, context);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
  // Determine whether all of the elements match a truth test.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
  // Delegates to **ECMAScript 5**'s native `every` if available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
  // Aliased as `all`.
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   190
  _.every = _.all = function(obj, predicate, context) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   191
    predicate || (predicate = _.identity);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
    var result = true;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
    if (obj == null) return result;
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   194
    if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
    each(obj, function(value, index, list) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   196
      if (!(result = result && predicate.call(context, value, index, list))) return breaker;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
    return !!result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
  // Determine if at least one element in the object matches a truth test.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
  // Delegates to **ECMAScript 5**'s native `some` if available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
  // Aliased as `any`.
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   204
  var any = _.some = _.any = function(obj, predicate, context) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   205
    predicate || (predicate = _.identity);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
    var result = false;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
    if (obj == null) return result;
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   208
    if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
    each(obj, function(value, index, list) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   210
      if (result || (result = predicate.call(context, value, index, list))) return breaker;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
    return !!result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
  // Determine if the array or object contains a given value (using `===`).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
  // Aliased as `include`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
  _.contains = _.include = function(obj, target) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
    if (obj == null) return false;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
    return any(obj, function(value) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
      return value === target;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
  // Invoke a method (with arguments) on every item in a collection.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
  _.invoke = function(obj, method) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
    var args = slice.call(arguments, 2);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
    var isFunc = _.isFunction(method);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
    return _.map(obj, function(value) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
      return (isFunc ? method : value[method]).apply(value, args);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
  // Convenience version of a common use case of `map`: fetching a property.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
  _.pluck = function(obj, key) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   236
    return _.map(obj, _.property(key));
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
  // Convenience version of a common use case of `filter`: selecting only objects
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
  // containing specific `key:value` pairs.
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   241
  _.where = function(obj, attrs) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   242
    return _.filter(obj, _.matches(attrs));
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
  // Convenience version of a common use case of `find`: getting the first object
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
  // containing specific `key:value` pairs.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
  _.findWhere = function(obj, attrs) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   248
    return _.find(obj, _.matches(attrs));
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
  // Return the maximum element or (element-based computation).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
  // Can't optimize arrays of integers longer than 65,535 elements.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
  // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
  _.max = function(obj, iterator, context) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
      return Math.max.apply(Math, obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
    }
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   258
    var result = -Infinity, lastComputed = -Infinity;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
    each(obj, function(value, index, list) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
      var computed = iterator ? iterator.call(context, value, index, list) : value;
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   261
      if (computed > lastComputed) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   262
        result = value;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   263
        lastComputed = computed;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   264
      }
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
    });
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   266
    return result;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
  // Return the minimum element (or element-based computation).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
  _.min = function(obj, iterator, context) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
      return Math.min.apply(Math, obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
    }
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   274
    var result = Infinity, lastComputed = Infinity;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
    each(obj, function(value, index, list) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
      var computed = iterator ? iterator.call(context, value, index, list) : value;
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   277
      if (computed < lastComputed) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   278
        result = value;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   279
        lastComputed = computed;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   280
      }
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
    });
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   282
    return result;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   285
  // Shuffle an array, using the modern version of the
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
  _.shuffle = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
    var rand;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
    var index = 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
    var shuffled = [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
    each(obj, function(value) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
      rand = _.random(index++);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
      shuffled[index - 1] = shuffled[rand];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
      shuffled[rand] = value;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
    return shuffled;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   299
  // Sample **n** random values from a collection.
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   300
  // If **n** is not specified, returns a single random element.
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
  // The internal `guard` argument allows it to work with `map`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
  _.sample = function(obj, n, guard) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   303
    if (n == null || guard) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   304
      if (obj.length !== +obj.length) obj = _.values(obj);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
      return obj[_.random(obj.length - 1)];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
    return _.shuffle(obj).slice(0, Math.max(0, n));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
  // An internal function to generate lookup iterators.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
  var lookupIterator = function(value) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   312
    if (value == null) return _.identity;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   313
    if (_.isFunction(value)) return value;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   314
    return _.property(value);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
  // Sort the object's values by a criterion produced by an iterator.
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   318
  _.sortBy = function(obj, iterator, context) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   319
    iterator = lookupIterator(iterator);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
    return _.pluck(_.map(obj, function(value, index, list) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
      return {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
        value: value,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
        index: index,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
        criteria: iterator.call(context, value, index, list)
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
      };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
    }).sort(function(left, right) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
      var a = left.criteria;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
      var b = right.criteria;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
      if (a !== b) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
        if (a > b || a === void 0) return 1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
        if (a < b || b === void 0) return -1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
      return left.index - right.index;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
    }), 'value');
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
  // An internal function used for aggregate "group by" operations.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
  var group = function(behavior) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   339
    return function(obj, iterator, context) {
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
      var result = {};
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   341
      iterator = lookupIterator(iterator);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
      each(obj, function(value, index) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
        var key = iterator.call(context, value, index, obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
        behavior(result, key, value);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
      });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
      return result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
  // Groups the object's values by a criterion. Pass either a string attribute
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
  // to group by, or a function that returns the criterion.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
  _.groupBy = group(function(result, key, value) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   353
    _.has(result, key) ? result[key].push(value) : result[key] = [value];
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
  });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
  // Indexes the object's values by a criterion, similar to `groupBy`, but for
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
  // when you know that your index values will be unique.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
  _.indexBy = group(function(result, key, value) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
    result[key] = value;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
  });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
  // Counts instances of an object that group by a certain criterion. Pass
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
  // either a string attribute to count by, or a function that returns the
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
  // criterion.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
  _.countBy = group(function(result, key) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
    _.has(result, key) ? result[key]++ : result[key] = 1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
  });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
  // Use a comparator function to figure out the smallest index at which
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
  // an object should be inserted so as to maintain order. Uses binary search.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
  _.sortedIndex = function(array, obj, iterator, context) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   372
    iterator = lookupIterator(iterator);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
    var value = iterator.call(context, obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
    var low = 0, high = array.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
    while (low < high) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
      var mid = (low + high) >>> 1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
    return low;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
  // Safely create a real, live array from anything iterable.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
  _.toArray = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
    if (!obj) return [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
    if (_.isArray(obj)) return slice.call(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
    if (obj.length === +obj.length) return _.map(obj, _.identity);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
    return _.values(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
  // Return the number of elements in an object.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
  _.size = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
    if (obj == null) return 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
  // Array Functions
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
  // ---------------
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
  // Get the first element of an array. Passing **n** will return the first N
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
  // values in the array. Aliased as `head` and `take`. The **guard** check
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
  // allows it to work with `_.map`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
  _.first = _.head = _.take = function(array, n, guard) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
    if (array == null) return void 0;
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   404
    if ((n == null) || guard) return array[0];
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   405
    if (n < 0) return [];
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   406
    return slice.call(array, 0, n);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
  // Returns everything but the last entry of the array. Especially useful on
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
  // the arguments object. Passing **n** will return all the values in
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
  // the array, excluding the last N. The **guard** check allows it to work with
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
  // `_.map`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
  _.initial = function(array, n, guard) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
  // Get the last element of an array. Passing **n** will return the last N
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
  // values in the array. The **guard** check allows it to work with `_.map`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
  _.last = function(array, n, guard) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
    if (array == null) return void 0;
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   421
    if ((n == null) || guard) return array[array.length - 1];
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   422
    return slice.call(array, Math.max(array.length - n, 0));
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
  // Especially useful on the arguments object. Passing an **n** will return
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
  // the rest N values in the array. The **guard**
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
  // check allows it to work with `_.map`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
  _.rest = _.tail = _.drop = function(array, n, guard) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
    return slice.call(array, (n == null) || guard ? 1 : n);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
  // Trim out all falsy values from an array.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
  _.compact = function(array) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
    return _.filter(array, _.identity);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
  // Internal implementation of a recursive `flatten` function.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
  var flatten = function(input, shallow, output) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
    if (shallow && _.every(input, _.isArray)) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
      return concat.apply(output, input);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
    each(input, function(value) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
      if (_.isArray(value) || _.isArguments(value)) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
        shallow ? push.apply(output, value) : flatten(value, shallow, output);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
      } else {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
        output.push(value);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
    return output;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
  // Flatten out an array, either recursively (by default), or just one level.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
  _.flatten = function(array, shallow) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
    return flatten(array, shallow, []);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
  // Return a version of the array that does not contain the specified value(s).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
  _.without = function(array) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
    return _.difference(array, slice.call(arguments, 1));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   463
  // Split an array into two arrays: one whose elements all satisfy the given
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   464
  // predicate, and one whose elements all do not satisfy the predicate.
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   465
  _.partition = function(array, predicate, context) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   466
    predicate = lookupIterator(predicate);
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   467
    var pass = [], fail = [];
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   468
    each(array, function(elem) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   469
      (predicate.call(context, elem) ? pass : fail).push(elem);
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   470
    });
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   471
    return [pass, fail];
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   472
  };
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   473
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
  // Produce a duplicate-free version of the array. If the array has already
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
  // been sorted, you have the option of using a faster algorithm.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
  // Aliased as `unique`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
  _.uniq = _.unique = function(array, isSorted, iterator, context) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
    if (_.isFunction(isSorted)) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
      context = iterator;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
      iterator = isSorted;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
      isSorted = false;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
    var initial = iterator ? _.map(array, iterator, context) : array;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
    var results = [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
    var seen = [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
    each(initial, function(value, index) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
        seen.push(value);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
        results.push(array[index]);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
    return results;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
  // Produce an array that contains the union: each distinct element from all of
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
  // the passed-in arrays.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
  _.union = function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
    return _.uniq(_.flatten(arguments, true));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
  // Produce an array that contains every item shared between all the
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
  // passed-in arrays.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
  _.intersection = function(array) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
    var rest = slice.call(arguments, 1);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
    return _.filter(_.uniq(array), function(item) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
      return _.every(rest, function(other) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   507
        return _.contains(other, item);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
      });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
  // Take the difference between one array and a number of other arrays.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
  // Only the elements present in just the first array will remain.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
  _.difference = function(array) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
    return _.filter(array, function(value){ return !_.contains(rest, value); });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
  // Zip together multiple lists into a single array -- elements that share
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
  // an index go together.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
  _.zip = function() {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   522
    var length = _.max(_.pluck(arguments, 'length').concat(0));
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
    var results = new Array(length);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
    for (var i = 0; i < length; i++) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
      results[i] = _.pluck(arguments, '' + i);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
    return results;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
  // Converts lists into objects. Pass either a single array of `[key, value]`
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
  // the corresponding values.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
  _.object = function(list, values) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
    if (list == null) return {};
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
    var result = {};
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
    for (var i = 0, length = list.length; i < length; i++) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
      if (values) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
        result[list[i]] = values[i];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
      } else {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
        result[list[i][0]] = list[i][1];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
    return result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
  // we need this function. Return the position of the first occurrence of an
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
  // item in an array, or -1 if the item is not included in the array.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
  // If the array is large and already in sort order, pass `true`
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
  // for **isSorted** to use binary search.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
  _.indexOf = function(array, item, isSorted) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
    if (array == null) return -1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
    var i = 0, length = array.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
    if (isSorted) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
      if (typeof isSorted == 'number') {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
        i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
      } else {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
        i = _.sortedIndex(array, item);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
        return array[i] === item ? i : -1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
    for (; i < length; i++) if (array[i] === item) return i;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
    return -1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
  _.lastIndexOf = function(array, item, from) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
    if (array == null) return -1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
    var hasIndex = from != null;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
    var i = (hasIndex ? from : array.length);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
    while (i--) if (array[i] === item) return i;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
    return -1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
  // Generate an integer Array containing an arithmetic progression. A port of
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
  // the native Python `range()` function. See
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
  // [the Python documentation](http://docs.python.org/library/functions.html#range).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
  _.range = function(start, stop, step) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
    if (arguments.length <= 1) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
      stop = start || 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
      start = 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
    step = arguments[2] || 1;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
    var length = Math.max(Math.ceil((stop - start) / step), 0);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
    var idx = 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
    var range = new Array(length);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
    while(idx < length) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
      range[idx++] = start;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
      start += step;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
    return range;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
  // Function (ahem) Functions
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
  // ------------------
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
  // Reusable constructor function for prototype setting.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
  var ctor = function(){};
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
  // Create a function bound to a given object (assigning `this`, and arguments,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
  // available.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
  _.bind = function(func, context) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
    var args, bound;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
    if (!_.isFunction(func)) throw new TypeError;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
    args = slice.call(arguments, 2);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
    return bound = function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
      ctor.prototype = func.prototype;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
      var self = new ctor;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
      ctor.prototype = null;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
      var result = func.apply(self, args.concat(slice.call(arguments)));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
      if (Object(result) === result) return result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
      return self;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
  // Partially apply a function by creating a version that has had some of its
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   628
  // arguments pre-filled, without changing its dynamic `this` context. _ acts
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   629
  // as a placeholder, allowing any combination of arguments to be pre-filled.
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
  _.partial = function(func) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   631
    var boundArgs = slice.call(arguments, 1);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
    return function() {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   633
      var position = 0;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   634
      var args = boundArgs.slice();
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   635
      for (var i = 0, length = args.length; i < length; i++) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   636
        if (args[i] === _) args[i] = arguments[position++];
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   637
      }
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   638
      while (position < arguments.length) args.push(arguments[position++]);
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   639
      return func.apply(this, args);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   643
  // Bind a number of an object's methods to that object. Remaining arguments
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   644
  // are the method names to be bound. Useful for ensuring that all callbacks
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   645
  // defined on an object belong to it.
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
  _.bindAll = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
    var funcs = slice.call(arguments, 1);
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   648
    if (funcs.length === 0) throw new Error('bindAll must be passed function names');
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
    return obj;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
  // Memoize an expensive function by storing its results.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
  _.memoize = function(func, hasher) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
    var memo = {};
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
    hasher || (hasher = _.identity);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
    return function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
      var key = hasher.apply(this, arguments);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
  // Delays a function for the given number of milliseconds, and then calls
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
  // it with the arguments supplied.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
  _.delay = function(func, wait) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
    var args = slice.call(arguments, 2);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
    return setTimeout(function(){ return func.apply(null, args); }, wait);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
  // Defers a function, scheduling it to run after the current call stack has
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
  // cleared.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
  _.defer = function(func) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
  // Returns a function, that, when invoked, will only be triggered at most once
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
  // during a given window of time. Normally, the throttled function will run
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
  // as much as it can, without ever going more than once per `wait` duration;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
  // but if you'd like to disable the execution on the leading edge, pass
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
  // `{leading: false}`. To disable execution on the trailing edge, ditto.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
  _.throttle = function(func, wait, options) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
    var context, args, result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
    var timeout = null;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
    var previous = 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
    options || (options = {});
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
    var later = function() {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   687
      previous = options.leading === false ? 0 : _.now();
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
      timeout = null;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
      result = func.apply(context, args);
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   690
      context = args = null;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
    return function() {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   693
      var now = _.now();
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
      if (!previous && options.leading === false) previous = now;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
      var remaining = wait - (now - previous);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
      context = this;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
      args = arguments;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
      if (remaining <= 0) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
        clearTimeout(timeout);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
        timeout = null;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
        previous = now;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
        result = func.apply(context, args);
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   703
        context = args = null;
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
      } else if (!timeout && options.trailing !== false) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
        timeout = setTimeout(later, remaining);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
      return result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
  // Returns a function, that, as long as it continues to be invoked, will not
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
  // be triggered. The function will be called after it stops being called for
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
  // N milliseconds. If `immediate` is passed, trigger the function on the
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
  // leading edge, instead of the trailing.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
  _.debounce = function(func, wait, immediate) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
    var timeout, args, context, timestamp, result;
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   717
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   718
    var later = function() {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   719
      var last = _.now() - timestamp;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   720
      if (last < wait) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   721
        timeout = setTimeout(later, wait - last);
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   722
      } else {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   723
        timeout = null;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   724
        if (!immediate) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   725
          result = func.apply(context, args);
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   726
          context = args = null;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   727
        }
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   728
      }
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   729
    };
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   730
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
    return function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
      context = this;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
      args = arguments;
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   734
      timestamp = _.now();
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
      var callNow = immediate && !timeout;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
      if (!timeout) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
        timeout = setTimeout(later, wait);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
      }
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   739
      if (callNow) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   740
        result = func.apply(context, args);
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   741
        context = args = null;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   742
      }
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   743
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
      return result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
  // Returns a function that will be executed at most one time, no matter how
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
  // often you call it. Useful for lazy initialization.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
  _.once = function(func) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
    var ran = false, memo;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
    return function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
      if (ran) return memo;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
      ran = true;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
      memo = func.apply(this, arguments);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
      func = null;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
      return memo;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
  // Returns the first function passed as an argument to the second,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
  // allowing you to adjust arguments, run code before and after, and
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
  // conditionally execute the original function.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
  _.wrap = function(func, wrapper) {
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   765
    return _.partial(wrapper, func);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
  // Returns a function that is the composition of a list of functions, each
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
  // consuming the return value of the function that follows.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
  _.compose = function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
    var funcs = arguments;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
    return function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
      var args = arguments;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
      for (var i = funcs.length - 1; i >= 0; i--) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
        args = [funcs[i].apply(this, args)];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
      return args[0];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
  // Returns a function that will only be executed after being called N times.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
  _.after = function(times, func) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
    return function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
      if (--times < 1) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
        return func.apply(this, arguments);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
  // Object Functions
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
  // ----------------
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
  // Retrieve the names of an object's properties.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
  // Delegates to **ECMAScript 5**'s native `Object.keys`
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   795
  _.keys = function(obj) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   796
    if (!_.isObject(obj)) return [];
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   797
    if (nativeKeys) return nativeKeys(obj);
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
    var keys = [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
    for (var key in obj) if (_.has(obj, key)) keys.push(key);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
    return keys;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
  // Retrieve the values of an object's properties.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
  _.values = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
    var keys = _.keys(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
    var length = keys.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
    var values = new Array(length);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
    for (var i = 0; i < length; i++) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
      values[i] = obj[keys[i]];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
    return values;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
  // Convert an object into a list of `[key, value]` pairs.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
  _.pairs = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
    var keys = _.keys(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
    var length = keys.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
    var pairs = new Array(length);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
    for (var i = 0; i < length; i++) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
      pairs[i] = [keys[i], obj[keys[i]]];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
    return pairs;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
  // Invert the keys and values of an object. The values must be serializable.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
  _.invert = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
    var result = {};
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
    var keys = _.keys(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
    for (var i = 0, length = keys.length; i < length; i++) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
      result[obj[keys[i]]] = keys[i];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
    return result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
  // Return a sorted list of the function names available on the object.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
  // Aliased as `methods`
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
  _.functions = _.methods = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
    var names = [];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
    for (var key in obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
      if (_.isFunction(obj[key])) names.push(key);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
    return names.sort();
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
  // Extend a given object with all the properties in passed-in object(s).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
  _.extend = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
    each(slice.call(arguments, 1), function(source) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
      if (source) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
        for (var prop in source) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
          obj[prop] = source[prop];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
        }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
    return obj;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
  // Return a copy of the object only containing the whitelisted properties.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
  _.pick = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
    var copy = {};
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
    each(keys, function(key) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
      if (key in obj) copy[key] = obj[key];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
    return copy;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
   // Return a copy of the object without the blacklisted properties.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
  _.omit = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
    var copy = {};
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
    for (var key in obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
      if (!_.contains(keys, key)) copy[key] = obj[key];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
    return copy;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
  // Fill in a given object with default properties.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
  _.defaults = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
    each(slice.call(arguments, 1), function(source) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
      if (source) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
        for (var prop in source) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
          if (obj[prop] === void 0) obj[prop] = source[prop];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
        }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
    return obj;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
  // Create a (shallow-cloned) duplicate of an object.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
  _.clone = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
    if (!_.isObject(obj)) return obj;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
  // Invokes interceptor with the obj, and then returns obj.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
  // The primary purpose of this method is to "tap into" a method chain, in
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
  // order to perform operations on intermediate results within the chain.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
  _.tap = function(obj, interceptor) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
    interceptor(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
    return obj;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
  // Internal recursive comparison function for `isEqual`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
  var eq = function(a, b, aStack, bStack) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
    // Identical objects are equal. `0 === -0`, but they aren't identical.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
    if (a === b) return a !== 0 || 1 / a == 1 / b;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
    // A strict comparison is necessary because `null == undefined`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
    if (a == null || b == null) return a === b;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
    // Unwrap any wrapped objects.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
    if (a instanceof _) a = a._wrapped;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
    if (b instanceof _) b = b._wrapped;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
    // Compare `[[Class]]` names.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
    var className = toString.call(a);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
    if (className != toString.call(b)) return false;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
    switch (className) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
      // Strings, numbers, dates, and booleans are compared by value.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
      case '[object String]':
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
        // equivalent to `new String("5")`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
        return a == String(b);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
      case '[object Number]':
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
        // other numeric values.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
      case '[object Date]':
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
      case '[object Boolean]':
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
        // millisecond representations. Note that invalid dates with millisecond representations
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
        // of `NaN` are not equivalent.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
        return +a == +b;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
      // RegExps are compared by their source patterns and flags.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
      case '[object RegExp]':
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
        return a.source == b.source &&
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
               a.global == b.global &&
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
               a.multiline == b.multiline &&
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
               a.ignoreCase == b.ignoreCase;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
    if (typeof a != 'object' || typeof b != 'object') return false;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
    // Assume equality for cyclic structures. The algorithm for detecting cyclic
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
    var length = aStack.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
    while (length--) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
      // Linear search. Performance is inversely proportional to the number of
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
      // unique nested structures.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
      if (aStack[length] == a) return bStack[length] == b;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
    // Objects with different constructors are not equivalent, but `Object`s
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
    // from different frames are.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
    var aCtor = a.constructor, bCtor = b.constructor;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
    if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   952
                             _.isFunction(bCtor) && (bCtor instanceof bCtor))
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
   953
                        && ('constructor' in a && 'constructor' in b)) {
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
      return false;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
    // Add the first object to the stack of traversed objects.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
    aStack.push(a);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
    bStack.push(b);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
    var size = 0, result = true;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
    // Recursively compare objects and arrays.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
    if (className == '[object Array]') {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
      // Compare array lengths to determine if a deep comparison is necessary.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
      size = a.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
      result = size == b.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
      if (result) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
        // Deep compare the contents, ignoring non-numeric properties.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
        while (size--) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
          if (!(result = eq(a[size], b[size], aStack, bStack))) break;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
        }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
    } else {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
      // Deep compare objects.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
      for (var key in a) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
        if (_.has(a, key)) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
          // Count the expected number of properties.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
          size++;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
          // Deep compare each member.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
        }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
      // Ensure that both objects contain the same number of properties.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
      if (result) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
        for (key in b) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
          if (_.has(b, key) && !(size--)) break;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
        }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
        result = !size;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
    // Remove the first object from the stack of traversed objects.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
    aStack.pop();
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
    bStack.pop();
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
    return result;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
  // Perform a deep comparison to check if two objects are equal.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
  _.isEqual = function(a, b) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
    return eq(a, b, [], []);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
  // Is a given array, string, or object empty?
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
  // An "empty" object has no enumerable own-properties.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
  _.isEmpty = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
    if (obj == null) return true;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
    for (var key in obj) if (_.has(obj, key)) return false;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
    return true;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
  // Is a given value a DOM element?
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
  _.isElement = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
    return !!(obj && obj.nodeType === 1);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
  // Is a given value an array?
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
  // Delegates to ECMA5's native Array.isArray
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
  _.isArray = nativeIsArray || function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
    return toString.call(obj) == '[object Array]';
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
  // Is a given variable an object?
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
  _.isObject = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
    return obj === Object(obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
    _['is' + name] = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
      return toString.call(obj) == '[object ' + name + ']';
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
  });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
  // Define a fallback version of the method in browsers (ahem, IE), where
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
  // there isn't any inspectable "Arguments" type.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
  if (!_.isArguments(arguments)) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
    _.isArguments = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
      return !!(obj && _.has(obj, 'callee'));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
  }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
  // Optimize `isFunction` if appropriate.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
  if (typeof (/./) !== 'function') {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
    _.isFunction = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
      return typeof obj === 'function';
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
  }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
  // Is a given object a finite number?
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
  _.isFinite = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
    return isFinite(obj) && !isNaN(parseFloat(obj));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
  _.isNaN = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
    return _.isNumber(obj) && obj != +obj;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
  // Is a given value a boolean?
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
  _.isBoolean = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
  // Is a given value equal to null?
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
  _.isNull = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
    return obj === null;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
  // Is a given variable undefined?
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
  _.isUndefined = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
    return obj === void 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
  // Shortcut function for checking if an object has a given property directly
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
  // on itself (in other words, not on a prototype).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
  _.has = function(obj, key) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
    return hasOwnProperty.call(obj, key);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
  // Utility Functions
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
  // -----------------
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
  // previous owner. Returns a reference to the Underscore object.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
  _.noConflict = function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
    root._ = previousUnderscore;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
    return this;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
  // Keep the identity function around for default iterators.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
  _.identity = function(value) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
    return value;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1093
  _.constant = function(value) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1094
    return function () {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1095
      return value;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1096
    };
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1097
  };
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1098
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1099
  _.property = function(key) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1100
    return function(obj) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1101
      return obj[key];
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1102
    };
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1103
  };
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1104
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1105
  // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1106
  _.matches = function(attrs) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1107
    return function(obj) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1108
      if (obj === attrs) return true; //avoid comparing an object to itself.
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1109
      for (var key in attrs) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1110
        if (attrs[key] !== obj[key])
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1111
          return false;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1112
      }
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1113
      return true;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1114
    }
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1115
  };
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1116
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
  // Run a function **n** times.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
  _.times = function(n, iterator, context) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
    var accum = Array(Math.max(0, n));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
    return accum;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
  // Return a random integer between min and max (inclusive).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1125
  _.random = function(min, max) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
    if (max == null) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
      max = min;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
      min = 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
    return min + Math.floor(Math.random() * (max - min + 1));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1133
  // A (possibly faster) way to get the current timestamp as an integer.
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1134
  _.now = Date.now || function() { return new Date().getTime(); };
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1135
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
  // List of HTML entities for escaping.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
  var entityMap = {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
    escape: {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
      '&': '&amp;',
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
      '<': '&lt;',
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
      '>': '&gt;',
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
      '"': '&quot;',
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
      "'": '&#x27;'
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
  entityMap.unescape = _.invert(entityMap.escape);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
  // Regexes containing the keys and values listed immediately above.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
  var entityRegexes = {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1154
  // Functions for escaping and unescaping strings to/from HTML interpolation.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
  _.each(['escape', 'unescape'], function(method) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
    _[method] = function(string) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
      if (string == null) return '';
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
      return ('' + string).replace(entityRegexes[method], function(match) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
        return entityMap[method][match];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
      });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
  });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1164
  // If the value of the named `property` is a function then invoke it with the
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
  // `object` as context; otherwise, return it.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
  _.result = function(object, property) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
    if (object == null) return void 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
    var value = object[property];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
    return _.isFunction(value) ? value.call(object) : value;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
  // Add your own custom functions to the Underscore object.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
  _.mixin = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
    each(_.functions(obj), function(name) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
      var func = _[name] = obj[name];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
      _.prototype[name] = function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
        var args = [this._wrapped];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
        push.apply(args, arguments);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
        return result.call(this, func.apply(_, args));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
      };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
  // Generate a unique integer id (unique within the entire client session).
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1185
  // Useful for temporary DOM ids.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
  var idCounter = 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
  _.uniqueId = function(prefix) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
    var id = ++idCounter + '';
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
    return prefix ? prefix + id : id;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
  // By default, Underscore uses ERB-style template delimiters, change the
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1193
  // following template settings to use alternative delimiters.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1194
  _.templateSettings = {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
    evaluate    : /<%([\s\S]+?)%>/g,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
    interpolate : /<%=([\s\S]+?)%>/g,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
    escape      : /<%-([\s\S]+?)%>/g
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
  // When customizing `templateSettings`, if you don't want to define an
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
  // interpolation, evaluation or escaping regex, we need one that is
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
  // guaranteed not to match.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
  var noMatch = /(.)^/;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
  // Certain characters need to be escaped so that they can be put into a
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1206
  // string literal.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1207
  var escapes = {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1208
    "'":      "'",
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
    '\\':     '\\',
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
    '\r':     'r',
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
    '\n':     'n',
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
    '\t':     't',
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1213
    '\u2028': 'u2028',
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1214
    '\u2029': 'u2029'
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
  var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1219
  // JavaScript micro-templating, similar to John Resig's implementation.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
  // and correctly escapes quotes within interpolated code.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
  _.template = function(text, data, settings) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
    var render;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
    settings = _.defaults({}, settings, _.templateSettings);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1226
    // Combine delimiters into one regular expression via alternation.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
    var matcher = new RegExp([
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
      (settings.escape || noMatch).source,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
      (settings.interpolate || noMatch).source,
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
      (settings.evaluate || noMatch).source
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
    ].join('|') + '|$', 'g');
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1232
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1233
    // Compile the template source, escaping string literals appropriately.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
    var index = 0;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
    var source = "__p+='";
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
      source += text.slice(index, offset)
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
        .replace(escaper, function(match) { return '\\' + escapes[match]; });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
      if (escape) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
      if (interpolate) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
      if (evaluate) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1247
        source += "';\n" + evaluate + "\n__p+='";
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
      }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
      index = offset + match.length;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1250
      return match;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
    });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
    source += "';\n";
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1254
    // If a variable is not specified, place data values in local scope.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1255
    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
    source = "var __t,__p='',__j=Array.prototype.join," +
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
      "print=function(){__p+=__j.call(arguments,'');};\n" +
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1259
      source + "return __p;\n";
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1260
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1261
    try {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1262
      render = new Function(settings.variable || 'obj', '_', source);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1263
    } catch (e) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1264
      e.source = source;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1265
      throw e;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
    if (data) return render(data, _);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
    var template = function(data) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
      return render.call(this, data, _);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
    // Provide the compiled function source as a convenience for precompilation.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1274
    template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1275
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1276
    return template;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1279
  // Add a "chain" function, which will delegate to the wrapper.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1280
  _.chain = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
    return _(obj).chain();
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1283
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1284
  // OOP
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1285
  // ---------------
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1286
  // If Underscore is called as a function, it returns a wrapped object that
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
  // can be used OO-style. This wrapper holds altered versions of all the
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
  // underscore functions. Wrapped objects may be chained.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
  // Helper function to continue chaining intermediate results.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1291
  var result = function(obj) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1292
    return this._chain ? _(obj).chain() : obj;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
  };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
  // Add all of the Underscore functions to the wrapper object.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1296
  _.mixin(_);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1297
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1298
  // Add all mutator Array functions to the wrapper.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1300
    var method = ArrayProto[name];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1301
    _.prototype[name] = function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1302
      var obj = this._wrapped;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1303
      method.apply(obj, arguments);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
      return result.call(this, obj);
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
  });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1308
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1309
  // Add all accessor Array functions to the wrapper.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
  each(['concat', 'join', 'slice'], function(name) {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1311
    var method = ArrayProto[name];
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1312
    _.prototype[name] = function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
      return result.call(this, method.apply(this._wrapped, arguments));
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
    };
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
  });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1316
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1317
  _.extend(_.prototype, {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
    // Start chaining a wrapped Underscore object.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
    chain: function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
      this._chain = true;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1322
      return this;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1323
    },
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
    // Extracts the result from a wrapped and chained object.
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
    value: function() {
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
      return this._wrapped;
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
    }
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
  });
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1331
262
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1332
  // AMD registration happens at the end for compatibility with AMD loaders
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1333
  // that may not enforce next-turn semantics on modules. Even though general
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1334
  // practice for AMD registration is to be anonymous, underscore registers
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1335
  // as a named module because, like jQuery, it is a base library that is
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1336
  // popular enough to be bundled in a third party lib, but not be part of
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1337
  // an AMD load request. Those cases could generate an error when an
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1338
  // anonymous define() is called outside of a loader request.
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1339
  if (typeof define === 'function' && define.amd) {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1340
    define('underscore', [], function() {
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1341
      return _;
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1342
    });
f6d0fa1db02a update libs and debug resize
cavaliet
parents: 211
diff changeset
  1343
  }
211
d87f6bdee43d upgrade libs + add no minified versions of libs + improve build + allow disabling zoom on scroll
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
}).call(this);