| // This file exists for testing purposes but can also be used as a reference for polyfilling non-ES5 environments. |
| // ref: https://github.com/inexorabletash/polyfill/blob/master/es5.js (public domain) |
| |
| // ES5 15.2.3.5 Object.create ( O [, Properties] ) |
| if (typeof Object.create !== "function") { |
| Object.create = function (prototype, properties) { |
| if (typeof prototype !== "object") { throw TypeError(); } |
| function Ctor() {} |
| Ctor.prototype = prototype; |
| var o = new Ctor(); |
| if (prototype) { o.constructor = Ctor; } |
| if (properties !== undefined) { |
| if (properties !== Object(properties)) { throw TypeError(); } |
| Object.defineProperties(o, properties); |
| } |
| return o; |
| }; |
| } |
| |
| // ES 15.2.3.6 Object.defineProperty ( O, P, Attributes ) |
| // Partial support for most common case - getters, setters, and values |
| (function() { |
| if (!Object.defineProperty || |
| !(function () { try { Object.defineProperty({}, 'x', {}); return true; } catch (e) { return false; } } ())) { |
| var orig = Object.defineProperty; |
| Object.defineProperty = function (o, prop, desc) { |
| // In IE8 try built-in implementation for defining properties on DOM prototypes. |
| if (orig) { try { return orig(o, prop, desc); } catch (e) {} } |
| |
| if (o !== Object(o)) { throw TypeError("Object.defineProperty called on non-object"); } |
| if (Object.prototype.__defineGetter__ && ('get' in desc)) { |
| Object.prototype.__defineGetter__.call(o, prop, desc.get); |
| } |
| if (Object.prototype.__defineSetter__ && ('set' in desc)) { |
| Object.prototype.__defineSetter__.call(o, prop, desc.set); |
| } |
| if ('value' in desc) { |
| o[prop] = desc.value; |
| } |
| return o; |
| }; |
| } |
| }()); |
| |
| // ES 15.2.3.7 Object.defineProperties ( O, Properties ) |
| if (typeof Object.defineProperties !== "function") { |
| Object.defineProperties = function (o, properties) { |
| if (o !== Object(o)) { throw TypeError("Object.defineProperties called on non-object"); } |
| var name; |
| for (name in properties) { |
| if (Object.prototype.hasOwnProperty.call(properties, name)) { |
| Object.defineProperty(o, name, properties[name]); |
| } |
| } |
| return o; |
| }; |
| } |
| |
| // ES5 15.2.3.14 Object.keys ( O ) |
| // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys |
| if (!Object.keys) { |
| Object.keys = function (o) { |
| if (o !== Object(o)) { throw TypeError('Object.keys called on non-object'); } |
| var ret = [], p; |
| for (p in o) { |
| if (Object.prototype.hasOwnProperty.call(o, p)) { |
| ret.push(p); |
| } |
| } |
| return ret; |
| }; |
| } |
| |
| // ES5 15.4.3.2 Array.isArray ( arg ) |
| // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray |
| if (!Array.isArray) |
| Array.isArray = function (o) { return Boolean(o && Object.prototype.toString.call(Object(o)) === '[object Array]'); }; |
| |
| // ES5 15.4.4.14 Array.prototype.indexOf ( searchElement [ , fromIndex ] ) |
| // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf |
| if (!Array.prototype.indexOf) { |
| Array.prototype.indexOf = function (searchElement /*, fromIndex */) { |
| if (this === void 0 || this === null) { throw TypeError(); } |
| |
| var t = Object(this); |
| var len = t.length >>> 0; |
| if (len === 0) { return -1; } |
| |
| var n = 0; |
| if (arguments.length > 0) { |
| n = Number(arguments[1]); |
| if (isNaN(n)) { |
| n = 0; |
| } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { |
| n = (n > 0 || -1) * Math.floor(Math.abs(n)); |
| } |
| } |
| |
| if (n >= len) { return -1; } |
| |
| var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); |
| |
| for (; k < len; k++) { |
| if (k in t && t[k] === searchElement) { |
| return k; |
| } |
| } |
| return -1; |
| }; |
| } |
| |
| // ES5 15.4.4.18 Array.prototype.forEach ( callbackfn [ , thisArg ] ) |
| // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach |
| if (!Array.prototype.forEach) { |
| Array.prototype.forEach = function (fun /*, thisp */) { |
| if (this === void 0 || this === null) { throw TypeError(); } |
| |
| var t = Object(this); |
| var len = t.length >>> 0; |
| if (typeof fun !== "function") { throw TypeError(); } |
| |
| var thisp = arguments[1], i; |
| for (i = 0; i < len; i++) { |
| if (i in t) { |
| fun.call(thisp, t[i], i, t); |
| } |
| } |
| }; |
| } |
| |
| |
| // ES5 15.4.4.19 Array.prototype.map ( callbackfn [ , thisArg ] ) |
| // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Map |
| if (!Array.prototype.map) { |
| Array.prototype.map = function (fun /*, thisp */) { |
| if (this === void 0 || this === null) { throw TypeError(); } |
| |
| var t = Object(this); |
| var len = t.length >>> 0; |
| if (typeof fun !== "function") { throw TypeError(); } |
| |
| var res = []; res.length = len; |
| var thisp = arguments[1], i; |
| for (i = 0; i < len; i++) { |
| if (i in t) { |
| res[i] = fun.call(thisp, t[i], i, t); |
| } |
| } |
| |
| return res; |
| }; |
| } |
| |
| // ES5 15.4.4.20 Array.prototype.filter ( callbackfn [ , thisArg ] ) |
| // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Filter |
| if (!Array.prototype.filter) { |
| Array.prototype.filter = function (fun /*, thisp */) { |
| if (this === void 0 || this === null) { throw TypeError(); } |
| |
| var t = Object(this); |
| var len = t.length >>> 0; |
| if (typeof fun !== "function") { throw TypeError(); } |
| |
| var res = []; |
| var thisp = arguments[1], i; |
| for (i = 0; i < len; i++) { |
| if (i in t) { |
| var val = t[i]; // in case fun mutates this |
| if (fun.call(thisp, val, i, t)) { |
| res.push(val); |
| } |
| } |
| } |
| |
| return res; |
| }; |
| } |