From 76cdc521d7f3bf1245a48a33cf09502715c74c50 Mon Sep 17 00:00:00 2001 From: Maksim Chemerisuk Date: Fri, 19 Sep 2014 20:24:50 +0300 Subject: [PATCH] version 2.0.0-rc.3 --- bower.json | 2 +- dist/better-dom.js | 1079 +++++++++++++--------------------------- dist/better-dom.min.js | 4 +- package.json | 4 +- 4 files changed, 347 insertions(+), 742 deletions(-) diff --git a/bower.json b/bower.json index 45194b52..af1018c5 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "better-dom", - "version": "2.0.0-rc.2", + "version": "2.0.0-rc.3", "main": [ "dist/better-dom.js", "dist/better-dom.htc" diff --git a/dist/better-dom.js b/dist/better-dom.js index c4ba6483..cad3c260 100644 --- a/dist/better-dom.js +++ b/dist/better-dom.js @@ -1,20 +1,20 @@ /** * @file better-dom.js - * @version 2.0.0-rc.2 2014-09-17T17:03:47 + * @version 2.0.0-rc.3 2014-09-19T20:24:49 * @overview Live extension playground * @copyright 2013-2014 Maksim Chemerisuk * @license MIT * @see https://github.com/chemerisuk/better-dom */ -(function() {var SLICE$0 = Array.prototype.slice; - "use strict"; +(function() { + "use strict";var SLICE$0 = Array.prototype.slice; var constants$$WINDOW = window; var constants$$DOCUMENT = constants$$WINDOW.document; var constants$$HTML = constants$$DOCUMENT.documentElement; var constants$$userAgent = constants$$WINDOW.navigator.userAgent; - var constants$$CSS3_ANIMATIONS = constants$$WINDOW.CSSKeyframesRule || !constants$$DOCUMENT.attachEvent; + var constants$$LEGACY_IE = constants$$DOCUMENT.attachEvent && !constants$$WINDOW.CSSKeyframesRule; var constants$$LEGACY_ANDROID = ~constants$$userAgent.indexOf("Android") && constants$$userAgent.indexOf("Chrome") < 0; var constants$$DOM2_EVENTS = !!constants$$DOCUMENT.addEventListener; var constants$$WEBKIT_PREFIX = constants$$WINDOW.WebKitAnimationEvent ? "-webkit-" : ""; @@ -36,13 +36,8 @@ // use a random property name to link JS wrappers and // native DOM elements. - var types$$wrapperProp = "__" + Math.random().toString().substr(2) + "__"; + var types$$wrapperProp = "__" + Math.random().toString(32).substr(2) + "__"; - /** - * Used to represent a DOM element - * @class $Element - * @private - */ function types$$$Element(node) { if (node && node[types$$wrapperProp]) return node[types$$wrapperProp]; @@ -70,20 +65,9 @@ } }; - /** - * Global object to access the DOM - * @namespace DOM - * @extends $Element - * @example - * You can use `DOM.constructor` to create a native element wrapper: - * ```js - * var bodyEl = DOM.constructor(document.body); - * bodyEl.hide(); - * ``` - */ var types$$DOM = new types$$$Element(constants$$HTML); - types$$DOM.VERSION = "2.0.0-rc.2"; + types$$DOM.VERSION = "2.0.0-rc.3"; var exports$$_DOM = constants$$WINDOW.DOM; @@ -123,10 +107,10 @@ } }; - var dom$dom$create$$reTest = /^(?:[a-z-]+|\s*(<.+>)\s*)$/i, - dom$dom$create$$sandbox = constants$$DOCUMENT.createElement("body"), - dom$dom$create$$makeCreateMethod = function(all) {return function(value, varMap) { - var test = dom$dom$create$$reTest.exec(value), + var dom$create$$reTest = /^(?:[a-z-]+|\s*(<.+>)\s*)$/i, + dom$create$$sandbox = constants$$DOCUMENT.createElement("body"), + dom$create$$makeMethod = function(all) {return function(value, varMap) { + var test = dom$create$$reTest.exec(value), nodes, el; if (value && test && !test[1]) { @@ -142,10 +126,10 @@ throw new errors$$StaticMethodError("create" + all); } - dom$dom$create$$sandbox.innerHTML = value; // parse input HTML string + dom$create$$sandbox.innerHTML = value; // parse input HTML string - for (nodes = all ? [] : null; el = dom$dom$create$$sandbox.firstChild; ) { - dom$dom$create$$sandbox.removeChild(el); // detach element from the sandbox + for (nodes = all ? [] : null; el = dom$create$$sandbox.firstChild; ) { + dom$create$$sandbox.removeChild(el); // detach element from the sandbox if (el.nodeType === 1) { if (all) { @@ -162,66 +146,45 @@ return all ? nodes : new types$$$Element(nodes); }}; - /** - * Create a new {@link $Element} from Emmet or HTML string - * @memberof DOM - * @alias DOM.create - * @param {String} value Emmet or HTML string - * @param {Object|Array} [varMap] key/value map of variables - * @return {$Element} an element wrapper - */ - types$$DOM.create = dom$dom$create$$makeCreateMethod(""); - - /** - * Create a new array of {@link $Element}s from Emmet or HTML string - * @memberof DOM - * @alias DOM.createAll - * @param {String} value Emmet or HTML string - * @param {Object|Array} [varMap] key/value map of variables - * @return {Array.<$Element>} an array of element wrappers - * @example - * ```js - * DOM.createAll("span+b"); // => array with 2 $Elements: span and b - * DOM.createAll("li*5"); // => array with 5 li $Elements - * ``` - */ - types$$DOM.createAll = dom$dom$create$$makeCreateMethod("All"); + types$$DOM.create = dom$create$$makeMethod(""); + + types$$DOM.createAll = dom$create$$makeMethod("All"); /* es6-transpiler has-iterators:false, has-generators: false */ var // operator type / priority object - dom$dom$emmet$$operators = {"(": 1,")": 2,"^": 3,">": 4,"+": 4,"*": 5,"`": 6,"]": 5,"[": 6,".": 7,"#": 8}, - dom$dom$emmet$$reAttr = /([\w\-]+)(?:=((?:`((?:\\?.)*)?`)|[^\s]+))?/g, - dom$dom$emmet$$reIndex = /(\$+)(?:@(-)?(\d+)?)?/g, + dom$emmet$$operators = {"(": 1,")": 2,"^": 3,">": 4,"+": 4,"*": 5,"`": 6,"]": 5,"[": 6,".": 7,"#": 8}, + dom$emmet$$reAttr = /([\w\-]+)(?:=((?:`((?:\\?.)*)?`)|[^\s]+))?/g, + dom$emmet$$reIndex = /(\$+)(?:@(-)?(\d+)?)?/g, // populate empty tags - dom$dom$emmet$$tagCache = "area base br col hr img input link meta param command keygen source".split(" ").reduce(function(tagCache, tag) { + dom$emmet$$tagCache = "area base br col hr img input link meta param command keygen source".split(" ").reduce(function(tagCache, tag) { tagCache[tag] = "<" + tag + ">"; return tagCache; }, {}), - dom$dom$emmet$$normalizeAttrs = function(_, name, value, singleValue) { + dom$emmet$$normalizeAttrs = function(_, name, value, singleValue) { var quotes = value && value.indexOf("\"") >= 0 ? "'" : "\""; // always wrap attribute values with quotes if they don't exist // replace ` quotes with " except when it's a single quotes case return name + "=" + quotes + (singleValue || value || name) + quotes; }, - dom$dom$emmet$$injectTerm = function(term, first) {return function(el) { + dom$emmet$$injectTerm = function(term, first) {return function(el) { var index = first ? el.indexOf(">") : el.lastIndexOf("<"); // inject term into the html string return el.substr(0, index) + term + el.substr(index); }}, - dom$dom$emmet$$makeTerm = function(tag) { - var result = dom$dom$emmet$$tagCache[tag]; + dom$emmet$$makeTerm = function(tag) { + var result = dom$emmet$$tagCache[tag]; - if (!result) result = dom$dom$emmet$$tagCache[tag] = "<" + tag + ">"; + if (!result) result = dom$emmet$$tagCache[tag] = "<" + tag + ">"; return result; }, - dom$dom$emmet$$makeIndexedTerm = function(n, term) { + dom$emmet$$makeIndexedTerm = function(n, term) { var result = [], i; for (i = 0; i < n; ++i) { - result.push(term.replace(dom$dom$emmet$$reIndex, function(expr, fmt, sign, base) { + result.push(term.replace(dom$emmet$$reIndex, function(expr, fmt, sign, base) { var index = (sign ? n - i - 1 : i) + (base ? +base : 1); // handle zero-padded strings return (fmt + index).slice(-fmt.length).split("$").join("0"); @@ -231,16 +194,6 @@ return result; }; - /** - * Parse emmet-like template and return resulting HTML string - * @memberof DOM - * @alias DOM.emmet - * @param {String} template input EmmetString - * @param {Object|Array} [varMap] key/value map of variables - * @return {String} HTML string - * @see https://github.com/chemerisuk/better-dom/wiki/Microtemplating - * @see http://docs.emmet.io/cheat-sheet/ - */ types$$DOM.emmet = function(template, varMap) {var $D$0;var $D$1; if (typeof template !== "string") throw new errors$$StaticMethodError("emmet"); @@ -253,15 +206,15 @@ term = "", priority, skip, node, str; - if (template in dom$dom$emmet$$tagCache) return dom$dom$emmet$$tagCache[template]; + if (template in dom$emmet$$tagCache) {return dom$emmet$$tagCache[template];} // parse expression into RPN - $D$0 = 0;$D$1 = template.length;for (str ; $D$0 < $D$1; ){str = (template[$D$0++]); + $D$0 = 0;$D$1 = template.length;for (str ;$D$0 < $D$1;){str = (template[$D$0++]); // concat .c1.c2 into single space separated class string if (str === "." && stack[0] === ".") str = " "; - priority = dom$dom$emmet$$operators[str]; + priority = dom$emmet$$operators[str]; if (priority && (!skip || skip === str)) { // remove redundat ^ operators from the stack when more than one exists @@ -276,7 +229,7 @@ } if (str !== "(") { - while (dom$dom$emmet$$operators[stack[0]] > priority) { + while (dom$emmet$$operators[stack[0]] > priority) { output.push(stack.shift()); // for ^ operator stop shifting when the first > is found if (str === "^" && output[output.length - 1] === ">") break; @@ -303,30 +256,30 @@ output = output.concat(stack); // handle single tag case - if (output.length === 1) return dom$dom$emmet$$makeTerm(output[0]); + if (output.length === 1) {return dom$emmet$$makeTerm(output[0]);} // transform RPN into html nodes stack = []; - $D$0 = 0;$D$1 = output.length;for (str ; $D$0 < $D$1; ){str = (output[$D$0++]); - if (str in dom$dom$emmet$$operators) { + $D$0 = 0;$D$1 = output.length;for (str ;$D$0 < $D$1;){str = (output[$D$0++]); + if (str in dom$emmet$$operators) { term = stack.shift(); node = stack.shift() || [""]; - if (typeof node === "string") node = [ dom$dom$emmet$$makeTerm(node) ]; + if (typeof node === "string") node = [ dom$emmet$$makeTerm(node) ]; switch(str) { case ".": - term = dom$dom$emmet$$injectTerm(" class=\"" + term + "\"", true); + term = dom$emmet$$injectTerm(" class=\"" + term + "\"", true); break; case "#": - term = dom$dom$emmet$$injectTerm(" id=\"" + term + "\"", true); + term = dom$emmet$$injectTerm(" id=\"" + term + "\"", true); break; case "[": - term = dom$dom$emmet$$injectTerm(" " + term.replace(dom$dom$emmet$$reAttr, dom$dom$emmet$$normalizeAttrs), true); + term = dom$emmet$$injectTerm(" " + term.replace(dom$emmet$$reAttr, dom$emmet$$normalizeAttrs), true); break; case "`": @@ -335,14 +288,14 @@ break; case "*": - node = dom$dom$emmet$$makeIndexedTerm(+term, node.join("")); + node = dom$emmet$$makeIndexedTerm(+term, node.join("")); break; default: - term = typeof term === "string" ? dom$dom$emmet$$makeTerm(term) : term.join(""); + term = typeof term === "string" ? dom$emmet$$makeTerm(term) : term.join(""); if (str === ">") { - term = dom$dom$emmet$$injectTerm(term); + term = dom$emmet$$injectTerm(term); } else { node.push(term); } @@ -358,64 +311,7 @@ if (typeof output !== "string") output = output.join(""); - return varMap ? output : dom$dom$emmet$$tagCache[template] = output; - }; - - /* - * Helper for css selectors - */ - - /*es6-transpiler has-iterators:false, has-generators: false*/ - var util$selectormatcher$$rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\[([\w\-\=]+)\])?(?:\.([\w\-]+))?$/, - util$selectormatcher$$propName = "m oM msM mozM webkitM".split(" ").reduce(function(result, prefix) { - var propertyName = prefix + "atchesSelector"; - - return result || constants$$HTML[propertyName] && propertyName; - }, null); - - var util$selectormatcher$$default = function(selector, context) { - if (typeof selector !== "string") return null; - - var quick = util$selectormatcher$$rquickIs.exec(selector); - - if (quick) { - // 0 1 2 3 4 - // [ _, tag, id, attribute, class ] - if (quick[1]) quick[1] = quick[1].toLowerCase(); - if (quick[3]) quick[3] = quick[3].split("="); - if (quick[4]) quick[4] = " " + quick[4] + " "; - } - - return function(node) {var $D$2;var $D$3; - var result, found; - - if (!quick && !util$selectormatcher$$propName) { - found = (context || document).querySelectorAll(selector); - } - - for (; node && node.nodeType === 1; node = node.parentNode) { - if (quick) { - result = ( - (!quick[1] || node.nodeName.toLowerCase() === quick[1]) && - (!quick[2] || node.id === quick[2]) && - (!quick[3] || (quick[3][1] ? node.getAttribute(quick[3][0]) === quick[3][1] : node.hasAttribute(quick[3][0]))) && - (!quick[4] || (" " + node.className + " ").indexOf(quick[4]) >= 0) - ); - } else { - if (util$selectormatcher$$propName) { - result = node[util$selectormatcher$$propName](selector); - } else { - $D$2 = 0;$D$3 = found.length;for (var n ; $D$2 < $D$3; ){n = (found[$D$2++]); - if (n === node) return n; - };$D$2 = $D$3 = void 0; - } - } - - if (result || !context || node === context) break; - } - - return result && node; - }; + return varMap ? output : dom$emmet$$tagCache[template] = output; }; /* @@ -497,17 +393,10 @@ var util$stylehooks$$default = util$stylehooks$$hooks; - var dom$dom$importstyles$$styleNode = helpers$$default.injectElement(constants$$DOCUMENT.createElement("style")), - dom$dom$importstyles$$styleSheet = dom$dom$importstyles$$styleNode.sheet || dom$dom$importstyles$$styleNode.styleSheet, - dom$dom$importstyles$$styleRules = dom$dom$importstyles$$styleSheet.cssRules || dom$dom$importstyles$$styleSheet.rules; + var dom$importstyles$$styleNode = helpers$$default.injectElement(constants$$DOCUMENT.createElement("style")), + dom$importstyles$$styleSheet = dom$importstyles$$styleNode.sheet || dom$importstyles$$styleNode.styleSheet, + dom$importstyles$$styleRules = dom$importstyles$$styleSheet.cssRules || dom$importstyles$$styleSheet.rules; - /** - * Append global css styles - * @memberof DOM - * @alias DOM.importStyles - * @param {String} selector css selector - * @param {String|Object} cssText css rules - */ types$$DOM.importStyles = function(selector, cssText) { if (cssText && typeof cssText === "object") { // use styleObj to collect all style props for a new CSS rule @@ -530,203 +419,248 @@ throw new errors$$StaticMethodError("importStyles"); } - if (dom$dom$importstyles$$styleSheet.cssRules) { - dom$dom$importstyles$$styleSheet.insertRule(selector + "{" + cssText + "}", dom$dom$importstyles$$styleRules.length); + if (dom$importstyles$$styleSheet.cssRules) { + dom$importstyles$$styleSheet.insertRule(selector + "{" + cssText + "}", dom$importstyles$$styleRules.length); } else { // ie doesn't support multiple selectors in addRule - selector.split(",").forEach(function(selector) { dom$dom$importstyles$$styleSheet.addRule(selector, cssText) }); + selector.split(",").forEach(function(selector) { dom$importstyles$$styleSheet.addRule(selector, cssText) }); } }; - var dom$dom$importstyles$$default = types$$DOM.importStyles; + var dom$importstyles$$default = types$$DOM.importStyles; - // Inspired by trick discovered by Daniel Buchner: - // https://github.com/csuwldcat/SelectorListener - var dom$dom$extend$$reRemovableMethod = /^(on|do)[A-Z]/, - dom$dom$extend$$extensions = [], - dom$dom$extend$$returnTrue = function() {return true}, - dom$dom$extend$$returnFalse = function() {return false}, - dom$dom$extend$$nativeEventType, dom$dom$extend$$animId, dom$dom$extend$$link, dom$dom$extend$$styles, - dom$dom$extend$$applyMixins = function(obj, mixins) { - helpers$$default.keys(mixins).forEach(function(key) { - if (key !== "constructor") obj[key] = mixins[key]; - }); - }, - dom$dom$extend$$stopExt = function(node, index) {return function(e) { + /* + * Helper for css selectors + */ + + /*es6-transpiler has-iterators:false, has-generators: false*/ + var util$selectormatcher$$rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\[([\w\-\=]+)\])?(?:\.([\w\-]+))?$/, + util$selectormatcher$$propName = "m oM msM mozM webkitM".split(" ").reduce(function(result, prefix) { + var propertyName = prefix + "atchesSelector"; + + return result || constants$$HTML[propertyName] && propertyName; + }, null); + + var util$selectormatcher$$default = function(selector, context) { + if (typeof selector !== "string") return null; + + var quick = util$selectormatcher$$rquickIs.exec(selector); + + if (quick) { + // 0 1 2 3 4 + // [ _, tag, id, attribute, class ] + if (quick[1]) quick[1] = quick[1].toLowerCase(); + if (quick[3]) quick[3] = quick[3].split("="); + if (quick[4]) quick[4] = " " + quick[4] + " "; + } + + return function(node) {var $D$2;var $D$3; + var result, found; + + if (!quick && !util$selectormatcher$$propName) { + found = (context || document).querySelectorAll(selector); + } + + for (; node && node.nodeType === 1; node = node.parentNode) { + if (quick) { + result = ( + (!quick[1] || node.nodeName.toLowerCase() === quick[1]) && + (!quick[2] || node.id === quick[2]) && + (!quick[3] || (quick[3][1] ? node.getAttribute(quick[3][0]) === quick[3][1] : node.hasAttribute(quick[3][0]))) && + (!quick[4] || (" " + node.className + " ").indexOf(quick[4]) >= 0) + ); + } else { + if (util$selectormatcher$$propName) { + result = node[util$selectormatcher$$propName](selector); + } else { + $D$2 = 0;$D$3 = found.length;for (var n ;$D$2 < $D$3;){n = (found[$D$2++]); + if (n === node) return n; + };$D$2 = $D$3 = void 0; + } + } + + if (result || !context || node === context) break; + } + + return result && node; + }; + }; + + var util$extensionhandler$$reRemovableMethod = /^(on|do)[A-Z]/, + util$extensionhandler$$ANIMATION_ID = "DOM" + Date.now(), + util$extensionhandler$$stopExt = function(node, index) {return function(e) { var isEventValid; e = e || constants$$WINDOW.event; - if (constants$$CSS3_ANIMATIONS) { - isEventValid = e.animationName === dom$dom$extend$$animId && e.target === node; - } else { + if (constants$$LEGACY_IE) { isEventValid = e.srcUrn === constants$$CUSTOM_EVENT_TYPE && e.srcElement === node; + } else { + isEventValid = e.animationName === util$extensionhandler$$ANIMATION_ID && e.target === node; } // mark extension as processed via e._skip bitmask if (isEventValid) (e._skip = e._skip || {})[index] = true; }}, - dom$dom$extend$$makeExtHandler = function(node, skip) {return function(ext, index) { - // skip previously excluded or mismatched elements - if (!skip[index] && ext.accept(node)) ext(node); - }}, - dom$dom$extend$$startExt = function(ext) { - // initialize extension manually to make sure that all elements - // have appropriate methods before they are used in other DOM.extend. - // Also fixes legacy IEs when the HTC behavior is already attached - helpers$$default.each.call(constants$$DOCUMENT.querySelectorAll(ext.selector), ext); - // MUST be after querySelectorAll because of legacy IEs quirks - dom$dom$importstyles$$default(ext.selector, dom$dom$extend$$styles); - }, - dom$dom$extend$$readyState = constants$$DOCUMENT.readyState, - dom$dom$extend$$readyCallback = function() { - if (dom$dom$extend$$readyCallback) { - dom$dom$extend$$extensions.forEach(dom$dom$extend$$startExt); + util$extensionhandler$$ExtensionHandler = function(selector, condition, mixins, index) { + var eventHandlers = helpers$$default.keys(mixins).filter(function(prop) {return !!util$extensionhandler$$reRemovableMethod.exec(prop)}), + ctr = mixins.hasOwnProperty("constructor") && function(el) { + try { + // make a safe call so live extensions can't break each other + mixins.constructor.call(el); + } catch (err) { + // log invokation error if it was thrown + if ("console" in constants$$WINDOW) constants$$WINDOW.console.error(err); + } + }, + ext = function(node, mock) { + var el = types$$$Element(node); - dom$dom$extend$$readyCallback = false; - } + if (constants$$LEGACY_IE) { + node.attachEvent("on" + util$extensionhandler$$ExtensionHandler.EVENT_TYPE, util$extensionhandler$$stopExt(node, index)); + } else { + node.addEventListener(util$extensionhandler$$ExtensionHandler.EVENT_TYPE, util$extensionhandler$$stopExt(node, index), false); + } + + if (mock === true || condition(el) !== false) { + helpers$$default.assign(el, mixins); + // invoke constructor if it exists + if (ctr) ctr(el); + // remove event handlers from element's interface + if (mock !== true) eventHandlers.forEach(function(prop) { delete el[prop] }); + } + }; + + ext.accept = util$selectormatcher$$default(selector); + + return ext; }; - // Catch cases where ready is called after the browser event has already occurred. - // IE10 and lower don't handle "interactive" properly... use a weak inference to detect it - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if (constants$$DOCUMENT.attachEvent ? dom$dom$extend$$readyState === "complete" : dom$dom$extend$$readyState !== "loading") { - // fix fox #14: use setTimeout to make sure that the library is fully initialized - setTimeout(dom$dom$extend$$readyCallback, 0); + if (constants$$LEGACY_IE) { + util$extensionhandler$$ExtensionHandler.EVENT_TYPE = constants$$CUSTOM_EVENT_TYPE; } else { - if (constants$$DOM2_EVENTS) { - constants$$WINDOW.addEventListener("load", dom$dom$extend$$readyCallback, false); - constants$$DOCUMENT.addEventListener("DOMContentLoaded", dom$dom$extend$$readyCallback, false); - } else { - constants$$WINDOW.attachEvent("onload", dom$dom$extend$$readyCallback); - constants$$DOCUMENT.attachEvent("on" + constants$$CUSTOM_EVENT_TYPE, function() { - if (constants$$WINDOW.event.srcUrn === "DOMContentLoaded" && dom$dom$extend$$readyCallback) dom$dom$extend$$readyCallback(); - }); - } + util$extensionhandler$$ExtensionHandler.ANIMATION_ID = util$extensionhandler$$ANIMATION_ID; + util$extensionhandler$$ExtensionHandler.EVENT_TYPE = constants$$WEBKIT_PREFIX ? "webkitAnimationEnd" : "animationend"; } - if (constants$$CSS3_ANIMATIONS) { - dom$dom$extend$$nativeEventType = constants$$WEBKIT_PREFIX ? "webkitAnimationStart" : "animationstart"; - dom$dom$extend$$animId = "DOM" + Date.now(); + util$extensionhandler$$ExtensionHandler.traverse = function(node, skip) {return function(ext, index) { + // skip previously excluded or mismatched elements + if (!skip[index] && ext.accept(node)) ext(node); + }}; - dom$dom$importstyles$$default("@" + constants$$WEBKIT_PREFIX + "keyframes " + dom$dom$extend$$animId, "from {opacity:.99} to {opacity:1}"); + var util$extensionhandler$$default = util$extensionhandler$$ExtensionHandler; - dom$dom$extend$$styles = { - "animation-duration": "1ms !important", - "animation-name": dom$dom$extend$$animId + " !important" - }; + // Inspired by trick discovered by Daniel Buchner: + // https://github.com/csuwldcat/SelectorListener + + var dom$extend$$extensions = [], + dom$extend$$returnTrue = function() {return true}, + dom$extend$$returnFalse = function() {return false}, + dom$extend$$readyCallback, dom$extend$$styles; + + if (constants$$LEGACY_IE) { + var dom$extend$$link = constants$$DOCUMENT.querySelector("link[rel=htc]"); - constants$$DOCUMENT.addEventListener(dom$dom$extend$$nativeEventType, function(e) { - if (e.animationName === dom$dom$extend$$animId) { - dom$dom$extend$$extensions.forEach(dom$dom$extend$$makeExtHandler(e.target, e._skip || {})); + if (dom$extend$$link) { + dom$extend$$link = dom$extend$$link.href; + } else { + if ("console" in constants$$WINDOW) { + constants$$WINDOW.console.log("WARNING: In order to use live extensions in IE < 10 you have to include extra files. See https://github.com/chemerisuk/better-dom#notes-about-old-ies for details."); } - }, false); - } else { - dom$dom$extend$$nativeEventType = "on" + constants$$CUSTOM_EVENT_TYPE; - dom$dom$extend$$link = constants$$DOCUMENT.querySelector("link[rel=htc]"); - if (!dom$dom$extend$$link) throw new Error("In order to use live extensions in IE < 10 you have to include extra files. See https://github.com/chemerisuk/better-dom#notes-about-old-ies"); + var dom$extend$$scripts = constants$$DOCUMENT.scripts; + // trying to guess HTC file location + dom$extend$$link = dom$extend$$scripts[dom$extend$$scripts.length - 1].src.split("/"); + dom$extend$$link = "/" + dom$extend$$link.slice(3, dom$extend$$link.length - 1).concat("better-dom.htc").join("/"); + } + + dom$extend$$styles = {behavior: "url(" + dom$extend$$link + ") !important"}; - dom$dom$extend$$styles = {behavior: "url(" + dom$dom$extend$$link.href + ") !important"}; // append behavior for HTML element to apply several legacy IE-specific fixes - dom$dom$importstyles$$default("html", dom$dom$extend$$styles); + dom$importstyles$$default("html", dom$extend$$styles); - constants$$DOCUMENT.attachEvent(dom$dom$extend$$nativeEventType, function() { + constants$$DOCUMENT.attachEvent("on" + util$extensionhandler$$default.EVENT_TYPE, function() { var e = constants$$WINDOW.event; if (e.srcUrn === constants$$CUSTOM_EVENT_TYPE) { - dom$dom$extend$$extensions.forEach(dom$dom$extend$$makeExtHandler(e.srcElement, e._skip || {})); + dom$extend$$extensions.forEach(util$extensionhandler$$default.traverse(e.srcElement, e._skip || {})); } }); + } else { + var dom$extend$$readyState = constants$$DOCUMENT.readyState; + // IE10 and lower don't handle "interactive" properly... use a weak inference to detect it + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if (constants$$DOCUMENT.attachEvent ? dom$extend$$readyState !== "complete" : dom$extend$$readyState === "loading") { + dom$extend$$readyCallback = function() { + dom$extend$$extensions.forEach(function(ext) { ext.start() }); + + dom$extend$$readyCallback = null; + }; + + // use DOMContentLoaded to initialize any live extension + // AFTER the document is completely parsed to avoid quirks + constants$$DOCUMENT.addEventListener("DOMContentLoaded", dom$extend$$readyCallback, false); + // just in case the DOMContentLoaded event fails use onload + constants$$WINDOW.addEventListener("load", dom$extend$$readyCallback, false); + } + + dom$importstyles$$default("@" + constants$$WEBKIT_PREFIX + "keyframes " + util$extensionhandler$$default.ANIMATION_ID, "from {opacity:.99} to {opacity:1}"); + + dom$extend$$styles = { + "animation-duration": "1ms !important", + "animation-name": util$extensionhandler$$default.ANIMATION_ID + " !important" + }; + + constants$$DOCUMENT.addEventListener(util$extensionhandler$$default.EVENT_TYPE, function(e) { + if (e.animationName === util$extensionhandler$$default.ANIMATION_ID) { + dom$extend$$extensions.forEach(util$extensionhandler$$default.traverse(e.target, e._skip || {})); + } + }, false); } - /** - * Declare a live extension - * @memberof DOM - * @alias DOM.extend - * @param {String} selector css selector of which elements to capture - * @param {Boolean|Function} [condition=true] indicates if live extension should be attached or not - * @param {Object} mixins extension declatation - * @see https://github.com/chemerisuk/better-dom/wiki/Live-extensions - */ types$$DOM.extend = function(selector, condition, mixins) { if (arguments.length === 2) { mixins = condition; condition = true; } - if (typeof condition === "boolean") condition = condition ? dom$dom$extend$$returnTrue : dom$dom$extend$$returnFalse; + if (typeof condition === "boolean") condition = condition ? dom$extend$$returnTrue : dom$extend$$returnFalse; if (typeof mixins === "function") mixins = {constructor: mixins}; if (!mixins || typeof mixins !== "object" || typeof condition !== "function") throw new errors$$StaticMethodError("extend"); if (selector === "*") { // extending element prototype - dom$dom$extend$$applyMixins(types$$$Element.prototype, mixins); + helpers$$default.assign(types$$$Element.prototype, mixins); } else { - var eventHandlers = helpers$$default.keys(mixins).filter(function(prop) {return !!dom$dom$extend$$reRemovableMethod.exec(prop)}), - index = dom$dom$extend$$extensions.length, - ctr = mixins.hasOwnProperty("constructor") && function(el) { - try { - // make a safe call so live extensions can't break each other - mixins.constructor.call(el); - } catch (err) { - // log invokation error if it was thrown - if ("console" in constants$$WINDOW) constants$$WINDOW.console.error(err); - } - }, - ext = function(node, mock) { - var el = types$$$Element(node); - - if (constants$$CSS3_ANIMATIONS) { - node.addEventListener(dom$dom$extend$$nativeEventType, dom$dom$extend$$stopExt(node, index), false); - } else { - node.attachEvent(dom$dom$extend$$nativeEventType, dom$dom$extend$$stopExt(node, index)); - } - - if (mock === true || condition(el) !== false) { - dom$dom$extend$$applyMixins(el, mixins); - // invoke constructor if it exists - if (ctr) ctr(el); - // remove event handlers from element's interface - if (mock !== true) eventHandlers.forEach(function(prop) { delete el[prop] }); - } - }; + var ext = util$extensionhandler$$default(selector, condition, mixins, dom$extend$$extensions.length); + + ext.start = function() { + // initialize extension manually to make sure that all elements + // have appropriate methods before they are used in other DOM.extend. + // Also fixes legacy IEs when the HTC behavior is already attached + helpers$$default.each.call(constants$$DOCUMENT.querySelectorAll(selector), ext); + // MUST be after querySelectorAll because of legacy IEs quirks + types$$DOM.importStyles(selector, dom$extend$$styles); + }; - ext.accept = util$selectormatcher$$default(selector); - ext.selector = selector; - dom$dom$extend$$extensions.push(ext); + dom$extend$$extensions.push(ext); - if (!dom$dom$extend$$readyCallback) dom$dom$extend$$startExt(ext); + if (!dom$extend$$readyCallback) ext.start(); } }; - var dom$dom$extend$$default = dom$dom$extend$$extensions; + var dom$extend$$default = dom$extend$$extensions; - var dom$dom$format$$reVar = /\{([\w\-]+)\}/g; + var dom$format$$reVar = /\{([\w\-]+)\}/g; - /** - * Formats template using a variables map - * @memberof DOM - * @alias DOM.format - * @param {String} template template string - * @param {Object} varMap key/value map of variables - * @return {String} result string - */ types$$DOM.format = function(template, varMap) { if (typeof template !== "string" || varMap && typeof varMap !== "object") { throw new errors$$StaticMethodError("format"); } - return template.replace(dom$dom$format$$reVar, function(x, name) {return name in varMap ? String(varMap[name]) : x}); + return template.replace(dom$format$$reVar, function(x, name) {return name in varMap ? String(varMap[name]) : x}); }; - /** - * Import external scripts on the page and call optional callback when it will be done - * @memberof DOM - * @alias DOM.importScripts - * @param {...String} urls script file urls - * @param {Function} [callback] callback that is triggered when all scripts are loaded - */ types$$DOM.importScripts = function() {var urls = SLICE$0.call(arguments, 0); var callback = function() { var arg = urls.shift(), @@ -750,48 +684,30 @@ callback(); }; - var dom$dom$mock$$applyExtensions = function(node) { - dom$dom$extend$$default.forEach(function(ext) { if (ext.accept(node)) ext(node, true) }); + var dom$mock$$applyExtensions = function(node) { + dom$extend$$default.forEach(function(ext) { if (ext.accept(node)) ext(node, true) }); - helpers$$default.each.call(node.children, dom$dom$mock$$applyExtensions); + helpers$$default.each.call(node.children, dom$mock$$applyExtensions); }, - dom$dom$mock$$makeMockMethod = function(all) {return function(content, varMap) { + dom$mock$$makeMethod = function(all) {return function(content, varMap) { if (!content) return new types$$$Element(); var result = types$$DOM["create" + all](content, varMap); if (all) { - result.forEach(function(el) { dom$dom$mock$$applyExtensions(el[0]) }); + result.forEach(function(el) { dom$mock$$applyExtensions(el[0]) }); } else { - dom$dom$mock$$applyExtensions(result[0]); + dom$mock$$applyExtensions(result[0]); } return result; }}; - /** - * Return {@link $Element} initialized with all existing live extensions. - * Also exposes private event handler functions that aren't usually presented - * @memberof DOM - * @alias DOM.mock - * @param {String} value EmmetString or HTMLString - * @param {Object|Array} [varMap] key/value map of variables - * @return {$Element} mocked instance - */ - types$$DOM.mock = dom$dom$mock$$makeMockMethod(""); - - /** - * Return Array of {@link $Element} initialized with all existing live extensions. - * Also exposes private event handler functions that aren't usually presented - * @memberof DOM - * @alias DOM.mockAll - * @param {String} value EmmetString or HTMLString - * @param {Object|Array} [varMap] key/value map of variables - * @return {Array.<$Element>} an array of element wrappers - */ - types$$DOM.mockAll = dom$dom$mock$$makeMockMethod("All"); + types$$DOM.mock = dom$mock$$makeMethod(""); + + types$$DOM.mockAll = dom$mock$$makeMethod("All"); - var element$element$children$$makeChildrenMethod = function(all) {return function(selector) { + var element$children$$makeMethod = function(all) {return function(selector) { if (all) { if (selector && typeof selector !== "string") throw new errors$$MethodError("children"); } else { @@ -821,40 +737,27 @@ }}; helpers$$default.assign(types$$$Element.prototype, { - /** - * Return child element by index filtered by optional selector - * @memberof! $Element# - * @alias $Element#child - * @param {Number} index child index - * @return {$Element} matched child - * @function - */ - child: element$element$children$$makeChildrenMethod(false), - - /** - * Fetch children elements filtered by optional selector - * @memberof! $Element# - * @alias $Element#children - * @param {String} [selector] css selector - * @return {Array.<$Element>} an array of all matched element wrappers - * @function - */ - children: element$element$children$$makeChildrenMethod(true) + child: element$children$$makeMethod(false), + + children: element$children$$makeMethod(true) }); /* es6-transpiler has-iterators:false, has-generators: false */ - var element$element$classes$$reSpace = /[\n\t\r]/g, - element$element$classes$$makeClassesMethod = function(nativeMethodName, fallback) { + var element$classes$$reSpace = /[\n\t\r]/g, + element$classes$$makeMethod = function(nativeMethodName, strategy) { var methodName = nativeMethodName === "contains" ? "hasClass" : nativeMethodName + "Class"; - // use fallback if browser does not support classList API - if (!constants$$HTML.classList) nativeMethodName = null; + + if (constants$$HTML.classList) { + // use native classList property if possible + strategy = function(el, token) { + return el[0].classList[nativeMethodName](token); + }; + } if (methodName === "hasClass" || methodName === "toggleClass") { return function(token, force) { - var node = this[0]; - - if (node) { + if (this[0]) { if (typeof force === "boolean" && methodName === "toggleClass") { this[force ? "addClass" : "removeClass"](token); @@ -863,27 +766,18 @@ if (typeof token !== "string") throw new errors$$MethodError(methodName); - if (nativeMethodName) { - return node.classList[nativeMethodName](token); - } else { - return fallback(this, node, token); - } + return strategy(this, token); } }; } else { return function() {var $D$4;var $D$5; - var node = this[0], - args = arguments; + var tokens = arguments; - if (node) { - $D$4 = 0;$D$5 = args.length;for (var token ; $D$4 < $D$5; ){token = (args[$D$4++]); + if (this[0]) { + $D$4 = 0;$D$5 = tokens.length;for (var token ;$D$4 < $D$5;){token = (tokens[$D$4++]); if (typeof token !== "string") throw new errors$$MethodError(methodName); - if (nativeMethodName) { - node.classList[nativeMethodName](token); - } else { - fallback(this, node, token); - } + strategy(this, token); };$D$4 = $D$5 = void 0; } @@ -893,73 +787,33 @@ }; helpers$$default.assign(types$$$Element.prototype, { - /** - * Check if element contains class name - * @memberof! $Element# - * @alias $Element#hasClass - * @param {String} token class name - * @return {Boolean} returns true if the element contains the class - * @function - */ - hasClass: element$element$classes$$makeClassesMethod("contains", function(el, node, token) { - return (" " + node.className + " ").replace(element$element$classes$$reSpace, " ").indexOf(" " + token + " ") >= 0; + hasClass: element$classes$$makeMethod("contains", function(el, token) { + return (" " + el[0].className + " ") + .replace(element$classes$$reSpace, " ").indexOf(" " + token + " ") >= 0; }), - /** - * Add class(es) to element - * @memberof! $Element# - * @alias $Element#addClass - * @param {...String} takens class name(s) - * @return {$Element} - * @function - */ - addClass: element$element$classes$$makeClassesMethod("add", function(el, node, token) { - if (!el.hasClass(token)) node.className += " " + token; + addClass: element$classes$$makeMethod("add", function(el, token) { + if (!el.hasClass(token)) el[0].className += " " + token; }), - /** - * Remove class(es) from element - * @memberof! $Element# - * @alias $Element#removeClass - * @param {...String} takens class name(s) - * @return {$Element} - * @function - */ - removeClass: element$element$classes$$makeClassesMethod("remove", function(el, node, token) { - token = (" " + node.className + " ").replace(element$element$classes$$reSpace, " ").replace(" " + token + " ", " "); - - node.className = token.trim(); + removeClass: element$classes$$makeMethod("remove", function(el, token) { + el[0].className = (" " + el[0].className + " ") + .replace(element$classes$$reSpace, " ").replace(" " + token + " ", " ").trim(); }), - /** - * Toggle a class on element - * @memberof! $Element# - * @alias $Element#toggleClass - * @param {String} token class name - * @param {Boolean} [force] if true then adds the className; if false - removes it - * @return {Boolean} returns true if the className is now present, and false otherwise. - * @function - */ - toggleClass: element$element$classes$$makeClassesMethod("toggle", function(el, node, token) { - var oldClassName = node.className; - - el.addClass(token); - - if (oldClassName !== node.className) return true; + toggleClass: element$classes$$makeMethod("toggle", function(el, token) { + var hasClass = el.hasClass(token); - el.removeClass(token); + if (hasClass) { + el.removeClass(token); + } else { + el[0].className += " " + token; + } - return false; + return !hasClass; }) }); - /** - * Clone element - * @memberof! $Element# - * @alias $Element#clone - * @param {Boolean} [deep=true] true if all children should also be cloned, or false otherwise - * @return {$Element} a clone of current element - */ types$$$Element.prototype.clone = function() {var deep = arguments[0];if(deep === void 0)deep = true; if (typeof deep !== "boolean") throw new errors$$MethodError("clone"); @@ -980,18 +834,6 @@ return result; }; - /** - * Check if element is inside of context - * @memberof! $Element# - * @alias $Element#contains - * @param {$Element} element element to check - * @return {Boolean} returns true if success and false otherwise - * @example - * ```js - * DOM.contains(DOM.find("body")); // => true - * DOM.find("body").contains(DOM); // => false - * ``` - */ types$$$Element.prototype.contains = function(element) { var node = this[0]; @@ -1012,21 +854,6 @@ throw new errors$$MethodError("contains"); }; - /** - * Callback function for changing a property/attribute - * @callback cssCallback - * @param {String} currentValue current value of style property - * @return {String|Number} a new value for style property - */ - - /** - * CSS properties accessor for an element - * @memberof! $Element# - * @alias $Element#css - * @param {String|Object} name style property name or key/value object - * @param {String|cssCallback} [value] style property value or {@link cssCallback} - * @return {String|$Element} a property value or reference to this - */ types$$$Element.prototype.css = function(name, value) {var this$0 = this; var len = arguments.length, node = this[0], @@ -1087,17 +914,29 @@ return this; }; + types$$$Element.prototype.empty = function() { + var node = this[0], child; + + if (node) { + while (child = node.firstChild) { + node.removeChild(child); + } + } + + return this; + }; + // big part of code inspired by Sizzle: // https://github.com/jquery/sizzle/blob/master/sizzle.js - var element$element$find$$rquick = constants$$DOCUMENT.getElementsByClassName ? /^(?:(\w+)|\.([\w\-]+))$/ : /^(?:(\w+))$/, - element$element$find$$rescape = /'|\\/g, - element$element$find$$tmpId = "DOM" + Date.now(), - element$element$find$$makeFindMethod = function(all) {return function(selector) { + var element$find$$rquick = constants$$DOCUMENT.getElementsByClassName ? /^(?:(\w+)|\.([\w\-]+))$/ : /^(?:(\w+))$/, + element$find$$rescape = /'|\\/g, + element$find$$tmpId = "DOM" + Date.now(), + element$find$$makeMethod = function(all) {return function(selector) { if (typeof selector !== "string") throw new errors$$MethodError("find" + all); var node = this[0], - quickMatch = element$element$find$$rquick.exec(selector), + quickMatch = element$find$$rquick.exec(selector), result, old, nid, context; if (!node) return all ? [] : new types$$$Element(); @@ -1114,7 +953,7 @@ if (result && !all) result = result[0]; } else { old = true; - nid = element$element$find$$tmpId; + nid = element$find$$tmpId; context = node; if (this !== types$$DOM) { @@ -1122,7 +961,7 @@ // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) if ( (old = node.getAttribute("id")) ) { - nid = old.replace(element$element$find$$rescape, "\\$&"); + nid = old.replace(element$find$$rescape, "\\$&"); } else { node.setAttribute("id", nid); } @@ -1142,25 +981,9 @@ }}; helpers$$default.assign(types$$$Element.prototype, { - /** - * Find the first matched element by css selector - * @memberof! $Element# - * @alias $Element#find - * @param {String} selector css selector - * @return {$Element} the first matched element - * @function - */ - find: element$element$find$$makeFindMethod(""), - - /** - * Find all matched elements by css selector - * @memberof! $Element# - * @alias $Element#findAll - * @param {String} selector css selector - * @return {Array.<$Element>} an array of element wrappers - * @function - */ - findAll: element$element$find$$makeFindMethod("All") + find: element$find$$makeMethod(""), + + findAll: element$find$$makeMethod("All") }); var util$eventhooks$$hooks = {}; @@ -1227,7 +1050,7 @@ // click: 1 === left; 2 === middle; 3 === right return button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ); case "pageX": - return e.pageX || e.clientX + constants$$HTML.scrollLeft - constants$$HTML.clientLeft; + return e.clientX + constants$$HTML.scrollLeft - constants$$HTML.clientLeft; case "pageY": return e.clientY + constants$$HTML.scrollTop - constants$$HTML.clientTop; } @@ -1275,14 +1098,6 @@ var util$eventhandler$$default = util$eventhandler$$EventHandler; - /** - * Triggers an event of specific type with optional extra arguments - * @memberof! $Element# - * @alias $Element#fire - * @param {String} type type of event - * @param {...Object} [args] extra arguments to pass into each event handler - * @return {Boolean} returns true if default action wasn't prevented - */ types$$$Element.prototype.fire = function(type) {var args = SLICE$0.call(arguments, 1); var node = this[0], eventType = typeof type, @@ -1387,13 +1202,6 @@ var util$accessorhooks$$default = util$accessorhooks$$hooks; - /** - * Get property or attribute value by name - * @memberof! $Element# - * @alias $Element#get - * @param {String|Array} [name] property or attribute name or array of names - * @return {Object} a property or attribute value - */ types$$$Element.prototype.get = function(name) {var this$0 = this; var data = this._, node = this[0], @@ -1439,7 +1247,7 @@ } }; - var element$element$manipulation$$makeManipulationMethod = function(methodName, fasterMethodName, standalone, strategy) {return function() {var content = arguments[0];if(content === void 0)content = ""; + var element$manipulation$$makeMethod = function(methodName, fasterMethodName, standalone, strategy) {return function() {var content = arguments[0];if(content === void 0)content = ""; var node = this[0]; if (!standalone && (!node.parentNode || content === types$$DOM)) return this; @@ -1477,74 +1285,27 @@ }}; helpers$$default.assign(types$$$Element.prototype, { - /** - * Insert HTMLString or {@link $Element} after the current element - * @memberof! $Element# - * @alias $Element#after - * @param {Mixed} content HTMLString, {@link $Element}, Array.<{@link $Element}> or function - * @return {$Element} - * @function - */ - after: element$element$manipulation$$makeManipulationMethod("after", "afterend", false, function(node, relatedNode) { + after: element$manipulation$$makeMethod("after", "afterend", false, function(node, relatedNode) { node.parentNode.insertBefore(relatedNode, node.nextSibling); }), - /** - * Insert HTMLString or {@link $Element} before the current element - * @memberof! $Element# - * @alias $Element#before - * @param {Mixed} content HTMLString, {@link $Element}, Array.<{@link $Element}> or function - * @return {$Element} - * @function - */ - before: element$element$manipulation$$makeManipulationMethod("before", "beforebegin", false, function(node, relatedNode) { + before: element$manipulation$$makeMethod("before", "beforebegin", false, function(node, relatedNode) { node.parentNode.insertBefore(relatedNode, node); }), - /** - * Prepend HTMLString or {@link $Element} to the current element - * @memberof! $Element# - * @alias $Element#prepend - * @param {Mixed} content HTMLString, {@link $Element}, Array.<{@link $Element}> or function - * @return {$Element} - * @function - */ - prepend: element$element$manipulation$$makeManipulationMethod("prepend", "afterbegin", true, function(node, relatedNode) { + prepend: element$manipulation$$makeMethod("prepend", "afterbegin", true, function(node, relatedNode) { node.insertBefore(relatedNode, node.firstChild); }), - /** - * Append HTMLString or {@link $Element} to the current element - * @memberof! $Element# - * @alias $Element#append - * @param {Mixed} content HTMLString, {@link $Element}, Array.<{@link $Element}> or function - * @return {$Element} - * @function - */ - append: element$element$manipulation$$makeManipulationMethod("append", "beforeend", true, function(node, relatedNode) { + append: element$manipulation$$makeMethod("append", "beforeend", true, function(node, relatedNode) { node.appendChild(relatedNode); }), - /** - * Replace current element with HTMLString or {@link $Element} - * @memberof! $Element# - * @alias $Element#replace - * @param {Mixed} content HTMLString, {@link $Element}, Array.<{@link $Element}> or function - * @return {$Element} - * @function - */ - replace: element$element$manipulation$$makeManipulationMethod("replace", "", false, function(node, relatedNode) { + replace: element$manipulation$$makeMethod("replace", "", false, function(node, relatedNode) { node.parentNode.replaceChild(relatedNode, node); }), - /** - * Remove current element from the DOM - * @memberof! $Element# - * @alias $Element#remove - * @return {$Element} - * @function - */ - remove: element$element$manipulation$$makeManipulationMethod("remove", "", false, function(node) { + remove: element$manipulation$$makeMethod("remove", "", false, function(node) { node.parentNode.removeChild(node); }) }); @@ -1561,18 +1322,6 @@ var util$selectorhooks$$default = util$selectorhooks$$hooks; - /** - * Check if the element matches selector - * @memberof! $Element# - * @alias $Element#matches - * @param {String} selector css selector for checking - * @return {Boolean} returns true if success and false otherwise - * @example - * ```js - * DOM.find("body").matches("html>body"); // => true - * DOM.find("body").matches("body>html"); // => false - * ``` - */ types$$$Element.prototype.matches = function(selector) { if (!selector || typeof selector !== "string") throw new errors$$MethodError("matches"); @@ -1582,13 +1331,6 @@ return node && !!checker(node, this); }; - /** - * Unbind an event from the element - * @memberOf module:events - * @param {String} type type of event - * @param {Function|String} [callback] event handler - * @return {$Element} - */ types$$$Element.prototype.off = function(type, callback) { if (typeof type !== "string") throw new errors$$MethodError("off"); @@ -1611,12 +1353,6 @@ return this; }; - /** - * Calculates offset of the current element - * @memberof! $Element# - * @alias $Element#offset - * @return {Object} object with left, top, bottom, right, width and height properties - */ types$$$Element.prototype.offset = function() { var node = this[0], clientTop = constants$$HTML.clientTop, @@ -1639,7 +1375,7 @@ } }; - var element$element$on$$makeOnMethod = function(once) {return function(type, selector, props, callback) {var this$0 = this; + var element$on$$makeMethod = function(method) {return function(type, selector, props, callback) {var this$0 = this; if (typeof type === "string") { if (typeof props === "function") { callback = props; @@ -1659,7 +1395,7 @@ } var node = this[0], - handler = util$eventhandler$$default(type, selector, callback, props, this, once); + handler = util$eventhandler$$default(type, selector, callback, props, this, method === "once"); if (handler) { if (constants$$DOM2_EVENTS) { @@ -1672,58 +1408,23 @@ } } else if (typeof type === "object") { if (helpers$$default.isArray(type)) { - type.forEach(function(name) { this$0.on(name, selector, callback, props, once) }); + type.forEach(function(name) { this$0[method](name, selector, props, callback) }); } else { - helpers$$default.keys(type).forEach(function(name) { this$0.on(name, type[name]) }); + helpers$$default.keys(type).forEach(function(name) { this$0[method](name, type[name]) }); } } else { - throw new errors$$MethodError(once ? "once" : "on"); + throw new errors$$MethodError(method); } return this; }}; helpers$$default.assign(types$$$Element.prototype, { - /** - * Bind a DOM event - * @memberof! $Element# - * @alias $Element#on - * @param {String|Array} type event type(s) with optional selector - * @param {String} [selector] event selector filter - * @param {Array} [props] array of event properties to pass into the callback - * @param {Function} callback event callback or property name (for late binding) - * @return {$Element} - */ - on: element$element$on$$makeOnMethod(false), - - /** - * Bind a DOM event but fire once before being removed - * @memberof! $Element# - * @alias $Element#once - * @param {String|Array} type event type(s) with optional selector - * @param {String} [selector] event selector filter - * @param {Array} [props] array of event properties to pass into the callback - * @param {Function} callback event callback or property name (for late binding) - * @return {$Element} - */ - once: element$element$on$$makeOnMethod(true) - }); + on: element$on$$makeMethod("on"), - /** - * Callback function for changing a property/attribute - * @callback setterCallback - * @param {Object} currentValue current value of property/attribute - * @return {Object} a new value for property/attribute - */ + once: element$on$$makeMethod("once") + }); - /** - * Set property/attribute value by name - * @memberof! $Element# - * @alias $Element#set - * @param {String|Object|Array} [name] property/attribute name - * @param {String|setterCallback} value property/attribute value or {@link setterCallback} - * @return {$Element} - */ types$$$Element.prototype.set = function(name, value) {var this$0 = this; var node = this[0]; @@ -1779,7 +1480,7 @@ return this; }; - var element$element$traversing$$makeTraversingMethod = function(methodName, propertyName, all) {return function(selector) { + var element$traversing$$makeMethod = function(methodName, propertyName, all) {return function(selector) { if (selector && typeof selector !== "string") throw new errors$$MethodError(methodName); var matcher = util$selectormatcher$$default(selector), @@ -1798,84 +1499,44 @@ }}; helpers$$default.assign(types$$$Element.prototype, { - /** - * Find next sibling element filtered by optional selector - * @memberof! $Element# - * @alias $Element#next - * @param {String} [selector] css selector - * @return {$Element} matched element wrapper - * @function - */ - next: element$element$traversing$$makeTraversingMethod("next", "nextSibling"), - - /** - * Find previous sibling element filtered by optional selector - * @memberof! $Element# - * @alias $Element#prev - * @param {String} [selector] css selector - * @return {$Element} matched element wrapper - * @function - */ - prev: element$element$traversing$$makeTraversingMethod("prev", "previousSibling"), - - /** - * Find all next sibling elements filtered by optional selector - * @memberof! $Element# - * @alias $Element#nextAll - * @param {String} [selector] css selector - * @return {Array.<$Element>} an array of all matched element wrappers - * @function - */ - nextAll: element$element$traversing$$makeTraversingMethod("nextAll", "nextSibling", true), - - /** - * Find all previous sibling elements filtered by optional selector - * @memberof! $Element# - * @alias $Element#prevAll - * @param {String} [selector] css selector - * @return {Array.<$Element>} an array of all matched element wrappers - * @function - */ - prevAll: element$element$traversing$$makeTraversingMethod("prevAll", "previousSibling", true), - - /** - * Find parent element filtered by optional selector - * @memberof! $Element# - * @alias $Element#parent - * @param {String} [selector] css selector - * @return {$Element} matched element wrapper - * @function - */ - parent: element$element$traversing$$makeTraversingMethod("parent", "parentNode") + next: element$traversing$$makeMethod("next", "nextSibling"), + + prev: element$traversing$$makeMethod("prev", "previousSibling"), + + nextAll: element$traversing$$makeMethod("nextAll", "nextSibling", true), + + prevAll: element$traversing$$makeMethod("prevAll", "previousSibling", true), + + parent: element$traversing$$makeMethod("parent", "parentNode") }); // Legacy Android is too slow and has a lot of bugs in the CSS animations // implementation, so skip any animations for it - var element$element$visibility$$ANIMATIONS_ENABLED = !constants$$LEGACY_ANDROID && constants$$CSS3_ANIMATIONS, - element$element$visibility$$TRANSITION_PROPS = ["timing-function", "property", "duration", "delay"].map(function(p) {return "transition-" + p}), - element$element$visibility$$TRANSITION_EVENT_TYPE = constants$$WEBKIT_PREFIX ? "webkitTransitionEnd" : "transitionend", - element$element$visibility$$ANIMATION_EVENT_TYPE = constants$$WEBKIT_PREFIX ? "webkitAnimationEnd" : "animationend", - element$element$visibility$$parseTimeValue = function(value) { + var element$visibility$$ANIMATIONS_ENABLED = !constants$$LEGACY_ANDROID && !constants$$LEGACY_IE, + element$visibility$$TRANSITION_PROPS = ["timing-function", "property", "duration", "delay"].map(function(p) {return "transition-" + p}), + element$visibility$$TRANSITION_EVENT_TYPE = constants$$WEBKIT_PREFIX ? "webkitTransitionEnd" : "transitionend", + element$visibility$$ANIMATION_EVENT_TYPE = constants$$WEBKIT_PREFIX ? "webkitAnimationEnd" : "animationend", + element$visibility$$parseTimeValue = function(value) { var result = parseFloat(value) || 0; // if duration is in seconds, then multiple result value by 1000 return value.lastIndexOf("ms") === value.length - 2 ? result : result * 1000; }, - element$element$visibility$$calcTransitionDuration = function(style) { + element$visibility$$calcTransitionDuration = function(style) { var delay = util$stylehooks$$default.get["transition-delay"](style).split(","), duration = util$stylehooks$$default.get["transition-duration"](style).split(","); return Math.max.apply(Math, duration.map(function(value, index) { - return element$element$visibility$$parseTimeValue(value) + (element$element$visibility$$parseTimeValue(delay[index]) || 0); + return element$visibility$$parseTimeValue(value) + (element$visibility$$parseTimeValue(delay[index]) || 0); })); }, - element$element$visibility$$scheduleTransition = function(node, style, computed, hiding, done) { - var duration = element$element$visibility$$calcTransitionDuration(computed); + element$visibility$$scheduleTransition = function(node, style, computed, hiding, done) { + var duration = element$visibility$$calcTransitionDuration(computed); if (!duration) return false; // skip transitions with zero duration var visibilityTransitionIndex, transitionValues; - transitionValues = element$element$visibility$$TRANSITION_PROPS.map(function(prop, index) { + transitionValues = element$visibility$$TRANSITION_PROPS.map(function(prop, index) { // have to use regexp to split transition-timing-function value return util$stylehooks$$default.get[prop](computed).split(index ? ", " : /, (?!\d)/); }); @@ -1892,14 +1553,14 @@ // now set target duration and delay transitionValues.forEach(function(value, index) { - util$stylehooks$$default.set[element$element$visibility$$TRANSITION_PROPS[index]](style, value.join(", ")); + util$stylehooks$$default.set[element$visibility$$TRANSITION_PROPS[index]](style, value.join(", ")); }); - node.addEventListener(element$element$visibility$$TRANSITION_EVENT_TYPE, function completeTransition(e) { + node.addEventListener(element$visibility$$TRANSITION_EVENT_TYPE, function completeTransition(e) { if (e.propertyName === "visibility" && e.target === node) { e.stopPropagation(); // this is an internal transition - node.removeEventListener(element$element$visibility$$TRANSITION_EVENT_TYPE, completeTransition, false); + node.removeEventListener(element$visibility$$TRANSITION_EVENT_TYPE, completeTransition, false); style.willChange = ""; // remove temporary properties @@ -1918,16 +1579,16 @@ return true; }, - element$element$visibility$$scheduleAnimation = function(node, style, computed, animationName, hiding, done) { - var duration = element$element$visibility$$parseTimeValue(util$stylehooks$$default.get["animation-duration"](computed)); + element$visibility$$scheduleAnimation = function(node, style, computed, animationName, hiding, done) { + var duration = element$visibility$$parseTimeValue(util$stylehooks$$default.get["animation-duration"](computed)); if (!duration) return false; // skip animations with zero duration - node.addEventListener(element$element$visibility$$ANIMATION_EVENT_TYPE, function completeAnimation(e) { + node.addEventListener(element$visibility$$ANIMATION_EVENT_TYPE, function completeAnimation(e) { if (e.animationName === animationName && e.target === node) { e.stopPropagation(); // this is an internal animation - node.removeEventListener(element$element$visibility$$ANIMATION_EVENT_TYPE, completeAnimation, false); + node.removeEventListener(element$visibility$$ANIMATION_EVENT_TYPE, completeAnimation, false); util$stylehooks$$default.set["animation-name"](style, ""); // remove temporary animation @@ -1941,7 +1602,7 @@ return true; }, - element$element$visibility$$makeVisibilityMethod = function(name, condition) {return function(animationName, callback) {var this$0 = this; + element$visibility$$makeMethod = function(name, condition) {return function(animationName, callback) {var this$0 = this; var node = this[0]; if (typeof animationName !== "string") { @@ -1979,7 +1640,7 @@ } } - if (element$element$visibility$$ANIMATIONS_ENABLED) { + if (element$visibility$$ANIMATIONS_ENABLED) { // Use offsetWidth to trigger reflow of the element // after changing from the hidden state // @@ -1992,9 +1653,9 @@ if (!hiding) displayValue = node.offsetWidth; if (animationName) { - animatable = element$element$visibility$$scheduleAnimation(node, style, computed, animationName, hiding, done); + animatable = element$visibility$$scheduleAnimation(node, style, computed, animationName, hiding, done); } else { - animatable = element$element$visibility$$scheduleTransition(node, style, computed, hiding, done); + animatable = element$visibility$$scheduleTransition(node, style, computed, hiding, done); } } // trigger native CSS animation @@ -2006,61 +1667,13 @@ }}; helpers$$default.assign(types$$$Element.prototype, { - /** - * Show an element using CSS3 transition or animation - * @memberof! $Element# - * @alias $Element#show - * @param {String} [animationName] CSS animation to apply during transition - * @param {Function} [callback] function that executes when animation is done - * @return {$Element} - * @function - */ - show: element$element$visibility$$makeVisibilityMethod("show", false), - - /** - * Hide an element using CSS3 transition or animation - * @memberof! $Element# - * @alias $Element#hide - * @param {String} [animationName] CSS animation to apply during transition - * @param {Function} [callback] function that executes when animation is done - * @return {$Element} - * @function - */ - hide: element$element$visibility$$makeVisibilityMethod("hide", true), - - /** - * Toggle an element using CSS3 transition or animation - * @memberof! $Element# - * @alias $Element#toggle - * @param {String} [animationName] CSS animation to apply during transition - * @param {Function} [callback] function that executes when animation is done - * @return {$Element} - * @function - */ - toggle: element$element$visibility$$makeVisibilityMethod("toggle") - }); + show: element$visibility$$makeMethod("show", false), - /** - * Callback function for watching changes of a property/attribute - * @callback watchCallback - * @param {Object} newValue a current value - * @param {Object} oldValue a previous value - */ + hide: element$visibility$$makeMethod("hide", true), + + toggle: element$visibility$$makeMethod("toggle") + }); - /** - * Watch for changes of a particular property/attribute - * @memberof! $Element# - * @alias $Element#watch - * @param {String} name property/attribute name - * @param {watchCallback} callback function for watching changes of the property/attribute - * @return {$Element} - * @example - * ```js - * targetInput.watch("value", function(value, oldValue) { - * // do what you want AFTER the value of targetInput was changed - * }); - * ``` - */ types$$$Element.prototype.watch = function(name, callback) { var watchers = this._._watchers; @@ -2071,14 +1684,6 @@ return this; }; - /** - * Disable watching of a particular property/attribute - * @memberof! $Element# - * @alias $Element#unwatch - * @param {String} name property/attribute name - * @param {watchCallback} callback function for watching changes of the property/attribute - * @return {$Element} - */ types$$$Element.prototype.unwatch = function(name, callback) { var watchers = this._._watchers; diff --git a/dist/better-dom.min.js b/dist/better-dom.min.js index 204f087b..e292dfb0 100644 --- a/dist/better-dom.min.js +++ b/dist/better-dom.min.js @@ -1,9 +1,9 @@ /** * @file better-dom.js - * @version 2.0.0-rc.2 2014-09-17T17:03:47 + * @version 2.0.0-rc.3 2014-09-19T20:24:49 * @overview Live extension playground * @copyright 2013-2014 Maksim Chemerisuk * @license MIT * @see https://github.com/chemerisuk/better-dom */ -(function(){function a(a){var b=arguments[1];void 0===b&&(b="$Element");var c="http://chemerisuk.github.io/better-dom/"+b+".html#"+a;this.message=b+"#"+a+" was called with illegal arguments. Check "+c+" to verify the method call"}function b(b){a.call(this,b,"DOM")}function c(a){return a&&a[n]?a[n]:this instanceof c?(a&&(a[n]=this,this[0]=a),void(this._={_handlers:[],_watchers:{}})):new c(a)}var d=Array.prototype.slice,e=window,f=e.document,g=f.documentElement,h=e.navigator.userAgent,i=e.CSSKeyframesRule||!f.attachEvent,j=~h.indexOf("Android")&&h.indexOf("Chrome")<0,k=!!f.addEventListener,l=e.WebKitAnimationEvent?"-webkit-":"",m="dataavailable";a.prototype=new TypeError,b.prototype=new TypeError;var n="__"+Math.random().toString().substr(2)+"__";c.prototype={constructor:function(a){return new c(a&&1===a.nodeType?a:null)},toString:function(){var a=this[0];return a?a.tagName.toLowerCase():""}};var o=new c(g);o.VERSION="2.0.0-rc.2";var p=e.DOM;o.noConflict=function(){return e.DOM===o&&(e.DOM=p),o},e.DOM=o;var q=Array.prototype,r=f.scripts[0],s={computeStyle:function(a){return e.getComputedStyle?e.getComputedStyle(a):a.currentStyle},injectElement:function(a){return r.parentNode.insertBefore(a,r)},every:q.every,each:q.forEach,filter:q.filter,map:q.map,isArray:Array.isArray,keys:Object.keys,assign:function(a,b){return Object.keys(b).forEach(function(c){a[c]=b[c]}),a}},t=/^(?:[a-z-]+|\s*(<.+>)\s*)$/i,u=f.createElement("body"),v=function(a){return function(d,e){var g,h,i=t.exec(d);if(d&&i&&!i[1])g=f.createElement(d),a&&(g=[new c(g)]);else{if(i&&i[1])d=e?o.format(i[1],e):i[1];else{if("string"!=typeof d)throw new b("create"+a);d=o.emmet(d,e)}for(u.innerHTML=d,g=a?[]:null;h=u.firstChild;)if(u.removeChild(h),1===h.nodeType){if(!a){g=h;break}g.push(new c(h))}}return a?g:new c(g)}};o.create=v(""),o.createAll=v("All");var w={"(":1,")":2,"^":3,">":4,"+":4,"*":5,"`":6,"]":5,"[":6,".":7,"#":8},x=/([\w\-]+)(?:=((?:`((?:\\?.)*)?`)|[^\s]+))?/g,y=/(\$+)(?:@(-)?(\d+)?)?/g,z="area base br col hr img input link meta param command keygen source".split(" ").reduce(function(a,b){return a[b]="<"+b+">",a},{}),A=function(a,b,c,d){var e=c&&c.indexOf('"')>=0?"'":'"';return b+"="+e+(d||c||b)+e},B=function(a,b){return function(c){var d=b?c.indexOf(">"):c.lastIndexOf("<");return c.substr(0,d)+a+c.substr(d)}},C=function(a){var b=z[a];return b||(b=z[a]="<"+a+">"),b},D=function(a,b){var c,d=[];for(c=0;a>c;++c)d.push(b.replace(y,function(b,d,e,f){var g=(e?a-c-1:c)+(f?+f:1);return(d+g).slice(-d.length).split("$").join("0")}));return d};o.emmet=function(a,c){var d,e;if("string"!=typeof a)throw new b("emmet");if(!a)return a;c&&(a=o.format(a,c));var f,g,h,i,j=[],k=[],l="";if(a in z)return z[a];for(d=0,e=a.length,i;e>d;)if(i=a[d++],"."===i&&"."===j[0]&&(i=" "),f=w[i],!f||g&&g!==i)l+=i;else{if("^"===i&&"^"===j[0]&&j.shift(),l?(k.push(l),l=""):i===g&&j.shift(),"("!==i)for(;w[j[0]]>f&&(k.push(j.shift()),"^"!==i||">"!==k[k.length-1]););")"===i?j.shift():g?g=!1:(j.unshift(i),"["===i&&(g="]"),"`"===i&&(g="`"))}if(d=e=void 0,l&&k.push(l),k=k.concat(j),1===k.length)return C(k[0]);for(j=[],d=0,e=k.length,i;e>d;){if(i=k[d++],i in w){switch(l=j.shift(),h=j.shift()||[""],"string"==typeof h&&(h=[C(h)]),i){case".":l=B(' class="'+l+'"',!0);break;case"#":l=B(' id="'+l+'"',!0);break;case"[":l=B(" "+l.replace(x,A),!0);break;case"`":j.unshift(h),h=[l];break;case"*":h=D(+l,h.join(""));break;default:l="string"==typeof l?C(l):l.join(""),">"===i?l=B(l):h.push(l)}i="function"==typeof l?h.map(l):h}j.unshift(i)}return d=e=void 0,k=j[0],"string"!=typeof k&&(k=k.join("")),c?k:z[a]=k};var E=/^(\w*)(?:#([\w\-]+))?(?:\[([\w\-\=]+)\])?(?:\.([\w\-]+))?$/,F="m oM msM mozM webkitM".split(" ").reduce(function(a,b){var c=b+"atchesSelector";return a||g[c]&&c},null),G=function(a,b){if("string"!=typeof a)return null;var c=E.exec(a);return c&&(c[1]&&(c[1]=c[1].toLowerCase()),c[3]&&(c[3]=c[3].split("=")),c[4]&&(c[4]=" "+c[4]+" ")),function(d){var e,f,g,h;for(c||F||(h=(b||document).querySelectorAll(a));d&&1===d.nodeType;d=d.parentNode){if(c)g=!(c[1]&&d.nodeName.toLowerCase()!==c[1]||c[2]&&d.id!==c[2]||c[3]&&(c[3][1]?d.getAttribute(c[3][0])!==c[3][1]:!d.hasAttribute(c[3][0]))||c[4]&&!((" "+d.className+" ").indexOf(c[4])>=0));else if(F)g=d[F](a);else{e=0,f=h.length;for(var i;f>e;)if(i=h[e++],i===d)return i;e=f=void 0}if(g||!b||d===b)break}return g&&d}},H={get:{},set:{}},I=/\-./g,J=/[A-Z]/g,K=["Top","Right","Bottom","Left"],L=s.computeStyle(g),M=L.length?Array.prototype.slice.call(L,0):s.keys(L).map(function(a){return a.replace(J,function(a){return"-"+a.toLowerCase()})}),N={font:["fontStyle","fontSize","/","lineHeight","fontFamily"],padding:K.map(function(a){return"padding"+a}),margin:K.map(function(a){return"margin"+a}),"border-width":K.map(function(a){return"border"+a+"Width"}),"border-style":K.map(function(a){return"border"+a+"Style"})};M.forEach(function(a){var b="-"===a[0]?a.substr(1,a.indexOf("-",1)-1):null,c=b?a.substr(b.length+2):a,d=a.replace(I,function(a){return a[1].toUpperCase()});d in L||(d=d[0].toLowerCase()+d.substr(1)),H.get[c]=function(a){return a[d]},H.set[c]=function(b,c){c="number"==typeof c?c+"px":c.toString(),b["cssText"in b?d:a]=c}})," float fill-opacity font-weight line-height opacity orphans widows z-index zoom ".split(" ").forEach(function(a){var b=a.replace(I,function(a){return a[1].toUpperCase()});"float"===a&&(b="cssFloat"in L?"cssFloat":"styleFloat",H.get[a]=function(a){return a[b]}),H.set[a]=function(c,d){c["cssText"in c?b:a]=d.toString()}}),s.keys(N).forEach(function(a){var b=N[a];H.get[a]=function(a){var c=[],d=function(b,d){return c.push("/"===b?b:a[b]),!c[d]};return b.some(d)?"":c.join(" ")},H.set[a]=function(c,d){d&&"cssText"in c?c.cssText+=";"+a+":"+d:b.forEach(function(a){return c[a]="number"==typeof d?d+"px":d.toString()})}});var O=H,P=s.injectElement(f.createElement("style")),Q=P.sheet||P.styleSheet,R=Q.cssRules||Q.rules;o.importStyles=function(a,c){if(c&&"object"==typeof c){var d=s.keys(c).reduce(function(a,b){var d=O.set[b];return d?d(a,c[b]):a[b]=c[b],a},{});c=s.keys(d).map(function(a){return a+":"+d[a]}).join(";")}if("string"!=typeof a||"string"!=typeof c)throw new b("importStyles");Q.cssRules?Q.insertRule(a+"{"+c+"}",R.length):a.split(",").forEach(function(a){Q.addRule(a,c)})};var S,T,U,V,W=o.importStyles,X=/^(on|do)[A-Z]/,Y=[],Z=function(){return!0},$=function(){return!1},_=function(a,b){s.keys(b).forEach(function(c){"constructor"!==c&&(a[c]=b[c])})},ab=function(a,b){return function(c){var d;c=c||e.event,d=i?c.animationName===T&&c.target===a:c.srcUrn===m&&c.srcElement===a,d&&((c._skip=c._skip||{})[b]=!0)}},bb=function(a,b){return function(c,d){!b[d]&&c.accept(a)&&c(a)}},cb=function(a){s.each.call(f.querySelectorAll(a.selector),a),W(a.selector,V)},db=f.readyState,eb=function(){eb&&(Y.forEach(cb),eb=!1)};if((f.attachEvent?"complete"===db:"loading"!==db)?setTimeout(eb,0):k?(e.addEventListener("load",eb,!1),f.addEventListener("DOMContentLoaded",eb,!1)):(e.attachEvent("onload",eb),f.attachEvent("on"+m,function(){"DOMContentLoaded"===e.event.srcUrn&&eb&&eb()})),i)S=l?"webkitAnimationStart":"animationstart",T="DOM"+Date.now(),W("@"+l+"keyframes "+T,"from {opacity:.99} to {opacity:1}"),V={"animation-duration":"1ms !important","animation-name":T+" !important"},f.addEventListener(S,function(a){a.animationName===T&&Y.forEach(bb(a.target,a._skip||{}))},!1);else{if(S="on"+m,U=f.querySelector("link[rel=htc]"),!U)throw new Error("In order to use live extensions in IE < 10 you have to include extra files. See https://github.com/chemerisuk/better-dom#notes-about-old-ies");V={behavior:"url("+U.href+") !important"},W("html",V),f.attachEvent(S,function(){var a=e.event;a.srcUrn===m&&Y.forEach(bb(a.srcElement,a._skip||{}))})}o.extend=function(a,d,f){if(2===arguments.length&&(f=d,d=!0),"boolean"==typeof d&&(d=d?Z:$),"function"==typeof f&&(f={constructor:f}),!f||"object"!=typeof f||"function"!=typeof d)throw new b("extend");if("*"===a)_(c.prototype,f);else{var g=s.keys(f).filter(function(a){return!!X.exec(a)}),h=Y.length,j=f.hasOwnProperty("constructor")&&function(a){try{f.constructor.call(a)}catch(b){"console"in e&&e.console.error(b)}},k=function(a,b){var e=c(a);i?a.addEventListener(S,ab(a,h),!1):a.attachEvent(S,ab(a,h)),(b===!0||d(e)!==!1)&&(_(e,f),j&&j(e),b!==!0&&g.forEach(function(a){delete e[a]}))};k.accept=G(a),k.selector=a,Y.push(k),eb||cb(k)}};var fb=Y,gb=/\{([\w\-]+)\}/g;o.format=function(a,c){if("string"!=typeof a||c&&"object"!=typeof c)throw new b("format");return a.replace(gb,function(a,b){return b in c?String(c[b]):a})},o.importScripts=function(){var a=d.call(arguments,0),c=function(){var d,e=a.shift(),g=typeof e;if("string"===g)d=f.createElement("script"),d.src=e,d.onload=c,d.async=!0,s.injectElement(d);else if("function"===g)e();else if(e)throw new b("importScripts")};c()};var hb=function(a){fb.forEach(function(b){b.accept(a)&&b(a,!0)}),s.each.call(a.children,hb)},ib=function(a){return function(b,d){if(!b)return new c;var e=o["create"+a](b,d);return a?e.forEach(function(a){hb(a[0])}):hb(e[0]),e}};o.mock=ib(""),o.mockAll=ib("All");var jb=function(b){return function(d){if(b){if(d&&"string"!=typeof d)throw new a("children")}else if(d&&"number"!=typeof d)throw new a("child");var e=this[0],f=G(d),g=e?e.children:null;return e?(k||(g=s.filter.call(g,function(a){return 1===a.nodeType})),b?(f&&(g=s.filter.call(g,f)),s.map.call(g,c)):(0>d&&(d=g.length+d),c(g[d]))):b?[]:new c}};s.assign(c.prototype,{child:jb(!1),children:jb(!0)});var kb=/[\n\t\r]/g,lb=function(b,c){var d="contains"===b?"hasClass":b+"Class";return g.classList||(b=null),"hasClass"===d||"toggleClass"===d?function(e,f){var g=this[0];if(g){if("boolean"==typeof f&&"toggleClass"===d)return this[f?"addClass":"removeClass"](e),f;if("string"!=typeof e)throw new a(d);return b?g.classList[b](e):c(this,g,e)}}:function(){var e,f,g=this[0],h=arguments;if(g){e=0,f=h.length;for(var i;f>e;){if(i=h[e++],"string"!=typeof i)throw new a(d);b?g.classList[b](i):c(this,g,i)}e=f=void 0}return this}};s.assign(c.prototype,{hasClass:lb("contains",function(a,b,c){return(" "+b.className+" ").replace(kb," ").indexOf(" "+c+" ")>=0}),addClass:lb("add",function(a,b,c){a.hasClass(c)||(b.className+=" "+c)}),removeClass:lb("remove",function(a,b,c){c=(" "+b.className+" ").replace(kb," ").replace(" "+c+" "," "),b.className=c.trim()}),toggleClass:lb("toggle",function(a,b,c){var d=b.className;return a.addClass(c),d!==b.className?!0:(a.removeClass(c),!1)})}),c.prototype.clone=function(){var b=arguments[0];if(void 0===b&&(b=!0),"boolean"!=typeof b)throw new a("clone");var d,e=this[0];return e?k?d=new c(e.cloneNode(b)):(d=o.create(e.outerHTML),b||d.set("innerHTML","")):d=new c,d},c.prototype.contains=function(b){var d=this[0];if(!d)return!1;if(b instanceof c){var e=b[0];return e===d?!0:d.contains?d.contains(e):16&d.compareDocumentPosition(e)}throw new a("contains")},c.prototype.css=function(b,c){var d,e,f,g,h=this,i=arguments.length,j=this[0],k=typeof b;if(1===i&&("string"===k||s.isArray(b)))return j&&(d=j.style,c=("string"===k?[b]:b).reduce(function(a,b){return e=O.get[b],c=e?e(d):d[b],f||c||(d=s.computeStyle(j),c=e?e(d):d[b],f=!0),a[b]=c,a},{})),j&&"string"===k?c[b]:c;if(j)if(d=j.style,g=function(a,b){var c=O.set[a];"function"==typeof b&&(b=b.call(h,h.css(a))),null==b&&(b=""),c?c(d,b):d[a]="number"==typeof b?b+"px":b.toString()},1===i&&b&&"object"===k)s.keys(b).forEach(function(a){g(a,b[a])});else{if(2!==i||"string"!==k)throw new a("css");g(b,c)}return this};var mb=f.getElementsByClassName?/^(?:(\w+)|\.([\w\-]+))$/:/^(?:(\w+))$/,nb=/'|\\/g,ob="DOM"+Date.now(),pb=function(b){return function(d){if("string"!=typeof d)throw new a("find"+b);var e,f,g,h,i=this[0],j=mb.exec(d);if(!i)return b?[]:new c;if(j)e=j[1]?i.getElementsByTagName(d):i.getElementsByClassName(j[2]),e&&!b&&(e=e[0]);else{f=!0,g=ob,h=i,this!==o&&((f=i.getAttribute("id"))?g=f.replace(nb,"\\$&"):i.setAttribute("id",g),g="[id='"+g+"'] ",d=g+d.split(",").join(","+g));try{e=h["querySelector"+b](d)}finally{f||i.removeAttribute("id")}}return b?s.map.call(e,c):c(e)}};s.assign(c.prototype,{find:pb(""),findAll:pb("All")});var qb={};"onfocusin"in g?(qb.focus=function(a){a._type="focusin"},qb.blur=function(a){a._type="focusout"}):qb.focus=qb.blur=function(a){a.capturing=!0},f.createElement("input").validity&&(qb.invalid=function(a){a.capturing=!0}),k||["submit","change","reset"].forEach(function(a){qb[a]=function(a){a._type=m}});var rb=qb,sb=function(a,b,d,h,i,j){if(!i[0])return null;var l=i[0],n=rb[a],o=G(b,l),p=function(b){if(b=b||e.event,sb.skip!==a&&(p._type!==m||b.srcUrn===a)){var n=b.target||b.srcElement||f,q=o?o(n):l,r=b._args||[],s=h||[],t=d;"function"==typeof t&&q&&(j&&i.off(a,d),s=s.map(function(d){if("number"==typeof d)return r[d-1];if(!k)switch(d){case"which":return b.keyCode;case"button":var e=b.button;return 1&e?1:2&e?3:4&e?2:0;case"pageX":return b.pageX||b.clientX+g.scrollLeft-g.clientLeft;case"pageY":return b.clientY+g.scrollTop-g.clientTop}switch(d){case"type":return a;case"defaultPrevented":return"defaultPrevented"in b?b.defaultPrevented:b.returnValue===!1;case"target":return c(n);case"currentTarget":return c(q);case"relatedTarget":return c(b.relatedTarget||b[(b.toElement===l?"from":"to")+"Element"])}return b[d]}),t.apply(i,h?s:r.concat(s))===!1&&(k?b.preventDefault():b.returnValue=!1))}};return n&&(p=n(p,a)||p),k||"on"+(p._type||a)in l||(p._type=m),p.type=b?a+" "+b:a,p.callback=d,p},tb=sb;c.prototype.fire=function(b){var c,e,g,h=d.call(arguments,1),i=this[0],j=typeof b,l={};if(!i)return!1;if("string"!==j)throw new a("fire");return(c=rb[b])&&(l=c(l)||l),j=l._type||b,k?(e=f.createEvent("HTMLEvents"),e.initEvent(j,!0,!0),e._args=h,g=i.dispatchEvent(e)):(e=f.createEventObject(),e._args=h,"on"+j in i||(j=m),j===m&&(e.srcUrn=b),i.fireEvent("on"+j,e),g=e.returnValue!==!1),g&&i[b]&&("focus"!==b&&"blur"!==b||i.offsetWidth)&&(tb.skip=b,i[b](),tb.skip=null),g};var ub={get:{},set:{}};"tabIndex readOnly maxLength cellSpacing cellPadding rowSpan colSpan useMap frameBorder contentEditable".split(" ").forEach(function(a){ub.get[a.toLowerCase()]=function(b){return b[a]}}),ub.get.style=function(a){return a.style.cssText},ub.set.style=function(a,b){a.style.cssText=b},ub.get.title=function(a){return a===g?f.title:a.title},ub.set.title=function(a,b){(a===g?f:a).title=b},ub.get.undefined=function(a){var b;switch(a.tagName){case"SELECT":return~a.selectedIndex?a.options[a.selectedIndex].value:"";case"OPTION":b=a.hasAttribute("value")?"value":"text";break;default:b=a.type&&"value"in a?"value":"innerHTML"}return a[b]},ub.set.value=function(a,b){"SELECT"===a.tagName?s.every.call(a.options,function(a){return!(a.selected=a.value===b)})&&(a.selectedIndex=-1):a[k||"textarea"!==a.type?"value":"innerText"]=b},ub.get.type=function(a){return a.getAttribute("type")||a.type},k||(ub.get.textContent=function(a){return a.innerText},ub.set.textContent=function(a,b){a.innerText=b});var vb=ub;c.prototype.get=function(b){var c,d,e=this,f=this._,g=this[0],h=vb.get[b],i=typeof b;if(g){if(h)return h(g,b);if("string"===i){if("_"===b[0]){if(c=b.substr(1),c in f)d=f[c];else if(c=c.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()}),d=g.getAttribute("data-"+c),null!=d){if("{"===d[0]&&"}"===d[d.length-1])try{d=JSON.parse(d)}catch(j){}f[c]=d}return d}return b in g?g[b]:g.getAttribute(b)}if(s.isArray(b))return b.reduce(function(a,b){return a[b]=e.get(b),a},{});throw new a("get")}};var wb=function(b,d,e,g){return function(){var h=arguments[0];void 0===h&&(h="");var i=this[0];if(!(e||i.parentNode&&h!==o))return this;if("function"==typeof h&&(h=h.call(this)),"string"==typeof h)h&&(h=d?h.trim():o.create(h)[0]);else if(h instanceof c)h=h[0];else{if(!s.isArray(h))throw new a(b);h=h.reduce(function(a,b){return a.appendChild(b[0]),a},f.createDocumentFragment())}return h&&"string"==typeof h?i.insertAdjacentHTML(d,h):(h||!d)&&g(i,h),this}};s.assign(c.prototype,{after:wb("after","afterend",!1,function(a,b){a.parentNode.insertBefore(b,a.nextSibling)}),before:wb("before","beforebegin",!1,function(a,b){a.parentNode.insertBefore(b,a)}),prepend:wb("prepend","afterbegin",!0,function(a,b){a.insertBefore(b,a.firstChild)}),append:wb("append","beforeend",!0,function(a,b){a.appendChild(b)}),replace:wb("replace","",!1,function(a,b){a.parentNode.replaceChild(b,a)}),remove:wb("remove","",!1,function(a){a.parentNode.removeChild(a)})});var xb={};xb[":focus"]=function(a){return a===f.activeElement},xb[":hidden"]=function(a){return!xb[":visible"](a)},xb[":visible"]=function(a){return"none"!==s.computeStyle(a).display&&g.contains(a)};var yb=xb;c.prototype.matches=function(b){if(!b||"string"!=typeof b)throw new a("matches");var c=yb[b]||G(b),d=this[0];return d&&!!c(d,this)},c.prototype.off=function(b,c){if("string"!=typeof b)throw new a("off");var d=this[0];return d&&(this._._handlers=this._._handlers.filter(function(a){return b!==a.type||c&&c!==a.callback?!0:(b=a._type||a.type,void(k?d.removeEventListener(b,a,!!a.capturing):d.detachEvent("on"+b,a)))})),this},c.prototype.offset=function(){var a,b=this[0],c=g.clientTop,d=g.clientLeft,f=e.pageYOffset||g.scrollTop,h=e.pageXOffset||g.scrollLeft;return b?(a=b.getBoundingClientRect(),{top:a.top+f-c,left:a.left+h-d,right:a.right+h-d,bottom:a.bottom+f-c,width:a.right-a.left,height:a.bottom-a.top}):void 0};var zb=function(b){return function(c,d,e,f){var g=this;if("string"==typeof c){"function"==typeof e&&(f=e,"string"==typeof d?e=null:(e=d,d=null)),"function"==typeof d&&(f=d,d=null,e=null);var h=this[0],i=tb(c,d,f,e,this,b);i&&(k?h.addEventListener(i._type||c,i,!!i.capturing):h.attachEvent("on"+(i._type||c),i),this._._handlers.push(i))}else{if("object"!=typeof c)throw new a(b?"once":"on");s.isArray(c)?c.forEach(function(a){g.on(a,d,f,e,b)}):s.keys(c).forEach(function(a){g.on(a,c[a])})}return this}};s.assign(c.prototype,{on:zb(!1),once:zb(!0)}),c.prototype.set=function(b,c){var d=this,e=this[0];if(!e)return this;1===arguments.length&&"object"!=typeof b&&(c=null==b?"":String(b),b="value"in e?"value":"innerHTML");var f,g=vb.set[b],h=this._._watchers[b];if((h||"function"==typeof c)&&(f=this.get(b)),g)g(e,c);else if("string"==typeof b)"_"===b[0]?this._[b.substr(1)]=c:("function"==typeof c&&(c=c.call(this,f)),null==c?e.removeAttribute(b):b in e?e[b]=c:e.setAttribute(b,c),(!k||j)&&(e.className=e.className));else if(s.isArray(b))b.forEach(function(a){d.set(a,c)});else{if("object"!=typeof b)throw new a("set");s.keys(b).forEach(function(a){d.set(a,b[a])})}return h&&f!==c&&h.forEach(function(a){setTimeout(function(){a.call(d,c,f)},0)}),this};var Ab=function(b,d,e){return function(f){if(f&&"string"!=typeof f)throw new a(b);var g=G(f),h=e?[]:null,i=this[0];for(i=i&&i[d];i;i=i[d])if(1===i.nodeType&&(!g||g(i))){if(!e)break;h.push(i)}return e?s.map.call(h,c):c(i)}};s.assign(c.prototype,{next:Ab("next","nextSibling"),prev:Ab("prev","previousSibling"),nextAll:Ab("nextAll","nextSibling",!0),prevAll:Ab("prevAll","previousSibling",!0),parent:Ab("parent","parentNode")});var Bb=!j&&i,Cb=["timing-function","property","duration","delay"].map(function(a){return"transition-"+a}),Db=l?"webkitTransitionEnd":"transitionend",Eb=l?"webkitAnimationEnd":"animationend",Fb=function(a){var b=parseFloat(a)||0;return a.lastIndexOf("ms")===a.length-2?b:1e3*b},Gb=function(a){var b=O.get["transition-delay"](a).split(","),c=O.get["transition-duration"](a).split(",");return Math.max.apply(Math,c.map(function(a,c){return Fb(a)+(Fb(b[c])||0)}))},Hb=function(a,b,c,d,e){var f=Gb(c);if(!f)return!1;var g,h;return h=Cb.map(function(a,b){return O.get[a](c).split(b?", ":/, (?!\d)/)}),g=h[1].indexOf("visibility"),0>g&&(g=h[2].indexOf("0s")),0>g&&(g=h[0].length),h[0][g]="linear",h[1][g]="visibility",h[d?2:3][g]="0s",h[d?3:2][g]=f+"ms",h.forEach(function(a,c){O.set[Cb[c]](b,a.join(", "))}),a.addEventListener(Db,function i(c){"visibility"===c.propertyName&&c.target===a&&(c.stopPropagation(),a.removeEventListener(Db,i,!1),b.willChange="",e())},!1),b.visibility=d?"visible":"hidden",b.willChange=h[1].join(", "),b.visibility=d?"hidden":"visible",!0},Ib=function(a,b,c,d,e,f){var g=Fb(O.get["animation-duration"](c));return g?(a.addEventListener(Eb,function h(c){c.animationName===d&&c.target===a&&(c.stopPropagation(),a.removeEventListener(Eb,h,!1),O.set["animation-name"](b,""),f())},!1),O.set["animation-direction"](b,e?"normal":"reverse"),O.set["animation-name"](b,d),!0):!1},Jb=function(b,c){return function(d,e){var f=this,g=this[0];if("string"!=typeof d&&(e=d,d=null),e&&"function"!=typeof e)throw new a(b);if(!g)return this;var h,i=g.style,j=s.computeStyle(g),k=j.display,l="boolean"==typeof c?c:"none"!==k,m=function(){l&&(i.display="none"),e&&e.call(f)};return l?"none"!==k&&(this._._display=k):"none"===k&&(i.display=this._._display||"inherit"),Bb&&(l||(k=g.offsetWidth),h=d?Ib(g,i,j,d,l,m):Hb(g,i,j,l,m)),this.set("aria-hidden",String(l)),h||m(),this}};s.assign(c.prototype,{show:Jb("show",!1),hide:Jb("hide",!0),toggle:Jb("toggle")}),c.prototype.watch=function(a,b){var c=this._._watchers;return c[a]||(c[a]=[]),c[a].push(b),this},c.prototype.unwatch=function(a,b){var c=this._._watchers;return c[a]&&(c[a]=c[a].filter(function(a){return a!==b})),this}}).call(this); \ No newline at end of file +(function(){"use strict";function a(a){var b=arguments[1];void 0===b&&(b="$Element");var c="http://chemerisuk.github.io/better-dom/"+b+".html#"+a;this.message=b+"#"+a+" was called with illegal arguments. Check "+c+" to verify the method call"}function b(b){a.call(this,b,"DOM")}function c(a){return a&&a[n]?a[n]:this instanceof c?(a&&(a[n]=this,this[0]=a),void(this._={_handlers:[],_watchers:{}})):new c(a)}var d=Array.prototype.slice,e=window,f=e.document,g=f.documentElement,h=e.navigator.userAgent,i=f.attachEvent&&!e.CSSKeyframesRule,j=~h.indexOf("Android")&&h.indexOf("Chrome")<0,k=!!f.addEventListener,l=e.WebKitAnimationEvent?"-webkit-":"",m="dataavailable";a.prototype=new TypeError,b.prototype=new TypeError;var n="__"+Math.random().toString(32).substr(2)+"__";c.prototype={constructor:function(a){return new c(a&&1===a.nodeType?a:null)},toString:function(){var a=this[0];return a?a.tagName.toLowerCase():""}};var o=new c(g);o.VERSION="2.0.0-rc.3";var p=e.DOM;o.noConflict=function(){return e.DOM===o&&(e.DOM=p),o},e.DOM=o;var q=Array.prototype,r=f.scripts[0],s={computeStyle:function(a){return e.getComputedStyle?e.getComputedStyle(a):a.currentStyle},injectElement:function(a){return r.parentNode.insertBefore(a,r)},every:q.every,each:q.forEach,filter:q.filter,map:q.map,isArray:Array.isArray,keys:Object.keys,assign:function(a,b){return Object.keys(b).forEach(function(c){a[c]=b[c]}),a}},t=/^(?:[a-z-]+|\s*(<.+>)\s*)$/i,u=f.createElement("body"),v=function(a){return function(d,e){var g,h,i=t.exec(d);if(d&&i&&!i[1])g=f.createElement(d),a&&(g=[new c(g)]);else{if(i&&i[1])d=e?o.format(i[1],e):i[1];else{if("string"!=typeof d)throw new b("create"+a);d=o.emmet(d,e)}for(u.innerHTML=d,g=a?[]:null;h=u.firstChild;)if(u.removeChild(h),1===h.nodeType){if(!a){g=h;break}g.push(new c(h))}}return a?g:new c(g)}};o.create=v(""),o.createAll=v("All");var w={"(":1,")":2,"^":3,">":4,"+":4,"*":5,"`":6,"]":5,"[":6,".":7,"#":8},x=/([\w\-]+)(?:=((?:`((?:\\?.)*)?`)|[^\s]+))?/g,y=/(\$+)(?:@(-)?(\d+)?)?/g,z="area base br col hr img input link meta param command keygen source".split(" ").reduce(function(a,b){return a[b]="<"+b+">",a},{}),A=function(a,b,c,d){var e=c&&c.indexOf('"')>=0?"'":'"';return b+"="+e+(d||c||b)+e},B=function(a,b){return function(c){var d=b?c.indexOf(">"):c.lastIndexOf("<");return c.substr(0,d)+a+c.substr(d)}},C=function(a){var b=z[a];return b||(b=z[a]="<"+a+">"),b},D=function(a,b){var c,d=[];for(c=0;a>c;++c)d.push(b.replace(y,function(b,d,e,f){var g=(e?a-c-1:c)+(f?+f:1);return(d+g).slice(-d.length).split("$").join("0")}));return d};o.emmet=function(a,c){var d,e;if("string"!=typeof a)throw new b("emmet");if(!a)return a;c&&(a=o.format(a,c));var f,g,h,i,j=[],k=[],l="";if(a in z)return z[a];for(d=0,e=a.length,i;e>d;)if(i=a[d++],"."===i&&"."===j[0]&&(i=" "),f=w[i],!f||g&&g!==i)l+=i;else{if("^"===i&&"^"===j[0]&&j.shift(),l?(k.push(l),l=""):i===g&&j.shift(),"("!==i)for(;w[j[0]]>f&&(k.push(j.shift()),"^"!==i||">"!==k[k.length-1]););")"===i?j.shift():g?g=!1:(j.unshift(i),"["===i&&(g="]"),"`"===i&&(g="`"))}if(d=e=void 0,l&&k.push(l),k=k.concat(j),1===k.length)return C(k[0]);for(j=[],d=0,e=k.length,i;e>d;){if(i=k[d++],i in w){switch(l=j.shift(),h=j.shift()||[""],"string"==typeof h&&(h=[C(h)]),i){case".":l=B(' class="'+l+'"',!0);break;case"#":l=B(' id="'+l+'"',!0);break;case"[":l=B(" "+l.replace(x,A),!0);break;case"`":j.unshift(h),h=[l];break;case"*":h=D(+l,h.join(""));break;default:l="string"==typeof l?C(l):l.join(""),">"===i?l=B(l):h.push(l)}i="function"==typeof l?h.map(l):h}j.unshift(i)}return d=e=void 0,k=j[0],"string"!=typeof k&&(k=k.join("")),c?k:z[a]=k};var E={get:{},set:{}},F=/\-./g,G=/[A-Z]/g,H=["Top","Right","Bottom","Left"],I=s.computeStyle(g),J=I.length?Array.prototype.slice.call(I,0):s.keys(I).map(function(a){return a.replace(G,function(a){return"-"+a.toLowerCase()})}),K={font:["fontStyle","fontSize","/","lineHeight","fontFamily"],padding:H.map(function(a){return"padding"+a}),margin:H.map(function(a){return"margin"+a}),"border-width":H.map(function(a){return"border"+a+"Width"}),"border-style":H.map(function(a){return"border"+a+"Style"})};J.forEach(function(a){var b="-"===a[0]?a.substr(1,a.indexOf("-",1)-1):null,c=b?a.substr(b.length+2):a,d=a.replace(F,function(a){return a[1].toUpperCase()});d in I||(d=d[0].toLowerCase()+d.substr(1)),E.get[c]=function(a){return a[d]},E.set[c]=function(b,c){c="number"==typeof c?c+"px":c.toString(),b["cssText"in b?d:a]=c}})," float fill-opacity font-weight line-height opacity orphans widows z-index zoom ".split(" ").forEach(function(a){var b=a.replace(F,function(a){return a[1].toUpperCase()});"float"===a&&(b="cssFloat"in I?"cssFloat":"styleFloat",E.get[a]=function(a){return a[b]}),E.set[a]=function(c,d){c["cssText"in c?b:a]=d.toString()}}),s.keys(K).forEach(function(a){var b=K[a];E.get[a]=function(a){var c=[],d=function(b,d){return c.push("/"===b?b:a[b]),!c[d]};return b.some(d)?"":c.join(" ")},E.set[a]=function(c,d){d&&"cssText"in c?c.cssText+=";"+a+":"+d:b.forEach(function(a){return c[a]="number"==typeof d?d+"px":d.toString()})}});var L=E,M=s.injectElement(f.createElement("style")),N=M.sheet||M.styleSheet,O=N.cssRules||N.rules;o.importStyles=function(a,c){if(c&&"object"==typeof c){var d=s.keys(c).reduce(function(a,b){var d=L.set[b];return d?d(a,c[b]):a[b]=c[b],a},{});c=s.keys(d).map(function(a){return a+":"+d[a]}).join(";")}if("string"!=typeof a||"string"!=typeof c)throw new b("importStyles");N.cssRules?N.insertRule(a+"{"+c+"}",O.length):a.split(",").forEach(function(a){N.addRule(a,c)})};var P=o.importStyles,Q=/^(\w*)(?:#([\w\-]+))?(?:\[([\w\-\=]+)\])?(?:\.([\w\-]+))?$/,R="m oM msM mozM webkitM".split(" ").reduce(function(a,b){var c=b+"atchesSelector";return a||g[c]&&c},null),S=function(a,b){if("string"!=typeof a)return null;var c=Q.exec(a);return c&&(c[1]&&(c[1]=c[1].toLowerCase()),c[3]&&(c[3]=c[3].split("=")),c[4]&&(c[4]=" "+c[4]+" ")),function(d){var e,f,g,h;for(c||R||(h=(b||document).querySelectorAll(a));d&&1===d.nodeType;d=d.parentNode){if(c)g=!(c[1]&&d.nodeName.toLowerCase()!==c[1]||c[2]&&d.id!==c[2]||c[3]&&(c[3][1]?d.getAttribute(c[3][0])!==c[3][1]:!d.hasAttribute(c[3][0]))||c[4]&&!((" "+d.className+" ").indexOf(c[4])>=0));else if(R)g=d[R](a);else{e=0,f=h.length;for(var i;f>e;)if(i=h[e++],i===d)return i;e=f=void 0}if(g||!b||d===b)break}return g&&d}},T=/^(on|do)[A-Z]/,U="DOM"+Date.now(),V=function(a,b){return function(c){var d;c=c||e.event,d=i?c.srcUrn===m&&c.srcElement===a:c.animationName===U&&c.target===a,d&&((c._skip=c._skip||{})[b]=!0)}},W=function(a,b,d,f){var g=s.keys(d).filter(function(a){return!!T.exec(a)}),h=d.hasOwnProperty("constructor")&&function(a){try{d.constructor.call(a)}catch(b){"console"in e&&e.console.error(b)}},j=function(a,e){var j=c(a);i?a.attachEvent("on"+W.EVENT_TYPE,V(a,f)):a.addEventListener(W.EVENT_TYPE,V(a,f),!1),(e===!0||b(j)!==!1)&&(s.assign(j,d),h&&h(j),e!==!0&&g.forEach(function(a){delete j[a]}))};return j.accept=S(a),j};i?W.EVENT_TYPE=m:(W.ANIMATION_ID=U,W.EVENT_TYPE=l?"webkitAnimationEnd":"animationend"),W.traverse=function(a,b){return function(c,d){!b[d]&&c.accept(a)&&c(a)}};var X,Y,Z=W,$=[],_=function(){return!0},ab=function(){return!1};if(i){var bb=f.querySelector("link[rel=htc]");if(bb)bb=bb.href;else{"console"in e&&e.console.log("WARNING: In order to use live extensions in IE < 10 you have to include extra files. See https://github.com/chemerisuk/better-dom#notes-about-old-ies for details.");var cb=f.scripts;bb=cb[cb.length-1].src.split("/"),bb="/"+bb.slice(3,bb.length-1).concat("better-dom.htc").join("/")}Y={behavior:"url("+bb+") !important"},P("html",Y),f.attachEvent("on"+Z.EVENT_TYPE,function(){var a=e.event;a.srcUrn===m&&$.forEach(Z.traverse(a.srcElement,a._skip||{}))})}else{var db=f.readyState;(f.attachEvent?"complete"!==db:"loading"===db)&&(X=function(){$.forEach(function(a){a.start()}),X=null},f.addEventListener("DOMContentLoaded",X,!1),e.addEventListener("load",X,!1)),P("@"+l+"keyframes "+Z.ANIMATION_ID,"from {opacity:.99} to {opacity:1}"),Y={"animation-duration":"1ms !important","animation-name":Z.ANIMATION_ID+" !important"},f.addEventListener(Z.EVENT_TYPE,function(a){a.animationName===Z.ANIMATION_ID&&$.forEach(Z.traverse(a.target,a._skip||{}))},!1)}o.extend=function(a,d,e){if(2===arguments.length&&(e=d,d=!0),"boolean"==typeof d&&(d=d?_:ab),"function"==typeof e&&(e={constructor:e}),!e||"object"!=typeof e||"function"!=typeof d)throw new b("extend");if("*"===a)s.assign(c.prototype,e);else{var g=Z(a,d,e,$.length);g.start=function(){s.each.call(f.querySelectorAll(a),g),o.importStyles(a,Y)},$.push(g),X||g.start()}};var eb=$,fb=/\{([\w\-]+)\}/g;o.format=function(a,c){if("string"!=typeof a||c&&"object"!=typeof c)throw new b("format");return a.replace(fb,function(a,b){return b in c?String(c[b]):a})},o.importScripts=function(){var a=d.call(arguments,0),c=function(){var d,e=a.shift(),g=typeof e;if("string"===g)d=f.createElement("script"),d.src=e,d.onload=c,d.async=!0,s.injectElement(d);else if("function"===g)e();else if(e)throw new b("importScripts")};c()};var gb=function(a){eb.forEach(function(b){b.accept(a)&&b(a,!0)}),s.each.call(a.children,gb)},hb=function(a){return function(b,d){if(!b)return new c;var e=o["create"+a](b,d);return a?e.forEach(function(a){gb(a[0])}):gb(e[0]),e}};o.mock=hb(""),o.mockAll=hb("All");var ib=function(b){return function(d){if(b){if(d&&"string"!=typeof d)throw new a("children")}else if(d&&"number"!=typeof d)throw new a("child");var e=this[0],f=S(d),g=e?e.children:null;return e?(k||(g=s.filter.call(g,function(a){return 1===a.nodeType})),b?(f&&(g=s.filter.call(g,f)),s.map.call(g,c)):(0>d&&(d=g.length+d),c(g[d]))):b?[]:new c}};s.assign(c.prototype,{child:ib(!1),children:ib(!0)});var jb=/[\n\t\r]/g,kb=function(b,c){var d="contains"===b?"hasClass":b+"Class";return g.classList&&(c=function(a,c){return a[0].classList[b](c)}),"hasClass"===d||"toggleClass"===d?function(b,e){if(this[0]){if("boolean"==typeof e&&"toggleClass"===d)return this[e?"addClass":"removeClass"](b),e;if("string"!=typeof b)throw new a(d);return c(this,b)}}:function(){var b,e,f=arguments;if(this[0]){b=0,e=f.length;for(var g;e>b;){if(g=f[b++],"string"!=typeof g)throw new a(d);c(this,g)}b=e=void 0}return this}};s.assign(c.prototype,{hasClass:kb("contains",function(a,b){return(" "+a[0].className+" ").replace(jb," ").indexOf(" "+b+" ")>=0}),addClass:kb("add",function(a,b){a.hasClass(b)||(a[0].className+=" "+b)}),removeClass:kb("remove",function(a,b){a[0].className=(" "+a[0].className+" ").replace(jb," ").replace(" "+b+" "," ").trim()}),toggleClass:kb("toggle",function(a,b){var c=a.hasClass(b);return c?a.removeClass(b):a[0].className+=" "+b,!c})}),c.prototype.clone=function(){var b=arguments[0];if(void 0===b&&(b=!0),"boolean"!=typeof b)throw new a("clone");var d,e=this[0];return e?k?d=new c(e.cloneNode(b)):(d=o.create(e.outerHTML),b||d.set("innerHTML","")):d=new c,d},c.prototype.contains=function(b){var d=this[0];if(!d)return!1;if(b instanceof c){var e=b[0];return e===d?!0:d.contains?d.contains(e):16&d.compareDocumentPosition(e)}throw new a("contains")},c.prototype.css=function(b,c){var d,e,f,g,h=this,i=arguments.length,j=this[0],k=typeof b;if(1===i&&("string"===k||s.isArray(b)))return j&&(d=j.style,c=("string"===k?[b]:b).reduce(function(a,b){return e=L.get[b],c=e?e(d):d[b],f||c||(d=s.computeStyle(j),c=e?e(d):d[b],f=!0),a[b]=c,a},{})),j&&"string"===k?c[b]:c;if(j)if(d=j.style,g=function(a,b){var c=L.set[a];"function"==typeof b&&(b=b.call(h,h.css(a))),null==b&&(b=""),c?c(d,b):d[a]="number"==typeof b?b+"px":b.toString()},1===i&&b&&"object"===k)s.keys(b).forEach(function(a){g(a,b[a])});else{if(2!==i||"string"!==k)throw new a("css");g(b,c)}return this},c.prototype.empty=function(){var a,b=this[0];if(b)for(;a=b.firstChild;)b.removeChild(a);return this};var lb=f.getElementsByClassName?/^(?:(\w+)|\.([\w\-]+))$/:/^(?:(\w+))$/,mb=/'|\\/g,nb="DOM"+Date.now(),ob=function(b){return function(d){if("string"!=typeof d)throw new a("find"+b);var e,f,g,h,i=this[0],j=lb.exec(d);if(!i)return b?[]:new c;if(j)e=j[1]?i.getElementsByTagName(d):i.getElementsByClassName(j[2]),e&&!b&&(e=e[0]);else{f=!0,g=nb,h=i,this!==o&&((f=i.getAttribute("id"))?g=f.replace(mb,"\\$&"):i.setAttribute("id",g),g="[id='"+g+"'] ",d=g+d.split(",").join(","+g));try{e=h["querySelector"+b](d)}finally{f||i.removeAttribute("id")}}return b?s.map.call(e,c):c(e)}};s.assign(c.prototype,{find:ob(""),findAll:ob("All")});var pb={};"onfocusin"in g?(pb.focus=function(a){a._type="focusin"},pb.blur=function(a){a._type="focusout"}):pb.focus=pb.blur=function(a){a.capturing=!0},f.createElement("input").validity&&(pb.invalid=function(a){a.capturing=!0}),k||["submit","change","reset"].forEach(function(a){pb[a]=function(a){a._type=m}});var qb=pb,rb=function(a,b,d,h,i,j){if(!i[0])return null;var l=i[0],n=qb[a],o=S(b,l),p=function(b){if(b=b||e.event,rb.skip!==a&&(p._type!==m||b.srcUrn===a)){var n=b.target||b.srcElement||f,q=o?o(n):l,r=b._args||[],s=h||[],t=d;"function"==typeof t&&q&&(j&&i.off(a,d),s=s.map(function(d){if("number"==typeof d)return r[d-1];if(!k)switch(d){case"which":return b.keyCode;case"button":var e=b.button;return 1&e?1:2&e?3:4&e?2:0;case"pageX":return b.clientX+g.scrollLeft-g.clientLeft;case"pageY":return b.clientY+g.scrollTop-g.clientTop}switch(d){case"type":return a;case"defaultPrevented":return"defaultPrevented"in b?b.defaultPrevented:b.returnValue===!1;case"target":return c(n);case"currentTarget":return c(q);case"relatedTarget":return c(b.relatedTarget||b[(b.toElement===l?"from":"to")+"Element"])}return b[d]}),t.apply(i,h?s:r.concat(s))===!1&&(k?b.preventDefault():b.returnValue=!1))}};return n&&(p=n(p,a)||p),k||"on"+(p._type||a)in l||(p._type=m),p.type=b?a+" "+b:a,p.callback=d,p},sb=rb;c.prototype.fire=function(b){var c,e,g,h=d.call(arguments,1),i=this[0],j=typeof b,l={};if(!i)return!1;if("string"!==j)throw new a("fire");return(c=qb[b])&&(l=c(l)||l),j=l._type||b,k?(e=f.createEvent("HTMLEvents"),e.initEvent(j,!0,!0),e._args=h,g=i.dispatchEvent(e)):(e=f.createEventObject(),e._args=h,"on"+j in i||(j=m),j===m&&(e.srcUrn=b),i.fireEvent("on"+j,e),g=e.returnValue!==!1),g&&i[b]&&("focus"!==b&&"blur"!==b||i.offsetWidth)&&(sb.skip=b,i[b](),sb.skip=null),g};var tb={get:{},set:{}};"tabIndex readOnly maxLength cellSpacing cellPadding rowSpan colSpan useMap frameBorder contentEditable".split(" ").forEach(function(a){tb.get[a.toLowerCase()]=function(b){return b[a]}}),tb.get.style=function(a){return a.style.cssText},tb.set.style=function(a,b){a.style.cssText=b},tb.get.title=function(a){return a===g?f.title:a.title},tb.set.title=function(a,b){(a===g?f:a).title=b},tb.get.undefined=function(a){var b;switch(a.tagName){case"SELECT":return~a.selectedIndex?a.options[a.selectedIndex].value:"";case"OPTION":b=a.hasAttribute("value")?"value":"text";break;default:b=a.type&&"value"in a?"value":"innerHTML"}return a[b]},tb.set.value=function(a,b){"SELECT"===a.tagName?s.every.call(a.options,function(a){return!(a.selected=a.value===b)})&&(a.selectedIndex=-1):a[k||"textarea"!==a.type?"value":"innerText"]=b},tb.get.type=function(a){return a.getAttribute("type")||a.type},k||(tb.get.textContent=function(a){return a.innerText},tb.set.textContent=function(a,b){a.innerText=b});var ub=tb;c.prototype.get=function(b){var c,d,e=this,f=this._,g=this[0],h=ub.get[b],i=typeof b;if(g){if(h)return h(g,b);if("string"===i){if("_"===b[0]){if(c=b.substr(1),c in f)d=f[c];else if(c=c.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()}),d=g.getAttribute("data-"+c),null!=d){if("{"===d[0]&&"}"===d[d.length-1])try{d=JSON.parse(d)}catch(j){}f[c]=d}return d}return b in g?g[b]:g.getAttribute(b)}if(s.isArray(b))return b.reduce(function(a,b){return a[b]=e.get(b),a},{});throw new a("get")}};var vb=function(b,d,e,g){return function(){var h=arguments[0];void 0===h&&(h="");var i=this[0];if(!(e||i.parentNode&&h!==o))return this;if("function"==typeof h&&(h=h.call(this)),"string"==typeof h)h&&(h=d?h.trim():o.create(h)[0]);else if(h instanceof c)h=h[0];else{if(!s.isArray(h))throw new a(b);h=h.reduce(function(a,b){return a.appendChild(b[0]),a},f.createDocumentFragment())}return h&&"string"==typeof h?i.insertAdjacentHTML(d,h):(h||!d)&&g(i,h),this}};s.assign(c.prototype,{after:vb("after","afterend",!1,function(a,b){a.parentNode.insertBefore(b,a.nextSibling)}),before:vb("before","beforebegin",!1,function(a,b){a.parentNode.insertBefore(b,a)}),prepend:vb("prepend","afterbegin",!0,function(a,b){a.insertBefore(b,a.firstChild)}),append:vb("append","beforeend",!0,function(a,b){a.appendChild(b)}),replace:vb("replace","",!1,function(a,b){a.parentNode.replaceChild(b,a)}),remove:vb("remove","",!1,function(a){a.parentNode.removeChild(a)})});var wb={};wb[":focus"]=function(a){return a===f.activeElement},wb[":hidden"]=function(a){return!wb[":visible"](a)},wb[":visible"]=function(a){return"none"!==s.computeStyle(a).display&&g.contains(a)};var xb=wb;c.prototype.matches=function(b){if(!b||"string"!=typeof b)throw new a("matches");var c=xb[b]||S(b),d=this[0];return d&&!!c(d,this)},c.prototype.off=function(b,c){if("string"!=typeof b)throw new a("off");var d=this[0];return d&&(this._._handlers=this._._handlers.filter(function(a){return b!==a.type||c&&c!==a.callback?!0:(b=a._type||a.type,void(k?d.removeEventListener(b,a,!!a.capturing):d.detachEvent("on"+b,a)))})),this},c.prototype.offset=function(){var a,b=this[0],c=g.clientTop,d=g.clientLeft,f=e.pageYOffset||g.scrollTop,h=e.pageXOffset||g.scrollLeft;return b?(a=b.getBoundingClientRect(),{top:a.top+f-c,left:a.left+h-d,right:a.right+h-d,bottom:a.bottom+f-c,width:a.right-a.left,height:a.bottom-a.top}):void 0};var yb=function(b){return function(c,d,e,f){var g=this;if("string"==typeof c){"function"==typeof e&&(f=e,"string"==typeof d?e=null:(e=d,d=null)),"function"==typeof d&&(f=d,d=null,e=null);var h=this[0],i=sb(c,d,f,e,this,"once"===b);i&&(k?h.addEventListener(i._type||c,i,!!i.capturing):h.attachEvent("on"+(i._type||c),i),this._._handlers.push(i))}else{if("object"!=typeof c)throw new a(b);s.isArray(c)?c.forEach(function(a){g[b](a,d,e,f)}):s.keys(c).forEach(function(a){g[b](a,c[a])})}return this}};s.assign(c.prototype,{on:yb("on"),once:yb("once")}),c.prototype.set=function(b,c){var d=this,e=this[0];if(!e)return this;1===arguments.length&&"object"!=typeof b&&(c=null==b?"":String(b),b="value"in e?"value":"innerHTML");var f,g=ub.set[b],h=this._._watchers[b];if((h||"function"==typeof c)&&(f=this.get(b)),g)g(e,c);else if("string"==typeof b)"_"===b[0]?this._[b.substr(1)]=c:("function"==typeof c&&(c=c.call(this,f)),null==c?e.removeAttribute(b):b in e?e[b]=c:e.setAttribute(b,c),(!k||j)&&(e.className=e.className));else if(s.isArray(b))b.forEach(function(a){d.set(a,c)});else{if("object"!=typeof b)throw new a("set");s.keys(b).forEach(function(a){d.set(a,b[a])})}return h&&f!==c&&h.forEach(function(a){setTimeout(function(){a.call(d,c,f)},0)}),this};var zb=function(b,d,e){return function(f){if(f&&"string"!=typeof f)throw new a(b);var g=S(f),h=e?[]:null,i=this[0];for(i=i&&i[d];i;i=i[d])if(1===i.nodeType&&(!g||g(i))){if(!e)break;h.push(i)}return e?s.map.call(h,c):c(i)}};s.assign(c.prototype,{next:zb("next","nextSibling"),prev:zb("prev","previousSibling"),nextAll:zb("nextAll","nextSibling",!0),prevAll:zb("prevAll","previousSibling",!0),parent:zb("parent","parentNode")});var Ab=!j&&!i,Bb=["timing-function","property","duration","delay"].map(function(a){return"transition-"+a}),Cb=l?"webkitTransitionEnd":"transitionend",Db=l?"webkitAnimationEnd":"animationend",Eb=function(a){var b=parseFloat(a)||0;return a.lastIndexOf("ms")===a.length-2?b:1e3*b},Fb=function(a){var b=L.get["transition-delay"](a).split(","),c=L.get["transition-duration"](a).split(",");return Math.max.apply(Math,c.map(function(a,c){return Eb(a)+(Eb(b[c])||0)}))},Gb=function(a,b,c,d,e){var f=Fb(c);if(!f)return!1;var g,h;return h=Bb.map(function(a,b){return L.get[a](c).split(b?", ":/, (?!\d)/)}),g=h[1].indexOf("visibility"),0>g&&(g=h[2].indexOf("0s")),0>g&&(g=h[0].length),h[0][g]="linear",h[1][g]="visibility",h[d?2:3][g]="0s",h[d?3:2][g]=f+"ms",h.forEach(function(a,c){L.set[Bb[c]](b,a.join(", "))}),a.addEventListener(Cb,function i(c){"visibility"===c.propertyName&&c.target===a&&(c.stopPropagation(),a.removeEventListener(Cb,i,!1),b.willChange="",e())},!1),b.visibility=d?"visible":"hidden",b.willChange=h[1].join(", "),b.visibility=d?"hidden":"visible",!0},Hb=function(a,b,c,d,e,f){var g=Eb(L.get["animation-duration"](c));return g?(a.addEventListener(Db,function h(c){c.animationName===d&&c.target===a&&(c.stopPropagation(),a.removeEventListener(Db,h,!1),L.set["animation-name"](b,""),f())},!1),L.set["animation-direction"](b,e?"normal":"reverse"),L.set["animation-name"](b,d),!0):!1},Ib=function(b,c){return function(d,e){var f=this,g=this[0];if("string"!=typeof d&&(e=d,d=null),e&&"function"!=typeof e)throw new a(b);if(!g)return this;var h,i=g.style,j=s.computeStyle(g),k=j.display,l="boolean"==typeof c?c:"none"!==k,m=function(){l&&(i.display="none"),e&&e.call(f)};return l?"none"!==k&&(this._._display=k):"none"===k&&(i.display=this._._display||"inherit"),Ab&&(l||(k=g.offsetWidth),h=d?Hb(g,i,j,d,l,m):Gb(g,i,j,l,m)),this.set("aria-hidden",String(l)),h||m(),this}};s.assign(c.prototype,{show:Ib("show",!1),hide:Ib("hide",!0),toggle:Ib("toggle")}),c.prototype.watch=function(a,b){var c=this._._watchers;return c[a]||(c[a]=[]),c[a].push(b),this},c.prototype.unwatch=function(a,b){var c=this._._watchers;return c[a]&&(c[a]=c[a].filter(function(a){return a!==b})),this}}).call(this); \ No newline at end of file diff --git a/package.json b/package.json index 7c5a1d28..a493403e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "better-dom", - "version": "2.0.0-rc.2", + "version": "2.0.0-rc.3", "author": "Maksim Chemerisuk", "description": "Live extension playground", "license": "MIT", @@ -42,4 +42,4 @@ "test": "grunt test", "start": "grunt dev" } -} +} \ No newline at end of file