<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.seculargames.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3APolyfills.js</id>
	<title>MediaWiki:Polyfills.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.seculargames.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3APolyfills.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.seculargames.org/index.php?title=MediaWiki:Polyfills.js&amp;action=history"/>
	<updated>2026-07-29T05:22:19Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.seculargames.org/index.php?title=MediaWiki:Polyfills.js&amp;diff=45807&amp;oldid=prev</id>
		<title>imported&gt;Loramin at 00:36, 15 June 2020</title>
		<link rel="alternate" type="text/html" href="https://wiki.seculargames.org/index.php?title=MediaWiki:Polyfills.js&amp;diff=45807&amp;oldid=prev"/>
		<updated>2020-06-15T00:36:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * This file contains polyFills for:&lt;br /&gt;
 *  - array.(prototype.).some&lt;br /&gt;
 *  - array.every&lt;br /&gt;
 *  - array.includes&lt;br /&gt;
 *  - string.includes&lt;br /&gt;
 *  - array.filter&lt;br /&gt;
 *  - array.flat&lt;br /&gt;
 *  - array.map&lt;br /&gt;
 *  - array.reduce&lt;br /&gt;
 *  - array.startsWith&lt;br /&gt;
 * ...so that we can use them, even though some people still use IE8 :(&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// Array.some polyfill&lt;br /&gt;
// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#Polyfill&lt;br /&gt;
// Production steps of ECMA-262, Edition 5, 15.4.4.17&lt;br /&gt;
// Reference: http://es5.github.io/#x15.4.4.17&lt;br /&gt;
if (!Array.prototype.some) {&lt;br /&gt;
  Array.prototype.some = function(fun, thisArg) {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (this == null) {&lt;br /&gt;
      throw new TypeError(&amp;#039;Array.prototype.some called on null or undefined&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (typeof fun !== &amp;#039;function&amp;#039;) {&lt;br /&gt;
      throw new TypeError();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var t = Object(this);&lt;br /&gt;
    var len = t.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; i &amp;lt; len; i++) {&lt;br /&gt;
      if (i in t &amp;amp;&amp;amp; fun.call(thisArg, t[i], i, t)) {&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return false;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Array.every polyfill&lt;br /&gt;
// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every#Polyfill&lt;br /&gt;
if (!Array.prototype.every) {&lt;br /&gt;
  Array.prototype.every = function(callbackfn, thisArg) {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
    var T, k;&lt;br /&gt;
&lt;br /&gt;
    if (this == null) {&lt;br /&gt;
      throw new TypeError(&amp;#039;this is null or not defined&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // 1. Let O be the result of calling ToObject passing the this &lt;br /&gt;
    //    value as the argument.&lt;br /&gt;
    var O = Object(this);&lt;br /&gt;
&lt;br /&gt;
    // 2. Let lenValue be the result of calling the Get internal method&lt;br /&gt;
    //    of O with the argument &amp;quot;length&amp;quot;.&lt;br /&gt;
    // 3. Let len be ToUint32(lenValue).&lt;br /&gt;
    var len = O.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
    // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.&lt;br /&gt;
    if (typeof callbackfn !== &amp;#039;function&amp;#039; &amp;amp;&amp;amp; Object.prototype.toString.call(callbackfn) !== &amp;#039;[object Function]&amp;#039;) {&lt;br /&gt;
      throw new TypeError();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.&lt;br /&gt;
    if (arguments.length &amp;gt; 1) {&lt;br /&gt;
      T = thisArg;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // 6. Let k be 0.&lt;br /&gt;
    k = 0;&lt;br /&gt;
&lt;br /&gt;
    // 7. Repeat, while k &amp;lt; len&lt;br /&gt;
    while (k &amp;lt; len) {&lt;br /&gt;
&lt;br /&gt;
      var kValue;&lt;br /&gt;
&lt;br /&gt;
      // a. Let Pk be ToString(k).&lt;br /&gt;
      //   This is implicit for LHS operands of the in operator&lt;br /&gt;
      // b. Let kPresent be the result of calling the HasProperty internal &lt;br /&gt;
      //    method of O with argument Pk.&lt;br /&gt;
      //   This step can be combined with c&lt;br /&gt;
      // c. If kPresent is true, then&lt;br /&gt;
      if (k in O) {&lt;br /&gt;
        var testResult;&lt;br /&gt;
        // i. Let kValue be the result of calling the Get internal method&lt;br /&gt;
        //    of O with argument Pk.&lt;br /&gt;
        kValue = O[k];&lt;br /&gt;
&lt;br /&gt;
        // ii. Let testResult be the result of calling the Call internal method &lt;br /&gt;
        // of callbackfn with T as the this value if T is not undefined &lt;br /&gt;
        // else is the result of calling callbackfn &lt;br /&gt;
        // and argument list containing kValue, k, and O.&lt;br /&gt;
        if(T) testResult = callbackfn.call(T, kValue, k, O); &lt;br /&gt;
        else testResult = callbackfn(kValue,k,O)&lt;br /&gt;
&lt;br /&gt;
        // iii. If ToBoolean(testResult) is false, return false.&lt;br /&gt;
        if (!testResult) {&lt;br /&gt;
          return false;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      k++;&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Array.includes polyfill&lt;br /&gt;
// @see https://github.com/kevlatus/polyfill-array-includes/blob/master/array-includes.js&lt;br /&gt;
if (!Array.prototype.includes) {&lt;br /&gt;
  Object.defineProperty(Array.prototype, &amp;#039;includes&amp;#039;, {&lt;br /&gt;
    value: function (searchElement, fromIndex) {&lt;br /&gt;
&lt;br /&gt;
      // 1. Let O be ? ToObject(this value).&lt;br /&gt;
      if (this == null) {&lt;br /&gt;
        throw new TypeError(&amp;#039;&amp;quot;this&amp;quot; is null or not defined&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var o = Object(this);&lt;br /&gt;
&lt;br /&gt;
      // 2. Let len be ? ToLength(? Get(O, &amp;quot;length&amp;quot;)).&lt;br /&gt;
      var len = o.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
      // 3. If len is 0, return false.&lt;br /&gt;
      if (len === 0) {&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // 4. Let n be ? ToInteger(fromIndex).&lt;br /&gt;
      //    (If fromIndex is undefined, this step produces the value 0.)&lt;br /&gt;
      var n = fromIndex | 0;&lt;br /&gt;
&lt;br /&gt;
      // 5. If n ≥ 0, then&lt;br /&gt;
      //  a. Let k be n.&lt;br /&gt;
      // 6. Else n &amp;lt; 0,&lt;br /&gt;
      //  a. Let k be len + n.&lt;br /&gt;
      //  b. If k &amp;lt; 0, let k be 0.&lt;br /&gt;
      var k = Math.max(n &amp;gt;= 0 ? n : len - Math.abs(n), 0);&lt;br /&gt;
&lt;br /&gt;
      function sameValueZero(x, y) {&lt;br /&gt;
        return x === y || (typeof x === &amp;#039;number&amp;#039; &amp;amp;&amp;amp; typeof y === &amp;#039;number&amp;#039; &amp;amp;&amp;amp; isNaN(x) &amp;amp;&amp;amp; isNaN(y));&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // 7. Repeat, while k &amp;lt; len&lt;br /&gt;
      while (k &amp;lt; len) {&lt;br /&gt;
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).&lt;br /&gt;
        // b. If SameValueZero(searchElement, elementK) is true, return true.&lt;br /&gt;
        // c. Increase k by 1.&lt;br /&gt;
        if (sameValueZero(o[k], searchElement)) {&lt;br /&gt;
          return true;&lt;br /&gt;
        }&lt;br /&gt;
        k++;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // 8. Return false&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// String.includes polyfill&lt;br /&gt;
// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes#Examples&lt;br /&gt;
if (!String.prototype.includes) {&lt;br /&gt;
  String.prototype.includes = function(search, start) {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (search instanceof RegExp) {&lt;br /&gt;
      throw TypeError(&amp;#039;first argument must not be a RegExp&amp;#039;);&lt;br /&gt;
    } &lt;br /&gt;
    if (start === undefined) { start = 0; }&lt;br /&gt;
    return this.indexOf(search, start) !== -1;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// .filter Polyfill:&lt;br /&gt;
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#Polyfill&lt;br /&gt;
if (!Array.prototype.filter){&lt;br /&gt;
  Array.prototype.filter = function(func, thisArg) {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
    if ( ! ((typeof func === &amp;#039;Function&amp;#039; || typeof func === &amp;#039;function&amp;#039;) &amp;amp;&amp;amp; this) )&lt;br /&gt;
        throw new TypeError();&lt;br /&gt;
   &lt;br /&gt;
    var len = this.length &amp;gt;&amp;gt;&amp;gt; 0,&lt;br /&gt;
        res = new Array(len), // preallocate array&lt;br /&gt;
        t = this, c = 0, i = -1;&lt;br /&gt;
    if (thisArg === undefined){&lt;br /&gt;
      while (++i !== len){&lt;br /&gt;
        if (i in this){&lt;br /&gt;
          if (func(t[i], i, t)){&lt;br /&gt;
            res[c++] = t[i];&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
      while (++i !== len){&lt;br /&gt;
        if (i in this){&lt;br /&gt;
          if (func.call(thisArg, t[i], i, t)){&lt;br /&gt;
            res[c++] = t[i];&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    res.length = c; // shrink down array to proper size&lt;br /&gt;
    return res;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// .flat Polyfill:&lt;br /&gt;
//http://xahlee.info/js/js_array_flatten.html&lt;br /&gt;
&lt;br /&gt;
if (!Array.prototype.flat) {&lt;br /&gt;
  function xah_flatten_array (array1, n) {&lt;br /&gt;
    // flatten nested array n levels. n default to 1&lt;br /&gt;
    // n can be large, such as thousands. because when array no longer has element that&amp;#039;s array, the function return it immediately&lt;br /&gt;
    // http://xahlee.info/js/js_array_flatten.html&lt;br /&gt;
    // version 2017-09-23&lt;br /&gt;
    // copyright: free use, must include link and credit&lt;br /&gt;
&lt;br /&gt;
    if ( n === undefined ) { n = 1; }&lt;br /&gt;
    if ( n &amp;gt; 0 &amp;amp;&amp;amp;&lt;br /&gt;
      Array.prototype.some.call(array1, Array.isArray)&lt;br /&gt;
    ) {&lt;br /&gt;
      return xah_flatten_array(Array.prototype.concat.apply([],array1), n-1);&lt;br /&gt;
    } else {&lt;br /&gt;
      return array1;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  Array.prototype.flat = function  (n) {&lt;br /&gt;
    return xah_flatten_array(this, n);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// .map Polyfill:&lt;br /&gt;
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Polyfill&lt;br /&gt;
&lt;br /&gt;
if (!Array.prototype.map) {&lt;br /&gt;
&lt;br /&gt;
  Array.prototype.map = function(callback/*, thisArg*/) {&lt;br /&gt;
&lt;br /&gt;
    var T, A, k;&lt;br /&gt;
&lt;br /&gt;
    if (this == null) {&lt;br /&gt;
      throw new TypeError(&amp;#039;this is null or not defined&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var O = Object(this);&lt;br /&gt;
&lt;br /&gt;
    var len = O.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
    if (typeof callback !== &amp;#039;function&amp;#039;) {&lt;br /&gt;
      throw new TypeError(callback + &amp;#039; is not a function&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (arguments.length &amp;gt; 1) {&lt;br /&gt;
      T = arguments[1];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    A = new Array(len);&lt;br /&gt;
&lt;br /&gt;
    k = 0;&lt;br /&gt;
&lt;br /&gt;
    while (k &amp;lt; len) {&lt;br /&gt;
      var kValue, mappedValue;&lt;br /&gt;
      if (k in O) {&lt;br /&gt;
        kValue = O[k];&lt;br /&gt;
        mappedValue = callback.call(T, kValue, k, O);&lt;br /&gt;
        A[k] = mappedValue;&lt;br /&gt;
      }&lt;br /&gt;
      k++;&lt;br /&gt;
    }&lt;br /&gt;
    return A;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// .reduce Polyfil:&lt;br /&gt;
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Polyfill&lt;br /&gt;
// Production steps of ECMA-262, Edition 5, 15.4.4.21&lt;br /&gt;
// Reference: http://es5.github.io/#x15.4.4.21&lt;br /&gt;
// https://tc39.github.io/ecma262/#sec-array.prototype.reduce&lt;br /&gt;
if (!Array.prototype.reduce) {&lt;br /&gt;
  Object.defineProperty(Array.prototype, &amp;#039;reduce&amp;#039;, {&lt;br /&gt;
    value: function(callback /*, initialValue*/) {&lt;br /&gt;
      if (this === null) {&lt;br /&gt;
        throw new TypeError( &amp;#039;Array.prototype.reduce &amp;#039; + &lt;br /&gt;
          &amp;#039;called on null or undefined&amp;#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if (typeof callback !== &amp;#039;function&amp;#039;) {&lt;br /&gt;
        throw new TypeError( callback +&lt;br /&gt;
          &amp;#039; is not a function&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // 1. Let O be ? ToObject(this value).&lt;br /&gt;
      var o = Object(this);&lt;br /&gt;
&lt;br /&gt;
      // 2. Let len be ? ToLength(? Get(O, &amp;quot;length&amp;quot;)).&lt;br /&gt;
      var len = o.length &amp;gt;&amp;gt;&amp;gt; 0; &lt;br /&gt;
&lt;br /&gt;
      // Steps 3, 4, 5, 6, 7      &lt;br /&gt;
      var k = 0; &lt;br /&gt;
      var value;&lt;br /&gt;
&lt;br /&gt;
      if (arguments.length &amp;gt;= 2) {&lt;br /&gt;
        value = arguments[1];&lt;br /&gt;
      } else {&lt;br /&gt;
        while (k &amp;lt; len &amp;amp;&amp;amp; !(k in o)) {&lt;br /&gt;
          k++; &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 3. If len is 0 and initialValue is not present,&lt;br /&gt;
        //    throw a TypeError exception.&lt;br /&gt;
        if (k &amp;gt;= len) {&lt;br /&gt;
          throw new TypeError( &amp;#039;Reduce of empty array &amp;#039; +&lt;br /&gt;
            &amp;#039;with no initial value&amp;#039; );&lt;br /&gt;
        }&lt;br /&gt;
        value = o[k++];&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // 8. Repeat, while k &amp;lt; len&lt;br /&gt;
      while (k &amp;lt; len) {&lt;br /&gt;
        // a. Let Pk be ! ToString(k).&lt;br /&gt;
        // b. Let kPresent be ? HasProperty(O, Pk).&lt;br /&gt;
        // c. If kPresent is true, then&lt;br /&gt;
        //    i.  Let kValue be ? Get(O, Pk).&lt;br /&gt;
        //    ii. Let accumulator be ? Call(&lt;br /&gt;
        //          callbackfn, undefined,&lt;br /&gt;
        //          « accumulator, kValue, k, O »).&lt;br /&gt;
        if (k in o) {&lt;br /&gt;
          value = callback(value, o[k], k, o);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // d. Increase k by 1.      &lt;br /&gt;
        k++;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // 9. Return accumulator.&lt;br /&gt;
      return value;&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// .startsWith Polyfill&lt;br /&gt;
//  (since IE11 is lame)&lt;br /&gt;
if (!String.prototype.startsWith) {&lt;br /&gt;
    Object.defineProperty(String.prototype, &amp;#039;startsWith&amp;#039;, {&lt;br /&gt;
        value: function(search, pos) {&lt;br /&gt;
            pos = !pos || pos &amp;lt; 0 ? 0 : +pos;&lt;br /&gt;
            return this.substring(pos, pos + search.length) === search;&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>imported&gt;Loramin</name></author>
	</entry>
</feed>