personacontent-8.x-2.x-dev/js/personacontent.lib.js

js/personacontent.lib.js
(function (Drupal, $, drupalSettings, once) {

  /**
   * Creates class to store History.
   */
  var personaLibClass = function (options) {
    var root = this;

    /**
     * Constructor
     */
    this.construct = function (options) {
      $.extend(vars, options);
    };

    /**
     * Cleans a string in preparation for Regexp.
     */
    this.escapeRegExp = function (string) {
      return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }

    /**
     * Array multisort.
     */
    this.array_multisort = function (arr) {
      var g
      var i
      var j
      var k
      var l
      var sal
      var vkey
      var elIndex
      var lastSorts
      var tmpArray
      var zlast

      var sortFlag = [0]
      var thingsToSort = []
      var nLastSort = []
      var lastSort = []
      // possibly redundant
      var args = arguments

      var flags = {
        'SORT_REGULAR': 16,
        'SORT_NUMERIC': 17,
        'SORT_STRING': 18,
        'SORT_ASC': 32,
        'SORT_DESC': 40
      }

      var sortDuplicator = function (a, b) {
        return nLastSort.shift()
      }

      var sortFunctions = [
        [

          function (a, b) {
            lastSort.push(a > b ? 1 : (a < b ? -1 : 0))
            return a > b ? 1 : (a < b ? -1 : 0)
          },
          function (a, b) {
            lastSort.push(b > a ? 1 : (b < a ? -1 : 0))
            return b > a ? 1 : (b < a ? -1 : 0)
          }
        ],
        [

          function (a, b) {
            lastSort.push(a - b)
            return a - b
          },
          function (a, b) {
            lastSort.push(b - a)
            return b - a
          }
        ],
        [

          function (a, b) {
            lastSort.push((a + '') > (b + '') ? 1 : ((a + '') < (b + '') ? -1 : 0))
            return (a + '') > (b + '') ? 1 : ((a + '') < (b + '') ? -1 : 0)
          },
          function (a, b) {
            lastSort.push((b + '') > (a + '') ? 1 : ((b + '') < (a + '') ? -1 : 0))
            return (b + '') > (a + '') ? 1 : ((b + '') < (a + '') ? -1 : 0)
          }
        ]
      ]

      var sortArrs = [
        []
      ]

      var sortKeys = [
        []
      ]

      // Store first argument into sortArrs and sortKeys if an Object.
      // First Argument should be either a Javascript Array or an Object,
      // otherwise function would return FALSE like in PHP
      if (Object.prototype.toString.call(arr) === '[object Array]') {
        sortArrs[0] = arr
      } else if (arr && typeof arr === 'object') {
        for (i in arr) {
          if (arr.hasOwnProperty(i)) {
            sortKeys[0].push(i)
            sortArrs[0].push(arr[i])
          }
        }
      } else {
        return false
      }

      // arrMainLength: Holds the length of the first array.
      // All other arrays must be of equal length, otherwise function would return FALSE like in PHP
      // sortComponents: Holds 2 indexes per every section of the array
      // that can be sorted. As this is the start, the whole array can be sorted.
      var arrMainLength = sortArrs[0].length
      var sortComponents = [0, arrMainLength]

      // Loop through all other arguments, checking lengths and sort flags
      // of arrays and adding them to the above variables.
      var argl = arguments.length
      for (j = 1; j < argl; j++) {
        if (Object.prototype.toString.call(arguments[j]) === '[object Array]') {
          sortArrs[j] = arguments[j]
          sortFlag[j] = 0
          if (arguments[j].length !== arrMainLength) {
            return false
          }
        } else if (arguments[j] && typeof arguments[j] === 'object') {
          sortKeys[j] = []
          sortArrs[j] = []
          sortFlag[j] = 0
          for (i in arguments[j]) {
            if (arguments[j].hasOwnProperty(i)) {
              sortKeys[j].push(i)
              sortArrs[j].push(arguments[j][i])
            }
          }
          if (sortArrs[j].length !== arrMainLength) {
            return false
          }
        } else if (typeof arguments[j] === 'string') {
          var lFlag = sortFlag.pop()
          // Keep extra parentheses around latter flags check
          // to avoid minimization leading to CDATA closer
          if (typeof flags[arguments[j]] === undefined ||
            ((((flags[arguments[j]]) >>> 4) & (lFlag >>> 4)) > 0)) {
            return false
          }
          sortFlag.push(lFlag + flags[arguments[j]])
        } else {
          return false
        }
      }

      for (i = 0; i !== arrMainLength; i++) {
        thingsToSort.push(true)
      }

      // Sort all the arrays....
      for (i in sortArrs) {
        if (sortArrs.hasOwnProperty(i)) {
          lastSorts = []
          tmpArray = []
          elIndex = 0
          nLastSort = []
          lastSort = []

          // If there are no sortComponents, then no more sorting is neeeded.
          // Copy the array back to the argument.
          if (sortComponents.length === 0) {
            if (Object.prototype.toString.call(arguments[i]) === '[object Array]') {
              args[i] = sortArrs[i]
            } else {
              for (k in arguments[i]) {
                if (arguments[i].hasOwnProperty(k)) {
                  delete arguments[i][k]
                }
              }
              sal = sortArrs[i].length
              for (j = 0, vkey = 0; j < sal; j++) {
                if (typeof sortKeys !== undefined && typeof sortKeys[i] !== undefined && typeof sortKeys[i][j] !== undefined) {
                  vkey = sortKeys[i][j]
                  args[i][vkey] = sortArrs[i][j]
                }
              }
            }
            sortArrs.splice(i, 1)
            sortKeys.splice(i, 1)
            continue
          }

          // Sort function for sorting. Either sorts asc or desc, regular/string or numeric.
          var sFunction = sortFunctions[(sortFlag[i] & 3)][((sortFlag[i] & 8) > 0) ? 1 : 0]

          // Sort current array.
          for (l = 0; l !== sortComponents.length; l += 2) {
            tmpArray = sortArrs[i].slice(sortComponents[l], sortComponents[l + 1] + 1)
            tmpArray.sort(sFunction)
            // Is there a better way to copy an array in Javascript?
            lastSorts[l] = [].concat(lastSort)
            elIndex = sortComponents[l]
            for (g in tmpArray) {
              if (tmpArray.hasOwnProperty(g)) {
                sortArrs[i][elIndex] = tmpArray[g]
                elIndex++
              }
            }
          }

          // Duplicate the sorting of the current array on future arrays.
          sFunction = sortDuplicator
          for (j in sortArrs) {
            if (sortArrs.hasOwnProperty(j)) {
              if (sortArrs[j] === sortArrs[i]) {
                continue
              }
              for (l = 0; l !== sortComponents.length; l += 2) {
                tmpArray = sortArrs[j].slice(sortComponents[l], sortComponents[l + 1] + 1)
                // alert(l + ':' + nLastSort);
                nLastSort = [].concat(lastSorts[l])
                tmpArray.sort(sFunction)
                elIndex = sortComponents[l]
                for (g in tmpArray) {
                  if (tmpArray.hasOwnProperty(g)) {
                    sortArrs[j][elIndex] = tmpArray[g]
                    elIndex++
                  }
                }
              }
            }
          }

          // Duplicate the sorting of the current array on array keys
          for (j in sortKeys) {
            if (sortKeys.hasOwnProperty(j)) {
              for (l = 0; l !== sortComponents.length; l += 2) {
                tmpArray = sortKeys[j].slice(sortComponents[l], sortComponents[l + 1] + 1)
                nLastSort = [].concat(lastSorts[l])
                tmpArray.sort(sFunction)
                elIndex = sortComponents[l]
                for (g in tmpArray) {
                  if (tmpArray.hasOwnProperty(g)) {
                    sortKeys[j][elIndex] = tmpArray[g]
                    elIndex++
                  }
                }
              }
            }
          }

          // Generate the next sortComponents
          zlast = null
          sortComponents = []
          for (j in sortArrs[i]) {
            if (sortArrs[i].hasOwnProperty(j)) {
              if (!thingsToSort[j]) {
                if ((sortComponents.length & 1)) {
                  sortComponents.push(j - 1)
                }
                zlast = null
                continue
              }
              if (!(sortComponents.length & 1)) {
                if (zlast !== null) {
                  if (sortArrs[i][j] === zlast) {
                    sortComponents.push(j - 1)
                  } else {
                    thingsToSort[j] = false
                  }
                }
                zlast = sortArrs[i][j]
              } else {
                if (sortArrs[i][j] !== zlast) {
                  sortComponents.push(j - 1)
                  zlast = sortArrs[i][j]
                }
              }
            }
          }

          if (sortComponents.length & 1) {
            sortComponents.push(j)
          }
          if (Object.prototype.toString.call(arguments[i]) === '[object Array]') {
            args[i] = sortArrs[i]
          } else {
            for (j in arguments[i]) {
              if (arguments[i].hasOwnProperty(j)) {
                delete arguments[i][j]
              }
            }

            sal = sortArrs[i].length
            for (j = 0, vkey = 0; j < sal; j++) {
              vkey = sortKeys[i][j]
              args[i][vkey] = sortArrs[i][j]
            }
          }
          sortArrs.splice(i, 1)
          sortKeys.splice(i, 1)
        }
      }
      return true
    }

  }

  window.personaLib = new personaLibClass();

})(Drupal, jQuery, drupalSettings, once);

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc