/* ht5now.js Version 1.0
 * Copyright (c) 2010 Roger Li and Julian Rosenblum
 */

// ht5now object
var ht5now = (function () {
  var toArray = function (list) {
    var i, result = [];
    for (i = 0; i < list.length; i += 1) {
      result[result.length] = list[i];
    }
    return result;
  };
  return {
    version: '1.0',
    array: {
      toArray: function (list) {
        return toArray(list);
      }
    },
    DOM: {
      els: function () {
        return toArray(document.getElementsByTagName('*'));
      },
      elsDoc: function () {
        return [document].concat(toArray(document.getElementsByTagName('*')));
      }
    },
    caches: {
      listeners: {},
      querySelectorAll: {}
    }
  };
}());

// Number instance methods
if (!Number.prototype.toExponential) {
  Number.prototype.toExponential = function () {
    var number = this,
        returnString = "",
        powerOfTen, numberString, hasDecimals;
    if (number === 0) {
      return ("0e+0");
    }
    if (number < 0) {
      number = Math.abs(number);
      returnString = "-";
    }
    powerOfTen = Math.log(number) / Math.LN10;
    powerOfTen = (number > 0 ? Math.ceil(powerOfTen) : Math.floor(powerOfTen));
    numberString = number * Math.pow(10, -powerOfTen);
    if (numberString < 1) {
      numberString *= 10;
    }
    hasDecimals = (numberString % 1 !== 0 ? true : false);
    numberString += "";
    returnString += numberString.slice(0, 1);
    if (hasDecimals) {
      returnString += "." + numberString.slice(2);
    }
    if (powerOfTen >= 0) {
      return returnString + "e+" + (powerOfTen - 1);
    }
    return returnString + "e-" + Math.abs(powerOfTen);
  };
}

if (!Number.prototype.toFixed) {
  Number.prototype.toFixed = function ( /* fixed */ ) {
    var number = this,
        fix = arguments[0] || 0,
        result = "",
        decimals = false,
        numberOfDecimals, i;
    result = Math.round(number * Math.pow(10, fix)) / Math.pow(10, fix);
    decimals = (result % 1 === 0 ? false : true);
    if (fix > 0) {
      if (!decimals) {
        result += ".";
        for (i = 0; i < fix; i += 1) {
          result += "0";
        }
      }
      if (decimals) {
        numberOfDecimals = (String(result).slice(String(result).indexOf(".") + 1)).split("").length;
        if (fix > numberOfDecimals) {
          fix -= numberOfDecimals;
          for (i = 0; i < fix; i += 1) {
            result += "0";
          }
        }
      }
      return result;
    }
    else {
      throw new TypeError();
    }
  };
}

if (!Number.prototype.toPrecision) {
  Number.prototype.toPrecision = function ( /* precision */ ) {
    var number = this,
        numberOfDigits = String(this).split("").length - (String(this).indexOf(".") === -1 ? 0 : 1),
        response = "",
        fix = arguments[0] || numberOfDigits,
        decimals = (String(this).slice(String(this).indexOf(".") + 1)).split("").length,
        notDecimals = numberOfDigits - decimals,
        fix2 = notDecimals - fix,
        newDecimals, i;
    response = Math.round(number / Math.pow(10, fix2)) * Math.pow(10, fix2);
    fix -= notDecimals;
    response = Math.round(response * Math.pow(10, fix)) / Math.pow(10, fix) + "";
    newDecimals = (String(response).slice(String(response).indexOf(".") + 1)).split("").length;
    fix -= newDecimals;
    if (fix > 0 && response.indexOf(".") === -1) {
      response += ".";
    }
    for (i = 0; i < fix; i += 1) {
      response += "0";
    }
    return response;
  };
}

// Array instance methods
if (!Array.prototype.forEach) { // Based on Mozilla Developer Center implementation
  Array.prototype.forEach = function (func /*, thisVar*/ ) {
    var length = this.length,
        thisVar = arguments[1],
        i;
    for (i = 0; i < length; i += 1) {
      if (i in this) {
        func.call(thisVar, this[i], i, this);
      }
    }
  };
}

if (!Array.prototype.indexOf) { // Based on Mozilla Developer Center implementation
  Array.prototype.indexOf = function (val, start) {
    var length = this.length,
        i;
    if (!start) {
      start = 0;
    }
    for (i = start; i < length; i += 1) {
      if (this[i] === val) {
        return i;
      }
    }
    return -1;
  };
}

if (!Array.prototype.lastIndexOf) { // Based on Mozilla Developer Center implementation
  Array.prototype.lastIndexOf = function (val, start) {
    var length = this.length,
        i;
    if (!start) {
      start = length - 1;
    }
    for (i = start; i >= 0; i -= 1) {
      if (this[i] === val) {
        return i;
      }
    }
    return -1;
  };
}

if (!Array.prototype.every) { // Based on Mozilla Developer Center implementation
  Array.prototype.every = function (func /*, thisVar*/ ) {
    var length = this.length,
        thisVar = arguments[1],
        i;
    for (i = 0; i < length; i += 1) {
      if (i in this && !func.call(thisVar, this[i], i, this)) {
        return false;
      }
    }
    return true;
  };
}

if (!Array.prototype.some) { // Based on Mozilla Developer Center implementation
  Array.prototype.some = function (func /*, thisVar*/ ) {
    var length = this.length,
        thisVar = arguments[1],
        i;
    for (i = 0; i < length; i += 1) {
      if (i in this && func.call(thisVar, this[i], i, this)) {
        return true;
      }
    }
    return false;
  };
}

if (!Array.prototype.map) { // Based on Mozilla Developer Center implementation
  Array.prototype.map = function (func /*, thisVar*/ ) {
    var length = this.length,
        thisVar = arguments[1],
        result = [],
        i;
    for (i = 0; i < length; i += 1) {
      if (i in this) {
        result[i] = func.call(thisVar, this[i], i, this);
      }
    }
    return result;
  };
}

if (!Array.prototype.filter) { // Based on Mozilla Developer Center implementation
  Array.prototype.filter = function (func /*, thisVar*/ ) {
    var length = this.length,
        thisVar = arguments[1],
        result = [],
        i;
    for (i = 0; i < length; i += 1) {
      if (i in this) {
        if (func.call(thisVar, this[i], i, this)) {
          result[result.length] = this[i];
        }
      }
    }
    return result;
  };
}

if (!Array.prototype.reduce) { // Based on Mozilla Developer Center implementation
  Array.prototype.reduce = function (func /*, initial*/ ) {
    var length = this.length,
        result, i = 0;
    if (typeof func !== "function") {
      throw new TypeError();
    }
    if (length === 0 && arguments.length === 1) {
      throw new TypeError();
    }
    if (arguments.length >= 2) {
      result = arguments[1];
    }
    else {
      for (i; i < length; i += 1) {
        if (i in this) {
          result = this[i];
          break;
        }
      }
    }
    for (i += 1; i < length; i += 1) {
      if (i in this) {
        result = func.call(undefined, result, this[i], i, this);
      }
    }
    return result;
  };
}

if (!Array.prototype.reduceRight) { // Based on Mozilla Developer Center implementation
  Array.prototype.reduceRight = function (func /*, initial*/ ) {
    var length = this.length,
        result, i = length;
    if (typeof func !== "function") {
      throw new TypeError();
    }
    if (length === 0 && arguments.length === 1) {
      throw new TypeError();
    }
    if (arguments.length >= 2) {
      result = arguments[1];
    }
    else {
      for (i; i >= 0; i -= 1) {
        if (i in this) {
          result = this[i];
          break;
        }
      }
    }
    for (i -= 1; i >= 0; i -= 1) {
      if (i in this) {
        result = func.call(undefined, result, this[i], i, this);
      }
    }
    return result;
  };
}

// Array object metods
if (!Array.isArray) { // Based on Mozilla Developer Center implementation
  Array.isArray = function (obj) {
    return obj instanceof Array || Object.prototype.toString.call(obj) === '[object Array]';
  };
}

// String instance methods
if (!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^\s*|\s*$/g, "");
  };
}

// Function instance methods
if (!Function.prototype.bind) { // Based on Mozilla Developer Center implementation
  Function.prototype.bind = function (boundThis /*, arg1, arg2... */ ) {
    "use strict";
    var target = this,
        boundArgs = Array.prototype.slice.call(arguments, 1),
        boundFunction;
    if (typeof target !== "function") {
      throw new TypeError();
    }
    boundFunction = function () {
      var realArguments = [];
      Array.prototype.push.apply(realArguments, boundArgs);
      Array.prototype.push.apply(realArguments, arguments);
      return target.apply(boundThis, realArguments);
    };
    return boundFunction;
  };
}

// DOM methods
if (!document.getElementsByClassName) {
  ht5now.DOM.elsDoc().forEach(function (e) {
    e.getElementsByClassName = function (classes) {
      var els = ht5now.array.toArray(e.getElementsByTagName('*')),
          hasClasses, result = [];
      result.item = function (i) {
        return (i < result.length ? result[i] : null);
      };
      classes = classes.split(' ');
      if (els.length === 0) {
        return result;
      }
      els.forEach(function (e) {
        hasClasses = classes.every(function (f) {
          return e.className.split(' ').indexOf(f) > -1;
        });
        if (hasClasses) {
          result[result.length] = e;
        }
      });
      return result;
    };
  });
}

if (!document.addEventListener) {
  ht5now.DOM.elsDoc().forEach(function (e) {
    var newListener;
    e.addEventListener = function (eventName, listener, useCapture) {
      if (useCapture) {
        e.setCapture();
      }
      newListener = function () {
        listener.apply(e, arguments);
      };
      ht5now.caches.listeners[listener.toString()] = newListener;
      return e.attachEvent('on' + eventName, newListener);
    };
    e.removeEventListener = function (eventName, listener, useCapture) {
      if (useCapture) {
        e.releaseCapture();
      }
      newListener = ht5now.caches.listeners[listener.toString()];
      ht5now.caches.listeners[listener.toString()] = undefined;
      return e.detachEvent('on' + eventName, newListener);
    };
  });
}

ht5now.DOM.querySelectorAll = (function () {
  // Based on implementation of cssQuery by Dean Edwards
  // as licensed under the GNU Lesser General Public License
  // http://creativecommons.org/licenses/LGPL/2.1/
  var $COMMA = /\s*,\s*/,
      querySelectorAll, modules = {},
      loaded = false,
      selectors = {},
      pseudoClasses = {},
      AttributeSelector = {
      match: /\[([\w-]+(\|[\w-]+)?)\s*(\W?=)?\s*([^\]]*)\]/
      },
      attributeSelectors = [],
      thisElement = function ($element) {
        return ($element && $element.nodeType === 1 && $element.tagName !== "!") ? $element : null;
      },
      previousElementSibling = function ($element) {
        while ($element && ($element = $element.previousSibling) && !thisElement($element)) {
        }
        return $element;
      },
      nextElementSibling = function ($element) {
        while ($element && ($element = $element.nextSibling) && !thisElement($element)) {
        }
        return $element;
      },
      firstElementChild = function ($element) {
        return thisElement($element.firstChild) || nextElementSibling($element.firstChild);
      },
      lastElementChild = function ($element) {
        return thisElement($element.lastChild) || previousElementSibling($element.lastChild);
      },
      childElements = function ($element) {
        var $childElements = [];
        $element = firstElementChild($element);
        while ($element) {
          $childElements.push($element);
          $element = nextElementSibling($element);
        }
        return $childElements;
      },
      getDocument = function ($element) {
        return $element.ownerDocument || $element.document;
      },
      isMSIE = eval("false;/*@cc_on@if(@\x5fwin32)isMSIE=true@end@*/"),
      isXML = function ($element) {
        var $document = getDocument($element);
        return (typeof $document.mimeType === "unknown") ? /\.xml$/i.test($document.URL) : Boolean($document.mimeType === "XML Document");
      },
      getElementsByTagName = function ($element, $tagName) {
        return ($tagName === "*" && $element.all) ? $element.all : $element.getElementsByTagName($tagName);
      },
      compareNamespace = function ($element, $namespace) {
        return !$namespace || ($namespace === "*") || ($element.scopeName === $namespace);
      },
      compareTagName = function ($element, $tagName, $namespace) {
        if ($tagName === "*") return thisElement($element);
        if (!compareNamespace($element, $namespace)) return false;
        if (!isXML($element)) $tagName = $tagName.toUpperCase();
        return $element.tagName === $tagName;
      },
      getTextContent = function ($element) {
        return $element.innerText;
      },
      _msie_selectById = function ($results, $from, id) {
        var $match, i, j;
        for (i = 0; i < $from.length; i++) {
          if ($match = $from[i].all.item(id)) {
            if ($match.id === id) $results.push($match);
            else if ($match.length !== null) {
              for (j = 0; j < $match.length; j++) {
                if ($match[j].id === id) $results.push($match[j]);
              }
            }
          }
        }
        return $results;
      },
      $NAMESPACE = /\|/,
      select = function ($$from, $token, $filter, $arguments) {
        if ($NAMESPACE.test($filter)) {
          $filter = $filter.split($NAMESPACE);
          $arguments = $filter[0];
          $filter = $filter[1];
        }
        var $results = [];
        if (selectors[$token]) {
          selectors[$token]($results, $$from, $filter, $arguments);
        }
        return $results;
      },
      $STANDARD_SELECT = /^[^\s>+~]/,
      $$STREAM = /[\s#.:>+~()@]|[^\s#.:>+~()@]+/g,
      _toStream = function ($selector) {
        if ($STANDARD_SELECT.test($selector)) $selector = " " + $selector; {
          return $selector.match($$STREAM) || [];
        }
      },
      $WHITESPACE = /\s*([\s>+~(),]|^|$)\s*/g,
      $IMPLIED_ALL = /([\s>+~,]|[^(]\+|^)([#.:@])/g,
      parseSelector = function ($selector) {
        return $selector.replace($WHITESPACE, "$1").replace($IMPLIED_ALL, "$1*$2");
      },
      parseSelectorTemp,
      Quote = {
        toString: function () {
          return "'";
        },
        match: /^('[^']*')|("[^"]*")$/,
        test: function ($string) {
          return this.match.test($string);
        },
        add: function ($string) {
          return this.test($string) ? $string : this + $string + this;
        },
        remove: function ($string) {
          return this.test($string) ? $string.slice(1, -1) : $string;
        }
      },
      getText = function ($text) {
        return Quote.remove($text);
      },
      $ESCAPE = /([\/()[\]?{}|*+-])/g,
      regEscape = function ($string) {
        return $string.replace($ESCAPE, "\\$1");
      };
  if (!isMSIE) {
    getElementsByTagName = function ($element, $tagName, $namespace) {
      return $namespace ? $element.getElementsByTagNameNS("*", $tagName) : $element.getElementsByTagName($tagName);
    };
    compareNamespace = function ($element, $namespace) {
      return !$namespace || ($namespace == "*") || ($element.prefix == $namespace);
    };
    isXML = document.contentType ?
    function ($element) {
      return /xml/i.test(getDocument($element).contentType);
    } : function ($element) {
      return getDocument($element).documentElement.tagName != "HTML";
    };
    getTextContent = function ($element) {
      // mozilla || opera || other
      return $element.textContent || $element.innerText || _getTextContent($element);
    };
    _getTextContent = function ($element) {
      var $textContent = "",
          $node, i;
      for (i = 0;
      ($node = $element.childNodes[i]); i++) {
        switch ($node.nodeType) {
        case 11:
          // document fragment
        case 1:
          $textContent += _getTextContent($node);
          break;
        case 3:
          $textContent += $node.nodeValue;
          break;
        }
      }
      return $textContent;
    };
  }
  selectors[" "] = function ($results, $from, $tagName, $namespace) {
    var $element, i, j;
    for (i = 0; i < $from.length; i++) {
      var $subset = getElementsByTagName($from[i], $tagName, $namespace);
      for (j = 0;
      ($element = $subset[j]); j++) {
        if (thisElement($element) && compareNamespace($element, $namespace)) $results.push($element);
      }
    }
  };
  selectors["#"] = function ($results, $from, $id) {
    var $element, j;
    for (j = 0;
    ($element = $from[j]); j++) if ($element.id === $id) $results.push($element);
  };
  selectors["."] = function ($results, $from, $className) {
    $className = new RegExp("(^|\\s)" + $className + "(\\s|$)");
    var $element, i;
    for (i = 0;
    ($element = $from[i]); i++)
    if ($className.test($element.className)) $results.push($element);
  };
  selectors[":"] = function ($results, $from, $pseudoClass, $arguments) {
    var $test = pseudoClasses[$pseudoClass],
        $element, i;
    if ($test) for (i = 0;
    ($element = $from[i]); i++) if ($test($element, $arguments)) $results.push($element);
  };
  pseudoClasses["link"] = function ($element) {
    var $document = getDocument($element);
    if ($document.links) for (var i = 0; i < $document.links.length; i++) {
      if ($document.links[i] === $element) return true;
    }
  };
  selectors[">"] = function ($results, $from, $tagName, $namespace) {
    var $element, i, j;
    for (i = 0; i < $from.length; i++) {
      var $subset = childElements($from[i]);
      for (j = 0;
      ($element = $subset[j]); j++)
      if (compareTagName($element, $tagName, $namespace)) $results.push($element);
    }
  };
  selectors["+"] = function ($results, $from, $tagName, $namespace) {
    for (var i = 0; i < $from.length; i++) {
      var $element = nextElementSibling($from[i]);
      if ($element && compareTagName($element, $tagName, $namespace)) $results.push($element);
    }
  };
  selectors["@"] = function ($results, $from, $attributeSelectorID) {
    var $test = attributeSelectors[$attributeSelectorID].test;
    var $element, i;
    for (i = 0;
    ($element = $from[i]); i++)
    if ($test($element)) $results.push($element);
  };
  pseudoClasses["first-child"] = function ($element) {
    return !previousElementSibling($element);
  };

  pseudoClasses["lang"] = function ($element, $code) {
    $code = new RegExp("^" + $code, "i");
    while ($element && !$element.getAttribute("lang")) $element = $element.parentNode;
    return $element && $code.test($element.getAttribute("lang"));
  };
  AttributeSelector.NS_IE = /\\:/g;
  AttributeSelector.PREFIX = "@";
  AttributeSelector.tests = {};
  AttributeSelector.replace = function ($match, $attribute, $namespace, $compare, $value) {
    var $key = this.PREFIX + $match;
    if (!attributeSelectors[$key]) {
      $attribute = this.create($attribute, $compare || "", $value || "");
      attributeSelectors[$key] = $attribute;
      attributeSelectors.push($attribute);
    }
    return attributeSelectors[$key].id;
  };
  AttributeSelector.parse = function ($selector) {
    $selector = $selector.replace(this.NS_IE, "|");
    var $match;
    while ($match = $selector.match(this.match)) {
      var $replace = this.replace($match[0], $match[1], $match[2], $match[3], $match[4]);
      $selector = $selector.replace(this.match, $replace);
    }
    return $selector;
  };
  AttributeSelector.create = function ($propertyName, $test, $value) {
    var $attributeSelector = {};
    $attributeSelector.id = this.PREFIX + attributeSelectors.length;
    $attributeSelector.name = $propertyName;
    $test = this.tests[$test];
    $test = $test ? $test(this.getAttribute($propertyName), getText($value)) : false;
    $attributeSelector.test = new Function("e", "return " + $test);
    return $attributeSelector;
  };
  AttributeSelector.getAttribute = function ($name) {
    switch ($name.toLowerCase()) {
    case "id":
      return "e.id";
    case "class":
      return "e.className";
    case "for":
      return "e.htmlFor";
    case "href":
      if (isMSIE) {
        return "String((e.outerHTML.match(/href=\\x22?([^\\s\\x22]*)\\x22?/)||[])[1]||'')";
      }
    }
    return "e.getAttribute('" + $name.replace($NAMESPACE, ":") + "')";
  };
  AttributeSelector.tests[""] = function ($attribute) {
    return $attribute;
  };

  AttributeSelector.tests["="] = function ($attribute, $value) {
    return $attribute + "==" + Quote.add($value);
  };

  AttributeSelector.tests["~="] = function ($attribute, $value) {
    return "/(^| )" + regEscape($value) + "( |$)/.test(" + $attribute + ")";
  };

  AttributeSelector.tests["|="] = function ($attribute, $value) {
    return "/^" + regEscape($value) + "(-|$)/.test(" + $attribute + ")";
  };
  selectors["~"] = function ($results, $from, $tagName, $namespace) {
    var $element, i;
    for (i = 0;
    ($element = $from[i]); i++) {
      while ($element = nextElementSibling($element)) {
        if (compareTagName($element, $tagName, $namespace)) $results.push($element);
      }
    }
  };
  pseudoClasses["contains"] = function ($element, $text) {
    $text = new RegExp(regEscape(getText($text)));
    return $text.test(getTextContent($element));
  };

  pseudoClasses["root"] = function ($element) {
    return $element == getDocument($element).documentElement;
  };

  pseudoClasses["empty"] = function ($element) {
    var $node, i;
    for (i = 0;
    ($node = $element.childNodes[i]); i++) {
      if (thisElement($node) || $node.nodeType == 3) return false;
    }
    return true;
  };

  pseudoClasses["last-child"] = function ($element) {
    return !nextElementSibling($element);
  };

  pseudoClasses["only-child"] = function ($element) {
    $element = $element.parentNode;
    return firstElementChild($element) == lastElementChild($element);
  };

  pseudoClasses["not"] = function ($element, $selector) {
    var $negated = cssQuery($selector, getDocument($element));
    for (var i = 0; i < $negated.length; i++) {
      if ($negated[i] == $element) return false;
    }
    return true;
  };

  pseudoClasses["nth-child"] = function ($element, $arguments) {
    return nthChild($element, $arguments, previousElementSibling);
  };

  pseudoClasses["nth-last-child"] = function ($element, $arguments) {
    return nthChild($element, $arguments, nextElementSibling);
  };

  pseudoClasses["target"] = function ($element) {
    return $element.id == location.hash.slice(1);
  };

  pseudoClasses["checked"] = function ($element) {
    return $element.checked;
  };

  pseudoClasses["enabled"] = function ($element) {
    return $element.disabled === false;
  };

  pseudoClasses["disabled"] = function ($element) {
    return $element.disabled;
  };

  pseudoClasses["indeterminate"] = function ($element) {
    return $element.indeterminate;
  };

  AttributeSelector.tests["^="] = function ($attribute, $value) {
    return "/^" + regEscape($value) + "/.test(" + $attribute + ")";
  };

  AttributeSelector.tests["$="] = function ($attribute, $value) {
    return "/" + regEscape($value) + "$/.test(" + $attribute + ")";
  };

  AttributeSelector.tests["*="] = function ($attribute, $value) {
    return "/" + regEscape($value) + "/.test(" + $attribute + ")";
  };

  function nthChild($element, $arguments, $traverse) {
    switch ($arguments) {
    case "n":
      return true;
    case "even":
      $arguments = "2n";
      break;
    case "odd":
      $arguments = "2n+1";
    }

    var $$children = childElements($element.parentNode);

    function _checkIndex($index) {
      var $index = ($traverse == nextElementSibling) ? $$children.length - $index : $index - 1;
      return $$children[$index] == $element;
    };

    if (!isNaN($arguments)) return _checkIndex($arguments);

    $arguments = $arguments.split("n");
    var $multiplier = parseInt($arguments[0]);
    var $step = parseInt($arguments[1]);

    if ((isNaN($multiplier) || $multiplier == 1) && $step == 0) return true;
    if ($multiplier == 0 && !isNaN($step)) return _checkIndex($step);
    if (isNaN($step)) $step = 0;

    var $count = 1;
    while ($element = $traverse($element)) $count++;

    if (isNaN($multiplier) || $multiplier == 1) return ($traverse == nextElementSibling) ? ($count <= $step) : ($step >= $count);

    return ($count % $multiplier) == $step;
  };
  parseSelectorTemp = parseSelector;
  parseSelector = function ($selector) {
    return parseSelectorTemp(AttributeSelector.parse($selector));
  };
  querySelectorAll = function ($selector, $$from) {
    try {
      var $match = [],
          $useCache = arguments.callee.caching && !$$from,
          $base = ($$from) ? ($$from.constructor === Array) ? $$from : [$$from] : [document],
          $$selectors = parseSelector($selector).split($COMMA),
          i, j = 0,
          $token, $filter, $arguments, $cacheSelector = "";
      for (i = 0; i < $$selectors.length; i++) {
        $selector = _toStream($$selectors[i]);
        if (isMSIE && $selector.slice(0, 3).join("") === " *#") {
          $selector = $selector.slice(2);
          $$from = _msie_selectById([], $base, $selector[1]);
        }
        else {
          $$from = $base;
        }
        while (j < $selector.length) {
          $token = $selector[j++];
          $filter = $selector[j++];
          $cacheSelector += $token + $filter;
          $arguments = "";
          if ($selector[j] === "(") {
            while ($selector[j++] !== ")" && j < $selector.length) {
              $arguments += $selector[j];
            }
            $arguments = $arguments.slice(0, -1);
            $cacheSelector += "(" + $arguments + ")";
          }
          $$from = ($useCache && ht5now.caches.querySelectorAll[$cacheSelector]) ? ht5now.caches.querySelectorAll[$cacheSelector] : select($$from, $token, $filter, $arguments);
          if ($useCache) {
            ht5now.caches.querySelectorAll[$cacheSelector] = $$from;
          }
        }
        $match = $match.concat($$from);
      }
      return $match;
    }
    catch ($error) {
      return [];
    }
  };
  loaded = true;
  return querySelectorAll;
}());

if (!document.querySelectorAll) {
  ht5now.DOM.elsDoc().forEach(function (e) {
    e.querySelectorAll = function (selector) {
      return ht5now.DOM.querySelectorAll(selector, e);
    }
  });
}

if (!document.querySelector) {
  ht5now.DOM.elsDoc().forEach(function (e) {
    e.querySelector = function (selector) {
      return ht5now.DOM.querySelectorAll(selector, e)[0];
    }
  });
}
