diff --git a/mithril.js b/mithril.js index 537bfd4e..c4ed06fc 100644 --- a/mithril.js +++ b/mithril.js @@ -1,9 +1,20 @@ var m = (function app(window, undefined) { - var OBJECT = "[object Object]", ARRAY = "[object Array]", STRING = "[object String]", FUNCTION = "function"; + function isFunction(object) { + return typeof object === "function"; + } + function isObject(object) { + return type.call(object) === "[object Object]"; + } + function isString(object) { + return type.call(object) === "[object String]"; + } + var isArray = Array.isArray || function (object) { + return type.call(object) === "[object Array]"; + }; var type = {}.toString; var parser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[.+?\])/g, attrParser = /\[(.+?)(?:=("|'|)(.*?)\2)?\]/; var voidElements = /^(AREA|BASE|BR|COL|COMMAND|EMBED|HR|IMG|INPUT|KEYGEN|LINK|META|PARAM|SOURCE|TRACK|WBR)$/; - var noop = function() {}; + var noop = function () {}; // caching commonly used variables var $document, $location, $requestAnimationFrame, $cancelAnimationFrame; @@ -32,15 +43,17 @@ var m = (function app(window, undefined) { * @param {...mNode=[]} Zero or more Mithril child nodes. Can be an array, or splat (optional) * */ - function m(tag, attrs) { - var args = [].slice.call(arguments, 1); - if (type.call(tag) === OBJECT) return parameterize(tag, args); - var hasAttrs = attrs != null && type.call(attrs) === OBJECT && !("tag" in attrs || "view" in attrs) && !("subtree" in attrs); - var attrs = hasAttrs ? attrs : {}; + function m(tag, pairs) { + for (var args = [], i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + if (isObject(tag)) return parameterize(tag, args); + var hasAttrs = pairs != null && isObject(pairs) && !("tag" in pairs || "view" in pairs || "subtree" in pairs); + var attrs = hasAttrs ? pairs : {}; var classAttrName = "class" in attrs ? "class" : "className"; var cell = {tag: "div", attrs: {}}; var match, classes = []; - if (type.call(tag) != STRING) throw new Error("selector in m(selector, attrs, children) should be a string"); + if (!isString(tag)) throw new Error("selector in m(selector, attrs, children) should be a string"); while (match = parser.exec(tag)) { if (match[1] === "" && match[2]) cell.tag = match[2]; else if (match[1] === "#") cell.attrs.id = match[2]; @@ -52,7 +65,7 @@ var m = (function app(window, undefined) { } var children = hasAttrs ? args.slice(1) : args; - if (children.length === 1 && type.call(children[0]) === ARRAY) { + if (children.length === 1 && isArray(children[0])) { cell.children = children[0]; } else { @@ -131,7 +144,7 @@ var m = (function app(window, undefined) { if (cached != null) { if (parentCache && parentCache.nodes) { var offset = index - parentIndex; - var end = offset + (dataType === ARRAY ? data : cached.nodes).length; + var end = offset + (isArray(data) ? data : cached.nodes).length; clear(parentCache.nodes.slice(offset, end), parentCache.slice(offset, end)); } else if (cached.nodes) clear(cached.nodes, cached); @@ -141,10 +154,10 @@ var m = (function app(window, undefined) { cached.nodes = []; } - if (dataType === ARRAY) { + if (isArray(data)) { //recursively flatten array for (var i = 0; i < data.length; i++) { - if (type.call(data[i]) === ARRAY) { + if (isArray(data[i])) { data = data.concat.apply([], data); i--; //check current index again and flatten until there are no more nested arrays at that index } @@ -241,7 +254,7 @@ var m = (function app(window, undefined) { //the second clause (after the pipe) matches text nodes subArrayCount += (item.match(/<[^\/]|\>\s*[^<]/g) || [0]).length; } - else subArrayCount += type.call(item) === ARRAY ? item.length : 1; + else subArrayCount += isArray(item) ? item.length : 1; cached[cacheCount++] = item; } }); @@ -262,7 +275,7 @@ var m = (function app(window, undefined) { cached.nodes = nodes; } } - else if (data != null && dataType === OBJECT) { + else if (data != null && isObject(data)) { var views = [], controllers = []; while (data.view) { var view = data.view.$original || data.view; @@ -288,14 +301,14 @@ var m = (function app(window, undefined) { //if an element is different enough from the one in cache, recreate it if (data.tag != cached.tag || dataAttrKeys.sort().join() != Object.keys(cached.attrs).sort().join() || data.attrs.id != cached.attrs.id || data.attrs.key != cached.attrs.key || (m.redraw.strategy() == "all" && (!cached.configContext || cached.configContext.retain !== true)) || (m.redraw.strategy() == "diff" && cached.configContext && cached.configContext.retain === false)) { if (cached.nodes.length) clear(cached.nodes); - if (cached.configContext && typeof cached.configContext.onunload === FUNCTION) cached.configContext.onunload(); + if (cached.configContext && isFunction(cached.configContext.onunload)) cached.configContext.onunload(); if (cached.controllers) { for (var i = 0, controller; controller = cached.controllers[i]; i++) { - if (typeof controller.onunload === FUNCTION) controller.onunload({preventDefault: noop}); + if (isFunction(controller.onunload)) controller.onunload({preventDefault: noop}); } } } - if (type.call(data.tag) != STRING) return; + if (!isString(data.tag)) return; var node, isNew = cached.nodes.length === 0; if (data.attrs.xmlns) namespace = data.attrs.xmlns; @@ -344,7 +357,7 @@ var m = (function app(window, undefined) { if (shouldReattach === true && node != null) parentElement.insertBefore(node, parentElement.childNodes[index] || null); } //schedule configs to be called. They are called after `build` finishes running - if (typeof data.attrs["config"] === FUNCTION) { + if (isFunction(data.attrs["config"])) { var context = cached.configContext = cached.configContext || {}; // bind @@ -356,7 +369,7 @@ var m = (function app(window, undefined) { configs.push(callback(data, [node, !isNew, context, cached])); } } - else if (typeof data != FUNCTION) { + else if (!isFunction(data)) { //handle text nodes var nodes; if (cached.nodes.length === 0) { @@ -410,11 +423,11 @@ var m = (function app(window, undefined) { //`config` isn't a real attributes, so ignore it if (attrName === "config" || attrName == "key") continue; //hook event handlers to the auto-redrawing system - else if (typeof dataAttr === FUNCTION && attrName.indexOf("on") === 0) { + else if (isFunction(dataAttr) && attrName.indexOf("on") === 0) { node[attrName] = autoredraw(dataAttr, node); } //handle `style: {...}` - else if (attrName === "style" && dataAttr != null && type.call(dataAttr) === OBJECT) { + else if (attrName === "style" && dataAttr != null && isObject(dataAttr)) { for (var rule in dataAttr) { if (cachedAttr == null || cachedAttr[rule] !== dataAttr[rule]) node.style[rule] = dataAttr[rule]; } @@ -461,17 +474,17 @@ var m = (function app(window, undefined) { if (nodes.length != 0) nodes.length = 0; } function unload(cached) { - if (cached.configContext && typeof cached.configContext.onunload === FUNCTION) { + if (cached.configContext && isFunction(cached.configContext.onunload)) { cached.configContext.onunload(); cached.configContext.onunload = null; } if (cached.controllers) { for (var i = 0, controller; controller = cached.controllers[i]; i++) { - if (typeof controller.onunload === FUNCTION) controller.onunload({preventDefault: noop}); + if (isFunction(controller.onunload)) controller.onunload({preventDefault: noop}); } } if (cached.children) { - if (type.call(cached.children) === ARRAY) { + if (isArray(cached.children)) { for (var i = 0, child; child = cached.children[i]; i++) unload(child); } else if (cached.children.tag) unload(cached.children); @@ -563,7 +576,7 @@ var m = (function app(window, undefined) { m.prop = function (store) { //note: using non-strict equality check here because we're checking if store is null OR undefined - if (((store != null && type.call(store) === OBJECT) || typeof store === FUNCTION) && typeof store.then === FUNCTION) { + if ((store != null && isObject(store) || isFunction(store)) && isFunction(store.then)) { return propify(store); } @@ -577,7 +590,7 @@ var m = (function app(window, undefined) { return (component.controller || noop).apply(this, args) || this; }; var view = function(ctrl) { - if (arguments.length > 1) args = args.concat([].slice.call(arguments, 1)); + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); return component.view.apply(component, args ? [ctrl].concat(args) : [ctrl]); }; view.$original = component.view; @@ -586,7 +599,8 @@ var m = (function app(window, undefined) { return output; } m.component = function(component) { - return parameterize(component, [].slice.call(arguments, 1)); + for (var args = [], i = 1; i < arguments.length; i++) args[i - 1] = arguments[i]; + return parameterize(component, args); }; m.mount = m.module = function(root, component) { if (!root) throw new Error("Please ensure the DOM element exists before rendering a template into it."); @@ -607,7 +621,7 @@ var m = (function app(window, undefined) { } else unloaders = []; - if (controllers[index] && typeof controllers[index].onunload === FUNCTION) { + if (controllers[index] && isFunction(controllers[index].onunload)) { controllers[index].onunload(event); } @@ -616,7 +630,7 @@ var m = (function app(window, undefined) { m.startComputation(); roots[index] = root; if (arguments.length > 2) component = subcomponent(component, [].slice.call(arguments, 2)); - var currentComponent = topComponent = component = component || {controller: function() {}}; + var currentComponent = topComponent = component = component || {controller: noop}; var constructor = component.controller || noop; var controller = new constructor; //controllers may call m.mount recursively (via m.route redirects, for example) @@ -637,7 +651,7 @@ var m = (function app(window, undefined) { try { //lastRedrawId is a positive number if a second redraw is requested before the next animation frame //lastRedrawID is null if it's the first redraw and not an event handler - if (lastRedrawId && force !== true) { + if (lastRedrawId && !force) { //when setTimeout: only reschedule redraw if time between now and previous redraw is bigger than a frame, otherwise keep currently scheduled timeout //when rAF: always reschedule redraw if ($requestAnimationFrame === window.requestAnimationFrame || new Date - lastRedrawCallTime > FRAME_BUDGET) { @@ -705,7 +719,7 @@ var m = (function app(window, undefined) { //m.route() if (arguments.length === 0) return currentRoute; //m.route(el, defaultRoute, routes) - else if (arguments.length === 3 && type.call(arg1) === STRING) { + else if (arguments.length === 3 && isString(arg1)) { redirect = function(source) { var path = currentRoute = normalizeRoute(source); if (!routeByValue(root, arg2, path)) { @@ -739,7 +753,7 @@ var m = (function app(window, undefined) { } } //m.route(route, params, shouldReplaceHistoryEntry) - else if (type.call(root) === STRING) { + else if (isString(root)) { var oldRoute = currentRoute; currentRoute = root; arg1 || {}; @@ -832,8 +846,8 @@ var m = (function app(window, undefined) { var value = object[prop]; var valueType = type.call(value); var pair = (value === null) ? encodeURIComponent(key) : - valueType === OBJECT ? buildQueryString(value, key) : - valueType === ARRAY ? value.reduce(function(memo, item) { + isObject(value) ? buildQueryString(value, key) : + isArray(value) ? value.reduce(function(memo, item) { if (!duplicates[key]) duplicates[key] = {}; if (!duplicates[key][item]) { duplicates[key][item] = true; @@ -855,7 +869,7 @@ var m = (function app(window, undefined) { var key = decodeURIComponent(pair[0]); var value = pair.length == 2 ? decodeURIComponent(pair[1]) : null; if (params[key] != null) { - if (type.call(params[key]) !== ARRAY) params[key] = [params[key]]; + if (!isArray(params[key])) params[key] = [params[key]]; params[key].push(value); } else params[key] = value; @@ -937,7 +951,7 @@ var m = (function app(window, undefined) { } function thennable(then, successCallback, failureCallback, notThennableCallback) { - if (((promiseValue != null && type.call(promiseValue) === OBJECT) || typeof promiseValue === FUNCTION) && typeof then === FUNCTION) { + if (((promiseValue != null && isObject(promiseValue)) || isFunction(promiseValue)) && isFunction(then)) { try { // count protects against abuse calls from spec checker var count = 0; @@ -981,10 +995,10 @@ var m = (function app(window, undefined) { fire(); }, function() { try { - if (state === RESOLVING && typeof successCallback === FUNCTION) { + if (state === RESOLVING && isFunction(successCallback)) { promiseValue = successCallback(promiseValue); } - else if (state === REJECTING && typeof failureCallback === FUNCTION) { + else if (state === REJECTING && isFunction(failureCallback)) { promiseValue = failureCallback(promiseValue); state = RESOLVING; } @@ -1101,13 +1115,13 @@ var m = (function app(window, undefined) { if (options.deserialize === JSON.parse) { xhr.setRequestHeader("Accept", "application/json, text/*"); } - if (typeof options.config === FUNCTION) { + if (isFunction(options.config)) { var maybeXhr = options.config(xhr, options); if (maybeXhr != null) xhr = maybeXhr; } var data = options.method === "GET" || !options.data ? "" : options.data; - if (data && (type.call(data) != STRING && data.constructor != window.FormData)) { + if (data && (!isString(data) && data.constructor != window.FormData)) { throw "Request data should be either be a string or FormData. Check the `serialize` option in `m.request`"; } xhr.send(data); @@ -1153,8 +1167,10 @@ var m = (function app(window, undefined) { var unwrap = (e.type === "load" ? xhrOptions.unwrapSuccess : xhrOptions.unwrapError) || identity; var response = unwrap(deserialize(extract(e.target, xhrOptions)), e.target); if (e.type === "load") { - if (type.call(response) === ARRAY && xhrOptions.type) { - for (var i = 0; i < response.length; i++) response[i] = new xhrOptions.type(response[i]); + if (isArray(response) && xhrOptions.type) { + forEach(response, function (res, i) { + response[i] = new xhrOptions.type(res); + }); } else if (xhrOptions.type) response = new xhrOptions.type(response); } diff --git a/mithril.min.js b/mithril.min.js index 66d367b8..47f19c51 100644 --- a/mithril.min.js +++ b/mithril.min.js @@ -4,5 +4,5 @@ http://github.com/lhorie/mithril.js (c) Leo Horie License: MIT */ -var m=function a(b,c){function d(a){D=a.document,E=a.location,G=a.cancelAnimationFrame||a.clearTimeout,F=a.requestAnimationFrame||a.setTimeout}function e(){var a,b=[].slice.call(arguments),c=!(null==b[1]||L.call(b[1])!==H||"tag"in b[1]||"view"in b[1]||"subtree"in b[1]),d=c?b[1]:{},e="class"in d?"class":"className",f={tag:"div",attrs:{}},g=[];if(L.call(b[0])!=J)throw new Error("selector in m(selector, attrs, children) should be a string");for(;a=M.exec(b[0]);)if(""===a[1]&&a[2])f.tag=a[2];else if("#"===a[1])f.attrs.id=a[2];else if("."===a[1])g.push(a[2]);else if("["===a[3][0]){var h=N.exec(a[3]);f.attrs[h[1]]=h[3]||(h[2]?"":!0)}var i=b.slice(c?2:1);f.children=1===i.length&&L.call(i[0])===I?i[0]:i;for(var j in d)d.hasOwnProperty(j)&&(j===e&&null!=d[j]&&""!==d[j]?(g.push(d[j]),f.attrs[j]=""):f.attrs[j]=d[j]);return g.length>0&&(f.attrs[e]=g.join(" ")),f}function f(a,b,d,j,l,m,n,o,p,q,r){try{(null==l||null==l.toString())&&(l="")}catch(s){l=""}if("retain"===l.subtree)return m;var t=L.call(m),u=L.call(l);if(null==m||t!==u){if(null!=m)if(d&&d.nodes){var v=o-j,w=v+(u===I?l:m.nodes).length;i(d.nodes.slice(v,w),d.slice(v,w))}else m.nodes&&i(m.nodes,m);m=new l.constructor,m.tag&&(m={}),m.nodes=[]}if(u===I){for(var x=0,y=l.length;y>x;x++)L.call(l[x])===I&&(l=l.concat.apply([],l),x--,y=l.length);for(var z=[],A=m.length===l.length,B=0,C=1,E=2,F=3,G={},M=!1,x=0;xx;x++)if(l[x]&&l[x].attrs&&null!=l[x].attrs.key){for(var Q=0,y=l.length;y>Q;Q++)l[Q]&&l[Q].attrs&&null==l[Q].attrs.key&&(l[Q].attrs.key="__mithril__"+N++);break}if(M){var R=!1;if(l.length!=m.length)R=!0;else for(var S,T,x=0;S=m[x],T=l[x];x++)if(S.attrs&&T.attrs&&S.attrs.key!=T.attrs.key){R=!0;break}if(R){for(var x=0,y=l.length;y>x;x++)if(l[x]&&l[x].attrs&&null!=l[x].attrs.key){var U=l[x].attrs.key;G[U]=G[U]?{action:F,index:x,from:G[U].index,element:m.nodes[G[U].index]||D.createElement("div")}:{action:E,index:x}}var V=[];for(var W in G)V.push(G[W]);var X=V.sort(g),Y=new Array(m.length);Y.nodes=m.nodes.slice();for(var Z,x=0;Z=X[x];x++){if(Z.action===C&&(i(m[Z.index].nodes,m[Z.index]),Y.splice(Z.index,1)),Z.action===E){var $=D.createElement("div");$.key=l[Z.index].attrs.key,a.insertBefore($,a.childNodes[Z.index]||null),Y.splice(Z.index,0,{attrs:{key:l[Z.index].attrs.key},nodes:[$]}),Y.nodes[Z.index]=$}Z.action===F&&(a.childNodes[Z.index]!==Z.element&&null!==Z.element&&a.insertBefore(Z.element,a.childNodes[Z.index]||null),Y[Z.index]=m[Z.from],Y.nodes[Z.index]=Z.element)}m=Y}}for(var x=0,_=0,y=l.length;y>x;x++){var bb=f(a,b,m,o,l[x],m[_],n,o+B||B,p,q,r);bb!==c&&(bb.nodes.intact||(A=!1),B+=bb.$trusted?(bb.match(/<[^\/]|\>\s*[^<]/g)||[0]).length:L.call(bb)===I?bb.length:1,m[_++]=bb)}if(!A){for(var x=0,y=l.length;y>x;x++)null!=m[x]&&z.push.apply(z,m[x].nodes);for(var cb,x=0;cb=m.nodes[x];x++)null!=cb.parentNode&&z.indexOf(cb)<0&&i([cb],[m[x]]);l.length-1?m.controllers[hb]:new(l.controller||P),U=l&&l.attrs&&l.attrs.key;if(l=0==db||m&&m.controllers&&m.controllers.indexOf(ib)>-1?l.view(ib):{tag:"placeholder"},"retain"===l.subtree)return m;U&&(l.attrs||(l.attrs={}),l.attrs.key=U),ib.onunload&&ab.push({controller:ib,handler:ib.onunload}),eb.push(gb),fb.push(ib)}if(!l.tag&&fb.length)throw new Error("Component template must return a virtual element, not an array, string, etc.");l.attrs||(l.attrs={}),m.attrs||(m.attrs={});var jb=Object.keys(l.attrs),kb=jb.length>("key"in l.attrs?1:0);if((l.tag!=m.tag||jb.sort().join()!=Object.keys(m.attrs).sort().join()||l.attrs.id!=m.attrs.id||l.attrs.key!=m.attrs.key||"all"==e.redraw.strategy()&&(!m.configContext||m.configContext.retain!==!0)||"diff"==e.redraw.strategy()&&m.configContext&&m.configContext.retain===!1)&&(m.nodes.length&&i(m.nodes),m.configContext&&typeof m.configContext.onunload===K&&m.configContext.onunload(),m.controllers))for(var ib,x=0;ib=m.controllers[x];x++)typeof ib.onunload===K&&ib.onunload({preventDefault:P});if(L.call(l.tag)!=J)return;var cb,lb=0===m.nodes.length;if(l.attrs.xmlns?q=l.attrs.xmlns:"svg"===l.tag?q="http://www.w3.org/2000/svg":"math"===l.tag&&(q="http://www.w3.org/1998/Math/MathML"),lb){if(cb=l.attrs.is?q===c?D.createElement(l.tag,l.attrs.is):D.createElementNS(q,l.tag,l.attrs.is):q===c?D.createElement(l.tag):D.createElementNS(q,l.tag),m={tag:l.tag,attrs:kb?h(cb,l.tag,l.attrs,{},q):l.attrs,children:null!=l.children&&l.children.length>0?f(cb,l.tag,c,c,l.children,m.children,!0,0,l.attrs.contenteditable?cb:p,q,r):l.children,nodes:[cb]},fb.length){m.views=eb,m.controllers=fb;for(var ib,x=0;ib=fb[x];x++)if(ib.onunload&&ib.onunload.$old&&(ib.onunload=ib.onunload.$old),db&&ib.onunload){var mb=ib.onunload;ib.onunload=P,ib.onunload.$old=mb}}m.children&&!m.children.nodes&&(m.children.nodes=[]),"select"===l.tag&&"value"in l.attrs&&h(cb,l.tag,{value:l.attrs.value},{},q),a.insertBefore(cb,a.childNodes[o]||null)}else cb=m.nodes[0],kb&&h(cb,l.tag,l.attrs,m.attrs,q),m.children=f(cb,l.tag,c,c,l.children,m.children,!1,0,l.attrs.contenteditable?cb:p,q,r),m.nodes.intact=!0,fb.length&&(m.views=eb,m.controllers=fb),n===!0&&null!=cb&&a.insertBefore(cb,a.childNodes[o]||null);if(typeof l.attrs.config===K){var nb=m.configContext=m.configContext||{},ob=function(a,b){return function(){return a.attrs.config.apply(a,b)}};r.push(ob(l,[cb,!lb,nb,m]))}}else if(typeof l!=K){var z;0===m.nodes.length?(l.$trusted?z=k(a,o,l):(z=[D.createTextNode(l)],a.nodeName.match(O)||a.insertBefore(z[0],a.childNodes[o]||null)),m="string number boolean".indexOf(typeof l)>-1?new l.constructor(l):l,m.nodes=z):m.valueOf()!==l.valueOf()||n===!0?(z=m.nodes,p&&p===D.activeElement||(l.$trusted?(i(z,m),z=k(a,o,l)):"textarea"===b?a.value=l:p?p.innerHTML=l:((1===z[0].nodeType||z.length>1)&&(i(m.nodes,m),z=[D.createTextNode(l)]),a.insertBefore(z[0],a.childNodes[o]||null),z[0].nodeValue=l)),m=new l.constructor(l),m.nodes=z):m.nodes.intact=!0}return m}function g(a,b){return a.action-b.action||a.index-b.index}function h(a,b,c,d,e){for(var f in c){var g=c[f],h=d[f];if(f in d&&h===g)"value"===f&&"input"===b&&a.value!=g&&(a.value=g);else{d[f]=g;try{if("config"===f||"key"==f)continue;if(typeof g===K&&0===f.indexOf("on"))a[f]=l(g,a);else if("style"===f&&null!=g&&L.call(g)===H){for(var i in g)(null==h||h[i]!==g[i])&&(a.style[i]=g[i]);for(var i in h)i in g||(a.style[i]="")}else null!=e?"href"===f?a.setAttributeNS("http://www.w3.org/1999/xlink","href",g):"className"===f?a.setAttribute("class",g):a.setAttribute(f,g):f in a&&"list"!==f&&"style"!==f&&"form"!==f&&"type"!==f&&"width"!==f&&"height"!==f?("input"!==b||a[f]!==g)&&(a[f]=g):a.setAttribute(f,g)}catch(j){if(j.message.indexOf("Invalid argument")<0)throw j}}}return d}function i(a,b){for(var c=a.length-1;c>-1;c--)if(a[c]&&a[c].parentNode){try{a[c].parentNode.removeChild(a[c])}catch(d){}b=[].concat(b),b[c]&&j(b[c])}0!=a.length&&(a.length=0)}function j(a){if(a.configContext&&typeof a.configContext.onunload===K&&(a.configContext.onunload(),a.configContext.onunload=null),a.controllers)for(var b,c=0;b=a.controllers[c];c++)typeof b.onunload===K&&b.onunload({preventDefault:P});if(a.children)if(L.call(a.children)===I)for(var d,c=0;d=a.children[c];c++)j(d);else a.children.tag&&j(a.children)}function k(a,b,c){var d=a.childNodes[b];if(d){var e=1!=d.nodeType,f=D.createElement("span");e?(a.insertBefore(f,d||null),f.insertAdjacentHTML("beforebegin",c),a.removeChild(f)):d.insertAdjacentHTML("beforebegin",c)}else a.insertAdjacentHTML("beforeend",c);for(var g=[];a.childNodes[b]!==d;)g.push(a.childNodes[b]),b++;return g}function l(a,b){return function(c){c=c||event,e.redraw.strategy("diff"),e.startComputation();try{return a.call(b,c)}finally{eb()}}}function m(a){var b=S.indexOf(a);return 0>b?S.push(a)-1:b}function n(a){var b=function(){return arguments.length&&(a=arguments[0]),a};return b.toJSON=function(){return a},b}function o(a,b){var c=function(){return(a.controller||P).apply(this,b)||this},d=function(c){return arguments.length>1&&(b=b.concat([].slice.call(arguments,1))),a.view.apply(a,b?[c].concat(b):[c])};d.$original=a.view;var e={controller:c,view:d};return b[0]&&null!=b[0].key&&(e.attrs={key:b[0].key}),e}function p(){$&&($(),$=null);for(var a,b=0;a=V[b];b++)if(X[b]){var c=W[b].controller&&W[b].controller.$$args?[X[b]].concat(W[b].controller.$$args):[X[b]];e.render(a,W[b].view?W[b].view(X[b],c):"")}_&&(_(),_=null),Y=null,Z=new Date,e.redraw.strategy("diff")}function q(a){return a.slice(hb[e.route.mode].length)}function r(a,b,c){fb={};var d=c.indexOf("?");-1!==d&&(fb=v(c.substr(d+1,c.length)),c=c.substr(0,d));var f=Object.keys(b),g=f.indexOf(c);if(-1!==g)return e.mount(a,b[f[g]]),!0;for(var h in b){if(h===c)return e.mount(a,b[h]),!0;var i=new RegExp("^"+h.replace(/:[^\/]+?\.{3}/g,"(.*?)").replace(/:[^\/]+/g,"([^\\/]+)")+"/?$");if(i.test(c))return c.replace(i,function(){for(var c=h.match(/:[^\/]+/g)||[],d=[].slice.call(arguments,1,-2),f=0,g=c.length;g>f;f++)fb[c[f].replace(/:|\./g,"")]=decodeURIComponent(d[f]);e.mount(a,b[h])}),!0}}function s(a){if(a=a||event,!a.ctrlKey&&!a.metaKey&&2!==a.which){a.preventDefault?a.preventDefault():a.returnValue=!1;for(var b=a.currentTarget||a.srcElement,c="pathname"===e.route.mode&&b.search?v(b.search.slice(1)):{};b&&"A"!=b.nodeName.toUpperCase();)b=b.parentNode;e.route(b[e.route.mode].slice(hb[e.route.mode].length),c)}}function t(){"hash"!=e.route.mode&&E.hash?E.hash=E.hash:b.scrollTo(0,0)}function u(a,b){var d={},e=[];for(var f in a){var g=b?b+"["+f+"]":f,h=a[f],i=L.call(h),j=null===h?encodeURIComponent(g):i===H?u(h,g):i===I?h.reduce(function(a,b){return d[g]||(d[g]={}),d[g][b]?a:(d[g][b]=!0,a.concat(encodeURIComponent(g)+"="+encodeURIComponent(b)))},[]).join("&"):encodeURIComponent(g)+"="+encodeURIComponent(h);h!==c&&e.push(j)}return e.join("&")}function v(a){"?"===a.charAt(0)&&(a=a.substring(1));for(var b=a.split("&"),c={},d=0,e=b.length;e>d;d++){var f=b[d].split("="),g=decodeURIComponent(f[0]),h=2==f.length?decodeURIComponent(f[1]):null;null!=c[g]?(L.call(c[g])!==I&&(c[g]=[c[g]]),c[g].push(h)):c[g]=h}return c}function w(a){var b=m(a);i(a.childNodes,T[b]),T[b]=c}function x(a,b){var c=e.prop(b);return a.then(c),c.then=function(c,d){return x(a.then(c,d),b)},c}function y(a,b){function c(a){l=a||j,n.map(function(a){l===i&&a.resolve(m)||a.reject(m)})}function d(a,b,c,d){if((null!=m&&L.call(m)===H||typeof m===K)&&typeof a===K)try{var f=0;a.call(m,function(a){f++||(m=a,b())},function(a){f++||(m=a,c())})}catch(g){e.deferred.onerror(g),m=g,c()}else d()}function f(){var j;try{j=m&&m.then}catch(n){return e.deferred.onerror(n),m=n,l=h,f()}d(j,function(){l=g,f()},function(){l=h,f()},function(){try{l===g&&typeof a===K?m=a(m):l===h&&"function"==typeof b&&(m=b(m),l=g)}catch(f){return e.deferred.onerror(f),m=f,c()}m===k?(m=TypeError(),c()):d(j,function(){c(i)},c,function(){c(l===g&&i)})})}var g=1,h=2,i=3,j=4,k=this,l=0,m=0,n=[];k.promise={},k.resolve=function(a){return l||(m=a,l=g,f()),this},k.reject=function(a){return l||(m=a,l=h,f()),this},k.promise.then=function(a,b){var c=new y(a,b);return l===i?c.resolve(m):l===j?c.reject(m):n.push(c),c.promise}}function z(a){return a}function A(a){if(!a.dataType||"jsonp"!==a.dataType.toLowerCase()){var d=new b.XMLHttpRequest;if(d.open(a.method,a.url,!0,a.user,a.password),d.onreadystatechange=function(){4===d.readyState&&(d.status>=200&&d.status<300?a.onload({type:"load",target:d}):a.onerror({type:"error",target:d}))},a.serialize===JSON.stringify&&a.data&&"GET"!==a.method&&d.setRequestHeader("Content-Type","application/json; charset=utf-8"),a.deserialize===JSON.parse&&d.setRequestHeader("Accept","application/json, text/*"),typeof a.config===K){var e=a.config(d,a);null!=e&&(d=e)}var f="GET"!==a.method&&a.data?a.data:"";if(f&&L.call(f)!=J&&f.constructor!=b.FormData)throw"Request data should be either be a string or FormData. Check the `serialize` option in `m.request`";return d.send(f),d}var g="mithril_callback_"+(new Date).getTime()+"_"+Math.round(1e16*Math.random()).toString(36),h=D.createElement("script");b[g]=function(d){h.parentNode.removeChild(h),a.onload({type:"load",target:{responseText:d}}),b[g]=c},h.onerror=function(){return h.parentNode.removeChild(h),a.onerror({type:"error",target:{status:500,responseText:JSON.stringify({error:"Error making jsonp request"})}}),b[g]=c,!1},h.onload=function(){return!1},h.src=a.url+(a.url.indexOf("?")>0?"&":"?")+(a.callbackKey?a.callbackKey:"callback")+"="+g+"&"+u(a.data||{}),D.body.appendChild(h)}function B(a,b,c){if("GET"===a.method&&"jsonp"!=a.dataType){var d=a.url.indexOf("?")<0?"?":"&",e=u(b);a.url=a.url+(e?d+e:"")}else a.data=c(b);return a}function C(a,b){var c=a.match(/:[a-z]\w+/gi);if(c&&b)for(var d=0;dk;k++)e[k]()},e.trust=function(a){return a=new String(a),a.$trusted=!0,a},e.prop=function(a){return(null!=a&&L.call(a)===H||typeof a===K)&&typeof a.then===K?x(a):n(a)};var U,V=[],W=[],X=[],Y=null,Z=0,$=null,_=null,ab=[],bb=16;e.component=function(a){return o(a,[].slice.call(arguments,1))},e.mount=e.module=function(a,b){if(!a)throw new Error("Please ensure the DOM element exists before rendering a template into it.");var c=V.indexOf(a);0>c&&(c=V.length);for(var d,f=!1,g={preventDefault:function(){f=!0,$=_=null}},h=0;d=ab[h];h++)d.handler.call(d.controller,g),d.controller.onunload=null;if(f)for(var d,h=0;d=ab[h];h++)d.controller.onunload=d.handler;else ab=[];if(X[c]&&typeof X[c].onunload===K&&X[c].onunload(g),!f){e.redraw.strategy("all"),e.startComputation(),V[c]=a,arguments.length>2&&(b=subcomponent(b,[].slice.call(arguments,2)));var i=U=b=b||{controller:function(){}},j=b.controller||P,k=new j;return i===U&&(X[c]=k,W[c]=b),eb(),X[c]}};var cb=!1;e.redraw=function(a){cb||(cb=!0,Y&&a!==!0?(F===b.requestAnimationFrame||new Date-Z>bb)&&(Y>0&&G(Y),Y=F(p,bb)):(p(),Y=F(function(){Y=null},bb)),cb=!1)},e.redraw.strategy=e.prop();var db=0;e.startComputation=function(){db++},e.endComputation=function(){db=Math.max(db-1,0),0===db&&e.redraw()};var eb=function(){"none"==e.redraw.strategy()?(db--,e.redraw.strategy("diff")):e.endComputation()};e.withAttr=function(a,b){return function(c){c=c||event;var d=c.currentTarget||this;b(a in d?d[a]:d.getAttribute(a))}};var fb,gb,hb={pathname:"",hash:"#",search:"?"},ib=P,jb=!1;return e.route=function(){if(0===arguments.length)return gb;if(3===arguments.length&&L.call(arguments[1])===J){var a=arguments[0],c=arguments[1],d=arguments[2];ib=function(b){var f=gb=q(b);if(!r(a,d,f)){if(jb)throw new Error("Ensure the default route matches one of the routes defined in m.route");jb=!0,e.route(c,!0),jb=!1}};var f="hash"===e.route.mode?"onhashchange":"onpopstate";b[f]=function(){var a=E[e.route.mode];"pathname"===e.route.mode&&(a+=E.search),gb!=q(a)&&ib(a)},$=t,b[f]()}else if(arguments[0].addEventListener||arguments[0].attachEvent){var g=arguments[0],h=(arguments[1],arguments[2],arguments[3]);g.href=("pathname"!==e.route.mode?E.pathname:"")+hb[e.route.mode]+h.attrs.href,g.addEventListener?(g.removeEventListener("click",s),g.addEventListener("click",s)):(g.detachEvent("onclick",s),g.attachEvent("onclick",s))}else if(L.call(arguments[0])===J){var i=gb;gb=arguments[0];var j=arguments[1]||{},k=gb.indexOf("?"),l=k>-1?v(gb.slice(k+1)):{};for(var m in j)l[m]=j[m];var n=u(l),o=k>-1?gb.slice(0,k):gb;n&&(gb=o+(-1===o.indexOf("?")?"?":"&")+n);var p=(3===arguments.length?arguments[2]:arguments[1])===!0||i===arguments[0];b.history.pushState?($=t,_=function(){b.history[p?"replaceState":"pushState"](null,D.title,hb[e.route.mode]+gb)},ib(hb[e.route.mode]+gb)):(E[e.route.mode]=gb,ib(hb[e.route.mode]+gb))}},e.route.param=function(a){if(!fb)throw new Error("You must call m.route(element, defaultRoute, routes) before calling m.route.param()");return fb[a]},e.route.mode="search",e.route.buildQueryString=u,e.route.parseQueryString=v,e.deferred=function(){var a=new y;return a.promise=x(a.promise),a},e.deferred.onerror=function(a){if("[object Error]"===L.call(a)&&!a.constructor.toString().match(/ Error/))throw a},e.sync=function(a){function b(a,b){return function(e){return g[a]=e,b||(c="reject"),0===--f&&(d.promise(g),d[c](g)),e}}var c="resolve",d=e.deferred(),f=a.length,g=new Array(f);if(a.length>0)for(var h=0;h\s*[^<]/g)||[0]).length:O(e)?e.length:1,t[X++]=e)}),F||(i(s,function(a,b){null!=t[b]&&E.push.apply(E,t[b].nodes)}),i(t.nodes,function(a,b){null!=a.parentNode&&E.indexOf(a)<0&&p([a],[t[b]])}),s.length-1?t.controllers[_]:new(s.controller||T),ba=s&&s.attrs&&s.attrs.key;if(s=0==ia||ha||t&&t.controllers&&t.controllers.indexOf(aa)>-1?s.view(aa):{tag:"placeholder"},"retain"===s.subtree)return t;null!=ba&&(s.attrs||(s.attrs={}),s.attrs.key=ba),aa.onunload&&ea.push({controller:aa,handler:aa.onunload}),Y.push($),Z.push(aa)}if(!s.tag&&Z.length)throw new Error("Component template must return a virtual element, not an array, string, etc.");s.attrs||(s.attrs={}),t.attrs||(t.attrs={});var ca=Object.keys(s.attrs),da=ca.length>("key"in s.attrs?1:0);if((s.tag!=t.tag||ca.sort().join()!=Object.keys(t.attrs).sort().join()||s.attrs.id!=t.attrs.id||s.attrs.key!=t.attrs.key||"all"==h.redraw.strategy()&&(!t.configContext||t.configContext.retain!==!0)||"diff"==h.redraw.strategy()&&t.configContext&&t.configContext.retain===!1)&&(t.nodes.length&&p(t.nodes),t.configContext&&d(t.configContext.onunload)&&t.configContext.onunload(),t.controllers))for(var aa,D=0;aa=t.controllers[D];D++)d(aa.onunload)&&aa.onunload({preventDefault:T});if(!f(s.tag))return;var fa,ga=0===t.nodes.length;if(s.attrs.xmlns?x=s.attrs.xmlns:"svg"===s.tag?x="http://www.w3.org/2000/svg":"math"===s.tag&&(x="http://www.w3.org/1998/Math/MathML"),ga){if(fa=s.attrs.is?x===c?K.createElement(s.tag,s.attrs.is):K.createElementNS(x,s.tag,s.attrs.is):x===c?K.createElement(s.tag):K.createElementNS(x,s.tag),t={tag:s.tag,attrs:da?o(fa,s.tag,s.attrs,{},x):s.attrs,children:null!=s.children&&s.children.length>0?m(fa,s.tag,c,c,s.children,t.children,!0,0,s.attrs.contenteditable?fa:w,x,y):s.children,nodes:[fa]},Z.length){t.views=Y,t.controllers=Z;for(var aa,D=0;aa=Z[D];D++)if(aa.onunload&&aa.onunload.$old&&(aa.onunload=aa.onunload.$old),ia&&aa.onunload){var ja=aa.onunload;aa.onunload=T,aa.onunload.$old=ja}}t.children&&!t.children.nodes&&(t.children.nodes=[]),"select"===s.tag&&"value"in s.attrs&&o(fa,s.tag,{value:s.attrs.value},{},x),a.insertBefore(fa,a.childNodes[v]||null)}else fa=t.nodes[0],da&&o(fa,s.tag,s.attrs,t.attrs,x),t.children=m(fa,s.tag,c,c,s.children,t.children,!1,0,s.attrs.contenteditable?fa:w,x,y),t.nodes.intact=!0,Z.length&&(t.views=Y,t.controllers=Z),u===!0&&null!=fa&&a.insertBefore(fa,a.childNodes[v]||null);if(d(s.attrs.config)){var ka=t.configContext=t.configContext||{},la=function(a,b){return function(){return a.attrs.config.apply(a,b)}};y.push(la(s,[fa,!ga,ka,t]))}}else if(!d(s)){var E;0===t.nodes.length?(s.$trusted?E=r(a,v,s):(E=[K.createTextNode(s)],a.nodeName.match(S)||a.insertBefore(E[0],a.childNodes[v]||null)),t="string number boolean".indexOf(typeof s)>-1?new s.constructor(s):s,t.nodes=E):t.valueOf()!==s.valueOf()||u===!0?(E=t.nodes,w&&w===K.activeElement||(s.$trusted?(p(E,t),E=r(a,v,s)):"textarea"===b?a.value=s:w?w.innerHTML=s:((1===E[0].nodeType||E.length>1)&&(p(t.nodes,t),E=[K.createTextNode(s)]),l(a,E[0],v,s))),t=new s.constructor(s),t.nodes=E):t.nodes.intact=!0}return t}function n(a,b){return a.action-b.action||a.index-b.index}function o(a,b,c,f,g){for(var h in c){var i=c[h],j=f[h];if(h in f&&j===i)"value"===h&&"input"===b&&a.value!=i&&(a.value=i);else{f[h]=i;try{if("config"===h||"key"==h)continue;if(d(i)&&0===h.indexOf("on"))a[h]=s(i,a);else if("style"===h&&null!=i&&e(i)){for(var k in i)(null==j||j[k]!==i[k])&&(a.style[k]=i[k]);for(var k in j)k in i||(a.style[k]="")}else null!=g?"href"===h?a.setAttributeNS("http://www.w3.org/1999/xlink","href",i):"className"===h?a.setAttribute("class",i):a.setAttribute(h,i):h in a&&"list"!==h&&"style"!==h&&"form"!==h&&"type"!==h&&"width"!==h&&"height"!==h?("input"!==b||a[h]!==i)&&(a[h]=i):a.setAttribute(h,i)}catch(l){if(l.message.indexOf("Invalid argument")<0)throw l}}}return f}function p(a,b){for(var c=a.length-1;c>-1;c--)if(a[c]&&a[c].parentNode){try{a[c].parentNode.removeChild(a[c])}catch(d){}b=[].concat(b),b[c]&&q(b[c])}0!=a.length&&(a.length=0)}function q(a){if(a.configContext&&d(a.configContext.onunload)&&(a.configContext.onunload(),a.configContext.onunload=null),a.controllers)for(var b,c=0;b=a.controllers[c];c++)d(b.onunload)&&b.onunload({preventDefault:T});if(a.children)if(O(a.children))for(var e,c=0;e=a.children[c];c++)q(e);else a.children.tag&&q(a.children)}function r(a,b,c){var d=a.childNodes[b];if(d){var e=1!=d.nodeType,f=K.createElement("span");e?(a.insertBefore(f,d||null),f.insertAdjacentHTML("beforebegin",c),a.removeChild(f)):d.insertAdjacentHTML("beforebegin",c)}else a.insertAdjacentHTML("beforeend",c);for(var g=[];a.childNodes[b]!==d;)g.push(a.childNodes[b]),b++;return g}function s(a,b){return function(c){c=c||event,h.redraw.strategy("diff"),h.startComputation();try{return a.call(b,c)}finally{ja()}}}function t(a){var b=W.indexOf(a);return 0>b?W.push(a)-1:b}function u(a){var b=function(){return arguments.length&&(a=arguments[0]),a};return b.toJSON=function(){return a},b}function v(a,b){var c=function(){return(a.controller||T).apply(this,b)||this},d=function(c){for(var d=1;de;e++)ka[c[e].replace(/:|\./g,"")]=decodeURIComponent(d[e]);h.mount(a,b[g])}),!0}}function z(a){if(a=a||event,!a.ctrlKey&&!a.metaKey&&2!==a.which){a.preventDefault?a.preventDefault():a.returnValue=!1;for(var b=a.currentTarget||a.srcElement,c="pathname"===h.route.mode&&b.search?C(b.search.slice(1)):{};b&&"A"!=b.nodeName.toUpperCase();)b=b.parentNode;h.route(b[h.route.mode].slice(ma[h.route.mode].length),c)}}function A(){"hash"!=h.route.mode&&L.hash?L.hash=L.hash:b.scrollTo(0,0)}function B(a,b){var d={},f=[];for(var g in a){var h=b?b+"["+g+"]":g,i=a[g],j=(P.call(i),null===i?encodeURIComponent(h):e(i)?B(i,h):O(i)?i.reduce(function(a,b){return d[h]||(d[h]={}),d[h][b]?a:(d[h][b]=!0,a.concat(encodeURIComponent(h)+"="+encodeURIComponent(b)))},[]).join("&"):encodeURIComponent(h)+"="+encodeURIComponent(i));i!==c&&f.push(j)}return f.join("&")}function C(a){"?"===a.charAt(0)&&(a=a.substring(1));for(var b=a.split("&"),c={},d=0,e=b.length;e>d;d++){var f=b[d].split("="),g=decodeURIComponent(f[0]),h=2==f.length?decodeURIComponent(f[1]):null;null!=c[g]?(O(c[g])||(c[g]=[c[g]]),c[g].push(h)):c[g]=h}return c}function D(a){var b=t(a);p(a.childNodes,X[b]),X[b]=c}function E(a,b){var c=h.prop(b);return a.then(c),c.then=function(c,d){return E(a.then(c,d),b)},c["catch"]=c.then.bind(null,null),c}function F(a,b){function c(a){n=a||l,p.map(function(a){n===k&&a.resolve(o)||a.reject(o)})}function f(a,b,c,f){if((null!=o&&e(o)||d(o))&&d(a))try{var g=0;a.call(o,function(a){g++||(o=a,b())},function(a){g++||(o=a,c())})}catch(i){h.deferred.onerror(i),o=i,c()}else f()}function g(){var e;try{e=o&&o.then}catch(l){return h.deferred.onerror(l),o=l,n=j,g()}f(e,function(){n=i,g()},function(){n=j,g()},function(){try{n===i&&d(a)?o=a(o):n===j&&d(b)&&(o=b(o),n=i)}catch(g){return h.deferred.onerror(g),o=g,c()}o===m?(o=TypeError(),c()):f(e,function(){c(k)},c,function(){c(n===i&&k)})})}var i=1,j=2,k=3,l=4,m=this,n=0,o=0,p=[];m.promise={},m.resolve=function(a){return n||(o=a,n=i,g()),this},m.reject=function(a){return n||(o=a,n=j,g()),this},m.promise.then=function(a,b){var c=new F(a,b);return n===k?c.resolve(o):n===l?c.reject(o):p.push(c),c.promise}}function G(a){return a}function H(a){if(!a.dataType||"jsonp"!==a.dataType.toLowerCase()){var e=new b.XMLHttpRequest;if(e.open(a.method,a.url,!0,a.user,a.password),e.onreadystatechange=function(){4===e.readyState&&(e.status>=200&&e.status<300?a.onload({type:"load",target:e}):a.onerror({type:"error",target:e}))},a.serialize===JSON.stringify&&a.data&&"GET"!==a.method&&e.setRequestHeader("Content-Type","application/json; charset=utf-8"),a.deserialize===JSON.parse&&e.setRequestHeader("Accept","application/json, text/*"),d(a.config)){var g=a.config(e,a);null!=g&&(e=g)}var h="GET"!==a.method&&a.data?a.data:"";if(h&&!f(h)&&h.constructor!=b.FormData)throw"Request data should be either be a string or FormData. Check the `serialize` option in `m.request`";return e.send(h),e}var i="mithril_callback_"+(new Date).getTime()+"_"+Math.round(1e16*Math.random()).toString(36),j=K.createElement("script");b[i]=function(d){j.parentNode.removeChild(j),a.onload({type:"load",target:{responseText:d}}),b[i]=c},j.onerror=function(d){return j.parentNode.removeChild(j),a.onerror({type:"error",target:{status:500,responseText:JSON.stringify({error:"Error making jsonp request"})}}),b[i]=c,!1},j.onload=function(a){return!1},j.src=a.url+(a.url.indexOf("?")>0?"&":"?")+(a.callbackKey?a.callbackKey:"callback")+"="+i+"&"+B(a.data||{}),K.body.appendChild(j)}function I(a,b,c){if("GET"===a.method&&"jsonp"!=a.dataType){var d=a.url.indexOf("?")<0?"?":"&",e=B(b);a.url=a.url+(e?d+e:"")}else a.data=c(b);return a}function J(a,b){var c=a.match(/:[a-z]\w+/gi);if(c&&b)for(var d=0;di;i++)e[i]()},h.trust=function(a){return a=new String(a),a.$trusted=!0,a},h.prop=function(a){return(null!=a&&e(a)||d(a))&&d(a.then)?E(a):u(a)};var Y,Z=[],$=[],_=[],aa=null,ba=0,ca=null,da=null,ea=[],fa=16;h.component=function(a){for(var b=[],c=1;cc&&(c=Z.length);for(var e,f=!1,g={preventDefault:function(){f=!0,ca=da=null}},i=0;e=ea[i];i++)e.handler.call(e.controller,g),e.controller.onunload=null;if(f)for(var e,i=0;e=ea[i];i++)e.controller.onunload=e.handler;else ea=[];if(_[c]&&d(_[c].onunload)&&_[c].onunload(g),!f){h.redraw.strategy("all"),h.startComputation(),Z[c]=a,arguments.length>2&&(b=subcomponent(b,[].slice.call(arguments,2)));var j=Y=b=b||{controller:T},k=b.controller||T,l=new k;return j===Y&&(_[c]=l,$[c]=b),ja(),_[c]}};var ga=!1,ha=!1;h.redraw=function(a){if(!ga){ga=!0,a&&(ha=!0);try{aa&&!a?(M===b.requestAnimationFrame||new Date-ba>fa)&&(aa>0&&N(aa),aa=M(w,fa)):(w(),aa=M(function(){aa=null},fa))}finally{ga=ha=!1}}},h.redraw.strategy=h.prop();var ia=0;h.startComputation=function(){ia++},h.endComputation=function(){ia=Math.max(ia-1,0),0===ia&&h.redraw()};var ja=function(){"none"==h.redraw.strategy()?(ia--,h.redraw.strategy("diff")):h.endComputation()};h.withAttr=function(a,b){return function(c){c=c||event;var d=c.currentTarget||this;b(a in d?d[a]:d.getAttribute(a))}};var ka,la,ma={pathname:"",hash:"#",search:"?"},na=T,oa=!1;return h.route=function(a,c,d,e){if(0===arguments.length)return la;if(3===arguments.length&&f(c)){na=function(b){var e=la=x(b);if(!y(a,d,e)){if(oa)throw new Error("Ensure the default route matches one of the routes defined in m.route");oa=!0,h.route(c,!0),oa=!1}};var g="hash"===h.route.mode?"onhashchange":"onpopstate";b[g]=function(){var a=L[h.route.mode];"pathname"===h.route.mode&&(a+=L.search),la!=x(a)&&na(a)},ca=A,b[g]()}else if(a.addEventListener||a.attachEvent)a.href=("pathname"!==h.route.mode?L.pathname:"")+ma[h.route.mode]+e.attrs.href,a.addEventListener?(a.removeEventListener("click",z),a.addEventListener("click",z)):(a.detachEvent("onclick",z),a.attachEvent("onclick",z));else if(f(a)){var i=la;la=a;var j=la.indexOf("?"),k=j>-1?C(la.slice(j+1)):{};for(var l in c)k[l]=c[l];var m=B(k),n=j>-1?la.slice(0,j):la;m&&(la=n+(-1===n.indexOf("?")?"?":"&")+m);var o=(3===arguments.length?d:c)===!0||i===a;b.history.pushState?(ca=A,da=function(){b.history[o?"replaceState":"pushState"](null,K.title,ma[h.route.mode]+la)},na(ma[h.route.mode]+la)):(L[h.route.mode]=la,na(ma[h.route.mode]+la))}},h.route.param=function(a){if(!ka)throw new Error("You must call m.route(element, defaultRoute, routes) before calling m.route.param()");return ka[a]},h.route.mode="search",h.route.buildQueryString=B,h.route.parseQueryString=C,h.deferred=function(){var a=new F;return a.promise=E(a.promise),a},h.deferred.onerror=function(a){if("[object Error]"===P.call(a)&&!a.constructor.toString().match(/ Error/))throw ia=0,a},h.sync=function(a){function b(a,b){return function(g){return f[a]=g,b||(c="reject"),0===--e&&(d.promise(f),d[c](f)),g}}var c="resolve",d=h.deferred(),e=a.length,f=new Array(e);if(a.length>0)for(var g=0;g