// 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; }; }