diff options
31 files changed, 3408 insertions, 1534 deletions
diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..d359ca6f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://EditorConfig.org + +root = true + +; Use 2 spaces for indentation in all Ruby files + +[*.rb] +indent_style = space +indent_size = 2 + +[Rakefile] +indent_style = space +indent_size = 2 + +[Gemfile*] +indent_style = space +indent_size = 2 + +[config.ru] +indent_style = space +indent_size = 2 diff --git a/.rbenv-version b/.rbenv-version index 0a95b9f5..f3a9c9a8 100644 --- a/.rbenv-version +++ b/.rbenv-version @@ -1 +1 @@ -1.9.2-p290 +1.9.3-p194 @@ -1 +1 @@ -rvm use 1.9.2 +rvm use 1.9.3 diff --git a/.themes/classic/.editorconfig b/.themes/classic/.editorconfig new file mode 100644 index 00000000..940fea3e --- /dev/null +++ b/.themes/classic/.editorconfig @@ -0,0 +1,44 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://EditorConfig.org + + +; Use 2 spaces for indentation in SCSS, JavaScript, HTML, and XML + +[*.scss] +indent_style = space +indent_size = 2 + +[*.js] +indent_style = space +indent_size = 2 + +[*.html] +indent_style = space +indent_size = 2 + +[*.xml] +indent_style = space +indent_size = 2 + + +; Use 4 spaces for indentation in Markdown files + +[*.md] +indent_style = space +indent_size = 4 + +[*.markdown] +indent_style = space +indent_size = 4 + + +; Override default indentation for some library files + +[jwplayer/glow/glow.xml] +indent_style = tab + +[libs/jXHR.js] +indent_style = tab + +[libs/swfobject-dynamic.js] +indent_style = tab diff --git a/.themes/classic/sass/base/_typography.scss b/.themes/classic/sass/base/_typography.scss index b68753fa..e9b6b19a 100644 --- a/.themes/classic/sass/base/_typography.scss +++ b/.themes/classic/sass/base/_typography.scss @@ -73,6 +73,7 @@ ol { list-style-type: decimal; ol { list-style-type: lower-roman; margin-bottom: 0px; }}} ul, ol { &, ul, ol { margin-left: 1.3em; }} +ul, ol { ul, ol { margin-bottom: 0em; }} strong { font-weight: bold; } diff --git a/.themes/classic/sass/partials/_syntax.scss b/.themes/classic/sass/partials/_syntax.scss index 77ac8d78..5465286f 100644 --- a/.themes/classic/sass/partials/_syntax.scss +++ b/.themes/classic/sass/partials/_syntax.scss @@ -1,44 +1,52 @@ .highlight, html .gist .gist-file .gist-syntax .gist-highlight { table td.code { width: 100%; } - .line-numbers { - text-align: right; - font-size: 13px; - line-height: 1.45em; - @if $solarized == light { - background: lighten($base03, 1) $noise-bg !important; - border-right: 1px solid darken($base02, 2) !important; - @include box-shadow(lighten($base03, 2) -1px 0 inset); - text-shadow: lighten($base02, 2) 0 -1px; - } @else { - background: $base02 $noise-bg !important; - border-right: 1px solid darken($base03, 2) !important; - @include box-shadow(lighten($base02, 2) -1px 0 inset); - text-shadow: darken($base02, 10) 0 -1px; - } - span { color: $base01 !important; } - padding: .8em !important; - @include border-radius(0); - } border: 1px solid $pre-border !important; } +.highlight .line-numbers, html .gist .gist-file .gist-syntax .highlight .line_numbers { + text-align: right; + font-size: 13px; + line-height: 1.45em; + @if $solarized == light { + background: lighten($base03, 1) $noise-bg !important; + border-right: 1px solid darken($base02, 2) !important; + @include box-shadow(lighten($base03, 2) -1px 0 inset); + text-shadow: lighten($base02, 2) 0 -1px; + } @else { + background: $base02 $noise-bg !important; + border-right: 1px solid darken($base03, 2) !important; + @include box-shadow(lighten($base02, 2) -1px 0 inset); + text-shadow: darken($base02, 10) 0 -1px; + } + span { color: $base01 !important; } + padding: .8em !important; + @include border-radius(0); +} + figure.code, .gist-file, pre { @include box-shadow(rgba(#000, .06) 0 0 10px); .highlight pre { @include box-shadow(none); } } +.gist .highlight, figure.code .highlight { + @include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px); +} html .gist .gist-file { margin-bottom: 1.8em; position: relative; border: none; padding-top: image-height("code_bg.png") !important; + .highlight { + margin-bottom: 0; + } .gist-syntax { border-bottom: 0 !important; background: none !important; - .gist-highlight{ + .gist-highlight { background: $base03 !important; - pre { - @extend .pre-code; - } + } + .highlight pre { + @extend .pre-code; + padding: 0; } } .gist-meta { @@ -107,12 +115,11 @@ p, li { } .pre-code { - @include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px); font-family: $mono !important; overflow: scroll; overflow-y: hidden; display: block; - padding: .8em !important; + padding: .8em; overflow-x: auto; line-height: 1.45em; background: $base03 $noise-bg !important; @@ -187,7 +194,7 @@ p, li { } .highlight, .gist-highlight { - pre { background: none; @include border-radius(none); border: none; padding: 0; margin-bottom: 0; } + pre { background: none; @include border-radius(0px); border: none; padding: 0; margin-bottom: 0; } margin-bottom: 1.8em; background: $base03; overflow-y: hidden; @@ -206,7 +213,9 @@ pre, .highlight, .gist-highlight { &::-webkit-scrollbar-thumb:horizontal { background: $solar-scroll-thumb; -webkit-border-radius: 4px; border-radius: 4px } } -.highlight code { @extend .pre-code; background: #000;} +.highlight code { + @extend .pre-code; background: #000; +} figure.code { background: none; padding: 0; @@ -250,4 +259,3 @@ figure.code { text-shadow: #cbcccc 0 1px 0; padding-left: 3em; } - diff --git a/.themes/classic/source/_includes/head.html b/.themes/classic/source/_includes/head.html index ef46a6ee..8de6679f 100644 --- a/.themes/classic/source/_includes/head.html +++ b/.themes/classic/source/_includes/head.html @@ -16,7 +16,7 @@ <meta name="MobileOptimized" content="320"> <meta name="viewport" content="width=device-width, initial-scale=1"> - {% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' }}{% endif %}{% endcapture %} + {% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{% if page.url contains site.category_dir %}/{% endif %}{{ page.url | remove:'index.html' }}{% endif %}{% endcapture %} <link rel="canonical" href="{{ canonical }}"> <link href="{{ root_url }}/favicon.png" rel="icon"> <link href="{{ root_url }}/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css"> diff --git a/.themes/classic/source/javascripts/ender.js b/.themes/classic/source/javascripts/ender.js index 1add349c..6d9c66ec 100644 --- a/.themes/classic/source/javascripts/ender.js +++ b/.themes/classic/source/javascripts/ender.js @@ -8,38 +8,38 @@ /*! * Ender: open module JavaScript framework (client-lib) - * copyright Dustin Diaz & Jacob Thornton 2011 (@ded @fat) - * http://ender.no.de + * copyright Dustin Diaz & Jacob Thornton 2011-2012 (@ded @fat) + * http://ender.jit.su * License MIT */ -!function(a){function d(a){var c=b[a]||window[a];if(!c)throw new Error("Requested module '"+a+"' has not been defined.");return c}function e(a,c){return b[a]=c}function f(a,b){for(var c in b)c!="noConflict"&&c!="_VERSION"&&(a[c]=b[c]);return a}function g(a,b,c){return h._select&&(typeof a=="string"||a.nodeName||a.length&&"item"in a||a==window)?(c=h._select(a,b),c.selector=a):c=isFinite(a.length)?a:[a],f(c,g)}function h(a,b){return g(a,b)}a.global=a;var b={},c=a.$;a.provide=e,a.require=d,f(h,{_VERSION:"0.3.4",fn:a.$&&a.$.fn||{},ender:function(a,b){f(b?g:h,a)},_select:function(a,b){return(b||document).querySelectorAll(a)}}),f(g,{forEach:function(a,b,c){for(c=0,l=this.length;c<l;++c)c in this&&a.call(b||this[c],this[c],c,this);return this},$:h}),h.noConflict=function(){return a.$=c,this},typeof module!="undefined"&&module.exports&&(module.exports=h),a.ender=a.$=a.ender||h}(this),!function(){var module={exports:{}},exports=module.exports; +(function(context){function require(identifier){var module=modules["$"+identifier]||window[identifier];if(!module)throw new Error("Ender Error: Requested module '"+identifier+"' has not been defined.");return module}function provide(name,what){return modules["$"+name]=what}function aug(o,o2){for(var k in o2)k!="noConflict"&&k!="_VERSION"&&(o[k]=o2[k]);return o}function Ender(s,r){var elements,i;this.selector=s;if(typeof s=="undefined"){elements=[];this.selector=""}else typeof s=="string"||s.nodeName||s.length&&"item"in s||s==window?elements=ender._select(s,r):elements=isFinite(s.length)?s:[s];this.length=elements.length;for(i=this.length;i--;)this[i]=elements[i]}function ender(s,r){return new Ender(s,r)}context.global=context;var modules={},old=context.$,oldEnder=context.ender,oldRequire=context.require,oldProvide=context.provide;context.provide=provide;context.require=require;Ender.prototype.forEach=function(fn,opt_scope){var i,l;for(i=0,l=this.length;i<l;++i)i in this&&fn.call(opt_scope||this[i],this[i],i,this);return this};Ender.prototype.$=ender;ender._VERSION="0.4.3-dev";ender.fn=Ender.prototype;ender.ender=function(o,chain){aug(chain?Ender.prototype:ender,o)};ender._select=function(s,r){return typeof s=="string"?(r||document).querySelectorAll(s):s.nodeName?[s]:s};ender.noConflict=function(callback){context.$=old;if(callback){context.provide=oldProvide;context.require=oldRequire;context.ender=oldEnder;typeof callback=="function"&&callback(require,provide,this)}return this};typeof module!="undefined"&&module.exports&&(module.exports=ender);context.ender=context.$=ender}(this));(function(){var module={exports:{}},exports=module.exports; /*! * Reqwest! A general purpose XHR connection manager - * (c) Dustin Diaz 2011 + * (c) Dustin Diaz 2012 * https://github.com/ded/reqwest * license MIT */ -!function(a,b){typeof define=="function"?define(b):typeof module!="undefined"?module.exports=b():this[a]=b()}("reqwest",function(){function handleReadyState(a,b,c){return function(){a&&a[readyState]==4&&(twoHundo.test(a.status)?b(a):c(a))}}function setHeaders(a,b){var c=b.headers||{};c.Accept=c.Accept||"text/javascript, text/html, application/xml, text/xml, */*",b.crossOrigin||(c["X-Requested-With"]=c["X-Requested-With"]||"XMLHttpRequest"),c[contentType]=c[contentType]||"application/x-www-form-urlencoded";for(var d in c)c.hasOwnProperty(d)&&a.setRequestHeader(d,c[d])}function getCallbackName(a,b){var c=a.jsonpCallback||"callback";if(a.url.slice(-(c.length+2))==c+"=?"){var d="reqwest_"+b;return a.url=a.url.substr(0,a.url.length-1)+d,d}var e=new RegExp(c+"=([\\w]+)");return a.url.match(e)[1]}function generalCallback(a){lastValue=a}function getRequest(a,b,c){if(a.type!="jsonp"){var g=xhr(),h=(a.method||"GET").toUpperCase(),i=typeof a=="string"?a:a.url,j=a.processData!==!1&&a.data&&typeof a.data!="string"?reqwest.toQueryString(a.data):a.data||null;return h=="GET"&&j&&j!==""&&(i+=(/\?/.test(i)?"&":"?")+j)&&(j=null),g.open(h,i,!0),setHeaders(g,a),g.onreadystatechange=handleReadyState(g,b,c),a.before&&a.before(g),g.send(j),g}var d=doc.createElement("script"),e=0,f=uniqid++;win[getCallbackName(a,f)]=generalCallback,d.type="text/javascript",d.src=a.url,d.async=!0,typeof d.onreadystatechange!="undefined"&&(d.event="onclick",d.htmlFor=d.id="_reqwest_"+f),d.onload=d.onreadystatechange=function(){if(d[readyState]&&d[readyState]!=="complete"&&d[readyState]!=="loaded"||e)return!1;d.onload=d.onreadystatechange=null,d.onclick&&d.onclick(),a.success&&a.success(lastValue),lastValue=undefined,head.removeChild(d),e=1},head.appendChild(d)}function Reqwest(a,b){this.o=a,this.fn=b,init.apply(this,arguments)}function setType(a){return/\.json$/.test(a)?"json":/\.jsonp$/.test(a)?"jsonp":/\.js$/.test(a)?"js":/\.html?$/.test(a)?"html":/\.xml$/.test(a)?"xml":"js"}function init(o,fn){function complete(a){o.timeout&&clearTimeout(self.timeout),self.timeout=null,o.complete&&o.complete(a)}function success(resp){var r=resp.responseText;if(r)switch(type){case"json":try{resp=win.JSON?win.JSON.parse(r):eval("("+r+")")}catch(err){return error(resp,"Could not parse JSON in response",err)}break;case"js":resp=eval(r);break;case"html":resp=r}fn(resp),o.success&&o.success(resp),complete(resp)}function error(a,b,c){o.error&&o.error(a,b,c),complete(a)}this.url=typeof o=="string"?o:o.url,this.timeout=null;var type=o.type||setType(this.url),self=this;fn=fn||function(){},o.timeout&&(this.timeout=setTimeout(function(){self.abort()},o.timeout)),this.request=getRequest(o,success,error)}function reqwest(a,b){return new Reqwest(a,b)}function normalize(a){return a?a.replace(/\r?\n/g,"\r\n"):""}function serial(a,b){var c=a.name,d=a.tagName.toLowerCase(),e;if(a.disabled||!c)return;switch(d){case"input":if(!/reset|button|image|file/i.test(a.type)){var f=/checkbox/i.test(a.type),g=/radio/i.test(a.type),h=a.value;(!f&&!g||a.checked)&&b(c,normalize(f&&h===""?"on":h))}break;case"textarea":b(c,normalize(a.value));break;case"select":if(a.type.toLowerCase()==="select-one")e=a.selectedIndex<0?null:a.options[a.selectedIndex],e&&!e.disabled&&b(c,normalize(e.value||e.text));else for(var i=0;a.length&&i<a.length;i++)e=a.options[i],e.selected&&!e.disabled&&b(c,normalize(e.value||e.text))}}function eachFormElement(){var a=this,b=function(b,c){for(var d=0;d<c.length;d++){var e=b[byTag](c[d]);for(var f=0;f<e.length;f++)serial(e[f],a)}};for(var c=0;c<arguments.length;c++){var d=arguments[c];/input|select|textarea/i.test(d.tagName)&&serial(d,a),b(d,["input","select","textarea"])}}function serializeQueryString(){return reqwest.toQueryString(reqwest.serializeArray.apply(null,arguments))}function serializeHash(){var a={};return eachFormElement.apply(function(b,c){b in a?(a[b]&&!isArray(a[b])&&(a[b]=[a[b]]),a[b].push(c)):a[b]=c},arguments),a}var context=this,win=window,doc=document,old=context.reqwest,twoHundo=/^20\d$/,byTag="getElementsByTagName",readyState="readyState",contentType="Content-Type",head=doc[byTag]("head")[0],uniqid=0,lastValue,xhr="XMLHttpRequest"in win?function(){return new XMLHttpRequest}:function(){return new ActiveXObject("Microsoft.XMLHTTP")};Reqwest.prototype={abort:function(){this.request.abort()},retry:function(){init.call(this,this.o,this.fn)}};var isArray=typeof Array.isArray=="function"?Array.isArray:function(a){return Object.prototype.toString.call(a)=="[object Array]"};return reqwest.serializeArray=function(){var a=[];return eachFormElement.apply(function(b,c){a.push({name:b,value:c})},arguments),a},reqwest.serialize=function(){if(arguments.length===0)return"";var a,b,c=Array.prototype.slice.call(arguments,0);return a=c.pop(),a&&a.nodeType&&c.push(a)&&(a=null),a&&(a=a.type),a=="map"?b=serializeHash:a=="array"?b=reqwest.serializeArray:b=serializeQueryString,b.apply(null,c)},reqwest.toQueryString=function(a){var b="",c,d=encodeURIComponent,e=function(a,c){b+=d(a)+"="+d(c)+"&"};if(isArray(a))for(c=0;a&&c<a.length;c++)e(a[c].name,a[c].value);else for(var f in a){if(!Object.hasOwnProperty.call(a,f))continue;var g=a[f];if(isArray(g))for(c=0;c<g.length;c++)e(f,g[c]);else e(f,a[f])}return b.replace(/&$/,"").replace(/%20/g,"+")},reqwest.noConflict=function(){return context.reqwest=old,this},reqwest}),provide("reqwest",module.exports),!function(a){var b=require("reqwest"),c=function(a){return function(){var c=(this&&this.length>0?this:[]).concat(Array.prototype.slice.call(arguments,0));return b[a].apply(null,c)}},d=c("serialize"),e=c("serializeArray");a.ender({ajax:b,serialize:d,serializeArray:e,toQueryString:b.toQueryString}),a.ender({serialize:d,serializeArray:e},!0)}(ender)}(),!function(){var a={exports:{}},b=a.exports; +;!function(name,definition){typeof module!="undefined"?module.exports=definition():typeof define=="function"&&define.amd?define(definition):this[name]=definition()}("reqwest",function(){function handleReadyState(o,success,error){return function(){o&&o[readyState]==4&&(twoHundo.test(o.status)?success(o):error(o))}}function setHeaders(http,o){var headers=o.headers||{},h;headers.Accept=headers.Accept||defaultHeaders.accept[o.type]||defaultHeaders.accept["*"];!o.crossOrigin&&!headers[requestedWith]&&(headers[requestedWith]=defaultHeaders.requestedWith);headers[contentType]||(headers[contentType]=o.contentType||defaultHeaders.contentType);for(h in headers)headers.hasOwnProperty(h)&&http.setRequestHeader(h,headers[h])}function setCredentials(http,o){typeof o.withCredentials!="undefined"&&typeof http.withCredentials!="undefined"&&(http.withCredentials=!!o.withCredentials)}function generalCallback(data){lastValue=data}function urlappend(url,s){return url+(/\?/.test(url)?"&":"?")+s}function handleJsonp(o,fn,err,url){var reqId=uniqid++,cbkey=o.jsonpCallback||"callback",cbval=o.jsonpCallbackName||reqwest.getcallbackPrefix(reqId),cbreg=new RegExp("((^|\\?|&)"+cbkey+")=([^&]+)"),match=url.match(cbreg),script=doc.createElement("script"),loaded=0;match?match[3]==="?"?url=url.replace(cbreg,"$1="+cbval):cbval=match[3]:url=urlappend(url,cbkey+"="+cbval);win[cbval]=generalCallback;script.type="text/javascript";script.src=url;script.async=!0;if(typeof script.onreadystatechange!="undefined"){script.event="onclick";script.htmlFor=script.id="_reqwest_"+reqId}script.onload=script.onreadystatechange=function(){if(script[readyState]&&script[readyState]!=="complete"&&script[readyState]!=="loaded"||loaded)return!1;script.onload=script.onreadystatechange=null;script.onclick&&script.onclick();o.success&&o.success(lastValue);lastValue=undefined;head.removeChild(script);loaded=1};head.appendChild(script)}function getRequest(o,fn,err){var method=(o.method||"GET").toUpperCase(),url=typeof o=="string"?o:o.url,data=o.processData!==!1&&o.data&&typeof o.data!="string"?reqwest.toQueryString(o.data):o.data||null,http;if((o.type=="jsonp"||method=="GET")&&data){url=urlappend(url,data);data=null}if(o.type=="jsonp")return handleJsonp(o,fn,err,url);http=xhr();http.open(method,url,!0);setHeaders(http,o);setCredentials(http,o);http.onreadystatechange=handleReadyState(http,fn,err);o.before&&o.before(http);http.send(data);return http}function Reqwest(o,fn){this.o=o;this.fn=fn;init.apply(this,arguments)}function setType(url){var m=url.match(/\.(json|jsonp|html|xml)(\?|$)/);return m?m[1]:"js"}function init(o,fn){function complete(resp){o.timeout&&clearTimeout(self.timeout);self.timeout=null;while(self._completeHandlers.length>0)self._completeHandlers.shift()(resp)}function success(resp){var r=resp.responseText;if(r)switch(type){case"json":try{resp=win.JSON?win.JSON.parse(r):eval("("+r+")")}catch(err){return error(resp,"Could not parse JSON in response",err)}break;case"js":resp=eval(r);break;case"html":resp=r;break;case"xml":resp=resp.responseXML}self._responseArgs.resp=resp;self._fulfilled=!0;fn(resp);while(self._fulfillmentHandlers.length>0)self._fulfillmentHandlers.shift()(resp);complete(resp)}function error(resp,msg,t){self._responseArgs.resp=resp;self._responseArgs.msg=msg;self._responseArgs.t=t;self._erred=!0;while(self._errorHandlers.length>0)self._errorHandlers.shift()(resp,msg,t);complete(resp)}this.url=typeof o=="string"?o:o.url;this.timeout=null;this._fulfilled=!1;this._fulfillmentHandlers=[];this._errorHandlers=[];this._completeHandlers=[];this._erred=!1;this._responseArgs={};var self=this,type=o.type||setType(this.url);fn=fn||function(){};o.timeout&&(this.timeout=setTimeout(function(){self.abort()},o.timeout));o.success&&this._fulfillmentHandlers.push(function(){o.success.apply(o,arguments)});o.error&&this._errorHandlers.push(function(){o.error.apply(o,arguments)});o.complete&&this._completeHandlers.push(function(){o.complete.apply(o,arguments)});this.request=getRequest(o,success,error)}function reqwest(o,fn){return new Reqwest(o,fn)}function normalize(s){return s?s.replace(/\r?\n/g,"\r\n"):""}function serial(el,cb){var n=el.name,t=el.tagName.toLowerCase(),optCb=function(o){o&&!o.disabled&&cb(n,normalize(o.attributes.value&&o.attributes.value.specified?o.value:o.text))};if(el.disabled||!n)return;switch(t){case"input":if(!/reset|button|image|file/i.test(el.type)){var ch=/checkbox/i.test(el.type),ra=/radio/i.test(el.type),val=el.value;(!ch&&!ra||el.checked)&&cb(n,normalize(ch&&val===""?"on":val))}break;case"textarea":cb(n,normalize(el.value));break;case"select":if(el.type.toLowerCase()==="select-one")optCb(el.selectedIndex>=0?el.options[el.selectedIndex]:null);else for(var i=0;el.length&&i<el.length;i++)el.options[i].selected&&optCb(el.options[i])}}function eachFormElement(){var cb=this,e,i,j,serializeSubtags=function(e,tags){for(var i=0;i<tags.length;i++){var fa=e[byTag](tags[i]);for(j=0;j<fa.length;j++)serial(fa[j],cb)}};for(i=0;i<arguments.length;i++){e=arguments[i];/input|select|textarea/i.test(e.tagName)&&serial(e,cb);serializeSubtags(e,["input","select","textarea"])}}function serializeQueryString(){return reqwest.toQueryString(reqwest.serializeArray.apply(null,arguments))}function serializeHash(){var hash={};eachFormElement.apply(function(name,value){if(name in hash){hash[name]&&!isArray(hash[name])&&(hash[name]=[hash[name]]);hash[name].push(value)}else hash[name]=value},arguments);return hash}var win=window,doc=document,twoHundo=/^20\d$/,byTag="getElementsByTagName",readyState="readyState",contentType="Content-Type",requestedWith="X-Requested-With",head=doc[byTag]("head")[0],uniqid=0,callbackPrefix="reqwest_"+ +(new Date),lastValue,xmlHttpRequest="XMLHttpRequest",isArray=typeof Array.isArray=="function"?Array.isArray:function(a){return a instanceof Array},defaultHeaders={contentType:"application/x-www-form-urlencoded",requestedWith:xmlHttpRequest,accept:{"*":"text/javascript, text/html, application/xml, text/xml, */*",xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript",js:"application/javascript, text/javascript"}},xhr=win[xmlHttpRequest]?function(){return new XMLHttpRequest}:function(){return new ActiveXObject("Microsoft.XMLHTTP")};Reqwest.prototype={abort:function(){this.request.abort()},retry:function(){init.call(this,this.o,this.fn)},then:function(success,fail){if(this._fulfilled)success(this._responseArgs.resp);else if(this._erred)fail(this._responseArgs.resp,this._responseArgs.msg,this._responseArgs.t);else{this._fulfillmentHandlers.push(success);this._errorHandlers.push(fail)}return this},always:function(fn){this._fulfilled||this._erred?fn(this._responseArgs.resp):this._completeHandlers.push(fn);return this},fail:function(fn){this._erred?fn(this._responseArgs.resp,this._responseArgs.msg,this._responseArgs.t):this._errorHandlers.push(fn);return this}};reqwest.serializeArray=function(){var arr=[];eachFormElement.apply(function(name,value){arr.push({name:name,value:value})},arguments);return arr};reqwest.serialize=function(){if(arguments.length===0)return"";var opt,fn,args=Array.prototype.slice.call(arguments,0);opt=args.pop();opt&&opt.nodeType&&args.push(opt)&&(opt=null);opt&&(opt=opt.type);opt=="map"?fn=serializeHash:opt=="array"?fn=reqwest.serializeArray:fn=serializeQueryString;return fn.apply(null,args)};reqwest.toQueryString=function(o){var qs="",i,enc=encodeURIComponent,push=function(k,v){qs+=enc(k)+"="+enc(v)+"&"};if(isArray(o))for(i=0;o&&i<o.length;i++)push(o[i].name,o[i].value);else for(var k in o){if(!Object.hasOwnProperty.call(o,k))continue;var v=o[k];if(isArray(v))for(i=0;i<v.length;i++)push(k,v[i]);else push(k,o[k])}return qs.replace(/&$/,"").replace(/%20/g,"+")};reqwest.getcallbackPrefix=function(reqId){return callbackPrefix};reqwest.compat=function(o,fn){if(o){o.type&&(o.method=o.type)&&delete o.type;o.dataType&&(o.type=o.dataType);o.jsonpCallback&&(o.jsonpCallbackName=o.jsonpCallback)&&delete o.jsonpCallback;o.jsonp&&(o.jsonpCallback=o.jsonp)}return new Reqwest(o,fn)};return reqwest});provide("reqwest",module.exports);!function($){var r=require("reqwest"),integrate=function(method){return function(){var args=Array.prototype.slice.call(arguments,0),i=this&&this.length||0;while(i--)args.unshift(this[i]);return r[method].apply(null,args)}},s=integrate("serialize"),sa=integrate("serializeArray");$.ender({ajax:r,serialize:r.serialize,serializeArray:r.serializeArray,toQueryString:r.toQueryString});$.ender({serialize:s,serializeArray:sa},!0)}(ender)})();(function(){var module={exports:{}},exports=module.exports; /*! - * bean.js - copyright Jacob Thornton 2011 + * Bean - copyright (c) Jacob Thornton 2011-2012 * https://github.com/fat/bean - * MIT License - * special thanks to: - * dean edwards: http://dean.edwards.name/ - * dperini: https://github.com/dperini/nwevents - * the entire mootools team: github.com/mootools/mootools-core + * MIT license */ -!function(b,c){typeof define=="function"?define(c):typeof a!="undefined"?a.exports=c():this[b]=c()}("bean",function(){function F(a){var b=a.relatedTarget;return b?b!=this&&b.prefix!="xul"&&!/document/.test(this.toString())&&!p(this,b):b===null}var a=window,b=1,c={},d={},e=/over|out/,f=/[^\.]*(?=\..*)\.|.*/,g=/\..*/,h="addEventListener",i="attachEvent",j="removeEventListener",k="detachEvent",l=document||{},m=l.documentElement||{},n=m[h],o=n?h:i,p=function(a,b){var c=b.parentNode;while(c!==null){if(c==a)return!0;c=c.parentNode}},q=function(a,c){return a.__uid=c&&c+"::"+b++||a.__uid||b++},r=function(a){var b=q(a);return c[b]=c[b]||{}},s=n?function(a,b,c,d){a[d?h:j](b,c,!1)}:function(a,b,c,d,e){e&&d&&a["_on"+e]===null&&(a["_on"+e]=0),a[d?i:k]("on"+b,c)},t=function(b,c,d){return function(e){return e=D(e||((this.ownerDocument||this.document||this).parentWindow||a).event),c.apply(b,[e].concat(d))}},u=function(b,c,d,e,f){return function(g){if(e?e.apply(this,arguments):n?!0:g&&g.propertyName=="_on"+d||!g)g=g?D(g||((this.ownerDocument||this.document||this).parentWindow||a).event):null,c.apply(b,Array.prototype.slice.call(arguments,g?0:1).concat(f))}},v=function(a,b,c,e){var h=b.replace(g,""),i=r(a),j=i[h]||(i[h]={}),k=c,l=q(c,b.replace(f,""));if(j[l])return a;var m=G[h];m&&(c=m.condition?u(a,c,h,m.condition):c,h=m.base||h);var p=E[h];c=p?t(a,c,e):u(a,c,h,!1,e),p=n||p;if(h=="unload"){var v=c;c=function(){w(a,h,c)&&v()}}return a[o]&&s(a,p?h:"propertychange",c,!0,!p&&h),j[l]=c,c.__uid=l,c.__originalFn=k,h=="unload"?a:d[q(a)]=a},w=function(a,b,c){function l(b){c=j[k][b];if(!c)return;delete j[k][b];if(a[o]){k=G[k]?G[k].base:k;var d=n||E[k];s(a,d?k:"propertychange",c,!1,!d&&k)}}var d,e,h,i,j=r(a),k=b.replace(g,"");if(!j||!j[k])return a;e=b.replace(f,""),h=e?e.split("."):[c.__uid],l(e);for(i=h.length;i--;l(h[i]));return a},x=function(a,b,c){return function(d){var e=typeof a=="string"?c(a,this):a;for(var f=d.target;f&&f!=this;f=f.parentNode)for(var g=e.length;g--;)if(e[g]==f)return b.apply(f,arguments)}},y=function(a,b,c,d,e){if(typeof b=="object"&&!c)for(var f in b)b.hasOwnProperty(f)&&y(a,f,b[f]);else{var g=typeof c=="string",h=(g?c:b).split(" ");c=g?x(b,d,e):c;for(var i=h.length;i--;)v(a,h[i],c,Array.prototype.slice.call(arguments,g?4:3))}return a},z=function(a,b,c){var d,e,h,i,j,k=typeof b=="string",l=k&&b.replace(f,""),m=w,n=r(a);l=l&&l.split(".");if(k&&/\s/.test(b)){b=b.split(" "),j=b.length-1;while(z(a,b[j])&&j--);return a}i=k?b.replace(g,""):b;if(!n||l||k&&!n[i]){for(d in n)if(n.hasOwnProperty(d))for(j in n[d])for(e=l.length;e--;)n[d].hasOwnProperty(j)&&(new RegExp("^"+l[e]+"::\\d*(\\..*)?$")).test(j)&&m(a,[d,j].join("."));return a}if(typeof c=="function")m(a,i,c);else if(l)m(a,b);else{m=i?m:z,h=k&&i,i=i?c||n[i]||i:n;for(d in i)i.hasOwnProperty(d)&&(m(a,h||d,i[d]),delete i[d])}return a},A=function(a,b,c){var d,e,h,i,j=b.split(" ");for(h=j.length;h--;){b=j[h].replace(g,"");var k=E[b],l=j[h].replace(f,""),m=r(a)[b];if(l){l=l.split(".");for(e=l.length;e--;)for(i in m)m.hasOwnProperty(i)&&(new RegExp("^"+l[e]+"::\\d*(\\..*)?$")).test(i)&&m[i].apply(a,[!1].concat(c))}else if(!c&&a[o])B(k,b,a);else for(e in m)m.hasOwnProperty(e)&&m[e].apply(a,[!1].concat(c))}return a},B=n?function(b,c,d){evt=document.createEvent(b?"HTMLEvents":"UIEvents"),evt[b?"initEvent":"initUIEvent"](c,!0,!0,a,1),d.dispatchEvent(evt)}:function(a,b,c){a?c.fireEvent("on"+b,document.createEventObject()):c["_on"+b]++},C=function(a,b,c){var d=r(b),e,f,g=q(a);e=c?d[c]:d;for(f in e)e.hasOwnProperty(f)&&(c?y:C)(a,c||b,c?e[f].__originalFn:f);return a},D=function(a){var b={};if(!a)return b;var c=a.type,d=a.target||a.srcElement;b.preventDefault=D.preventDefault(a),b.stopPropagation=D.stopPropagation(a),b.target=d&&d.nodeType==3?d.parentNode:d;if(~c.indexOf("key"))b.keyCode=a.which||a.keyCode;else if(/click|mouse|menu/i.test(c)){b.rightClick=a.which==3||a.button==2,b.pos={x:0,y:0};if(a.pageX||a.pageY)b.clientX=a.pageX,b.clientY=a.pageY;else if(a.clientX||a.clientY)b.clientX=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,b.clientY=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;e.test(c)&&(b.relatedTarget=a.relatedTarget||a[(c=="mouseover"?"from":"to")+"Element"])}for(var f in a)f in b||(b[f]=a[f]);return b};D.preventDefault=function(a){return function(){a.preventDefault?a.preventDefault():a.returnValue=!1}},D.stopPropagation=function(a){return function(){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}};var E={click:1,dblclick:1,mouseup:1,mousedown:1,contextmenu:1,mousewheel:1,DOMMouseScroll:1,mouseover:1,mouseout:1,mousemove:1,selectstart:1,selectend:1,keydown:1,keypress:1,keyup:1,orientationchange:1,touchstart:1,touchmove:1,touchend:1,touchcancel:1,gesturestart:1,gesturechange:1,gestureend:1,focus:1,blur:1,change:1,reset:1,select:1,submit:1,load:1,unload:1,beforeunload:1,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1},G={mouseenter:{base:"mouseover",condition:F},mouseleave:{base:"mouseout",condition:F},mousewheel:{base:/Firefox/.test(navigator.userAgent)?"DOMMouseScroll":"mousewheel"}},H={add:y,remove:z,clone:C,fire:A},I=function(a){var b=z(a).__uid;b&&(delete d[b],delete c[b])};return a[i]&&y(a,"unload",function(){for(var b in d)d.hasOwnProperty(b)&&I(d[b]);a.CollectGarbage&&CollectGarbage()}),H.noConflict=function(){return context.bean=old,this},H}),provide("bean",a.exports),!function(a){var b=require("bean"),c=function(c,d,e){var f=d?[d]:[];return function(){for(var e,g=0,h=this.length;g<h;g++)e=[this[g]].concat(f,Array.prototype.slice.call(arguments,0)),e.length==4&&e.push(a),!arguments.length&&c=="add"&&d&&(c="fire"),b[c].apply(this,e);return this}},d=c("add"),e=c("remove"),f=c("fire"),g={on:d,addListener:d,bind:d,listen:d,delegate:d,unbind:e,unlisten:e,removeListener:e,undelegate:e,emit:f,trigger:f,cloneEvents:c("clone"),hover:function(a,c,d){for(d=this.length;d--;)b.add.call(this,this[d],"mouseenter",a),b.add.call(this,this[d],"mouseleave",c);return this}},h,i=["blur","change","click","dblclick","error","focus","focusin","focusout","keydown","keypress","keyup","load","mousedown","mouseenter","mouseleave","mouseout","mouseover","mouseup","mousemove","resize","scroll","select","submit","unload"];for(h=i.length;h--;)g[i[h]]=c("add",i[h]);a.ender(g,!0)}(ender)}(),!function(){var a={exports:{}},b=a.exports; +;!function(name,context,definition){typeof module!="undefined"&&module.exports?module.exports=definition(name,context):typeof define=="function"&&typeof define.amd=="object"?define(definition):context[name]=definition(name,context)}("bean",this,function(name,context){var win=window,old=context[name],namespaceRegex=/[^\.]*(?=\..*)\.|.*/,nameRegex=/\..*/,addEvent="addEventListener",removeEvent="removeEventListener",doc=document||{},root=doc.documentElement||{},W3C_MODEL=root[addEvent],eventSupport=W3C_MODEL?addEvent:"attachEvent",ONE={},slice=Array.prototype.slice,str2arr=function(s,d){return s.split(d||" ")},isString=function(o){return typeof o=="string"},isFunction=function(o){return typeof o=="function"},standardNativeEvents="click dblclick mouseup mousedown contextmenu mousewheel mousemultiwheel DOMMouseScroll mouseover mouseout mousemove selectstart selectend keydown keypress keyup orientationchange focus blur change reset select submit load unload beforeunload resize move DOMContentLoaded readystatechange message error abort scroll ",w3cNativeEvents="show input invalid touchstart touchmove touchend touchcancel gesturestart gesturechange gestureend textinputreadystatechange pageshow pagehide popstate hashchange offline online afterprint beforeprint dragstart dragenter dragover dragleave drag drop dragend loadstart progress suspend emptied stalled loadmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate play pause ratechange volumechange cuechange checking noupdate downloading cached updateready obsolete ",nativeEvents=function(hash,events,i){for(i=0;i<events.length;i++)events[i]&&(hash[events[i]]=1);return hash}({},str2arr(standardNativeEvents+(W3C_MODEL?w3cNativeEvents:""))),customEvents=function(){var isAncestor="compareDocumentPosition"in root?function(element,container){return container.compareDocumentPosition&&(container.compareDocumentPosition(element)&16)===16}:"contains"in root?function(element,container){container=container.nodeType===9||container===window?root:container;return container!==element&&container.contains(element)}:function(element,container){while(element=element.parentNode)if(element===container)return 1;return 0},check=function(event){var related=event.relatedTarget;return related?related!==this&&related.prefix!=="xul"&&!/document/.test(this.toString())&&!isAncestor(related,this):related==null};return{mouseenter:{base:"mouseover",condition:check},mouseleave:{base:"mouseout",condition:check},mousewheel:{base:/Firefox/.test(navigator.userAgent)?"DOMMouseScroll":"mousewheel"}}}(),Event=function(){var commonProps=str2arr("altKey attrChange attrName bubbles cancelable ctrlKey currentTarget detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey srcElement target timeStamp type view which propertyName"),mouseProps=commonProps.concat(str2arr("button buttons clientX clientY dataTransfer fromElement offsetX offsetY pageX pageY screenX screenY toElement")),mouseWheelProps=mouseProps.concat(str2arr("wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ axis")),keyProps=commonProps.concat(str2arr("char charCode key keyCode keyIdentifier keyLocation location")),textProps=commonProps.concat(str2arr("data")),touchProps=commonProps.concat(str2arr("touches targetTouches changedTouches scale rotation")),messageProps=commonProps.concat(str2arr("data origin source")),stateProps=commonProps.concat(str2arr("state")),overOutRegex=/over|out/,typeFixers=[{reg:/key/i,fix:function(event,newEvent){newEvent.keyCode=event.keyCode||event.which;return keyProps}},{reg:/click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i,fix:function(event,newEvent,type){newEvent.rightClick=event.which===3||event.button===2;newEvent.pos={x:0,y:0};if(event.pageX||event.pageY){newEvent.clientX=event.pageX;newEvent.clientY=event.pageY}else if(event.clientX||event.clientY){newEvent.clientX=event.clientX+doc.body.scrollLeft+root.scrollLeft;newEvent.clientY=event.clientY+doc.body.scrollTop+root.scrollTop}overOutRegex.test(type)&&(newEvent.relatedTarget=event.relatedTarget||event[(type=="mouseover"?"from":"to")+"Element"]);return mouseProps}},{reg:/mouse.*(wheel|scroll)/i,fix:function(){return mouseWheelProps}},{reg:/^text/i,fix:function(){return textProps}},{reg:/^touch|^gesture/i,fix:function(){return touchProps}},{reg:/^message$/i,fix:function(){return messageProps}},{reg:/^popstate$/i,fix:function(){return stateProps}},{reg:/.*/,fix:function(){return commonProps}}],typeFixerMap={},Event=function(event,element,isNative){if(!arguments.length)return;event=event||((element.ownerDocument||element.document||element).parentWindow||win).event;this.originalEvent=event;this.isNative=isNative;this.isBean=!0;if(!event)return;var type=event.type,target=event.target||event.srcElement,i,l,p,props,fixer;this.target=target&&target.nodeType===3?target.parentNode:target;if(isNative){fixer=typeFixerMap[type];if(!fixer)for(i=0,l=typeFixers.length;i<l;i++)if(typeFixers[i].reg.test(type)){typeFixerMap[type]=fixer=typeFixers[i].fix;break}props=fixer(event,this,type);for(i=props.length;i--;)!((p=props[i])in this)&&p in event&&(this[p]=event[p])}};Event.prototype.preventDefault=function(){this.originalEvent.preventDefault?this.originalEvent.preventDefault():this.originalEvent.returnValue=!1};Event.prototype.stopPropagation=function(){this.originalEvent.stopPropagation?this.originalEvent.stopPropagation():this.originalEvent.cancelBubble=!0};Event.prototype.stop=function(){this.preventDefault();this.stopPropagation();this.stopped=!0};Event.prototype.stopImmediatePropagation=function(){this.originalEvent.stopImmediatePropagation&&this.originalEvent.stopImmediatePropagation();this.isImmediatePropagationStopped=function(){return!0}};Event.prototype.isImmediatePropagationStopped=function(){return this.originalEvent.isImmediatePropagationStopped&&this.originalEvent.isImmediatePropagationStopped()};Event.prototype.clone=function(currentTarget){var ne=new Event(this,this.element,this.isNative);ne.currentTarget=currentTarget;return ne};return Event}(),targetElement=function(element,isNative){return!W3C_MODEL&&!isNative&&(element===doc||element===win)?root:element},RegEntry=function(){var wrappedHandler=function(element,fn,condition,args){var call=function(event,eargs){return fn.apply(element,args?slice.call(eargs,event?0:1).concat(args):eargs)},findTarget=function(event,eventElement){return fn.__beanDel?fn.__beanDel.ft(event.target,element):eventElement},handler=condition?function(event){var target=findTarget(event,this);if(condition.apply(target,arguments)){event&&(event.currentTarget=target);return call(event,arguments)}}:function(event){fn.__beanDel&&(event=event.clone(findTarget(event)));return call(event,arguments)};handler.__beanDel=fn.__beanDel;return handler},RegEntry=function(element,type,handler,original,namespaces,args,root){var customType=customEvents[type],isNative;type=="unload"&&(handler=once(removeListener,element,type,handler,original));if(customType){customType.condition&&(handler=wrappedHandler(element,handler,customType.condition,args));type=customType.base||type}this.isNative=isNative=nativeEvents[type]&&!!element[eventSupport];this.customType=!W3C_MODEL&&!isNative&&type;this.element=element;this.type=type;this.original=original;this.namespaces=namespaces;this.eventType=W3C_MODEL||isNative?type:"propertychange";this.target=targetElement(element,isNative);this[eventSupport]=!!this.target[eventSupport];this.root=root;this.handler=wrappedHandler(element,handler,null,args)};RegEntry.prototype.inNamespaces=function(checkNamespaces){var i,j,c=0;if(!checkNamespaces)return!0;if(!this.namespaces)return!1;for(i=checkNamespaces.length;i--;)for(j=this.namespaces.length;j--;)checkNamespaces[i]==this.namespaces[j]&&c++;return checkNamespaces.length===c};RegEntry.prototype.matches=function(checkElement,checkOriginal,checkHandler){return this.element===checkElement&&(!checkOriginal||this.original===checkOriginal)&&(!checkHandler||this.handler===checkHandler)};return RegEntry}(),registry=function(){var map={},forAll=function(element,type,original,handler,root,fn){var pfx=root?"r":"$";if(!type||type=="*")for(var t in map)t.charAt(0)==pfx&&forAll(element,t.substr(1),original,handler,root,fn);else{var i=0,l,list=map[pfx+type],all=element=="*";if(!list)return;for(l=list.length;i<l;i++)if((all||list[i].matches(element,original,handler))&&!fn(list[i],list,i,type))return}},has=function(element,type,original,root){var i,list=map[(root?"r":"$")+type];if(list)for(i=list.length;i--;)if(!list[i].root&&list[i].matches(element,original,null))return!0;return!1},get=function(element,type,original,root){var entries=[];forAll(element,type,original,null,root,function(entry){return entries.push(entry)});return entries},put=function(entry){var has=!entry.root&&!this.has(entry.element,entry.type,null,!1),key=(entry.root?"r":"$")+entry.type;(map[key]||(map[key]=[])).push(entry);return has},del=function(entry){forAll(entry.element,entry.type,null,entry.handler,entry.root,function(entry,list,i){list.splice(i,1);entry.removed=!0;list.length===0&&delete map[(entry.root?"r":"$")+entry.type];return!1})},entries=function(){var t,entries=[];for(t in map)t.charAt(0)=="$"&&(entries=entries.concat(map[t]));return entries};return{has:has,get:get,put:put,del:del,entries:entries}}(),selectorEngine,setSelectorEngine=function(e){arguments.length?selectorEngine=e:selectorEngine=doc.querySelectorAll?function(s,r){return r.querySelectorAll(s)}:function(){throw new Error("Bean: No selector engine installed")}},rootListener=function(event,type){if(!W3C_MODEL&&type&&event&&event.propertyName!="_on"+type)return;var listeners=registry.get(this,type||event.type,null,!1),l=listeners.length,i=0;event=new Event(event,this,!0);type&&(event.type=type);for(;i<l&&!event.isImmediatePropagationStopped();i++)listeners[i].removed||listeners[i].handler.call(this,event)},listener=W3C_MODEL?function(element,type,add){element[add?addEvent:removeEvent](type,rootListener,!1)}:function(element,type,add,custom){var entry;if(add){registry.put(entry=new RegEntry(element,custom||type,function(event){rootListener.call(element,event,custom)},rootListener,null,null,!0));custom&&element["_on"+custom]==null&&(element["_on"+custom]=0);entry.target.attachEvent("on"+entry.eventType,entry.handler)}else{entry=registry.get(element,custom||type,rootListener,!0)[0];if(entry){entry.target.detachEvent("on"+entry.eventType,entry.handler);registry.del(entry)}}},once=function(rm,element,type,fn,originalFn){return function(){fn.apply(this,arguments);rm(element,type,originalFn)}},removeListener=function(element,orgType,handler,namespaces){var type=orgType&&orgType.replace(nameRegex,""),handlers=registry.get(element,type,null,!1),removed={},i,l;for(i=0,l=handlers.length;i<l;i++)if((!handler||handlers[i].original===handler)&&handlers[i].inNamespaces(namespaces)){registry.del(handlers[i]);!removed[handlers[i].eventType]&&handlers[i][eventSupport]&&(removed[handlers[i].eventType]={t:handlers[i].eventType,c:handlers[i].type})}for(i in removed)registry.has(element,removed[i].t,null,!1)||listener(element,removed[i].t,!1,removed[i].c)},delegate=function(selector,fn){var findTarget=function(target,root){var i,array=isString(selector)?selectorEngine(selector,root):selector;for(;target&&target!==root;target=target.parentNode)for(i=array.length;i--;)if(array[i]===target)return target},handler=function(e){var match=findTarget(e.target,this);match&&fn.apply(match,arguments)};handler.__beanDel={ft:findTarget,selector:selector};return handler},fireListener=W3C_MODEL?function(isNative,type,element){var evt=doc.createEvent(isNative?"HTMLEvents":"UIEvents");evt[isNative?"initEvent":"initUIEvent"](type,!0,!0,win,1);element.dispatchEvent(evt)}:function(isNative,type,element){element=targetElement(element,isNative);isNative?element.fireEvent("on"+type,doc.createEventObject()):element["_on"+type]++},off=function(element,typeSpec,fn){var isTypeStr=isString(typeSpec),k,type,namespaces,i;if(isTypeStr&&typeSpec.indexOf(" ")>0){typeSpec=str2arr(typeSpec);for(i=typeSpec.length;i--;)off(element,typeSpec[i],fn);return element}type=isTypeStr&&typeSpec.replace(nameRegex,"");type&&customEvents[type]&&(type=customEvents[type].base);if(!typeSpec||isTypeStr){if(namespaces=isTypeStr&&typeSpec.replace(namespaceRegex,""))namespaces=str2arr(namespaces,".");removeListener(element,type,fn,namespaces)}else if(isFunction(typeSpec))removeListener(element,null,typeSpec);else for(k in typeSpec)typeSpec.hasOwnProperty(k)&&off(element,k,typeSpec[k]);return element},on=function(element,events,selector,fn){var originalFn,type,types,i,args,entry,first;if(selector===undefined&&typeof events=="object"){for(type in events)events.hasOwnProperty(type)&&on.call(this,element,type,events[type]);return}if(!isFunction(selector)){originalFn=fn;args=slice.call(arguments,4);fn=delegate(selector,originalFn,selectorEngine)}else{args=slice.call(arguments,3);fn=originalFn=selector}types=str2arr(events);this===ONE&&(fn=once(off,element,events,fn,originalFn));for(i=types.length;i--;){first=registry.put(entry=new RegEntry(element,types[i].replace(nameRegex,""),fn,originalFn,str2arr(types[i].replace(namespaceRegex,""),"."),args,!1));entry[eventSupport]&&first&&listener(element,entry.eventType,!0,entry.customType)}return element},add=function(element,events,fn,delfn){return on.apply(null,isString(fn)?[element,fn,events,delfn].concat(arguments.length>3?slice.call(arguments,5):[]):slice.call(arguments))},one=function(){return on.apply(ONE,arguments)},fire=function(element,type,args){var types=str2arr(type),i,j,l,names,handlers;for(i=types.length;i--;){type=types[i].replace(nameRegex,"");if(names=types[i].replace(namespaceRegex,""))names=str2arr(names,".");if(!names&&!args&&element[eventSupport])fireListener(nativeEvents[type],type,element);else{handlers=registry.get(element,type,null,!1);args=[!1].concat(args);for(j=0,l=handlers.length;j<l;j++)handlers[j].inNamespaces(names)&&handlers[j].handler.apply(element,args)}}return element},clone=function(element,from,type){var handlers=registry.get(from,type,null,!1),l=handlers.length,i=0,args,beanDel;for(;i<l;i++)if(handlers[i].original){args=[element,handlers[i].type];(beanDel=handlers[i].handler.__beanDel)&&args.push(beanDel.selector);args.push(handlers[i].original);on.apply(null,args)}return element},bean={on:on,add:add,one:one,off:off,remove:off,clone:clone,fire:fire,setSelectorEngine:setSelectorEngine,noConflict:function(){context[name]=old;return this}};if(win.attachEvent){var cleanup=function(){var i,entries=registry.entries();for(i in entries)entries[i].type&&entries[i].type!=="unload"&&off(entries[i].element,entries[i].type);win.detachEvent("onunload",cleanup);win.CollectGarbage&&win.CollectGarbage()};win.attachEvent("onunload",cleanup)}setSelectorEngine();return bean});provide("bean",module.exports);!function($){var b=require("bean"),integrate=function(method,type,method2){var _args=type?[type]:[];return function(){for(var i=0,l=this.length;i<l;i++){!arguments.length&&method=="on"&&type&&(method="fire");b[method].apply(this,[this[i]].concat(_args,Array.prototype.slice.call(arguments,0)))}return this}},add=integrate("add"),on=integrate("on"),one=integrate("one"),off=integrate("off"),fire=integrate("fire"),clone=integrate("clone"),hover=function(enter,leave,i){for(i=this.length;i--;){b.on.call(this,this[i],"mouseenter",enter);b.on.call(this,this[i],"mouseleave",leave)}return this},methods={on:on,addListener:on,bind:on,listen:on,delegate:add,one:one,off:off,unbind:off,unlisten:off,removeListener:off,undelegate:off,emit:fire,trigger:fire,cloneEvents:clone,hover:hover},shortcuts="blur change click dblclick error focus focusin focusout keydown keypress keyup load mousedown mouseenter mouseleave mouseout mouseover mouseup mousemove resize scroll select submit unload".split(" ");for(var i=shortcuts.length;i--;)methods[shortcuts[i]]=integrate("on",shortcuts[i]);b.setSelectorEngine($);$.ender(methods,!0)}(ender)})();(function(){var module={exports:{}},exports=module.exports; /*! - * Bonzo: DOM Utility (c) Dustin Diaz 2011 + * Bonzo: DOM Utility (c) Dustin Diaz 2012 * https://github.com/ded/bonzo * License MIT */ -!function(b,c){typeof define=="function"?define(c):typeof a!="undefined"?a.exports=c():this[b]=c()}("bonzo",function(){function x(a){return new RegExp("(^|\\s+)"+a+"(\\s+|$)")}function y(a,b,c){for(var d=0,e=a.length;d<e;d++)b.call(c||a[d],a[d],d,a);return a}function z(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})}function A(a){return a&&a.nodeName&&a.nodeType==1}function B(a,b,c,d){for(d=0,j=a.length;d<j;++d)if(b.call(c,a[d],d,a))return!0;return!1}function D(a,b,c){var d=0,g=b||this,h=[],i=f&&typeof a=="string"&&a.charAt(0)!="<"?f(a):a;return y(J(i),function(a){y(g,function(b){var f=!b[e]||b[e]&&!b[e][e]?function(){var a=b.cloneNode(!0);return g.$&&g.cloneEvents&&g.$(a).cloneEvents(b),a}():b;c(a,f),h[d]=f,d++})},this),y(h,function(a,b){g[b]=a}),g.length=d,g}function E(a,b,c){var d=N(a),e=d.css("position"),f=d.offset(),g="relative",h=e==g,i=[parseInt(d.css("left"),10),parseInt(d.css("top"),10)];e=="static"&&(d.css("position",g),e=g),isNaN(i[0])&&(i[0]=h?0:a.offsetLeft),isNaN(i[1])&&(i[1]=h?0:a.offsetTop),b!=null&&(a.style.left=b-f.left+i[0]+q),c!=null&&(a.style.top=c-f.top+i[1]+q)}function F(a,b){return x(b).test(a.className)}function G(a,b){a.className=w(a.className+" "+b)}function H(a,b){a.className=w(a.className.replace(x(b)," "))}function I(a){this.length=0;if(a){a=typeof a!="string"&&!a.nodeType&&typeof a.length!="undefined"?a:[a],this.length=a.length;for(var b=0;b<a.length;b++)this[b]=a[b]}}function J(a){return typeof a=="string"?N.create(a):A(a)?[a]:a}function K(a,c,d){var e=this[0];return a==null&&c==null?(L(e)?M():{x:e.scrollLeft,y:e.scrollTop})[d]:(L(e)?b.scrollTo(a,c):(a!=null&&(e.scrollLeft=a),c!=null&&(e.scrollTop=c)),this)}function L(a){return a===b||/^(?:body|html)$/i.test(a.tagName)}function M(){return{x:b.pageXOffset||d.scrollLeft,y:b.pageYOffset||d.scrollTop}}function N(a,b){return new I(a,b)}var a=this,b=window,c=b.document,d=c.documentElement,e="parentNode",f=null,g=/^checked|value|selected$/,h=/select|fieldset|table|tbody|tfoot|td|tr|colgroup/i,i="table",k={thead:i,tbody:i,tfoot:i,tr:"tbody",th:"tr",td:"tr",fieldset:"form",option:"select"},l=/^checked|selected$/,m=/msie/i.test(navigator.userAgent),n=[],o=0,p=/^-?[\d\.]+$/,q="px",r="setAttribute",s="getAttribute",t=/(^\s*|\s*$)/g,u={lineHeight:1,zoom:1,zIndex:1,opacity:1},v=function(){var a=["webkitTransform","MozTransform","OTransform","msTransform","Transform"],b;for(b=0;b<a.length;b++)if(a[b]in c.createElement("a").style)return a[b]}(),w=String.prototype.trim?function(a){return a.trim()}:function(a){return a.replace(t,"")},C=c.defaultView&&c.defaultView.getComputedStyle?function(a,b){b=b=="transform"?v:b,b=b=="transform-origin"?v+"Origin":b;var d=null;b=="float"&&(b="cssFloat");var e=c.defaultView.getComputedStyle(a,"");return e&&(d=e[z(b)]),a.style[b]||d}:m&&d.currentStyle?function(a,b){b=z(b),b=b=="float"?"styleFloat":b;if(b=="opacity"){var c=100;try{c=a.filters["DXImageTransform.Microsoft.Alpha"].opacity}catch(d){try{c=a.filters("alpha").opacity}catch(e){}}return c/100}var f=a.currentStyle?a.currentStyle[b]:null;return a.style[b]||f}:function(a,b){return a.style[z(b)]};I.prototype={get:function(a){return this[a]},each:function(a,b){return y(this,a,b)},map:function(a,b){var c=[],d,e;for(e=0;e<this.length;e++)d=a.call(this,this[e],e),b?b(d)&&c.push(d):c.push(d);return c},first:function(){return N(this[0])},last:function(){return N(this[this.length-1])},html:function(a,b){function f(b){while(b.firstChild)b.removeChild(b.firstChild);y(J(a),function(a){b.appendChild(a)})}var c=b?d.textContent===null?"innerText":"textContent":"innerHTML",e;return typeof a!="undefined"?this.each(function(b){(e=b.tagName.match(h))?f(b,e[0]):b[c]=a}):this[0]?this[0][c]:""},text:function(a){return this.html(a,1)},addClass:function(a){return this.each(function(b){F(b,a)||G(b,a)})},removeClass:function(a){return this.each(function(b){F(b,a)&&H(b,a)})},hasClass:function(a){return B(this,function(b){return F(b,a)})},toggleClass:function(a,b){return this.each(function(c){typeof b!="undefined"?b?G(c,a):H(c,a):F(c,a)?H(c,a):G(c,a)})},show:function(a){return this.each(function(b){b.style.display=a||""})},hide:function(a){return this.each(function(a){a.style.display="none"})},append:function(a){return this.each(function(b){y(J(a),function(a){b.appendChild(a)})})},prepend:function(a){return this.each(function(b){var c=b.firstChild;y(J(a),function(a){b.insertBefore(a,c)})})},appendTo:function(a,b){return D.call(this,a,b,function(a,b){a.appendChild(b)})},prependTo:function(a,b){return D.call(this,a,b,function(a,b){a.insertBefore(b,a.firstChild)})},next:function(){return this.related("nextSibling")},previous:function(){return this.related("previousSibling")},related:function(a){return this.map(function(b){b=b[a];while(b&&b.nodeType!==1)b=b[a];return b||0},function(a){return a})},before:function(a){return this.each(function(b){y(N.create(a),function(a){b[e].insertBefore(a,b)})})},after:function(a){return this.each(function(b){y(N.create(a),function(a){b[e].insertBefore(a,b.nextSibling)})})},insertBefore:function(a,b){return D.call(this,a,b,function(a,b){a[e].insertBefore(b,a)})},insertAfter:function(a,b){return D.call(this,a,b,function(a,b){var c=a.nextSibling;c?a[e].insertBefore(b,c):a[e].appendChild(b)})},replaceWith:function(a){return this.each(function(b){b.parentNode.replaceChild(N.create(a)[0],b)})},css:function(a,d,e){function g(a,b,c){for(var d in f)f.hasOwnProperty(d)&&(c=f[d],(b=z(d))&&p.test(c)&&!(b in u)&&(c+=q),b=b=="transform"?v:b,b=b=="transformOrigin"?v+"Origin":b,a.style[b]=c)}if(d===undefined&&typeof a=="string")return d=this[0],d?d==c||d==b?(e=d==c?N.doc():N.viewport(),a=="width"?e.width:a=="height"?e.height:""):C(d,a):null;var f=a;typeof a=="string"&&(f={},f[a]=d),m&&f.opacity&&(f.filter="alpha(opacity="+f.opacity*100+")",f.zoom=a.zoom||1,delete f.opacity);if(d=f["float"])m?f.styleFloat=d:f.cssFloat=d,delete f["float"];return this.each(g)},offset:function(a,b){if(typeof a=="number"||typeof b=="number")return this.each(function(c){E(c,a,b)});var c=this[0],d=c.offsetWidth,e=c.offsetHeight,f=c.offsetTop,g=c.offsetLeft;while(c=c.offsetParent)f+=c.offsetTop,g+=c.offsetLeft;return{top:f,left:g,height:e,width:d}},attr:function(a,b){var c=this[0];if(typeof a=="string"||a instanceof String)return typeof b=="undefined"?g.test(a)?l.test(a)&&typeof c[a]=="string"?!0:c[a]:c[s](a):this.each(function(c){g.test(a)?c[a]=b:c[r](a,b)});for(var d in a)a.hasOwnProperty(d)&&this.attr(d,a[d]);return this},val:function(a){return typeof a=="string"?this.attr("value",a):this[0].value},removeAttr:function(a){return this.each(function(b){l.test(a)?b[a]=!1:b.removeAttribute(a)})},data:function(a,b){var c=this[0];if(typeof b=="undefined"){c[s]("data-node-uid")||c[r]("data-node-uid",++o);var d=c[s]("data-node-uid");return n[d]||(n[d]={}),n[d][a]}return this.each(function(c){c[s]("data-node-uid")||c[r]("data-node-uid",++o);var d=c[s]("data-node-uid"),e=n[d]||(n[d]={});e[a]=b})},remove:function(){return this.each(function(a){a[e]&&a[e].removeChild(a)})},empty:function(){return this.each(function(a){while(a.firstChild)a.removeChild(a.firstChild)})},detach:function(){return this.map(function(a){return a[e].removeChild(a)})},scrollTop:function(a){return K.call(this,null,a,"y")},scrollLeft:function(a){return K.call(this,a,null,"x")},toggle:function(a){return this.each(function(a){a.style.display=a.offsetWidth||a.offsetHeight?"none":"block"}),a&&a(),this}},N.setQueryEngine=function(a){f=a,delete N.setQueryEngine},N.aug=function(a,b){for(var c in a)a.hasOwnProperty(c)&&((b||I.prototype)[c]=a[c])},N.create=function(a){return typeof a=="string"?function(){var b=/^<([^\s>]+)/.exec(a),d=c.createElement(b&&k[b[1].toLowerCase()]||"div"),e=[];d.innerHTML=a;var f=d.childNodes;d=d.firstChild,e.push(d);while(d=d.nextSibling)d.nodeType==1&&e.push(d);return e}():A(a)?[a.cloneNode(!0)]:[]},N.doc=function(){var a=this.viewport();return{width:Math.max(c.body.scrollWidth,d.scrollWidth,a.width),height:Math.max(c.body.scrollHeight,d.scrollHeight,a.height)}},N.firstChild=function(a){for(var b=a.childNodes,c=0,d=b&&b.length||0,e;c<d;c++)b[c].nodeType===1&&(e=b[d=c]);return e},N.viewport=function(){return{width:m?d.clientWidth:self.innerWidth,height:m?d.clientHeight:self.innerHeight}},N.isAncestor="compareDocumentPosition"in d?function(a,b){return(a.compareDocumentPosition(b)&16)==16}:"contains"in d?function(a,b){return a!==b&&a.contains(b)}:function(a,b){while(b=b[e])if(b===a)return!0;return!1};var O=a.bonzo;return N.noConflict=function(){return a.bonzo=O,this},N}),provide("bonzo",a.exports),!function(a){function c(a,b){for(var c=0;c<a.length;c++)if(a[c]===b)return c;return-1}function d(a){var b=[],c,d;e:for(c=0;c<a.length;c++){for(d=0;d<b.length;d++)if(b[d]==a[c])continue e;b[b.length]=a[c]}return b}function e(a,b,c){return a?b.css(c,a):function(a){return a=parseInt(b.css(c),10),isNaN(a)?b[0]["offset"+c.replace(/^\w/,function(a){return a.toUpperCase()})]:a}()}var b=require("bonzo");b.setQueryEngine(a),a.ender(b),a.ender(b(),!0),a.ender({create:function(c){return a(b.create(c))}}),a.id=function(b){return a([document.getElementById(b)])},a.ender({parents:function(b,e){var f=a(b),g,h,i,j=[];for(g=0,h=this.length;g<h;g++){i=this[g];while(i=i.parentNode)if(~c(f,i)){j.push(i);if(e)break}}return a(d(j))},closest:function(a){return this.parents(a,!0)},first:function(){return a(this[0])},last:function(){return a(this[this.length-1])},next:function(){return a(b(this).next())},previous:function(){return a(b(this).previous())},appendTo:function(a){return b(this.selector).appendTo(a,this)},prependTo:function(a){return b(this.selector).prependTo(a,this)},insertAfter:function(a){return b(this.selector).insertAfter(a,this)},insertBefore:function(a){return b(this.selector).insertBefore(a,this)},siblings:function(){var b,c,d,e=[];for(b=0,c=this.length;b<c;b++){d=this[b];while(d=d.previousSibling)d.nodeType==1&&e.push(d);d=this[b];while(d=d.nextSibling)d.nodeType==1&&e.push(d)}return a(e)},children:function(){var c,e,f=[];for(c=0,l=this.length;c<l;c++){if(!(e=b.firstChild(this[c])))continue;f.push(e);while(e=e.nextSibling)e.nodeType==1&&f.push(e)}return a(d(f))},height:function(a){return e(a,this,"height")},width:function(a){return e(a,this,"width")}},!0)}(ender)}(),!function(){var a={exports:{}},b=a.exports;!function(b,c){typeof define=="function"?define(c):typeof a!="undefined"?a.exports=c():this[b]=this.domReady=c()}("domready",function(a){function l(a){k=1;while(a=b.shift())a()}var b=[],c,d=!1,e=document,f=e.documentElement,g=f.doScroll,h="DOMContentLoaded",i="addEventListener",j="onreadystatechange",k=/^loade|c/.test(e.readyState);return e[i]&&e[i](h,c=function(){e.removeEventListener(h,c,d),l()},d),g&&e.attachEvent(j,c=function(){/^c/.test(e.readyState)&&(e.detachEvent(j,c),l())}),a=g?function(c){self!=top?k?c():b.push(c):function(){try{f.doScroll("left")}catch(b){return setTimeout(function(){a(c)},50)}c()}()}:function(a){k?a():b.push(a)}}),provide("domready",a.exports),!function(a){var b=require("domready");a.ender({domReady:b}),a.ender({ready:function(a){return b(a),this}},!0)}(ender)}(),!function(){var a={exports:{}},b=a.exports; +(function(name,context,definition){typeof module!="undefined"&&module.exports?module.exports=definition():typeof context["define"]=="function"&&context.define.amd?define(definition):context[name]=definition()})("bonzo",this,function(){function isNode(node){return node&&node.nodeName&&(node.nodeType==1||node.nodeType==11)}function normalize(node,host,clone){var i,l,ret;if(typeof node=="string")return bonzo.create(node);isNode(node)&&(node=[node]);if(clone){ret=[];for(i=0,l=node.length;i<l;i++)ret[i]=cloneNode(host,node[i]);return ret}return node}function classReg(c){return new RegExp("(^|\\s+)"+c+"(\\s+|$)")}function each(ar,fn,opt_scope,opt_rev){var ind,i=0,l=ar.length;for(;i<l;i++){ind=opt_rev?ar.length-i-1:i;fn.call(opt_scope||ar[ind],ar[ind],ind,ar)}return ar}function deepEach(ar,fn,opt_scope){for(var i=0,l=ar.length;i<l;i++)if(isNode(ar[i])){deepEach(ar[i].childNodes,fn,opt_scope);fn.call(opt_scope||ar[i],ar[i],i,ar)}return ar}function camelize(s){return s.replace(/-(.)/g,function(m,m1){return m1.toUpperCase()})}function decamelize(s){return s?s.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase():s}function data(el){el[getAttribute]("data-node-uid")||el[setAttribute]("data-node-uid",++uuids);var uid=el[getAttribute]("data-node-uid");return uidMap[uid]||(uidMap[uid]={})}function clearData(el){var uid=el[getAttribute]("data-node-uid");uid&&delete uidMap[uid]}function dataValue(d){var f;try{return d===null||d===undefined?undefined:d==="true"?!0:d==="false"?!1:d==="null"?null:(f=parseFloat(d))==d?f:d}catch(e){}return undefined}function some(ar,fn,opt_scope){for(var i=0,j=ar.length;i<j;++i)if(fn.call(opt_scope||null,ar[i],i,ar))return!0;return!1}function styleProperty(p){p=="transform"&&(p=features.transform)||/^transform-?[Oo]rigin$/.test(p)&&(p=features.transform+"Origin")||p=="float"&&(p=features.cssFloat);return p?camelize(p):null}function insert(target,host,fn,rev){var i=0,self=host||this,r=[],nodes=query&&typeof target=="string"&&target.charAt(0)!="<"?query(target):target;each(normalize(nodes),function(t,j){each(self,function(el){fn(t,r[i++]=j>0?cloneNode(self,el):el)},null,rev)},this,rev);self.length=i;each(r,function(e){self[--i]=e},null,!rev);return self}function xy(el,x,y){var $el=bonzo(el),style=$el.css("position"),offset=$el.offset(),rel="relative",isRel=style==rel,delta=[parseInt($el.css("left"),10),parseInt($el.css("top"),10)];if(style=="static"){$el.css("position",rel);style=rel}isNaN(delta[0])&&(delta[0]=isRel?0:el.offsetLeft);isNaN(delta[1])&&(delta[1]=isRel?0:el.offsetTop);x!=null&&(el.style.left=x-offset.left+delta[0]+px);y!=null&&(el.style.top=y-offset.top+delta[1]+px)}function setter(el,v){return typeof v=="function"?v(el):v}function Bonzo(elements){this.length=0;if(elements){elements=typeof elements!="string"&&!elements.nodeType&&typeof elements.length!="undefined"?elements:[elements];this.length=elements.length;for(var i=0;i<elements.length;i++)this[i]=elements[i]}}function cloneNode(host,el){var c=el.cloneNode(!0),cloneElems,elElems;if(host.$&&typeof host.cloneEvents=="function"){host.$(c).cloneEvents(el);cloneElems=host.$(c).find("*");elElems=host.$(el).find("*");for(var i=0;i<elElems.length;i++)host.$(cloneElems[i]).cloneEvents(elElems[i])}return c}function scroll(x,y,type){var el=this[0];if(!el)return this;if(x==null&&y==null)return(isBody(el)?getWindowScroll():{x:el.scrollLeft,y:el.scrollTop})[type];if(isBody(el))win.scrollTo(x,y);else{x!=null&&(el.scrollLeft=x);y!=null&&(el.scrollTop=y)}return this}function isBody(element){return element===win||/^(?:body|html)$/i.test(element.tagName)}function getWindowScroll(){return{x:win.pageXOffset||html.scrollLeft,y:win.pageYOffset||html.scrollTop}}function createScriptFromHtml(html){var scriptEl=document.createElement("script"),matches=html.match(simpleScriptTagRe);scriptEl.src=matches[1];return scriptEl}function bonzo(els){return new Bonzo(els)}var win=window,doc=win.document,html=doc.documentElement,parentNode="parentNode",specialAttributes=/^(checked|value|selected|disabled)$/i,specialTags=/^(select|fieldset|table|tbody|tfoot|td|tr|colgroup)$/i,simpleScriptTagRe=/\s*<script +src=['"]([^'"]+)['"]>/,table=["<table>","</table>",1],td=["<table><tbody><tr>","</tr></tbody></table>",3],option=["<select>","</select>",1],noscope=["_","",0,1],tagMap={thead:table,tbody:table,tfoot:table,colgroup:table,caption:table,tr:["<table><tbody>","</tbody></table>",2],th:td,td:td,col:["<table><colgroup>","</colgroup></table>",2],fieldset:["<form>","</form>",1],legend:["<form><fieldset>","</fieldset></form>",2],option:option,optgroup:option,script:noscope,style:noscope,link:noscope,param:noscope,base:noscope},stateAttributes=/^(checked|selected|disabled)$/,ie=/msie/i.test(navigator.userAgent),hasClass,addClass,removeClass,uidMap={},uuids=0,digit=/^-?[\d\.]+$/,dattr=/^data-(.+)$/,px="px",setAttribute="setAttribute",getAttribute="getAttribute",byTag="getElementsByTagName",features=function(){var e=doc.createElement("p");e.innerHTML='<a href="#x">x</a><table style="float:left;"></table>';return{hrefExtended:e[byTag]("a")[0][getAttribute]("href")!="#x",autoTbody:e[byTag]("tbody").length!==0,computedStyle:doc.defaultView&&doc.defaultView.getComputedStyle,cssFloat:e[byTag]("table")[0].style.styleFloat?"styleFloat":"cssFloat",transform:function(){var props=["transform","webkitTransform","MozTransform","OTransform","msTransform"],i;for(i=0;i<props.length;i++)if(props[i]in e.style)return props[i]}(),classList:"classList"in e,opasity:function(){return typeof doc.createElement("a").style.opacity!="undefined"}()}}(),trimReplace=/(^\s*|\s*$)/g,whitespaceRegex=/\s+/,toString=String.prototype.toString,unitless={lineHeight:1,zoom:1,zIndex:1,opacity:1,boxFlex:1,WebkitBoxFlex:1,MozBoxFlex:1},query=doc.querySelectorAll&&function(selector){return doc.querySelectorAll(selector)},trim=String.prototype.trim?function(s){return s.trim()}:function(s){return s.replace(trimReplace,"")},getStyle=features.computedStyle?function(el,property){var value=null,computed=doc.defaultView.getComputedStyle(el,"");computed&&(value=computed[property]);return el.style[property]||value}:ie&&html.currentStyle?function(el,property){if(property=="opacity"&&!features.opasity){var val=100;try{val=el.filters["DXImageTransform.Microsoft.Alpha"].opacity}catch(e1){try{val=el.filters("alpha").opacity}catch(e2){}}return val/100}var value=el.currentStyle?el.currentStyle[property]:null;return el.style[property]||value}:function(el,property){return el.style[property]};if(features.classList){hasClass=function(el,c){return el.classList.contains(c)};addClass=function(el,c){el.classList.add(c)};removeClass=function(el,c){el.classList.remove(c)}}else{hasClass=function(el,c){return classReg(c).test(el.className)};addClass=function(el,c){el.className=trim(el.className+" "+c)};removeClass=function(el,c){el.className=trim(el.className.replace(classReg(c)," "))}}Bonzo.prototype={get:function(index){return this[index]||null},each:function(fn,opt_scope){return each(this,fn,opt_scope)},deepEach:function(fn,opt_scope){return deepEach(this,fn,opt_scope)},map:function(fn,opt_reject){var m=[],n,i;for(i=0;i<this.length;i++){n=fn.call(this,this[i],i);opt_reject?opt_reject(n)&&m.push(n):m.push(n)}return m},html:function(h,opt_text){var method=opt_text?html.textContent===undefined?"innerText":"textContent":"innerHTML",that=this,append=function(el,i){each(normalize(h,that,i),function(node){el.appendChild(node)})},updateElement=function(el,i){try{if(opt_text||typeof h=="string"&&!specialTags.test(el.tagName))return el[method]=h}catch(e){}append(el,i)};return typeof h!="undefined"?this.empty().each(updateElement):this[0]?this[0][method]:""},text:function(opt_text){return this.html(opt_text,!0)},append:function(node){var that=this;return this.each(function(el,i){each(normalize(node,that,i),function(i){el.appendChild(i)})})},prepend:function(node){var that=this;return this.each(function(el,i){var first=el.firstChild;each(normalize(node,that,i),function(i){el.insertBefore(i,first)})})},appendTo:function(target,opt_host){return insert.call(this,target,opt_host,function(t,el){t.appendChild(el)})},prependTo:function(target,opt_host){return insert.call(this,target,opt_host,function(t,el){t.insertBefore(el,t.firstChild)},1)},before:function(node){var that=this;return this.each(function(el,i){each(normalize(node,that,i),function(i){el[parentNode].insertBefore(i,el)})})},after:function(node){var that=this;return this.each(function(el,i){each(normalize(node,that,i),function(i){el[parentNode].insertBefore(i,el.nextSibling)},null,1)})},insertBefore:function(target,opt_host){return insert.call(this,target,opt_host,function(t,el){t[parentNode].insertBefore(el,t)})},insertAfter:function(target,opt_host){return insert.call(this,target,opt_host,function(t,el){var sibling=t.nextSibling;sibling?t[parentNode].insertBefore(el,sibling):t[parentNode].appendChild(el)},1)},replaceWith:function(node){bonzo(normalize(node)).insertAfter(this);return this.remove()},addClass:function(c){c=toString.call(c).split(whitespaceRegex);return this.each(function(el){each(c,function(c){c&&!hasClass(el,setter(el,c))&&addClass(el,setter(el,c))})})},removeClass:function(c){c=toString.call(c).split(whitespaceRegex);return this.each(function(el){each(c,function(c){c&&hasClass(el,setter(el,c))&&removeClass(el,setter(el,c))})})},hasClass:function(c){c=toString.call(c).split(whitespaceRegex);return some(this,function(el){return some(c,function(c){return c&&hasClass(el,c)})})},toggleClass:function(c,opt_condition){c=toString.call(c).split(whitespaceRegex);return this.each(function(el){each(c,function(c){c&&(typeof opt_condition!="undefined"?opt_condition?addClass(el,c):removeClass(el,c):hasClass(el,c)?removeClass(el,c):addClass(el,c))})})},show:function(opt_type){opt_type=typeof opt_type=="string"?opt_type:"";return this.each(function(el){el.style.display=opt_type})},hide:function(){return this.each(function(el){el.style.display="none"})},toggle:function(opt_callback,opt_type){opt_type=typeof opt_type=="string"?opt_type:"";typeof opt_callback!="function"&&(opt_callback=null);return this.each(function(el){el.style.display=el.offsetWidth||el.offsetHeight?"none":opt_type;opt_callback&&opt_callback.call(el)})},first:function(){return bonzo(this.length?this[0]:[])},last:function(){return bonzo(this.length?this[this.length-1]:[])},next:function(){return this.related("nextSibling")},previous:function(){return this.related("previousSibling")},parent:function(){return this.related(parentNode)},related:function(method){return this.map(function(el){el=el[method];while(el&&el.nodeType!==1)el=el[method];return el||0},function(el){return el})},focus:function(){this.length&&this[0].focus();return this},blur:function(){this.length&&this[0].blur();return this},css:function(o,opt_v){function fn(el,p,v){for(var k in iter)if(iter.hasOwnProperty(k)){v=iter[k];(p=styleProperty(k))&&digit.test(v)&&!(p in unitless)&&(v+=px);try{el.style[p]=setter(el,v)}catch(e){}}}var p,iter=o;if(opt_v===undefined&&typeof o=="string"){opt_v=this[0];if(!opt_v)return null;if(opt_v===doc||opt_v===win){p=opt_v===doc?bonzo.doc():bonzo.viewport();return o=="width"?p.width:o=="height"?p.height:""}return(o=styleProperty(o))?getStyle(opt_v,o):null}if(typeof o=="string"){iter={};iter[o]=opt_v}if(ie&&iter.opacity){iter.filter="alpha(opacity="+iter.opacity*100+")";iter.zoom=o.zoom||1;delete iter.opacity}return this.each(fn)},offset:function(opt_x,opt_y){if(!opt_x||typeof opt_x!="object"||typeof opt_x.top!="number"&&typeof opt_x.left!="number"){if(typeof opt_x=="number"||typeof opt_y=="number")return this.each(function(el){xy(el,opt_x,opt_y)});if(!this[0])return{top:0,left:0,height:0,width:0};var el=this[0],de=el.ownerDocument.documentElement,bcr=el.getBoundingClientRect(),scroll=getWindowScroll(),width=el.offsetWidth,height=el.offsetHeight,top=bcr.top+scroll.y-Math.max(0,de&&de.clientTop,doc.body.clientTop),left=bcr.left+scroll.x-Math.max(0,de&&de.clientLeft,doc.body.clientLeft);return{top:top,left:left,height:height,width:width}}return this.each(function(el){xy(el,opt_x.left,opt_x.top)})},dim:function(){if(!this.length)return{height:0,width:0};var el=this[0],de=el.nodeType==9&&el.documentElement,orig=!de&&!!el.style&&!el.offsetWidth&&!el.offsetHeight?function(t){var s={position:el.style.position||"",visibility:el.style.visibility||"",display:el.style.display||""};t.first().css({position:"absolute",visibility:"hidden",display:"block"});return s}(this):null,width=de?Math.max(el.body.scrollWidth,el.body.offsetWidth,de.scrollWidth,de.offsetWidth,de.clientWidth):el.offsetWidth,height=de?Math.max(el.body.scrollHeight,el.body.offsetHeight,de.scrollWidth,de.offsetWidth,de.clientHeight):el.offsetHeight;orig&&this.first().css(orig);return{height:height,width:width}},attr:function(k,opt_v){var el=this[0];if(typeof k=="string"||k instanceof String)return typeof opt_v=="undefined"?el?specialAttributes.test(k)?stateAttributes.test(k)&&typeof el[k]=="string"?!0:el[k]:k!="href"&&k!="src"||!features.hrefExtended?el[getAttribute](k):el[getAttribute](k,2):null:this.each(function(el){specialAttributes.test(k)?el[k]=setter(el,opt_v):el[setAttribute](k,setter(el,opt_v))});for(var n in k)k.hasOwnProperty(n)&&this.attr(n,k[n]);return this},removeAttr:function(k){return this.each(function(el){stateAttributes.test(k)?el[k]=!1:el.removeAttribute(k)})},val:function(s){return typeof s=="string"?this.attr("value",s):this.length?this[0].value:null},data:function(opt_k,opt_v){var el=this[0],o,m;if(typeof opt_v=="undefined"){if(!el)return null;o=data(el);if(typeof opt_k=="undefined"){each(el.attributes,function(a){(m=(""+a.name).match(dattr))&&(o[camelize(m[1])]=dataValue(a.value))});return o}typeof o[opt_k]=="undefined"&&(o[opt_k]=dataValue(this.attr("data-"+decamelize(opt_k))));return o[opt_k]}return this.each(function(el){data(el)[opt_k]=opt_v})},remove:function(){this.deepEach(clearData);return this.detach()},empty:function(){return this.each(function(el){deepEach(el.childNodes,clearData);while(el.firstChild)el.removeChild(el.firstChild)})},detach:function(){return this.each(function(el){el[parentNode]&&el[parentNode].removeChild(el)})},scrollTop:function(y){return scroll.call(this,null,y,"y")},scrollLeft:function(x){return scroll.call(this,x,null,"x")}};bonzo.setQueryEngine=function(q){query=q;delete bonzo.setQueryEngine};bonzo.aug=function(o,target){for(var k in o)o.hasOwnProperty(k)&&((target||Bonzo.prototype)[k]=o[k])};bonzo.create=function(node){return typeof node=="string"&&node!==""?function(){if(simpleScriptTagRe.test(node))return[createScriptFromHtml(node)];var tag=node.match(/^\s*<([^\s>]+)/),el=doc.createElement("div"),els=[],p=tag?tagMap[tag[1].toLowerCase()]:null,dep=p?p[2]+1:1,ns=p&&p[3],pn=parentNode,tb=features.autoTbody&&p&&p[0]=="<table>"&&!/<tbody/i.test(node);el.innerHTML=p?p[0]+node+p[1]:node;while(dep--)el=el.firstChild;ns&&el&&el.nodeType!==1&&(el=el.nextSibling);do(!tag||el.nodeType==1)&&(!tb||el.tagName.toLowerCase()!="tbody")&&els.push(el);while(el=el.nextSibling);each(els,function(el){el[pn]&&el[pn].removeChild(el)});return els}():isNode(node)?[node.cloneNode(!0)]:[]};bonzo.doc=function(){var vp=bonzo.viewport();return{width:Math.max(doc.body.scrollWidth,html.scrollWidth,vp.width),height:Math.max(doc.body.scrollHeight,html.scrollHeight,vp.height)}};bonzo.firstChild=function(el){for(var c=el.childNodes,i=0,j=c&&c.length||0,e;i<j;i++)c[i].nodeType===1&&(e=c[j=i]);return e};bonzo.viewport=function(){return{width:ie?html.clientWidth:self.innerWidth,height:ie?html.clientHeight:self.innerHeight}};bonzo.isAncestor="compareDocumentPosition"in html?function(container,element){return(container.compareDocumentPosition(element)&16)==16}:"contains"in html?function(container,element){return container!==element&&container.contains(element)}:function(container,element){while(element=element[parentNode])if(element===container)return!0;return!1};return bonzo});provide("bonzo",module.exports);(function($){function indexOf(ar,val){for(var i=0;i<ar.length;i++)if(ar[i]===val)return i;return-1}function uniq(ar){var r=[],i=0,j=0,k,item,inIt;for(;item=ar[i];++i){inIt=!1;for(k=0;k<r.length;++k)if(r[k]===item){inIt=!0;break}inIt||(r[j++]=item)}return r}function dimension(type,opt_v){return typeof opt_v=="undefined"?b(this).dim()[type]:this.css(type,opt_v)}var b=require("bonzo");b.setQueryEngine($);$.ender(b);$.ender(b(),!0);$.ender({create:function(node){return $(b.create(node))}});$.id=function(id){return $([document.getElementById(id)])};$.ender({parents:function(selector,closest){if(!this.length)return this;selector||(selector="*");var collection=$(selector),j,k,p,r=[];for(j=0,k=this.length;j<k;j++){p=this[j];while(p=p.parentNode)if(~indexOf(collection,p)){r.push(p);if(closest)break}}return $(uniq(r))},parent:function(){return $(uniq(b(this).parent()))},closest:function(selector){return this.parents(selector,!0)},first:function(){return $(this.length?this[0]:this)},last:function(){return $(this.length?this[this.length-1]:[])},next:function(){return $(b(this).next())},previous:function(){return $(b(this).previous())},appendTo:function(t){return b(this.selector).appendTo(t,this)},prependTo:function(t){return b(this.selector).prependTo(t,this)},insertAfter:function(t){return b(this.selector).insertAfter(t,this)},insertBefore:function(t){return b(this.selector).insertBefore(t,this)},siblings:function(){var i,l,p,r=[];for(i=0,l=this.length;i<l;i++){p=this[i];while(p=p.previousSibling)p.nodeType==1&&r.push(p);p=this[i];while(p=p.nextSibling)p.nodeType==1&&r.push(p)}return $(r)},children:function(){var i,l,el,r=[];for(i=0,l=this.length;i<l;i++){if(!(el=b.firstChild(this[i])))continue;r.push(el);while(el=el.nextSibling)el.nodeType==1&&r.push(el)}return $(uniq(r))},height:function(v){return dimension.call(this,"height",v)},width:function(v){return dimension.call(this,"width",v)}},!0)})(ender)})();(function(){var module={exports:{}},exports=module.exports; +/*! + * domready (c) Dustin Diaz 2012 - License MIT + */ +;!function(name,definition){typeof module!="undefined"?module.exports=definition():typeof define=="function"&&typeof define.amd=="object"?define(definition):this[name]=definition()}("domready",function(ready){function flush(f){loaded=1;while(f=fns.shift())f()}var fns=[],fn,f=!1,doc=document,testEl=doc.documentElement,hack=testEl.doScroll,domContentLoaded="DOMContentLoaded",addEventListener="addEventListener",onreadystatechange="onreadystatechange",readyState="readyState",loaded=/^loade|c/.test(doc[readyState]);doc[addEventListener]&&doc[addEventListener](domContentLoaded,fn=function(){doc.removeEventListener(domContentLoaded,fn,f);flush()},f);hack&&doc.attachEvent(onreadystatechange,fn=function(){if(/^c/.test(doc[readyState])){doc.detachEvent(onreadystatechange,fn);flush()}});return ready=hack?function(fn){self!=top?loaded?fn():fns.push(fn):function(){try{testEl.doScroll("left")}catch(e){return setTimeout(function(){ready(fn)},50)}fn()}()}:function(fn){loaded?fn():fns.push(fn)}});provide("domready",module.exports);!function($){var ready=require("domready");$.ender({domReady:ready});$.ender({ready:function(f){ready(f);return this}},!0)}(ender)})();(function(){var module={exports:{}},exports=module.exports; /*! - * Qwery - A Blazing Fast query selector engine + * @preserve Qwery - A Blazing Fast query selector engine * https://github.com/ded/qwery - * copyright Dustin Diaz & Jacob Thornton 2011 + * copyright Dustin Diaz 2012 * MIT License */ -!function(b,c){typeof define=="function"?define(c):typeof a!="undefined"?a.exports=c():this[b]=c()}("qwery",function(){function M(){this.c={}}function R(a){l=[];for(e=0,h=a.length;e<h;e++)$(a[e])?l=l.concat(a[e]):l.push(a[e]);return l}function S(a){while(a=a.previousSibling)if(a.nodeType==1)break;return a}function T(a){return a.match(K)}function U(a,b,c,d,f,g,h,i,k,l,m){var n,o,p;if(b&&this.tagName.toLowerCase()!==b)return!1;if(c&&(n=c.match(v))&&n[1]!==this.id)return!1;if(c&&(q=c.match(w)))for(e=q.length;e--;){o=q[e].slice(1);if(!(N.g(o)||N.s(o,new RegExp("(^|\\s+)"+o+"(\\s+|$)"))).test(this.className))return!1}if(k&&ba.pseudos[k]&&!ba.pseudos[k](this,m))return!1;if(d&&!h){j=this.attributes;for(p in j)if(Object.prototype.hasOwnProperty.call(j,p)&&(j[p].name||p)==f)return this}return d&&!W(g,this.getAttribute(f)||"",h)?!1:this}function V(a){return O.g(a)||O.s(a,a.replace(E,"\\$1"))}function W(a,b,c){switch(a){case"=":return b==c;case"^=":return b.match(P.g("^="+c)||P.s("^="+c,new RegExp("^"+V(c))));case"$=":return b.match(P.g("$="+c)||P.s("$="+c,new RegExp(V(c)+"$")));case"*=":return b.match(P.g(c)||P.s(c,new RegExp(V(c))));case"~=":return b.match(P.g("~="+c)||P.s("~="+c,new RegExp("(?:^|\\s+)"+V(c)+"(?:\\s+|$)")));case"|=":return b.match(P.g("|="+c)||P.s("|="+c,new RegExp("^"+V(c)+"(-|$)")))}return 0}function X(a){var c=[],d=[],e,f=0,g,h,i,j,k,l,m,n,o,q,r,s=Q.g(a)||Q.s(a,a.split(J)),t=a.match(I),u;s=s.slice(0);if(!s.length)return c;k=s.pop(),n=s.length&&(i=s[s.length-1].match(x))?b.getElementById(i[1]):b;if(!n)return c;o=T(k),m=t&&/^[+~]$/.test(t[t.length-1])?function(a){while(n=n.nextSibling)n.nodeType==1&&(o[1]?o[1]==n.tagName.toLowerCase():1)&&a.push(n);return a}([]):n.getElementsByTagName(o[1]||"*");for(e=0,h=m.length;e<h;e++)if(q=U.apply(m[e],o))c[f++]=q;if(!s.length)return c;for(f=0,h=c.length,g=0;f<h;f++){j=c[f];for(e=s.length;e--;)while(j=L[t[e]](j,c[f]))if(p=U.apply(j,T(s[e])))break;p&&(d[g++]=c[f])}return d}function Y(a){return a&&a.nodeType&&(a.nodeType==1||a.nodeType==9)}function Z(a){var b=[],c,d;e:for(c=0;c<a.length;c++){for(d=0;d<b.length;d++)if(b[d]==a[c])continue e;b[b.length]=a[c]}return b}function $(a){return typeof a=="object"&&isFinite(a.length)}function _(a){return a?typeof a=="string"?ba(a)[0]:$(a)?a[0]:a:b}function ba(a,c){var d=_(c);return!d||!a?[]:a===window||Y(a)?!c||a!==window&&Y(d)&&bb(a,d)?[a]:[]:a&&$(a)?R(a):(i=a.match(x))?(n=b.getElementById(i[1]))?[n]:[]:(i=a.match(z))?R(d.getElementsByTagName(i[1])):bd(a,d)}var a=this,b=document,c=a.qwery,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u=b.documentElement,v=/#([\w\-]+)/,w=/\.[\w\-]+/g,x=/^#([\w\-]+$)/,y=/^\.([\w\-]+)$/,z=/^([\w\-]+)$/,A=/^([\w]+)?\.([\w\-]+)$/,B=/\s*([\s\+\~>])\s*/g,C=/[\s\>\+\~]/,D=/(?![\s\w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^'"]*\]|[\s\w\+\-]*\))/,E=/([.*+?\^=!:${}()|\[\]\/\\])/g,F=/^([a-z0-9]+)?(?:([\.\#]+[\w\-\.#]+)?)/,G=/\[([\w\-]+)(?:([\|\^\$\*\~]?\=)['"]?([ \w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^]+)["']?)?\]/,H=/:([\w\-]+)(\(['"]?([\s\w\+\-]+)['"]?\))?/,I=new RegExp("("+C.source+")"+D.source,"g"),J=new RegExp(C.source+D.source),K=new RegExp(F.source+"("+G.source+")?"+"("+H.source+")?"),L={" ":function(a){return a&&a!==u&&a.parentNode},">":function(a,b){return a&&a.parentNode==b.parentNode&&a.parentNode},"~":function(a){return a&&a.previousSibling},"+":function(a,b,c,d){return a?(c=S(a),d=S(b),c&&d&&c==d&&c):!1}};M.prototype={g:function(a){return this.c[a]||undefined},s:function(a,b){return this.c[a]=b,b}};var N=new M,O=new M,P=new M,Q=new M,bb="compareDocumentPosition"in u?function(a,b){return(b.compareDocumentPosition(a)&16)==16}:"contains"in u?function(a,c){return c=c==b||c==window?u:c,c!==a&&c.contains(a)}:function(a,b){while(a=a.parentNode)if(a===b)return 1;return 0},bc=function(){if(!b.querySelector||!b.querySelectorAll)return!1;try{return b.querySelectorAll(":nth-of-type(1)").length}catch(a){return!1}}(),bd=bc?function(a,c){return b.getElementsByClassName&&(i=a.match(y))?R(c.getElementsByClassName(i[1])):R(c.querySelectorAll(a))}:function(a,c){a=a.replace(B,"$1");var d=[],e,g,j=[],k;if(i=a.match(A)){s=c.getElementsByTagName(i[1]||"*"),l=N.g(i[2])||N.s(i[2],new RegExp("(^|\\s+)"+i[2]+"(\\s+|$)"));for(k=0,h=s.length,f=0;k<h;k++)l.test(s[k].className)&&(d[f++]=s[k]);return d}for(k=0,s=a.split(","),h=s.length;k<h;k++)j[k]=X(s[k]);for(k=0,h=j.length;k<h&&(g=j[k]);k++){var m=g;if(c!==b){m=[];for(f=0,i=g.length;f<i&&(e=g[f]);f++)bb(e,c)&&m.push(e)}d=d.concat(m)}return Z(d)};return ba.uniq=Z,ba.pseudos={},ba.noConflict=function(){return a.qwery=c,this},ba}),provide("qwery",a.exports),!function(a,b){function f(b,c){var d=/^\s*<([^\s>]+)\s*/.exec(b)[1],f=(c||a).createElement(e[d]||"div"),g=[];f.innerHTML=b;var h=f.childNodes;f=f.firstChild,f.nodeType==1&&g.push(f);while(f=f.nextSibling)f.nodeType==1&&g.push(f);return g}var c=require("qwery"),d="table",e={thead:d,tbody:d,tfoot:d,tr:"tbody",th:"tr",td:"tr",fieldset:"form",option:"select"};b._select=function(a,b){return/^\s*</.test(a)?f(a,b):c(a,b)},b.pseudos=c.pseudos,b.ender({find:function(a){var d=[],e,f,g,h,i;for(e=0,f=this.length;e<f;e++){i=c(a,this[e]);for(g=0,h=i.length;g<h;g++)d.push(i[g])}return b(c.uniq(d))},and:function(a){var c=b(a);for(var d=this.length,e=0,f=this.length+c.length;d<f;d++,e++)this[d]=c[e];return this}},!0)}(document,ender)}()
\ No newline at end of file +(function(name,context,definition){typeof module!="undefined"&&module.exports?module.exports=definition():typeof context["define"]=="function"&&context.define.amd?define(definition):context[name]=definition()})("qwery",this,function(){function cache(){this.c={}}function classRegex(c){return classCache.g(c)||classCache.s(c,"(^|\\s+)"+c+"(\\s+|$)",1)}function each(a,fn){var i=0,l=a.length;for(;i<l;i++)fn(a[i])}function flatten(ar){for(var r=[],i=0,l=ar.length;i<l;++i)arrayLike(ar[i])?r=r.concat(ar[i]):r[r.length]=ar[i];return r}function arrayify(ar){var i=0,l=ar.length,r=[];for(;i<l;i++)r[i]=ar[i];return r}function previous(n){while(n=n.previousSibling)if(n[nodeType]==1)break;return n}function q(query){return query.match(chunker)}function interpret(whole,tag,idsAndClasses,wholeAttribute,attribute,qualifier,value,wholePseudo,pseudo,wholePseudoVal,pseudoVal){var i,m,k,o,classes;if(this[nodeType]!==1)return!1;if(tag&&tag!=="*"&&this[tagName]&&this[tagName].toLowerCase()!==tag)return!1;if(idsAndClasses&&(m=idsAndClasses.match(id))&&m[1]!==this.id)return!1;if(idsAndClasses&&(classes=idsAndClasses.match(clas)))for(i=classes.length;i--;)if(!classRegex(classes[i].slice(1)).test(this.className))return!1;if(pseudo&&qwery.pseudos[pseudo]&&!qwery.pseudos[pseudo](this,pseudoVal))return!1;if(wholeAttribute&&!value){o=this.attributes;for(k in o)if(Object.prototype.hasOwnProperty.call(o,k)&&(o[k].name||k)==attribute)return this}return wholeAttribute&&!checkAttr(qualifier,getAttr(this,attribute)||"",value)?!1:this}function clean(s){return cleanCache.g(s)||cleanCache.s(s,s.replace(specialChars,"\\$1"))}function checkAttr(qualify,actual,val){switch(qualify){case"=":return actual==val;case"^=":return actual.match(attrCache.g("^="+val)||attrCache.s("^="+val,"^"+clean(val),1));case"$=":return actual.match(attrCache.g("$="+val)||attrCache.s("$="+val,clean(val)+"$",1));case"*=":return actual.match(attrCache.g(val)||attrCache.s(val,clean(val),1));case"~=":return actual.match(attrCache.g("~="+val)||attrCache.s("~="+val,"(?:^|\\s+)"+clean(val)+"(?:\\s+|$)",1));case"|=":return actual.match(attrCache.g("|="+val)||attrCache.s("|="+val,"^"+clean(val)+"(-|$)",1))}return 0}function _qwery(selector,_root){var r=[],ret=[],i,l,m,token,tag,els,intr,item,root=_root,tokens=tokenCache.g(selector)||tokenCache.s(selector,selector.split(tokenizr)),dividedTokens=selector.match(dividers);if(!tokens.length)return r;token=(tokens=tokens.slice(0)).pop();tokens.length&&(m=tokens[tokens.length-1].match(idOnly))&&(root=byId(_root,m[1]));if(!root)return r;intr=q(token);els=root!==_root&&root[nodeType]!==9&÷dTokens&&/^[+~]$/.test(dividedTokens[dividedTokens.length-1])?function(r){while(root=root.nextSibling)root[nodeType]==1&&(intr[1]?intr[1]==root[tagName].toLowerCase():1)&&(r[r.length]=root);return r}([]):root[byTag](intr[1]||"*");for(i=0,l=els.length;i<l;i++)if(item=interpret.apply(els[i],intr))r[r.length]=item;if(!tokens.length)return r;each(r,function(e){ancestorMatch(e,tokens,dividedTokens)&&(ret[ret.length]=e)});return ret}function is(el,selector,root){if(isNode(selector))return el==selector;if(arrayLike(selector))return!!~flatten(selector).indexOf(el);var selectors=selector.split(","),tokens,dividedTokens;while(selector=selectors.pop()){tokens=tokenCache.g(selector)||tokenCache.s(selector,selector.split(tokenizr));dividedTokens=selector.match(dividers);tokens=tokens.slice(0);if(interpret.apply(el,q(tokens.pop()))&&(!tokens.length||ancestorMatch(el,tokens,dividedTokens,root)))return!0}return!1}function ancestorMatch(el,tokens,dividedTokens,root){function crawl(e,i,p){while(p=walker[dividedTokens[i]](p,e))if(isNode(p)&&interpret.apply(p,q(tokens[i]))){if(!i)return p;if(cand=crawl(p,i-1,p))return cand}}var cand;return(cand=crawl(el,tokens.length-1,el))&&(!root||isAncestor(cand,root))}function isNode(el,t){return el&&typeof el=="object"&&(t=el[nodeType])&&(t==1||t==9)}function uniq(ar){var a=[],i,j;e:for(i=0;i<ar.length;++i){for(j=0;j<a.length;++j)if(a[j]==ar[i])continue e;a[a.length]=ar[i]}return a}function arrayLike(o){return typeof o=="object"&&isFinite(o.length)}function normalizeRoot(root){return root?typeof root=="string"?qwery(root)[0]:!root[nodeType]&&arrayLike(root)?root[0]:root:doc}function byId(root,id,el){return root[nodeType]===9?root.getElementById(id):root.ownerDocument&&((el=root.ownerDocument.getElementById(id))&&isAncestor(el,root)&&el||!isAncestor(root,root.ownerDocument)&&select('[id="'+id+'"]',root)[0])}function qwery(selector,_root){var m,el,root=normalizeRoot(_root);if(!root||!selector)return[];if(selector===window||isNode(selector))return!_root||selector!==window&&isNode(root)&&isAncestor(selector,root)?[selector]:[];if(selector&&arrayLike(selector))return flatten(selector);if(m=selector.match(easy)){if(m[1])return(el=byId(root,m[1]))?[el]:[];if(m[2])return arrayify(root[byTag](m[2]));if(hasByClass&&m[3])return arrayify(root[byClass](m[3]))}return select(selector,root)}function collectSelector(root,collector){return function(s){var oid,nid;if(splittable.test(s)){if(root[nodeType]!==9){(nid=oid=root.getAttribute("id"))||root.setAttribute("id",nid="__qwerymeupscotty");s='[id="'+nid+'"]'+s;collector(root.parentNode||root,s,!0);oid||root.removeAttribute("id")}return}s.length&&collector(root,s,!1)}}var doc=document,html=doc.documentElement,byClass="getElementsByClassName",byTag="getElementsByTagName",qSA="querySelectorAll",useNativeQSA="useNativeQSA",tagName="tagName",nodeType="nodeType",select,id=/#([\w\-]+)/,clas=/\.[\w\-]+/g,idOnly=/^#([\w\-]+)$/,classOnly=/^\.([\w\-]+)$/,tagOnly=/^([\w\-]+)$/,tagAndOrClass=/^([\w]+)?\.([\w\-]+)$/,splittable=/(^|,)\s*[>~+]/,normalizr=/^\s+|\s*([,\s\+\~>]|$)\s*/g,splitters=/[\s\>\+\~]/,splittersMore=/(?![\s\w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^'"]*\]|[\s\w\+\-]*\))/,specialChars=/([.*+?\^=!:${}()|\[\]\/\\])/g,simple=/^(\*|[a-z0-9]+)?(?:([\.\#]+[\w\-\.#]+)?)/,attr=/\[([\w\-]+)(?:([\|\^\$\*\~]?\=)['"]?([ \w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^]+)["']?)?\]/,pseudo=/:([\w\-]+)(\(['"]?([^()]+)['"]?\))?/,easy=new RegExp(idOnly.source+"|"+tagOnly.source+"|"+classOnly.source),dividers=new RegExp("("+splitters.source+")"+splittersMore.source,"g"),tokenizr=new RegExp(splitters.source+splittersMore.source),chunker=new RegExp(simple.source+"("+attr.source+")?"+"("+pseudo.source+")?"),walker={" ":function(node){return node&&node!==html&&node.parentNode},">":function(node,contestant){return node&&node.parentNode==contestant.parentNode&&node.parentNode},"~":function(node){return node&&node.previousSibling},"+":function(node,contestant,p1,p2){return node?(p1=previous(node))&&(p2=previous(contestant))&&p1==p2&&p1:!1}};cache.prototype={g:function(k){return this.c[k]||undefined},s:function(k,v,r){v=r?new RegExp(v):v;return this.c[k]=v}};var classCache=new cache,cleanCache=new cache,attrCache=new cache,tokenCache=new cache,isAncestor="compareDocumentPosition"in html?function(element,container){return(container.compareDocumentPosition(element)&16)==16}:"contains"in html?function(element,container){container=container[nodeType]===9||container==window?html:container;return container!==element&&container.contains(element)}:function(element,container){while(element=element.parentNode)if(element===container)return 1;return 0},getAttr=function(){var e=doc.createElement("p");return(e.innerHTML='<a href="#x">x</a>')&&e.firstChild.getAttribute("href")!="#x"?function(e,a){return a==="class"?e.className:a==="href"||a==="src"?e.getAttribute(a,2):e.getAttribute(a)}:function(e,a){return e.getAttribute(a)}}(),hasByClass=!!doc[byClass],hasQSA=doc.querySelector&&doc[qSA],selectQSA=function(selector,root){var result=[],ss,e;try{if(root[nodeType]===9||!splittable.test(selector))return arrayify(root[qSA](selector));each(ss=selector.split(","),collectSelector(root,function(ctx,s){e=ctx[qSA](s);e.length==1?result[result.length]=e.item(0):e.length&&(result=result.concat(arrayify(e)))}));return ss.length>1&&result.length>1?uniq(result):result}catch(ex){}return selectNonNative(selector,root)},selectNonNative=function(selector,root){var result=[],items,m,i,l,r,ss;selector=selector.replace(normalizr,"$1");if(m=selector.match(tagAndOrClass)){r=classRegex(m[2]);items=root[byTag](m[1]||"*");for(i=0,l=items.length;i<l;i++)r.test(items[i].className)&&(result[result.length]=items[i]);return result}each(ss=selector.split(","),collectSelector(root,function(ctx,s,rewrite){r=_qwery(s,ctx);for(i=0,l=r.length;i<l;i++)if(ctx[nodeType]===9||rewrite||isAncestor(r[i],root))result[result.length]=r[i]}));return ss.length>1&&result.length>1?uniq(result):result},configure=function(options){typeof options[useNativeQSA]!="undefined"&&(select=options[useNativeQSA]?hasQSA?selectQSA:selectNonNative:selectNonNative)};configure({useNativeQSA:!0});qwery.configure=configure;qwery.uniq=uniq;qwery.is=is;qwery.pseudos={};return qwery});provide("qwery",module.exports);(function($){var q=function(){var r;try{r=require("qwery")}catch(ex){r=require("qwery-mobile")}finally{return r}}();$.pseudos=q.pseudos;$._select=function(s,r){return($._select=function(){var b;if(typeof $.create=="function")return function(s,r){return/^\s*</.test(s)?$.create(s,r):q(s,r)};try{b=require("bonzo");return function(s,r){return/^\s*</.test(s)?b.create(s,r):q(s,r)}}catch(e){}return q}())(s,r)};$.ender({find:function(s){var r=[],i,l,j,k,els;for(i=0,l=this.length;i<l;i++){els=q(s,this[i]);for(j=0,k=els.length;j<k;j++)r.push(els[j])}return $(q.uniq(r))},and:function(s){var plus=$(s);for(var i=this.length,j=0,l=this.length+plus.length;i<l;i++,j++)this[i]=plus[j];this.length+=plus.length;return this},is:function(s,r){var i,l;for(i=0,l=this.length;i<l;i++)if(q.is(this[i],s,r))return!0;return!1}},!0)})(ender)})()
\ No newline at end of file diff --git a/.themes/classic/source/javascripts/github.js b/.themes/classic/source/javascripts/github.js index 678775a9..6cfc0b0b 100644 --- a/.themes/classic/source/javascripts/github.js +++ b/.themes/classic/source/javascripts/github.js @@ -1,33 +1,28 @@ var github = (function(){ + function escapeHtml(str) { + return $('<div/>').text(str).html(); + } function render(target, repos){ var i = 0, fragment = '', t = $(target)[0]; for(i = 0; i < repos.length; i++) { - fragment += '<li><a href="'+repos[i].url+'">'+repos[i].name+'</a><p>'+repos[i].description+'</p></li>'; + fragment += '<li><a href="'+repos[i].html_url+'">'+repos[i].name+'</a><p>'+escapeHtml(repos[i].description||'')+'</p></li>'; } t.innerHTML = fragment; } return { showRepos: function(options){ $.ajax({ - url: "http://github.com/api/v2/json/repos/show/"+options.user+"?callback=?" + url: "https://api.github.com/users/"+options.user+"/repos?sort=pushed&callback=?" , type: 'jsonp' , error: function (err) { $(options.target + ' li.loading').addClass('error').text("Error loading feed"); } , success: function(data) { var repos = []; - if (!data || !data.repositories) { return; } - for (var i = 0; i < data.repositories.length; i++) { - if (options.skip_forks && data.repositories[i].fork) { continue; } - repos.push(data.repositories[i]); + if (!data || !data.data) { return; } + for (var i = 0; i < data.data.length; i++) { + if (options.skip_forks && data.data[i].fork) { continue; } + repos.push(data.data[i]); } - repos.sort(function(a, b) { - var aDate = new Date(a.pushed_at).valueOf(), - bDate = new Date(b.pushed_at).valueOf(); - - if (aDate === bDate) { return 0; } - return aDate > bDate ? -1 : 1; - }); - if (options.count) { repos.splice(options.count); } render(options.target, repos); } diff --git a/.themes/classic/source/javascripts/libs/ender.js b/.themes/classic/source/javascripts/libs/ender.js index 5e56fd89..66c4e223 100644 --- a/.themes/classic/source/javascripts/libs/ender.js +++ b/.themes/classic/source/javascripts/libs/ender.js @@ -1,1497 +1,3256 @@ /*! - * Ender: open module JavaScript framework - * copyright Dustin Diaz & Jacob Thornton 2011 (@ded @fat) - * https://ender.no.de + * ============================================================= + * Ender: open module JavaScript framework (https://ender.no.de) + * Build: ender build jeesh reqwest + * ============================================================= + */ + +/*! + * Ender: open module JavaScript framework (client-lib) + * copyright Dustin Diaz & Jacob Thornton 2011-2012 (@ded @fat) + * http://ender.jit.su * License MIT - * Build: ender -b jeesh */ -!function (context) { +(function (context) { + + // a global object for node.js module compatiblity + // ============================================ + + context['global'] = context + + // Implements simple module system + // losely based on CommonJS Modules spec v1.1.1 + // ============================================ + + var modules = {} + , old = context['$'] + , oldEnder = context['ender'] + , oldRequire = context['require'] + , oldProvide = context['provide'] + + function require (identifier) { + // modules can be required from ender's build system, or found on the window + var module = modules['$' + identifier] || window[identifier] + if (!module) throw new Error("Ender Error: Requested module '" + identifier + "' has not been defined.") + return module + } + + function provide (name, what) { + return (modules['$' + name] = what) + } + + context['provide'] = provide + context['require'] = require function aug(o, o2) { - for (var k in o2) { - k != 'noConflict' && k != '_VERSION' && (o[k] = o2[k]); - } - return o; + for (var k in o2) k != 'noConflict' && k != '_VERSION' && (o[k] = o2[k]) + return o } - function boosh(s, r) { - var els; - if (ender._select && typeof s == 'string' || s.nodeName || s.length && 'item' in s || s == window) { //string || node || nodelist || window - els = ender._select(s, r); - els.selector = s; + /** + * main Ender return object + * @constructor + * @param {Array|Node|string} s a CSS selector or DOM node(s) + * @param {Array.|Node} r a root node(s) + */ + function Ender(s, r) { + var elements + , i + + this.selector = s + // string || node || nodelist || window + if (typeof s == 'undefined') { + elements = [] + this.selector = '' + } else if (typeof s == 'string' || s.nodeName || (s.length && 'item' in s) || s == window) { + elements = ender._select(s, r) } else { - els = isFinite(s.length) ? s : [s]; + elements = isFinite(s.length) ? s : [s] } - return aug(els, boosh); + this.length = elements.length + for (i = this.length; i--;) this[i] = elements[i] } - function ender(s, r) { - return boosh(s, r); + /** + * @param {function(el, i, inst)} fn + * @param {Object} opt_scope + * @returns {Ender} + */ + Ender.prototype['forEach'] = function (fn, opt_scope) { + var i, l + // opt out of native forEach so we can intentionally call our own scope + // defaulting to the current item and be able to return self + for (i = 0, l = this.length; i < l; ++i) i in this && fn.call(opt_scope || this[i], this[i], i, this) + // return self for chaining + return this } - aug(ender, { - _VERSION: '0.2.0', - ender: function (o, chain) { - aug(chain ? boosh : ender, o); - } - }); + Ender.prototype.$ = ender // handy reference to self - aug(boosh, { - forEach: function (fn, scope) { - // opt out of native forEach so we can intentionally call our own scope - // defaulting to the current item - for (var i = 0, l = this.length; i < l; ++i) { - i in this && fn.call(scope || this[i], this[i], i, this); - } - // return self for chaining - return this; - } - }); - var old = context.$; - ender.noConflict = function () { - context.$ = old; - return this; - }; + function ender(s, r) { + return new Ender(s, r) + } - (typeof module !== 'undefined') && module.exports && (module.exports = ender); - // use subscript notation as extern for Closure compilation - context['ender'] = context['$'] = ender; + ender['_VERSION'] = '0.4.3-dev' -}(this); -/*! - * bean.js - copyright Jacob Thornton 2011 - * https://github.com/fat/bean - * MIT License - * special thanks to: - * dean edwards: http://dean.edwards.name/ - * dperini: https://github.com/dperini/nwevents - * the entire mootools team: github.com/mootools/mootools-core - */ -!function (context) { - var __uid = 1, registry = {}, collected = {}, - overOut = /over|out/, - namespace = /[^\.]*(?=\..*)\.|.*/, - stripName = /\..*/, - addEvent = 'addEventListener', - attachEvent = 'attachEvent', - removeEvent = 'removeEventListener', - detachEvent = 'detachEvent', - doc = context.document || {}, - root = doc.documentElement || {}, - W3C_MODEL = root[addEvent], - eventSupport = W3C_MODEL ? addEvent : attachEvent, + ender.fn = Ender.prototype // for easy compat to jQuery plugins - isDescendant = function (parent, child) { - var node = child.parentNode; - while (node != null) { - if (node == parent) { - return true; - } - node = node.parentNode; - } - }, - - retrieveUid = function (obj, uid) { - return (obj.__uid = uid || obj.__uid || __uid++); - }, + ender.ender = function (o, chain) { + aug(chain ? Ender.prototype : ender, o) + } - retrieveEvents = function (element) { - var uid = retrieveUid(element); - return (registry[uid] = registry[uid] || {}); - }, + ender._select = function (s, r) { + if (typeof s == 'string') return (r || document).querySelectorAll(s) + if (s.nodeName) return [s] + return s + } - listener = W3C_MODEL ? function (element, type, fn, add) { - element[add ? addEvent : removeEvent](type, fn, false); - } : function (element, type, fn, add, custom) { - custom && add && (element['_on' + custom] = element['_on' + custom] || 0); - element[add ? attachEvent : detachEvent]('on' + type, fn); - }, - nativeHandler = function (element, fn, args) { - return function (event) { - event = fixEvent(event || ((this.ownerDocument || this.document || this).parentWindow || context).event); - return fn.apply(element, [event].concat(args)); - }; - }, + // use callback to receive Ender's require & provide and remove them from global + ender.noConflict = function (callback) { + context['$'] = old + if (callback) { + context['provide'] = oldProvide + context['require'] = oldRequire + context['ender'] = oldEnder + if (typeof callback == 'function') callback(require, provide, this) + } + return this + } - customHandler = function (element, fn, type, condition, args) { - return function (event) { - if (condition ? condition.call(this, event) : W3C_MODEL ? true : event && event.propertyName == '_on' + type || !event) { - fn.apply(element, [event].concat(args)); + if (typeof module !== 'undefined' && module.exports) module.exports = ender + // use subscript notation as extern for Closure compilation + context['ender'] = context['$'] = ender + +}(this)); + +(function () { + + var module = { exports: {} }, exports = module.exports; + + /*! + * Reqwest! A general purpose XHR connection manager + * (c) Dustin Diaz 2012 + * https://github.com/ded/reqwest + * license MIT + */ + !function (name, definition) { + if (typeof module != 'undefined') module.exports = definition() + else if (typeof define == 'function' && define.amd) define(definition) + else this[name] = definition() + }('reqwest', function () { + + var win = window + , doc = document + , twoHundo = /^20\d$/ + , byTag = 'getElementsByTagName' + , readyState = 'readyState' + , contentType = 'Content-Type' + , requestedWith = 'X-Requested-With' + , head = doc[byTag]('head')[0] + , uniqid = 0 + , callbackPrefix = 'reqwest_' + (+new Date()) + , lastValue // data stored by the most recent JSONP callback + , xmlHttpRequest = 'XMLHttpRequest' + + var isArray = typeof Array.isArray == 'function' ? Array.isArray : function (a) { + return a instanceof Array + } + var defaultHeaders = { + contentType: 'application/x-www-form-urlencoded' + , requestedWith: xmlHttpRequest + , accept: { + '*': 'text/javascript, text/html, application/xml, text/xml, */*' + , xml: 'application/xml, text/xml' + , html: 'text/html' + , text: 'text/plain' + , json: 'application/json, text/javascript' + , js: 'application/javascript, text/javascript' + } } - }; - }, - - addListener = function (element, orgType, fn, args) { - var type = orgType.replace(stripName, ''), - events = retrieveEvents(element), - handlers = events[type] || (events[type] = {}), - uid = retrieveUid(fn, orgType.replace(namespace, '')); - if (handlers[uid]) { - return element; - } - var custom = customEvents[type]; - if (custom) { - fn = custom.condition ? customHandler(element, fn, type, custom.condition) : fn; - type = custom.base || type; - } - var isNative = nativeEvents[type]; - fn = isNative ? nativeHandler(element, fn, args) : customHandler(element, fn, type, false, args); - isNative = W3C_MODEL || isNative; - if (type == 'unload') { - var org = fn; - fn = function () { - removeListener(element, type, fn) && org(); - }; - } - element[eventSupport] && listener(element, isNative ? type : 'propertychange', fn, true, !isNative && type); - handlers[uid] = fn; - fn.__uid = uid; - return type == 'unload' ? element : (collected[retrieveUid(element)] = element); - }, - - removeListener = function (element, orgType, handler) { - var uid, names, uids, i, events = retrieveEvents(element), type = orgType.replace(stripName, ''); - if (!events || !events[type]) { - return element; - } - names = orgType.replace(namespace, ''); - uids = names ? names.split('.') : [handler.__uid]; - for (i = uids.length; i--;) { - uid = uids[i]; - handler = events[type][uid]; - delete events[type][uid]; - if (element[eventSupport]) { - type = customEvents[type] ? customEvents[type].base : type; - var isNative = W3C_MODEL || nativeEvents[type]; - listener(element, isNative ? type : 'propertychange', handler, false, !isNative && type); - } - } - return element; - }, - - del = function (selector, fn, $) { - return function (e) { - var array = typeof selector == 'string' ? $(selector, this) : selector; - for (var target = e.target; target && target != this; target = target.parentNode) { - for (var i = array.length; i--;) { - if (array[i] == target) { - return fn.apply(target, arguments); + var xhr = win[xmlHttpRequest] ? + function () { + return new XMLHttpRequest() + } : + function () { + return new ActiveXObject('Microsoft.XMLHTTP') + } + + function handleReadyState(o, success, error) { + return function () { + if (o && o[readyState] == 4) { + if (twoHundo.test(o.status)) { + success(o) + } else { + error(o) } } } - }; - }, - - add = function (element, events, fn, delfn, $) { - if (typeof events == 'object' && !fn) { - for (var type in events) { - events.hasOwnProperty(type) && add(element, type, events[type]); - } - } else { - var isDel = typeof fn == 'string', types = (isDel ? fn : events).split(' '); - fn = isDel ? del(events, delfn, $) : fn; - for (var i = types.length; i--;) { - addListener(element, types[i], fn, Array.prototype.slice.call(arguments, isDel ? 4 : 3)); + } + + function setHeaders(http, o) { + var headers = o.headers || {}, h + headers.Accept = headers.Accept || defaultHeaders.accept[o.type] || defaultHeaders.accept['*'] + // breaks cross-origin requests with legacy browsers + if (!o.crossOrigin && !headers[requestedWith]) headers[requestedWith] = defaultHeaders.requestedWith + if (!headers[contentType]) headers[contentType] = o.contentType || defaultHeaders.contentType + for (h in headers) { + headers.hasOwnProperty(h) && http.setRequestHeader(h, headers[h]) } } - return element; - }, - - remove = function (element, orgEvents, fn) { - var k, type, events, - isString = typeof(orgEvents) == 'string', - names = isString && orgEvents.replace(namespace, ''), - rm = removeListener, - attached = retrieveEvents(element); - if (isString && /\s/.test(orgEvents)) { - orgEvents = orgEvents.split(' '); - var i = orgEvents.length - 1; - while (remove(element, orgEvents[i]) && i--) {} - return element; - } - events = isString ? orgEvents.replace(stripName, '') : orgEvents; - if (!attached || (isString && !attached[events])) { - return element; - } - if (typeof fn == 'function') { - rm(element, events, fn); - } else if (names) { - rm(element, orgEvents); - } else { - rm = events ? rm : remove; - type = isString && events; - events = events ? (fn || attached[events] || events) : attached; - for (k in events) { - events.hasOwnProperty(k) && rm(element, type || k, events[k]); + + function setCredentials(http, o) { + if (typeof o.withCredentials !== "undefined" && typeof http.withCredentials !== "undefined") { + http.withCredentials = !!o.withCredentials } } - return element; - }, - - fire = function (element, type, args) { - var evt, k, i, types = type.split(' '); - for (i = types.length; i--;) { - type = types[i].replace(stripName, ''); - var isNative = nativeEvents[type], - isNamespace = types[i].replace(namespace, ''), - handlers = retrieveEvents(element)[type]; - if (isNamespace) { - isNamespace = isNamespace.split('.'); - for (k = isNamespace.length; k--;) { - handlers[isNamespace[k]] && handlers[isNamespace[k]].apply(element, args); - } - } else if (!args && element[eventSupport]) { - fireListener(isNative, type, element); + + function generalCallback(data) { + lastValue = data + } + + function urlappend(url, s) { + return url + (/\?/.test(url) ? '&' : '?') + s + } + + function handleJsonp(o, fn, err, url) { + var reqId = uniqid++ + , cbkey = o.jsonpCallback || 'callback' // the 'callback' key + , cbval = o.jsonpCallbackName || reqwest.getcallbackPrefix(reqId) + // , cbval = o.jsonpCallbackName || ('reqwest_' + reqId) // the 'callback' value + , cbreg = new RegExp('((^|\\?|&)' + cbkey + ')=([^&]+)') + , match = url.match(cbreg) + , script = doc.createElement('script') + , loaded = 0 + + if (match) { + if (match[3] === '?') { + url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name + } else { + cbval = match[3] // provided callback func name + } } else { - for (k in handlers) { - handlers.hasOwnProperty(k) && handlers[k].apply(element, args); + url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em + } + + win[cbval] = generalCallback + + script.type = 'text/javascript' + script.src = url + script.async = true + if (typeof script.onreadystatechange !== 'undefined') { + // need this for IE due to out-of-order onreadystatechange(), binding script + // execution to an event listener gives us control over when the script + // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html + script.event = 'onclick' + script.htmlFor = script.id = '_reqwest_' + reqId + } + + script.onload = script.onreadystatechange = function () { + if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) { + return false } + script.onload = script.onreadystatechange = null + script.onclick && script.onclick() + // Call the user callback with the last value stored and clean up values and scripts. + o.success && o.success(lastValue) + lastValue = undefined + head.removeChild(script) + loaded = 1 } + + // Add the script to the DOM head + head.appendChild(script) } - return element; - }, - - fireListener = W3C_MODEL ? function (isNative, type, element) { - evt = document.createEvent(isNative ? "HTMLEvents" : "UIEvents"); - evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, context, 1); - element.dispatchEvent(evt); - } : function (isNative, type, element) { - isNative ? element.fireEvent('on' + type, document.createEventObject()) : element['_on' + type]++; - }, - - clone = function (element, from, type) { - var events = retrieveEvents(from), obj, k; - obj = type ? events[type] : events; - for (k in obj) { - obj.hasOwnProperty(k) && (type ? add : clone)(element, type || from, type ? obj[k] : k); - } - return element; - }, - - fixEvent = function (e) { - var result = {}; - if (!e) { - return result; - } - var type = e.type, target = e.target || e.srcElement; - result.preventDefault = fixEvent.preventDefault(e); - result.stopPropagation = fixEvent.stopPropagation(e); - result.target = target && target.nodeType == 3 ? target.parentNode : target; - if (~type.indexOf('key')) { - result.keyCode = e.which || e.keyCode; - } else if ((/click|mouse|menu/i).test(type)) { - result.rightClick = e.which == 3 || e.button == 2; - result.pos = { x: 0, y: 0 }; - if (e.pageX || e.pageY) { - result.clientX = e.pageX; - result.clientY = e.pageY; - } else if (e.clientX || e.clientY) { - result.clientX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; - result.clientY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; - } - overOut.test(type) && (result.relatedTarget = e.relatedTarget || e[(type == 'mouseover' ? 'from' : 'to') + 'Element']); - } - for (var k in e) { - if (!(k in result)) { - result[k] = e[k]; - } - } - return result; - }; - - fixEvent.preventDefault = function (e) { - return function () { - if (e.preventDefault) { - e.preventDefault(); + + function getRequest(o, fn, err) { + var method = (o.method || 'GET').toUpperCase() + , url = typeof o === 'string' ? o : o.url + // convert non-string objects to query-string form unless o.processData is false + , data = (o.processData !== false && o.data && typeof o.data !== 'string') + ? reqwest.toQueryString(o.data) + : (o.data || null) + , http + + // if we're working on a GET request and we have data then we should append + // query string to end of URL and not post data + if ((o.type == 'jsonp' || method == 'GET') && data) { + url = urlappend(url, data) + data = null } - else { - e.returnValue = false; + + if (o.type == 'jsonp') return handleJsonp(o, fn, err, url) + + http = xhr() + http.open(method, url, true) + setHeaders(http, o) + setCredentials(http, o) + http.onreadystatechange = handleReadyState(http, fn, err) + o.before && o.before(http) + http.send(data) + return http + } + + function Reqwest(o, fn) { + this.o = o + this.fn = fn + + init.apply(this, arguments) + } + + function setType(url) { + var m = url.match(/\.(json|jsonp|html|xml)(\?|$)/) + return m ? m[1] : 'js' + } + + function init(o, fn) { + + this.url = typeof o == 'string' ? o : o.url + this.timeout = null + + // whether request has been fulfilled for purpose + // of tracking the Promises + this._fulfilled = false + // success handlers + this._fulfillmentHandlers = [] + // error handlers + this._errorHandlers = [] + // complete (both success and fail) handlers + this._completeHandlers = [] + this._erred = false + this._responseArgs = {} + + var self = this + , type = o.type || setType(this.url) + + fn = fn || function () {} + + if (o.timeout) { + this.timeout = setTimeout(function () { + self.abort() + }, o.timeout) } - }; - }; - - fixEvent.stopPropagation = function (e) { - return function () { - if (e.stopPropagation) { - e.stopPropagation(); - } else { - e.cancelBubble = true; + + if (o.success) { + this._fulfillmentHandlers.push(function () { + o.success.apply(o, arguments) + }) } - }; - }; - - var nativeEvents = { click: 1, dblclick: 1, mouseup: 1, mousedown: 1, contextmenu: 1, //mouse buttons - mousewheel: 1, DOMMouseScroll: 1, //mouse wheel - mouseover: 1, mouseout: 1, mousemove: 1, selectstart: 1, selectend: 1, //mouse movement - keydown: 1, keypress: 1, keyup: 1, //keyboard - orientationchange: 1, // mobile - touchstart: 1, touchmove: 1, touchend: 1, touchcancel: 1, // touch - gesturestart: 1, gesturechange: 1, gestureend: 1, // gesture - focus: 1, blur: 1, change: 1, reset: 1, select: 1, submit: 1, //form elements - load: 1, unload: 1, beforeunload: 1, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window - error: 1, abort: 1, scroll: 1 }; //misc - - function check(event) { - var related = event.relatedTarget; - if (!related) { - return related == null; + + if (o.error) { + this._errorHandlers.push(function () { + o.error.apply(o, arguments) + }) + } + + if (o.complete) { + this._completeHandlers.push(function () { + o.complete.apply(o, arguments) + }) + } + + function complete(resp) { + o.timeout && clearTimeout(self.timeout) + self.timeout = null + while (self._completeHandlers.length > 0) { + self._completeHandlers.shift()(resp) + } + } + + function success(resp) { + var r = resp.responseText + if (r) { + switch (type) { + case 'json': + try { + resp = win.JSON ? win.JSON.parse(r) : eval('(' + r + ')') + } catch (err) { + return error(resp, 'Could not parse JSON in response', err) + } + break; + case 'js': + resp = eval(r) + break; + case 'html': + resp = r + break; + case 'xml': + resp = resp.responseXML; + break; + } + } + + self._responseArgs.resp = resp + self._fulfilled = true + fn(resp) + while (self._fulfillmentHandlers.length > 0) { + self._fulfillmentHandlers.shift()(resp) + } + + complete(resp) + } + + function error(resp, msg, t) { + self._responseArgs.resp = resp + self._responseArgs.msg = msg + self._responseArgs.t = t + self._erred = true + while (self._errorHandlers.length > 0) { + self._errorHandlers.shift()(resp, msg, t) + } + complete(resp) + } + + this.request = getRequest(o, success, error) } - return (related != this && related.prefix != 'xul' && !/document/.test(this.toString()) && !isDescendant(this, related)); - } - - var customEvents = { - mouseenter: { base: 'mouseover', condition: check }, - mouseleave: { base: 'mouseout', condition: check }, - mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' } - }; - - var bean = { add: add, remove: remove, clone: clone, fire: fire }; - - var clean = function (el) { - var uid = remove(el).__uid; - if (uid) { - delete collected[uid]; - delete registry[uid]; + + Reqwest.prototype = { + abort: function () { + this.request.abort() + } + + , retry: function () { + init.call(this, this.o, this.fn) + } + + /** + * Small deviation from the Promises A CommonJs specification + * http://wiki.commonjs.org/wiki/Promises/A + */ + + /** + * `then` will execute upon successful requests + */ + , then: function (success, fail) { + if (this._fulfilled) { + success(this._responseArgs.resp) + } else if (this._erred) { + fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t) + } else { + this._fulfillmentHandlers.push(success) + this._errorHandlers.push(fail) + } + return this + } + + /** + * `always` will execute whether the request succeeds or fails + */ + , always: function (fn) { + if (this._fulfilled || this._erred) { + fn(this._responseArgs.resp) + } else { + this._completeHandlers.push(fn) + } + return this + } + + /** + * `fail` will execute when the request fails + */ + , fail: function (fn) { + if (this._erred) { + fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t) + } else { + this._errorHandlers.push(fn) + } + return this + } } - }; - - if (context[attachEvent]) { - add(context, 'unload', function () { - for (var k in collected) { - collected.hasOwnProperty(k) && clean(collected[k]); + + function reqwest(o, fn) { + return new Reqwest(o, fn) + } + + // normalize newline variants according to spec -> CRLF + function normalize(s) { + return s ? s.replace(/\r?\n/g, '\r\n') : '' + } + + function serial(el, cb) { + var n = el.name + , t = el.tagName.toLowerCase() + , optCb = function (o) { + // IE gives value="" even where there is no value attribute + // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273 + if (o && !o.disabled) + cb(n, normalize(o.attributes.value && o.attributes.value.specified ? o.value : o.text)) + } + + // don't serialize elements that are disabled or without a name + if (el.disabled || !n) return; + + switch (t) { + case 'input': + if (!/reset|button|image|file/i.test(el.type)) { + var ch = /checkbox/i.test(el.type) + , ra = /radio/i.test(el.type) + , val = el.value; + // WebKit gives us "" instead of "on" if a checkbox has no value, so correct it here + (!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val)) + } + break; + case 'textarea': + cb(n, normalize(el.value)) + break; + case 'select': + if (el.type.toLowerCase() === 'select-one') { + optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null) + } else { + for (var i = 0; el.length && i < el.length; i++) { + el.options[i].selected && optCb(el.options[i]) + } + } + break; } - context.CollectGarbage && CollectGarbage(); - }); - } - - var oldBean = context.bean; - bean.noConflict = function () { - context.bean = oldBean; - return this; - }; - - (typeof module !== 'undefined' && module.exports) ? - (module.exports = bean) : - (context['bean'] = bean); - -}(this);!function ($) { - var b = bean.noConflict(), - integrate = function (method, type, method2) { - var _args = type ? [type] : []; - return function () { - for (var args, i = 0, l = this.length; i < l; i++) { - args = [this[i]].concat(_args, Array.prototype.slice.call(arguments, 0)); - args.length == 4 && args.push($); - !arguments.length && method == 'add' && type && (method = 'fire'); - b[method].apply(this, args); + } + + // collect up all form elements found from the passed argument elements all + // the way down to child elements; pass a '<form>' or form fields. + // called with 'this'=callback to use for serial() on each element + function eachFormElement() { + var cb = this + , e, i, j + , serializeSubtags = function (e, tags) { + for (var i = 0; i < tags.length; i++) { + var fa = e[byTag](tags[i]) + for (j = 0; j < fa.length; j++) serial(fa[j], cb) } - return this; - }; - }; - - var add = integrate('add'), - remove = integrate('remove'), - fire = integrate('fire'); - - var methods = { - - on: add, - addListener: add, - bind: add, - listen: add, - delegate: add, - - unbind: remove, - unlisten: remove, - removeListener: remove, - undelegate: remove, - - emit: fire, - trigger: fire, - - cloneEvents: integrate('clone'), - - hover: function (enter, leave) { - for (var i = 0, l = this.length; i < l; i++) { - b.add.call(this, this[i], 'mouseenter', enter); - b.add.call(this, this[i], 'mouseleave', leave); + } + + for (i = 0; i < arguments.length; i++) { + e = arguments[i] + if (/input|select|textarea/i.test(e.tagName)) serial(e, cb) + serializeSubtags(e, [ 'input', 'select', 'textarea' ]) } - return this; } - }; - - var shortcuts = [ - 'blur', 'change', 'click', 'dblclick', 'error', 'focus', 'focusin', - 'focusout', 'keydown', 'keypress', 'keyup', 'load', 'mousedown', - 'mouseenter', 'mouseleave', 'mouseout', 'mouseover', 'mouseup', - 'resize', 'scroll', 'select', 'submit', 'unload' - ]; - - for (var i = shortcuts.length; i--;) { - var shortcut = shortcuts[i]; - methods[shortcut] = integrate('add', shortcut); - } - - $.ender(methods, true); -}(ender); -/*! - * bonzo.js - copyright @dedfat 2011 - * https://github.com/ded/bonzo - * Follow our software http://twitter.com/dedfat - * MIT License - */ -!function (context) { - - var doc = context.document, - html = doc.documentElement, - query = null, - byTag = 'getElementsByTagName', - specialAttributes = /^checked|value|selected$/, - specialTags = /select|map|fieldset|table|tbody|tr|colgroup/i, - tagMap = { select: 'option', table: 'tbody', tr: 'td' }, - stateAttributes = /^checked|selected$/, - ie = /msie/i.test(navigator.userAgent), - uidList = [], - uuids = 0, - digit = /^-?[\d\.]+$/, - px = 'px', - // commonly used methods - setAttribute = 'setAttribute', - getAttribute = 'getAttribute', - trimReplace = /(^\s*|\s*$)/g, - unitless = { lineHeight: 1, zoom: 1, zIndex: 1, opacity: 1 }; - - function classReg(c) { - return new RegExp("(^|\\s+)" + c + "(\\s+|$)"); - } - - function each(ar, fn, scope) { - for (var i = 0, l = ar.length; i < l; i++) { - fn.call(scope || ar[i], ar[i], i, ar); + + // standard query string style serialization + function serializeQueryString() { + return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments)) } - return ar; - } - - var trim = String.prototype.trim ? - function (s) { - return s.trim(); - } : - function (s) { - return s.replace(trimReplace, ''); - }; - - function camelize(s) { - return s.replace(/-(.)/g, function (m, m1) { - return m1.toUpperCase(); - }); - } - - function is(node) { - return node && node.nodeName && node.nodeType == 1; - } - - function some(ar, fn, scope) { - for (var i = 0, j = ar.length; i < j; ++i) { - if (fn.call(scope, ar[i], i, ar)) { - return true; - } + + // { 'name': 'value', ... } style serialization + function serializeHash() { + var hash = {} + eachFormElement.apply(function (name, value) { + if (name in hash) { + hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]]) + hash[name].push(value) + } else hash[name] = value + }, arguments) + return hash } - return false; - } - - var getStyle = doc.defaultView && doc.defaultView.getComputedStyle ? - function (el, property) { - var value = null; - if (property == 'float') { - property = 'cssFloat'; - } - var computed = doc.defaultView.getComputedStyle(el, ''); - computed && (value = computed[camelize(property)]); - return el.style[property] || value; - - } : (ie && html.currentStyle) ? - - function (el, property) { - property = camelize(property); - property = property == 'float' ? 'styleFloat' : property; - - if (property == 'opacity') { - var val = 100; - try { - val = el.filters['DXImageTransform.Microsoft.Alpha'].opacity; - } catch (e1) { - try { - val = el.filters('alpha').opacity; - } catch (e2) {} + + // [ { name: 'name', value: 'value' }, ... ] style serialization + reqwest.serializeArray = function () { + var arr = [] + eachFormElement.apply(function (name, value) { + arr.push({name: name, value: value}) + }, arguments) + return arr + } + + reqwest.serialize = function () { + if (arguments.length === 0) return '' + var opt, fn + , args = Array.prototype.slice.call(arguments, 0) + + opt = args.pop() + opt && opt.nodeType && args.push(opt) && (opt = null) + opt && (opt = opt.type) + + if (opt == 'map') fn = serializeHash + else if (opt == 'array') fn = reqwest.serializeArray + else fn = serializeQueryString + + return fn.apply(null, args) + } + + reqwest.toQueryString = function (o) { + var qs = '', i + , enc = encodeURIComponent + , push = function (k, v) { + qs += enc(k) + '=' + enc(v) + '&' + } + + if (isArray(o)) { + for (i = 0; o && i < o.length; i++) push(o[i].name, o[i].value) + } else { + for (var k in o) { + if (!Object.hasOwnProperty.call(o, k)) continue; + var v = o[k] + if (isArray(v)) { + for (i = 0; i < v.length; i++) push(k, v[i]) + } else push(k, o[k]) } - return val / 100; } - var value = el.currentStyle ? el.currentStyle[property] : null; - return el.style[property] || value; - } : - - function (el, property) { - return el.style[camelize(property)]; - }; - - function insert(target, host, fn) { - var i = 0, self = host || this, r = []; - each(normalize(query ? query(target) : target), function (t) { - each(self, function (el) { - var n = el.cloneNode(true); - fn(t, n); - r[i] = n; - i++; - }); - }, this); - each(r, function (e, i) { - self[i] = e; - }); - self.length = i; - return self; - } - - function xy(el, x, y) { - var $el = bonzo(el), - style = $el.css('position'), - offset = $el.offset(), - rel = 'relative', - isRel = style == rel, - delta = [parseInt($el.css('left'), 10), parseInt($el.css('top'), 10)]; - - if (style == 'static') { - $el.css('position', rel); - style = rel; + + // spaces should be + according to spec + return qs.replace(/&$/, '').replace(/%20/g, '+') } - - isNaN(delta[0]) && (delta[0] = isRel ? 0 : el.offsetLeft); - isNaN(delta[1]) && (delta[1] = isRel ? 0 : el.offsetTop); - - x !== null && (el.style.left = x - offset.left + delta[0] + 'px'); - y !== null && (el.style.top = y - offset.top + delta[1] + 'px'); - - } - - function Bonzo(elements) { - this.length = 0; - this.original = elements; - if (elements) { - elements = typeof elements !== 'string' && - !elements.nodeType && - typeof elements.length !== 'undefined' ? - elements : - [elements]; - this.length = elements.length; - for (var i = 0; i < elements.length; i++) { - this[i] = elements[i]; + + reqwest.getcallbackPrefix = function (reqId) { + return callbackPrefix + } + + // jQuery and Zepto compatibility, differences can be remapped here so you can call + // .ajax.compat(options, callback) + reqwest.compat = function (o, fn) { + if (o) { + o.type && (o.method = o.type) && delete o.type + o.dataType && (o.type = o.dataType) + o.jsonpCallback && (o.jsonpCallbackName = o.jsonpCallback) && delete o.jsonpCallback + o.jsonp && (o.jsonpCallback = o.jsonp) } + return new Reqwest(o, fn) } - } - - Bonzo.prototype = { - - each: function (fn, scope) { - return each(this, fn, scope); - }, - - map: function (fn, reject) { - var m = [], n, i; - for (i = 0; i < this.length; i++) { - n = fn.call(this, this[i]); - reject ? (reject(n) && m.push(n)) : m.push(n); - } - return m; - }, - - first: function () { - return bonzo(this[0]); - }, - - last: function () { - return bonzo(this[this.length - 1]); - }, - - html: function (h, text) { - var method = text ? - html.textContent == null ? - 'innerText' : - 'textContent' : - 'innerHTML', m; - function append(el, tag) { - while (el.firstChild) { - el.removeChild(el.firstChild); - } - each(normalize(h, tag), function (node) { - el.appendChild(node); - }); - } - return typeof h !== 'undefined' ? - this.each(function (el) { - (m = el.tagName.match(specialTags)) ? - append(el, m[0]) : - (el[method] = h); - }) : - this[0] ? this[0][method] : ''; - }, - - text: function (text) { - return this.html(text, 1); - }, - - addClass: function (c) { - return this.each(function (el) { - this.hasClass(el, c) || (el.className = trim(el.className + ' ' + c)); - }, this); - }, - - removeClass: function (c) { - return this.each(function (el) { - this.hasClass(el, c) && (el.className = trim(el.className.replace(classReg(c), ' '))); - }, this); - }, - - hasClass: function (el, c) { - return typeof c == 'undefined' ? - some(this, function (i) { - return classReg(el).test(i.className); - }) : - classReg(c).test(el.className); - }, - - toggleClass: function (c, condition) { - if (typeof condition !== 'undefined' && !condition) { - return this; - } - return this.each(function (el) { - this.hasClass(el, c) ? - (el.className = trim(el.className.replace(classReg(c), ' '))) : - (el.className = trim(el.className + ' ' + c)); - }, this); - }, - - show: function (type) { - return this.each(function (el) { - el.style.display = type || ''; - }); - }, - - hide: function (elements) { - return this.each(function (el) { - el.style.display = 'none'; - }); - }, - - append: function (node) { - return this.each(function (el) { - each(normalize(node), function (i) { - el.appendChild(i); - }); - }); - }, - - prepend: function (node) { - return this.each(function (el) { - var first = el.firstChild; - each(normalize(node), function (i) { - el.insertBefore(i, first); - }); - }); - }, - - appendTo: function (target, host) { - return insert.call(this, target, host, function (t, el) { - t.appendChild(el); - }); - }, - - prependTo: function (target, host) { - return insert.call(this, target, host, function (t, el) { - t.insertBefore(el, t.firstChild); - }); - }, - - next: function () { - return this.related('nextSibling'); - }, - - previous: function () { - return this.related('previousSibling'); - }, - - related: function (method) { - return this.map( - function (el) { - el = el[method]; - while (el && el.nodeType !== 1) { - el = el[method]; + + return reqwest + }); + + + provide("reqwest", module.exports); + + !function ($) { + var r = require('reqwest') + , integrate = function(method) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + , i = (this && this.length) || 0 + while (i--) args.unshift(this[i]) + return r[method].apply(null, args) } - return el || 0; - }, - function (el) { - return el; } - ); - }, - - before: function (node) { - return this.each(function (el) { - each(bonzo.create(node), function (i) { - el.parentNode.insertBefore(i, el); - }); - }); - }, - - after: function (node) { - return this.each(function (el) { - each(bonzo.create(node), function (i) { - el.parentNode.insertBefore(i, el.nextSibling); - }); - }); - }, - - insertBefore: function (target, host) { - return insert.call(this, target, host, function (t, el) { - t.parentNode.insertBefore(el, t); - }); - }, - - insertAfter: function (target, host) { - return insert.call(this, target, host, function (t, el) { - var sibling = t.nextSibling; - if (sibling) { - t.parentNode.insertBefore(el, sibling); + , s = integrate('serialize') + , sa = integrate('serializeArray') + + $.ender({ + ajax: r + , serialize: r.serialize + , serializeArray: r.serializeArray + , toQueryString: r.toQueryString + }) + + $.ender({ + serialize: s + , serializeArray: sa + }, true) + }(ender); + + +}()); + +(function () { + + var module = { exports: {} }, exports = module.exports; + + /*! + * Bean - copyright (c) Jacob Thornton 2011-2012 + * https://github.com/fat/bean + * MIT license + */ + !(function (name, context, definition) { + if (typeof module != 'undefined' && module.exports) module.exports = definition(name, context); + else if (typeof define == 'function' && typeof define.amd == 'object') define(definition); + else context[name] = definition(name, context); + }('bean', this, function (name, context) { + var win = window + , old = context[name] + , namespaceRegex = /[^\.]*(?=\..*)\.|.*/ + , nameRegex = /\..*/ + , addEvent = 'addEventListener' + , removeEvent = 'removeEventListener' + , doc = document || {} + , root = doc.documentElement || {} + , W3C_MODEL = root[addEvent] + , eventSupport = W3C_MODEL ? addEvent : 'attachEvent' + , ONE = {} // singleton for quick matching making add() do one() + + , slice = Array.prototype.slice + , str2arr = function (s, d) { return s.split(d || ' ') } + , isString = function (o) { return typeof o == 'string' } + , isFunction = function (o) { return typeof o == 'function' } + + // events that we consider to be 'native', anything not in this list will + // be treated as a custom event + , standardNativeEvents = + 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons + 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel + 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement + 'keydown keypress keyup ' + // keyboard + 'orientationchange ' + // mobile + 'focus blur change reset select submit ' + // form elements + 'load unload beforeunload resize move DOMContentLoaded ' + // window + 'readystatechange message ' + // window + 'error abort scroll ' // misc + // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event + // that doesn't actually exist, so make sure we only do these on newer browsers + , w3cNativeEvents = + 'show ' + // mouse buttons + 'input invalid ' + // form elements + 'touchstart touchmove touchend touchcancel ' + // touch + 'gesturestart gesturechange gestureend ' + // gesture + 'textinput' + // TextEvent + 'readystatechange pageshow pagehide popstate ' + // window + 'hashchange offline online ' + // window + 'afterprint beforeprint ' + // printing + 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd + 'loadstart progress suspend emptied stalled loadmetadata ' + // media + 'loadeddata canplay canplaythrough playing waiting seeking ' + // media + 'seeked ended durationchange timeupdate play pause ratechange ' + // media + 'volumechange cuechange ' + // media + 'checking noupdate downloading cached updateready obsolete ' // appcache + + // convert to a hash for quick lookups + , nativeEvents = (function (hash, events, i) { + for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1) + return hash + }({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : '')))) + + // custom events are events that we *fake*, they are not provided natively but + // we can use native events to generate them + , customEvents = (function () { + var isAncestor = 'compareDocumentPosition' in root + ? function (element, container) { + return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16 + } + : 'contains' in root + ? function (element, container) { + container = container.nodeType === 9 || container === window ? root : container + return container !== element && container.contains(element) + } + : function (element, container) { + while (element = element.parentNode) if (element === container) return 1 + return 0 + } + , check = function (event) { + var related = event.relatedTarget + return !related + ? related == null + : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString()) + && !isAncestor(related, this)) + } + + return { + mouseenter: { base: 'mouseover', condition: check } + , mouseleave: { base: 'mouseout', condition: check } + , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' } + } + }()) + + // we provide a consistent Event object across browsers by taking the actual DOM + // event object and generating a new one from its properties. + , Event = (function () { + // a whitelist of properties (for different event types) tells us what to check for and copy + var commonProps = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' + + 'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey ' + + 'srcElement target timeStamp type view which propertyName') + , mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer ' + + 'fromElement offsetX offsetY pageX pageY screenX screenY toElement')) + , mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' + + 'axis')) // 'axis' is FF specific + , keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier ' + + 'keyLocation location')) + , textProps = commonProps.concat(str2arr('data')) + , touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation')) + , messageProps = commonProps.concat(str2arr('data origin source')) + , stateProps = commonProps.concat(str2arr('state')) + , overOutRegex = /over|out/ + // some event types need special handling and some need special properties, do that all here + , typeFixers = [ + { // key events + reg: /key/i + , fix: function (event, newEvent) { + newEvent.keyCode = event.keyCode || event.which + return keyProps + } + } + , { // mouse events + reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i + , fix: function (event, newEvent, type) { + newEvent.rightClick = event.which === 3 || event.button === 2 + newEvent.pos = { x: 0, y: 0 } + if (event.pageX || event.pageY) { + newEvent.clientX = event.pageX + newEvent.clientY = event.pageY + } else if (event.clientX || event.clientY) { + newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft + newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop + } + if (overOutRegex.test(type)) { + newEvent.relatedTarget = event.relatedTarget + || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'] + } + return mouseProps + } + } + , { // mouse wheel events + reg: /mouse.*(wheel|scroll)/i + , fix: function () { return mouseWheelProps } + } + , { // TextEvent + reg: /^text/i + , fix: function () { return textProps } + } + , { // touch and gesture events + reg: /^touch|^gesture/i + , fix: function () { return touchProps } + } + , { // message events + reg: /^message$/i + , fix: function () { return messageProps } + } + , { // popstate events + reg: /^popstate$/i + , fix: function () { return stateProps } + } + , { // everything else + reg: /.*/ + , fix: function () { return commonProps } + } + ] + , typeFixerMap = {} // used to map event types to fixer functions (above), a basic cache mechanism + + , Event = function (event, element, isNative) { + if (!arguments.length) return + event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event + this.originalEvent = event + this.isNative = isNative + this.isBean = true + + if (!event) return + + var type = event.type + , target = event.target || event.srcElement + , i, l, p, props, fixer + + this.target = target && target.nodeType === 3 ? target.parentNode : target + + if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless + fixer = typeFixerMap[type] + if (!fixer) { // haven't encountered this event type before, map a fixer function for it + for (i = 0, l = typeFixers.length; i < l; i++) { + if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .* + typeFixerMap[type] = fixer = typeFixers[i].fix + break + } + } + } + + props = fixer(event, this, type) + for (i = props.length; i--;) { + if (!((p = props[i]) in this) && p in event) this[p] = event[p] + } + } + } + + // preventDefault() and stopPropagation() are a consistent interface to those functions + // on the DOM, stop() is an alias for both of them together + Event.prototype.preventDefault = function () { + if (this.originalEvent.preventDefault) this.originalEvent.preventDefault() + else this.originalEvent.returnValue = false + } + Event.prototype.stopPropagation = function () { + if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation() + else this.originalEvent.cancelBubble = true + } + Event.prototype.stop = function () { + this.preventDefault() + this.stopPropagation() + this.stopped = true + } + // stopImmediatePropagation() has to be handled internally because we manage the event list for + // each element + // note that originalElement may be a Bean#Event object in some situations + Event.prototype.stopImmediatePropagation = function () { + if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation() + this.isImmediatePropagationStopped = function () { return true } + } + Event.prototype.isImmediatePropagationStopped = function () { + return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped() + } + Event.prototype.clone = function (currentTarget) { + //TODO: this is ripe for optimisation, new events are *expensive* + // improving this will speed up delegated events + var ne = new Event(this, this.element, this.isNative) + ne.currentTarget = currentTarget + return ne + } + + return Event + }()) + + // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both + , targetElement = function (element, isNative) { + return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element } - else { - t.parentNode.appendChild(el); + + /** + * Bean maintains an internal registry for event listeners. We don't touch elements, objects + * or functions to identify them, instead we store everything in the registry. + * Each event listener has a RegEntry object, we have one 'registry' for the whole instance. + */ + , RegEntry = (function () { + // each handler is wrapped so we can handle delegation and custom events + var wrappedHandler = function (element, fn, condition, args) { + var call = function (event, eargs) { + return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs) + } + , findTarget = function (event, eventElement) { + return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement + } + , handler = condition + ? function (event) { + var target = findTarget(event, this) // deleated event + if (condition.apply(target, arguments)) { + if (event) event.currentTarget = target + return call(event, arguments) + } + } + : function (event) { + if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix + return call(event, arguments) + } + handler.__beanDel = fn.__beanDel + return handler + } + + , RegEntry = function (element, type, handler, original, namespaces, args, root) { + var customType = customEvents[type] + , isNative + + if (type == 'unload') { + // self clean-up + handler = once(removeListener, element, type, handler, original) + } + + if (customType) { + if (customType.condition) { + handler = wrappedHandler(element, handler, customType.condition, args) + } + type = customType.base || type + } + + this.isNative = isNative = nativeEvents[type] && !!element[eventSupport] + this.customType = !W3C_MODEL && !isNative && type + this.element = element + this.type = type + this.original = original + this.namespaces = namespaces + this.eventType = W3C_MODEL || isNative ? type : 'propertychange' + this.target = targetElement(element, isNative) + this[eventSupport] = !!this.target[eventSupport] + this.root = root + this.handler = wrappedHandler(element, handler, null, args) + } + + // given a list of namespaces, is our entry in any of them? + RegEntry.prototype.inNamespaces = function (checkNamespaces) { + var i, j, c = 0 + if (!checkNamespaces) return true + if (!this.namespaces) return false + for (i = checkNamespaces.length; i--;) { + for (j = this.namespaces.length; j--;) { + if (checkNamespaces[i] == this.namespaces[j]) c++ + } + } + return checkNamespaces.length === c + } + + // match by element, original fn (opt), handler fn (opt) + RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) { + return this.element === checkElement && + (!checkOriginal || this.original === checkOriginal) && + (!checkHandler || this.handler === checkHandler) + } + + return RegEntry + }()) + + , registry = (function () { + // our map stores arrays by event type, just because it's better than storing + // everything in a single array. + // uses '$' as a prefix for the keys for safety and 'r' as a special prefix for + // rootListeners so we can look them up fast + var map = {} + + // generic functional search of our registry for matching listeners, + // `fn` returns false to break out of the loop + , forAll = function (element, type, original, handler, root, fn) { + var pfx = root ? 'r' : '$' + if (!type || type == '*') { + // search the whole registry + for (var t in map) { + if (t.charAt(0) == pfx) { + forAll(element, t.substr(1), original, handler, root, fn) + } + } + } else { + var i = 0, l, list = map[pfx + type], all = element == '*' + if (!list) return + for (l = list.length; i < l; i++) { + if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return + } + } + } + + , has = function (element, type, original, root) { + // we're not using forAll here simply because it's a bit slower and this + // needs to be fast + var i, list = map[(root ? 'r' : '$') + type] + if (list) { + for (i = list.length; i--;) { + if (!list[i].root && list[i].matches(element, original, null)) return true + } + } + return false + } + + , get = function (element, type, original, root) { + var entries = [] + forAll(element, type, original, null, root, function (entry) { + return entries.push(entry) + }) + return entries + } + + , put = function (entry) { + var has = !entry.root && !this.has(entry.element, entry.type, null, false) + , key = (entry.root ? 'r' : '$') + entry.type + ;(map[key] || (map[key] = [])).push(entry) + return has + } + + , del = function (entry) { + forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) { + list.splice(i, 1) + entry.removed = true + if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type] + return false + }) + } + + // dump all entries, used for onunload + , entries = function () { + var t, entries = [] + for (t in map) { + if (t.charAt(0) == '$') entries = entries.concat(map[t]) + } + return entries + } + + return { has: has, get: get, put: put, del: del, entries: entries } + }()) + + // we need a selector engine for delegated events, use querySelectorAll if it exists + // but for older browsers we need Qwery, Sizzle or similar + , selectorEngine + , setSelectorEngine = function (e) { + if (!arguments.length) { + selectorEngine = doc.querySelectorAll + ? function (s, r) { + return r.querySelectorAll(s) + } + : function () { + throw new Error('Bean: No selector engine installed') // eeek + } + } else { + selectorEngine = e + } } - }); - }, - - css: function (o, v) { - // is this a request for just getting a style? - if (v === undefined && typeof o == 'string') { - return getStyle(this[0], o); + + // we attach this listener to each DOM event that we need to listen to, only once + // per event type per DOM element + , rootListener = function (event, type) { + if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return + + var listeners = registry.get(this, type || event.type, null, false) + , l = listeners.length + , i = 0 + + event = new Event(event, this, true) + if (type) event.type = type + + // iterate through all handlers registered for this type, calling them unless they have + // been removed by a previous handler or stopImmediatePropagation() has been called + for (; i < l && !event.isImmediatePropagationStopped(); i++) { + if (!listeners[i].removed) listeners[i].handler.call(this, event) + } + } + + // add and remove listeners to DOM elements + , listener = W3C_MODEL + ? function (element, type, add) { + // new browsers + element[add ? addEvent : removeEvent](type, rootListener, false) + } + : function (element, type, add, custom) { + // IE8 and below, use attachEvent/detachEvent and we have to piggy-back propertychange events + // to simulate event bubbling etc. + var entry + if (add) { + registry.put(entry = new RegEntry( + element + , custom || type + , function (event) { // handler + rootListener.call(element, event, custom) + } + , rootListener + , null + , null + , true // is root + )) + if (custom && element['_on' + custom] == null) element['_on' + custom] = 0 + entry.target.attachEvent('on' + entry.eventType, entry.handler) + } else { + entry = registry.get(element, custom || type, rootListener, true)[0] + if (entry) { + entry.target.detachEvent('on' + entry.eventType, entry.handler) + registry.del(entry) + } + } + } + + , once = function (rm, element, type, fn, originalFn) { + // wrap the handler in a handler that does a remove as well + return function () { + fn.apply(this, arguments) + rm(element, type, originalFn) + } + } + + , removeListener = function (element, orgType, handler, namespaces) { + var type = orgType && orgType.replace(nameRegex, '') + , handlers = registry.get(element, type, null, false) + , removed = {} + , i, l + + for (i = 0, l = handlers.length; i < l; i++) { + if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) { + // TODO: this is problematic, we have a registry.get() and registry.del() that + // both do registry searches so we waste cycles doing this. Needs to be rolled into + // a single registry.forAll(fn) that removes while finding, but the catch is that + // we'll be splicing the arrays that we're iterating over. Needs extra tests to + // make sure we don't screw it up. @rvagg + registry.del(handlers[i]) + if (!removed[handlers[i].eventType] && handlers[i][eventSupport]) + removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type } + } + } + // check each type/element for removed listeners and remove the rootListener where it's no longer needed + for (i in removed) { + if (!registry.has(element, removed[i].t, null, false)) { + // last listener of this type, remove the rootListener + listener(element, removed[i].t, false, removed[i].c) + } + } + } + + // set up a delegate helper using the given selector, wrap the handler function + , delegate = function (selector, fn) { + //TODO: findTarget (therefore $) is called twice, once for match and once for + // setting e.currentTarget, fix this so it's only needed once + var findTarget = function (target, root) { + var i, array = isString(selector) ? selectorEngine(selector, root) : selector + for (; target && target !== root; target = target.parentNode) { + for (i = array.length; i--;) { + if (array[i] === target) return target + } + } + } + , handler = function (e) { + var match = findTarget(e.target, this) + if (match) fn.apply(match, arguments) + } + + // __beanDel isn't pleasant but it's a private function, not exposed outside of Bean + handler.__beanDel = { + ft : findTarget // attach it here for customEvents to use too + , selector : selector + } + return handler + } + + , fireListener = W3C_MODEL ? function (isNative, type, element) { + // modern browsers, do a proper dispatchEvent() + var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents') + evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1) + element.dispatchEvent(evt) + } : function (isNative, type, element) { + // old browser use onpropertychange, just increment a custom property to trigger the event + element = targetElement(element, isNative) + isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++ + } + + /** + * Public API: off(), on(), add(), (remove()), one(), fire(), clone() + */ + + /** + * off(element[, eventType(s)[, handler ]]) + */ + , off = function (element, typeSpec, fn) { + var isTypeStr = isString(typeSpec) + , k, type, namespaces, i + + if (isTypeStr && typeSpec.indexOf(' ') > 0) { + // off(el, 't1 t2 t3', fn) or off(el, 't1 t2 t3') + typeSpec = str2arr(typeSpec) + for (i = typeSpec.length; i--;) + off(element, typeSpec[i], fn) + return element + } + + type = isTypeStr && typeSpec.replace(nameRegex, '') + if (type && customEvents[type]) type = customEvents[type].base + + if (!typeSpec || isTypeStr) { + // off(el) or off(el, t1.ns) or off(el, .ns) or off(el, .ns1.ns2.ns3) + if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.') + removeListener(element, type, fn, namespaces) + } else if (isFunction(typeSpec)) { + // off(el, fn) + removeListener(element, null, typeSpec) + } else { + // off(el, { t1: fn1, t2, fn2 }) + for (k in typeSpec) { + if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k]) + } + } + + return element + } + + /** + * on(element, eventType(s)[, selector], handler[, args ]) + */ + , on = function(element, events, selector, fn) { + var originalFn, type, types, i, args, entry, first + + //TODO: the undefined check means you can't pass an 'args' argument, fix this perhaps? + if (selector === undefined && typeof events == 'object') { + //TODO: this can't handle delegated events + for (type in events) { + if (events.hasOwnProperty(type)) { + on.call(this, element, type, events[type]) + } + } + return + } + + if (!isFunction(selector)) { + // delegated event + originalFn = fn + args = slice.call(arguments, 4) + fn = delegate(selector, originalFn, selectorEngine) + } else { + args = slice.call(arguments, 3) + fn = originalFn = selector + } + + types = str2arr(events) + + // special case for one(), wrap in a self-removing handler + if (this === ONE) { + fn = once(off, element, events, fn, originalFn) + } + + for (i = types.length; i--;) { + // add new handler to the registry and check if it's the first for this element/type + first = registry.put(entry = new RegEntry( + element + , types[i].replace(nameRegex, '') // event type + , fn + , originalFn + , str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces + , args + , false // not root + )) + if (entry[eventSupport] && first) { + // first event of this type on this element, add root listener + listener(element, entry.eventType, true, entry.customType) + } + } + + return element + } + + /** + * add(element[, selector], eventType(s), handler[, args ]) + * + * Deprecated: kept (for now) for backward-compatibility + */ + , add = function (element, events, fn, delfn) { + return on.apply( + null + , !isString(fn) + ? slice.call(arguments) + : [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : []) + ) + } + + /** + * one(element, eventType(s)[, selector], handler[, args ]) + */ + , one = function () { + return on.apply(ONE, arguments) + } + + /** + * fire(element, eventType(s)[, args ]) + * + * The optional 'args' argument must be an array, if no 'args' argument is provided + * then we can use the browser's DOM event system, otherwise we trigger handlers manually + */ + , fire = function (element, type, args) { + var types = str2arr(type) + , i, j, l, names, handlers + + for (i = types.length; i--;) { + type = types[i].replace(nameRegex, '') + if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.') + if (!names && !args && element[eventSupport]) { + fireListener(nativeEvents[type], type, element) + } else { + // non-native event, either because of a namespace, arguments or a non DOM element + // iterate over all listeners and manually 'fire' + handlers = registry.get(element, type, null, false) + args = [false].concat(args) + for (j = 0, l = handlers.length; j < l; j++) { + if (handlers[j].inNamespaces(names)) { + handlers[j].handler.apply(element, args) + } + } + } + } + return element + } + + /** + * clone(dstElement, srcElement[, eventType ]) + * + * TODO: perhaps for consistency we should allow the same flexibility in type specifiers? + */ + , clone = function (element, from, type) { + var handlers = registry.get(from, type, null, false) + , l = handlers.length + , i = 0 + , args, beanDel + + for (; i < l; i++) { + if (handlers[i].original) { + args = [ element, handlers[i].type ] + if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector) + args.push(handlers[i].original) + on.apply(null, args) + } + } + return element + } + + , bean = { + on : on + , add : add + , one : one + , off : off + , remove : off + , clone : clone + , fire : fire + , setSelectorEngine : setSelectorEngine + , noConflict : function () { + context[name] = old + return this + } + } + + // for IE, clean up on unload to avoid leaks + if (win.attachEvent) { + var cleanup = function () { + var i, entries = registry.entries() + for (i in entries) { + if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type) + } + win.detachEvent('onunload', cleanup) + win.CollectGarbage && win.CollectGarbage() } - var iter = o; - if (typeof o == 'string') { - iter = {}; - iter[o] = v; + win.attachEvent('onunload', cleanup) + } + + // initialize selector engine to internal default (qSA or throw Error) + setSelectorEngine() + + return bean + })); + + + provide("bean", module.exports); + + !function ($) { + var b = require('bean') + + , integrate = function (method, type, method2) { + var _args = type ? [type] : [] + return function () { + for (var i = 0, l = this.length; i < l; i++) { + if (!arguments.length && method == 'on' && type) method = 'fire' + b[method].apply(this, [this[i]].concat(_args, Array.prototype.slice.call(arguments, 0))) + } + return this + } + } + + , add = integrate('add') + , on = integrate('on') + , one = integrate('one') + , off = integrate('off') + , fire = integrate('fire') + , clone = integrate('clone') + + , hover = function (enter, leave, i) { // i for internal + for (i = this.length; i--;) { + b.on.call(this, this[i], 'mouseenter', enter) + b.on.call(this, this[i], 'mouseleave', leave) + } + return this + } + + , methods = { + on : on + , addListener : on + , bind : on + , listen : on + , delegate : add // jQuery compat, same arg order as add() + + , one : one + + , off : off + , unbind : off + , unlisten : off + , removeListener : off + , undelegate : off + + , emit : fire + , trigger : fire + + , cloneEvents : clone + + , hover : hover + } + + , shortcuts = + ('blur change click dblclick error focus focusin focusout keydown keypress ' + + 'keyup load mousedown mouseenter mouseleave mouseout mouseover mouseup ' + + 'mousemove resize scroll select submit unload').split(' ') + + for (var i = shortcuts.length; i--;) { + methods[shortcuts[i]] = integrate('on', shortcuts[i]) + } + + b.setSelectorEngine($) + + $.ender(methods, true) + }(ender); + +}()); + +(function () { + + var module = { exports: {} }, exports = module.exports; + + /*! + * Bonzo: DOM Utility (c) Dustin Diaz 2012 + * https://github.com/ded/bonzo + * License MIT + */ + (function (name, context, definition) { + if (typeof module != 'undefined' && module.exports) module.exports = definition() + else if (typeof context['define'] == 'function' && context['define']['amd']) define(definition) + else context[name] = definition() + })('bonzo', this, function() { + var win = window + , doc = win.document + , html = doc.documentElement + , parentNode = 'parentNode' + , specialAttributes = /^(checked|value|selected|disabled)$/i + , specialTags = /^(select|fieldset|table|tbody|tfoot|td|tr|colgroup)$/i // tags that we have trouble inserting *into* + , simpleScriptTagRe = /\s*<script +src=['"]([^'"]+)['"]>/ + , table = ['<table>', '</table>', 1] + , td = ['<table><tbody><tr>', '</tr></tbody></table>', 3] + , option = ['<select>', '</select>', 1] + , noscope = ['_', '', 0, 1] + , tagMap = { // tags that we have trouble *inserting* + thead: table, tbody: table, tfoot: table, colgroup: table, caption: table + , tr: ['<table><tbody>', '</tbody></table>', 2] + , th: td , td: td + , col: ['<table><colgroup>', '</colgroup></table>', 2] + , fieldset: ['<form>', '</form>', 1] + , legend: ['<form><fieldset>', '</fieldset></form>', 2] + , option: option, optgroup: option + , script: noscope, style: noscope, link: noscope, param: noscope, base: noscope + } + , stateAttributes = /^(checked|selected|disabled)$/ + , ie = /msie/i.test(navigator.userAgent) + , hasClass, addClass, removeClass + , uidMap = {} + , uuids = 0 + , digit = /^-?[\d\.]+$/ + , dattr = /^data-(.+)$/ + , px = 'px' + , setAttribute = 'setAttribute' + , getAttribute = 'getAttribute' + , byTag = 'getElementsByTagName' + , features = function() { + var e = doc.createElement('p') + e.innerHTML = '<a href="#x">x</a><table style="float:left;"></table>' + return { + hrefExtended: e[byTag]('a')[0][getAttribute]('href') != '#x' // IE < 8 + , autoTbody: e[byTag]('tbody').length !== 0 // IE < 8 + , computedStyle: doc.defaultView && doc.defaultView.getComputedStyle + , cssFloat: e[byTag]('table')[0].style.styleFloat ? 'styleFloat' : 'cssFloat' + , transform: function () { + var props = ['transform', 'webkitTransform', 'MozTransform', 'OTransform', 'msTransform'], i + for (i = 0; i < props.length; i++) { + if (props[i] in e.style) return props[i] + } + }() + , classList: 'classList' in e + , opasity: function () { + return typeof doc.createElement('a').style.opacity !== 'undefined' + }() + } + }() + , trimReplace = /(^\s*|\s*$)/g + , whitespaceRegex = /\s+/ + , toString = String.prototype.toString + , unitless = { lineHeight: 1, zoom: 1, zIndex: 1, opacity: 1, boxFlex: 1, WebkitBoxFlex: 1, MozBoxFlex: 1 } + , query = doc.querySelectorAll && function (selector) { return doc.querySelectorAll(selector) } + , trim = String.prototype.trim ? + function (s) { + return s.trim() + } : + function (s) { + return s.replace(trimReplace, '') + } + + + function isNode(node) { + return node && node.nodeName && (node.nodeType == 1 || node.nodeType == 11) + } + + + function normalize(node, host, clone) { + var i, l, ret + if (typeof node == 'string') return bonzo.create(node) + if (isNode(node)) node = [ node ] + if (clone) { + ret = [] // don't change original array + for (i = 0, l = node.length; i < l; i++) ret[i] = cloneNode(host, node[i]) + return ret } - - if (ie && iter.opacity) { - // oh this 'ol gamut - iter.filter = 'alpha(opacity=' + (iter.opacity * 100) + ')'; - // give it layout - iter.zoom = o.zoom || 1; - delete iter.opacity; + return node + } + + + /** + * @param {string} c a class name to test + * @return {boolean} + */ + function classReg(c) { + return new RegExp("(^|\\s+)" + c + "(\\s+|$)") + } + + + /** + * @param {Bonzo|Array} ar + * @param {function(Object, number, (Bonzo|Array))} fn + * @param {Object=} opt_scope + * @param {boolean=} opt_rev + * @return {Bonzo|Array} + */ + function each(ar, fn, opt_scope, opt_rev) { + var ind, i = 0, l = ar.length + for (; i < l; i++) { + ind = opt_rev ? ar.length - i - 1 : i + fn.call(opt_scope || ar[ind], ar[ind], ind, ar) } - - if (v = iter['float']) { - // float is a reserved style word. w3 uses cssFloat, ie uses styleFloat - ie ? (iter.styleFloat = v) : (iter.cssFloat = v); - delete iter['float']; + return ar + } + + + /** + * @param {Bonzo|Array} ar + * @param {function(Object, number, (Bonzo|Array))} fn + * @param {Object=} opt_scope + * @return {Bonzo|Array} + */ + function deepEach(ar, fn, opt_scope) { + for (var i = 0, l = ar.length; i < l; i++) { + if (isNode(ar[i])) { + deepEach(ar[i].childNodes, fn, opt_scope) + fn.call(opt_scope || ar[i], ar[i], i, ar) + } } - - var fn = function (el, p, v) { - for (var k in iter) { - if (iter.hasOwnProperty(k)) { - v = iter[k]; - // change "5" to "5px" - unless you're line-height, which is allowed - (p = camelize(k)) && digit.test(v) && !(p in unitless) && (v += px); - el.style[p] = v; + return ar + } + + + /** + * @param {string} s + * @return {string} + */ + function camelize(s) { + return s.replace(/-(.)/g, function (m, m1) { + return m1.toUpperCase() + }) + } + + + /** + * @param {string} s + * @return {string} + */ + function decamelize(s) { + return s ? s.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase() : s + } + + + /** + * @param {Element} el + * @return {*} + */ + function data(el) { + el[getAttribute]('data-node-uid') || el[setAttribute]('data-node-uid', ++uuids) + var uid = el[getAttribute]('data-node-uid') + return uidMap[uid] || (uidMap[uid] = {}) + } + + + /** + * removes the data associated with an element + * @param {Element} el + */ + function clearData(el) { + var uid = el[getAttribute]('data-node-uid') + if (uid) delete uidMap[uid] + } + + + function dataValue(d) { + var f + try { + return (d === null || d === undefined) ? undefined : + d === 'true' ? true : + d === 'false' ? false : + d === 'null' ? null : + (f = parseFloat(d)) == d ? f : d; + } catch(e) {} + return undefined + } + + + /** + * @param {Bonzo|Array} ar + * @param {function(Object, number, (Bonzo|Array))} fn + * @param {Object=} opt_scope + * @return {boolean} whether `some`thing was found + */ + function some(ar, fn, opt_scope) { + for (var i = 0, j = ar.length; i < j; ++i) if (fn.call(opt_scope || null, ar[i], i, ar)) return true + return false + } + + + /** + * this could be a giant enum of CSS properties + * but in favor of file size sans-closure deadcode optimizations + * we're just asking for any ol string + * then it gets transformed into the appropriate style property for JS access + * @param {string} p + * @return {string} + */ + function styleProperty(p) { + (p == 'transform' && (p = features.transform)) || + (/^transform-?[Oo]rigin$/.test(p) && (p = features.transform + 'Origin')) || + (p == 'float' && (p = features.cssFloat)) + return p ? camelize(p) : null + } + + var getStyle = features.computedStyle ? + function (el, property) { + var value = null + , computed = doc.defaultView.getComputedStyle(el, '') + computed && (value = computed[property]) + return el.style[property] || value + } : + + (ie && html.currentStyle) ? + + /** + * @param {Element} el + * @param {string} property + * @return {string|number} + */ + function (el, property) { + if (property == 'opacity' && !features.opasity) { + var val = 100 + try { + val = el['filters']['DXImageTransform.Microsoft.Alpha'].opacity + } catch (e1) { + try { + val = el['filters']('alpha').opacity + } catch (e2) {} } + return val / 100 } - }; - return this.each(fn); - }, - - offset: function (x, y) { - if (x || y) { - return this.each(function (el) { - xy(el, x, y); - }); - } - var el = this[0]; - var width = el.offsetWidth; - var height = el.offsetHeight; - var top = el.offsetTop; - var left = el.offsetLeft; - while (el = el.offsetParent) { - top = top + el.offsetTop; - left = left + el.offsetLeft; + var value = el.currentStyle ? el.currentStyle[property] : null + return el.style[property] || value + } : + + function (el, property) { + return el.style[property] } - - return { - top: top, - left: left, - height: height, - width: width - }; - }, - - attr: function (k, v) { - var el = this[0]; - return typeof v == 'undefined' ? - specialAttributes.test(k) ? - stateAttributes.test(k) && typeof el[k] == 'string' ? - true : el[k] : el[getAttribute](k) : - this.each(function (el) { - k == 'value' ? (el.value = v) : el[setAttribute](k, v); - }); - }, - - val: function (s) { - return (typeof s == 'string') ? this.attr('value', s) : this[0].value; - }, - - removeAttr: function (k) { - return this.each(function (el) { - el.removeAttribute(k); - }); - }, - - data: function (k, v) { - var el = this[0]; - if (typeof v === 'undefined') { - el[getAttribute]('data-node-uid') || el[setAttribute]('data-node-uid', ++uuids); - var uid = el[getAttribute]('data-node-uid'); - uidList[uid] || (uidList[uid] = {}); - return uidList[uid][k]; - } else { - return this.each(function (el) { - el[getAttribute]('data-node-uid') || el[setAttribute]('data-node-uid', ++uuids); - var uid = el[getAttribute]('data-node-uid'); - var o = {}; - o[k] = v; - uidList[uid] = o; - }); - } - }, - - remove: function () { - return this.each(function (el) { - el.parentNode && el.parentNode.removeChild(el); - }); - }, - - empty: function () { - return this.each(function (el) { - while (el.firstChild) { - el.removeChild(el.firstChild); - } - }); - }, - - detach: function () { - return this.map(function (el) { - return el.parentNode.removeChild(el); - }); - }, - - scrollTop: function (y) { - return scroll.call(this, null, y, 'y'); - }, - - scrollLeft: function (x) { - return scroll.call(this, x, null, 'x'); + + // this insert method is intense + function insert(target, host, fn, rev) { + var i = 0, self = host || this, r = [] + // target nodes could be a css selector if it's a string and a selector engine is present + // otherwise, just use target + , nodes = query && typeof target == 'string' && target.charAt(0) != '<' ? query(target) : target + // normalize each node in case it's still a string and we need to create nodes on the fly + each(normalize(nodes), function (t, j) { + each(self, function (el) { + fn(t, r[i++] = j > 0 ? cloneNode(self, el) : el) + }, null, rev) + }, this, rev) + self.length = i + each(r, function (e) { + self[--i] = e + }, null, !rev) + return self } - }; - - function normalize(node, tag) { - return typeof node == 'string' ? bonzo.create(node, tag) : is(node) ? [node] : node; - } - - function scroll(x, y, type) { - var el = this[0]; - if (x == null && y == null) { - return (isBody(el) ? getWindowScroll() : { x: el.scrollLeft, y: el.scrollTop })[type]; + + + /** + * sets an element to an explicit x/y position on the page + * @param {Element} el + * @param {?number} x + * @param {?number} y + */ + function xy(el, x, y) { + var $el = bonzo(el) + , style = $el.css('position') + , offset = $el.offset() + , rel = 'relative' + , isRel = style == rel + , delta = [parseInt($el.css('left'), 10), parseInt($el.css('top'), 10)] + + if (style == 'static') { + $el.css('position', rel) + style = rel + } + + isNaN(delta[0]) && (delta[0] = isRel ? 0 : el.offsetLeft) + isNaN(delta[1]) && (delta[1] = isRel ? 0 : el.offsetTop) + + x != null && (el.style.left = x - offset.left + delta[0] + px) + y != null && (el.style.top = y - offset.top + delta[1] + px) + } - if (isBody(el)) { - window.scrollTo(x, y); - } else { - x != null && (el.scrollLeft = x); - y != null && (el.scrollTop = y); + + // classList support for class management + // altho to be fair, the api sucks because it won't accept multiple classes at once + if (features.classList) { + hasClass = function (el, c) { + return el.classList.contains(c) + } + addClass = function (el, c) { + el.classList.add(c) + } + removeClass = function (el, c) { + el.classList.remove(c) + } } - return this; - } - - function isBody(element) { - return element === window || (/^(?:body|html)$/i).test(element.tagName); - } - - function getWindowScroll() { - return { x: window.pageXOffset || html.scrollLeft, y: window.pageYOffset || html.scrollTop }; - } - - function bonzo(els, host) { - return new Bonzo(els, host); - } - - bonzo.setQueryEngine = function (q) { - query = q; - delete bonzo.setQueryEngine; - }; - - bonzo.aug = function (o, target) { - for (var k in o) { - o.hasOwnProperty(k) && ((target || Bonzo.prototype)[k] = o[k]); + else { + hasClass = function (el, c) { + return classReg(c).test(el.className) + } + addClass = function (el, c) { + el.className = trim(el.className + ' ' + c) + } + removeClass = function (el, c) { + el.className = trim(el.className.replace(classReg(c), ' ')) + } } - }; - - bonzo.create = function (node, tag) { - return typeof node == 'string' ? - function () { - var t = tag ? tagMap[tag.toLowerCase()] : null; - var el = doc.createElement(t || 'div'), els = []; - if (tag) { - var bitches = node.match(new RegExp("<" + t + ">.+?<\\/" + t + ">", "g")); - each(bitches, function (m) { - m = m.replace(/<(.+)>(.+?)<\/\1>/, '$2'); - var bah = doc.createElement(t); - bah.appendChild(doc.createDocumentFragment(m)); - el.appendChild(bah); - }); - } else { - el.innerHTML = node; + + + /** + * this allows method calling for setting values + * + * @example + * bonzo(elements).css('color', function (el) { + * return el.getAttribute('data-original-color') + * }) + * + * @param {Element} el + * @param {function (Element)|string} + * @return {string} + */ + function setter(el, v) { + return typeof v == 'function' ? v(el) : v + } + + /** + * @constructor + * @param {Array.<Element>|Element|Node|string} elements + */ + function Bonzo(elements) { + this.length = 0 + if (elements) { + elements = typeof elements !== 'string' && + !elements.nodeType && + typeof elements.length !== 'undefined' ? + elements : + [elements] + this.length = elements.length + for (var i = 0; i < elements.length; i++) this[i] = elements[i] + } + } + + Bonzo.prototype = { + + /** + * @param {number} index + * @return {Element|Node} + */ + get: function (index) { + return this[index] || null } - var nodes = el.childNodes; - el = el.firstChild; - els.push(el); - while (el = el.nextSibling) { - (el.nodeType == 1) && els.push(el); + + // itetators + /** + * @param {function(Element|Node)} fn + * @param {Object=} opt_scope + * @return {Bonzo} + */ + , each: function (fn, opt_scope) { + return each(this, fn, opt_scope) } - return els; - - }() : is(node) ? [node.cloneNode(true)] : []; - }; - - bonzo.doc = function () { - var w = html.scrollWidth, - h = html.scrollHeight, - vp = this.viewport(); - return { - width: Math.max(w, vp.width), - height: Math.max(h, vp.height) - }; - }; - - bonzo.firstChild = function (el) { - for (var c = el.childNodes, i = 0, j = (c && c.length) || 0, e; i < j; i++) { - if (c[i].nodeType === 1) { - e = c[j = i]; + + /** + * @param {Function} fn + * @param {Object=} opt_scope + * @return {Bonzo} + */ + , deepEach: function (fn, opt_scope) { + return deepEach(this, fn, opt_scope) + } + + + /** + * @param {Function} fn + * @param {Function=} opt_reject + * @return {Array} + */ + , map: function (fn, opt_reject) { + var m = [], n, i + for (i = 0; i < this.length; i++) { + n = fn.call(this, this[i], i) + opt_reject ? (opt_reject(n) && m.push(n)) : m.push(n) + } + return m + } + + // text and html inserters! + + /** + * @param {string} h the HTML to insert + * @param {boolean=} opt_text whether to set or get text content + * @return {Bonzo|string} + */ + , html: function (h, opt_text) { + var method = opt_text + ? html.textContent === undefined ? 'innerText' : 'textContent' + : 'innerHTML' + , that = this + , append = function (el, i) { + each(normalize(h, that, i), function (node) { + el.appendChild(node) + }) + } + , updateElement = function (el, i) { + try { + if (opt_text || (typeof h == 'string' && !specialTags.test(el.tagName))) { + return el[method] = h + } + } catch (e) {} + append(el, i) + } + return typeof h != 'undefined' + ? this.empty().each(updateElement) + : this[0] ? this[0][method] : '' + } + + /** + * @param {string=} opt_text the text to set, otherwise this is a getter + * @return {Bonzo|string} + */ + , text: function (opt_text) { + return this.html(opt_text, true) + } + + // more related insertion methods + + /** + * @param {Bonzo|string|Element|Array} node + * @return {Bonzo} + */ + , append: function (node) { + var that = this + return this.each(function (el, i) { + each(normalize(node, that, i), function (i) { + el.appendChild(i) + }) + }) + } + + + /** + * @param {Bonzo|string|Element|Array} node + * @return {Bonzo} + */ + , prepend: function (node) { + var that = this + return this.each(function (el, i) { + var first = el.firstChild + each(normalize(node, that, i), function (i) { + el.insertBefore(i, first) + }) + }) + } + + + /** + * @param {Bonzo|string|Element|Array} target the location for which you'll insert your new content + * @param {Object=} opt_host an optional host scope (primarily used when integrated with Ender) + * @return {Bonzo} + */ + , appendTo: function (target, opt_host) { + return insert.call(this, target, opt_host, function (t, el) { + t.appendChild(el) + }) + } + + + /** + * @param {Bonzo|string|Element|Array} target the location for which you'll insert your new content + * @param {Object=} opt_host an optional host scope (primarily used when integrated with Ender) + * @return {Bonzo} + */ + , prependTo: function (target, opt_host) { + return insert.call(this, target, opt_host, function (t, el) { + t.insertBefore(el, t.firstChild) + }, 1) + } + + + /** + * @param {Bonzo|string|Element|Array} node + * @return {Bonzo} + */ + , before: function (node) { + var that = this + return this.each(function (el, i) { + each(normalize(node, that, i), function (i) { + el[parentNode].insertBefore(i, el) + }) + }) + } + + + /** + * @param {Bonzo|string|Element|Array} node + * @return {Bonzo} + */ + , after: function (node) { + var that = this + return this.each(function (el, i) { + each(normalize(node, that, i), function (i) { + el[parentNode].insertBefore(i, el.nextSibling) + }, null, 1) + }) + } + + + /** + * @param {Bonzo|string|Element|Array} target the location for which you'll insert your new content + * @param {Object=} opt_host an optional host scope (primarily used when integrated with Ender) + * @return {Bonzo} + */ + , insertBefore: function (target, opt_host) { + return insert.call(this, target, opt_host, function (t, el) { + t[parentNode].insertBefore(el, t) + }) + } + + + /** + * @param {Bonzo|string|Element|Array} target the location for which you'll insert your new content + * @param {Object=} opt_host an optional host scope (primarily used when integrated with Ender) + * @return {Bonzo} + */ + , insertAfter: function (target, opt_host) { + return insert.call(this, target, opt_host, function (t, el) { + var sibling = t.nextSibling + sibling ? + t[parentNode].insertBefore(el, sibling) : + t[parentNode].appendChild(el) + }, 1) + } + + + /** + * @param {Bonzo|string|Element|Array} node + * @return {Bonzo} + */ + , replaceWith: function (node) { + bonzo(normalize(node)).insertAfter(this) + return this.remove() + } + + // class management + + /** + * @param {string} c + * @return {Bonzo} + */ + , addClass: function (c) { + c = toString.call(c).split(whitespaceRegex) + return this.each(function (el) { + // we `each` here so you can do $el.addClass('foo bar') + each(c, function (c) { + if (c && !hasClass(el, setter(el, c))) + addClass(el, setter(el, c)) + }) + }) + } + + + /** + * @param {string} c + * @return {Bonzo} + */ + , removeClass: function (c) { + c = toString.call(c).split(whitespaceRegex) + return this.each(function (el) { + each(c, function (c) { + if (c && hasClass(el, setter(el, c))) + removeClass(el, setter(el, c)) + }) + }) + } + + + /** + * @param {string} c + * @return {boolean} + */ + , hasClass: function (c) { + c = toString.call(c).split(whitespaceRegex) + return some(this, function (el) { + return some(c, function (c) { + return c && hasClass(el, c) + }) + }) + } + + + /** + * @param {string} c classname to toggle + * @param {boolean=} opt_condition whether to add or remove the class straight away + * @return {Bonzo} + */ + , toggleClass: function (c, opt_condition) { + c = toString.call(c).split(whitespaceRegex) + return this.each(function (el) { + each(c, function (c) { + if (c) { + typeof opt_condition !== 'undefined' ? + opt_condition ? addClass(el, c) : removeClass(el, c) : + hasClass(el, c) ? removeClass(el, c) : addClass(el, c) + } + }) + }) + } + + // display togglers + + /** + * @param {string=} opt_type useful to set back to anything other than an empty string + * @return {Bonzo} + */ + , show: function (opt_type) { + opt_type = typeof opt_type == 'string' ? opt_type : '' + return this.each(function (el) { + el.style.display = opt_type + }) + } + + + /** + * @return {Bonzo} + */ + , hide: function () { + return this.each(function (el) { + el.style.display = 'none' + }) + } + + + /** + * @param {Function=} opt_callback + * @param {string=} opt_type + * @return {Bonzo} + */ + , toggle: function (opt_callback, opt_type) { + opt_type = typeof opt_type == 'string' ? opt_type : ''; + typeof opt_callback != 'function' && (opt_callback = null) + return this.each(function (el) { + el.style.display = (el.offsetWidth || el.offsetHeight) ? 'none' : opt_type; + opt_callback && opt_callback.call(el) + }) + } + + + // DOM Walkers & getters + + /** + * @return {Element|Node} + */ + , first: function () { + return bonzo(this.length ? this[0] : []) + } + + + /** + * @return {Element|Node} + */ + , last: function () { + return bonzo(this.length ? this[this.length - 1] : []) + } + + + /** + * @return {Element|Node} + */ + , next: function () { + return this.related('nextSibling') + } + + + /** + * @return {Element|Node} + */ + , previous: function () { + return this.related('previousSibling') + } + + + /** + * @return {Element|Node} + */ + , parent: function() { + return this.related(parentNode) + } + + + /** + * @private + * @param {string} method the directional DOM method + * @return {Element|Node} + */ + , related: function (method) { + return this.map( + function (el) { + el = el[method] + while (el && el.nodeType !== 1) { + el = el[method] + } + return el || 0 + }, + function (el) { + return el + } + ) + } + + + /** + * @return {Bonzo} + */ + , focus: function () { + this.length && this[0].focus() + return this + } + + + /** + * @return {Bonzo} + */ + , blur: function () { + this.length && this[0].blur() + return this + } + + // style getter setter & related methods + + /** + * @param {Object|string} o + * @param {string=} opt_v + * @return {Bonzo|string} + */ + , css: function (o, opt_v) { + var p, iter = o + // is this a request for just getting a style? + if (opt_v === undefined && typeof o == 'string') { + // repurpose 'v' + opt_v = this[0] + if (!opt_v) return null + if (opt_v === doc || opt_v === win) { + p = (opt_v === doc) ? bonzo.doc() : bonzo.viewport() + return o == 'width' ? p.width : o == 'height' ? p.height : '' + } + return (o = styleProperty(o)) ? getStyle(opt_v, o) : null + } + + if (typeof o == 'string') { + iter = {} + iter[o] = opt_v + } + + if (ie && iter.opacity) { + // oh this 'ol gamut + iter.filter = 'alpha(opacity=' + (iter.opacity * 100) + ')' + // give it layout + iter.zoom = o.zoom || 1; + delete iter.opacity; + } + + function fn(el, p, v) { + for (var k in iter) { + if (iter.hasOwnProperty(k)) { + v = iter[k]; + // change "5" to "5px" - unless you're line-height, which is allowed + (p = styleProperty(k)) && digit.test(v) && !(p in unitless) && (v += px) + try { el.style[p] = setter(el, v) } catch(e) {} + } + } + } + return this.each(fn) + } + + + /** + * @param {number=} opt_x + * @param {number=} opt_y + * @return {Bonzo|number} + */ + , offset: function (opt_x, opt_y) { + if (opt_x && typeof opt_x == 'object' && (typeof opt_x.top == 'number' || typeof opt_x.left == 'number')) { + return this.each(function (el) { + xy(el, opt_x.left, opt_x.top) + }) + } else if (typeof opt_x == 'number' || typeof opt_y == 'number') { + return this.each(function (el) { + xy(el, opt_x, opt_y) + }) + } + if (!this[0]) return { + top: 0 + , left: 0 + , height: 0 + , width: 0 + } + var el = this[0] + , de = el.ownerDocument.documentElement + , bcr = el.getBoundingClientRect() + , scroll = getWindowScroll() + , width = el.offsetWidth + , height = el.offsetHeight + , top = bcr.top + scroll.y - Math.max(0, de && de.clientTop, doc.body.clientTop) + , left = bcr.left + scroll.x - Math.max(0, de && de.clientLeft, doc.body.clientLeft) + + return { + top: top + , left: left + , height: height + , width: width + } + } + + + /** + * @return {number} + */ + , dim: function () { + if (!this.length) return { height: 0, width: 0 } + var el = this[0] + , de = el.nodeType == 9 && el.documentElement // document + , orig = !de && !!el.style && !el.offsetWidth && !el.offsetHeight ? + // el isn't visible, can't be measured properly, so fix that + function (t) { + var s = { + position: el.style.position || '' + , visibility: el.style.visibility || '' + , display: el.style.display || '' + } + t.first().css({ + position: 'absolute' + , visibility: 'hidden' + , display: 'block' + }) + return s + }(this) : null + , width = de + ? Math.max(el.body.scrollWidth, el.body.offsetWidth, de.scrollWidth, de.offsetWidth, de.clientWidth) + : el.offsetWidth + , height = de + ? Math.max(el.body.scrollHeight, el.body.offsetHeight, de.scrollWidth, de.offsetWidth, de.clientHeight) + : el.offsetHeight + + orig && this.first().css(orig) + return { + height: height + , width: width + } + } + + // attributes are hard. go shopping + + /** + * @param {string} k an attribute to get or set + * @param {string=} opt_v the value to set + * @return {Bonzo|string} + */ + , attr: function (k, opt_v) { + var el = this[0] + if (typeof k != 'string' && !(k instanceof String)) { + for (var n in k) { + k.hasOwnProperty(n) && this.attr(n, k[n]) + } + return this + } + return typeof opt_v == 'undefined' ? + !el ? null : specialAttributes.test(k) ? + stateAttributes.test(k) && typeof el[k] == 'string' ? + true : el[k] : (k == 'href' || k =='src') && features.hrefExtended ? + el[getAttribute](k, 2) : el[getAttribute](k) : + this.each(function (el) { + specialAttributes.test(k) ? (el[k] = setter(el, opt_v)) : el[setAttribute](k, setter(el, opt_v)) + }) + } + + + /** + * @param {string} k + * @return {Bonzo} + */ + , removeAttr: function (k) { + return this.each(function (el) { + stateAttributes.test(k) ? (el[k] = false) : el.removeAttribute(k) + }) + } + + + /** + * @param {string=} opt_s + * @return {Bonzo|string} + */ + , val: function (s) { + return (typeof s == 'string') ? + this.attr('value', s) : + this.length ? this[0].value : null + } + + // use with care and knowledge. this data() method uses data attributes on the DOM nodes + // to do this differently costs a lot more code. c'est la vie + /** + * @param {string|Object=} opt_k the key for which to get or set data + * @param {Object=} opt_v + * @return {Bonzo|Object} + */ + , data: function (opt_k, opt_v) { + var el = this[0], o, m + if (typeof opt_v === 'undefined') { + if (!el) return null + o = data(el) + if (typeof opt_k === 'undefined') { + each(el.attributes, function (a) { + (m = ('' + a.name).match(dattr)) && (o[camelize(m[1])] = dataValue(a.value)) + }) + return o + } else { + if (typeof o[opt_k] === 'undefined') + o[opt_k] = dataValue(this.attr('data-' + decamelize(opt_k))) + return o[opt_k] + } + } else { + return this.each(function (el) { data(el)[opt_k] = opt_v }) + } + } + + // DOM detachment & related + + /** + * @return {Bonzo} + */ + , remove: function () { + this.deepEach(clearData) + return this.detach() + } + + + /** + * @return {Bonzo} + */ + , empty: function () { + return this.each(function (el) { + deepEach(el.childNodes, clearData) + + while (el.firstChild) { + el.removeChild(el.firstChild) + } + }) + } + + + /** + * @return {Bonzo} + */ + , detach: function () { + return this.each(function (el) { + el[parentNode] && el[parentNode].removeChild(el) + }) + } + + // who uses a mouse anyway? oh right. + + /** + * @param {number} y + */ + , scrollTop: function (y) { + return scroll.call(this, null, y, 'y') + } + + + /** + * @param {number} x + */ + , scrollLeft: function (x) { + return scroll.call(this, x, null, 'x') + } + + } + + + function cloneNode(host, el) { + var c = el.cloneNode(true) + , cloneElems + , elElems + + // check for existence of an event cloner + // preferably https://github.com/fat/bean + // otherwise Bonzo won't do this for you + if (host.$ && typeof host.cloneEvents == 'function') { + host.$(c).cloneEvents(el) + + // clone events from every child node + cloneElems = host.$(c).find('*') + elElems = host.$(el).find('*') + + for (var i = 0; i < elElems.length; i++) + host.$(cloneElems[i]).cloneEvents(elElems[i]) } + return c } - return e; - }; - - bonzo.viewport = function () { - var h = self.innerHeight, - w = self.innerWidth; - ie && (h = html.clientHeight) && (w = html.clientWidth); - return { - width: w, - height: h - }; - }; - - bonzo.isAncestor = 'compareDocumentPosition' in html ? - function (container, element) { - return (container.compareDocumentPosition(element) & 16) == 16; - } : 'contains' in html ? - function (container, element) { - return container !== element && container.contains(element); - } : - function (container, element) { - while (element = element.parentNode) { - if (element === container) { - return true; - } - } - return false; - }; - - var old = context.bonzo; - bonzo.noConflict = function () { - context.bonzo = old; - return this; - }; - context['bonzo'] = bonzo; - -}(this);!function ($) { - - var b = bonzo; - b.setQueryEngine($); - $.ender(b); - $.ender(b(), true); - $.ender({ - create: function (node) { - return $(b.create(node)); + + function scroll(x, y, type) { + var el = this[0] + if (!el) return this + if (x == null && y == null) { + return (isBody(el) ? getWindowScroll() : { x: el.scrollLeft, y: el.scrollTop })[type] + } + if (isBody(el)) { + win.scrollTo(x, y) + } else { + x != null && (el.scrollLeft = x) + y != null && (el.scrollTop = y) + } + return this } - }); - - $.id = function (id) { - return $([document.getElementById(id)]); - }; - - function indexOf(ar, val) { - for (var i = 0; i < ar.length; i++) { - if (ar[i] === val) { - return i; + + function isBody(element) { + return element === win || (/^(?:body|html)$/i).test(element.tagName) + } + + function getWindowScroll() { + return { x: win.pageXOffset || html.scrollLeft, y: win.pageYOffset || html.scrollTop } + } + + function createScriptFromHtml(html) { + var scriptEl = document.createElement('script') + , matches = html.match(simpleScriptTagRe) + scriptEl.src = matches[1] + return scriptEl + } + + /** + * @param {Array.<Element>|Element|Node|string} els + * @return {Bonzo} + */ + function bonzo(els) { + return new Bonzo(els) + } + + bonzo.setQueryEngine = function (q) { + query = q; + delete bonzo.setQueryEngine + } + + bonzo.aug = function (o, target) { + // for those standalone bonzo users. this love is for you. + for (var k in o) { + o.hasOwnProperty(k) && ((target || Bonzo.prototype)[k] = o[k]) } } - return -1; - } - - function uniq(ar) { - var a = [], i, j; - label: - for (i = 0; i < ar.length; i++) { - for (j = 0; j < a.length; j++) { - if (a[j] == ar[i]) { - continue label; + + bonzo.create = function (node) { + // hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh + return typeof node == 'string' && node !== '' ? + function () { + if (simpleScriptTagRe.test(node)) return [createScriptFromHtml(node)] + var tag = node.match(/^\s*<([^\s>]+)/) + , el = doc.createElement('div') + , els = [] + , p = tag ? tagMap[tag[1].toLowerCase()] : null + , dep = p ? p[2] + 1 : 1 + , ns = p && p[3] + , pn = parentNode + , tb = features.autoTbody && p && p[0] == '<table>' && !(/<tbody/i).test(node) + + el.innerHTML = p ? (p[0] + node + p[1]) : node + while (dep--) el = el.firstChild + // for IE NoScope, we may insert cruft at the begining just to get it to work + if (ns && el && el.nodeType !== 1) el = el.nextSibling + do { + // tbody special case for IE<8, creates tbody on any empty table + // we don't want it if we're just after a <thead>, <caption>, etc. + if ((!tag || el.nodeType == 1) && (!tb || el.tagName.toLowerCase() != 'tbody')) { + els.push(el) + } + } while (el = el.nextSibling) + // IE < 9 gives us a parentNode which messes up insert() check for cloning + // `dep` > 1 can also cause problems with the insert() check (must do this last) + each(els, function(el) { el[pn] && el[pn].removeChild(el) }) + return els + }() : isNode(node) ? [node.cloneNode(true)] : [] + } + + bonzo.doc = function () { + var vp = bonzo.viewport() + return { + width: Math.max(doc.body.scrollWidth, html.scrollWidth, vp.width) + , height: Math.max(doc.body.scrollHeight, html.scrollHeight, vp.height) + } + } + + bonzo.firstChild = function (el) { + for (var c = el.childNodes, i = 0, j = (c && c.length) || 0, e; i < j; i++) { + if (c[i].nodeType === 1) e = c[j = i] + } + return e + } + + bonzo.viewport = function () { + return { + width: ie ? html.clientWidth : self.innerWidth + , height: ie ? html.clientHeight : self.innerHeight + } + } + + bonzo.isAncestor = 'compareDocumentPosition' in html ? + function (container, element) { + return (container.compareDocumentPosition(element) & 16) == 16 + } : 'contains' in html ? + function (container, element) { + return container !== element && container.contains(element); + } : + function (container, element) { + while (element = element[parentNode]) { + if (element === container) { + return true + } } + return false + } + + return bonzo + }); // the only line we care about using a semi-colon. placed here for concatenation tools + + + provide("bonzo", module.exports); + + (function ($) { + + var b = require('bonzo') + b.setQueryEngine($) + $.ender(b) + $.ender(b(), true) + $.ender({ + create: function (node) { + return $(b.create(node)) } - a[a.length] = ar[i]; + }) + + $.id = function (id) { + return $([document.getElementById(id)]) } - return a; - } - - $.ender({ - parents: function (selector, closest) { - var collection = $(selector), j, k, p, r = []; - for (j = 0, k = this.length; j < k; j++) { - p = this[j]; - while (p = p.parentNode) { - if (indexOf(collection, p) !== -1) { - r.push(p); - if (closest) break; + + function indexOf(ar, val) { + for (var i = 0; i < ar.length; i++) if (ar[i] === val) return i + return -1 + } + + function uniq(ar) { + var r = [], i = 0, j = 0, k, item, inIt + for (; item = ar[i]; ++i) { + inIt = false + for (k = 0; k < r.length; ++k) { + if (r[k] === item) { + inIt = true; break } } + if (!inIt) r[j++] = item } - return $(uniq(r)); - }, - - closest: function (selector) { - return this.parents(selector, true); - }, - - first: function () { - return $(this[0]); - }, - - last: function () { - return $(this[this.length - 1]); - }, - - next: function () { - return $(b(this).next()); - }, - - previous: function () { - return $(b(this).previous()); - }, - - appendTo: function (t) { - return b(this.selector).appendTo(t, this); - }, - - prependTo: function (t) { - return b(this.selector).prependTo(t, this); - }, - - insertAfter: function (t) { - return b(this.selector).insertAfter(t, this); - }, - - insertBefore: function (t) { - return b(this.selector).insertBefore(t, this); - }, - - siblings: function () { - var i, l, p, r = []; - for (i = 0, l = this.length; i < l; i++) { - p = this[i]; - while (p = p.previousSibling) { - p.nodeType == 1 && r.push(p); + return r + } + + $.ender({ + parents: function (selector, closest) { + if (!this.length) return this + if (!selector) selector = '*' + var collection = $(selector), j, k, p, r = [] + for (j = 0, k = this.length; j < k; j++) { + p = this[j] + while (p = p.parentNode) { + if (~indexOf(collection, p)) { + r.push(p) + if (closest) break; + } + } } - p = this[i]; - while (p = p.nextSibling) { - p.nodeType == 1 && r.push(p); + return $(uniq(r)) + } + + , parent: function() { + return $(uniq(b(this).parent())) + } + + , closest: function (selector) { + return this.parents(selector, true) + } + + , first: function () { + return $(this.length ? this[0] : this) + } + + , last: function () { + return $(this.length ? this[this.length - 1] : []) + } + + , next: function () { + return $(b(this).next()) + } + + , previous: function () { + return $(b(this).previous()) + } + + , appendTo: function (t) { + return b(this.selector).appendTo(t, this) + } + + , prependTo: function (t) { + return b(this.selector).prependTo(t, this) + } + + , insertAfter: function (t) { + return b(this.selector).insertAfter(t, this) + } + + , insertBefore: function (t) { + return b(this.selector).insertBefore(t, this) + } + + , siblings: function () { + var i, l, p, r = [] + for (i = 0, l = this.length; i < l; i++) { + p = this[i] + while (p = p.previousSibling) p.nodeType == 1 && r.push(p) + p = this[i] + while (p = p.nextSibling) p.nodeType == 1 && r.push(p) } + return $(r) } - return $(r); - }, - - children: function () { - var el, r = []; - for (i = 0, l = this.length; i < l; i++) { - if (!(el = b.firstChild(this[i]))) { - continue; + + , children: function () { + var i, l, el, r = [] + for (i = 0, l = this.length; i < l; i++) { + if (!(el = b.firstChild(this[i]))) continue; + r.push(el) + while (el = el.nextSibling) el.nodeType == 1 && r.push(el) } - r.push(el); - while (el = el.nextSibling) { - el.nodeType == 1 && r.push(el); + return $(uniq(r)) + } + + , height: function (v) { + return dimension.call(this, 'height', v) + } + + , width: function (v) { + return dimension.call(this, 'width', v) + } + }, true) + + /** + * @param {string} type either width or height + * @param {number=} opt_v becomes a setter instead of a getter + * @return {number} + */ + function dimension(type, opt_v) { + return typeof opt_v == 'undefined' + ? b(this).dim()[type] + : this.css(type, opt_v) + } + }(ender)); + +}()); + +(function () { + + var module = { exports: {} }, exports = module.exports; + + /*! + * domready (c) Dustin Diaz 2012 - License MIT + */ + !function (name, definition) { + if (typeof module != 'undefined') module.exports = definition() + else if (typeof define == 'function' && typeof define.amd == 'object') define(definition) + else this[name] = definition() + }('domready', function (ready) { + + var fns = [], fn, f = false + , doc = document + , testEl = doc.documentElement + , hack = testEl.doScroll + , domContentLoaded = 'DOMContentLoaded' + , addEventListener = 'addEventListener' + , onreadystatechange = 'onreadystatechange' + , readyState = 'readyState' + , loaded = /^loade|c/.test(doc[readyState]) + + function flush(f) { + loaded = 1 + while (f = fns.shift()) f() + } + + doc[addEventListener] && doc[addEventListener](domContentLoaded, fn = function () { + doc.removeEventListener(domContentLoaded, fn, f) + flush() + }, f) + + + hack && doc.attachEvent(onreadystatechange, fn = function () { + if (/^c/.test(doc[readyState])) { + doc.detachEvent(onreadystatechange, fn) + flush() + } + }) + + return (ready = hack ? + function (fn) { + self != top ? + loaded ? fn() : fns.push(fn) : + function () { + try { + testEl.doScroll('left') + } catch (e) { + return setTimeout(function() { ready(fn) }, 50) + } + fn() + }() + } : + function (fn) { + loaded ? fn() : fns.push(fn) + }) + }) + + provide("domready", module.exports); + + !function ($) { + var ready = require('domready') + $.ender({domReady: ready}) + $.ender({ + ready: function (f) { + ready(f) + return this + } + }, true) + }(ender); + +}()); + +(function () { + + var module = { exports: {} }, exports = module.exports; + + /*! + * @preserve Qwery - A Blazing Fast query selector engine + * https://github.com/ded/qwery + * copyright Dustin Diaz 2012 + * MIT License + */ + + (function (name, context, definition) { + if (typeof module != 'undefined' && module.exports) module.exports = definition() + else if (typeof context['define'] == 'function' && context['define']['amd']) define(definition) + else context[name] = definition() + })('qwery', this, function () { + var doc = document + , html = doc.documentElement + , byClass = 'getElementsByClassName' + , byTag = 'getElementsByTagName' + , qSA = 'querySelectorAll' + , useNativeQSA = 'useNativeQSA' + , tagName = 'tagName' + , nodeType = 'nodeType' + , select // main select() method, assign later + + , id = /#([\w\-]+)/ + , clas = /\.[\w\-]+/g + , idOnly = /^#([\w\-]+)$/ + , classOnly = /^\.([\w\-]+)$/ + , tagOnly = /^([\w\-]+)$/ + , tagAndOrClass = /^([\w]+)?\.([\w\-]+)$/ + , splittable = /(^|,)\s*[>~+]/ + , normalizr = /^\s+|\s*([,\s\+\~>]|$)\s*/g + , splitters = /[\s\>\+\~]/ + , splittersMore = /(?![\s\w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^'"]*\]|[\s\w\+\-]*\))/ + , specialChars = /([.*+?\^=!:${}()|\[\]\/\\])/g + , simple = /^(\*|[a-z0-9]+)?(?:([\.\#]+[\w\-\.#]+)?)/ + , attr = /\[([\w\-]+)(?:([\|\^\$\*\~]?\=)['"]?([ \w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^]+)["']?)?\]/ + , pseudo = /:([\w\-]+)(\(['"]?([^()]+)['"]?\))?/ + , easy = new RegExp(idOnly.source + '|' + tagOnly.source + '|' + classOnly.source) + , dividers = new RegExp('(' + splitters.source + ')' + splittersMore.source, 'g') + , tokenizr = new RegExp(splitters.source + splittersMore.source) + , chunker = new RegExp(simple.source + '(' + attr.source + ')?' + '(' + pseudo.source + ')?') + + var walker = { + ' ': function (node) { + return node && node !== html && node.parentNode + } + , '>': function (node, contestant) { + return node && node.parentNode == contestant.parentNode && node.parentNode + } + , '~': function (node) { + return node && node.previousSibling + } + , '+': function (node, contestant, p1, p2) { + if (!node) return false + return (p1 = previous(node)) && (p2 = previous(contestant)) && p1 == p2 && p1 } } - return $(uniq(r)); - }, - - height: function (v) { - return v ? this.css('height', v) : parseInt(this.css('height'), 10); - }, - - width: function (v) { - return v ? this.css('width', v) : parseInt(this.css('width'), 10); + + function cache() { + this.c = {} } - }, true); - -}(ender || $); - -!function () { var exports = {}, module = { exports: exports }; !function (doc) { - var loaded = 0, fns = [], ol, f = false, - testEl = doc.createElement('a'), - domContentLoaded = 'DOMContentLoaded', - addEventListener = 'addEventListener', - onreadystatechange = 'onreadystatechange'; - - /^loade|c/.test(doc.readyState) && (loaded = 1); - - function flush() { - loaded = 1; - for (var i = 0, l = fns.length; i < l; i++) { - fns[i](); + cache.prototype = { + g: function (k) { + return this.c[k] || undefined + } + , s: function (k, v, r) { + v = r ? new RegExp(v) : v + return (this.c[k] = v) + } } - } - doc[addEventListener] && doc[addEventListener](domContentLoaded, function fn() { - doc.removeEventListener(domContentLoaded, fn, f); - flush(); - }, f); - - - testEl.doScroll && doc.attachEvent(onreadystatechange, (ol = function ol() { - if (/^c/.test(doc.readyState)) { - doc.detachEvent(onreadystatechange, ol); - flush(); + + var classCache = new cache() + , cleanCache = new cache() + , attrCache = new cache() + , tokenCache = new cache() + + function classRegex(c) { + return classCache.g(c) || classCache.s(c, '(^|\\s+)' + c + '(\\s+|$)', 1) } - })); - - var domReady = testEl.doScroll ? - function (fn) { - self != top ? - !loaded ? - fns.push(fn) : - fn() : - !function () { - try { - testEl.doScroll('left'); - } catch (e) { - return setTimeout(function() { - domReady(fn); - }, 50); - } - fn(); - }(); - } : - function (fn) { - loaded ? fn() : fns.push(fn); - }; - - (typeof module !== 'undefined') && module.exports ? - (module.exports = {domReady: domReady}) : - (window.domReady = domReady); - -}(document); $.ender(module.exports); }.call($); -/*! - * qwery.js - copyright @dedfat - * https://github.com/ded/qwery - * Follow our software http://twitter.com/dedfat - * MIT License - */ - -!function (context, doc) { - - var c, i, j, k, l, m, o, p, r, v, - el, node, len, found, classes, item, items, token, - id = /#([\w\-]+)/, - clas = /\.[\w\-]+/g, - idOnly = /^#([\w\-]+$)/, - classOnly = /^\.([\w\-]+)$/, - tagOnly = /^([\w\-]+)$/, - tagAndOrClass = /^([\w]+)?\.([\w\-]+)$/, - html = doc.documentElement, - tokenizr = /\s(?![\s\w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^'"]*\])/, - specialChars = /([.*+?\^=!:${}()|\[\]\/\\])/g, - simple = /^([a-z0-9]+)?(?:([\.\#]+[\w\-\.#]+)?)/, - attr = /\[([\w\-]+)(?:([\|\^\$\*\~]?\=)['"]?([ \w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^]+)["']?)?\]/, - chunker = new RegExp(simple.source + '(' + attr.source + ')?'); - - function array(ar) { - r = []; - for (i = 0, len = ar.length; i < len; i++) { - r[i] = ar[i]; + + // not quite as fast as inline loops in older browsers so don't use liberally + function each(a, fn) { + var i = 0, l = a.length + for (; i < l; i++) fn(a[i]) } - return r; - } - - var cache = function () { - this.c = {}; - }; - cache.prototype = { - g: function (k) { - return this.c[k] || undefined; - }, - s: function (k, v) { - this.c[k] = v; - return v; - } - }; - - var classCache = new cache(), - cleanCache = new cache(), - attrCache = new cache(), - tokenCache = new cache(); - - function q(query) { - return query.match(chunker); - } - - function interpret(whole, tag, idsAndClasses, wholeAttribute, attribute, qualifier, value) { - var m, c, k; - if (tag && this.tagName.toLowerCase() !== tag) { - return false; + + function flatten(ar) { + for (var r = [], i = 0, l = ar.length; i < l; ++i) arrayLike(ar[i]) ? (r = r.concat(ar[i])) : (r[r.length] = ar[i]) + return r } - if (idsAndClasses && (m = idsAndClasses.match(id)) && m[1] !== this.id) { - return false; + + function arrayify(ar) { + var i = 0, l = ar.length, r = [] + for (; i < l; i++) r[i] = ar[i] + return r } - if (idsAndClasses && (classes = idsAndClasses.match(clas))) { - for (i = classes.length; i--;) { - c = classes[i].slice(1); - if (!(classCache.g(c) || classCache.s(c, new RegExp('(^|\\s+)' + c + '(\\s+|$)'))).test(this.className)) { - return false; - } - } + + function previous(n) { + while (n = n.previousSibling) if (n[nodeType] == 1) break; + return n } - if (wholeAttribute && !value) { - o = this.attributes; - for (k in o) { - if (Object.prototype.hasOwnProperty.call(o, k) && (o[k].name || k) == attribute) { - return this; + + function q(query) { + return query.match(chunker) + } + + // called using `this` as element and arguments from regex group results. + // given => div.hello[title="world"]:foo('bar') + // div.hello[title="world"]:foo('bar'), div, .hello, [title="world"], title, =, world, :foo('bar'), foo, ('bar'), bar] + function interpret(whole, tag, idsAndClasses, wholeAttribute, attribute, qualifier, value, wholePseudo, pseudo, wholePseudoVal, pseudoVal) { + var i, m, k, o, classes + if (this[nodeType] !== 1) return false + if (tag && tag !== '*' && this[tagName] && this[tagName].toLowerCase() !== tag) return false + if (idsAndClasses && (m = idsAndClasses.match(id)) && m[1] !== this.id) return false + if (idsAndClasses && (classes = idsAndClasses.match(clas))) { + for (i = classes.length; i--;) if (!classRegex(classes[i].slice(1)).test(this.className)) return false + } + if (pseudo && qwery.pseudos[pseudo] && !qwery.pseudos[pseudo](this, pseudoVal)) return false + if (wholeAttribute && !value) { // select is just for existance of attrib + o = this.attributes + for (k in o) { + if (Object.prototype.hasOwnProperty.call(o, k) && (o[k].name || k) == attribute) { + return this + } } } + if (wholeAttribute && !checkAttr(qualifier, getAttr(this, attribute) || '', value)) { + // select is for attrib equality + return false + } + return this } - if (wholeAttribute && !checkAttr(qualifier, this.getAttribute(attribute) || '', value)) { - return false; + + function clean(s) { + return cleanCache.g(s) || cleanCache.s(s, s.replace(specialChars, '\\$1')) } - return this; - } - - function loopAll(tokens) { - var r = [], token = tokens.pop(), intr = q(token), tag = intr[1] || '*', i, l, els, - root = tokens.length && (m = tokens[0].match(idOnly)) ? doc.getElementById(m[1]) : doc; - if (!root) { - return r; + + function checkAttr(qualify, actual, val) { + switch (qualify) { + case '=': + return actual == val + case '^=': + return actual.match(attrCache.g('^=' + val) || attrCache.s('^=' + val, '^' + clean(val), 1)) + case '$=': + return actual.match(attrCache.g('$=' + val) || attrCache.s('$=' + val, clean(val) + '$', 1)) + case '*=': + return actual.match(attrCache.g(val) || attrCache.s(val, clean(val), 1)) + case '~=': + return actual.match(attrCache.g('~=' + val) || attrCache.s('~=' + val, '(?:^|\\s+)' + clean(val) + '(?:\\s+|$)', 1)) + case '|=': + return actual.match(attrCache.g('|=' + val) || attrCache.s('|=' + val, '^' + clean(val) + '(-|$)', 1)) + } + return 0 } - els = root.getElementsByTagName(tag); - for (i = 0, l = els.length; i < l; i++) { - el = els[i]; - if (item = interpret.apply(el, intr)) { - r.push(item); + + // given a selector, first check for simple cases then collect all base candidate matches and filter + function _qwery(selector, _root) { + var r = [], ret = [], i, l, m, token, tag, els, intr, item, root = _root + , tokens = tokenCache.g(selector) || tokenCache.s(selector, selector.split(tokenizr)) + , dividedTokens = selector.match(dividers) + + if (!tokens.length) return r + + token = (tokens = tokens.slice(0)).pop() // copy cached tokens, take the last one + if (tokens.length && (m = tokens[tokens.length - 1].match(idOnly))) root = byId(_root, m[1]) + if (!root) return r + + intr = q(token) + // collect base candidates to filter + els = root !== _root && root[nodeType] !== 9 && dividedTokens && /^[+~]$/.test(dividedTokens[dividedTokens.length - 1]) ? + function (r) { + while (root = root.nextSibling) { + root[nodeType] == 1 && (intr[1] ? intr[1] == root[tagName].toLowerCase() : 1) && (r[r.length] = root) + } + return r + }([]) : + root[byTag](intr[1] || '*') + // filter elements according to the right-most part of the selector + for (i = 0, l = els.length; i < l; i++) { + if (item = interpret.apply(els[i], intr)) r[r.length] = item } + if (!tokens.length) return r + + // filter further according to the rest of the selector (the left side) + each(r, function (e) { if (ancestorMatch(e, tokens, dividedTokens)) ret[ret.length] = e }) + return ret } - return r; - } - - function clean(s) { - return cleanCache.g(s) || cleanCache.s(s, s.replace(specialChars, '\\$1')); - } - - function checkAttr(qualify, actual, val) { - switch (qualify) { - case '=': - return actual == val; - case '^=': - return actual.match(attrCache.g('^=' + val) || attrCache.s('^=' + val, new RegExp('^' + clean(val)))); - case '$=': - return actual.match(attrCache.g('$=' + val) || attrCache.s('$=' + val, new RegExp(clean(val) + '$'))); - case '*=': - return actual.match(attrCache.g(val) || attrCache.s(val, new RegExp(clean(val)))); - case '~=': - return actual.match(attrCache.g('~=' + val) || attrCache.s('~=' + val, new RegExp('(?:^|\\s+)' + clean(val) + '(?:\\s+|$)'))); - case '|=': - return actual.match(attrCache.g('|=' + val) || attrCache.s('|=' + val, new RegExp('^' + clean(val) + '(-|$)'))); - } - return false; - } - - function _qwery(selector) { - var r = [], ret = [], i, l, - tokens = tokenCache.g(selector) || tokenCache.s(selector, selector.split(tokenizr)); - tokens = tokens.slice(0); - if (!tokens.length) { - return r; - } - r = loopAll(tokens); - if (!tokens.length) { - return r; - } - // loop through all descendent tokens - for (j = 0, l = r.length, k = 0; j < l; j++) { - node = r[j]; - p = node; - // loop through each token - for (i = tokens.length; i--;) { - z: // loop through parent nodes - while (p !== html && (p = p.parentNode)) { - if (found = interpret.apply(p, q(tokens[i]))) { - break z; + + // compare element to a selector + function is(el, selector, root) { + if (isNode(selector)) return el == selector + if (arrayLike(selector)) return !!~flatten(selector).indexOf(el) // if selector is an array, is el a member? + + var selectors = selector.split(','), tokens, dividedTokens + while (selector = selectors.pop()) { + tokens = tokenCache.g(selector) || tokenCache.s(selector, selector.split(tokenizr)) + dividedTokens = selector.match(dividers) + tokens = tokens.slice(0) // copy array + if (interpret.apply(el, q(tokens.pop())) && (!tokens.length || ancestorMatch(el, tokens, dividedTokens, root))) { + return true + } + } + return false + } + + // given elements matching the right-most part of a selector, filter out any that don't match the rest + function ancestorMatch(el, tokens, dividedTokens, root) { + var cand + // recursively work backwards through the tokens and up the dom, covering all options + function crawl(e, i, p) { + while (p = walker[dividedTokens[i]](p, e)) { + if (isNode(p) && (interpret.apply(p, q(tokens[i])))) { + if (i) { + if (cand = crawl(p, i - 1, p)) return cand + } else return p } } } - found && (ret[k++] = node); + return (cand = crawl(el, tokens.length - 1, el)) && (!root || isAncestor(cand, root)) } - return ret; - } - - function boilerPlate(selector, _root, fn) { - var root = (typeof _root == 'string') ? fn(_root)[0] : (_root || doc); - if (selector === window || isNode(selector)) { - return !_root || (selector !== window && isNode(root) && isAncestor(selector, root)) ? [selector] : []; + + function isNode(el, t) { + return el && typeof el === 'object' && (t = el[nodeType]) && (t == 1 || t == 9) } - if (selector && typeof selector === 'object' && isFinite(selector.length)) { - return array(selector); + + function uniq(ar) { + var a = [], i, j; + o: + for (i = 0; i < ar.length; ++i) { + for (j = 0; j < a.length; ++j) if (a[j] == ar[i]) continue o + a[a.length] = ar[i] + } + return a } - if (m = selector.match(idOnly)) { - return (el = doc.getElementById(m[1])) ? [el] : []; + + function arrayLike(o) { + return (typeof o === 'object' && isFinite(o.length)) } - if (m = selector.match(tagOnly)) { - return array(root.getElementsByTagName(m[1])); + + function normalizeRoot(root) { + if (!root) return doc + if (typeof root == 'string') return qwery(root)[0] + if (!root[nodeType] && arrayLike(root)) return root[0] + return root } - return false; - } - - function isNode(el) { - return (el && el.nodeType && (el.nodeType == 1 || el.nodeType == 9)); - } - - function uniq(ar) { - var a = [], i, j; - label: - for (i = 0; i < ar.length; i++) { - for (j = 0; j < a.length; j++) { - if (a[j] == ar[i]) { - continue label; - } - } - a[a.length] = ar[i]; + + function byId(root, id, el) { + // if doc, query on it, else query the parent doc or if a detached fragment rewrite the query and run on the fragment + return root[nodeType] === 9 ? root.getElementById(id) : + root.ownerDocument && + (((el = root.ownerDocument.getElementById(id)) && isAncestor(el, root) && el) || + (!isAncestor(root, root.ownerDocument) && select('[id="' + id + '"]', root)[0])) } - return a; - } - - function qwery(selector, _root) { - var root = (typeof _root == 'string') ? qwery(_root)[0] : (_root || doc); - if (!root || !selector) { - return []; + + function qwery(selector, _root) { + var m, el, root = normalizeRoot(_root) + + // easy, fast cases that we can dispatch with simple DOM calls + if (!root || !selector) return [] + if (selector === window || isNode(selector)) { + return !_root || (selector !== window && isNode(root) && isAncestor(selector, root)) ? [selector] : [] + } + if (selector && arrayLike(selector)) return flatten(selector) + if (m = selector.match(easy)) { + if (m[1]) return (el = byId(root, m[1])) ? [el] : [] + if (m[2]) return arrayify(root[byTag](m[2])) + if (hasByClass && m[3]) return arrayify(root[byClass](m[3])) + } + + return select(selector, root) } - if (m = boilerPlate(selector, _root, qwery)) { - return m; + + // where the root is not document and a relationship selector is first we have to + // do some awkward adjustments to get it to work, even with qSA + function collectSelector(root, collector) { + return function (s) { + var oid, nid + if (splittable.test(s)) { + if (root[nodeType] !== 9) { + // make sure the el has an id, rewrite the query, set root to doc and run it + if (!(nid = oid = root.getAttribute('id'))) root.setAttribute('id', nid = '__qwerymeupscotty') + s = '[id="' + nid + '"]' + s // avoid byId and allow us to match context element + collector(root.parentNode || root, s, true) + oid || root.removeAttribute('id') + } + return; + } + s.length && collector(root, s, false) + } } - return select(selector, root); - } - - var isAncestor = 'compareDocumentPosition' in html ? - function (element, container) { - return (container.compareDocumentPosition(element) & 16) == 16; - } : 'contains' in html ? - function (element, container) { - container = container == doc || container == window ? html : container; - return container !== element && container.contains(element); - } : - function (element, container) { - while (element = element.parentNode) { - if (element === container) { - return 1; - } - } - return 0; - }, - - select = (doc.querySelector && doc.querySelectorAll) ? - function (selector, root) { - if (doc.getElementsByClassName && (m = selector.match(classOnly))) { - return array((root).getElementsByClassName(m[1])); - } - return array((root).querySelectorAll(selector)); - } : - function (selector, root) { - var result = [], collection, collections = [], i; - if (m = selector.match(tagAndOrClass)) { - items = root.getElementsByTagName(m[1] || '*'); - r = classCache.g(m[2]) || classCache.s(m[2], new RegExp('(^|\\s+)' + m[2] + '(\\s+|$)')); - for (i = 0, l = items.length, j = 0; i < l; i++) { - r.test(items[i].className) && (result[j++] = items[i]); - } - return result; - } - for (i = 0, items = selector.split(','), l = items.length; i < l; i++) { - collections[i] = _qwery(items[i]); - } - for (i = 0, l = collections.length; i < l && (collection = collections[i]); i++) { - var ret = collection; - if (root !== doc) { - ret = []; - for (j = 0, m = collection.length; j < m && (element = collection[j]); j++) { - // make sure element is a descendent of root - isAncestor(element, root) && ret.push(element); + + var isAncestor = 'compareDocumentPosition' in html ? + function (element, container) { + return (container.compareDocumentPosition(element) & 16) == 16 + } : 'contains' in html ? + function (element, container) { + container = container[nodeType] === 9 || container == window ? html : container + return container !== element && container.contains(element) + } : + function (element, container) { + while (element = element.parentNode) if (element === container) return 1 + return 0 + } + , getAttr = function () { + // detect buggy IE src/href getAttribute() call + var e = doc.createElement('p') + return ((e.innerHTML = '<a href="#x">x</a>') && e.firstChild.getAttribute('href') != '#x') ? + function (e, a) { + return a === 'class' ? e.className : (a === 'href' || a === 'src') ? + e.getAttribute(a, 2) : e.getAttribute(a) + } : + function (e, a) { return e.getAttribute(a) } + }() + , hasByClass = !!doc[byClass] + // has native qSA support + , hasQSA = doc.querySelector && doc[qSA] + // use native qSA + , selectQSA = function (selector, root) { + var result = [], ss, e + try { + if (root[nodeType] === 9 || !splittable.test(selector)) { + // most work is done right here, defer to qSA + return arrayify(root[qSA](selector)) + } + // special case where we need the services of `collectSelector()` + each(ss = selector.split(','), collectSelector(root, function (ctx, s) { + e = ctx[qSA](s) + if (e.length == 1) result[result.length] = e.item(0) + else if (e.length) result = result.concat(arrayify(e)) + })) + return ss.length > 1 && result.length > 1 ? uniq(result) : result + } catch (ex) { } + return selectNonNative(selector, root) + } + // no native selector support + , selectNonNative = function (selector, root) { + var result = [], items, m, i, l, r, ss + selector = selector.replace(normalizr, '$1') + if (m = selector.match(tagAndOrClass)) { + r = classRegex(m[2]) + items = root[byTag](m[1] || '*') + for (i = 0, l = items.length; i < l; i++) { + if (r.test(items[i].className)) result[result.length] = items[i] } + return result } - result = result.concat(ret); + // more complex selector, get `_qwery()` to do the work for us + each(ss = selector.split(','), collectSelector(root, function (ctx, s, rewrite) { + r = _qwery(s, ctx) + for (i = 0, l = r.length; i < l; i++) { + if (ctx[nodeType] === 9 || rewrite || isAncestor(r[i], root)) result[result.length] = r[i] + } + })) + return ss.length > 1 && result.length > 1 ? uniq(result) : result + } + , configure = function (options) { + // configNativeQSA: use fully-internal selector or native qSA where present + if (typeof options[useNativeQSA] !== 'undefined') + select = !options[useNativeQSA] ? selectNonNative : hasQSA ? selectQSA : selectNonNative + } + + configure({ useNativeQSA: true }) + + qwery.configure = configure + qwery.uniq = uniq + qwery.is = is + qwery.pseudos = {} + + return qwery + }); + + + provide("qwery", module.exports); + + (function ($) { + var q = function () { + var r + try { + r = require('qwery') + } catch (ex) { + r = require('qwery-mobile') + } finally { + return r } - return uniq(result); - }; + }() + + $.pseudos = q.pseudos + + $._select = function (s, r) { + // detect if sibling module 'bonzo' is available at run-time + // rather than load-time since technically it's not a dependency and + // can be loaded in any order + // hence the lazy function re-definition + return ($._select = (function () { + var b + if (typeof $.create == 'function') return function (s, r) { + return /^\s*</.test(s) ? $.create(s, r) : q(s, r) + } + try { + b = require('bonzo') + return function (s, r) { + return /^\s*</.test(s) ? b.create(s, r) : q(s, r) + } + } catch (e) { } + return q + })())(s, r) + } + + $.ender({ + find: function (s) { + var r = [], i, l, j, k, els + for (i = 0, l = this.length; i < l; i++) { + els = q(s, this[i]) + for (j = 0, k = els.length; j < k; j++) r.push(els[j]) + } + return $(q.uniq(r)) + } + , and: function (s) { + var plus = $(s) + for (var i = this.length, j = 0, l = this.length + plus.length; i < l; i++, j++) { + this[i] = plus[j] + } + this.length += plus.length + return this + } + , is: function(s, r) { + var i, l + for (i = 0, l = this.length; i < l; i++) { + if (q.is(this[i], s, r)) { + return true + } + } + return false + } + }, true) + }(ender)); + - qwery.uniq = uniq; - var oldQwery = context.qwery; - qwery.noConflict = function () { - context.qwery = oldQwery; - return this; - }; - context['qwery'] = qwery; +}()); -}(this, document);!function (doc) { - var q = qwery.noConflict(); - function create(node, root) { - var el = (root || doc).createElement('div'), els = []; - el.innerHTML = node; - var nodes = el.childNodes; - el = el.firstChild; - els.push(el); - while (el = el.nextSibling) { - (el.nodeType == 1) && els.push(el); - } - return els; - }; - $._select = function (s, r) { - return /^\s*</.test(s) ? create(s, r) : q(s, r); - }; - $.ender({ - find: function (s) { - var r = [], i, l, j, k, els; - for (i = 0, l = this.length; i < l; i++) { - els = q(s, this[i]); - for (j = 0, k = els.length; j < k; j++) { - r.push(els[j]); - } - } - return $(q.uniq(r)); - } - , and: function (s) { - var plus = $(s); - for (var i = this.length, j = 0, l = this.length + plus.length; i < l; i++, j++) { - this[i] = plus[j]; - } - return this; - } - }, true); -}(document); diff --git a/.themes/classic/source/javascripts/octopress.js b/.themes/classic/source/javascripts/octopress.js index 379e6630..775fd335 100644 --- a/.themes/classic/source/javascripts/octopress.js +++ b/.themes/classic/source/javascripts/octopress.js @@ -11,6 +11,7 @@ function getNav() { mobileNav.children('select').bind('change', function(event) { if (event.target.value) { window.location.href = event.target.value; } }); + mobileNav.children('select').val(''); } function addSidebarToggler() { diff --git a/.themes/classic/source/javascripts/pinboard.js b/.themes/classic/source/javascripts/pinboard.js index 52577e2c..a97df03d 100644 --- a/.themes/classic/source/javascripts/pinboard.js +++ b/.themes/classic/source/javascripts/pinboard.js @@ -44,7 +44,7 @@ function Pinboard_Linkroll() { if (it.t.length > 0) { for (var i = 0; i < it.t.length; i++) { var tag = it.t[i]; - str += " <a class=\"pin-tag\" href=\"http://pinboard.in/u:"+ this.cook(it.a) + "/t:" + this.cook(tag) + "\">" + this.cook(tag).replace(/^\s+|\s+$/g, '') + "</a> "; + str += " <a class=\"pin-tag\" href=\"https://pinboard.in/u:"+ this.cook(it.a) + "/t:" + this.cook(tag) + "\">" + this.cook(tag).replace(/^\s+|\s+$/g, '') + "</a> "; } } str += "</p></li>\n"; @@ -52,5 +52,5 @@ function Pinboard_Linkroll() { } } Pinboard_Linkroll.prototype = new Pinboard_Linkroll(); -pinboardNS_fetch_script("http://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count="+pinboard_count); +pinboardNS_fetch_script("https://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count="+pinboard_count); diff --git a/.themes/classic/source/javascripts/twitter.js b/.themes/classic/source/javascripts/twitter.js index c9b7519d..3e2dd0d7 100644 --- a/.themes/classic/source/javascripts/twitter.js +++ b/.themes/classic/source/javascripts/twitter.js @@ -42,8 +42,8 @@ function prettyDate(time) { function linkifyTweet(text, url) { // Linkify urls, usernames, hashtags text = text.replace(/(https?:\/\/)([\w\-:;?&=+.%#\/]+)/gi, '<a href="$1$2">$2</a>') - .replace(/(^|\W)@(\w+)/g, '$1<a href="http://twitter.com/$2">@$2</a>') - .replace(/(^|\W)#(\w+)/g, '$1<a href="http://search.twitter.com/search?q=%23$2">#$2</a>'); + .replace(/(^|\W)@(\w+)/g, '$1<a href="https://twitter.com/$2">@$2</a>') + .replace(/(^|\W)#(\w+)/g, '$1<a href="https://search.twitter.com/search?q=%23$2">#$2</a>'); // Use twitter's api to replace t.co shortened urls with expanded ones. for (var u in url) { @@ -62,7 +62,7 @@ function showTwitterFeed(tweets, twitter_user) { content = ''; for (var t in tweets) { - content += '<li>'+'<p>'+'<a href="http://twitter.com/'+twitter_user+'/status/'+tweets[t].id_str+'">'+prettyDate(tweets[t].created_at)+'</a>'+linkifyTweet(tweets[t].text.replace(/\n/g, '<br>'), tweets[t].entities.urls)+'</p>'+'</li>'; + content += '<li>'+'<p>'+'<a href="https://twitter.com/'+twitter_user+'/status/'+tweets[t].id_str+'">'+prettyDate(tweets[t].created_at)+'</a>'+linkifyTweet(tweets[t].text.replace(/\n/g, '<br>'), tweets[t].entities.urls)+'</p>'+'</li>'; } timeline.innerHTML = content; } @@ -70,7 +70,7 @@ function showTwitterFeed(tweets, twitter_user) { function getTwitterFeed(user, count, replies) { count = parseInt(count, 10); $.ajax({ - url: "http://api.twitter.com/1/statuses/user_timeline/" + user + ".json?trim_user=true&count=" + (count + 20) + "&include_entities=1&exclude_replies=" + (replies ? "0" : "1") + "&callback=?" + url: "https://api.twitter.com/1/statuses/user_timeline/" + user + ".json?trim_user=true&count=" + (count + 20) + "&include_entities=1&exclude_replies=" + (replies ? "0" : "1") + "&callback=?" , type: 'jsonp' , error: function (err) { $('#tweets li.loading').addClass('error').text("Twitter's busted"); } , success: function(data) { showTwitterFeed(data.slice(0, count), user); } diff --git a/.themes/classic/source/robots.txt b/.themes/classic/source/robots.txt new file mode 100644 index 00000000..b18d5dcb --- /dev/null +++ b/.themes/classic/source/robots.txt @@ -0,0 +1,7 @@ +--- +layout: nil +--- +User-agent: * +Disallow: + +Sitemap: {{ site.url }}/sitemap.xml
\ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..36f48d8f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: ruby +rvm: + - 1.9.3 + - 1.9.2 +script: bundle exec rake install; bundle exec rake generate @@ -1,18 +1,18 @@ source "http://rubygems.org" group :development do - gem 'rake', '~> 0.9.2' + gem 'rake', '~> 0.9' gem 'rack', '~> 1.4.1' - gem 'jekyll', '~> 0.11.2' + gem 'jekyll', '~> 0.12' gem 'rdiscount', '~> 1.6.8' - gem 'pygments.rb', '~> 0.2.12' + gem 'pygments.rb', '~> 0.3.4' gem 'RedCloth', '~> 4.2.9' - gem 'haml', '~> 3.1.6' - gem 'compass', '~> 0.12.1' + gem 'haml', '~> 3.1.7' + gem 'compass', '~> 0.12.2' gem 'rubypants', '~> 0.2.0' gem 'rb-fsevent', '~> 0.9' gem 'stringex', '~> 1.4.0' gem 'liquid', '~> 2.3.0' end -gem 'sinatra', '~> 1.3.2' +gem 'sinatra', '~> 1.3.5' diff --git a/Gemfile.lock b/Gemfile.lock index 1c1bf8d5..d5bc6224 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,68 +2,63 @@ GEM remote: http://rubygems.org/ specs: RedCloth (4.2.9) - albino (1.3.3) - posix-spawn (>= 0.3.6) - blankslate (2.1.2.4) chunky_png (1.2.5) classifier (1.3.3) fast-stemmer (>= 1.0.0) - compass (0.12.1) + compass (0.12.2) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) directory_watcher (1.4.1) fast-stemmer (1.0.1) - ffi (1.0.11) fssm (0.2.9) - haml (3.1.6) - jekyll (0.11.2) - albino (~> 1.3) + haml (3.1.7) + jekyll (0.12.0) classifier (~> 1.3) directory_watcher (~> 1.1) - kramdown (~> 0.13) + kramdown (~> 0.13.4) liquid (~> 2.3) maruku (~> 0.5) - kramdown (0.13.6) + pygments.rb (~> 0.3.2) + kramdown (0.13.8) liquid (2.3.0) - maruku (0.6.0) + maruku (0.6.1) syntax (>= 1.0.0) posix-spawn (0.3.6) - pygments.rb (0.2.12) - rubypython (~> 0.5.3) - rack (1.4.1) - rack-protection (1.2.0) + pygments.rb (0.3.4) + posix-spawn (~> 0.3.6) + yajl-ruby (~> 1.1.0) + rack (1.4.5) + rack-protection (1.3.2) rack rake (0.9.2.2) rb-fsevent (0.9.1) rdiscount (1.6.8) rubypants (0.2.0) - rubypython (0.5.3) - blankslate (>= 2.1.2.3) - ffi (~> 1.0.7) - sass (3.1.18) - sinatra (1.3.2) - rack (~> 1.3, >= 1.3.6) - rack-protection (~> 1.2) + sass (3.1.20) + sinatra (1.3.5) + rack (~> 1.4) + rack-protection (~> 1.3) tilt (~> 1.3, >= 1.3.3) stringex (1.4.0) syntax (1.0.0) tilt (1.3.3) + yajl-ruby (1.1.0) PLATFORMS ruby DEPENDENCIES RedCloth (~> 4.2.9) - compass (~> 0.12.1) - haml (~> 3.1.6) - jekyll (~> 0.11.2) + compass (~> 0.12.2) + haml (~> 3.1.7) + jekyll (~> 0.12) liquid (~> 2.3.0) - pygments.rb (~> 0.2.12) + pygments.rb (~> 0.3.4) rack (~> 1.4.1) - rake (~> 0.9.2) + rake (~> 0.9) rb-fsevent (~> 0.9) rdiscount (~> 1.6.8) rubypants (~> 0.2.0) - sinatra (~> 1.3.2) + sinatra (~> 1.3.5) stringex (~> 1.4.0) diff --git a/README.markdown b/README.markdown index 06ea4232..f9289754 100644 --- a/README.markdown +++ b/README.markdown @@ -16,13 +16,15 @@ Check out [Octopress.org](http://octopress.org/docs) for guides and documentatio ## Contributing +[![Build Status](https://travis-ci.org/imathis/octopress.png?branch=master)](https://travis-ci.org/imathis/octopress) + We love to see people contributing to Octopress, whether it's a bug report, feature suggestion or a pull request. At the moment, we try to keep the core slick and lean, focusing on basic blogging needs, so some of your suggestions might not find their way into Octopress. For those ideas, we started a [list of 3rd party plug-ins](https://github.com/imathis/octopress/wiki/3rd-party-plugins), where you can link your own Octopress plug-in repositories. For the future, we're thinking about ways to easier add them them into our main releases. ## License (The MIT License) -Copyright © 2009-2011 Brandon Mathis +Copyright © 2009-2013 Brandon Mathis Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ‘Software’), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -7,7 +7,8 @@ require "stringex" ssh_user = "user@domain.com" ssh_port = "22" document_root = "~/website.com/" -rsync_delete = true +rsync_delete = false +rsync_args = "" # Any extra arguments to pass to rsync deploy_default = "rsync" # This will be configured for you when you run config_deploy @@ -91,10 +92,13 @@ end # usage rake new_post[my-new-post] or rake new_post['my new post'] or rake new_post (defaults to "new-post") desc "Begin a new post in #{source_dir}/#{posts_dir}" task :new_post, :title do |t, args| + if args.title + title = args.title + else + title = get_stdin("Enter a title for your post: ") + end raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) mkdir_p "#{source_dir}/#{posts_dir}" - args.with_defaults(:title => 'new-post') - title = args.title filename = "#{source_dir}/#{posts_dir}/#{Time.now.strftime('%Y-%m-%d')}-#{title.to_url}.#{new_post_ext}" if File.exist?(filename) abort("rake aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n' @@ -151,7 +155,7 @@ task :new_page, :filename do |t, args| end # usage rake isolate[my-post] -desc "Move all other posts than the one currently being worked on to a temporary stash location (stash) so regenerating the site happens much quicker." +desc "Move all other posts than the one currently being worked on to a temporary stash location (stash) so regenerating the site happens much more quickly." task :isolate, :filename do |t, args| stash_dir = "#{source_dir}/#{stash_dir}" FileUtils.mkdir(stash_dir) unless File.exist?(stash_dir) @@ -237,7 +241,7 @@ task :rsync do exclude = "--exclude-from '#{File.expand_path('./rsync-exclude')}'" end puts "## Deploying website via Rsync" - ok_failed system("rsync -avze 'ssh -p #{ssh_port}' #{exclude} #{"--delete" unless rsync_delete == false} #{public_dir}/ #{ssh_user}:#{document_root}") + ok_failed system("rsync -avze 'ssh -p #{ssh_port}' #{exclude} #{rsync_args} #{"--delete" unless rsync_delete == false} #{public_dir}/ #{ssh_user}:#{document_root}") end desc "deploy public directory to github pages" @@ -299,12 +303,14 @@ task :setup_github_pages, :repo do |t, args| if args.repo repo_url = args.repo else - repo_url = get_stdin("Enter the read/write url for your repository: ") + puts "Enter the read/write url for your repository" + puts "(For example, 'git@github.com:your_username/your_username.github.com)" + repo_url = get_stdin("Repository url: ") end user = repo_url.match(/:([^\/]+)/)[1] - branch = (repo_url.match(/\/[\w-]+.github.com/).nil?) ? 'gh-pages' : 'master' + branch = (repo_url.match(/\/[\w-]+\.github\.com/).nil?) ? 'gh-pages' : 'master' project = (branch == 'gh-pages') ? repo_url.match(/\/([^\.]+)/)[1] : '' - unless `git remote -v`.match(/origin.+?octopress.git/).nil? + unless (`git remote -v` =~ /origin.+?octopress(?:\.git)?/).nil? # If octopress is still the origin remote (from cloning) rename it to octopress system "git remote rename origin octopress" if branch == 'master' @@ -4,7 +4,7 @@ require 'sinatra/base' # The project root directory $root = ::File.dirname(__FILE__) -class SinatraStaticServer < Sinatra::Base +class SinatraStaticServer < Sinatra::Base get(/.+/) do send_sinatra_file(request.path) {404} @@ -16,10 +16,10 @@ class SinatraStaticServer < Sinatra::Base def send_sinatra_file(path, &missing_file_block) file_path = File.join(File.dirname(__FILE__), 'public', path) - file_path = File.join(file_path, 'index.html') unless file_path =~ /\.[a-z]+$/i + file_path = File.join(file_path, 'index.html') unless file_path =~ /\.[a-z]+$/i File.exist?(file_path) ? send_file(file_path) : missing_file_block.call end end -run SinatraStaticServer
\ No newline at end of file +run SinatraStaticServer diff --git a/plugins/backtick_code_block.rb b/plugins/backtick_code_block.rb index 40e7900b..8e2c1141 100644 --- a/plugins/backtick_code_block.rb +++ b/plugins/backtick_code_block.rb @@ -2,7 +2,7 @@ require './plugins/pygments_code' module BacktickCodeBlock include HighlightCode - AllOptions = /([^\s]+)\s+(.+?)(https?:\/\/\S+)\s*(.+)?/i + AllOptions = /([^\s]+)\s+(.+?)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i LangCaption = /([^\s]+)\s*(.+)?/i def render_code_block(input) @options = nil diff --git a/plugins/blockquote.rb b/plugins/blockquote.rb index 62e7d143..ebdc0e89 100644 --- a/plugins/blockquote.rb +++ b/plugins/blockquote.rb @@ -21,6 +21,7 @@ module Jekyll class Blockquote < Liquid::Block FullCiteWithTitle = /(\S.*)\s+(https?:\/\/)(\S+)\s+(.+)/i FullCite = /(\S.*)\s+(https?:\/\/)(\S+)/i + AuthorTitle = /([^,]+),([^,]+)/ Author = /(.+)/ def initialize(tag_name, markup, tokens) @@ -30,17 +31,15 @@ module Jekyll if markup =~ FullCiteWithTitle @by = $1 @source = $2 + $3 - @title = $4.titlecase + @title = $4.titlecase.strip elsif markup =~ FullCite @by = $1 @source = $2 + $3 + elsif markup =~ AuthorTitle + @by = $1 + @title = $2.titlecase.strip elsif markup =~ Author - if $1 =~ /([^,]+),([^,]+)/ - @by = $1 - @title = $2.titlecase - else - @by = $1 - end + @by = $1 end super end diff --git a/plugins/category_generator.rb b/plugins/category_generator.rb index bb5fd329..a49c4296 100644 --- a/plugins/category_generator.rb +++ b/plugins/category_generator.rb @@ -19,6 +19,8 @@ # - category_title_prefix: The string used before the category name in the page title (default is # 'Category: '). +require 'stringex' + module Jekyll # The CategoryIndex class creates a single category page for the specified category. @@ -106,12 +108,22 @@ module Jekyll if self.layouts.key? 'category_index' dir = self.config['category_dir'] || 'categories' self.categories.keys.each do |category| - self.write_category_index(File.join(dir, category.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').downcase), category) + self.write_category_index(File.join(dir, category.to_url), category) end # Throw an exception if the layout couldn't be found. else - throw "No 'category_index' layout found." + raise <<-ERR + + +=============================================== + Error for category_generator.rb plugin +----------------------------------------------- + No 'category_index.hmtl' in source/_layouts/ + Perhaps you haven't installed a theme yet. +=============================================== + +ERR end end @@ -141,10 +153,7 @@ module Jekyll # Returns string # def category_links(categories) - dir = @context.registers[:site].config['category_dir'] - categories = categories.sort!.map do |item| - "<a class='category' href='/#{dir}/#{item.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').downcase}/'>#{item}</a>" - end + categories = categories.sort!.map { |c| category_link c } case categories.length when 0 @@ -156,6 +165,17 @@ module Jekyll end end + # Outputs a single category as an <a> link. + # + # +category+ is a category string to format as an <a> link + # + # Returns string + # + def category_link(category) + dir = @context.registers[:site].config['category_dir'] + "<a class='category' href='/#{dir}/#{category.to_url}/'>#{category}</a>" + end + # Outputs the post.date as formatted html, with hooks for CSS styling. # # +date+ is the date object to format as HTML. diff --git a/plugins/code_block.rb b/plugins/code_block.rb index 44e34945..660f73d7 100644 --- a/plugins/code_block.rb +++ b/plugins/code_block.rb @@ -49,8 +49,7 @@ module Jekyll class CodeBlock < Liquid::Block include HighlightCode include TemplateWrapper - CaptionUrlTitle = /(\S[\S\s]*)\s+(https?:\/\/)(\S+)\s+(.+)/i - CaptionUrl = /(\S[\S\s]*)\s+(https?:\/\/)(\S+)/i + CaptionUrlTitle = /(\S[\S\s]*)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i Caption = /(\S[\S\s]*)/ def initialize(tag_name, markup, tokens) @title = nil @@ -63,10 +62,7 @@ module Jekyll end if markup =~ CaptionUrlTitle @file = $1 - @caption = "<figcaption><span>#{$1}</span><a href='#{$2 + $3}'>#{$4}</a></figcaption>" - elsif markup =~ CaptionUrl - @file = $1 - @caption = "<figcaption><span>#{$1}</span><a href='#{$2 + $3}'>link</a></figcaption>" + @caption = "<figcaption><span>#{$1}</span><a href='#{$2}'>#{$3 || 'link'}</a></figcaption>" elsif markup =~ Caption @file = $1 @caption = "<figcaption><span>#{$1}</span></figcaption>\n" diff --git a/plugins/date.rb b/plugins/date.rb index b864f3e9..49fb79a3 100644 --- a/plugins/date.rb +++ b/plugins/date.rb @@ -95,4 +95,4 @@ module Jekyll self.data['updated_formatted'] = format_date(self.data['updated'], date_format) if self.data.has_key?('updated') end end -end
\ No newline at end of file +end diff --git a/plugins/gist_tag.rb b/plugins/gist_tag.rb index 74dd3b37..2549ea7a 100644 --- a/plugins/gist_tag.rb +++ b/plugins/gist_tag.rb @@ -40,7 +40,9 @@ module Jekyll end def script_url_for(gist_id, filename) - "https://gist.github.com/#{gist_id}.js?file=#{filename}" + url = "https://gist.github.com/#{gist_id}.js" + url = "#{url}?file=#{filename}" unless filename.nil? or filename.empty? + url end def get_gist_url_for(gist, file) @@ -82,6 +84,9 @@ module Jekyll https.verify_mode = OpenSSL::SSL::VERIFY_NONE request = Net::HTTP::Get.new raw_uri.request_uri data = https.request request + if data.code.to_i != 200 + raise RuntimeError, "Gist replied with #{data.code} for #{gist_url}" + end data = data.body cache gist, file, data unless @cache_disabled data diff --git a/plugins/jsfiddle.rb b/plugins/jsfiddle.rb index 3ae173eb..a80becb3 100644 --- a/plugins/jsfiddle.rb +++ b/plugins/jsfiddle.rb @@ -37,4 +37,4 @@ module Jekyll end end -Liquid::Template.register_tag('jsfiddle', Jekyll::JsFiddle)
\ No newline at end of file +Liquid::Template.register_tag('jsfiddle', Jekyll::JsFiddle) diff --git a/plugins/octopress_filters.rb b/plugins/octopress_filters.rb index 2ba93e9e..091f75aa 100644 --- a/plugins/octopress_filters.rb +++ b/plugins/octopress_filters.rb @@ -24,12 +24,12 @@ module Jekyll class ContentFilters < PostFilter include OctopressFilters def pre_render(post) - if post.ext.match('html|textile|markdown|haml|slim|xml') + if post.ext.match('html|textile|markdown|md|haml|slim|xml') post.content = pre_filter(post.content) end end def post_render(post) - if post.ext.match('html|textile|markdown|haml|slim|xml') + if post.ext.match('html|textile|markdown|md|haml|slim|xml') post.content = post_filter(post.content) end end diff --git a/plugins/preview_unpublished.rb b/plugins/preview_unpublished.rb index 321ffd6f..28cbdfe7 100644 --- a/plugins/preview_unpublished.rb +++ b/plugins/preview_unpublished.rb @@ -45,4 +45,4 @@ module Jekyll self.posts = self.posts[-limit_posts, limit_posts] if limit_posts end end -end
\ No newline at end of file +end diff --git a/plugins/sitemap_generator.rb b/plugins/sitemap_generator.rb index b63e9423..a08590bf 100644 --- a/plugins/sitemap_generator.rb +++ b/plugins/sitemap_generator.rb @@ -1,6 +1,6 @@ # Sitemap.xml Generator is a Jekyll plugin that generates a sitemap.xml file by # traversing all of the available posts and pages. -# +# # How To Use: # 1) Copy source file into your _plugins folder within your Jekyll project. # 2) Change modify the url variable in _config.yml to reflect your domain name. @@ -28,12 +28,12 @@ # system modified date of the page or post, system modified date of # included layout, system modified date of included layout within that # layout, ... -# +# # Author: Michael Levin # Site: http://www.kinnetica.com # Distributed Under A Creative Commons License # - http://creativecommons.org/licenses/by/3.0/ -# +# # Modified for Octopress by John W. Long # require 'rexml/document' diff --git a/plugins/video_tag.rb b/plugins/video_tag.rb index 6b93be82..c6e67b77 100644 --- a/plugins/video_tag.rb +++ b/plugins/video_tag.rb @@ -22,22 +22,31 @@ module Jekyll @width = '' def initialize(tag_name, markup, tokens) - if markup =~ /((https?:\/\/|\/)(\S+))(\s+(\d+)\s(\d+))?(\s+(https?:\/\/|\/)(\S+))?/i - @video = $1 - @width = $5 - @height = $6 - @poster = $7 + if markup =~ /(https?:\S+)(\s+(https?:\S+))?(\s+(https?:\S+))?(\s+(\d+)\s(\d+))?(\s+(https?:\S+))?/i + @video = [$1, $3, $5].compact + @width = $7 + @height = $8 + @poster = $10 end super end def render(context) output = super - if @video + type = { + 'mp4' => "type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'", + 'ogv' => "type='video/ogg; codecs=theora, vorbis'", + 'webm' => "type='video/webm; codecs=vp8, vorbis'" + } + if @video.size > 0 video = "<video width='#{@width}' height='#{@height}' preload='none' controls poster='#{@poster}'>" - video += "<source src='#{@video}' type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'/></video>" + @video.each do |v| + t = v.match(/([^\.]+)$/)[1] + video += "<source src='#{v}' #{type[t]}>" + end + video += "</video>" else - "Error processing input, expected syntax: {% video url/to/video [width height] [url/to/poster] %}" + "Error processing input, expected syntax: {% video url/to/video [url/to/video] [url/to/video] [width height] [url/to/poster] %}" end end end |