diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js
index a536f02c9..6b21c9162 100644
--- a/frontend/.eslintrc.js
+++ b/frontend/.eslintrc.js
@@ -1,6 +1,5 @@
module.exports = {
ignorePatterns: [
- '/js/libs',
'src',
'target',
'!.*'
diff --git a/frontend/Gruntfile.js b/frontend/Gruntfile.js
index dd1ab0ad7..b410acf94 100644
--- a/frontend/Gruntfile.js
+++ b/frontend/Gruntfile.js
@@ -13,7 +13,7 @@ module.exports = function (grunt) {
less: {
options: {
- paths: 'style',
+ paths: ['style', 'node_modules/bootstrap/less'],
syncImport: true,
compress: true,
sourceMap: true,
@@ -47,7 +47,8 @@ module.exports = function (grunt) {
'js/**/*',
'img/**/*',
'style/**/*',
- 'locales/**/*'
+ 'locales/**/*',
+ 'node_modules/**/*'
],
dest: '<%= destPath %>'
}, {
@@ -67,12 +68,16 @@ module.exports = function (grunt) {
'jquery.colorPicker',
'slider',
'bootstrap',
+ 'slider',
+ // This is actually an AMD module
+ // but doesn't behave correctly.
+ // See https://github.com/eligrey/FileSaver.js/issues/646
'filesaver'
]
},
all: {
expand: true,
- src: ['js/**/*.js', '!js/libs/**/*'],
+ src: ['js/**/*.js'],
dest: '.'
}
},
@@ -83,7 +88,7 @@ module.exports = function (grunt) {
maxWarnings: grunt.option('maxWarnings'),
fix: grunt.option('fix')
},
- files: ['js/**/*.js', './{,.}*.js', '!js/libs/**/{,.}*']
+ files: ['js/**/*.js', './{,.}*.js']
},
stylelint: {
diff --git a/frontend/img/arrow.gif b/frontend/img/arrow.gif
deleted file mode 100644
index b9bdca92f..000000000
Binary files a/frontend/img/arrow.gif and /dev/null differ
diff --git a/frontend/index.html b/frontend/index.html
index 35413b170..da7d1e55c 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -7,7 +7,7 @@
-
+
diff --git a/frontend/js/libs/FileSaver.min.js b/frontend/js/libs/FileSaver.min.js
deleted file mode 100755
index 40e742ddc..000000000
--- a/frontend/js/libs/FileSaver.min.js
+++ /dev/null
@@ -1,3 +0,0 @@
-// source: https://raw.githubusercontent.com/eligrey/FileSaver.js/43bbd2f0ae6794f8d452cd360e9d33aef6071234/dist/FileSaver.min.js
-// license: MIT
-(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)});
diff --git a/frontend/js/libs/Sortable.min.js b/frontend/js/libs/Sortable.min.js
deleted file mode 100644
index 573538f0d..000000000
--- a/frontend/js/libs/Sortable.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! Sortable 1.6.0 - MIT | git://github.com/rubaxa/Sortable.git */
-!function(a){"use strict";"function"==typeof define&&define.amd?define(a):"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=a():window.Sortable=a()}(function(){"use strict";function a(a,b){if(!a||!a.nodeType||1!==a.nodeType)throw"Sortable: `el` must be HTMLElement, and not "+{}.toString.call(a);this.el=a,this.options=b=t({},b),a[T]=this;var c={group:Math.random(),sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(a.nodeName)?"li":">*",ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,setData:function(a,b){a.setData("Text",b.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0}};for(var d in c)!(d in b)&&(b[d]=c[d]);ga(b);for(var e in this)"_"===e.charAt(0)&&"function"==typeof this[e]&&(this[e]=this[e].bind(this));this.nativeDraggable=!b.forceFallback&&$,f(a,"mousedown",this._onTapStart),f(a,"touchstart",this._onTapStart),f(a,"pointerdown",this._onTapStart),this.nativeDraggable&&(f(a,"dragover",this),f(a,"dragenter",this)),ea.push(this._onDragOver),b.store&&this.sort(b.store.get(this))}function b(a,b){"clone"!==a.lastPullMode&&(b=!0),z&&z.state!==b&&(i(z,"display",b?"none":""),b||z.state&&(a.options.group.revertClone?(A.insertBefore(z,B),a._animate(w,z)):A.insertBefore(z,w)),z.state=b)}function c(a,b,c){if(a){c=c||V;do if(">*"===b&&a.parentNode===c||r(a,b))return a;while(a=d(a))}return null}function d(a){var b=a.host;return b&&b.nodeType?b:a.parentNode}function e(a){a.dataTransfer&&(a.dataTransfer.dropEffect="move"),a.preventDefault()}function f(a,b,c){a.addEventListener(b,c,Z)}function g(a,b,c){a.removeEventListener(b,c,Z)}function h(a,b,c){if(a)if(a.classList)a.classList[c?"add":"remove"](b);else{var d=(" "+a.className+" ").replace(R," ").replace(" "+b+" "," ");a.className=(d+(c?" "+b:"")).replace(R," ")}}function i(a,b,c){var d=a&&a.style;if(d){if(void 0===c)return V.defaultView&&V.defaultView.getComputedStyle?c=V.defaultView.getComputedStyle(a,""):a.currentStyle&&(c=a.currentStyle),void 0===b?c:c[b];b in d||(b="-webkit-"+b),d[b]=c+("string"==typeof c?"":"px")}}function j(a,b,c){if(a){var d=a.getElementsByTagName(b),e=0,f=d.length;if(c)for(;e5||b.clientX-(d.left+d.width)>5}function p(a){for(var b=a.tagName+a.className+a.src+a.href+a.textContent,c=b.length,d=0;c--;)d+=b.charCodeAt(c);return d.toString(36)}function q(a,b){var c=0;if(!a||!a.parentNode)return-1;for(;a&&(a=a.previousElementSibling);)"TEMPLATE"===a.nodeName.toUpperCase()||">*"!==b&&!r(a,b)||c++;return c}function r(a,b){if(a){b=b.split(".");var c=b.shift().toUpperCase(),d=new RegExp("\\s("+b.join("|")+")(?=\\s)","g");return!(""!==c&&a.nodeName.toUpperCase()!=c||b.length&&((" "+a.className+" ").match(d)||[]).length!=b.length)}return!1}function s(a,b){var c,d;return function(){void 0===c&&(c=arguments,d=this,setTimeout(function(){1===c.length?a.call(d,c[0]):a.apply(d,c),c=void 0},b))}}function t(a,b){if(a&&b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function u(a){return X?X(a).clone(!0)[0]:Y&&Y.dom?Y.dom(a).cloneNode(!0):a.cloneNode(!0)}function v(a){for(var b=a.getElementsByTagName("input"),c=b.length;c--;){var d=b[c];d.checked&&da.push(d)}}if("undefined"==typeof window||!window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q={},R=/\s+/g,S=/left|right|inline/,T="Sortable"+(new Date).getTime(),U=window,V=U.document,W=U.parseInt,X=U.jQuery||U.Zepto,Y=U.Polymer,Z=!1,$=!!("draggable"in V.createElement("div")),_=function(a){return!navigator.userAgent.match(/Trident.*rv[ :]?11\./)&&(a=V.createElement("x"),a.style.cssText="pointer-events:auto","auto"===a.style.pointerEvents)}(),aa=!1,ba=Math.abs,ca=Math.min,da=[],ea=[],fa=s(function(a,b,c){if(c&&b.scroll){var d,e,f,g,h,i,j=c[T],k=b.scrollSensitivity,l=b.scrollSpeed,m=a.clientX,n=a.clientY,o=window.innerWidth,p=window.innerHeight;if(E!==c&&(D=b.scroll,E=c,F=b.scrollFn,D===!0)){D=c;do if(D.offsetWidth-1:e==a)}}var c={},d=a.group;d&&"object"==typeof d||(d={name:d}),c.name=d.name,c.checkPull=b(d.pull,!0),c.checkPut=b(d.put),c.revertClone=d.revertClone,a.group=c};a.prototype={constructor:a,_onTapStart:function(a){var b,d=this,e=this.el,f=this.options,g=f.preventOnFilter,h=a.type,i=a.touches&&a.touches[0],j=(i||a).target,l=a.target.shadowRoot&&a.path[0]||j,m=f.filter;if(v(e),!w&&!("mousedown"===h&&0!==a.button||f.disabled)&&(j=c(j,f.draggable,e),j&&C!==j)){if(b=q(j,f.draggable),"function"==typeof m){if(m.call(this,a,j,this))return k(d,l,"filter",j,e,b),void(g&&a.preventDefault())}else if(m&&(m=m.split(",").some(function(a){if(a=c(l,a.trim(),e))return k(d,a,"filter",j,e,b),!0})))return void(g&&a.preventDefault());f.handle&&!c(l,f.handle,e)||this._prepareDragStart(a,i,j,b)}},_prepareDragStart:function(a,b,c,d){var e,g=this,i=g.el,l=g.options,n=i.ownerDocument;c&&!w&&c.parentNode===i&&(N=a,A=i,w=c,x=w.parentNode,B=w.nextSibling,C=c,L=l.group,J=d,this._lastX=(b||a).clientX,this._lastY=(b||a).clientY,w.style["will-change"]="transform",e=function(){g._disableDelayedDrag(),w.draggable=g.nativeDraggable,h(w,l.chosenClass,!0),g._triggerDragStart(a,b),k(g,A,"choose",w,A,J)},l.ignore.split(",").forEach(function(a){j(w,a.trim(),m)}),f(n,"mouseup",g._onDrop),f(n,"touchend",g._onDrop),f(n,"touchcancel",g._onDrop),f(n,"pointercancel",g._onDrop),f(n,"selectstart",g),l.delay?(f(n,"mouseup",g._disableDelayedDrag),f(n,"touchend",g._disableDelayedDrag),f(n,"touchcancel",g._disableDelayedDrag),f(n,"mousemove",g._disableDelayedDrag),f(n,"touchmove",g._disableDelayedDrag),f(n,"pointermove",g._disableDelayedDrag),g._dragStartTimer=setTimeout(e,l.delay)):e())},_disableDelayedDrag:function(){var a=this.el.ownerDocument;clearTimeout(this._dragStartTimer),g(a,"mouseup",this._disableDelayedDrag),g(a,"touchend",this._disableDelayedDrag),g(a,"touchcancel",this._disableDelayedDrag),g(a,"mousemove",this._disableDelayedDrag),g(a,"touchmove",this._disableDelayedDrag),g(a,"pointermove",this._disableDelayedDrag)},_triggerDragStart:function(a,b){b=b||("touch"==a.pointerType?a:null),b?(N={target:w,clientX:b.clientX,clientY:b.clientY},this._onDragStart(N,"touch")):this.nativeDraggable?(f(w,"dragend",this),f(A,"dragstart",this._onDragStart)):this._onDragStart(N,!0);try{V.selection?setTimeout(function(){V.selection.empty()}):window.getSelection().removeAllRanges()}catch(a){}},_dragStarted:function(){if(A&&w){var b=this.options;h(w,b.ghostClass,!0),h(w,b.dragClass,!1),a.active=this,k(this,A,"start",w,A,J)}else this._nulling()},_emulateDragOver:function(){if(O){if(this._lastX===O.clientX&&this._lastY===O.clientY)return;this._lastX=O.clientX,this._lastY=O.clientY,_||i(y,"display","none");var a=V.elementFromPoint(O.clientX,O.clientY),b=a,c=ea.length;if(b)do{if(b[T]){for(;c--;)ea[c]({clientX:O.clientX,clientY:O.clientY,target:a,rootEl:b});break}a=b}while(b=b.parentNode);_||i(y,"display","")}},_onTouchMove:function(b){if(N){var c=this.options,d=c.fallbackTolerance,e=c.fallbackOffset,f=b.touches?b.touches[0]:b,g=f.clientX-N.clientX+e.x,h=f.clientY-N.clientY+e.y,j=b.touches?"translate3d("+g+"px,"+h+"px,0)":"translate("+g+"px,"+h+"px)";if(!a.active){if(d&&ca(ba(f.clientX-this._lastX),ba(f.clientY-this._lastY))w.offsetWidth,D=e.offsetHeight>w.offsetHeight,E=(v?(d.clientX-g.left)/t:(d.clientY-g.top)/u)>.5,F=e.nextElementSibling,J=!1;if(v){var K=w.offsetTop,N=e.offsetTop;J=K===N?e.previousElementSibling===w&&!C||E&&C:e.previousElementSibling===w||w.previousElementSibling===e?(d.clientY-g.top)/u>.5:N>K}else r||(J=F!==w&&!D||E&&D);var O=l(A,j,w,f,e,g,d,J);O!==!1&&(1!==O&&O!==-1||(J=1===O),aa=!0,setTimeout(n,30),b(p,q),w.contains(j)||(J&&!F?j.appendChild(w):e.parentNode.insertBefore(w,J?F:e)),x=w.parentNode,this._animate(f,w),this._animate(g,e))}}},_animate:function(a,b){var c=this.options.animation;if(c){var d=b.getBoundingClientRect();1===a.nodeType&&(a=a.getBoundingClientRect()),i(b,"transition","none"),i(b,"transform","translate3d("+(a.left-d.left)+"px,"+(a.top-d.top)+"px,0)"),b.offsetWidth,i(b,"transition","all "+c+"ms"),i(b,"transform","translate3d(0,0,0)"),clearTimeout(b.animated),b.animated=setTimeout(function(){i(b,"transition",""),i(b,"transform",""),b.animated=!1},c)}},_offUpEvents:function(){var a=this.el.ownerDocument;g(V,"touchmove",this._onTouchMove),g(V,"pointermove",this._onTouchMove),g(a,"mouseup",this._onDrop),g(a,"touchend",this._onDrop),g(a,"pointerup",this._onDrop),g(a,"touchcancel",this._onDrop),g(a,"pointercancel",this._onDrop),g(a,"selectstart",this)},_onDrop:function(b){var c=this.el,d=this.options;clearInterval(this._loopId),clearInterval(Q.pid),clearTimeout(this._dragStartTimer),g(V,"mousemove",this._onTouchMove),this.nativeDraggable&&(g(V,"drop",this),g(c,"dragstart",this._onDragStart)),this._offUpEvents(),b&&(P&&(b.preventDefault(),!d.dropBubble&&b.stopPropagation()),y&&y.parentNode&&y.parentNode.removeChild(y),A!==x&&"clone"===a.active.lastPullMode||z&&z.parentNode&&z.parentNode.removeChild(z),w&&(this.nativeDraggable&&g(w,"dragend",this),m(w),w.style["will-change"]="",h(w,this.options.ghostClass,!1),h(w,this.options.chosenClass,!1),k(this,A,"unchoose",w,A,J),A!==x?(K=q(w,d.draggable),K>=0&&(k(null,x,"add",w,A,J,K),k(this,A,"remove",w,A,J,K),k(null,x,"sort",w,A,J,K),k(this,A,"sort",w,A,J,K))):w.nextSibling!==B&&(K=q(w,d.draggable),K>=0&&(k(this,A,"update",w,A,J,K),k(this,A,"sort",w,A,J,K))),a.active&&(null!=K&&K!==-1||(K=J),k(this,A,"end",w,A,J,K),this.save()))),this._nulling()},_nulling:function(){A=w=x=y=B=z=C=D=E=N=O=P=K=G=H=M=L=a.active=null,da.forEach(function(a){a.checked=!0}),da.length=0},handleEvent:function(a){switch(a.type){case"drop":case"dragend":this._onDrop(a);break;case"dragover":case"dragenter":w&&(this._onDragOver(a),e(a));break;case"selectstart":a.preventDefault()}},toArray:function(){for(var a,b=[],d=this.el.children,e=0,f=d.length,g=this.options;e").attr(attrs);this.setElement($el,false)}else{this.setElement(_.result(this,"el"),false)}}});Backbone.sync=function(method,model,options){var type=methodMap[method];_.defaults(options||(options={}),{emulateHTTP:Backbone.emulateHTTP,emulateJSON:Backbone.emulateJSON});var params={type:type,dataType:"json"};if(!options.url){params.url=_.result(model,"url")||urlError()}if(options.data==null&&model&&(method==="create"||method==="update"||method==="patch")){params.contentType="application/json";params.data=JSON.stringify(options.attrs||model.toJSON(options))}if(options.emulateJSON){params.contentType="application/x-www-form-urlencoded";params.data=params.data?{model:params.data}:{}}if(options.emulateHTTP&&(type==="PUT"||type==="DELETE"||type==="PATCH")){params.type="POST";if(options.emulateJSON)params.data._method=type;var beforeSend=options.beforeSend;options.beforeSend=function(xhr){xhr.setRequestHeader("X-HTTP-Method-Override",type);if(beforeSend)return beforeSend.apply(this,arguments)}}if(params.type!=="GET"&&!options.emulateJSON){params.processData=false}if(params.type==="PATCH"&&window.ActiveXObject&&!(window.external&&window.external.msActiveXFilteringEnabled)){params.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var xhr=options.xhr=Backbone.ajax(_.extend(params,options));model.trigger("request",model,xhr,options);return xhr};var methodMap={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};Backbone.ajax=function(){return Backbone.$.ajax.apply(Backbone.$,arguments)};var Router=Backbone.Router=function(options){options||(options={});if(options.routes)this.routes=options.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var optionalParam=/\((.*?)\)/g;var namedParam=/(\(\?)?:\w+/g;var splatParam=/\*\w+/g;var escapeRegExp=/[\-{}\[\]+?.,\\\^$|#\s]/g;_.extend(Router.prototype,Events,{initialize:function(){},route:function(route,name,callback){if(!_.isRegExp(route))route=this._routeToRegExp(route);if(_.isFunction(name)){callback=name;name=""}if(!callback)callback=this[name];var router=this;Backbone.history.route(route,function(fragment){var args=router._extractParameters(route,fragment);callback&&callback.apply(router,args);router.trigger.apply(router,["route:"+name].concat(args));router.trigger("route",name,args);Backbone.history.trigger("route",router,name,args)});return this},navigate:function(fragment,options){Backbone.history.navigate(fragment,options);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=_.result(this,"routes");var route,routes=_.keys(this.routes);while((route=routes.pop())!=null){this.route(route,this.routes[route])}},_routeToRegExp:function(route){route=route.replace(escapeRegExp,"\\$&").replace(optionalParam,"(?:$1)?").replace(namedParam,function(match,optional){return optional?match:"([^/]+)"}).replace(splatParam,"(.*?)");return new RegExp("^"+route+"$")},_extractParameters:function(route,fragment){var params=route.exec(fragment).slice(1);return _.map(params,function(param){return param?decodeURIComponent(param):null})}});var History=Backbone.History=function(){this.handlers=[];_.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var routeStripper=/^[#\/]|\s+$/g;var rootStripper=/^\/+|\/+$/g;var isExplorer=/msie [\w.]+/;var trailingSlash=/\/$/;History.started=false;_.extend(History.prototype,Events,{interval:50,getHash:function(window){var match=(window||this).location.href.match(/#(.*)$/);return match?match[1]:""},getFragment:function(fragment,forcePushState){if(fragment==null){if(this._hasPushState||!this._wantsHashChange||forcePushState){fragment=this.location.pathname;var root=this.root.replace(trailingSlash,"");if(!fragment.indexOf(root))fragment=fragment.substr(root.length)}else{fragment=this.getHash()}}return fragment.replace(routeStripper,"")},start:function(options){if(History.started)throw new Error("Backbone.history has already been started");History.started=true;this.options=_.extend({},{root:"/"},this.options,options);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var fragment=this.getFragment();var docMode=document.documentMode;var oldIE=isExplorer.exec(navigator.userAgent.toLowerCase())&&(!docMode||docMode<=7);this.root=("/"+this.root+"/").replace(rootStripper,"/");if(oldIE&&this._wantsHashChange){this.iframe=Backbone.$('').hide().appendTo("body")[0].contentWindow;this.navigate(fragment)}if(this._hasPushState){Backbone.$(window).on("popstate",this.checkUrl)}else if(this._wantsHashChange&&"onhashchange"in window&&!oldIE){Backbone.$(window).on("hashchange",this.checkUrl)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=fragment;var loc=this.location;var atRoot=loc.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!atRoot){this.fragment=this.getFragment(null,true);this.location.replace(this.root+this.location.search+"#"+this.fragment);return true}else if(this._wantsPushState&&this._hasPushState&&atRoot&&loc.hash){this.fragment=this.getHash().replace(routeStripper,"");this.history.replaceState({},document.title,this.root+this.fragment+loc.search)}if(!this.options.silent)return this.loadUrl()},stop:function(){Backbone.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);History.started=false},route:function(route,callback){this.handlers.unshift({route:route,callback:callback})},checkUrl:function(e){var current=this.getFragment();if(current===this.fragment&&this.iframe){current=this.getFragment(this.getHash(this.iframe))}if(current===this.fragment)return false;if(this.iframe)this.navigate(current);this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(fragmentOverride){var fragment=this.fragment=this.getFragment(fragmentOverride);var matched=_.any(this.handlers,function(handler){if(handler.route.test(fragment)){handler.callback(fragment);return true}});return matched},navigate:function(fragment,options){if(!History.started)return false;if(!options||options===true)options={trigger:options};fragment=this.getFragment(fragment||"");if(this.fragment===fragment)return;this.fragment=fragment;var url=this.root+fragment;if(this._hasPushState){this.history[options.replace?"replaceState":"pushState"]({},document.title,url)}else if(this._wantsHashChange){this._updateHash(this.location,fragment,options.replace);if(this.iframe&&fragment!==this.getFragment(this.getHash(this.iframe))){if(!options.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,fragment,options.replace)}}else{return this.location.assign(url)}if(options.trigger)this.loadUrl(fragment)},_updateHash:function(location,fragment,replace){if(replace){var href=location.href.replace(/(javascript:|#).*$/,"");location.replace(href+"#"+fragment)}else{location.hash="#"+fragment}}});Backbone.history=new History;var extend=function(protoProps,staticProps){var parent=this;var child;if(protoProps&&_.has(protoProps,"constructor")){child=protoProps.constructor}else{child=function(){return parent.apply(this,arguments)}}_.extend(child,parent,staticProps);var Surrogate=function(){this.constructor=child};Surrogate.prototype=parent.prototype;child.prototype=new Surrogate;if(protoProps)_.extend(child.prototype,protoProps);child.__super__=parent.prototype;return child};Model.extend=Collection.extend=Router.extend=View.extend=History.extend=extend;var urlError=function(){throw new Error('A "url" property or function must be specified')};var wrapError=function(model,options){var error=options.error;options.error=function(resp){if(error)error(model,resp,options);model.trigger("error",model,resp,options)}}}).call(this);
-//@ sourceMappingURL=backbone-min.map
diff --git a/frontend/js/libs/backbone-min.map b/frontend/js/libs/backbone-min.map
deleted file mode 100644
index 5d6ad3509..000000000
--- a/frontend/js/libs/backbone-min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"backbone-min.js","sources":["backbone.js"],"names":["root","this","previousBackbone","Backbone","array","push","slice","splice","exports","VERSION","_","require","$","jQuery","Zepto","ender","noConflict","emulateHTTP","emulateJSON","Events","on","name","callback","context","eventsApi","_events","events","ctx","once","self","off","apply","arguments","_callback","retain","ev","names","i","l","j","k","keys","length","trigger","args","call","allEvents","all","triggerEvents","stopListening","obj","listeners","_listeners","deleteListener","_listenerId","id","eventSplitter","action","rest","key","concat","test","split","a1","a2","a3","listenMethods","listenTo","listenToOnce","each","implementation","method","uniqueId","bind","unbind","extend","Model","attributes","options","defaults","attrs","cid","pick","modelOptions","parse","result","set","changed","initialize","prototype","validationError","idAttribute","toJSON","clone","sync","get","attr","escape","has","val","unset","changes","silent","changing","prev","current","_validate","_changing","_previousAttributes","isEqual","_pending","clear","hasChanged","isEmpty","changedAttributes","diff","old","previous","previousAttributes","fetch","model","success","resp","wrapError","save","xhr","wait","validate","serverAttrs","isObject","isNew","patch","destroy","collection","url","base","urlError","charAt","encodeURIComponent","constructor","isValid","error","modelMethods","unshift","Collection","models","comparator","_reset","reset","setOptions","add","remove","merge","addOptions","map","isArray","index","_byId","indexOf","_removeReference","existing","sort","at","sortable","sortAttr","isString","toAdd","toRemove","modelMap","_prepareModel","_onModelEvent","previousModels","pop","shift","begin","end","where","first","findWhere","Error","sortBy","sortedIndex","value","iterator","isFunction","pluck","invoke","create","event","methods","attributeMethods","View","_configure","_ensureElement","delegateEvents","delegateEventSplitter","viewOptions","tagName","selector","$el","find","render","setElement","element","delegate","undelegateEvents","el","match","eventName","className","type","methodMap","params","dataType","data","contentType","JSON","stringify","_method","beforeSend","setRequestHeader","processData","window","ActiveXObject","external","msActiveXFilteringEnabled","ajax","update","delete","read","Router","routes","_bindRoutes","optionalParam","namedParam","splatParam","escapeRegExp","route","isRegExp","_routeToRegExp","router","history","fragment","_extractParameters","navigate","replace","optional","RegExp","exec","param","decodeURIComponent","History","handlers","bindAll","location","routeStripper","rootStripper","isExplorer","trailingSlash","started","interval","getHash","href","getFragment","forcePushState","_hasPushState","_wantsHashChange","pathname","substr","start","hashChange","_wantsPushState","pushState","docMode","document","documentMode","oldIE","navigator","userAgent","toLowerCase","iframe","hide","appendTo","contentWindow","checkUrl","_checkUrlInterval","setInterval","loc","atRoot","search","hash","replaceState","title","loadUrl","stop","clearInterval","e","fragmentOverride","matched","any","handler","_updateHash","open","close","assign","protoProps","staticProps","parent","child","Surrogate","__super__"],"mappings":"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"}
\ No newline at end of file
diff --git a/frontend/js/libs/backbone.js b/frontend/js/libs/backbone.js
deleted file mode 100644
index 3512d42fb..000000000
--- a/frontend/js/libs/backbone.js
+++ /dev/null
@@ -1,1571 +0,0 @@
-// Backbone.js 1.0.0
-
-// (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc.
-// Backbone may be freely distributed under the MIT license.
-// For all details and documentation:
-// http://backbonejs.org
-
-(function(){
-
- // Initial Setup
- // -------------
-
- // Save a reference to the global object (`window` in the browser, `exports`
- // on the server).
- var root = this;
-
- // Save the previous value of the `Backbone` variable, so that it can be
- // restored later on, if `noConflict` is used.
- var previousBackbone = root.Backbone;
-
- // Create local references to array methods we'll want to use later.
- var array = [];
- var push = array.push;
- var slice = array.slice;
- var splice = array.splice;
-
- // The top-level namespace. All public Backbone classes and modules will
- // be attached to this. Exported for both the browser and the server.
- var Backbone;
- if (typeof exports !== 'undefined') {
- Backbone = exports;
- } else {
- Backbone = root.Backbone = {};
- }
-
- // Current version of the library. Keep in sync with `package.json`.
- Backbone.VERSION = '1.0.0';
-
- // Require Underscore, if we're on the server, and it's not already present.
- var _ = root._;
- if (!_ && (typeof require !== 'undefined')) _ = require('underscore');
-
- // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns
- // the `$` variable.
- Backbone.$ = root.jQuery || root.Zepto || root.ender || root.$;
-
- // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable
- // to its previous owner. Returns a reference to this Backbone object.
- Backbone.noConflict = function() {
- root.Backbone = previousBackbone;
- return this;
- };
-
- // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option
- // will fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and
- // set a `X-Http-Method-Override` header.
- Backbone.emulateHTTP = false;
-
- // Turn on `emulateJSON` to support legacy servers that can't deal with direct
- // `application/json` requests ... will encode the body as
- // `application/x-www-form-urlencoded` instead and will send the model in a
- // form param named `model`.
- Backbone.emulateJSON = false;
-
- // Backbone.Events
- // ---------------
-
- // A module that can be mixed in to *any object* in order to provide it with
- // custom events. You may bind with `on` or remove with `off` callback
- // functions to an event; `trigger`-ing an event fires all callbacks in
- // succession.
- //
- // var object = {};
- // _.extend(object, Backbone.Events);
- // object.on('expand', function(){ alert('expanded'); });
- // object.trigger('expand');
- //
- var Events = Backbone.Events = {
-
- // Bind an event to a `callback` function. Passing `"all"` will bind
- // the callback to all events fired.
- on: function(name, callback, context) {
- if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
- this._events || (this._events = {});
- var events = this._events[name] || (this._events[name] = []);
- events.push({callback: callback, context: context, ctx: context || this});
- return this;
- },
-
- // Bind an event to only be triggered a single time. After the first time
- // the callback is invoked, it will be removed.
- once: function(name, callback, context) {
- if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;
- var self = this;
- var once = _.once(function() {
- self.off(name, once);
- callback.apply(this, arguments);
- });
- once._callback = callback;
- return this.on(name, once, context);
- },
-
- // Remove one or many callbacks. If `context` is null, removes all
- // callbacks with that function. If `callback` is null, removes all
- // callbacks for the event. If `name` is null, removes all bound
- // callbacks for all events.
- off: function(name, callback, context) {
- var retain, ev, events, names, i, l, j, k;
- if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;
- if (!name && !callback && !context) {
- this._events = {};
- return this;
- }
-
- names = name ? [name] : _.keys(this._events);
- for (i = 0, l = names.length; i < l; i++) {
- name = names[i];
- if (events = this._events[name]) {
- this._events[name] = retain = [];
- if (callback || context) {
- for (j = 0, k = events.length; j < k; j++) {
- ev = events[j];
- if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||
- (context && context !== ev.context)) {
- retain.push(ev);
- }
- }
- }
- if (!retain.length) delete this._events[name];
- }
- }
-
- return this;
- },
-
- // Trigger one or many events, firing all bound callbacks. Callbacks are
- // passed the same arguments as `trigger` is, apart from the event name
- // (unless you're listening on `"all"`, which will cause your callback to
- // receive the true name of the event as the first argument).
- trigger: function(name) {
- if (!this._events) return this;
- var args = slice.call(arguments, 1);
- if (!eventsApi(this, 'trigger', name, args)) return this;
- var events = this._events[name];
- var allEvents = this._events.all;
- if (events) triggerEvents(events, args);
- if (allEvents) triggerEvents(allEvents, arguments);
- return this;
- },
-
- // Tell this object to stop listening to either specific events ... or
- // to every object it's currently listening to.
- stopListening: function(obj, name, callback) {
- var listeners = this._listeners;
- if (!listeners) return this;
- var deleteListener = !name && !callback;
- if (typeof name === 'object') callback = this;
- if (obj) (listeners = {})[obj._listenerId] = obj;
- for (var id in listeners) {
- listeners[id].off(name, callback, this);
- if (deleteListener) delete this._listeners[id];
- }
- return this;
- }
-
- };
-
- // Regular expression used to split event strings.
- var eventSplitter = /\s+/;
-
- // Implement fancy features of the Events API such as multiple event
- // names `"change blur"` and jQuery-style event maps `{change: action}`
- // in terms of the existing API.
- var eventsApi = function(obj, action, name, rest) {
- if (!name) return true;
-
- // Handle event maps.
- if (typeof name === 'object') {
- for (var key in name) {
- obj[action].apply(obj, [key, name[key]].concat(rest));
- }
- return false;
- }
-
- // Handle space separated event names.
- if (eventSplitter.test(name)) {
- var names = name.split(eventSplitter);
- for (var i = 0, l = names.length; i < l; i++) {
- obj[action].apply(obj, [names[i]].concat(rest));
- }
- return false;
- }
-
- return true;
- };
-
- // A difficult-to-believe, but optimized internal dispatch function for
- // triggering events. Tries to keep the usual cases speedy (most internal
- // Backbone events have 3 arguments).
- var triggerEvents = function(events, args) {
- var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
- switch (args.length) {
- case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
- case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
- case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
- case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
- default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
- }
- };
-
- var listenMethods = {listenTo: 'on', listenToOnce: 'once'};
-
- // Inversion-of-control versions of `on` and `once`. Tell *this* object to
- // listen to an event in another object ... keeping track of what it's
- // listening to.
- _.each(listenMethods, function(implementation, method) {
- Events[method] = function(obj, name, callback) {
- var listeners = this._listeners || (this._listeners = {});
- var id = obj._listenerId || (obj._listenerId = _.uniqueId('l'));
- listeners[id] = obj;
- if (typeof name === 'object') callback = this;
- obj[implementation](name, callback, this);
- return this;
- };
- });
-
- // Aliases for backwards compatibility.
- Events.bind = Events.on;
- Events.unbind = Events.off;
-
- // Allow the `Backbone` object to serve as a global event bus, for folks who
- // want global "pubsub" in a convenient place.
- _.extend(Backbone, Events);
-
- // Backbone.Model
- // --------------
-
- // Backbone **Models** are the basic data object in the framework --
- // frequently representing a row in a table in a database on your server.
- // A discrete chunk of data and a bunch of useful, related methods for
- // performing computations and transformations on that data.
-
- // Create a new model with the specified attributes. A client id (`cid`)
- // is automatically generated and assigned for you.
- var Model = Backbone.Model = function(attributes, options) {
- var defaults;
- var attrs = attributes || {};
- options || (options = {});
- this.cid = _.uniqueId('c');
- this.attributes = {};
- _.extend(this, _.pick(options, modelOptions));
- if (options.parse) attrs = this.parse(attrs, options) || {};
- if (defaults = _.result(this, 'defaults')) {
- attrs = _.defaults({}, attrs, defaults);
- }
- this.set(attrs, options);
- this.changed = {};
- this.initialize.apply(this, arguments);
- };
-
- // A list of options to be attached directly to the model, if provided.
- var modelOptions = ['url', 'urlRoot', 'collection'];
-
- // Attach all inheritable methods to the Model prototype.
- _.extend(Model.prototype, Events, {
-
- // A hash of attributes whose current and previous value differ.
- changed: null,
-
- // The value returned during the last failed validation.
- validationError: null,
-
- // The default name for the JSON `id` attribute is `"id"`. MongoDB and
- // CouchDB users may want to set this to `"_id"`.
- idAttribute: 'id',
-
- // Initialize is an empty function by default. Override it with your own
- // initialization logic.
- initialize: function(){},
-
- // Return a copy of the model's `attributes` object.
- toJSON: function(options) {
- return _.clone(this.attributes);
- },
-
- // Proxy `Backbone.sync` by default -- but override this if you need
- // custom syncing semantics for *this* particular model.
- sync: function() {
- return Backbone.sync.apply(this, arguments);
- },
-
- // Get the value of an attribute.
- get: function(attr) {
- return this.attributes[attr];
- },
-
- // Get the HTML-escaped value of an attribute.
- escape: function(attr) {
- return _.escape(this.get(attr));
- },
-
- // Returns `true` if the attribute contains a value that is not null
- // or undefined.
- has: function(attr) {
- return this.get(attr) != null;
- },
-
- // Set a hash of model attributes on the object, firing `"change"`. This is
- // the core primitive operation of a model, updating the data and notifying
- // anyone who needs to know about the change in state. The heart of the beast.
- set: function(key, val, options) {
- var attr, attrs, unset, changes, silent, changing, prev, current;
- if (key == null) return this;
-
- // Handle both `"key", value` and `{key: value}` -style arguments.
- if (typeof key === 'object') {
- attrs = key;
- options = val;
- } else {
- (attrs = {})[key] = val;
- }
-
- options || (options = {});
-
- // Run validation.
- if (!this._validate(attrs, options)) return false;
-
- // Extract attributes and options.
- unset = options.unset;
- silent = options.silent;
- changes = [];
- changing = this._changing;
- this._changing = true;
-
- if (!changing) {
- this._previousAttributes = _.clone(this.attributes);
- this.changed = {};
- }
- current = this.attributes, prev = this._previousAttributes;
-
- // Check for changes of `id`.
- if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
-
- // For each `set` attribute, update or delete the current value.
- for (attr in attrs) {
- val = attrs[attr];
- if (!_.isEqual(current[attr], val)) changes.push(attr);
- if (!_.isEqual(prev[attr], val)) {
- this.changed[attr] = val;
- } else {
- delete this.changed[attr];
- }
- unset ? delete current[attr] : current[attr] = val;
- }
-
- // Trigger all relevant attribute changes.
- if (!silent) {
- if (changes.length) this._pending = true;
- for (var i = 0, l = changes.length; i < l; i++) {
- this.trigger('change:' + changes[i], this, current[changes[i]], options);
- }
- }
-
- // You might be wondering why there's a `while` loop here. Changes can
- // be recursively nested within `"change"` events.
- if (changing) return this;
- if (!silent) {
- while (this._pending) {
- this._pending = false;
- this.trigger('change', this, options);
- }
- }
- this._pending = false;
- this._changing = false;
- return this;
- },
-
- // Remove an attribute from the model, firing `"change"`. `unset` is a noop
- // if the attribute doesn't exist.
- unset: function(attr, options) {
- return this.set(attr, void 0, _.extend({}, options, {unset: true}));
- },
-
- // Clear all attributes on the model, firing `"change"`.
- clear: function(options) {
- var attrs = {};
- for (var key in this.attributes) attrs[key] = void 0;
- return this.set(attrs, _.extend({}, options, {unset: true}));
- },
-
- // Determine if the model has changed since the last `"change"` event.
- // If you specify an attribute name, determine if that attribute has changed.
- hasChanged: function(attr) {
- if (attr == null) return !_.isEmpty(this.changed);
- return _.has(this.changed, attr);
- },
-
- // Return an object containing all the attributes that have changed, or
- // false if there are no changed attributes. Useful for determining what
- // parts of a view need to be updated and/or what attributes need to be
- // persisted to the server. Unset attributes will be set to undefined.
- // You can also pass an attributes object to diff against the model,
- // determining if there *would be* a change.
- changedAttributes: function(diff) {
- if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
- var val, changed = false;
- var old = this._changing ? this._previousAttributes : this.attributes;
- for (var attr in diff) {
- if (_.isEqual(old[attr], (val = diff[attr]))) continue;
- (changed || (changed = {}))[attr] = val;
- }
- return changed;
- },
-
- // Get the previous value of an attribute, recorded at the time the last
- // `"change"` event was fired.
- previous: function(attr) {
- if (attr == null || !this._previousAttributes) return null;
- return this._previousAttributes[attr];
- },
-
- // Get all of the attributes of the model at the time of the previous
- // `"change"` event.
- previousAttributes: function() {
- return _.clone(this._previousAttributes);
- },
-
- // Fetch the model from the server. If the server's representation of the
- // model differs from its current attributes, they will be overridden,
- // triggering a `"change"` event.
- fetch: function(options) {
- options = options ? _.clone(options) : {};
- if (options.parse === void 0) options.parse = true;
- var model = this;
- var success = options.success;
- options.success = function(resp) {
- if (!model.set(model.parse(resp, options), options)) return false;
- if (success) success(model, resp, options);
- model.trigger('sync', model, resp, options);
- };
- wrapError(this, options);
- return this.sync('read', this, options);
- },
-
- // Set a hash of model attributes, and sync the model to the server.
- // If the server returns an attributes hash that differs, the model's
- // state will be `set` again.
- save: function(key, val, options) {
- var attrs, method, xhr, attributes = this.attributes;
-
- // Handle both `"key", value` and `{key: value}` -style arguments.
- if (key == null || typeof key === 'object') {
- attrs = key;
- options = val;
- } else {
- (attrs = {})[key] = val;
- }
-
- // If we're not waiting and attributes exist, save acts as `set(attr).save(null, opts)`.
- if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;
-
- options = _.extend({validate: true}, options);
-
- // Do not persist invalid models.
- if (!this._validate(attrs, options)) return false;
-
- // Set temporary attributes if `{wait: true}`.
- if (attrs && options.wait) {
- this.attributes = _.extend({}, attributes, attrs);
- }
-
- // After a successful server-side save, the client is (optionally)
- // updated with the server-side state.
- if (options.parse === void 0) options.parse = true;
- var model = this;
- var success = options.success;
- options.success = function(resp) {
- // Ensure attributes are restored during synchronous saves.
- model.attributes = attributes;
- var serverAttrs = model.parse(resp, options);
- if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
- if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
- return false;
- }
- if (success) success(model, resp, options);
- model.trigger('sync', model, resp, options);
- };
- wrapError(this, options);
-
- method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
- if (method === 'patch') options.attrs = attrs;
- xhr = this.sync(method, this, options);
-
- // Restore attributes.
- if (attrs && options.wait) this.attributes = attributes;
-
- return xhr;
- },
-
- // Destroy this model on the server if it was already persisted.
- // Optimistically removes the model from its collection, if it has one.
- // If `wait: true` is passed, waits for the server to respond before removal.
- destroy: function(options) {
- options = options ? _.clone(options) : {};
- var model = this;
- var success = options.success;
-
- var destroy = function() {
- model.trigger('destroy', model, model.collection, options);
- };
-
- options.success = function(resp) {
- if (options.wait || model.isNew()) destroy();
- if (success) success(model, resp, options);
- if (!model.isNew()) model.trigger('sync', model, resp, options);
- };
-
- if (this.isNew()) {
- options.success();
- return false;
- }
- wrapError(this, options);
-
- var xhr = this.sync('delete', this, options);
- if (!options.wait) destroy();
- return xhr;
- },
-
- // Default URL for the model's representation on the server -- if you're
- // using Backbone's restful methods, override this to change the endpoint
- // that will be called.
- url: function() {
- var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
- if (this.isNew()) return base;
- return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
- },
-
- // **parse** converts a response into the hash of attributes to be `set` on
- // the model. The default implementation is just to pass the response along.
- parse: function(resp, options) {
- return resp;
- },
-
- // Create a new model with identical attributes to this one.
- clone: function() {
- return new this.constructor(this.attributes);
- },
-
- // A model is new if it has never been saved to the server, and lacks an id.
- isNew: function() {
- return this.id == null;
- },
-
- // Check if the model is currently in a valid state.
- isValid: function(options) {
- return this._validate({}, _.extend(options || {}, { validate: true }));
- },
-
- // Run validation against the next complete set of model attributes,
- // returning `true` if all is well. Otherwise, fire an `"invalid"` event.
- _validate: function(attrs, options) {
- if (!options.validate || !this.validate) return true;
- attrs = _.extend({}, this.attributes, attrs);
- var error = this.validationError = this.validate(attrs, options) || null;
- if (!error) return true;
- this.trigger('invalid', this, error, _.extend(options || {}, {validationError: error}));
- return false;
- }
-
- });
-
- // Underscore methods that we want to implement on the Model.
- var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit'];
-
- // Mix in each Underscore method as a proxy to `Model#attributes`.
- _.each(modelMethods, function(method) {
- Model.prototype[method] = function() {
- var args = slice.call(arguments);
- args.unshift(this.attributes);
- return _[method].apply(_, args);
- };
- });
-
- // Backbone.Collection
- // -------------------
-
- // If models tend to represent a single row of data, a Backbone Collection is
- // more analagous to a table full of data ... or a small slice or page of that
- // table, or a collection of rows that belong together for a particular reason
- // -- all of the messages in this particular folder, all of the documents
- // belonging to this particular author, and so on. Collections maintain
- // indexes of their models, both in order, and for lookup by `id`.
-
- // Create a new **Collection**, perhaps to contain a specific type of `model`.
- // If a `comparator` is specified, the Collection will maintain
- // its models in sort order, as they're added and removed.
- var Collection = Backbone.Collection = function(models, options) {
- options || (options = {});
- if (options.url) this.url = options.url;
- if (options.model) this.model = options.model;
- if (options.comparator !== void 0) this.comparator = options.comparator;
- this._reset();
- this.initialize.apply(this, arguments);
- if (models) this.reset(models, _.extend({silent: true}, options));
- };
-
- // Default options for `Collection#set`.
- var setOptions = {add: true, remove: true, merge: true};
- var addOptions = {add: true, merge: false, remove: false};
-
- // Define the Collection's inheritable methods.
- _.extend(Collection.prototype, Events, {
-
- // The default model for a collection is just a **Backbone.Model**.
- // This should be overridden in most cases.
- model: Model,
-
- // Initialize is an empty function by default. Override it with your own
- // initialization logic.
- initialize: function(){},
-
- // The JSON representation of a Collection is an array of the
- // models' attributes.
- toJSON: function(options) {
- return this.map(function(model){ return model.toJSON(options); });
- },
-
- // Proxy `Backbone.sync` by default.
- sync: function() {
- return Backbone.sync.apply(this, arguments);
- },
-
- // Add a model, or list of models to the set.
- add: function(models, options) {
- return this.set(models, _.defaults(options || {}, addOptions));
- },
-
- // Remove a model, or a list of models from the set.
- remove: function(models, options) {
- models = _.isArray(models) ? models.slice() : [models];
- options || (options = {});
- var i, l, index, model;
- for (i = 0, l = models.length; i < l; i++) {
- model = this.get(models[i]);
- if (!model) continue;
- delete this._byId[model.id];
- delete this._byId[model.cid];
- index = this.indexOf(model);
- this.models.splice(index, 1);
- this.length--;
- if (!options.silent) {
- options.index = index;
- model.trigger('remove', model, this, options);
- }
- this._removeReference(model);
- }
- return this;
- },
-
- // Update a collection by `set`-ing a new list of models, adding new ones,
- // removing models that are no longer present, and merging models that
- // already exist in the collection, as necessary. Similar to **Model#set**,
- // the core operation for updating the data contained by the collection.
- set: function(models, options) {
- options = _.defaults(options || {}, setOptions);
- if (options.parse) models = this.parse(models, options);
- if (!_.isArray(models)) models = models ? [models] : [];
- var i, l, model, attrs, existing, sort;
- var at = options.at;
- var sortable = this.comparator && (at == null) && options.sort !== false;
- var sortAttr = _.isString(this.comparator) ? this.comparator : null;
- var toAdd = [], toRemove = [], modelMap = {};
-
- // Turn bare objects into model references, and prevent invalid models
- // from being added.
- for (i = 0, l = models.length; i < l; i++) {
- if (!(model = this._prepareModel(models[i], options))) continue;
-
- // If a duplicate is found, prevent it from being added and
- // optionally merge it into the existing model.
- if (existing = this.get(model)) {
- if (options.remove) modelMap[existing.cid] = true;
- if (options.merge) {
- existing.set(model.attributes, options);
- if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
- }
-
- // This is a new model, push it to the `toAdd` list.
- } else if (options.add) {
- toAdd.push(model);
-
- // Listen to added models' events, and index models for lookup by
- // `id` and by `cid`.
- model.on('all', this._onModelEvent, this);
- this._byId[model.cid] = model;
- if (model.id != null) this._byId[model.id] = model;
- }
- }
-
- // Remove nonexistent models if appropriate.
- if (options.remove) {
- for (i = 0, l = this.length; i < l; ++i) {
- if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);
- }
- if (toRemove.length) this.remove(toRemove, options);
- }
-
- // See if sorting is needed, update `length` and splice in new models.
- if (toAdd.length) {
- if (sortable) sort = true;
- this.length += toAdd.length;
- if (at != null) {
- splice.apply(this.models, [at, 0].concat(toAdd));
- } else {
- push.apply(this.models, toAdd);
- }
- }
-
- // Silently sort the collection if appropriate.
- if (sort) this.sort({silent: true});
-
- if (options.silent) return this;
-
- // Trigger `add` events.
- for (i = 0, l = toAdd.length; i < l; i++) {
- (model = toAdd[i]).trigger('add', model, this, options);
- }
-
- // Trigger `sort` if the collection was sorted.
- if (sort) this.trigger('sort', this, options);
- return this;
- },
-
- // When you have more items than you want to add or remove individually,
- // you can reset the entire set with a new list of models, without firing
- // any granular `add` or `remove` events. Fires `reset` when finished.
- // Useful for bulk operations and optimizations.
- reset: function(models, options) {
- options || (options = {});
- for (var i = 0, l = this.models.length; i < l; i++) {
- this._removeReference(this.models[i]);
- }
- options.previousModels = this.models;
- this._reset();
- this.add(models, _.extend({silent: true}, options));
- if (!options.silent) this.trigger('reset', this, options);
- return this;
- },
-
- // Add a model to the end of the collection.
- push: function(model, options) {
- model = this._prepareModel(model, options);
- this.add(model, _.extend({at: this.length}, options));
- return model;
- },
-
- // Remove a model from the end of the collection.
- pop: function(options) {
- var model = this.at(this.length - 1);
- this.remove(model, options);
- return model;
- },
-
- // Add a model to the beginning of the collection.
- unshift: function(model, options) {
- model = this._prepareModel(model, options);
- this.add(model, _.extend({at: 0}, options));
- return model;
- },
-
- // Remove a model from the beginning of the collection.
- shift: function(options) {
- var model = this.at(0);
- this.remove(model, options);
- return model;
- },
-
- // Slice out a sub-array of models from the collection.
- slice: function(begin, end) {
- return this.models.slice(begin, end);
- },
-
- // Get a model from the set by id.
- get: function(obj) {
- if (obj == null) return void 0;
- return this._byId[obj.id != null ? obj.id : obj.cid || obj];
- },
-
- // Get the model at the given index.
- at: function(index) {
- return this.models[index];
- },
-
- // Return models with matching attributes. Useful for simple cases of
- // `filter`.
- where: function(attrs, first) {
- if (_.isEmpty(attrs)) return first ? void 0 : [];
- return this[first ? 'find' : 'filter'](function(model) {
- for (var key in attrs) {
- if (attrs[key] !== model.get(key)) return false;
- }
- return true;
- });
- },
-
- // Return the first model with matching attributes. Useful for simple cases
- // of `find`.
- findWhere: function(attrs) {
- return this.where(attrs, true);
- },
-
- // Force the collection to re-sort itself. You don't need to call this under
- // normal circumstances, as the set will maintain sort order as each item
- // is added.
- sort: function(options) {
- if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
- options || (options = {});
-
- // Run sort based on type of `comparator`.
- if (_.isString(this.comparator) || this.comparator.length === 1) {
- this.models = this.sortBy(this.comparator, this);
- } else {
- this.models.sort(_.bind(this.comparator, this));
- }
-
- if (!options.silent) this.trigger('sort', this, options);
- return this;
- },
-
- // Figure out the smallest index at which a model should be inserted so as
- // to maintain order.
- sortedIndex: function(model, value, context) {
- value || (value = this.comparator);
- var iterator = _.isFunction(value) ? value : function(model) {
- return model.get(value);
- };
- return _.sortedIndex(this.models, model, iterator, context);
- },
-
- // Pluck an attribute from each model in the collection.
- pluck: function(attr) {
- return _.invoke(this.models, 'get', attr);
- },
-
- // Fetch the default set of models for this collection, resetting the
- // collection when they arrive. If `reset: true` is passed, the response
- // data will be passed through the `reset` method instead of `set`.
- fetch: function(options) {
- options = options ? _.clone(options) : {};
- if (options.parse === void 0) options.parse = true;
- var success = options.success;
- var collection = this;
- options.success = function(resp) {
- var method = options.reset ? 'reset' : 'set';
- collection[method](resp, options);
- if (success) success(collection, resp, options);
- collection.trigger('sync', collection, resp, options);
- };
- wrapError(this, options);
- return this.sync('read', this, options);
- },
-
- // Create a new instance of a model in this collection. Add the model to the
- // collection immediately, unless `wait: true` is passed, in which case we
- // wait for the server to agree.
- create: function(model, options) {
- options = options ? _.clone(options) : {};
- if (!(model = this._prepareModel(model, options))) return false;
- if (!options.wait) this.add(model, options);
- var collection = this;
- var success = options.success;
- options.success = function(resp) {
- if (options.wait) collection.add(model, options);
- if (success) success(model, resp, options);
- };
- model.save(null, options);
- return model;
- },
-
- // **parse** converts a response into a list of models to be added to the
- // collection. The default implementation is just to pass it through.
- parse: function(resp, options) {
- return resp;
- },
-
- // Create a new collection with an identical list of models as this one.
- clone: function() {
- return new this.constructor(this.models);
- },
-
- // Private method to reset all internal state. Called when the collection
- // is first initialized or reset.
- _reset: function() {
- this.length = 0;
- this.models = [];
- this._byId = {};
- },
-
- // Prepare a hash of attributes (or other model) to be added to this
- // collection.
- _prepareModel: function(attrs, options) {
- if (attrs instanceof Model) {
- if (!attrs.collection) attrs.collection = this;
- return attrs;
- }
- options || (options = {});
- options.collection = this;
- var model = new this.model(attrs, options);
- if (!model._validate(attrs, options)) {
- this.trigger('invalid', this, attrs, options);
- return false;
- }
- return model;
- },
-
- // Internal method to sever a model's ties to a collection.
- _removeReference: function(model) {
- if (this === model.collection) delete model.collection;
- model.off('all', this._onModelEvent, this);
- },
-
- // Internal method called every time a model in the set fires an event.
- // Sets need to update their indexes when models change ids. All other
- // events simply proxy through. "add" and "remove" events that originate
- // in other collections are ignored.
- _onModelEvent: function(event, model, collection, options) {
- if ((event === 'add' || event === 'remove') && collection !== this) return;
- if (event === 'destroy') this.remove(model, options);
- if (model && event === 'change:' + model.idAttribute) {
- delete this._byId[model.previous(model.idAttribute)];
- if (model.id != null) this._byId[model.id] = model;
- }
- this.trigger.apply(this, arguments);
- }
-
- });
-
- // Underscore methods that we want to implement on the Collection.
- // 90% of the core usefulness of Backbone Collections is actually implemented
- // right here:
- var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
- 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
- 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
- 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
- 'tail', 'drop', 'last', 'without', 'indexOf', 'shuffle', 'lastIndexOf',
- 'isEmpty', 'chain'];
-
- // Mix in each Underscore method as a proxy to `Collection#models`.
- _.each(methods, function(method) {
- Collection.prototype[method] = function() {
- var args = slice.call(arguments);
- args.unshift(this.models);
- return _[method].apply(_, args);
- };
- });
-
- // Underscore methods that take a property name as an argument.
- var attributeMethods = ['groupBy', 'countBy', 'sortBy'];
-
- // Use attributes instead of properties.
- _.each(attributeMethods, function(method) {
- Collection.prototype[method] = function(value, context) {
- var iterator = _.isFunction(value) ? value : function(model) {
- return model.get(value);
- };
- return _[method](this.models, iterator, context);
- };
- });
-
- // Backbone.View
- // -------------
-
- // Backbone Views are almost more convention than they are actual code. A View
- // is simply a JavaScript object that represents a logical chunk of UI in the
- // DOM. This might be a single item, an entire list, a sidebar or panel, or
- // even the surrounding frame which wraps your whole app. Defining a chunk of
- // UI as a **View** allows you to define your DOM events declaratively, without
- // having to worry about render order ... and makes it easy for the view to
- // react to specific changes in the state of your models.
-
- // Creating a Backbone.View creates its initial element outside of the DOM,
- // if an existing element is not provided...
- var View = Backbone.View = function(options) {
- this.cid = _.uniqueId('view');
- this._configure(options || {});
- this._ensureElement();
- this.initialize.apply(this, arguments);
- this.delegateEvents();
- };
-
- // Cached regex to split keys for `delegate`.
- var delegateEventSplitter = /^(\S+)\s*(.*)$/;
-
- // List of view options to be merged as properties.
- var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];
-
- // Set up all inheritable **Backbone.View** properties and methods.
- _.extend(View.prototype, Events, {
-
- // The default `tagName` of a View's element is `"div"`.
- tagName: 'div',
-
- // jQuery delegate for element lookup, scoped to DOM elements within the
- // current view. This should be prefered to global lookups where possible.
- $: function(selector) {
- return this.$el.find(selector);
- },
-
- // Initialize is an empty function by default. Override it with your own
- // initialization logic.
- initialize: function(){},
-
- // **render** is the core function that your view should override, in order
- // to populate its element (`this.el`), with the appropriate HTML. The
- // convention is for **render** to always return `this`.
- render: function() {
- return this;
- },
-
- // Remove this view by taking the element out of the DOM, and removing any
- // applicable Backbone.Events listeners.
- remove: function() {
- this.$el.remove();
- this.stopListening();
- return this;
- },
-
- // Change the view's element (`this.el` property), including event
- // re-delegation.
- setElement: function(element, delegate) {
- if (this.$el) this.undelegateEvents();
- this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);
- this.el = this.$el[0];
- if (delegate !== false) this.delegateEvents();
- return this;
- },
-
- // Set callbacks, where `this.events` is a hash of
- //
- // *{"event selector": "callback"}*
- //
- // {
- // 'mousedown .title': 'edit',
- // 'click .button': 'save'
- // 'click .open': function(e) { ... }
- // }
- //
- // pairs. Callbacks will be bound to the view, with `this` set properly.
- // Uses event delegation for efficiency.
- // Omitting the selector binds the event to `this.el`.
- // This only works for delegate-able events: not `focus`, `blur`, and
- // not `change`, `submit`, and `reset` in Internet Explorer.
- delegateEvents: function(events) {
- if (!(events || (events = _.result(this, 'events')))) return this;
- this.undelegateEvents();
- for (var key in events) {
- var method = events[key];
- if (!_.isFunction(method)) method = this[events[key]];
- if (!method) continue;
-
- var match = key.match(delegateEventSplitter);
- var eventName = match[1], selector = match[2];
- method = _.bind(method, this);
- eventName += '.delegateEvents' + this.cid;
- if (selector === '') {
- this.$el.on(eventName, method);
- } else {
- this.$el.on(eventName, selector, method);
- }
- }
- return this;
- },
-
- // Clears all callbacks previously bound to the view with `delegateEvents`.
- // You usually don't need to use this, but may wish to if you have multiple
- // Backbone views attached to the same DOM element.
- undelegateEvents: function() {
- this.$el.off('.delegateEvents' + this.cid);
- return this;
- },
-
- // Performs the initial configuration of a View with a set of options.
- // Keys with special meaning *(e.g. model, collection, id, className)* are
- // attached directly to the view. See `viewOptions` for an exhaustive
- // list.
- _configure: function(options) {
- if (this.options) options = _.extend({}, _.result(this, 'options'), options);
- _.extend(this, _.pick(options, viewOptions));
- this.options = options;
- },
-
- // Ensure that the View has a DOM element to render into.
- // If `this.el` is a string, pass it through `$()`, take the first
- // matching element, and re-assign it to `el`. Otherwise, create
- // an element from the `id`, `className` and `tagName` properties.
- _ensureElement: function() {
- if (!this.el) {
- var attrs = _.extend({}, _.result(this, 'attributes'));
- if (this.id) attrs.id = _.result(this, 'id');
- if (this.className) attrs['class'] = _.result(this, 'className');
- var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);
- this.setElement($el, false);
- } else {
- this.setElement(_.result(this, 'el'), false);
- }
- }
-
- });
-
- // Backbone.sync
- // -------------
-
- // Override this function to change the manner in which Backbone persists
- // models to the server. You will be passed the type of request, and the
- // model in question. By default, makes a RESTful Ajax request
- // to the model's `url()`. Some possible customizations could be:
- //
- // * Use `setTimeout` to batch rapid-fire updates into a single request.
- // * Send up the models as XML instead of JSON.
- // * Persist models via WebSockets instead of Ajax.
- //
- // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests
- // as `POST`, with a `_method` parameter containing the true HTTP method,
- // as well as all requests with the body as `application/x-www-form-urlencoded`
- // instead of `application/json` with the model in a param named `model`.
- // Useful when interfacing with server-side languages like **PHP** that make
- // it difficult to read the body of `PUT` requests.
- Backbone.sync = function(method, model, options) {
- var type = methodMap[method];
-
- // Default options, unless specified.
- _.defaults(options || (options = {}), {
- emulateHTTP: Backbone.emulateHTTP,
- emulateJSON: Backbone.emulateJSON
- });
-
- // Default JSON-request options.
- var params = {type: type, dataType: 'json'};
-
- // Ensure that we have a URL.
- if (!options.url) {
- params.url = _.result(model, 'url') || urlError();
- }
-
- // Ensure that we have the appropriate request data.
- if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
- params.contentType = 'application/json';
- params.data = JSON.stringify(options.attrs || model.toJSON(options));
- }
-
- // For older servers, emulate JSON by encoding the request into an HTML-form.
- if (options.emulateJSON) {
- params.contentType = 'application/x-www-form-urlencoded';
- params.data = params.data ? {model: params.data} : {};
- }
-
- // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
- // And an `X-HTTP-Method-Override` header.
- if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {
- params.type = 'POST';
- if (options.emulateJSON) params.data._method = type;
- var beforeSend = options.beforeSend;
- options.beforeSend = function(xhr) {
- xhr.setRequestHeader('X-HTTP-Method-Override', type);
- if (beforeSend) return beforeSend.apply(this, arguments);
- };
- }
-
- // Don't process data on a non-GET request.
- if (params.type !== 'GET' && !options.emulateJSON) {
- params.processData = false;
- }
-
- // If we're sending a `PATCH` request, and we're in an old Internet Explorer
- // that still has ActiveX enabled by default, override jQuery to use that
- // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8.
- if (params.type === 'PATCH' && window.ActiveXObject &&
- !(window.external && window.external.msActiveXFilteringEnabled)) {
- params.xhr = function() {
- return new ActiveXObject("Microsoft.XMLHTTP");
- };
- }
-
- // Make the request, allowing the user to override any Ajax options.
- var xhr = options.xhr = Backbone.ajax(_.extend(params, options));
- model.trigger('request', model, xhr, options);
- return xhr;
- };
-
- // Map from CRUD to HTTP for our default `Backbone.sync` implementation.
- var methodMap = {
- 'create': 'POST',
- 'update': 'PUT',
- 'patch': 'PATCH',
- 'delete': 'DELETE',
- 'read': 'GET'
- };
-
- // Set the default implementation of `Backbone.ajax` to proxy through to `$`.
- // Override this if you'd like to use a different library.
- Backbone.ajax = function() {
- return Backbone.$.ajax.apply(Backbone.$, arguments);
- };
-
- // Backbone.Router
- // ---------------
-
- // Routers map faux-URLs to actions, and fire events when routes are
- // matched. Creating a new one sets its `routes` hash, if not set statically.
- var Router = Backbone.Router = function(options) {
- options || (options = {});
- if (options.routes) this.routes = options.routes;
- this._bindRoutes();
- this.initialize.apply(this, arguments);
- };
-
- // Cached regular expressions for matching named param parts and splatted
- // parts of route strings.
- var optionalParam = /\((.*?)\)/g;
- var namedParam = /(\(\?)?:\w+/g;
- var splatParam = /\*\w+/g;
- var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g;
-
- // Set up all inheritable **Backbone.Router** properties and methods.
- _.extend(Router.prototype, Events, {
-
- // Initialize is an empty function by default. Override it with your own
- // initialization logic.
- initialize: function(){},
-
- // Manually bind a single named route to a callback. For example:
- //
- // this.route('search/:query/p:num', 'search', function(query, num) {
- // ...
- // });
- //
- route: function(route, name, callback) {
- if (!_.isRegExp(route)) route = this._routeToRegExp(route);
- if (_.isFunction(name)) {
- callback = name;
- name = '';
- }
- if (!callback) callback = this[name];
- var router = this;
- Backbone.history.route(route, function(fragment) {
- var args = router._extractParameters(route, fragment);
- callback && callback.apply(router, args);
- router.trigger.apply(router, ['route:' + name].concat(args));
- router.trigger('route', name, args);
- Backbone.history.trigger('route', router, name, args);
- });
- return this;
- },
-
- // Simple proxy to `Backbone.history` to save a fragment into the history.
- navigate: function(fragment, options) {
- Backbone.history.navigate(fragment, options);
- return this;
- },
-
- // Bind all defined routes to `Backbone.history`. We have to reverse the
- // order of the routes here to support behavior where the most general
- // routes can be defined at the bottom of the route map.
- _bindRoutes: function() {
- if (!this.routes) return;
- this.routes = _.result(this, 'routes');
- var route, routes = _.keys(this.routes);
- while ((route = routes.pop()) != null) {
- this.route(route, this.routes[route]);
- }
- },
-
- // Convert a route string into a regular expression, suitable for matching
- // against the current location hash.
- _routeToRegExp: function(route) {
- route = route.replace(escapeRegExp, '\\$&')
- .replace(optionalParam, '(?:$1)?')
- .replace(namedParam, function(match, optional){
- return optional ? match : '([^\/]+)';
- })
- .replace(splatParam, '(.*?)');
- return new RegExp('^' + route + '$');
- },
-
- // Given a route, and a URL fragment that it matches, return the array of
- // extracted decoded parameters. Empty or unmatched parameters will be
- // treated as `null` to normalize cross-browser behavior.
- _extractParameters: function(route, fragment) {
- var params = route.exec(fragment).slice(1);
- return _.map(params, function(param) {
- return param ? decodeURIComponent(param) : null;
- });
- }
-
- });
-
- // Backbone.History
- // ----------------
-
- // Handles cross-browser history management, based on either
- // [pushState](http://diveintohtml5.info/history.html) and real URLs, or
- // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)
- // and URL fragments. If the browser supports neither (old IE, natch),
- // falls back to polling.
- var History = Backbone.History = function() {
- this.handlers = [];
- _.bindAll(this, 'checkUrl');
-
- // Ensure that `History` can be used outside of the browser.
- if (typeof window !== 'undefined') {
- this.location = window.location;
- this.history = window.history;
- }
- };
-
- // Cached regex for stripping a leading hash/slash and trailing space.
- var routeStripper = /^[#\/]|\s+$/g;
-
- // Cached regex for stripping leading and trailing slashes.
- var rootStripper = /^\/+|\/+$/g;
-
- // Cached regex for detecting MSIE.
- var isExplorer = /msie [\w.]+/;
-
- // Cached regex for removing a trailing slash.
- var trailingSlash = /\/$/;
-
- // Has the history handling already been started?
- History.started = false;
-
- // Set up all inheritable **Backbone.History** properties and methods.
- _.extend(History.prototype, Events, {
-
- // The default interval to poll for hash changes, if necessary, is
- // twenty times a second.
- interval: 50,
-
- // Gets the true hash value. Cannot use location.hash directly due to bug
- // in Firefox where location.hash will always be decoded.
- getHash: function(window) {
- var match = (window || this).location.href.match(/#(.*)$/);
- return match ? match[1] : '';
- },
-
- // Get the cross-browser normalized URL fragment, either from the URL,
- // the hash, or the override.
- getFragment: function(fragment, forcePushState) {
- if (fragment == null) {
- if (this._hasPushState || !this._wantsHashChange || forcePushState) {
- fragment = this.location.pathname;
- var root = this.root.replace(trailingSlash, '');
- if (!fragment.indexOf(root)) fragment = fragment.substr(root.length);
- } else {
- fragment = this.getHash();
- }
- }
- return fragment.replace(routeStripper, '');
- },
-
- // Start the hash change handling, returning `true` if the current URL matches
- // an existing route, and `false` otherwise.
- start: function(options) {
- if (History.started) throw new Error("Backbone.history has already been started");
- History.started = true;
-
- // Figure out the initial configuration. Do we need an iframe?
- // Is pushState desired ... is it available?
- this.options = _.extend({}, {root: '/'}, this.options, options);
- this.root = this.options.root;
- this._wantsHashChange = this.options.hashChange !== false;
- this._wantsPushState = !!this.options.pushState;
- this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState);
- var fragment = this.getFragment();
- var docMode = document.documentMode;
- var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));
-
- // Normalize root to always include a leading and trailing slash.
- this.root = ('/' + this.root + '/').replace(rootStripper, '/');
-
- if (oldIE && this._wantsHashChange) {
- this.iframe = Backbone.$('').hide().appendTo('body')[0].contentWindow;
- this.navigate(fragment);
- }
-
- // Depending on whether we're using pushState or hashes, and whether
- // 'onhashchange' is supported, determine how we check the URL state.
- if (this._hasPushState) {
- Backbone.$(window).on('popstate', this.checkUrl);
- } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {
- Backbone.$(window).on('hashchange', this.checkUrl);
- } else if (this._wantsHashChange) {
- this._checkUrlInterval = setInterval(this.checkUrl, this.interval);
- }
-
- // Determine if we need to change the base url, for a pushState link
- // opened by a non-pushState browser.
- this.fragment = fragment;
- var loc = this.location;
- var atRoot = loc.pathname.replace(/[^\/]$/, '$&/') === this.root;
-
- // If we've started off with a route from a `pushState`-enabled browser,
- // but we're currently in a browser that doesn't support it...
- if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !atRoot) {
- this.fragment = this.getFragment(null, true);
- this.location.replace(this.root + this.location.search + '#' + this.fragment);
- // Return immediately as browser will do redirect to new url
- return true;
-
- // Or if we've started out with a hash-based route, but we're currently
- // in a browser where it could be `pushState`-based instead...
- } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {
- this.fragment = this.getHash().replace(routeStripper, '');
- this.history.replaceState({}, document.title, this.root + this.fragment + loc.search);
- }
-
- if (!this.options.silent) return this.loadUrl();
- },
-
- // Disable Backbone.history, perhaps temporarily. Not useful in a real app,
- // but possibly useful for unit testing Routers.
- stop: function() {
- Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl);
- clearInterval(this._checkUrlInterval);
- History.started = false;
- },
-
- // Add a route to be tested when the fragment changes. Routes added later
- // may override previous routes.
- route: function(route, callback) {
- this.handlers.unshift({route: route, callback: callback});
- },
-
- // Checks the current URL to see if it has changed, and if it has,
- // calls `loadUrl`, normalizing across the hidden iframe.
- checkUrl: function(e) {
- var current = this.getFragment();
- if (current === this.fragment && this.iframe) {
- current = this.getFragment(this.getHash(this.iframe));
- }
- if (current === this.fragment) return false;
- if (this.iframe) this.navigate(current);
- this.loadUrl() || this.loadUrl(this.getHash());
- },
-
- // Attempt to load the current URL fragment. If a route succeeds with a
- // match, returns `true`. If no defined routes matches the fragment,
- // returns `false`.
- loadUrl: function(fragmentOverride) {
- var fragment = this.fragment = this.getFragment(fragmentOverride);
- var matched = _.any(this.handlers, function(handler) {
- if (handler.route.test(fragment)) {
- handler.callback(fragment);
- return true;
- }
- });
- return matched;
- },
-
- // Save a fragment into the hash history, or replace the URL state if the
- // 'replace' option is passed. You are responsible for properly URL-encoding
- // the fragment in advance.
- //
- // The options object can contain `trigger: true` if you wish to have the
- // route callback be fired (not usually desirable), or `replace: true`, if
- // you wish to modify the current URL without adding an entry to the history.
- navigate: function(fragment, options) {
- if (!History.started) return false;
- if (!options || options === true) options = {trigger: options};
- fragment = this.getFragment(fragment || '');
- if (this.fragment === fragment) return;
- this.fragment = fragment;
- var url = this.root + fragment;
-
- // If pushState is available, we use it to set the fragment as a real URL.
- if (this._hasPushState) {
- this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);
-
- // If hash changes haven't been explicitly disabled, update the hash
- // fragment to store history.
- } else if (this._wantsHashChange) {
- this._updateHash(this.location, fragment, options.replace);
- if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) {
- // Opening and closing the iframe tricks IE7 and earlier to push a
- // history entry on hash-tag change. When replace is true, we don't
- // want this.
- if(!options.replace) this.iframe.document.open().close();
- this._updateHash(this.iframe.location, fragment, options.replace);
- }
-
- // If you've told us that you explicitly don't want fallback hashchange-
- // based history, then `navigate` becomes a page refresh.
- } else {
- return this.location.assign(url);
- }
- if (options.trigger) this.loadUrl(fragment);
- },
-
- // Update the hash location, either replacing the current entry, or adding
- // a new one to the browser history.
- _updateHash: function(location, fragment, replace) {
- if (replace) {
- var href = location.href.replace(/(javascript:|#).*$/, '');
- location.replace(href + '#' + fragment);
- } else {
- // Some browsers require that `hash` contains a leading #.
- location.hash = '#' + fragment;
- }
- }
-
- });
-
- // Create the default Backbone.history.
- Backbone.history = new History;
-
- // Helpers
- // -------
-
- // Helper function to correctly set up the prototype chain, for subclasses.
- // Similar to `goog.inherits`, but uses a hash of prototype properties and
- // class properties to be extended.
- var extend = function(protoProps, staticProps) {
- var parent = this;
- var child;
-
- // The constructor function for the new subclass is either defined by you
- // (the "constructor" property in your `extend` definition), or defaulted
- // by us to simply call the parent's constructor.
- if (protoProps && _.has(protoProps, 'constructor')) {
- child = protoProps.constructor;
- } else {
- child = function(){ return parent.apply(this, arguments); };
- }
-
- // Add static properties to the constructor function, if supplied.
- _.extend(child, parent, staticProps);
-
- // Set the prototype chain to inherit from `parent`, without calling
- // `parent`'s constructor function.
- var Surrogate = function(){ this.constructor = child; };
- Surrogate.prototype = parent.prototype;
- child.prototype = new Surrogate;
-
- // Add prototype properties (instance properties) to the subclass,
- // if supplied.
- if (protoProps) _.extend(child.prototype, protoProps);
-
- // Set a convenience property in case the parent's prototype is needed
- // later.
- child.__super__ = parent.prototype;
-
- return child;
- };
-
- // Set up inheritance for the model, collection, router, view and history.
- Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;
-
- // Throw an error when a URL is needed, and none is supplied.
- var urlError = function() {
- throw new Error('A "url" property or function must be specified');
- };
-
- // Wrap an optional error callback with a fallback error event.
- var wrapError = function (model, options) {
- var error = options.error;
- options.error = function(resp) {
- if (error) error(model, resp, options);
- model.trigger('error', model, resp, options);
- };
- };
-
-}).call(this);
diff --git a/frontend/js/libs/bootstrap/bootstrap-slider.js b/frontend/js/libs/bootstrap/bootstrap-slider.js
deleted file mode 100755
index fe752f529..000000000
--- a/frontend/js/libs/bootstrap/bootstrap-slider.js
+++ /dev/null
@@ -1,388 +0,0 @@
-/* =========================================================
- * bootstrap-slider.js v2.0.0
- * http://www.eyecon.ro/bootstrap-slider
- * =========================================================
- * Copyright 2012 Stefan Petre
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================= */
-
-!function( $ ) {
-
- var Slider = function(element, options) {
- this.element = $(element);
- this.picker = $('
'
-].join( '' );
-
-lm.utils.copy( lm.controls.Header.prototype, {
-
- /**
- * Creates a new tab and associates it with a contentItem
- *
- * @param {lm.item.AbstractContentItem} contentItem
- * @param {Integer} index The position of the tab
- *
- * @returns {void}
- */
- createTab: function( contentItem, index ) {
- var tab, i;
-
- //If there's already a tab relating to the
- //content item, don't do anything
- for( i = 0; i < this.tabs.length; i++ ) {
- if( this.tabs[ i ].contentItem === contentItem ) {
- return;
- }
- }
-
- tab = new lm.controls.Tab( this, contentItem );
-
- if( this.tabs.length === 0 ) {
- this.tabs.push( tab );
- this.tabsContainer.append( tab.element );
- return;
- }
-
- if( index === undefined ) {
- index = this.tabs.length;
- }
-
- if( index > 0 ) {
- this.tabs[ index - 1 ].element.after( tab.element );
- } else {
- this.tabs[ 0 ].element.before( tab.element );
- }
-
- this.tabs.splice( index, 0, tab );
- this._updateTabSizes();
- },
-
- /**
- * Finds a tab based on the contentItem its associated with and removes it.
- *
- * @param {lm.item.AbstractContentItem} contentItem
- *
- * @returns {void}
- */
- removeTab: function( contentItem ) {
- for( var i = 0; i < this.tabs.length; i++ ) {
- if( this.tabs[ i ].contentItem === contentItem ) {
- this.tabs[ i ]._$destroy();
- this.tabs.splice( i, 1 );
- return;
- }
- }
-
- throw new Error( 'contentItem is not controlled by this header' );
- },
-
- /**
- * The programmatical equivalent of clicking a Tab.
- *
- * @param {lm.item.AbstractContentItem} contentItem
- */
- setActiveContentItem: function( contentItem ) {
- var i, j, isActive, activeTab;
-
- for( i = 0; i < this.tabs.length; i++ ) {
- isActive = this.tabs[ i ].contentItem === contentItem;
- this.tabs[ i ].setActive( isActive );
- if( isActive === true ) {
- this.activeContentItem = contentItem;
- this.parent.config.activeItemIndex = i;
- }
- }
-
- if (this.layoutManager.config.settings.reorderOnTabMenuClick) {
- /**
- * If the tab selected was in the dropdown, move everything down one to make way for this one to be the first.
- * This will make sure the most used tabs stay visible.
- */
- if (this._lastVisibleTabIndex !== -1 && this.parent.config.activeItemIndex > this._lastVisibleTabIndex) {
- activeTab = this.tabs[this.parent.config.activeItemIndex];
- for ( j = this.parent.config.activeItemIndex; j > 0; j-- ) {
- this.tabs[j] = this.tabs[j - 1];
- }
- this.tabs[0] = activeTab;
- this.parent.config.activeItemIndex = 0;
- }
- }
-
- this._updateTabSizes();
- this.parent.emitBubblingEvent( 'stateChanged' );
- },
-
- /**
- * Programmatically operate with header position.
- *
- * @param {string} position one of ('top','left','right','bottom') to set or empty to get it.
- *
- * @returns {string} previous header position
- */
- position: function( position ) {
- var previous = this.parent._header.show;
- if( previous && !this.parent._side )
- previous = 'top';
- if( position !== undefined && this.parent._header.show != position ) {
- this.parent._header.show = position;
- this.parent._setupHeaderPosition();
- }
- return previous;
- },
-
- /**
- * Programmatically set closability.
- *
- * @package private
- * @param {Boolean} isClosable Whether to enable/disable closability.
- *
- * @returns {Boolean} Whether the action was successful
- */
- _$setClosable: function( isClosable ) {
- if( this.closeButton && this._isClosable() ) {
- this.closeButton.element[ isClosable ? "show" : "hide" ]();
- return true;
- }
-
- return false;
- },
-
- /**
- * Destroys the entire header
- *
- * @package private
- *
- * @returns {void}
- */
- _$destroy: function() {
- this.emit( 'destroy', this );
-
- for( var i = 0; i < this.tabs.length; i++ ) {
- this.tabs[ i ]._$destroy();
- }
- $( document ).off('mouseup', this.hideAdditionalTabsDropdown);
- this.element.remove();
- },
-
- /**
- * get settings from header
- *
- * @returns {string} when exists
- */
- _getHeaderSetting: function( name ) {
- if( name in this.parent._header )
- return this.parent._header[ name ];
- },
- /**
- * Creates the popout, maximise and close buttons in the header's top right corner
- *
- * @returns {void}
- */
- _createControls: function() {
- var closeStack,
- popout,
- label,
- maximiseLabel,
- minimiseLabel,
- maximise,
- maximiseButton,
- tabDropdownLabel,
- showTabDropdown;
-
- /**
- * Dropdown to show additional tabs.
- */
- showTabDropdown = lm.utils.fnBind( this._showAdditionalTabsDropdown, this );
- tabDropdownLabel = this.layoutManager.config.labels.tabDropdown;
- this.tabDropdownButton = new lm.controls.HeaderButton( this, tabDropdownLabel, 'lm_tabdropdown', showTabDropdown );
- this.tabDropdownButton.element.hide();
-
- /**
- * Popout control to launch component in new window.
- */
- if( this._getHeaderSetting( 'popout' ) ) {
- popout = lm.utils.fnBind( this._onPopoutClick, this );
- label = this._getHeaderSetting( 'popout' );
- new lm.controls.HeaderButton( this, label, 'lm_popout', popout );
- }
-
- /**
- * Maximise control - set the component to the full size of the layout
- */
- if( this._getHeaderSetting( 'maximise' ) ) {
- maximise = lm.utils.fnBind( this.parent.toggleMaximise, this.parent );
- maximiseLabel = this._getHeaderSetting( 'maximise' );
- minimiseLabel = this._getHeaderSetting( 'minimise' );
- maximiseButton = new lm.controls.HeaderButton( this, maximiseLabel, 'lm_maximise', maximise );
-
- this.parent.on( 'maximised', function() {
- maximiseButton.element.attr( 'title', minimiseLabel );
- } );
-
- this.parent.on( 'minimised', function() {
- maximiseButton.element.attr( 'title', maximiseLabel );
- } );
- }
-
- /**
- * Close button
- */
- if( this._isClosable() ) {
- closeStack = lm.utils.fnBind( this.parent.remove, this.parent );
- label = this._getHeaderSetting( 'close' );
- this.closeButton = new lm.controls.HeaderButton( this, label, 'lm_close', closeStack );
- }
- },
-
- /**
- * Shows drop down for additional tabs when there are too many to display.
- *
- * @returns {void}
- */
- _showAdditionalTabsDropdown: function() {
- this.tabDropdownContainer.show();
- },
-
- /**
- * Hides drop down for additional tabs when there are too many to display.
- *
- * @returns {void}
- */
- _hideAdditionalTabsDropdown: function( e ) {
- this.tabDropdownContainer.hide();
- },
-
- /**
- * Checks whether the header is closable based on the parent config and
- * the global config.
- *
- * @returns {Boolean} Whether the header is closable.
- */
- _isClosable: function() {
- return this.parent.config.isClosable && this.layoutManager.config.settings.showCloseIcon;
- },
-
- _onPopoutClick: function() {
- if( this.layoutManager.config.settings.popoutWholeStack === true ) {
- this.parent.popout();
- } else {
- this.activeContentItem.popout();
- }
- },
-
-
- /**
- * Invoked when the header's background is clicked (not it's tabs or controls)
- *
- * @param {jQuery DOM event} event
- *
- * @returns {void}
- */
- _onHeaderClick: function( event ) {
- if( event.target === this.element[ 0 ] ) {
- this.parent.select();
- }
- },
-
- /**
- * Pushes the tabs to the tab dropdown if the available space is not sufficient
- *
- * @returns {void}
- */
- _updateTabSizes: function(showTabMenu) {
- if( this.tabs.length === 0 ) {
- return;
- }
-
- //Show the menu based on function argument
- this.tabDropdownButton.element.toggle(showTabMenu === true);
-
- var size = function( val ) {
- return val ? 'width' : 'height';
- };
- this.element.css( size( !this.parent._sided ), '' );
- this.element[ size( this.parent._sided ) ]( this.layoutManager.config.dimensions.headerHeight );
- var availableWidth = this.element.outerWidth() - this.controlsContainer.outerWidth() - this._tabControlOffset,
- cumulativeTabWidth = 0,
- visibleTabWidth = 0,
- tabElement,
- i,
- j,
- marginLeft,
- overlap = 0,
- tabWidth,
- tabOverlapAllowance = this.layoutManager.config.settings.tabOverlapAllowance,
- tabOverlapAllowanceExceeded = false,
- activeIndex = (this.activeContentItem ? this.tabs.indexOf(this.activeContentItem.tab) : 0),
- activeTab = this.tabs[activeIndex];
- if( this.parent._sided )
- availableWidth = this.element.outerHeight() - this.controlsContainer.outerHeight() - this._tabControlOffset;
- this._lastVisibleTabIndex = -1;
-
- for( i = 0; i < this.tabs.length; i++ ) {
- tabElement = this.tabs[ i ].element;
-
- //Put the tab in the tabContainer so its true width can be checked
- this.tabsContainer.append( tabElement );
- tabWidth = tabElement.outerWidth() + parseInt( tabElement.css( 'margin-right' ), 10 );
-
- cumulativeTabWidth += tabWidth;
-
- //Include the active tab's width if it isn't already
- //This is to ensure there is room to show the active tab
- if (activeIndex <= i) {
- visibleTabWidth = cumulativeTabWidth;
- } else {
- visibleTabWidth = cumulativeTabWidth + activeTab.element.outerWidth() + parseInt(activeTab.element.css('margin-right'), 10);
- }
-
- // If the tabs won't fit, check the overlap allowance.
- if( visibleTabWidth > availableWidth ) {
-
- //Once allowance is exceeded, all remaining tabs go to menu.
- if (!tabOverlapAllowanceExceeded) {
-
- //No overlap for first tab or active tab
- //Overlap spreads among non-active, non-first tabs
- if (activeIndex > 0 && activeIndex <= i) {
- overlap = ( visibleTabWidth - availableWidth ) / (i - 1);
- } else {
- overlap = ( visibleTabWidth - availableWidth ) / i;
- }
-
- //Check overlap against allowance.
- if (overlap < tabOverlapAllowance) {
- for ( j = 0; j <= i; j++ ) {
- marginLeft = (j !== activeIndex && j !== 0) ? '-' + overlap + 'px' : '';
- this.tabs[j].element.css({'z-index': i - j, 'margin-left': marginLeft});
- }
- this._lastVisibleTabIndex = i;
- this.tabsContainer.append(tabElement);
- } else {
- tabOverlapAllowanceExceeded = true;
- }
-
- } else if (i === activeIndex) {
- //Active tab should show even if allowance exceeded. (We left room.)
- tabElement.css({'z-index': 'auto', 'margin-left': ''});
- this.tabsContainer.append(tabElement);
- }
-
- if (tabOverlapAllowanceExceeded && i !== activeIndex) {
- if (showTabMenu) {
- //Tab menu already shown, so we just add to it.
- tabElement.css({'z-index': 'auto', 'margin-left': ''});
- this.tabDropdownContainer.append(tabElement);
- } else {
- //We now know the tab menu must be shown, so we have to recalculate everything.
- this._updateTabSizes(true);
- return;
- }
- }
-
- }
- else {
- this._lastVisibleTabIndex = i;
- tabElement.css({'z-index': 'auto', 'margin-left': ''});
- this.tabsContainer.append( tabElement );
- }
- }
-
- }
-} );
-
-
-lm.controls.HeaderButton = function( header, label, cssClass, action ) {
- this._header = header;
- this.element = $( '' );
- this._header.on( 'destroy', this._$destroy, this );
- this._action = action;
- this.element.on( 'click touchstart', this._action );
- this._header.controlsContainer.append( this.element );
-};
-
-lm.utils.copy( lm.controls.HeaderButton.prototype, {
- _$destroy: function() {
- this.element.off();
- this.element.remove();
- }
-} );
-lm.controls.Splitter = function( isVertical, size, grabSize ) {
- this._isVertical = isVertical;
- this._size = size;
- this._grabSize = grabSize < size ? size : grabSize;
-
- this.element = this._createElement();
- this._dragListener = new lm.utils.DragListener( this.element );
-};
-
-lm.utils.copy( lm.controls.Splitter.prototype, {
- on: function( event, callback, context ) {
- this._dragListener.on( event, callback, context );
- },
-
- _$destroy: function() {
- this.element.remove();
- },
-
- _createElement: function() {
- var dragHandle = $( '' );
- var element = $( '' );
- element.append(dragHandle);
-
- var handleExcessSize = this._grabSize - this._size;
- var handleExcessPos = handleExcessSize / 2;
-
- if( this._isVertical ) {
- dragHandle.css( 'top', -handleExcessPos );
- dragHandle.css( 'height', this._size + handleExcessSize );
- element.addClass( 'lm_vertical' );
- element[ 'height' ]( this._size );
- } else {
- dragHandle.css( 'left', -handleExcessPos );
- dragHandle.css( 'width', this._size + handleExcessSize );
- element.addClass( 'lm_horizontal' );
- element[ 'width' ]( this._size );
- }
-
- return element;
- }
-} );
-
-/**
- * Represents an individual tab within a Stack's header
- *
- * @param {lm.controls.Header} header
- * @param {lm.items.AbstractContentItem} contentItem
- *
- * @constructor
- */
-lm.controls.Tab = function( header, contentItem ) {
- this.header = header;
- this.contentItem = contentItem;
- this.element = $( lm.controls.Tab._template );
- this.titleElement = this.element.find( '.lm_title' );
- this.closeElement = this.element.find( '.lm_close_tab' );
- this.closeElement[ contentItem.config.isClosable ? 'show' : 'hide' ]();
- this.isActive = false;
-
- this.setTitle( contentItem.config.title );
- this.contentItem.on( 'titleChanged', this.setTitle, this );
-
- this._layoutManager = this.contentItem.layoutManager;
-
- if(
- this._layoutManager.config.settings.reorderEnabled === true &&
- contentItem.config.reorderEnabled === true
- ) {
- this._dragListener = new lm.utils.DragListener( this.element );
- this._dragListener.on( 'dragStart', this._onDragStart, this );
- this.contentItem.on( 'destroy', this._dragListener.destroy, this._dragListener );
- }
-
- this._onTabClickFn = lm.utils.fnBind( this._onTabClick, this );
- this._onCloseClickFn = lm.utils.fnBind( this._onCloseClick, this );
-
- this.element.on( 'mousedown touchstart', this._onTabClickFn );
-
- if( this.contentItem.config.isClosable ) {
- this.closeElement.on( 'click touchstart', this._onCloseClickFn );
- this.closeElement.on('mousedown', this._onCloseMousedown);
- } else {
- this.closeElement.remove();
- }
-
- this.contentItem.tab = this;
- this.contentItem.emit( 'tab', this );
- this.contentItem.layoutManager.emit( 'tabCreated', this );
-
- if( this.contentItem.isComponent ) {
- this.contentItem.container.tab = this;
- this.contentItem.container.emit( 'tab', this );
- }
-};
-
-/**
- * The tab's html template
- *
- * @type {String}
- */
-lm.controls.Tab._template = '
' +
- '' +
- '
';
-
-lm.utils.copy( lm.controls.Tab.prototype, {
-
- /**
- * Sets the tab's title to the provided string and sets
- * its title attribute to a pure text representation (without
- * html tags) of the same string.
- *
- * @public
- * @param {String} title can contain html
- */
- setTitle: function( title ) {
- this.element.attr( 'title', lm.utils.stripTags( title ) );
- this.titleElement.html( title );
- },
-
- /**
- * Sets this tab's active state. To programmatically
- * switch tabs, use header.setActiveContentItem( item ) instead.
- *
- * @public
- * @param {Boolean} isActive
- */
- setActive: function( isActive ) {
- if( isActive === this.isActive ) {
- return;
- }
- this.isActive = isActive;
-
- if( isActive ) {
- this.element.addClass( 'lm_active' );
- } else {
- this.element.removeClass( 'lm_active' );
- }
- },
-
- /**
- * Destroys the tab
- *
- * @private
- * @returns {void}
- */
- _$destroy: function() {
- this.element.off( 'mousedown touchstart', this._onTabClickFn );
- this.closeElement.off( 'click touchstart', this._onCloseClickFn );
- if( this._dragListener ) {
- this.contentItem.off( 'destroy', this._dragListener.destroy, this._dragListener );
- this._dragListener.off( 'dragStart', this._onDragStart );
- this._dragListener = null;
- }
- this.element.remove();
- },
-
- /**
- * Callback for the DragListener
- *
- * @param {Number} x The tabs absolute x position
- * @param {Number} y The tabs absolute y position
- *
- * @private
- * @returns {void}
- */
- _onDragStart: function( x, y ) {
- if( this.contentItem.parent.isMaximised === true ) {
- this.contentItem.parent.toggleMaximise();
- }
- new lm.controls.DragProxy(
- x,
- y,
- this._dragListener,
- this._layoutManager,
- this.contentItem,
- this.header.parent
- );
- },
-
- /**
- * Callback when the tab is clicked
- *
- * @param {jQuery DOM event} event
- *
- * @private
- * @returns {void}
- */
- _onTabClick: function( event ) {
- // left mouse button or tap
- if( event.button === 0 || event.type === 'touchstart' ) {
- var activeContentItem = this.header.parent.getActiveContentItem();
- if( this.contentItem !== activeContentItem ) {
- this.header.parent.setActiveContentItem( this.contentItem );
- }
-
- // middle mouse button
- } else if( event.button === 1 && this.contentItem.config.isClosable ) {
- this._onCloseClick( event );
- }
- },
-
- /**
- * Callback when the tab's close button is
- * clicked
- *
- * @param {jQuery DOM event} event
- *
- * @private
- * @returns {void}
- */
- _onCloseClick: function( event ) {
- event.stopPropagation();
- this.header.parent.removeChild( this.contentItem );
- },
-
-
- /**
- * Callback to capture tab close button mousedown
- * to prevent tab from activating.
- *
- * @param (jQuery DOM event) event
- *
- * @private
- * @returns {void}
- */
- _onCloseMousedown: function(event) {
- event.stopPropagation();
- }
-} );
-
-lm.controls.TransitionIndicator = function() {
- this._element = $( '' );
- $( document.body ).append( this._element );
-
- this._toElement = null;
- this._fromDimensions = null;
- this._totalAnimationDuration = 200;
- this._animationStartTime = null;
-};
-
-lm.utils.copy( lm.controls.TransitionIndicator.prototype, {
- destroy: function() {
- this._element.remove();
- },
-
- transitionElements: function( fromElement, toElement ) {
- /**
- * TODO - This is not quite as cool as expected. Review.
- */
- return;
- this._toElement = toElement;
- this._animationStartTime = lm.utils.now();
- this._fromDimensions = this._measure( fromElement );
- this._fromDimensions.opacity = 0.8;
- this._element.show().css( this._fromDimensions );
- lm.utils.animFrame( lm.utils.fnBind( this._nextAnimationFrame, this ) );
- },
-
- _nextAnimationFrame: function() {
- var toDimensions = this._measure( this._toElement ),
- animationProgress = ( lm.utils.now() - this._animationStartTime ) / this._totalAnimationDuration,
- currentFrameStyles = {},
- cssProperty;
-
- if( animationProgress >= 1 ) {
- this._element.hide();
- return;
- }
-
- toDimensions.opacity = 0;
-
- for( cssProperty in this._fromDimensions ) {
- currentFrameStyles[ cssProperty ] = this._fromDimensions[ cssProperty ] +
- ( toDimensions[ cssProperty ] - this._fromDimensions[ cssProperty ] ) *
- animationProgress;
- }
-
- this._element.css( currentFrameStyles );
- lm.utils.animFrame( lm.utils.fnBind( this._nextAnimationFrame, this ) );
- },
-
- _measure: function( element ) {
- var offset = element.offset();
-
- return {
- left: offset.left,
- top: offset.top,
- width: element.outerWidth(),
- height: element.outerHeight()
- };
- }
-} );
-lm.errors.ConfigurationError = function( message, node ) {
- Error.call( this );
-
- this.name = 'Configuration Error';
- this.message = message;
- this.node = node;
-};
-
-lm.errors.ConfigurationError.prototype = new Error();
-
-/**
- * This is the baseclass that all content items inherit from.
- * Most methods provide a subset of what the sub-classes do.
- *
- * It also provides a number of functions for tree traversal
- *
- * @param {lm.LayoutManager} layoutManager
- * @param {item node configuration} config
- * @param {lm.item} parent
- *
- * @event stateChanged
- * @event beforeItemDestroyed
- * @event itemDestroyed
- * @event itemCreated
- * @event componentCreated
- * @event rowCreated
- * @event columnCreated
- * @event stackCreated
- *
- * @constructor
- */
-lm.items.AbstractContentItem = function( layoutManager, config, parent ) {
- lm.utils.EventEmitter.call( this );
-
- this.config = this._extendItemNode( config );
- this.type = config.type;
- this.contentItems = [];
- this.parent = parent;
-
- this.isInitialised = false;
- this.isMaximised = false;
- this.isRoot = false;
- this.isRow = false;
- this.isColumn = false;
- this.isStack = false;
- this.isComponent = false;
-
- this.layoutManager = layoutManager;
- this._pendingEventPropagations = {};
- this._throttledEvents = [ 'stateChanged' ];
-
- this.on( lm.utils.EventEmitter.ALL_EVENT, this._propagateEvent, this );
-
- if( config.content ) {
- this._createContentItems( config );
- }
-};
-
-lm.utils.copy( lm.items.AbstractContentItem.prototype, {
-
- /**
- * Set the size of the component and its children, called recursively
- *
- * @abstract
- * @returns void
- */
- setSize: function() {
- throw new Error( 'Abstract Method' );
- },
-
- /**
- * Calls a method recursively downwards on the tree
- *
- * @param {String} functionName the name of the function to be called
- * @param {[Array]}functionArguments optional arguments that are passed to every function
- * @param {[bool]} bottomUp Call methods from bottom to top, defaults to false
- * @param {[bool]} skipSelf Don't invoke the method on the class that calls it, defaults to false
- *
- * @returns {void}
- */
- callDownwards: function( functionName, functionArguments, bottomUp, skipSelf ) {
- var i;
-
- if( bottomUp !== true && skipSelf !== true ) {
- this[ functionName ].apply( this, functionArguments || [] );
- }
- for( i = 0; i < this.contentItems.length; i++ ) {
- this.contentItems[ i ].callDownwards( functionName, functionArguments, bottomUp );
- }
- if( bottomUp === true && skipSelf !== true ) {
- this[ functionName ].apply( this, functionArguments || [] );
- }
- },
-
- /**
- * Removes a child node (and its children) from the tree
- *
- * @param {lm.items.ContentItem} contentItem
- *
- * @returns {void}
- */
- removeChild: function( contentItem, keepChild ) {
-
- /*
- * Get the position of the item that's to be removed within all content items this node contains
- */
- var index = lm.utils.indexOf( contentItem, this.contentItems );
-
- /*
- * Make sure the content item to be removed is actually a child of this item
- */
- if( index === -1 ) {
- throw new Error( 'Can\'t remove child item. Unknown content item' );
- }
-
- /**
- * Call ._$destroy on the content item. This also calls ._$destroy on all its children
- */
- if( keepChild !== true ) {
- this.contentItems[ index ]._$destroy();
- }
-
- /**
- * Remove the content item from this nodes array of children
- */
- this.contentItems.splice( index, 1 );
-
- /**
- * Remove the item from the configuration
- */
- this.config.content.splice( index, 1 );
-
- /**
- * If this node still contains other content items, adjust their size
- */
- if( this.contentItems.length > 0 ) {
- this.callDownwards( 'setSize' );
-
- /**
- * If this was the last content item, remove this node as well
- */
- } else if( !(this instanceof lm.items.Root) && this.config.isClosable === true ) {
- this.parent.removeChild( this );
- }
- },
-
- /**
- * Sets up the tree structure for the newly added child
- * The responsibility for the actual DOM manipulations lies
- * with the concrete item
- *
- * @param {lm.items.AbstractContentItem} contentItem
- * @param {[Int]} index If omitted item will be appended
- */
- addChild: function( contentItem, index ) {
- if( index === undefined ) {
- index = this.contentItems.length;
- }
-
- this.contentItems.splice( index, 0, contentItem );
-
- if( this.config.content === undefined ) {
- this.config.content = [];
- }
-
- this.config.content.splice( index, 0, contentItem.config );
- contentItem.parent = this;
-
- if( contentItem.parent.isInitialised === true && contentItem.isInitialised === false ) {
- contentItem._$init();
- }
- },
-
- /**
- * Replaces oldChild with newChild. This used to use jQuery.replaceWith... which for
- * some reason removes all event listeners, so isn't really an option.
- *
- * @param {lm.item.AbstractContentItem} oldChild
- * @param {lm.item.AbstractContentItem} newChild
- *
- * @returns {void}
- */
- replaceChild: function( oldChild, newChild, _$destroyOldChild ) {
-
- newChild = this.layoutManager._$normalizeContentItem( newChild );
-
- var index = lm.utils.indexOf( oldChild, this.contentItems ),
- parentNode = oldChild.element[ 0 ].parentNode;
-
- if( index === -1 ) {
- throw new Error( 'Can\'t replace child. oldChild is not child of this' );
- }
-
- parentNode.replaceChild( newChild.element[ 0 ], oldChild.element[ 0 ] );
-
- /*
- * Optionally destroy the old content item
- */
- if( _$destroyOldChild === true ) {
- oldChild.parent = null;
- oldChild._$destroy();
- }
-
- /*
- * Wire the new contentItem into the tree
- */
- this.contentItems[ index ] = newChild;
- newChild.parent = this;
-
- /*
- * Update tab reference
- */
- if( this.isStack ) {
- this.header.tabs[ index ].contentItem = newChild;
- }
-
- //TODO This doesn't update the config... refactor to leave item nodes untouched after creation
- if( newChild.parent.isInitialised === true && newChild.isInitialised === false ) {
- newChild._$init();
- }
-
- this.callDownwards( 'setSize' );
- },
-
- /**
- * Convenience method.
- * Shorthand for this.parent.removeChild( this )
- *
- * @returns {void}
- */
- remove: function() {
- this.parent.removeChild( this );
- },
-
- /**
- * Removes the component from the layout and creates a new
- * browser window with the component and its children inside
- *
- * @returns {lm.controls.BrowserPopout}
- */
- popout: function() {
- var browserPopout = this.layoutManager.createPopout( this );
- this.emitBubblingEvent( 'stateChanged' );
- return browserPopout;
- },
-
- /**
- * Maximises the Item or minimises it if it is already maximised
- *
- * @returns {void}
- */
- toggleMaximise: function( e ) {
- e && e.preventDefault();
- if( this.isMaximised === true ) {
- this.layoutManager._$minimiseItem( this );
- } else {
- this.layoutManager._$maximiseItem( this );
- }
-
- this.isMaximised = !this.isMaximised;
- this.emitBubblingEvent( 'stateChanged' );
- },
-
- /**
- * Selects the item if it is not already selected
- *
- * @returns {void}
- */
- select: function() {
- if( this.layoutManager.selectedItem !== this ) {
- this.layoutManager.selectItem( this, true );
- this.element.addClass( 'lm_selected' );
- }
- },
-
- /**
- * De-selects the item if it is selected
- *
- * @returns {void}
- */
- deselect: function() {
- if( this.layoutManager.selectedItem === this ) {
- this.layoutManager.selectedItem = null;
- this.element.removeClass( 'lm_selected' );
- }
- },
-
- /**
- * Set this component's title
- *
- * @public
- * @param {String} title
- *
- * @returns {void}
- */
- setTitle: function( title ) {
- this.config.title = title;
- this.emit( 'titleChanged', title );
- this.emit( 'stateChanged' );
- },
-
- /**
- * Checks whether a provided id is present
- *
- * @public
- * @param {String} id
- *
- * @returns {Boolean} isPresent
- */
- hasId: function( id ) {
- if( !this.config.id ) {
- return false;
- } else if( typeof this.config.id === 'string' ) {
- return this.config.id === id;
- } else if( this.config.id instanceof Array ) {
- return lm.utils.indexOf( id, this.config.id ) !== -1;
- }
- },
-
- /**
- * Adds an id. Adds it as a string if the component doesn't
- * have an id yet or creates/uses an array
- *
- * @public
- * @param {String} id
- *
- * @returns {void}
- */
- addId: function( id ) {
- if( this.hasId( id ) ) {
- return;
- }
-
- if( !this.config.id ) {
- this.config.id = id;
- } else if( typeof this.config.id === 'string' ) {
- this.config.id = [ this.config.id, id ];
- } else if( this.config.id instanceof Array ) {
- this.config.id.push( id );
- }
- },
-
- /**
- * Removes an existing id. Throws an error
- * if the id is not present
- *
- * @public
- * @param {String} id
- *
- * @returns {void}
- */
- removeId: function( id ) {
- if( !this.hasId( id ) ) {
- throw new Error( 'Id not found' );
- }
-
- if( typeof this.config.id === 'string' ) {
- delete this.config.id;
- } else if( this.config.id instanceof Array ) {
- var index = lm.utils.indexOf( id, this.config.id );
- this.config.id.splice( index, 1 );
- }
- },
-
- /****************************************
- * SELECTOR
- ****************************************/
- getItemsByFilter: function( filter ) {
- var result = [],
- next = function( contentItem ) {
- for( var i = 0; i < contentItem.contentItems.length; i++ ) {
-
- if( filter( contentItem.contentItems[ i ] ) === true ) {
- result.push( contentItem.contentItems[ i ] );
- }
-
- next( contentItem.contentItems[ i ] );
- }
- };
-
- next( this );
- return result;
- },
-
- getItemsById: function( id ) {
- return this.getItemsByFilter( function( item ) {
- if( item.config.id instanceof Array ) {
- return lm.utils.indexOf( id, item.config.id ) !== -1;
- } else {
- return item.config.id === id;
- }
- } );
- },
-
- getItemsByType: function( type ) {
- return this._$getItemsByProperty( 'type', type );
- },
-
- getComponentsByName: function( componentName ) {
- var components = this._$getItemsByProperty( 'componentName', componentName ),
- instances = [],
- i;
-
- for( i = 0; i < components.length; i++ ) {
- instances.push( components[ i ].instance );
- }
-
- return instances;
- },
-
- /****************************************
- * PACKAGE PRIVATE
- ****************************************/
- _$getItemsByProperty: function( key, value ) {
- return this.getItemsByFilter( function( item ) {
- return item[ key ] === value;
- } );
- },
-
- _$setParent: function( parent ) {
- this.parent = parent;
- },
-
- _$highlightDropZone: function( x, y, area ) {
- this.layoutManager.dropTargetIndicator.highlightArea( area );
- },
-
- _$onDrop: function( contentItem ) {
- this.addChild( contentItem );
- },
-
- _$hide: function() {
- this._callOnActiveComponents( 'hide' );
- this.element.hide();
- this.layoutManager.updateSize();
- },
-
- _$show: function() {
- this._callOnActiveComponents( 'show' );
- this.element.show();
- this.layoutManager.updateSize();
- },
-
- _callOnActiveComponents: function( methodName ) {
- var stacks = this.getItemsByType( 'stack' ),
- activeContentItem,
- i;
-
- for( i = 0; i < stacks.length; i++ ) {
- activeContentItem = stacks[ i ].getActiveContentItem();
-
- if( activeContentItem && activeContentItem.isComponent ) {
- activeContentItem.container[ methodName ]();
- }
- }
- },
-
- /**
- * Destroys this item ands its children
- *
- * @returns {void}
- */
- _$destroy: function() {
- this.emitBubblingEvent( 'beforeItemDestroyed' );
- this.callDownwards( '_$destroy', [], true, true );
- this.element.remove();
- this.emitBubblingEvent( 'itemDestroyed' );
- },
-
- /**
- * Returns the area the component currently occupies in the format
- *
- * {
- * x1: int
- * xy: int
- * y1: int
- * y2: int
- * contentItem: contentItem
- * }
- */
- _$getArea: function( element ) {
- element = element || this.element;
-
- var offset = element.offset(),
- width = element.width(),
- height = element.height();
-
- return {
- x1: offset.left,
- y1: offset.top,
- x2: offset.left + width,
- y2: offset.top + height,
- surface: width * height,
- contentItem: this
- };
- },
-
- /**
- * The tree of content items is created in two steps: First all content items are instantiated,
- * then init is called recursively from top to bottem. This is the basic init function,
- * it can be used, extended or overwritten by the content items
- *
- * Its behaviour depends on the content item
- *
- * @package private
- *
- * @returns {void}
- */
- _$init: function() {
- var i;
- this.setSize();
-
- for( i = 0; i < this.contentItems.length; i++ ) {
- this.childElementContainer.append( this.contentItems[ i ].element );
- }
-
- this.isInitialised = true;
- this.emitBubblingEvent( 'itemCreated' );
- this.emitBubblingEvent( this.type + 'Created' );
- },
-
- /**
- * Emit an event that bubbles up the item tree.
- *
- * @param {String} name The name of the event
- *
- * @returns {void}
- */
- emitBubblingEvent: function( name ) {
- var event = new lm.utils.BubblingEvent( name, this );
- this.emit( name, event );
- },
-
- /**
- * Private method, creates all content items for this node at initialisation time
- * PLEASE NOTE, please see addChild for adding contentItems add runtime
- * @private
- * @param {configuration item node} config
- *
- * @returns {void}
- */
- _createContentItems: function( config ) {
- var oContentItem, i;
-
- if( !( config.content instanceof Array ) ) {
- throw new lm.errors.ConfigurationError( 'content must be an Array', config );
- }
-
- for( i = 0; i < config.content.length; i++ ) {
- oContentItem = this.layoutManager.createContentItem( config.content[ i ], this );
- this.contentItems.push( oContentItem );
- }
- },
-
- /**
- * Extends an item configuration node with default settings
- * @private
- * @param {configuration item node} config
- *
- * @returns {configuration item node} extended config
- */
- _extendItemNode: function( config ) {
-
- for( var key in lm.config.itemDefaultConfig ) {
- if( config[ key ] === undefined ) {
- config[ key ] = lm.config.itemDefaultConfig[ key ];
- }
- }
-
- return config;
- },
-
- /**
- * Called for every event on the item tree. Decides whether the event is a bubbling
- * event and propagates it to its parent
- *
- * @param {String} name the name of the event
- * @param {lm.utils.BubblingEvent} event
- *
- * @returns {void}
- */
- _propagateEvent: function( name, event ) {
- if( event instanceof lm.utils.BubblingEvent &&
- event.isPropagationStopped === false &&
- this.isInitialised === true ) {
-
- /**
- * In some cases (e.g. if an element is created from a DragSource) it
- * doesn't have a parent and is not below root. If that's the case
- * propagate the bubbling event from the top level of the substree directly
- * to the layoutManager
- */
- if( this.isRoot === false && this.parent ) {
- this.parent.emit.apply( this.parent, Array.prototype.slice.call( arguments, 0 ) );
- } else {
- this._scheduleEventPropagationToLayoutManager( name, event );
- }
- }
- },
-
- /**
- * All raw events bubble up to the root element. Some events that
- * are propagated to - and emitted by - the layoutManager however are
- * only string-based, batched and sanitized to make them more usable
- *
- * @param {String} name the name of the event
- *
- * @private
- * @returns {void}
- */
- _scheduleEventPropagationToLayoutManager: function( name, event ) {
- if( lm.utils.indexOf( name, this._throttledEvents ) === -1 ) {
- this.layoutManager.emit( name, event.origin );
- } else {
- if( this._pendingEventPropagations[ name ] !== true ) {
- this._pendingEventPropagations[ name ] = true;
- lm.utils.animFrame( lm.utils.fnBind( this._propagateEventToLayoutManager, this, [ name, event ] ) );
- }
- }
-
- },
-
- /**
- * Callback for events scheduled by _scheduleEventPropagationToLayoutManager
- *
- * @param {String} name the name of the event
- *
- * @private
- * @returns {void}
- */
- _propagateEventToLayoutManager: function( name, event ) {
- this._pendingEventPropagations[ name ] = false;
- this.layoutManager.emit( name, event );
- }
-} );
-
-/**
- * @param {[type]} layoutManager [description]
- * @param {[type]} config [description]
- * @param {[type]} parent [description]
- */
-lm.items.Component = function( layoutManager, config, parent ) {
- lm.items.AbstractContentItem.call( this, layoutManager, config, parent );
-
- var ComponentConstructor = layoutManager.getComponent( this.config.componentName ),
- componentConfig = $.extend( true, {}, this.config.componentState || {} );
-
- componentConfig.componentName = this.config.componentName;
- this.componentName = this.config.componentName;
-
- if( this.config.title === '' ) {
- this.config.title = this.config.componentName;
- }
-
- this.isComponent = true;
- this.container = new lm.container.ItemContainer( this.config, this, layoutManager );
- this.instance = new ComponentConstructor( this.container, componentConfig );
- this.element = this.container._element;
-};
-
-lm.utils.extend( lm.items.Component, lm.items.AbstractContentItem );
-
-lm.utils.copy( lm.items.Component.prototype, {
-
- close: function() {
- this.parent.removeChild( this );
- },
-
- setSize: function() {
- if( this.element.is( ':visible' ) ) {
- // Do not update size of hidden components to prevent unwanted reflows
- this.container._$setSize( this.element.width(), this.element.height() );
- }
- },
-
- _$init: function() {
- lm.items.AbstractContentItem.prototype._$init.call( this );
- this.container.emit( 'open' );
- },
-
- _$hide: function() {
- this.container.hide();
- lm.items.AbstractContentItem.prototype._$hide.call( this );
- },
-
- _$show: function() {
- this.container.show();
- lm.items.AbstractContentItem.prototype._$show.call( this );
- },
-
- _$shown: function() {
- this.container.shown();
- lm.items.AbstractContentItem.prototype._$shown.call( this );
- },
-
- _$destroy: function() {
- this.container.emit( 'destroy', this );
- lm.items.AbstractContentItem.prototype._$destroy.call( this );
- },
-
- /**
- * Dragging onto a component directly is not an option
- *
- * @returns null
- */
- _$getArea: function() {
- return null;
- }
-} );
-
-lm.items.Root = function( layoutManager, config, containerElement ) {
- lm.items.AbstractContentItem.call( this, layoutManager, config, null );
- this.isRoot = true;
- this.type = 'root';
- this.element = $( '' );
- this.childElementContainer = this.element;
- this._containerElement = containerElement;
- this._containerElement.append( this.element );
-};
-
-lm.utils.extend( lm.items.Root, lm.items.AbstractContentItem );
-
-lm.utils.copy( lm.items.Root.prototype, {
- addChild: function( contentItem ) {
- if( this.contentItems.length > 0 ) {
- throw new Error( 'Root node can only have a single child' );
- }
-
- contentItem = this.layoutManager._$normalizeContentItem( contentItem, this );
- this.childElementContainer.append( contentItem.element );
- lm.items.AbstractContentItem.prototype.addChild.call( this, contentItem );
-
- this.callDownwards( 'setSize' );
- this.emitBubblingEvent( 'stateChanged' );
- },
-
- setSize: function( width, height ) {
- width = (typeof width === 'undefined') ? this._containerElement.width() : width;
- height = (typeof height === 'undefined') ? this._containerElement.height() : height;
-
- this.element.width( width );
- this.element.height( height );
-
- /*
- * Root can be empty
- */
- if( this.contentItems[ 0 ] ) {
- this.contentItems[ 0 ].element.width( width );
- this.contentItems[ 0 ].element.height( height );
- }
- },
- _$highlightDropZone: function( x, y, area ) {
- this.layoutManager.tabDropPlaceholder.remove();
- lm.items.AbstractContentItem.prototype._$highlightDropZone.apply( this, arguments );
- },
-
- _$onDrop: function( contentItem, area ) {
- var stack;
-
- if( contentItem.isComponent ) {
- stack = this.layoutManager.createContentItem( {
- type: 'stack',
- header: contentItem.config.header || {}
- }, this );
- stack._$init();
- stack.addChild( contentItem );
- contentItem = stack;
- }
-
- if( !this.contentItems.length ) {
- this.addChild( contentItem );
- } else {
- var type = area.side[ 0 ] == 'x' ? 'row' : 'column';
- var dimension = area.side[ 0 ] == 'x' ? 'width' : 'height';
- var insertBefore = area.side[ 1 ] == '2';
- var column = this.contentItems[ 0 ];
- if( !column instanceof lm.items.RowOrColumn || column.type != type ) {
- var rowOrColumn = this.layoutManager.createContentItem( { type: type }, this );
- this.replaceChild( column, rowOrColumn );
- rowOrColumn.addChild( contentItem, insertBefore ? 0 : undefined, true );
- rowOrColumn.addChild( column, insertBefore ? undefined : 0, true );
- column.config[ dimension ] = 50;
- contentItem.config[ dimension ] = 50;
- rowOrColumn.callDownwards( 'setSize' );
- } else {
- var sibbling = column.contentItems[ insertBefore ? 0 : column.contentItems.length - 1 ]
- column.addChild( contentItem, insertBefore ? 0 : undefined, true );
- sibbling.config[ dimension ] *= 0.5;
- contentItem.config[ dimension ] = sibbling.config[ dimension ];
- column.callDownwards( 'setSize' );
- }
- }
- }
-} );
-
-
-
-lm.items.RowOrColumn = function( isColumn, layoutManager, config, parent ) {
- lm.items.AbstractContentItem.call( this, layoutManager, config, parent );
-
- this.isRow = !isColumn;
- this.isColumn = isColumn;
-
- this.element = $( '' );
- this.childElementContainer = this.element;
- this._splitterSize = layoutManager.config.dimensions.borderWidth;
- this._splitterGrabSize = layoutManager.config.dimensions.borderGrabWidth;
- this._isColumn = isColumn;
- this._dimension = isColumn ? 'height' : 'width';
- this._splitter = [];
- this._splitterPosition = null;
- this._splitterMinPosition = null;
- this._splitterMaxPosition = null;
-};
-
-lm.utils.extend( lm.items.RowOrColumn, lm.items.AbstractContentItem );
-
-lm.utils.copy( lm.items.RowOrColumn.prototype, {
-
- /**
- * Add a new contentItem to the Row or Column
- *
- * @param {lm.item.AbstractContentItem} contentItem
- * @param {[int]} index The position of the new item within the Row or Column.
- * If no index is provided the item will be added to the end
- * @param {[bool]} _$suspendResize If true the items won't be resized. This will leave the item in
- * an inconsistent state and is only intended to be used if multiple
- * children need to be added in one go and resize is called afterwards
- *
- * @returns {void}
- */
- addChild: function( contentItem, index, _$suspendResize ) {
-
- var newItemSize, itemSize, i, splitterElement;
-
- contentItem = this.layoutManager._$normalizeContentItem( contentItem, this );
-
- if( index === undefined ) {
- index = this.contentItems.length;
- }
-
- if( this.contentItems.length > 0 ) {
- splitterElement = this._createSplitter( Math.max( 0, index - 1 ) ).element;
-
- if( index > 0 ) {
- this.contentItems[ index - 1 ].element.after( splitterElement );
- splitterElement.after( contentItem.element );
- } else {
- this.contentItems[ 0 ].element.before( splitterElement );
- splitterElement.before( contentItem.element );
- }
- } else {
- this.childElementContainer.append( contentItem.element );
- }
-
- lm.items.AbstractContentItem.prototype.addChild.call( this, contentItem, index );
-
- newItemSize = ( 1 / this.contentItems.length ) * 100;
-
- if( _$suspendResize === true ) {
- this.emitBubblingEvent( 'stateChanged' );
- return;
- }
-
- for( i = 0; i < this.contentItems.length; i++ ) {
- if( this.contentItems[ i ] === contentItem ) {
- contentItem.config[ this._dimension ] = newItemSize;
- } else {
- itemSize = this.contentItems[ i ].config[ this._dimension ] *= ( 100 - newItemSize ) / 100;
- this.contentItems[ i ].config[ this._dimension ] = itemSize;
- }
- }
-
- this.callDownwards( 'setSize' );
- this.emitBubblingEvent( 'stateChanged' );
- },
-
- /**
- * Removes a child of this element
- *
- * @param {lm.items.AbstractContentItem} contentItem
- * @param {boolean} keepChild If true the child will be removed, but not destroyed
- *
- * @returns {void}
- */
- removeChild: function( contentItem, keepChild ) {
- var removedItemSize = contentItem.config[ this._dimension ],
- index = lm.utils.indexOf( contentItem, this.contentItems ),
- splitterIndex = Math.max( index - 1, 0 ),
- i,
- childItem;
-
- if( index === -1 ) {
- throw new Error( 'Can\'t remove child. ContentItem is not child of this Row or Column' );
- }
-
- /**
- * Remove the splitter before the item or after if the item happens
- * to be the first in the row/column
- */
- if( this._splitter[ splitterIndex ] ) {
- this._splitter[ splitterIndex ]._$destroy();
- this._splitter.splice( splitterIndex, 1 );
- }
-
- /**
- * Allocate the space that the removed item occupied to the remaining items
- */
- for( i = 0; i < this.contentItems.length; i++ ) {
- if( this.contentItems[ i ] !== contentItem ) {
- this.contentItems[ i ].config[ this._dimension ] += removedItemSize / ( this.contentItems.length - 1 );
- }
- }
-
- lm.items.AbstractContentItem.prototype.removeChild.call( this, contentItem, keepChild );
-
- if( this.contentItems.length === 1 && this.config.isClosable === true ) {
- childItem = this.contentItems[ 0 ];
- this.contentItems = [];
- this.parent.replaceChild( this, childItem, true );
- } else {
- this.callDownwards( 'setSize' );
- this.emitBubblingEvent( 'stateChanged' );
- }
- },
-
- /**
- * Replaces a child of this Row or Column with another contentItem
- *
- * @param {lm.items.AbstractContentItem} oldChild
- * @param {lm.items.AbstractContentItem} newChild
- *
- * @returns {void}
- */
- replaceChild: function( oldChild, newChild ) {
- var size = oldChild.config[ this._dimension ];
- lm.items.AbstractContentItem.prototype.replaceChild.call( this, oldChild, newChild );
- newChild.config[ this._dimension ] = size;
- this.callDownwards( 'setSize' );
- this.emitBubblingEvent( 'stateChanged' );
- },
-
- /**
- * Called whenever the dimensions of this item or one of its parents change
- *
- * @returns {void}
- */
- setSize: function() {
- if( this.contentItems.length > 0 ) {
- this._calculateRelativeSizes();
- this._setAbsoluteSizes();
- }
- this.emitBubblingEvent( 'stateChanged' );
- this.emit( 'resize' );
- },
-
- /**
- * Invoked recursively by the layout manager. AbstractContentItem.init appends
- * the contentItem's DOM elements to the container, RowOrColumn init adds splitters
- * in between them
- *
- * @package private
- * @override AbstractContentItem._$init
- * @returns {void}
- */
- _$init: function() {
- if( this.isInitialised === true ) return;
-
- var i;
-
- lm.items.AbstractContentItem.prototype._$init.call( this );
-
- for( i = 0; i < this.contentItems.length - 1; i++ ) {
- this.contentItems[ i ].element.after( this._createSplitter( i ).element );
- }
- },
-
- /**
- * Turns the relative sizes calculated by _calculateRelativeSizes into
- * absolute pixel values and applies them to the children's DOM elements
- *
- * Assigns additional pixels to counteract Math.floor
- *
- * @private
- * @returns {void}
- */
- _setAbsoluteSizes: function() {
- var i,
- sizeData = this._calculateAbsoluteSizes();
-
- for( i = 0; i < this.contentItems.length; i++ ) {
- if( sizeData.additionalPixel - i > 0 ) {
- sizeData.itemSizes[ i ]++;
- }
-
- if( this._isColumn ) {
- this.contentItems[ i ].element.width( sizeData.totalWidth );
- this.contentItems[ i ].element.height( sizeData.itemSizes[ i ] );
- } else {
- this.contentItems[ i ].element.width( sizeData.itemSizes[ i ] );
- this.contentItems[ i ].element.height( sizeData.totalHeight );
- }
- }
- },
-
- /**
- * Calculates the absolute sizes of all of the children of this Item.
- * @returns {object} - Set with absolute sizes and additional pixels.
- */
- _calculateAbsoluteSizes: function() {
- var i,
- totalSplitterSize = (this.contentItems.length - 1) * this._splitterSize,
- totalWidth = this.element.width(),
- totalHeight = this.element.height(),
- totalAssigned = 0,
- additionalPixel,
- itemSize,
- itemSizes = [];
-
- if( this._isColumn ) {
- totalHeight -= totalSplitterSize;
- } else {
- totalWidth -= totalSplitterSize;
- }
-
- for( i = 0; i < this.contentItems.length; i++ ) {
- if( this._isColumn ) {
- itemSize = Math.floor( totalHeight * ( this.contentItems[ i ].config.height / 100 ) );
- } else {
- itemSize = Math.floor( totalWidth * (this.contentItems[ i ].config.width / 100) );
- }
-
- totalAssigned += itemSize;
- itemSizes.push( itemSize );
- }
-
- additionalPixel = Math.floor( (this._isColumn ? totalHeight : totalWidth) - totalAssigned );
-
- return {
- itemSizes: itemSizes,
- additionalPixel: additionalPixel,
- totalWidth: totalWidth,
- totalHeight: totalHeight
- };
- },
-
- /**
- * Calculates the relative sizes of all children of this Item. The logic
- * is as follows:
- *
- * - Add up the total size of all items that have a configured size
- *
- * - If the total == 100 (check for floating point errors)
- * Excellent, job done
- *
- * - If the total is > 100,
- * set the size of items without set dimensions to 1/3 and add this to the total
- * set the size off all items so that the total is hundred relative to their original size
- *
- * - If the total is < 100
- * If there are items without set dimensions, distribute the remainder to 100 evenly between them
- * If there are no items without set dimensions, increase all items sizes relative to
- * their original size so that they add up to 100
- *
- * @private
- * @returns {void}
- */
- _calculateRelativeSizes: function() {
-
- var i,
- total = 0,
- itemsWithoutSetDimension = [],
- dimension = this._isColumn ? 'height' : 'width';
-
- for( i = 0; i < this.contentItems.length; i++ ) {
- if( this.contentItems[ i ].config[ dimension ] !== undefined ) {
- total += this.contentItems[ i ].config[ dimension ];
- } else {
- itemsWithoutSetDimension.push( this.contentItems[ i ] );
- }
- }
-
- /**
- * Everything adds up to hundred, all good :-)
- */
- if( Math.round( total ) === 100 ) {
- this._respectMinItemWidth();
- return;
- }
-
- /**
- * Allocate the remaining size to the items without a set dimension
- */
- if( Math.round( total ) < 100 && itemsWithoutSetDimension.length > 0 ) {
- for( i = 0; i < itemsWithoutSetDimension.length; i++ ) {
- itemsWithoutSetDimension[ i ].config[ dimension ] = ( 100 - total ) / itemsWithoutSetDimension.length;
- }
- this._respectMinItemWidth();
- return;
- }
-
- /**
- * If the total is > 100, but there are also items without a set dimension left, assing 50
- * as their dimension and add it to the total
- *
- * This will be reset in the next step
- */
- if( Math.round( total ) > 100 ) {
- for( i = 0; i < itemsWithoutSetDimension.length; i++ ) {
- itemsWithoutSetDimension[ i ].config[ dimension ] = 50;
- total += 50;
- }
- }
-
- /**
- * Set every items size relative to 100 relative to its size to total
- */
- for( i = 0; i < this.contentItems.length; i++ ) {
- this.contentItems[ i ].config[ dimension ] = ( this.contentItems[ i ].config[ dimension ] / total ) * 100;
- }
-
- this._respectMinItemWidth();
- },
-
- /**
- * Adjusts the column widths to respect the dimensions minItemWidth if set.
- * @returns {}
- */
- _respectMinItemWidth: function() {
- var minItemWidth = this.layoutManager.config.dimensions ? (this.layoutManager.config.dimensions.minItemWidth || 0) : 0,
- sizeData = null,
- entriesOverMin = [],
- totalOverMin = 0,
- totalUnderMin = 0,
- remainingWidth = 0,
- itemSize = 0,
- contentItem = null,
- reducePercent,
- reducedWidth,
- allEntries = [],
- entry;
-
- if( this._isColumn || !minItemWidth || this.contentItems.length <= 1 ) {
- return;
- }
-
- sizeData = this._calculateAbsoluteSizes();
-
- /**
- * Figure out how much we are under the min item size total and how much room we have to use.
- */
- for( var i = 0; i < this.contentItems.length; i++ ) {
-
- contentItem = this.contentItems[ i ];
- itemSize = sizeData.itemSizes[ i ];
-
- if( itemSize < minItemWidth ) {
- totalUnderMin += minItemWidth - itemSize;
- entry = { width: minItemWidth };
-
- }
- else {
- totalOverMin += itemSize - minItemWidth;
- entry = { width: itemSize };
- entriesOverMin.push( entry );
- }
-
- allEntries.push( entry );
- }
-
- /**
- * If there is nothing under min, or there is not enough over to make up the difference, do nothing.
- */
- if( totalUnderMin === 0 || totalUnderMin > totalOverMin ) {
- return;
- }
-
- /**
- * Evenly reduce all columns that are over the min item width to make up the difference.
- */
- reducePercent = totalUnderMin / totalOverMin;
- remainingWidth = totalUnderMin;
- for( i = 0; i < entriesOverMin.length; i++ ) {
- entry = entriesOverMin[ i ];
- reducedWidth = Math.round( ( entry.width - minItemWidth ) * reducePercent );
- remainingWidth -= reducedWidth;
- entry.width -= reducedWidth;
- }
-
- /**
- * Take anything remaining from the last item.
- */
- if( remainingWidth !== 0 ) {
- allEntries[ allEntries.length - 1 ].width -= remainingWidth;
- }
-
- /**
- * Set every items size relative to 100 relative to its size to total
- */
- for( i = 0; i < this.contentItems.length; i++ ) {
- this.contentItems[ i ].config.width = (allEntries[ i ].width / sizeData.totalWidth) * 100;
- }
- },
-
- /**
- * Instantiates a new lm.controls.Splitter, binds events to it and adds
- * it to the array of splitters at the position specified as the index argument
- *
- * What it doesn't do though is append the splitter to the DOM
- *
- * @param {Int} index The position of the splitter
- *
- * @returns {lm.controls.Splitter}
- */
- _createSplitter: function( index ) {
- var splitter;
- splitter = new lm.controls.Splitter( this._isColumn, this._splitterSize, this._splitterGrabSize );
- splitter.on( 'drag', lm.utils.fnBind( this._onSplitterDrag, this, [ splitter ] ), this );
- splitter.on( 'dragStop', lm.utils.fnBind( this._onSplitterDragStop, this, [ splitter ] ), this );
- splitter.on( 'dragStart', lm.utils.fnBind( this._onSplitterDragStart, this, [ splitter ] ), this );
- this._splitter.splice( index, 0, splitter );
- return splitter;
- },
-
- /**
- * Locates the instance of lm.controls.Splitter in the array of
- * registered splitters and returns a map containing the contentItem
- * before and after the splitters, both of which are affected if the
- * splitter is moved
- *
- * @param {lm.controls.Splitter} splitter
- *
- * @returns {Object} A map of contentItems that the splitter affects
- */
- _getItemsForSplitter: function( splitter ) {
- var index = lm.utils.indexOf( splitter, this._splitter );
-
- return {
- before: this.contentItems[ index ],
- after: this.contentItems[ index + 1 ]
- };
- },
-
- /**
- * Gets the minimum dimensions for the given item configuration array
- * @param item
- * @private
- */
- _getMinimumDimensions: function( arr ) {
- var minWidth = 0, minHeight = 0;
-
- for( var i = 0; i < arr.length; ++i ) {
- minWidth = Math.max( arr[ i ].minWidth || 0, minWidth );
- minHeight = Math.max( arr[ i ].minHeight || 0, minHeight );
- }
-
- return { horizontal: minWidth, vertical: minHeight };
- },
-
- /**
- * Invoked when a splitter's dragListener fires dragStart. Calculates the splitters
- * movement area once (so that it doesn't need calculating on every mousemove event)
- *
- * @param {lm.controls.Splitter} splitter
- *
- * @returns {void}
- */
- _onSplitterDragStart: function( splitter ) {
- var items = this._getItemsForSplitter( splitter ),
- minSize = this.layoutManager.config.dimensions[ this._isColumn ? 'minItemHeight' : 'minItemWidth' ];
-
- var beforeMinDim = this._getMinimumDimensions( items.before.config.content );
- var beforeMinSize = this._isColumn ? beforeMinDim.vertical : beforeMinDim.horizontal;
-
- var afterMinDim = this._getMinimumDimensions( items.after.config.content );
- var afterMinSize = this._isColumn ? afterMinDim.vertical : afterMinDim.horizontal;
-
- this._splitterPosition = 0;
- this._splitterMinPosition = -1 * ( items.before.element[ this._dimension ]() - (beforeMinSize || minSize) );
- this._splitterMaxPosition = items.after.element[ this._dimension ]() - (afterMinSize || minSize);
- },
-
- /**
- * Invoked when a splitter's DragListener fires drag. Updates the splitters DOM position,
- * but not the sizes of the elements the splitter controls in order to minimize resize events
- *
- * @param {lm.controls.Splitter} splitter
- * @param {Int} offsetX Relative pixel values to the splitters original position. Can be negative
- * @param {Int} offsetY Relative pixel values to the splitters original position. Can be negative
- *
- * @returns {void}
- */
- _onSplitterDrag: function( splitter, offsetX, offsetY ) {
- var offset = this._isColumn ? offsetY : offsetX;
-
- if( offset > this._splitterMinPosition && offset < this._splitterMaxPosition ) {
- this._splitterPosition = offset;
- splitter.element.css( this._isColumn ? 'top' : 'left', offset );
- }
- },
-
- /**
- * Invoked when a splitter's DragListener fires dragStop. Resets the splitters DOM position,
- * and applies the new sizes to the elements before and after the splitter and their children
- * on the next animation frame
- *
- * @param {lm.controls.Splitter} splitter
- *
- * @returns {void}
- */
- _onSplitterDragStop: function( splitter ) {
-
- var items = this._getItemsForSplitter( splitter ),
- sizeBefore = items.before.element[ this._dimension ](),
- sizeAfter = items.after.element[ this._dimension ](),
- splitterPositionInRange = ( this._splitterPosition + sizeBefore ) / ( sizeBefore + sizeAfter ),
- totalRelativeSize = items.before.config[ this._dimension ] + items.after.config[ this._dimension ];
-
- items.before.config[ this._dimension ] = splitterPositionInRange * totalRelativeSize;
- items.after.config[ this._dimension ] = ( 1 - splitterPositionInRange ) * totalRelativeSize;
-
- splitter.element.css( {
- 'top': 0,
- 'left': 0
- } );
-
- lm.utils.animFrame( lm.utils.fnBind( this.callDownwards, this, [ 'setSize' ] ) );
- }
-} );
-
-lm.items.Stack = function( layoutManager, config, parent ) {
- lm.items.AbstractContentItem.call( this, layoutManager, config, parent );
-
- this.element = $( '' );
- this._activeContentItem = null;
- var cfg = layoutManager.config;
- this._header = { // defaults' reconstruction from old configuration style
- show: cfg.settings.hasHeaders === true && config.hasHeaders !== false,
- popout: cfg.settings.showPopoutIcon && cfg.labels.popout,
- maximise: cfg.settings.showMaximiseIcon && cfg.labels.maximise,
- close: cfg.settings.showCloseIcon && cfg.labels.close,
- minimise: cfg.labels.minimise,
- };
- if( cfg.header ) // load simplified version of header configuration (https://github.com/deepstreamIO/golden-layout/pull/245)
- lm.utils.copy( this._header, cfg.header );
- if( config.header ) // load from stack
- lm.utils.copy( this._header, config.header );
- if( config.content && config.content[ 0 ] && config.content[ 0 ].header ) // load from component if stack omitted
- lm.utils.copy( this._header, config.content[ 0 ].header );
-
- this._dropZones = {};
- this._dropSegment = null;
- this._contentAreaDimensions = null;
- this._dropIndex = null;
-
- this.isStack = true;
-
- this.childElementContainer = $( '' );
- this.header = new lm.controls.Header( layoutManager, this );
-
- this.element.append( this.header.element );
- this.element.append( this.childElementContainer );
- this._setupHeaderPosition();
- this._$validateClosability();
-};
-
-lm.utils.extend( lm.items.Stack, lm.items.AbstractContentItem );
-
-lm.utils.copy( lm.items.Stack.prototype, {
-
- setSize: function() {
- var i,
- headerSize = this._header.show ? this.layoutManager.config.dimensions.headerHeight : 0,
- contentWidth = this.element.width() - (this._sided ? headerSize : 0),
- contentHeight = this.element.height() - (!this._sided ? headerSize : 0);
-
- this.childElementContainer.width( contentWidth );
- this.childElementContainer.height( contentHeight );
-
- for( i = 0; i < this.contentItems.length; i++ ) {
- this.contentItems[ i ].element.width( contentWidth ).height( contentHeight );
- }
- this.emit( 'resize' );
- this.emitBubblingEvent( 'stateChanged' );
- },
-
- _$init: function() {
- var i, initialItem;
-
- if( this.isInitialised === true ) return;
-
- lm.items.AbstractContentItem.prototype._$init.call( this );
-
- for( i = 0; i < this.contentItems.length; i++ ) {
- this.header.createTab( this.contentItems[ i ] );
- this.contentItems[ i ]._$hide();
- }
-
- if( this.contentItems.length > 0 ) {
- initialItem = this.contentItems[ this.config.activeItemIndex || 0 ];
-
- if( !initialItem ) {
- throw new Error( 'Configured activeItemIndex out of bounds' );
- }
-
- this.setActiveContentItem( initialItem );
- }
- },
-
- setActiveContentItem: function( contentItem ) {
- if( lm.utils.indexOf( contentItem, this.contentItems ) === -1 ) {
- throw new Error( 'contentItem is not a child of this stack' );
- }
-
- if( this._activeContentItem !== null ) {
- this._activeContentItem._$hide();
- }
-
- this._activeContentItem = contentItem;
- this.header.setActiveContentItem( contentItem );
- contentItem._$show();
- this.emit( 'activeContentItemChanged', contentItem );
- this.layoutManager.emit( 'activeContentItemChanged', contentItem );
- this.emitBubblingEvent( 'stateChanged' );
- },
-
- getActiveContentItem: function() {
- return this.header.activeContentItem;
- },
-
- addChild: function( contentItem, index ) {
- contentItem = this.layoutManager._$normalizeContentItem( contentItem, this );
- lm.items.AbstractContentItem.prototype.addChild.call( this, contentItem, index );
- this.childElementContainer.append( contentItem.element );
- this.header.createTab( contentItem, index );
- this.setActiveContentItem( contentItem );
- this.callDownwards( 'setSize' );
- this._$validateClosability();
- this.emitBubblingEvent( 'stateChanged' );
- },
-
- removeChild: function( contentItem, keepChild ) {
- var index = lm.utils.indexOf( contentItem, this.contentItems );
- lm.items.AbstractContentItem.prototype.removeChild.call( this, contentItem, keepChild );
- this.header.removeTab( contentItem );
- if (this.header.activeContentItem === contentItem) {
- if (this.contentItems.length > 0) {
- this.setActiveContentItem(this.contentItems[Math.max(index - 1, 0)]);
- } else {
- this._activeContentItem = null;
- }
- }
-
- this._$validateClosability();
- this.emitBubblingEvent( 'stateChanged' );
- },
-
- /**
- * Validates that the stack is still closable or not. If a stack is able
- * to close, but has a non closable component added to it, the stack is no
- * longer closable until all components are closable.
- *
- * @returns {void}
- */
- _$validateClosability: function() {
- var contentItem,
- isClosable,
- len,
- i;
-
- isClosable = this.header._isClosable();
-
- for( i = 0, len = this.contentItems.length; i < len; i++ ) {
- if( !isClosable ) {
- break;
- }
-
- isClosable = this.contentItems[ i ].config.isClosable;
- }
-
- this.header._$setClosable( isClosable );
- },
-
- _$destroy: function() {
- lm.items.AbstractContentItem.prototype._$destroy.call( this );
- this.header._$destroy();
- },
-
-
- /**
- * Ok, this one is going to be the tricky one: The user has dropped {contentItem} onto this stack.
- *
- * It was dropped on either the stacks header or the top, right, bottom or left bit of the content area
- * (which one of those is stored in this._dropSegment). Now, if the user has dropped on the header the case
- * is relatively clear: We add the item to the existing stack... job done (might be good to have
- * tab reordering at some point, but lets not sweat it right now)
- *
- * If the item was dropped on the content part things are a bit more complicated. If it was dropped on either the
- * top or bottom region we need to create a new column and place the items accordingly.
- * Unless, of course if the stack is already within a column... in which case we want
- * to add the newly created item to the existing column...
- * either prepend or append it, depending on wether its top or bottom.
- *
- * Same thing for rows and left / right drop segments... so in total there are 9 things that can potentially happen
- * (left, top, right, bottom) * is child of the right parent (row, column) + header drop
- *
- * @param {lm.item} contentItem
- *
- * @returns {void}
- */
- _$onDrop: function( contentItem ) {
-
- /*
- * The item was dropped on the header area. Just add it as a child of this stack and
- * get the hell out of this logic
- */
- if( this._dropSegment === 'header' ) {
- this._resetHeaderDropZone();
- this.addChild( contentItem, this._dropIndex );
- return;
- }
-
- /*
- * The stack is empty. Let's just add the element.
- */
- if( this._dropSegment === 'body' ) {
- this.addChild( contentItem );
- return;
- }
-
- /*
- * The item was dropped on the top-, left-, bottom- or right- part of the content. Let's
- * aggregate some conditions to make the if statements later on more readable
- */
- var isVertical = this._dropSegment === 'top' || this._dropSegment === 'bottom',
- isHorizontal = this._dropSegment === 'left' || this._dropSegment === 'right',
- insertBefore = this._dropSegment === 'top' || this._dropSegment === 'left',
- hasCorrectParent = ( isVertical && this.parent.isColumn ) || ( isHorizontal && this.parent.isRow ),
- type = isVertical ? 'column' : 'row',
- dimension = isVertical ? 'height' : 'width',
- index,
- stack,
- rowOrColumn;
-
- /*
- * The content item can be either a component or a stack. If it is a component, wrap it into a stack
- */
- if( contentItem.isComponent ) {
- stack = this.layoutManager.createContentItem( {
- type: 'stack',
- header: contentItem.config.header || {}
- }, this );
- stack._$init();
- stack.addChild( contentItem );
- contentItem = stack;
- }
-
- /*
- * If the item is dropped on top or bottom of a column or left and right of a row, it's already
- * layd out in the correct way. Just add it as a child
- */
- if( hasCorrectParent ) {
- index = lm.utils.indexOf( this, this.parent.contentItems );
- this.parent.addChild( contentItem, insertBefore ? index : index + 1, true );
- this.config[ dimension ] *= 0.5;
- contentItem.config[ dimension ] = this.config[ dimension ];
- this.parent.callDownwards( 'setSize' );
- /*
- * This handles items that are dropped on top or bottom of a row or left / right of a column. We need
- * to create the appropriate contentItem for them to live in
- */
- } else {
- type = isVertical ? 'column' : 'row';
- rowOrColumn = this.layoutManager.createContentItem( { type: type }, this );
- this.parent.replaceChild( this, rowOrColumn );
-
- rowOrColumn.addChild( contentItem, insertBefore ? 0 : undefined, true );
- rowOrColumn.addChild( this, insertBefore ? undefined : 0, true );
-
- this.config[ dimension ] = 50;
- contentItem.config[ dimension ] = 50;
- rowOrColumn.callDownwards( 'setSize' );
- }
- },
-
- /**
- * If the user hovers above the header part of the stack, indicate drop positions for tabs.
- * otherwise indicate which segment of the body the dragged item would be dropped on
- *
- * @param {Int} x Absolute Screen X
- * @param {Int} y Absolute Screen Y
- *
- * @returns {void}
- */
- _$highlightDropZone: function( x, y ) {
- var segment, area;
-
- for( segment in this._contentAreaDimensions ) {
- area = this._contentAreaDimensions[ segment ].hoverArea;
-
- if( area.x1 < x && area.x2 > x && area.y1 < y && area.y2 > y ) {
-
- if( segment === 'header' ) {
- this._dropSegment = 'header';
- this._highlightHeaderDropZone( this._sided ? y : x );
- } else {
- this._resetHeaderDropZone();
- this._highlightBodyDropZone( segment );
- }
-
- return;
- }
- }
- },
-
- _$getArea: function() {
- if( this.element.is( ':visible' ) === false ) {
- return null;
- }
-
- var getArea = lm.items.AbstractContentItem.prototype._$getArea,
- headerArea = getArea.call( this, this.header.element ),
- contentArea = getArea.call( this, this.childElementContainer ),
- contentWidth = contentArea.x2 - contentArea.x1,
- contentHeight = contentArea.y2 - contentArea.y1;
-
- this._contentAreaDimensions = {
- header: {
- hoverArea: {
- x1: headerArea.x1,
- y1: headerArea.y1,
- x2: headerArea.x2,
- y2: headerArea.y2
- },
- highlightArea: {
- x1: headerArea.x1,
- y1: headerArea.y1,
- x2: headerArea.x2,
- y2: headerArea.y2
- }
- }
- };
-
- /**
- * If this Stack is a parent to rows, columns or other stacks only its
- * header is a valid dropzone.
- */
- if( this._activeContentItem && this._activeContentItem.isComponent === false ) {
- return headerArea;
- }
-
- /**
- * Highlight the entire body if the stack is empty
- */
- if( this.contentItems.length === 0 ) {
-
- this._contentAreaDimensions.body = {
- hoverArea: {
- x1: contentArea.x1,
- y1: contentArea.y1,
- x2: contentArea.x2,
- y2: contentArea.y2
- },
- highlightArea: {
- x1: contentArea.x1,
- y1: contentArea.y1,
- x2: contentArea.x2,
- y2: contentArea.y2
- }
- };
-
- return getArea.call( this, this.element );
- }
-
- this._contentAreaDimensions.left = {
- hoverArea: {
- x1: contentArea.x1,
- y1: contentArea.y1,
- x2: contentArea.x1 + contentWidth * 0.25,
- y2: contentArea.y2
- },
- highlightArea: {
- x1: contentArea.x1,
- y1: contentArea.y1,
- x2: contentArea.x1 + contentWidth * 0.5,
- y2: contentArea.y2
- }
- };
-
- this._contentAreaDimensions.top = {
- hoverArea: {
- x1: contentArea.x1 + contentWidth * 0.25,
- y1: contentArea.y1,
- x2: contentArea.x1 + contentWidth * 0.75,
- y2: contentArea.y1 + contentHeight * 0.5
- },
- highlightArea: {
- x1: contentArea.x1,
- y1: contentArea.y1,
- x2: contentArea.x2,
- y2: contentArea.y1 + contentHeight * 0.5
- }
- };
-
- this._contentAreaDimensions.right = {
- hoverArea: {
- x1: contentArea.x1 + contentWidth * 0.75,
- y1: contentArea.y1,
- x2: contentArea.x2,
- y2: contentArea.y2
- },
- highlightArea: {
- x1: contentArea.x1 + contentWidth * 0.5,
- y1: contentArea.y1,
- x2: contentArea.x2,
- y2: contentArea.y2
- }
- };
-
- this._contentAreaDimensions.bottom = {
- hoverArea: {
- x1: contentArea.x1 + contentWidth * 0.25,
- y1: contentArea.y1 + contentHeight * 0.5,
- x2: contentArea.x1 + contentWidth * 0.75,
- y2: contentArea.y2
- },
- highlightArea: {
- x1: contentArea.x1,
- y1: contentArea.y1 + contentHeight * 0.5,
- x2: contentArea.x2,
- y2: contentArea.y2
- }
- };
-
- return getArea.call( this, this.element );
- },
-
- _highlightHeaderDropZone: function( x ) {
- var i,
- tabElement,
- tabsLength = this.header.tabs.length,
- isAboveTab = false,
- tabTop,
- tabLeft,
- offset,
- placeHolderLeft,
- headerOffset,
- tabWidth,
- halfX;
-
- // Empty stack
- if( tabsLength === 0 ) {
- headerOffset = this.header.element.offset();
-
- this.layoutManager.dropTargetIndicator.highlightArea( {
- x1: headerOffset.left,
- x2: headerOffset.left + 100,
- y1: headerOffset.top + this.header.element.height() - 20,
- y2: headerOffset.top + this.header.element.height()
- } );
-
- return;
- }
-
- for( i = 0; i < tabsLength; i++ ) {
- tabElement = this.header.tabs[ i ].element;
- offset = tabElement.offset();
- if( this._sided ) {
- tabLeft = offset.top;
- tabTop = offset.left;
- tabWidth = tabElement.height();
- } else {
- tabLeft = offset.left;
- tabTop = offset.top;
- tabWidth = tabElement.width();
- }
-
- if( x > tabLeft && x < tabLeft + tabWidth ) {
- isAboveTab = true;
- break;
- }
- }
-
- if( isAboveTab === false && x < tabLeft ) {
- return;
- }
-
- halfX = tabLeft + tabWidth / 2;
-
- if( x < halfX ) {
- this._dropIndex = i;
- tabElement.before( this.layoutManager.tabDropPlaceholder );
- } else {
- this._dropIndex = Math.min( i + 1, tabsLength );
- tabElement.after( this.layoutManager.tabDropPlaceholder );
- }
-
-
- if( this._sided ) {
- placeHolderTop = this.layoutManager.tabDropPlaceholder.offset().top;
- this.layoutManager.dropTargetIndicator.highlightArea( {
- x1: tabTop,
- x2: tabTop + tabElement.innerHeight(),
- y1: placeHolderTop,
- y2: placeHolderTop + this.layoutManager.tabDropPlaceholder.width()
- } );
- return;
- }
- placeHolderLeft = this.layoutManager.tabDropPlaceholder.offset().left;
-
- this.layoutManager.dropTargetIndicator.highlightArea( {
- x1: placeHolderLeft,
- x2: placeHolderLeft + this.layoutManager.tabDropPlaceholder.width(),
- y1: tabTop,
- y2: tabTop + tabElement.innerHeight()
- } );
- },
-
- _resetHeaderDropZone: function() {
- this.layoutManager.tabDropPlaceholder.remove();
- },
-
- _setupHeaderPosition: function() {
- var side = [ 'right', 'left', 'bottom' ].indexOf( this._header.show ) >= 0 && this._header.show;
- this.header.element.toggle( !!this._header.show );
- this._side = side;
- this._sided = [ 'right', 'left' ].indexOf( this._side ) >= 0;
- this.element.removeClass( 'lm_left lm_right lm_bottom' );
- if( this._side )
- this.element.addClass( 'lm_' + this._side );
- if( this.element.find( '.lm_header' ).length && this.childElementContainer ) {
- var headerPosition = [ 'right', 'bottom' ].indexOf( this._side ) >= 0 ? 'before' : 'after';
- this.header.element[ headerPosition ]( this.childElementContainer );
- this.callDownwards( 'setSize' );
- }
- },
-
- _highlightBodyDropZone: function( segment ) {
- var highlightArea = this._contentAreaDimensions[ segment ].highlightArea;
- this.layoutManager.dropTargetIndicator.highlightArea( highlightArea );
- this._dropSegment = segment;
- }
-} );
-
-lm.utils.BubblingEvent = function( name, origin ) {
- this.name = name;
- this.origin = origin;
- this.isPropagationStopped = false;
-};
-
-lm.utils.BubblingEvent.prototype.stopPropagation = function() {
- this.isPropagationStopped = true;
-};
-/**
- * Minifies and unminifies configs by replacing frequent keys
- * and values with one letter substitutes. Config options must
- * retain array position/index, add new options at the end.
- *
- * @constructor
- */
-lm.utils.ConfigMinifier = function() {
- this._keys = [
- 'settings',
- 'hasHeaders',
- 'constrainDragToContainer',
- 'selectionEnabled',
- 'dimensions',
- 'borderWidth',
- 'minItemHeight',
- 'minItemWidth',
- 'headerHeight',
- 'dragProxyWidth',
- 'dragProxyHeight',
- 'labels',
- 'close',
- 'maximise',
- 'minimise',
- 'popout',
- 'content',
- 'componentName',
- 'componentState',
- 'id',
- 'width',
- 'type',
- 'height',
- 'isClosable',
- 'title',
- 'popoutWholeStack',
- 'openPopouts',
- 'parentId',
- 'activeItemIndex',
- 'reorderEnabled',
- 'borderGrabWidth',
-
-
-
-
- //Maximum 36 entries, do not cross this line!
- ];
- if( this._keys.length > 36 ) {
- throw new Error( 'Too many keys in config minifier map' );
- }
-
- this._values = [
- true,
- false,
- 'row',
- 'column',
- 'stack',
- 'component',
- 'close',
- 'maximise',
- 'minimise',
- 'open in new window'
- ];
-};
-
-lm.utils.copy( lm.utils.ConfigMinifier.prototype, {
-
- /**
- * Takes a GoldenLayout configuration object and
- * replaces its keys and values recursively with
- * one letter counterparts
- *
- * @param {Object} config A GoldenLayout config object
- *
- * @returns {Object} minified config
- */
- minifyConfig: function( config ) {
- var min = {};
- this._nextLevel( config, min, '_min' );
- return min;
- },
-
- /**
- * Takes a configuration Object that was previously minified
- * using minifyConfig and returns its original version
- *
- * @param {Object} minifiedConfig
- *
- * @returns {Object} the original configuration
- */
- unminifyConfig: function( minifiedConfig ) {
- var orig = {};
- this._nextLevel( minifiedConfig, orig, '_max' );
- return orig;
- },
-
- /**
- * Recursive function, called for every level of the config structure
- *
- * @param {Array|Object} orig
- * @param {Array|Object} min
- * @param {String} translationFn
- *
- * @returns {void}
- */
- _nextLevel: function( from, to, translationFn ) {
- var key, minKey;
-
- for( key in from ) {
-
- /**
- * For in returns array indices as keys, so let's cast them to numbers
- */
- if( from instanceof Array ) key = parseInt( key, 10 );
-
- /**
- * In case something has extended Object prototypes
- */
- if( !from.hasOwnProperty( key ) ) continue;
-
- /**
- * Translate the key to a one letter substitute
- */
- minKey = this[ translationFn ]( key, this._keys );
-
- /**
- * For Arrays and Objects, create a new Array/Object
- * on the minified object and recurse into it
- */
- if( typeof from[ key ] === 'object' ) {
- to[ minKey ] = from[ key ] instanceof Array ? [] : {};
- this._nextLevel( from[ key ], to[ minKey ], translationFn );
-
- /**
- * For primitive values (Strings, Numbers, Boolean etc.)
- * minify the value
- */
- } else {
- to[ minKey ] = this[ translationFn ]( from[ key ], this._values );
- }
- }
- },
-
- /**
- * Minifies value based on a dictionary
- *
- * @param {String|Boolean} value
- * @param {Array} dictionary
- *
- * @returns {String} The minified version
- */
- _min: function( value, dictionary ) {
- /**
- * If a value actually is a single character, prefix it
- * with ___ to avoid mistaking it for a minification code
- */
- if( typeof value === 'string' && value.length === 1 ) {
- return '___' + value;
- }
-
- var index = lm.utils.indexOf( value, dictionary );
-
- /**
- * value not found in the dictionary, return it unmodified
- */
- if( index === -1 ) {
- return value;
-
- /**
- * value found in dictionary, return its base36 counterpart
- */
- } else {
- return index.toString( 36 );
- }
- },
-
- _max: function( value, dictionary ) {
- /**
- * value is a single character. Assume that it's a translation
- * and return the original value from the dictionary
- */
- if( typeof value === 'string' && value.length === 1 ) {
- return dictionary[ parseInt( value, 36 ) ];
- }
-
- /**
- * value originally was a single character and was prefixed with ___
- * to avoid mistaking it for a translation. Remove the prefix
- * and return the original character
- */
- if( typeof value === 'string' && value.substr( 0, 3 ) === '___' ) {
- return value[ 3 ];
- }
- /**
- * value was not minified
- */
- return value;
- }
-} );
-
-/**
- * An EventEmitter singleton that propagates events
- * across multiple windows. This is a little bit trickier since
- * windows are allowed to open childWindows in their own right
- *
- * This means that we deal with a tree of windows. Hence the rules for event propagation are:
- *
- * - Propagate events from this layout to both parents and children
- * - Propagate events from parent to this and children
- * - Propagate events from children to the other children (but not the emitting one) and the parent
- *
- * @constructor
- *
- * @param {lm.LayoutManager} layoutManager
- */
-lm.utils.EventHub = function( layoutManager ) {
- lm.utils.EventEmitter.call( this );
- this._layoutManager = layoutManager;
- this._dontPropagateToParent = null;
- this._childEventSource = null;
- this.on( lm.utils.EventEmitter.ALL_EVENT, lm.utils.fnBind( this._onEventFromThis, this ) );
- this._boundOnEventFromChild = lm.utils.fnBind( this._onEventFromChild, this );
- $( window ).on( 'gl_child_event', this._boundOnEventFromChild );
-};
-
-/**
- * Called on every event emitted on this eventHub, regardles of origin.
- *
- * @private
- *
- * @param {Mixed}
- *
- * @returns {void}
- */
-lm.utils.EventHub.prototype._onEventFromThis = function() {
- var args = Array.prototype.slice.call( arguments );
-
- if( this._layoutManager.isSubWindow && args[ 0 ] !== this._dontPropagateToParent ) {
- this._propagateToParent( args );
- }
- this._propagateToChildren( args );
-
- //Reset
- this._dontPropagateToParent = null;
- this._childEventSource = null;
-};
-
-/**
- * Called by the parent layout.
- *
- * @param {Array} args Event name + arguments
- *
- * @returns {void}
- */
-lm.utils.EventHub.prototype._$onEventFromParent = function( args ) {
- this._dontPropagateToParent = args[ 0 ];
- this.emit.apply( this, args );
-};
-
-/**
- * Callback for child events raised on the window
- *
- * @param {DOMEvent} event
- * @private
- *
- * @returns {void}
- */
-lm.utils.EventHub.prototype._onEventFromChild = function( event ) {
- this._childEventSource = event.originalEvent.__gl;
- this.emit.apply( this, event.originalEvent.__glArgs );
-};
-
-/**
- * Propagates the event to the parent by emitting
- * it on the parent's DOM window
- *
- * @param {Array} args Event name + arguments
- * @private
- *
- * @returns {void}
- */
-lm.utils.EventHub.prototype._propagateToParent = function( args ) {
- var event,
- eventName = 'gl_child_event';
-
- if( document.createEvent ) {
- event = window.opener.document.createEvent( 'HTMLEvents' );
- event.initEvent( eventName, true, true );
- } else {
- event = window.opener.document.createEventObject();
- event.eventType = eventName;
- }
-
- event.eventName = eventName;
- event.__glArgs = args;
- event.__gl = this._layoutManager;
-
- if( document.createEvent ) {
- window.opener.dispatchEvent( event );
- } else {
- window.opener.fireEvent( 'on' + event.eventType, event );
- }
-};
-
-/**
- * Propagate events to children
- *
- * @param {Array} args Event name + arguments
- * @private
- *
- * @returns {void}
- */
-lm.utils.EventHub.prototype._propagateToChildren = function( args ) {
- var childGl, i;
-
- for( i = 0; i < this._layoutManager.openPopouts.length; i++ ) {
- childGl = this._layoutManager.openPopouts[ i ].getGlInstance();
-
- if( childGl && childGl !== this._childEventSource ) {
- childGl.eventHub._$onEventFromParent( args );
- }
- }
-};
-
-
-/**
- * Destroys the EventHub
- *
- * @public
- * @returns {void}
- */
-
-lm.utils.EventHub.prototype.destroy = function() {
- $( window ).off( 'gl_child_event', this._boundOnEventFromChild );
-};
-/**
- * A specialised GoldenLayout component that binds GoldenLayout container
- * lifecycle events to react components
- *
- * @constructor
- *
- * @param {lm.container.ItemContainer} container
- * @param {Object} state state is not required for react components
- */
-lm.utils.ReactComponentHandler = function( container, state ) {
- this._reactComponent = null;
- this._originalComponentWillUpdate = null;
- this._container = container;
- this._initialState = state;
- this._reactClass = this._getReactClass();
- this._container.on( 'open', this._render, this );
- this._container.on( 'destroy', this._destroy, this );
-};
-
-lm.utils.copy( lm.utils.ReactComponentHandler.prototype, {
-
- /**
- * Creates the react class and component and hydrates it with
- * the initial state - if one is present
- *
- * By default, react's getInitialState will be used
- *
- * @private
- * @returns {void}
- */
- _render: function() {
- this._reactComponent = ReactDOM.render( this._getReactComponent(), this._container.getElement()[ 0 ] );
- this._originalComponentWillUpdate = this._reactComponent.componentWillUpdate || function() {
- };
- this._reactComponent.componentWillUpdate = this._onUpdate.bind( this );
- if( this._container.getState() ) {
- this._reactComponent.setState( this._container.getState() );
- }
- },
-
- /**
- * Removes the component from the DOM and thus invokes React's unmount lifecycle
- *
- * @private
- * @returns {void}
- */
- _destroy: function() {
- ReactDOM.unmountComponentAtNode( this._container.getElement()[ 0 ] );
- this._container.off( 'open', this._render, this );
- this._container.off( 'destroy', this._destroy, this );
- },
-
- /**
- * Hooks into React's state management and applies the componentstate
- * to GoldenLayout
- *
- * @private
- * @returns {void}
- */
- _onUpdate: function( nextProps, nextState ) {
- this._container.setState( nextState );
- this._originalComponentWillUpdate.call( this._reactComponent, nextProps, nextState );
- },
-
- /**
- * Retrieves the react class from GoldenLayout's registry
- *
- * @private
- * @returns {React.Class}
- */
- _getReactClass: function() {
- var componentName = this._container._config.component;
- var reactClass;
-
- if( !componentName ) {
- throw new Error( 'No react component name. type: react-component needs a field `component`' );
- }
-
- reactClass = this._container.layoutManager.getComponent( componentName );
-
- if( !reactClass ) {
- throw new Error( 'React component "' + componentName + '" not found. ' +
- 'Please register all components with GoldenLayout using `registerComponent(name, component)`' );
- }
-
- return reactClass;
- },
-
- /**
- * Copies and extends the properties array and returns the React element
- *
- * @private
- * @returns {React.Element}
- */
- _getReactComponent: function() {
- var defaultProps = {
- glEventHub: this._container.layoutManager.eventHub,
- glContainer: this._container,
- };
- var props = $.extend( defaultProps, this._container._config.props );
- return React.createElement( this._reactClass, props );
- }
-} );})(window.$);
diff --git a/frontend/js/libs/handlebars.js b/frontend/js/libs/handlebars.js
deleted file mode 100644
index aeeaaa85e..000000000
--- a/frontend/js/libs/handlebars.js
+++ /dev/null
@@ -1,5210 +0,0 @@
-/**!
-
- @license
- handlebars v4.7.6
-
-Copyright (C) 2011-2019 by Yehuda Katz
-
-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:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-*/
-(function webpackUniversalModuleDefinition(root, factory) {
- if(typeof exports === 'object' && typeof module === 'object')
- module.exports = factory();
- else if(typeof define === 'function' && define.amd)
- define([], factory);
- else if(typeof exports === 'object')
- exports["Handlebars"] = factory();
- else
- root["Handlebars"] = factory();
-})(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ // The module cache
-/******/ var installedModules = {};
-
-/******/ // The require function
-/******/ function __webpack_require__(moduleId) {
-
-/******/ // Check if module is in cache
-/******/ if(installedModules[moduleId])
-/******/ return installedModules[moduleId].exports;
-
-/******/ // Create a new module (and put it into the cache)
-/******/ var module = installedModules[moduleId] = {
-/******/ exports: {},
-/******/ id: moduleId,
-/******/ loaded: false
-/******/ };
-
-/******/ // Execute the module function
-/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-
-/******/ // Flag the module as loaded
-/******/ module.loaded = true;
-
-/******/ // Return the exports of the module
-/******/ return module.exports;
-/******/ }
-
-
-/******/ // expose the modules object (__webpack_modules__)
-/******/ __webpack_require__.m = modules;
-
-/******/ // expose the module cache
-/******/ __webpack_require__.c = installedModules;
-
-/******/ // __webpack_public_path__
-/******/ __webpack_require__.p = "";
-
-/******/ // Load entry module and return exports
-/******/ return __webpack_require__(0);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
-
- var _handlebarsRuntime = __webpack_require__(2);
-
- var _handlebarsRuntime2 = _interopRequireDefault(_handlebarsRuntime);
-
- // Compiler imports
-
- var _handlebarsCompilerAst = __webpack_require__(45);
-
- var _handlebarsCompilerAst2 = _interopRequireDefault(_handlebarsCompilerAst);
-
- var _handlebarsCompilerBase = __webpack_require__(46);
-
- var _handlebarsCompilerCompiler = __webpack_require__(51);
-
- var _handlebarsCompilerJavascriptCompiler = __webpack_require__(52);
-
- var _handlebarsCompilerJavascriptCompiler2 = _interopRequireDefault(_handlebarsCompilerJavascriptCompiler);
-
- var _handlebarsCompilerVisitor = __webpack_require__(49);
-
- var _handlebarsCompilerVisitor2 = _interopRequireDefault(_handlebarsCompilerVisitor);
-
- var _handlebarsNoConflict = __webpack_require__(44);
-
- var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
-
- var _create = _handlebarsRuntime2['default'].create;
- function create() {
- var hb = _create();
-
- hb.compile = function (input, options) {
- return _handlebarsCompilerCompiler.compile(input, options, hb);
- };
- hb.precompile = function (input, options) {
- return _handlebarsCompilerCompiler.precompile(input, options, hb);
- };
-
- hb.AST = _handlebarsCompilerAst2['default'];
- hb.Compiler = _handlebarsCompilerCompiler.Compiler;
- hb.JavaScriptCompiler = _handlebarsCompilerJavascriptCompiler2['default'];
- hb.Parser = _handlebarsCompilerBase.parser;
- hb.parse = _handlebarsCompilerBase.parse;
- hb.parseWithoutProcessing = _handlebarsCompilerBase.parseWithoutProcessing;
-
- return hb;
- }
-
- var inst = create();
- inst.create = create;
-
- _handlebarsNoConflict2['default'](inst);
-
- inst.Visitor = _handlebarsCompilerVisitor2['default'];
-
- inst['default'] = inst;
-
- exports['default'] = inst;
- module.exports = exports['default'];
-
-/***/ }),
-/* 1 */
-/***/ (function(module, exports) {
-
- "use strict";
-
- exports["default"] = function (obj) {
- return obj && obj.__esModule ? obj : {
- "default": obj
- };
- };
-
- exports.__esModule = true;
-
-/***/ }),
-/* 2 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireWildcard = __webpack_require__(3)['default'];
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
-
- var _handlebarsBase = __webpack_require__(4);
-
- var base = _interopRequireWildcard(_handlebarsBase);
-
- // Each of these augment the Handlebars object. No need to setup here.
- // (This is done to easily share code between commonjs and browse envs)
-
- var _handlebarsSafeString = __webpack_require__(37);
-
- var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);
-
- var _handlebarsException = __webpack_require__(6);
-
- var _handlebarsException2 = _interopRequireDefault(_handlebarsException);
-
- var _handlebarsUtils = __webpack_require__(5);
-
- var Utils = _interopRequireWildcard(_handlebarsUtils);
-
- var _handlebarsRuntime = __webpack_require__(38);
-
- var runtime = _interopRequireWildcard(_handlebarsRuntime);
-
- var _handlebarsNoConflict = __webpack_require__(44);
-
- var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
-
- // For compatibility and usage outside of module systems, make the Handlebars object a namespace
- function create() {
- var hb = new base.HandlebarsEnvironment();
-
- Utils.extend(hb, base);
- hb.SafeString = _handlebarsSafeString2['default'];
- hb.Exception = _handlebarsException2['default'];
- hb.Utils = Utils;
- hb.escapeExpression = Utils.escapeExpression;
-
- hb.VM = runtime;
- hb.template = function (spec) {
- return runtime.template(spec, hb);
- };
-
- return hb;
- }
-
- var inst = create();
- inst.create = create;
-
- _handlebarsNoConflict2['default'](inst);
-
- inst['default'] = inst;
-
- exports['default'] = inst;
- module.exports = exports['default'];
-
-/***/ }),
-/* 3 */
-/***/ (function(module, exports) {
-
- "use strict";
-
- exports["default"] = function (obj) {
- if (obj && obj.__esModule) {
- return obj;
- } else {
- var newObj = {};
-
- if (obj != null) {
- for (var key in obj) {
- if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
- }
- }
-
- newObj["default"] = obj;
- return newObj;
- }
- };
-
- exports.__esModule = true;
-
-/***/ }),
-/* 4 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
- exports.HandlebarsEnvironment = HandlebarsEnvironment;
-
- var _utils = __webpack_require__(5);
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- var _helpers = __webpack_require__(10);
-
- var _decorators = __webpack_require__(30);
-
- var _logger = __webpack_require__(32);
-
- var _logger2 = _interopRequireDefault(_logger);
-
- var _internalProtoAccess = __webpack_require__(33);
-
- var VERSION = '4.7.6';
- exports.VERSION = VERSION;
- var COMPILER_REVISION = 8;
- exports.COMPILER_REVISION = COMPILER_REVISION;
- var LAST_COMPATIBLE_COMPILER_REVISION = 7;
-
- exports.LAST_COMPATIBLE_COMPILER_REVISION = LAST_COMPATIBLE_COMPILER_REVISION;
- var REVISION_CHANGES = {
- 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
- 2: '== 1.0.0-rc.3',
- 3: '== 1.0.0-rc.4',
- 4: '== 1.x.x',
- 5: '== 2.0.0-alpha.x',
- 6: '>= 2.0.0-beta.1',
- 7: '>= 4.0.0 <4.3.0',
- 8: '>= 4.3.0'
- };
-
- exports.REVISION_CHANGES = REVISION_CHANGES;
- var objectType = '[object Object]';
-
- function HandlebarsEnvironment(helpers, partials, decorators) {
- this.helpers = helpers || {};
- this.partials = partials || {};
- this.decorators = decorators || {};
-
- _helpers.registerDefaultHelpers(this);
- _decorators.registerDefaultDecorators(this);
- }
-
- HandlebarsEnvironment.prototype = {
- constructor: HandlebarsEnvironment,
-
- logger: _logger2['default'],
- log: _logger2['default'].log,
-
- registerHelper: function registerHelper(name, fn) {
- if (_utils.toString.call(name) === objectType) {
- if (fn) {
- throw new _exception2['default']('Arg not supported with multiple helpers');
- }
- _utils.extend(this.helpers, name);
- } else {
- this.helpers[name] = fn;
- }
- },
- unregisterHelper: function unregisterHelper(name) {
- delete this.helpers[name];
- },
-
- registerPartial: function registerPartial(name, partial) {
- if (_utils.toString.call(name) === objectType) {
- _utils.extend(this.partials, name);
- } else {
- if (typeof partial === 'undefined') {
- throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined');
- }
- this.partials[name] = partial;
- }
- },
- unregisterPartial: function unregisterPartial(name) {
- delete this.partials[name];
- },
-
- registerDecorator: function registerDecorator(name, fn) {
- if (_utils.toString.call(name) === objectType) {
- if (fn) {
- throw new _exception2['default']('Arg not supported with multiple decorators');
- }
- _utils.extend(this.decorators, name);
- } else {
- this.decorators[name] = fn;
- }
- },
- unregisterDecorator: function unregisterDecorator(name) {
- delete this.decorators[name];
- },
- /**
- * Reset the memory of illegal property accesses that have already been logged.
- * @deprecated should only be used in handlebars test-cases
- */
- resetLoggedPropertyAccesses: function resetLoggedPropertyAccesses() {
- _internalProtoAccess.resetLoggedProperties();
- }
- };
-
- var log = _logger2['default'].log;
-
- exports.log = log;
- exports.createFrame = _utils.createFrame;
- exports.logger = _logger2['default'];
-
-/***/ }),
-/* 5 */
-/***/ (function(module, exports) {
-
- 'use strict';
-
- exports.__esModule = true;
- exports.extend = extend;
- exports.indexOf = indexOf;
- exports.escapeExpression = escapeExpression;
- exports.isEmpty = isEmpty;
- exports.createFrame = createFrame;
- exports.blockParams = blockParams;
- exports.appendContextPath = appendContextPath;
- var escape = {
- '&': '&',
- '<': '<',
- '>': '>',
- '"': '"',
- "'": ''',
- '`': '`',
- '=': '='
- };
-
- var badChars = /[&<>"'`=]/g,
- possible = /[&<>"'`=]/;
-
- function escapeChar(chr) {
- return escape[chr];
- }
-
- function extend(obj /* , ...source */) {
- for (var i = 1; i < arguments.length; i++) {
- for (var key in arguments[i]) {
- if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
- obj[key] = arguments[i][key];
- }
- }
- }
-
- return obj;
- }
-
- var toString = Object.prototype.toString;
-
- exports.toString = toString;
- // Sourced from lodash
- // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
- /* eslint-disable func-style */
- var isFunction = function isFunction(value) {
- return typeof value === 'function';
- };
- // fallback for older versions of Chrome and Safari
- /* istanbul ignore next */
- if (isFunction(/x/)) {
- exports.isFunction = isFunction = function (value) {
- return typeof value === 'function' && toString.call(value) === '[object Function]';
- };
- }
- exports.isFunction = isFunction;
-
- /* eslint-enable func-style */
-
- /* istanbul ignore next */
- var isArray = Array.isArray || function (value) {
- return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;
- };
-
- exports.isArray = isArray;
- // Older IE versions do not directly support indexOf so we must implement our own, sadly.
-
- function indexOf(array, value) {
- for (var i = 0, len = array.length; i < len; i++) {
- if (array[i] === value) {
- return i;
- }
- }
- return -1;
- }
-
- function escapeExpression(string) {
- if (typeof string !== 'string') {
- // don't escape SafeStrings, since they're already safe
- if (string && string.toHTML) {
- return string.toHTML();
- } else if (string == null) {
- return '';
- } else if (!string) {
- return string + '';
- }
-
- // Force a string conversion as this will be done by the append regardless and
- // the regex test will do this transparently behind the scenes, causing issues if
- // an object's to string has escaped characters in it.
- string = '' + string;
- }
-
- if (!possible.test(string)) {
- return string;
- }
- return string.replace(badChars, escapeChar);
- }
-
- function isEmpty(value) {
- if (!value && value !== 0) {
- return true;
- } else if (isArray(value) && value.length === 0) {
- return true;
- } else {
- return false;
- }
- }
-
- function createFrame(object) {
- var frame = extend({}, object);
- frame._parent = object;
- return frame;
- }
-
- function blockParams(params, ids) {
- params.path = ids;
- return params;
- }
-
- function appendContextPath(contextPath, id) {
- return (contextPath ? contextPath + '.' : '') + id;
- }
-
-/***/ }),
-/* 6 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _Object$defineProperty = __webpack_require__(7)['default'];
-
- exports.__esModule = true;
- var errorProps = ['description', 'fileName', 'lineNumber', 'endLineNumber', 'message', 'name', 'number', 'stack'];
-
- function Exception(message, node) {
- var loc = node && node.loc,
- line = undefined,
- endLineNumber = undefined,
- column = undefined,
- endColumn = undefined;
-
- if (loc) {
- line = loc.start.line;
- endLineNumber = loc.end.line;
- column = loc.start.column;
- endColumn = loc.end.column;
-
- message += ' - ' + line + ':' + column;
- }
-
- var tmp = Error.prototype.constructor.call(this, message);
-
- // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
- for (var idx = 0; idx < errorProps.length; idx++) {
- this[errorProps[idx]] = tmp[errorProps[idx]];
- }
-
- /* istanbul ignore else */
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, Exception);
- }
-
- try {
- if (loc) {
- this.lineNumber = line;
- this.endLineNumber = endLineNumber;
-
- // Work around issue under safari where we can't directly set the column value
- /* istanbul ignore next */
- if (_Object$defineProperty) {
- Object.defineProperty(this, 'column', {
- value: column,
- enumerable: true
- });
- Object.defineProperty(this, 'endColumn', {
- value: endColumn,
- enumerable: true
- });
- } else {
- this.column = column;
- this.endColumn = endColumn;
- }
- }
- } catch (nop) {
- /* Ignore if the browser is very particular */
- }
- }
-
- Exception.prototype = new Error();
-
- exports['default'] = Exception;
- module.exports = exports['default'];
-
-/***/ }),
-/* 7 */
-/***/ (function(module, exports, __webpack_require__) {
-
- module.exports = { "default": __webpack_require__(8), __esModule: true };
-
-/***/ }),
-/* 8 */
-/***/ (function(module, exports, __webpack_require__) {
-
- var $ = __webpack_require__(9);
- module.exports = function defineProperty(it, key, desc){
- return $.setDesc(it, key, desc);
- };
-
-/***/ }),
-/* 9 */
-/***/ (function(module, exports) {
-
- var $Object = Object;
- module.exports = {
- create: $Object.create,
- getProto: $Object.getPrototypeOf,
- isEnum: {}.propertyIsEnumerable,
- getDesc: $Object.getOwnPropertyDescriptor,
- setDesc: $Object.defineProperty,
- setDescs: $Object.defineProperties,
- getKeys: $Object.keys,
- getNames: $Object.getOwnPropertyNames,
- getSymbols: $Object.getOwnPropertySymbols,
- each: [].forEach
- };
-
-/***/ }),
-/* 10 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
- exports.registerDefaultHelpers = registerDefaultHelpers;
- exports.moveHelperToHooks = moveHelperToHooks;
-
- var _helpersBlockHelperMissing = __webpack_require__(11);
-
- var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);
-
- var _helpersEach = __webpack_require__(12);
-
- var _helpersEach2 = _interopRequireDefault(_helpersEach);
-
- var _helpersHelperMissing = __webpack_require__(25);
-
- var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);
-
- var _helpersIf = __webpack_require__(26);
-
- var _helpersIf2 = _interopRequireDefault(_helpersIf);
-
- var _helpersLog = __webpack_require__(27);
-
- var _helpersLog2 = _interopRequireDefault(_helpersLog);
-
- var _helpersLookup = __webpack_require__(28);
-
- var _helpersLookup2 = _interopRequireDefault(_helpersLookup);
-
- var _helpersWith = __webpack_require__(29);
-
- var _helpersWith2 = _interopRequireDefault(_helpersWith);
-
- function registerDefaultHelpers(instance) {
- _helpersBlockHelperMissing2['default'](instance);
- _helpersEach2['default'](instance);
- _helpersHelperMissing2['default'](instance);
- _helpersIf2['default'](instance);
- _helpersLog2['default'](instance);
- _helpersLookup2['default'](instance);
- _helpersWith2['default'](instance);
- }
-
- function moveHelperToHooks(instance, helperName, keepHelper) {
- if (instance.helpers[helperName]) {
- instance.hooks[helperName] = instance.helpers[helperName];
- if (!keepHelper) {
- delete instance.helpers[helperName];
- }
- }
- }
-
-/***/ }),
-/* 11 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- exports.__esModule = true;
-
- var _utils = __webpack_require__(5);
-
- exports['default'] = function (instance) {
- instance.registerHelper('blockHelperMissing', function (context, options) {
- var inverse = options.inverse,
- fn = options.fn;
-
- if (context === true) {
- return fn(this);
- } else if (context === false || context == null) {
- return inverse(this);
- } else if (_utils.isArray(context)) {
- if (context.length > 0) {
- if (options.ids) {
- options.ids = [options.name];
- }
-
- return instance.helpers.each(context, options);
- } else {
- return inverse(this);
- }
- } else {
- if (options.data && options.ids) {
- var data = _utils.createFrame(options.data);
- data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);
- options = { data: data };
- }
-
- return fn(context, options);
- }
- });
- };
-
- module.exports = exports['default'];
-
-/***/ }),
-/* 12 */
-/***/ (function(module, exports, __webpack_require__) {
-
- /* WEBPACK VAR INJECTION */(function(global) {'use strict';
-
- var _Object$keys = __webpack_require__(13)['default'];
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
-
- var _utils = __webpack_require__(5);
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- exports['default'] = function (instance) {
- instance.registerHelper('each', function (context, options) {
- if (!options) {
- throw new _exception2['default']('Must pass iterator to #each');
- }
-
- var fn = options.fn,
- inverse = options.inverse,
- i = 0,
- ret = '',
- data = undefined,
- contextPath = undefined;
-
- if (options.data && options.ids) {
- contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';
- }
-
- if (_utils.isFunction(context)) {
- context = context.call(this);
- }
-
- if (options.data) {
- data = _utils.createFrame(options.data);
- }
-
- function execIteration(field, index, last) {
- if (data) {
- data.key = field;
- data.index = index;
- data.first = index === 0;
- data.last = !!last;
-
- if (contextPath) {
- data.contextPath = contextPath + field;
- }
- }
-
- ret = ret + fn(context[field], {
- data: data,
- blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])
- });
- }
-
- if (context && typeof context === 'object') {
- if (_utils.isArray(context)) {
- for (var j = context.length; i < j; i++) {
- if (i in context) {
- execIteration(i, i, i === context.length - 1);
- }
- }
- } else if (global.Symbol && context[global.Symbol.iterator]) {
- var newContext = [];
- var iterator = context[global.Symbol.iterator]();
- for (var it = iterator.next(); !it.done; it = iterator.next()) {
- newContext.push(it.value);
- }
- context = newContext;
- for (var j = context.length; i < j; i++) {
- execIteration(i, i, i === context.length - 1);
- }
- } else {
- (function () {
- var priorKey = undefined;
-
- _Object$keys(context).forEach(function (key) {
- // We're running the iterations one step out of sync so we can detect
- // the last iteration without have to scan the object twice and create
- // an itermediate keys array.
- if (priorKey !== undefined) {
- execIteration(priorKey, i - 1);
- }
- priorKey = key;
- i++;
- });
- if (priorKey !== undefined) {
- execIteration(priorKey, i - 1, true);
- }
- })();
- }
- }
-
- if (i === 0) {
- ret = inverse(this);
- }
-
- return ret;
- });
- };
-
- module.exports = exports['default'];
- /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
-
-/***/ }),
-/* 13 */
-/***/ (function(module, exports, __webpack_require__) {
-
- module.exports = { "default": __webpack_require__(14), __esModule: true };
-
-/***/ }),
-/* 14 */
-/***/ (function(module, exports, __webpack_require__) {
-
- __webpack_require__(15);
- module.exports = __webpack_require__(21).Object.keys;
-
-/***/ }),
-/* 15 */
-/***/ (function(module, exports, __webpack_require__) {
-
- // 19.1.2.14 Object.keys(O)
- var toObject = __webpack_require__(16);
-
- __webpack_require__(18)('keys', function($keys){
- return function keys(it){
- return $keys(toObject(it));
- };
- });
-
-/***/ }),
-/* 16 */
-/***/ (function(module, exports, __webpack_require__) {
-
- // 7.1.13 ToObject(argument)
- var defined = __webpack_require__(17);
- module.exports = function(it){
- return Object(defined(it));
- };
-
-/***/ }),
-/* 17 */
-/***/ (function(module, exports) {
-
- // 7.2.1 RequireObjectCoercible(argument)
- module.exports = function(it){
- if(it == undefined)throw TypeError("Can't call method on " + it);
- return it;
- };
-
-/***/ }),
-/* 18 */
-/***/ (function(module, exports, __webpack_require__) {
-
- // most Object methods by ES6 should accept primitives
- var $export = __webpack_require__(19)
- , core = __webpack_require__(21)
- , fails = __webpack_require__(24);
- module.exports = function(KEY, exec){
- var fn = (core.Object || {})[KEY] || Object[KEY]
- , exp = {};
- exp[KEY] = exec(fn);
- $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
- };
-
-/***/ }),
-/* 19 */
-/***/ (function(module, exports, __webpack_require__) {
-
- var global = __webpack_require__(20)
- , core = __webpack_require__(21)
- , ctx = __webpack_require__(22)
- , PROTOTYPE = 'prototype';
-
- var $export = function(type, name, source){
- var IS_FORCED = type & $export.F
- , IS_GLOBAL = type & $export.G
- , IS_STATIC = type & $export.S
- , IS_PROTO = type & $export.P
- , IS_BIND = type & $export.B
- , IS_WRAP = type & $export.W
- , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
- , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
- , key, own, out;
- if(IS_GLOBAL)source = name;
- for(key in source){
- // contains in native
- own = !IS_FORCED && target && key in target;
- if(own && key in exports)continue;
- // export native or passed
- out = own ? target[key] : source[key];
- // prevent global pollution for namespaces
- exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
- // bind timers to global for call from export context
- : IS_BIND && own ? ctx(out, global)
- // wrap global constructors for prevent change them in library
- : IS_WRAP && target[key] == out ? (function(C){
- var F = function(param){
- return this instanceof C ? new C(param) : C(param);
- };
- F[PROTOTYPE] = C[PROTOTYPE];
- return F;
- // make static versions for prototype methods
- })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
- if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;
- }
- };
- // type bitmap
- $export.F = 1; // forced
- $export.G = 2; // global
- $export.S = 4; // static
- $export.P = 8; // proto
- $export.B = 16; // bind
- $export.W = 32; // wrap
- module.exports = $export;
-
-/***/ }),
-/* 20 */
-/***/ (function(module, exports) {
-
- // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
- var global = module.exports = typeof window != 'undefined' && window.Math == Math
- ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
- if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
-
-/***/ }),
-/* 21 */
-/***/ (function(module, exports) {
-
- var core = module.exports = {version: '1.2.6'};
- if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
-
-/***/ }),
-/* 22 */
-/***/ (function(module, exports, __webpack_require__) {
-
- // optional / simple context binding
- var aFunction = __webpack_require__(23);
- module.exports = function(fn, that, length){
- aFunction(fn);
- if(that === undefined)return fn;
- switch(length){
- case 1: return function(a){
- return fn.call(that, a);
- };
- case 2: return function(a, b){
- return fn.call(that, a, b);
- };
- case 3: return function(a, b, c){
- return fn.call(that, a, b, c);
- };
- }
- return function(/* ...args */){
- return fn.apply(that, arguments);
- };
- };
-
-/***/ }),
-/* 23 */
-/***/ (function(module, exports) {
-
- module.exports = function(it){
- if(typeof it != 'function')throw TypeError(it + ' is not a function!');
- return it;
- };
-
-/***/ }),
-/* 24 */
-/***/ (function(module, exports) {
-
- module.exports = function(exec){
- try {
- return !!exec();
- } catch(e){
- return true;
- }
- };
-
-/***/ }),
-/* 25 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- exports['default'] = function (instance) {
- instance.registerHelper('helperMissing', function () /* [args, ]options */{
- if (arguments.length === 1) {
- // A missing field in a {{foo}} construct.
- return undefined;
- } else {
- // Someone is actually trying to call something, blow up.
- throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"');
- }
- });
- };
-
- module.exports = exports['default'];
-
-/***/ }),
-/* 26 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
-
- var _utils = __webpack_require__(5);
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- exports['default'] = function (instance) {
- instance.registerHelper('if', function (conditional, options) {
- if (arguments.length != 2) {
- throw new _exception2['default']('#if requires exactly one argument');
- }
- if (_utils.isFunction(conditional)) {
- conditional = conditional.call(this);
- }
-
- // Default behavior is to render the positive path if the value is truthy and not empty.
- // The `includeZero` option may be set to treat the condtional as purely not empty based on the
- // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
- if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {
- return options.inverse(this);
- } else {
- return options.fn(this);
- }
- });
-
- instance.registerHelper('unless', function (conditional, options) {
- if (arguments.length != 2) {
- throw new _exception2['default']('#unless requires exactly one argument');
- }
- return instance.helpers['if'].call(this, conditional, {
- fn: options.inverse,
- inverse: options.fn,
- hash: options.hash
- });
- });
- };
-
- module.exports = exports['default'];
-
-/***/ }),
-/* 27 */
-/***/ (function(module, exports) {
-
- 'use strict';
-
- exports.__esModule = true;
-
- exports['default'] = function (instance) {
- instance.registerHelper('log', function () /* message, options */{
- var args = [undefined],
- options = arguments[arguments.length - 1];
- for (var i = 0; i < arguments.length - 1; i++) {
- args.push(arguments[i]);
- }
-
- var level = 1;
- if (options.hash.level != null) {
- level = options.hash.level;
- } else if (options.data && options.data.level != null) {
- level = options.data.level;
- }
- args[0] = level;
-
- instance.log.apply(instance, args);
- });
- };
-
- module.exports = exports['default'];
-
-/***/ }),
-/* 28 */
-/***/ (function(module, exports) {
-
- 'use strict';
-
- exports.__esModule = true;
-
- exports['default'] = function (instance) {
- instance.registerHelper('lookup', function (obj, field, options) {
- if (!obj) {
- // Note for 5.0: Change to "obj == null" in 5.0
- return obj;
- }
- return options.lookupProperty(obj, field);
- });
- };
-
- module.exports = exports['default'];
-
-/***/ }),
-/* 29 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
-
- var _utils = __webpack_require__(5);
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- exports['default'] = function (instance) {
- instance.registerHelper('with', function (context, options) {
- if (arguments.length != 2) {
- throw new _exception2['default']('#with requires exactly one argument');
- }
- if (_utils.isFunction(context)) {
- context = context.call(this);
- }
-
- var fn = options.fn;
-
- if (!_utils.isEmpty(context)) {
- var data = options.data;
- if (options.data && options.ids) {
- data = _utils.createFrame(options.data);
- data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);
- }
-
- return fn(context, {
- data: data,
- blockParams: _utils.blockParams([context], [data && data.contextPath])
- });
- } else {
- return options.inverse(this);
- }
- });
- };
-
- module.exports = exports['default'];
-
-/***/ }),
-/* 30 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
- exports.registerDefaultDecorators = registerDefaultDecorators;
-
- var _decoratorsInline = __webpack_require__(31);
-
- var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);
-
- function registerDefaultDecorators(instance) {
- _decoratorsInline2['default'](instance);
- }
-
-/***/ }),
-/* 31 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- exports.__esModule = true;
-
- var _utils = __webpack_require__(5);
-
- exports['default'] = function (instance) {
- instance.registerDecorator('inline', function (fn, props, container, options) {
- var ret = fn;
- if (!props.partials) {
- props.partials = {};
- ret = function (context, options) {
- // Create a new partials stack frame prior to exec.
- var original = container.partials;
- container.partials = _utils.extend({}, original, props.partials);
- var ret = fn(context, options);
- container.partials = original;
- return ret;
- };
- }
-
- props.partials[options.args[0]] = options.fn;
-
- return ret;
- });
- };
-
- module.exports = exports['default'];
-
-/***/ }),
-/* 32 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- exports.__esModule = true;
-
- var _utils = __webpack_require__(5);
-
- var logger = {
- methodMap: ['debug', 'info', 'warn', 'error'],
- level: 'info',
-
- // Maps a given level value to the `methodMap` indexes above.
- lookupLevel: function lookupLevel(level) {
- if (typeof level === 'string') {
- var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());
- if (levelMap >= 0) {
- level = levelMap;
- } else {
- level = parseInt(level, 10);
- }
- }
-
- return level;
- },
-
- // Can be overridden in the host environment
- log: function log(level) {
- level = logger.lookupLevel(level);
-
- if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {
- var method = logger.methodMap[level];
- // eslint-disable-next-line no-console
- if (!console[method]) {
- method = 'log';
- }
-
- for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- message[_key - 1] = arguments[_key];
- }
-
- console[method].apply(console, message); // eslint-disable-line no-console
- }
- }
- };
-
- exports['default'] = logger;
- module.exports = exports['default'];
-
-/***/ }),
-/* 33 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _Object$create = __webpack_require__(34)['default'];
-
- var _Object$keys = __webpack_require__(13)['default'];
-
- var _interopRequireWildcard = __webpack_require__(3)['default'];
-
- exports.__esModule = true;
- exports.createProtoAccessControl = createProtoAccessControl;
- exports.resultIsAllowed = resultIsAllowed;
- exports.resetLoggedProperties = resetLoggedProperties;
-
- var _createNewLookupObject = __webpack_require__(36);
-
- var _logger = __webpack_require__(32);
-
- var logger = _interopRequireWildcard(_logger);
-
- var loggedProperties = _Object$create(null);
-
- function createProtoAccessControl(runtimeOptions) {
- var defaultMethodWhiteList = _Object$create(null);
- defaultMethodWhiteList['constructor'] = false;
- defaultMethodWhiteList['__defineGetter__'] = false;
- defaultMethodWhiteList['__defineSetter__'] = false;
- defaultMethodWhiteList['__lookupGetter__'] = false;
-
- var defaultPropertyWhiteList = _Object$create(null);
- // eslint-disable-next-line no-proto
- defaultPropertyWhiteList['__proto__'] = false;
-
- return {
- properties: {
- whitelist: _createNewLookupObject.createNewLookupObject(defaultPropertyWhiteList, runtimeOptions.allowedProtoProperties),
- defaultValue: runtimeOptions.allowProtoPropertiesByDefault
- },
- methods: {
- whitelist: _createNewLookupObject.createNewLookupObject(defaultMethodWhiteList, runtimeOptions.allowedProtoMethods),
- defaultValue: runtimeOptions.allowProtoMethodsByDefault
- }
- };
- }
-
- function resultIsAllowed(result, protoAccessControl, propertyName) {
- if (typeof result === 'function') {
- return checkWhiteList(protoAccessControl.methods, propertyName);
- } else {
- return checkWhiteList(protoAccessControl.properties, propertyName);
- }
- }
-
- function checkWhiteList(protoAccessControlForType, propertyName) {
- if (protoAccessControlForType.whitelist[propertyName] !== undefined) {
- return protoAccessControlForType.whitelist[propertyName] === true;
- }
- if (protoAccessControlForType.defaultValue !== undefined) {
- return protoAccessControlForType.defaultValue;
- }
- logUnexpecedPropertyAccessOnce(propertyName);
- return false;
- }
-
- function logUnexpecedPropertyAccessOnce(propertyName) {
- if (loggedProperties[propertyName] !== true) {
- loggedProperties[propertyName] = true;
- logger.log('error', 'Handlebars: Access has been denied to resolve the property "' + propertyName + '" because it is not an "own property" of its parent.\n' + 'You can add a runtime option to disable the check or this warning:\n' + 'See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details');
- }
- }
-
- function resetLoggedProperties() {
- _Object$keys(loggedProperties).forEach(function (propertyName) {
- delete loggedProperties[propertyName];
- });
- }
-
-/***/ }),
-/* 34 */
-/***/ (function(module, exports, __webpack_require__) {
-
- module.exports = { "default": __webpack_require__(35), __esModule: true };
-
-/***/ }),
-/* 35 */
-/***/ (function(module, exports, __webpack_require__) {
-
- var $ = __webpack_require__(9);
- module.exports = function create(P, D){
- return $.create(P, D);
- };
-
-/***/ }),
-/* 36 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _Object$create = __webpack_require__(34)['default'];
-
- exports.__esModule = true;
- exports.createNewLookupObject = createNewLookupObject;
-
- var _utils = __webpack_require__(5);
-
- /**
- * Create a new object with "null"-prototype to avoid truthy results on prototype properties.
- * The resulting object can be used with "object[property]" to check if a property exists
- * @param {...object} sources a varargs parameter of source objects that will be merged
- * @returns {object}
- */
-
- function createNewLookupObject() {
- for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) {
- sources[_key] = arguments[_key];
- }
-
- return _utils.extend.apply(undefined, [_Object$create(null)].concat(sources));
- }
-
-/***/ }),
-/* 37 */
-/***/ (function(module, exports) {
-
- // Build out our basic SafeString type
- 'use strict';
-
- exports.__esModule = true;
- function SafeString(string) {
- this.string = string;
- }
-
- SafeString.prototype.toString = SafeString.prototype.toHTML = function () {
- return '' + this.string;
- };
-
- exports['default'] = SafeString;
- module.exports = exports['default'];
-
-/***/ }),
-/* 38 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _Object$seal = __webpack_require__(39)['default'];
-
- var _Object$keys = __webpack_require__(13)['default'];
-
- var _interopRequireWildcard = __webpack_require__(3)['default'];
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
- exports.checkRevision = checkRevision;
- exports.template = template;
- exports.wrapProgram = wrapProgram;
- exports.resolvePartial = resolvePartial;
- exports.invokePartial = invokePartial;
- exports.noop = noop;
-
- var _utils = __webpack_require__(5);
-
- var Utils = _interopRequireWildcard(_utils);
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- var _base = __webpack_require__(4);
-
- var _helpers = __webpack_require__(10);
-
- var _internalWrapHelper = __webpack_require__(43);
-
- var _internalProtoAccess = __webpack_require__(33);
-
- function checkRevision(compilerInfo) {
- var compilerRevision = compilerInfo && compilerInfo[0] || 1,
- currentRevision = _base.COMPILER_REVISION;
-
- if (compilerRevision >= _base.LAST_COMPATIBLE_COMPILER_REVISION && compilerRevision <= _base.COMPILER_REVISION) {
- return;
- }
-
- if (compilerRevision < _base.LAST_COMPATIBLE_COMPILER_REVISION) {
- var runtimeVersions = _base.REVISION_CHANGES[currentRevision],
- compilerVersions = _base.REVISION_CHANGES[compilerRevision];
- throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');
- } else {
- // Use the embedded version info since the runtime doesn't know about this revision yet
- throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');
- }
- }
-
- function template(templateSpec, env) {
- /* istanbul ignore next */
- if (!env) {
- throw new _exception2['default']('No environment passed to template');
- }
- if (!templateSpec || !templateSpec.main) {
- throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);
- }
-
- templateSpec.main.decorator = templateSpec.main_d;
-
- // Note: Using env.VM references rather than local var references throughout this section to allow
- // for external users to override these as pseudo-supported APIs.
- env.VM.checkRevision(templateSpec.compiler);
-
- // backwards compatibility for precompiled templates with compiler-version 7 (<4.3.0)
- var templateWasPrecompiledWithCompilerV7 = templateSpec.compiler && templateSpec.compiler[0] === 7;
-
- function invokePartialWrapper(partial, context, options) {
- if (options.hash) {
- context = Utils.extend({}, context, options.hash);
- if (options.ids) {
- options.ids[0] = true;
- }
- }
- partial = env.VM.resolvePartial.call(this, partial, context, options);
-
- var extendedOptions = Utils.extend({}, options, {
- hooks: this.hooks,
- protoAccessControl: this.protoAccessControl
- });
-
- var result = env.VM.invokePartial.call(this, partial, context, extendedOptions);
-
- if (result == null && env.compile) {
- options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);
- result = options.partials[options.name](context, extendedOptions);
- }
- if (result != null) {
- if (options.indent) {
- var lines = result.split('\n');
- for (var i = 0, l = lines.length; i < l; i++) {
- if (!lines[i] && i + 1 === l) {
- break;
- }
-
- lines[i] = options.indent + lines[i];
- }
- result = lines.join('\n');
- }
- return result;
- } else {
- throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');
- }
- }
-
- // Just add water
- var container = {
- strict: function strict(obj, name, loc) {
- if (!obj || !(name in obj)) {
- throw new _exception2['default']('"' + name + '" not defined in ' + obj, {
- loc: loc
- });
- }
- return obj[name];
- },
- lookupProperty: function lookupProperty(parent, propertyName) {
- var result = parent[propertyName];
- if (result == null) {
- return result;
- }
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return result;
- }
-
- if (_internalProtoAccess.resultIsAllowed(result, container.protoAccessControl, propertyName)) {
- return result;
- }
- return undefined;
- },
- lookup: function lookup(depths, name) {
- var len = depths.length;
- for (var i = 0; i < len; i++) {
- var result = depths[i] && container.lookupProperty(depths[i], name);
- if (result != null) {
- return depths[i][name];
- }
- }
- },
- lambda: function lambda(current, context) {
- return typeof current === 'function' ? current.call(context) : current;
- },
-
- escapeExpression: Utils.escapeExpression,
- invokePartial: invokePartialWrapper,
-
- fn: function fn(i) {
- var ret = templateSpec[i];
- ret.decorator = templateSpec[i + '_d'];
- return ret;
- },
-
- programs: [],
- program: function program(i, data, declaredBlockParams, blockParams, depths) {
- var programWrapper = this.programs[i],
- fn = this.fn(i);
- if (data || depths || blockParams || declaredBlockParams) {
- programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);
- } else if (!programWrapper) {
- programWrapper = this.programs[i] = wrapProgram(this, i, fn);
- }
- return programWrapper;
- },
-
- data: function data(value, depth) {
- while (value && depth--) {
- value = value._parent;
- }
- return value;
- },
- mergeIfNeeded: function mergeIfNeeded(param, common) {
- var obj = param || common;
-
- if (param && common && param !== common) {
- obj = Utils.extend({}, common, param);
- }
-
- return obj;
- },
- // An empty object to use as replacement for null-contexts
- nullContext: _Object$seal({}),
-
- noop: env.VM.noop,
- compilerInfo: templateSpec.compiler
- };
-
- function ret(context) {
- var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
-
- var data = options.data;
-
- ret._setup(options);
- if (!options.partial && templateSpec.useData) {
- data = initData(context, data);
- }
- var depths = undefined,
- blockParams = templateSpec.useBlockParams ? [] : undefined;
- if (templateSpec.useDepths) {
- if (options.depths) {
- depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;
- } else {
- depths = [context];
- }
- }
-
- function main(context /*, options*/) {
- return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);
- }
-
- main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);
- return main(context, options);
- }
-
- ret.isTop = true;
-
- ret._setup = function (options) {
- if (!options.partial) {
- var mergedHelpers = Utils.extend({}, env.helpers, options.helpers);
- wrapHelpersToPassLookupProperty(mergedHelpers, container);
- container.helpers = mergedHelpers;
-
- if (templateSpec.usePartial) {
- // Use mergeIfNeeded here to prevent compiling global partials multiple times
- container.partials = container.mergeIfNeeded(options.partials, env.partials);
- }
- if (templateSpec.usePartial || templateSpec.useDecorators) {
- container.decorators = Utils.extend({}, env.decorators, options.decorators);
- }
-
- container.hooks = {};
- container.protoAccessControl = _internalProtoAccess.createProtoAccessControl(options);
-
- var keepHelperInHelpers = options.allowCallsToHelperMissing || templateWasPrecompiledWithCompilerV7;
- _helpers.moveHelperToHooks(container, 'helperMissing', keepHelperInHelpers);
- _helpers.moveHelperToHooks(container, 'blockHelperMissing', keepHelperInHelpers);
- } else {
- container.protoAccessControl = options.protoAccessControl; // internal option
- container.helpers = options.helpers;
- container.partials = options.partials;
- container.decorators = options.decorators;
- container.hooks = options.hooks;
- }
- };
-
- ret._child = function (i, data, blockParams, depths) {
- if (templateSpec.useBlockParams && !blockParams) {
- throw new _exception2['default']('must pass block params');
- }
- if (templateSpec.useDepths && !depths) {
- throw new _exception2['default']('must pass parent depths');
- }
-
- return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);
- };
- return ret;
- }
-
- function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {
- function prog(context) {
- var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
-
- var currentDepths = depths;
- if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {
- currentDepths = [context].concat(depths);
- }
-
- return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);
- }
-
- prog = executeDecorators(fn, prog, container, depths, data, blockParams);
-
- prog.program = i;
- prog.depth = depths ? depths.length : 0;
- prog.blockParams = declaredBlockParams || 0;
- return prog;
- }
-
- /**
- * This is currently part of the official API, therefore implementation details should not be changed.
- */
-
- function resolvePartial(partial, context, options) {
- if (!partial) {
- if (options.name === '@partial-block') {
- partial = options.data['partial-block'];
- } else {
- partial = options.partials[options.name];
- }
- } else if (!partial.call && !options.name) {
- // This is a dynamic partial that returned a string
- options.name = partial;
- partial = options.partials[partial];
- }
- return partial;
- }
-
- function invokePartial(partial, context, options) {
- // Use the current closure context to save the partial-block if this partial
- var currentPartialBlock = options.data && options.data['partial-block'];
- options.partial = true;
- if (options.ids) {
- options.data.contextPath = options.ids[0] || options.data.contextPath;
- }
-
- var partialBlock = undefined;
- if (options.fn && options.fn !== noop) {
- (function () {
- options.data = _base.createFrame(options.data);
- // Wrapper function to get access to currentPartialBlock from the closure
- var fn = options.fn;
- partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) {
- var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
-
- // Restore the partial-block from the closure for the execution of the block
- // i.e. the part inside the block of the partial call.
- options.data = _base.createFrame(options.data);
- options.data['partial-block'] = currentPartialBlock;
- return fn(context, options);
- };
- if (fn.partials) {
- options.partials = Utils.extend({}, options.partials, fn.partials);
- }
- })();
- }
-
- if (partial === undefined && partialBlock) {
- partial = partialBlock;
- }
-
- if (partial === undefined) {
- throw new _exception2['default']('The partial ' + options.name + ' could not be found');
- } else if (partial instanceof Function) {
- return partial(context, options);
- }
- }
-
- function noop() {
- return '';
- }
-
- function initData(context, data) {
- if (!data || !('root' in data)) {
- data = data ? _base.createFrame(data) : {};
- data.root = context;
- }
- return data;
- }
-
- function executeDecorators(fn, prog, container, depths, data, blockParams) {
- if (fn.decorator) {
- var props = {};
- prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);
- Utils.extend(prog, props);
- }
- return prog;
- }
-
- function wrapHelpersToPassLookupProperty(mergedHelpers, container) {
- _Object$keys(mergedHelpers).forEach(function (helperName) {
- var helper = mergedHelpers[helperName];
- mergedHelpers[helperName] = passLookupPropertyOption(helper, container);
- });
- }
-
- function passLookupPropertyOption(helper, container) {
- var lookupProperty = container.lookupProperty;
- return _internalWrapHelper.wrapHelper(helper, function (options) {
- return Utils.extend({ lookupProperty: lookupProperty }, options);
- });
- }
-
-/***/ }),
-/* 39 */
-/***/ (function(module, exports, __webpack_require__) {
-
- module.exports = { "default": __webpack_require__(40), __esModule: true };
-
-/***/ }),
-/* 40 */
-/***/ (function(module, exports, __webpack_require__) {
-
- __webpack_require__(41);
- module.exports = __webpack_require__(21).Object.seal;
-
-/***/ }),
-/* 41 */
-/***/ (function(module, exports, __webpack_require__) {
-
- // 19.1.2.17 Object.seal(O)
- var isObject = __webpack_require__(42);
-
- __webpack_require__(18)('seal', function($seal){
- return function seal(it){
- return $seal && isObject(it) ? $seal(it) : it;
- };
- });
-
-/***/ }),
-/* 42 */
-/***/ (function(module, exports) {
-
- module.exports = function(it){
- return typeof it === 'object' ? it !== null : typeof it === 'function';
- };
-
-/***/ }),
-/* 43 */
-/***/ (function(module, exports) {
-
- 'use strict';
-
- exports.__esModule = true;
- exports.wrapHelper = wrapHelper;
-
- function wrapHelper(helper, transformOptionsFn) {
- if (typeof helper !== 'function') {
- // This should not happen, but apparently it does in https://github.com/wycats/handlebars.js/issues/1639
- // We try to make the wrapper least-invasive by not wrapping it, if the helper is not a function.
- return helper;
- }
- var wrapper = function wrapper() /* dynamic arguments */{
- var options = arguments[arguments.length - 1];
- arguments[arguments.length - 1] = transformOptionsFn(options);
- return helper.apply(this, arguments);
- };
- return wrapper;
- }
-
-/***/ }),
-/* 44 */
-/***/ (function(module, exports) {
-
- /* WEBPACK VAR INJECTION */(function(global) {'use strict';
-
- exports.__esModule = true;
-
- exports['default'] = function (Handlebars) {
- /* istanbul ignore next */
- var root = typeof global !== 'undefined' ? global : window,
- $Handlebars = root.Handlebars;
- /* istanbul ignore next */
- Handlebars.noConflict = function () {
- if (root.Handlebars === Handlebars) {
- root.Handlebars = $Handlebars;
- }
- return Handlebars;
- };
- };
-
- module.exports = exports['default'];
- /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
-
-/***/ }),
-/* 45 */
-/***/ (function(module, exports) {
-
- 'use strict';
-
- exports.__esModule = true;
- var AST = {
- // Public API used to evaluate derived attributes regarding AST nodes
- helpers: {
- // a mustache is definitely a helper if:
- // * it is an eligible helper, and
- // * it has at least one parameter or hash segment
- helperExpression: function helperExpression(node) {
- return node.type === 'SubExpression' || (node.type === 'MustacheStatement' || node.type === 'BlockStatement') && !!(node.params && node.params.length || node.hash);
- },
-
- scopedId: function scopedId(path) {
- return (/^\.|this\b/.test(path.original)
- );
- },
-
- // an ID is simple if it only has one part, and that part is not
- // `..` or `this`.
- simpleId: function simpleId(path) {
- return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth;
- }
- }
- };
-
- // Must be exported as an object rather than the root of the module as the jison lexer
- // must modify the object to operate properly.
- exports['default'] = AST;
- module.exports = exports['default'];
-
-/***/ }),
-/* 46 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- var _interopRequireWildcard = __webpack_require__(3)['default'];
-
- exports.__esModule = true;
- exports.parseWithoutProcessing = parseWithoutProcessing;
- exports.parse = parse;
-
- var _parser = __webpack_require__(47);
-
- var _parser2 = _interopRequireDefault(_parser);
-
- var _whitespaceControl = __webpack_require__(48);
-
- var _whitespaceControl2 = _interopRequireDefault(_whitespaceControl);
-
- var _helpers = __webpack_require__(50);
-
- var Helpers = _interopRequireWildcard(_helpers);
-
- var _utils = __webpack_require__(5);
-
- exports.parser = _parser2['default'];
-
- var yy = {};
- _utils.extend(yy, Helpers);
-
- function parseWithoutProcessing(input, options) {
- // Just return if an already-compiled AST was passed in.
- if (input.type === 'Program') {
- return input;
- }
-
- _parser2['default'].yy = yy;
-
- // Altering the shared object here, but this is ok as parser is a sync operation
- yy.locInfo = function (locInfo) {
- return new yy.SourceLocation(options && options.srcName, locInfo);
- };
-
- var ast = _parser2['default'].parse(input);
-
- return ast;
- }
-
- function parse(input, options) {
- var ast = parseWithoutProcessing(input, options);
- var strip = new _whitespaceControl2['default'](options);
-
- return strip.accept(ast);
- }
-
-/***/ }),
-/* 47 */
-/***/ (function(module, exports) {
-
- // File ignored in coverage tests via setting in .istanbul.yml
- /* Jison generated parser */
- "use strict";
-
- exports.__esModule = true;
- var handlebars = (function () {
- var parser = { trace: function trace() {},
- yy: {},
- symbols_: { "error": 2, "root": 3, "program": 4, "EOF": 5, "program_repetition0": 6, "statement": 7, "mustache": 8, "block": 9, "rawBlock": 10, "partial": 11, "partialBlock": 12, "content": 13, "COMMENT": 14, "CONTENT": 15, "openRawBlock": 16, "rawBlock_repetition0": 17, "END_RAW_BLOCK": 18, "OPEN_RAW_BLOCK": 19, "helperName": 20, "openRawBlock_repetition0": 21, "openRawBlock_option0": 22, "CLOSE_RAW_BLOCK": 23, "openBlock": 24, "block_option0": 25, "closeBlock": 26, "openInverse": 27, "block_option1": 28, "OPEN_BLOCK": 29, "openBlock_repetition0": 30, "openBlock_option0": 31, "openBlock_option1": 32, "CLOSE": 33, "OPEN_INVERSE": 34, "openInverse_repetition0": 35, "openInverse_option0": 36, "openInverse_option1": 37, "openInverseChain": 38, "OPEN_INVERSE_CHAIN": 39, "openInverseChain_repetition0": 40, "openInverseChain_option0": 41, "openInverseChain_option1": 42, "inverseAndProgram": 43, "INVERSE": 44, "inverseChain": 45, "inverseChain_option0": 46, "OPEN_ENDBLOCK": 47, "OPEN": 48, "mustache_repetition0": 49, "mustache_option0": 50, "OPEN_UNESCAPED": 51, "mustache_repetition1": 52, "mustache_option1": 53, "CLOSE_UNESCAPED": 54, "OPEN_PARTIAL": 55, "partialName": 56, "partial_repetition0": 57, "partial_option0": 58, "openPartialBlock": 59, "OPEN_PARTIAL_BLOCK": 60, "openPartialBlock_repetition0": 61, "openPartialBlock_option0": 62, "param": 63, "sexpr": 64, "OPEN_SEXPR": 65, "sexpr_repetition0": 66, "sexpr_option0": 67, "CLOSE_SEXPR": 68, "hash": 69, "hash_repetition_plus0": 70, "hashSegment": 71, "ID": 72, "EQUALS": 73, "blockParams": 74, "OPEN_BLOCK_PARAMS": 75, "blockParams_repetition_plus0": 76, "CLOSE_BLOCK_PARAMS": 77, "path": 78, "dataName": 79, "STRING": 80, "NUMBER": 81, "BOOLEAN": 82, "UNDEFINED": 83, "NULL": 84, "DATA": 85, "pathSegments": 86, "SEP": 87, "$accept": 0, "$end": 1 },
- terminals_: { 2: "error", 5: "EOF", 14: "COMMENT", 15: "CONTENT", 18: "END_RAW_BLOCK", 19: "OPEN_RAW_BLOCK", 23: "CLOSE_RAW_BLOCK", 29: "OPEN_BLOCK", 33: "CLOSE", 34: "OPEN_INVERSE", 39: "OPEN_INVERSE_CHAIN", 44: "INVERSE", 47: "OPEN_ENDBLOCK", 48: "OPEN", 51: "OPEN_UNESCAPED", 54: "CLOSE_UNESCAPED", 55: "OPEN_PARTIAL", 60: "OPEN_PARTIAL_BLOCK", 65: "OPEN_SEXPR", 68: "CLOSE_SEXPR", 72: "ID", 73: "EQUALS", 75: "OPEN_BLOCK_PARAMS", 77: "CLOSE_BLOCK_PARAMS", 80: "STRING", 81: "NUMBER", 82: "BOOLEAN", 83: "UNDEFINED", 84: "NULL", 85: "DATA", 87: "SEP" },
- productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 0], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]],
- performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {
-
- var $0 = $$.length - 1;
- switch (yystate) {
- case 1:
- return $$[$0 - 1];
- break;
- case 2:
- this.$ = yy.prepareProgram($$[$0]);
- break;
- case 3:
- this.$ = $$[$0];
- break;
- case 4:
- this.$ = $$[$0];
- break;
- case 5:
- this.$ = $$[$0];
- break;
- case 6:
- this.$ = $$[$0];
- break;
- case 7:
- this.$ = $$[$0];
- break;
- case 8:
- this.$ = $$[$0];
- break;
- case 9:
- this.$ = {
- type: 'CommentStatement',
- value: yy.stripComment($$[$0]),
- strip: yy.stripFlags($$[$0], $$[$0]),
- loc: yy.locInfo(this._$)
- };
-
- break;
- case 10:
- this.$ = {
- type: 'ContentStatement',
- original: $$[$0],
- value: $$[$0],
- loc: yy.locInfo(this._$)
- };
-
- break;
- case 11:
- this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);
- break;
- case 12:
- this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] };
- break;
- case 13:
- this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$);
- break;
- case 14:
- this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$);
- break;
- case 15:
- this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
- break;
- case 16:
- this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
- break;
- case 17:
- this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
- break;
- case 18:
- this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] };
- break;
- case 19:
- var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$),
- program = yy.prepareProgram([inverse], $$[$0 - 1].loc);
- program.chained = true;
-
- this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true };
-
- break;
- case 20:
- this.$ = $$[$0];
- break;
- case 21:
- this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) };
- break;
- case 22:
- this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);
- break;
- case 23:
- this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);
- break;
- case 24:
- this.$ = {
- type: 'PartialStatement',
- name: $$[$0 - 3],
- params: $$[$0 - 2],
- hash: $$[$0 - 1],
- indent: '',
- strip: yy.stripFlags($$[$0 - 4], $$[$0]),
- loc: yy.locInfo(this._$)
- };
-
- break;
- case 25:
- this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);
- break;
- case 26:
- this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) };
- break;
- case 27:
- this.$ = $$[$0];
- break;
- case 28:
- this.$ = $$[$0];
- break;
- case 29:
- this.$ = {
- type: 'SubExpression',
- path: $$[$0 - 3],
- params: $$[$0 - 2],
- hash: $$[$0 - 1],
- loc: yy.locInfo(this._$)
- };
-
- break;
- case 30:
- this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) };
- break;
- case 31:
- this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) };
- break;
- case 32:
- this.$ = yy.id($$[$0 - 1]);
- break;
- case 33:
- this.$ = $$[$0];
- break;
- case 34:
- this.$ = $$[$0];
- break;
- case 35:
- this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) };
- break;
- case 36:
- this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
- break;
- case 37:
- this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) };
- break;
- case 38:
- this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) };
- break;
- case 39:
- this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) };
- break;
- case 40:
- this.$ = $$[$0];
- break;
- case 41:
- this.$ = $$[$0];
- break;
- case 42:
- this.$ = yy.preparePath(true, $$[$0], this._$);
- break;
- case 43:
- this.$ = yy.preparePath(false, $$[$0], this._$);
- break;
- case 44:
- $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2];
- break;
- case 45:
- this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }];
- break;
- case 46:
- this.$ = [];
- break;
- case 47:
- $$[$0 - 1].push($$[$0]);
- break;
- case 48:
- this.$ = [];
- break;
- case 49:
- $$[$0 - 1].push($$[$0]);
- break;
- case 50:
- this.$ = [];
- break;
- case 51:
- $$[$0 - 1].push($$[$0]);
- break;
- case 58:
- this.$ = [];
- break;
- case 59:
- $$[$0 - 1].push($$[$0]);
- break;
- case 64:
- this.$ = [];
- break;
- case 65:
- $$[$0 - 1].push($$[$0]);
- break;
- case 70:
- this.$ = [];
- break;
- case 71:
- $$[$0 - 1].push($$[$0]);
- break;
- case 78:
- this.$ = [];
- break;
- case 79:
- $$[$0 - 1].push($$[$0]);
- break;
- case 82:
- this.$ = [];
- break;
- case 83:
- $$[$0 - 1].push($$[$0]);
- break;
- case 86:
- this.$ = [];
- break;
- case 87:
- $$[$0 - 1].push($$[$0]);
- break;
- case 90:
- this.$ = [];
- break;
- case 91:
- $$[$0 - 1].push($$[$0]);
- break;
- case 94:
- this.$ = [];
- break;
- case 95:
- $$[$0 - 1].push($$[$0]);
- break;
- case 98:
- this.$ = [$$[$0]];
- break;
- case 99:
- $$[$0 - 1].push($$[$0]);
- break;
- case 100:
- this.$ = [$$[$0]];
- break;
- case 101:
- $$[$0 - 1].push($$[$0]);
- break;
- }
- },
- table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 15: [2, 48], 17: 39, 18: [2, 48] }, { 20: 41, 56: 40, 64: 42, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 44, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 45, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 41, 56: 48, 64: 42, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 49, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 50] }, { 72: [1, 35], 86: 51 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 52, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 53, 38: 55, 39: [1, 57], 43: 56, 44: [1, 58], 45: 54, 47: [2, 54] }, { 28: 59, 43: 60, 44: [1, 58], 47: [2, 56] }, { 13: 62, 15: [1, 20], 18: [1, 61] }, { 33: [2, 86], 57: 63, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 64, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 65, 47: [1, 66] }, { 30: 67, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 68, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 69, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 70, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 74, 33: [2, 80], 50: 71, 63: 72, 64: 75, 65: [1, 43], 69: 73, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 79] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 50] }, { 20: 74, 53: 80, 54: [2, 84], 63: 81, 64: 75, 65: [1, 43], 69: 82, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 83, 47: [1, 66] }, { 47: [2, 55] }, { 4: 84, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 85, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 86, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 87, 47: [1, 66] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 74, 33: [2, 88], 58: 88, 63: 89, 64: 75, 65: [1, 43], 69: 90, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 91, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 92, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 31: 93, 33: [2, 60], 63: 94, 64: 75, 65: [1, 43], 69: 95, 70: 76, 71: 77, 72: [1, 78], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 33: [2, 66], 36: 96, 63: 97, 64: 75, 65: [1, 43], 69: 98, 70: 76, 71: 77, 72: [1, 78], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 22: 99, 23: [2, 52], 63: 100, 64: 75, 65: [1, 43], 69: 101, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 33: [2, 92], 62: 102, 63: 103, 64: 75, 65: [1, 43], 69: 104, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 105] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 106, 72: [1, 107], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 108], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 109] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 55, 39: [1, 57], 43: 56, 44: [1, 58], 45: 111, 46: 110, 47: [2, 76] }, { 33: [2, 70], 40: 112, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 113] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 74, 63: 115, 64: 75, 65: [1, 43], 67: 114, 68: [2, 96], 69: 116, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 117] }, { 32: 118, 33: [2, 62], 74: 119, 75: [1, 120] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 121, 74: 122, 75: [1, 120] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 123] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 124] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 108] }, { 20: 74, 63: 125, 64: 75, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 74, 33: [2, 72], 41: 126, 63: 127, 64: 75, 65: [1, 43], 69: 128, 70: 76, 71: 77, 72: [1, 78], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 129] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 130] }, { 33: [2, 63] }, { 72: [1, 132], 76: 131 }, { 33: [1, 133] }, { 33: [2, 69] }, { 15: [2, 12], 18: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 134, 74: 135, 75: [1, 120] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 137], 77: [1, 136] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 138] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }],
- defaultActions: { 4: [2, 1], 54: [2, 55], 56: [2, 20], 60: [2, 57], 73: [2, 81], 82: [2, 85], 86: [2, 18], 90: [2, 89], 101: [2, 53], 104: [2, 93], 110: [2, 19], 111: [2, 77], 116: [2, 97], 119: [2, 63], 122: [2, 69], 135: [2, 75], 136: [2, 32] },
- parseError: function parseError(str, hash) {
- throw new Error(str);
- },
- parse: function parse(input) {
- var self = this,
- stack = [0],
- vstack = [null],
- lstack = [],
- table = this.table,
- yytext = "",
- yylineno = 0,
- yyleng = 0,
- recovering = 0,
- TERROR = 2,
- EOF = 1;
- this.lexer.setInput(input);
- this.lexer.yy = this.yy;
- this.yy.lexer = this.lexer;
- this.yy.parser = this;
- if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {};
- var yyloc = this.lexer.yylloc;
- lstack.push(yyloc);
- var ranges = this.lexer.options && this.lexer.options.ranges;
- if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError;
- function popStack(n) {
- stack.length = stack.length - 2 * n;
- vstack.length = vstack.length - n;
- lstack.length = lstack.length - n;
- }
- function lex() {
- var token;
- token = self.lexer.lex() || 1;
- if (typeof token !== "number") {
- token = self.symbols_[token] || token;
- }
- return token;
- }
- var symbol,
- preErrorSymbol,
- state,
- action,
- a,
- r,
- yyval = {},
- p,
- len,
- newState,
- expected;
- while (true) {
- state = stack[stack.length - 1];
- if (this.defaultActions[state]) {
- action = this.defaultActions[state];
- } else {
- if (symbol === null || typeof symbol == "undefined") {
- symbol = lex();
- }
- action = table[state] && table[state][symbol];
- }
- if (typeof action === "undefined" || !action.length || !action[0]) {
- var errStr = "";
- if (!recovering) {
- expected = [];
- for (p in table[state]) if (this.terminals_[p] && p > 2) {
- expected.push("'" + this.terminals_[p] + "'");
- }
- if (this.lexer.showPosition) {
- errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
- } else {
- errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'");
- }
- this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected });
- }
- }
- if (action[0] instanceof Array && action.length > 1) {
- throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
- }
- switch (action[0]) {
- case 1:
- stack.push(symbol);
- vstack.push(this.lexer.yytext);
- lstack.push(this.lexer.yylloc);
- stack.push(action[1]);
- symbol = null;
- if (!preErrorSymbol) {
- yyleng = this.lexer.yyleng;
- yytext = this.lexer.yytext;
- yylineno = this.lexer.yylineno;
- yyloc = this.lexer.yylloc;
- if (recovering > 0) recovering--;
- } else {
- symbol = preErrorSymbol;
- preErrorSymbol = null;
- }
- break;
- case 2:
- len = this.productions_[action[1]][1];
- yyval.$ = vstack[vstack.length - len];
- yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column };
- if (ranges) {
- yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
- }
- r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
- if (typeof r !== "undefined") {
- return r;
- }
- if (len) {
- stack = stack.slice(0, -1 * len * 2);
- vstack = vstack.slice(0, -1 * len);
- lstack = lstack.slice(0, -1 * len);
- }
- stack.push(this.productions_[action[1]][0]);
- vstack.push(yyval.$);
- lstack.push(yyval._$);
- newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
- stack.push(newState);
- break;
- case 3:
- return true;
- }
- }
- return true;
- }
- };
- /* Jison generated lexer */
- var lexer = (function () {
- var lexer = { EOF: 1,
- parseError: function parseError(str, hash) {
- if (this.yy.parser) {
- this.yy.parser.parseError(str, hash);
- } else {
- throw new Error(str);
- }
- },
- setInput: function setInput(input) {
- this._input = input;
- this._more = this._less = this.done = false;
- this.yylineno = this.yyleng = 0;
- this.yytext = this.matched = this.match = '';
- this.conditionStack = ['INITIAL'];
- this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 };
- if (this.options.ranges) this.yylloc.range = [0, 0];
- this.offset = 0;
- return this;
- },
- input: function input() {
- var ch = this._input[0];
- this.yytext += ch;
- this.yyleng++;
- this.offset++;
- this.match += ch;
- this.matched += ch;
- var lines = ch.match(/(?:\r\n?|\n).*/g);
- if (lines) {
- this.yylineno++;
- this.yylloc.last_line++;
- } else {
- this.yylloc.last_column++;
- }
- if (this.options.ranges) this.yylloc.range[1]++;
-
- this._input = this._input.slice(1);
- return ch;
- },
- unput: function unput(ch) {
- var len = ch.length;
- var lines = ch.split(/(?:\r\n?|\n)/g);
-
- this._input = ch + this._input;
- this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);
- //this.yyleng -= len;
- this.offset -= len;
- var oldLines = this.match.split(/(?:\r\n?|\n)/g);
- this.match = this.match.substr(0, this.match.length - 1);
- this.matched = this.matched.substr(0, this.matched.length - 1);
-
- if (lines.length - 1) this.yylineno -= lines.length - 1;
- var r = this.yylloc.range;
-
- this.yylloc = { first_line: this.yylloc.first_line,
- last_line: this.yylineno + 1,
- first_column: this.yylloc.first_column,
- last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len
- };
-
- if (this.options.ranges) {
- this.yylloc.range = [r[0], r[0] + this.yyleng - len];
- }
- return this;
- },
- more: function more() {
- this._more = true;
- return this;
- },
- less: function less(n) {
- this.unput(this.match.slice(n));
- },
- pastInput: function pastInput() {
- var past = this.matched.substr(0, this.matched.length - this.match.length);
- return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, "");
- },
- upcomingInput: function upcomingInput() {
- var next = this.match;
- if (next.length < 20) {
- next += this._input.substr(0, 20 - next.length);
- }
- return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
- },
- showPosition: function showPosition() {
- var pre = this.pastInput();
- var c = new Array(pre.length + 1).join("-");
- return pre + this.upcomingInput() + "\n" + c + "^";
- },
- next: function next() {
- if (this.done) {
- return this.EOF;
- }
- if (!this._input) this.done = true;
-
- var token, match, tempMatch, index, col, lines;
- if (!this._more) {
- this.yytext = '';
- this.match = '';
- }
- var rules = this._currentRules();
- for (var i = 0; i < rules.length; i++) {
- tempMatch = this._input.match(this.rules[rules[i]]);
- if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
- match = tempMatch;
- index = i;
- if (!this.options.flex) break;
- }
- }
- if (match) {
- lines = match[0].match(/(?:\r\n?|\n).*/g);
- if (lines) this.yylineno += lines.length;
- this.yylloc = { first_line: this.yylloc.last_line,
- last_line: this.yylineno + 1,
- first_column: this.yylloc.last_column,
- last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length };
- this.yytext += match[0];
- this.match += match[0];
- this.matches = match;
- this.yyleng = this.yytext.length;
- if (this.options.ranges) {
- this.yylloc.range = [this.offset, this.offset += this.yyleng];
- }
- this._more = false;
- this._input = this._input.slice(match[0].length);
- this.matched += match[0];
- token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]);
- if (this.done && this._input) this.done = false;
- if (token) return token;else return;
- }
- if (this._input === "") {
- return this.EOF;
- } else {
- return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { text: "", token: null, line: this.yylineno });
- }
- },
- lex: function lex() {
- var r = this.next();
- if (typeof r !== 'undefined') {
- return r;
- } else {
- return this.lex();
- }
- },
- begin: function begin(condition) {
- this.conditionStack.push(condition);
- },
- popState: function popState() {
- return this.conditionStack.pop();
- },
- _currentRules: function _currentRules() {
- return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
- },
- topState: function topState() {
- return this.conditionStack[this.conditionStack.length - 2];
- },
- pushState: function begin(condition) {
- this.begin(condition);
- } };
- lexer.options = {};
- lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {
-
- function strip(start, end) {
- return yy_.yytext = yy_.yytext.substring(start, yy_.yyleng - end + start);
- }
-
- var YYSTATE = YY_START;
- switch ($avoiding_name_collisions) {
- case 0:
- if (yy_.yytext.slice(-2) === "\\\\") {
- strip(0, 1);
- this.begin("mu");
- } else if (yy_.yytext.slice(-1) === "\\") {
- strip(0, 1);
- this.begin("emu");
- } else {
- this.begin("mu");
- }
- if (yy_.yytext) return 15;
-
- break;
- case 1:
- return 15;
- break;
- case 2:
- this.popState();
- return 15;
-
- break;
- case 3:
- this.begin('raw');return 15;
- break;
- case 4:
- this.popState();
- // Should be using `this.topState()` below, but it currently
- // returns the second top instead of the first top. Opened an
- // issue about it at https://github.com/zaach/jison/issues/291
- if (this.conditionStack[this.conditionStack.length - 1] === 'raw') {
- return 15;
- } else {
- strip(5, 9);
- return 'END_RAW_BLOCK';
- }
-
- break;
- case 5:
- return 15;
- break;
- case 6:
- this.popState();
- return 14;
-
- break;
- case 7:
- return 65;
- break;
- case 8:
- return 68;
- break;
- case 9:
- return 19;
- break;
- case 10:
- this.popState();
- this.begin('raw');
- return 23;
-
- break;
- case 11:
- return 55;
- break;
- case 12:
- return 60;
- break;
- case 13:
- return 29;
- break;
- case 14:
- return 47;
- break;
- case 15:
- this.popState();return 44;
- break;
- case 16:
- this.popState();return 44;
- break;
- case 17:
- return 34;
- break;
- case 18:
- return 39;
- break;
- case 19:
- return 51;
- break;
- case 20:
- return 48;
- break;
- case 21:
- this.unput(yy_.yytext);
- this.popState();
- this.begin('com');
-
- break;
- case 22:
- this.popState();
- return 14;
-
- break;
- case 23:
- return 48;
- break;
- case 24:
- return 73;
- break;
- case 25:
- return 72;
- break;
- case 26:
- return 72;
- break;
- case 27:
- return 87;
- break;
- case 28:
- // ignore whitespace
- break;
- case 29:
- this.popState();return 54;
- break;
- case 30:
- this.popState();return 33;
- break;
- case 31:
- yy_.yytext = strip(1, 2).replace(/\\"/g, '"');return 80;
- break;
- case 32:
- yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 80;
- break;
- case 33:
- return 85;
- break;
- case 34:
- return 82;
- break;
- case 35:
- return 82;
- break;
- case 36:
- return 83;
- break;
- case 37:
- return 84;
- break;
- case 38:
- return 81;
- break;
- case 39:
- return 75;
- break;
- case 40:
- return 77;
- break;
- case 41:
- return 72;
- break;
- case 42:
- yy_.yytext = yy_.yytext.replace(/\\([\\\]])/g, '$1');return 72;
- break;
- case 43:
- return 'INVALID';
- break;
- case 44:
- return 5;
- break;
- }
- };
- lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{(?=[^\/]))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]+?(?=(\{\{\{\{)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#>)/, /^(?:\{\{(~)?#\*?)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?\*?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[(\\\]|[^\]])*\])/, /^(?:.)/, /^(?:$)/];
- lexer.conditions = { "mu": { "rules": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "inclusive": false }, "emu": { "rules": [2], "inclusive": false }, "com": { "rules": [6], "inclusive": false }, "raw": { "rules": [3, 4, 5], "inclusive": false }, "INITIAL": { "rules": [0, 1, 44], "inclusive": true } };
- return lexer;
- })();
- parser.lexer = lexer;
- function Parser() {
- this.yy = {};
- }Parser.prototype = parser;parser.Parser = Parser;
- return new Parser();
- })();exports["default"] = handlebars;
- module.exports = exports["default"];
-
-/***/ }),
-/* 48 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
-
- var _visitor = __webpack_require__(49);
-
- var _visitor2 = _interopRequireDefault(_visitor);
-
- function WhitespaceControl() {
- var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
-
- this.options = options;
- }
- WhitespaceControl.prototype = new _visitor2['default']();
-
- WhitespaceControl.prototype.Program = function (program) {
- var doStandalone = !this.options.ignoreStandalone;
-
- var isRoot = !this.isRootSeen;
- this.isRootSeen = true;
-
- var body = program.body;
- for (var i = 0, l = body.length; i < l; i++) {
- var current = body[i],
- strip = this.accept(current);
-
- if (!strip) {
- continue;
- }
-
- var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot),
- _isNextWhitespace = isNextWhitespace(body, i, isRoot),
- openStandalone = strip.openStandalone && _isPrevWhitespace,
- closeStandalone = strip.closeStandalone && _isNextWhitespace,
- inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;
-
- if (strip.close) {
- omitRight(body, i, true);
- }
- if (strip.open) {
- omitLeft(body, i, true);
- }
-
- if (doStandalone && inlineStandalone) {
- omitRight(body, i);
-
- if (omitLeft(body, i)) {
- // If we are on a standalone node, save the indent info for partials
- if (current.type === 'PartialStatement') {
- // Pull out the whitespace from the final line
- current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1];
- }
- }
- }
- if (doStandalone && openStandalone) {
- omitRight((current.program || current.inverse).body);
-
- // Strip out the previous content node if it's whitespace only
- omitLeft(body, i);
- }
- if (doStandalone && closeStandalone) {
- // Always strip the next node
- omitRight(body, i);
-
- omitLeft((current.inverse || current.program).body);
- }
- }
-
- return program;
- };
-
- WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) {
- this.accept(block.program);
- this.accept(block.inverse);
-
- // Find the inverse program that is involed with whitespace stripping.
- var program = block.program || block.inverse,
- inverse = block.program && block.inverse,
- firstInverse = inverse,
- lastInverse = inverse;
-
- if (inverse && inverse.chained) {
- firstInverse = inverse.body[0].program;
-
- // Walk the inverse chain to find the last inverse that is actually in the chain.
- while (lastInverse.chained) {
- lastInverse = lastInverse.body[lastInverse.body.length - 1].program;
- }
- }
-
- var strip = {
- open: block.openStrip.open,
- close: block.closeStrip.close,
-
- // Determine the standalone candiacy. Basically flag our content as being possibly standalone
- // so our parent can determine if we actually are standalone
- openStandalone: isNextWhitespace(program.body),
- closeStandalone: isPrevWhitespace((firstInverse || program).body)
- };
-
- if (block.openStrip.close) {
- omitRight(program.body, null, true);
- }
-
- if (inverse) {
- var inverseStrip = block.inverseStrip;
-
- if (inverseStrip.open) {
- omitLeft(program.body, null, true);
- }
-
- if (inverseStrip.close) {
- omitRight(firstInverse.body, null, true);
- }
- if (block.closeStrip.open) {
- omitLeft(lastInverse.body, null, true);
- }
-
- // Find standalone else statments
- if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) {
- omitLeft(program.body);
- omitRight(firstInverse.body);
- }
- } else if (block.closeStrip.open) {
- omitLeft(program.body, null, true);
- }
-
- return strip;
- };
-
- WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) {
- return mustache.strip;
- };
-
- WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) {
- /* istanbul ignore next */
- var strip = node.strip || {};
- return {
- inlineStandalone: true,
- open: strip.open,
- close: strip.close
- };
- };
-
- function isPrevWhitespace(body, i, isRoot) {
- if (i === undefined) {
- i = body.length;
- }
-
- // Nodes that end with newlines are considered whitespace (but are special
- // cased for strip operations)
- var prev = body[i - 1],
- sibling = body[i - 2];
- if (!prev) {
- return isRoot;
- }
-
- if (prev.type === 'ContentStatement') {
- return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original);
- }
- }
- function isNextWhitespace(body, i, isRoot) {
- if (i === undefined) {
- i = -1;
- }
-
- var next = body[i + 1],
- sibling = body[i + 2];
- if (!next) {
- return isRoot;
- }
-
- if (next.type === 'ContentStatement') {
- return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original);
- }
- }
-
- // Marks the node to the right of the position as omitted.
- // I.e. {{foo}}' ' will mark the ' ' node as omitted.
- //
- // If i is undefined, then the first child will be marked as such.
- //
- // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
- // content is met.
- function omitRight(body, i, multiple) {
- var current = body[i == null ? 0 : i + 1];
- if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) {
- return;
- }
-
- var original = current.value;
- current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, '');
- current.rightStripped = current.value !== original;
- }
-
- // Marks the node to the left of the position as omitted.
- // I.e. ' '{{foo}} will mark the ' ' node as omitted.
- //
- // If i is undefined then the last child will be marked as such.
- //
- // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
- // content is met.
- function omitLeft(body, i, multiple) {
- var current = body[i == null ? body.length - 1 : i - 1];
- if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) {
- return;
- }
-
- // We omit the last node if it's whitespace only and not preceded by a non-content node.
- var original = current.value;
- current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, '');
- current.leftStripped = current.value !== original;
- return current.leftStripped;
- }
-
- exports['default'] = WhitespaceControl;
- module.exports = exports['default'];
-
-/***/ }),
-/* 49 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- function Visitor() {
- this.parents = [];
- }
-
- Visitor.prototype = {
- constructor: Visitor,
- mutating: false,
-
- // Visits a given value. If mutating, will replace the value if necessary.
- acceptKey: function acceptKey(node, name) {
- var value = this.accept(node[name]);
- if (this.mutating) {
- // Hacky sanity check: This may have a few false positives for type for the helper
- // methods but will generally do the right thing without a lot of overhead.
- if (value && !Visitor.prototype[value.type]) {
- throw new _exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type);
- }
- node[name] = value;
- }
- },
-
- // Performs an accept operation with added sanity check to ensure
- // required keys are not removed.
- acceptRequired: function acceptRequired(node, name) {
- this.acceptKey(node, name);
-
- if (!node[name]) {
- throw new _exception2['default'](node.type + ' requires ' + name);
- }
- },
-
- // Traverses a given array. If mutating, empty respnses will be removed
- // for child elements.
- acceptArray: function acceptArray(array) {
- for (var i = 0, l = array.length; i < l; i++) {
- this.acceptKey(array, i);
-
- if (!array[i]) {
- array.splice(i, 1);
- i--;
- l--;
- }
- }
- },
-
- accept: function accept(object) {
- if (!object) {
- return;
- }
-
- /* istanbul ignore next: Sanity code */
- if (!this[object.type]) {
- throw new _exception2['default']('Unknown type: ' + object.type, object);
- }
-
- if (this.current) {
- this.parents.unshift(this.current);
- }
- this.current = object;
-
- var ret = this[object.type](object);
-
- this.current = this.parents.shift();
-
- if (!this.mutating || ret) {
- return ret;
- } else if (ret !== false) {
- return object;
- }
- },
-
- Program: function Program(program) {
- this.acceptArray(program.body);
- },
-
- MustacheStatement: visitSubExpression,
- Decorator: visitSubExpression,
-
- BlockStatement: visitBlock,
- DecoratorBlock: visitBlock,
-
- PartialStatement: visitPartial,
- PartialBlockStatement: function PartialBlockStatement(partial) {
- visitPartial.call(this, partial);
-
- this.acceptKey(partial, 'program');
- },
-
- ContentStatement: function ContentStatement() /* content */{},
- CommentStatement: function CommentStatement() /* comment */{},
-
- SubExpression: visitSubExpression,
-
- PathExpression: function PathExpression() /* path */{},
-
- StringLiteral: function StringLiteral() /* string */{},
- NumberLiteral: function NumberLiteral() /* number */{},
- BooleanLiteral: function BooleanLiteral() /* bool */{},
- UndefinedLiteral: function UndefinedLiteral() /* literal */{},
- NullLiteral: function NullLiteral() /* literal */{},
-
- Hash: function Hash(hash) {
- this.acceptArray(hash.pairs);
- },
- HashPair: function HashPair(pair) {
- this.acceptRequired(pair, 'value');
- }
- };
-
- function visitSubExpression(mustache) {
- this.acceptRequired(mustache, 'path');
- this.acceptArray(mustache.params);
- this.acceptKey(mustache, 'hash');
- }
- function visitBlock(block) {
- visitSubExpression.call(this, block);
-
- this.acceptKey(block, 'program');
- this.acceptKey(block, 'inverse');
- }
- function visitPartial(partial) {
- this.acceptRequired(partial, 'name');
- this.acceptArray(partial.params);
- this.acceptKey(partial, 'hash');
- }
-
- exports['default'] = Visitor;
- module.exports = exports['default'];
-
-/***/ }),
-/* 50 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
- exports.SourceLocation = SourceLocation;
- exports.id = id;
- exports.stripFlags = stripFlags;
- exports.stripComment = stripComment;
- exports.preparePath = preparePath;
- exports.prepareMustache = prepareMustache;
- exports.prepareRawBlock = prepareRawBlock;
- exports.prepareBlock = prepareBlock;
- exports.prepareProgram = prepareProgram;
- exports.preparePartialBlock = preparePartialBlock;
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- function validateClose(open, close) {
- close = close.path ? close.path.original : close;
-
- if (open.path.original !== close) {
- var errorNode = { loc: open.path.loc };
-
- throw new _exception2['default'](open.path.original + " doesn't match " + close, errorNode);
- }
- }
-
- function SourceLocation(source, locInfo) {
- this.source = source;
- this.start = {
- line: locInfo.first_line,
- column: locInfo.first_column
- };
- this.end = {
- line: locInfo.last_line,
- column: locInfo.last_column
- };
- }
-
- function id(token) {
- if (/^\[.*\]$/.test(token)) {
- return token.substring(1, token.length - 1);
- } else {
- return token;
- }
- }
-
- function stripFlags(open, close) {
- return {
- open: open.charAt(2) === '~',
- close: close.charAt(close.length - 3) === '~'
- };
- }
-
- function stripComment(comment) {
- return comment.replace(/^\{\{~?!-?-?/, '').replace(/-?-?~?\}\}$/, '');
- }
-
- function preparePath(data, parts, loc) {
- loc = this.locInfo(loc);
-
- var original = data ? '@' : '',
- dig = [],
- depth = 0;
-
- for (var i = 0, l = parts.length; i < l; i++) {
- var part = parts[i].part,
-
- // If we have [] syntax then we do not treat path references as operators,
- // i.e. foo.[this] resolves to approximately context.foo['this']
- isLiteral = parts[i].original !== part;
- original += (parts[i].separator || '') + part;
-
- if (!isLiteral && (part === '..' || part === '.' || part === 'this')) {
- if (dig.length > 0) {
- throw new _exception2['default']('Invalid path: ' + original, { loc: loc });
- } else if (part === '..') {
- depth++;
- }
- } else {
- dig.push(part);
- }
- }
-
- return {
- type: 'PathExpression',
- data: data,
- depth: depth,
- parts: dig,
- original: original,
- loc: loc
- };
- }
-
- function prepareMustache(path, params, hash, open, strip, locInfo) {
- // Must use charAt to support IE pre-10
- var escapeFlag = open.charAt(3) || open.charAt(2),
- escaped = escapeFlag !== '{' && escapeFlag !== '&';
-
- var decorator = /\*/.test(open);
- return {
- type: decorator ? 'Decorator' : 'MustacheStatement',
- path: path,
- params: params,
- hash: hash,
- escaped: escaped,
- strip: strip,
- loc: this.locInfo(locInfo)
- };
- }
-
- function prepareRawBlock(openRawBlock, contents, close, locInfo) {
- validateClose(openRawBlock, close);
-
- locInfo = this.locInfo(locInfo);
- var program = {
- type: 'Program',
- body: contents,
- strip: {},
- loc: locInfo
- };
-
- return {
- type: 'BlockStatement',
- path: openRawBlock.path,
- params: openRawBlock.params,
- hash: openRawBlock.hash,
- program: program,
- openStrip: {},
- inverseStrip: {},
- closeStrip: {},
- loc: locInfo
- };
- }
-
- function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {
- if (close && close.path) {
- validateClose(openBlock, close);
- }
-
- var decorator = /\*/.test(openBlock.open);
-
- program.blockParams = openBlock.blockParams;
-
- var inverse = undefined,
- inverseStrip = undefined;
-
- if (inverseAndProgram) {
- if (decorator) {
- throw new _exception2['default']('Unexpected inverse block on decorator', inverseAndProgram);
- }
-
- if (inverseAndProgram.chain) {
- inverseAndProgram.program.body[0].closeStrip = close.strip;
- }
-
- inverseStrip = inverseAndProgram.strip;
- inverse = inverseAndProgram.program;
- }
-
- if (inverted) {
- inverted = inverse;
- inverse = program;
- program = inverted;
- }
-
- return {
- type: decorator ? 'DecoratorBlock' : 'BlockStatement',
- path: openBlock.path,
- params: openBlock.params,
- hash: openBlock.hash,
- program: program,
- inverse: inverse,
- openStrip: openBlock.strip,
- inverseStrip: inverseStrip,
- closeStrip: close && close.strip,
- loc: this.locInfo(locInfo)
- };
- }
-
- function prepareProgram(statements, loc) {
- if (!loc && statements.length) {
- var firstLoc = statements[0].loc,
- lastLoc = statements[statements.length - 1].loc;
-
- /* istanbul ignore else */
- if (firstLoc && lastLoc) {
- loc = {
- source: firstLoc.source,
- start: {
- line: firstLoc.start.line,
- column: firstLoc.start.column
- },
- end: {
- line: lastLoc.end.line,
- column: lastLoc.end.column
- }
- };
- }
- }
-
- return {
- type: 'Program',
- body: statements,
- strip: {},
- loc: loc
- };
- }
-
- function preparePartialBlock(open, program, close, locInfo) {
- validateClose(open, close);
-
- return {
- type: 'PartialBlockStatement',
- name: open.path,
- params: open.params,
- hash: open.hash,
- program: program,
- openStrip: open.strip,
- closeStrip: close && close.strip,
- loc: this.locInfo(locInfo)
- };
- }
-
-/***/ }),
-/* 51 */
-/***/ (function(module, exports, __webpack_require__) {
-
- /* eslint-disable new-cap */
-
- 'use strict';
-
- var _Object$create = __webpack_require__(34)['default'];
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
- exports.Compiler = Compiler;
- exports.precompile = precompile;
- exports.compile = compile;
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- var _utils = __webpack_require__(5);
-
- var _ast = __webpack_require__(45);
-
- var _ast2 = _interopRequireDefault(_ast);
-
- var slice = [].slice;
-
- function Compiler() {}
-
- // the foundHelper register will disambiguate helper lookup from finding a
- // function in a context. This is necessary for mustache compatibility, which
- // requires that context functions in blocks are evaluated by blockHelperMissing,
- // and then proceed as if the resulting value was provided to blockHelperMissing.
-
- Compiler.prototype = {
- compiler: Compiler,
-
- equals: function equals(other) {
- var len = this.opcodes.length;
- if (other.opcodes.length !== len) {
- return false;
- }
-
- for (var i = 0; i < len; i++) {
- var opcode = this.opcodes[i],
- otherOpcode = other.opcodes[i];
- if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) {
- return false;
- }
- }
-
- // We know that length is the same between the two arrays because they are directly tied
- // to the opcode behavior above.
- len = this.children.length;
- for (var i = 0; i < len; i++) {
- if (!this.children[i].equals(other.children[i])) {
- return false;
- }
- }
-
- return true;
- },
-
- guid: 0,
-
- compile: function compile(program, options) {
- this.sourceNode = [];
- this.opcodes = [];
- this.children = [];
- this.options = options;
- this.stringParams = options.stringParams;
- this.trackIds = options.trackIds;
-
- options.blockParams = options.blockParams || [];
-
- options.knownHelpers = _utils.extend(_Object$create(null), {
- helperMissing: true,
- blockHelperMissing: true,
- each: true,
- 'if': true,
- unless: true,
- 'with': true,
- log: true,
- lookup: true
- }, options.knownHelpers);
-
- return this.accept(program);
- },
-
- compileProgram: function compileProgram(program) {
- var childCompiler = new this.compiler(),
- // eslint-disable-line new-cap
- result = childCompiler.compile(program, this.options),
- guid = this.guid++;
-
- this.usePartial = this.usePartial || result.usePartial;
-
- this.children[guid] = result;
- this.useDepths = this.useDepths || result.useDepths;
-
- return guid;
- },
-
- accept: function accept(node) {
- /* istanbul ignore next: Sanity code */
- if (!this[node.type]) {
- throw new _exception2['default']('Unknown type: ' + node.type, node);
- }
-
- this.sourceNode.unshift(node);
- var ret = this[node.type](node);
- this.sourceNode.shift();
- return ret;
- },
-
- Program: function Program(program) {
- this.options.blockParams.unshift(program.blockParams);
-
- var body = program.body,
- bodyLength = body.length;
- for (var i = 0; i < bodyLength; i++) {
- this.accept(body[i]);
- }
-
- this.options.blockParams.shift();
-
- this.isSimple = bodyLength === 1;
- this.blockParams = program.blockParams ? program.blockParams.length : 0;
-
- return this;
- },
-
- BlockStatement: function BlockStatement(block) {
- transformLiteralToPath(block);
-
- var program = block.program,
- inverse = block.inverse;
-
- program = program && this.compileProgram(program);
- inverse = inverse && this.compileProgram(inverse);
-
- var type = this.classifySexpr(block);
-
- if (type === 'helper') {
- this.helperSexpr(block, program, inverse);
- } else if (type === 'simple') {
- this.simpleSexpr(block);
-
- // now that the simple mustache is resolved, we need to
- // evaluate it by executing `blockHelperMissing`
- this.opcode('pushProgram', program);
- this.opcode('pushProgram', inverse);
- this.opcode('emptyHash');
- this.opcode('blockValue', block.path.original);
- } else {
- this.ambiguousSexpr(block, program, inverse);
-
- // now that the simple mustache is resolved, we need to
- // evaluate it by executing `blockHelperMissing`
- this.opcode('pushProgram', program);
- this.opcode('pushProgram', inverse);
- this.opcode('emptyHash');
- this.opcode('ambiguousBlockValue');
- }
-
- this.opcode('append');
- },
-
- DecoratorBlock: function DecoratorBlock(decorator) {
- var program = decorator.program && this.compileProgram(decorator.program);
- var params = this.setupFullMustacheParams(decorator, program, undefined),
- path = decorator.path;
-
- this.useDecorators = true;
- this.opcode('registerDecorator', params.length, path.original);
- },
-
- PartialStatement: function PartialStatement(partial) {
- this.usePartial = true;
-
- var program = partial.program;
- if (program) {
- program = this.compileProgram(partial.program);
- }
-
- var params = partial.params;
- if (params.length > 1) {
- throw new _exception2['default']('Unsupported number of partial arguments: ' + params.length, partial);
- } else if (!params.length) {
- if (this.options.explicitPartialContext) {
- this.opcode('pushLiteral', 'undefined');
- } else {
- params.push({ type: 'PathExpression', parts: [], depth: 0 });
- }
- }
-
- var partialName = partial.name.original,
- isDynamic = partial.name.type === 'SubExpression';
- if (isDynamic) {
- this.accept(partial.name);
- }
-
- this.setupFullMustacheParams(partial, program, undefined, true);
-
- var indent = partial.indent || '';
- if (this.options.preventIndent && indent) {
- this.opcode('appendContent', indent);
- indent = '';
- }
-
- this.opcode('invokePartial', isDynamic, partialName, indent);
- this.opcode('append');
- },
- PartialBlockStatement: function PartialBlockStatement(partialBlock) {
- this.PartialStatement(partialBlock);
- },
-
- MustacheStatement: function MustacheStatement(mustache) {
- this.SubExpression(mustache);
-
- if (mustache.escaped && !this.options.noEscape) {
- this.opcode('appendEscaped');
- } else {
- this.opcode('append');
- }
- },
- Decorator: function Decorator(decorator) {
- this.DecoratorBlock(decorator);
- },
-
- ContentStatement: function ContentStatement(content) {
- if (content.value) {
- this.opcode('appendContent', content.value);
- }
- },
-
- CommentStatement: function CommentStatement() {},
-
- SubExpression: function SubExpression(sexpr) {
- transformLiteralToPath(sexpr);
- var type = this.classifySexpr(sexpr);
-
- if (type === 'simple') {
- this.simpleSexpr(sexpr);
- } else if (type === 'helper') {
- this.helperSexpr(sexpr);
- } else {
- this.ambiguousSexpr(sexpr);
- }
- },
- ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) {
- var path = sexpr.path,
- name = path.parts[0],
- isBlock = program != null || inverse != null;
-
- this.opcode('getContext', path.depth);
-
- this.opcode('pushProgram', program);
- this.opcode('pushProgram', inverse);
-
- path.strict = true;
- this.accept(path);
-
- this.opcode('invokeAmbiguous', name, isBlock);
- },
-
- simpleSexpr: function simpleSexpr(sexpr) {
- var path = sexpr.path;
- path.strict = true;
- this.accept(path);
- this.opcode('resolvePossibleLambda');
- },
-
- helperSexpr: function helperSexpr(sexpr, program, inverse) {
- var params = this.setupFullMustacheParams(sexpr, program, inverse),
- path = sexpr.path,
- name = path.parts[0];
-
- if (this.options.knownHelpers[name]) {
- this.opcode('invokeKnownHelper', params.length, name);
- } else if (this.options.knownHelpersOnly) {
- throw new _exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr);
- } else {
- path.strict = true;
- path.falsy = true;
-
- this.accept(path);
- this.opcode('invokeHelper', params.length, path.original, _ast2['default'].helpers.simpleId(path));
- }
- },
-
- PathExpression: function PathExpression(path) {
- this.addDepth(path.depth);
- this.opcode('getContext', path.depth);
-
- var name = path.parts[0],
- scoped = _ast2['default'].helpers.scopedId(path),
- blockParamId = !path.depth && !scoped && this.blockParamIndex(name);
-
- if (blockParamId) {
- this.opcode('lookupBlockParam', blockParamId, path.parts);
- } else if (!name) {
- // Context reference, i.e. `{{foo .}}` or `{{foo ..}}`
- this.opcode('pushContext');
- } else if (path.data) {
- this.options.data = true;
- this.opcode('lookupData', path.depth, path.parts, path.strict);
- } else {
- this.opcode('lookupOnContext', path.parts, path.falsy, path.strict, scoped);
- }
- },
-
- StringLiteral: function StringLiteral(string) {
- this.opcode('pushString', string.value);
- },
-
- NumberLiteral: function NumberLiteral(number) {
- this.opcode('pushLiteral', number.value);
- },
-
- BooleanLiteral: function BooleanLiteral(bool) {
- this.opcode('pushLiteral', bool.value);
- },
-
- UndefinedLiteral: function UndefinedLiteral() {
- this.opcode('pushLiteral', 'undefined');
- },
-
- NullLiteral: function NullLiteral() {
- this.opcode('pushLiteral', 'null');
- },
-
- Hash: function Hash(hash) {
- var pairs = hash.pairs,
- i = 0,
- l = pairs.length;
-
- this.opcode('pushHash');
-
- for (; i < l; i++) {
- this.pushParam(pairs[i].value);
- }
- while (i--) {
- this.opcode('assignToHash', pairs[i].key);
- }
- this.opcode('popHash');
- },
-
- // HELPERS
- opcode: function opcode(name) {
- this.opcodes.push({
- opcode: name,
- args: slice.call(arguments, 1),
- loc: this.sourceNode[0].loc
- });
- },
-
- addDepth: function addDepth(depth) {
- if (!depth) {
- return;
- }
-
- this.useDepths = true;
- },
-
- classifySexpr: function classifySexpr(sexpr) {
- var isSimple = _ast2['default'].helpers.simpleId(sexpr.path);
-
- var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]);
-
- // a mustache is an eligible helper if:
- // * its id is simple (a single part, not `this` or `..`)
- var isHelper = !isBlockParam && _ast2['default'].helpers.helperExpression(sexpr);
-
- // if a mustache is an eligible helper but not a definite
- // helper, it is ambiguous, and will be resolved in a later
- // pass or at runtime.
- var isEligible = !isBlockParam && (isHelper || isSimple);
-
- // if ambiguous, we can possibly resolve the ambiguity now
- // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc.
- if (isEligible && !isHelper) {
- var _name = sexpr.path.parts[0],
- options = this.options;
- if (options.knownHelpers[_name]) {
- isHelper = true;
- } else if (options.knownHelpersOnly) {
- isEligible = false;
- }
- }
-
- if (isHelper) {
- return 'helper';
- } else if (isEligible) {
- return 'ambiguous';
- } else {
- return 'simple';
- }
- },
-
- pushParams: function pushParams(params) {
- for (var i = 0, l = params.length; i < l; i++) {
- this.pushParam(params[i]);
- }
- },
-
- pushParam: function pushParam(val) {
- var value = val.value != null ? val.value : val.original || '';
-
- if (this.stringParams) {
- if (value.replace) {
- value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.');
- }
-
- if (val.depth) {
- this.addDepth(val.depth);
- }
- this.opcode('getContext', val.depth || 0);
- this.opcode('pushStringParam', value, val.type);
-
- if (val.type === 'SubExpression') {
- // SubExpressions get evaluated and passed in
- // in string params mode.
- this.accept(val);
- }
- } else {
- if (this.trackIds) {
- var blockParamIndex = undefined;
- if (val.parts && !_ast2['default'].helpers.scopedId(val) && !val.depth) {
- blockParamIndex = this.blockParamIndex(val.parts[0]);
- }
- if (blockParamIndex) {
- var blockParamChild = val.parts.slice(1).join('.');
- this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild);
- } else {
- value = val.original || value;
- if (value.replace) {
- value = value.replace(/^this(?:\.|$)/, '').replace(/^\.\//, '').replace(/^\.$/, '');
- }
-
- this.opcode('pushId', val.type, value);
- }
- }
- this.accept(val);
- }
- },
-
- setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) {
- var params = sexpr.params;
- this.pushParams(params);
-
- this.opcode('pushProgram', program);
- this.opcode('pushProgram', inverse);
-
- if (sexpr.hash) {
- this.accept(sexpr.hash);
- } else {
- this.opcode('emptyHash', omitEmpty);
- }
-
- return params;
- },
-
- blockParamIndex: function blockParamIndex(name) {
- for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) {
- var blockParams = this.options.blockParams[depth],
- param = blockParams && _utils.indexOf(blockParams, name);
- if (blockParams && param >= 0) {
- return [depth, param];
- }
- }
- }
- };
-
- function precompile(input, options, env) {
- if (input == null || typeof input !== 'string' && input.type !== 'Program') {
- throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input);
- }
-
- options = options || {};
- if (!('data' in options)) {
- options.data = true;
- }
- if (options.compat) {
- options.useDepths = true;
- }
-
- var ast = env.parse(input, options),
- environment = new env.Compiler().compile(ast, options);
- return new env.JavaScriptCompiler().compile(environment, options);
- }
-
- function compile(input, options, env) {
- if (options === undefined) options = {};
-
- if (input == null || typeof input !== 'string' && input.type !== 'Program') {
- throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input);
- }
-
- options = _utils.extend({}, options);
- if (!('data' in options)) {
- options.data = true;
- }
- if (options.compat) {
- options.useDepths = true;
- }
-
- var compiled = undefined;
-
- function compileInput() {
- var ast = env.parse(input, options),
- environment = new env.Compiler().compile(ast, options),
- templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);
- return env.template(templateSpec);
- }
-
- // Template is only compiled on first use and cached after that point.
- function ret(context, execOptions) {
- if (!compiled) {
- compiled = compileInput();
- }
- return compiled.call(this, context, execOptions);
- }
- ret._setup = function (setupOptions) {
- if (!compiled) {
- compiled = compileInput();
- }
- return compiled._setup(setupOptions);
- };
- ret._child = function (i, data, blockParams, depths) {
- if (!compiled) {
- compiled = compileInput();
- }
- return compiled._child(i, data, blockParams, depths);
- };
- return ret;
- }
-
- function argEquals(a, b) {
- if (a === b) {
- return true;
- }
-
- if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) {
- for (var i = 0; i < a.length; i++) {
- if (!argEquals(a[i], b[i])) {
- return false;
- }
- }
- return true;
- }
- }
-
- function transformLiteralToPath(sexpr) {
- if (!sexpr.path.parts) {
- var literal = sexpr.path;
- // Casting to string here to make false and 0 literal values play nicely with the rest
- // of the system.
- sexpr.path = {
- type: 'PathExpression',
- data: false,
- depth: 0,
- parts: [literal.original + ''],
- original: literal.original + '',
- loc: literal.loc
- };
- }
- }
-
-/***/ }),
-/* 52 */
-/***/ (function(module, exports, __webpack_require__) {
-
- 'use strict';
-
- var _Object$keys = __webpack_require__(13)['default'];
-
- var _interopRequireDefault = __webpack_require__(1)['default'];
-
- exports.__esModule = true;
-
- var _base = __webpack_require__(4);
-
- var _exception = __webpack_require__(6);
-
- var _exception2 = _interopRequireDefault(_exception);
-
- var _utils = __webpack_require__(5);
-
- var _codeGen = __webpack_require__(53);
-
- var _codeGen2 = _interopRequireDefault(_codeGen);
-
- function Literal(value) {
- this.value = value;
- }
-
- function JavaScriptCompiler() {}
-
- JavaScriptCompiler.prototype = {
- // PUBLIC API: You can override these methods in a subclass to provide
- // alternative compiled forms for name lookup and buffering semantics
- nameLookup: function nameLookup(parent, name /*, type */) {
- return this.internalNameLookup(parent, name);
- },
- depthedLookup: function depthedLookup(name) {
- return [this.aliasable('container.lookup'), '(depths, "', name, '")'];
- },
-
- compilerInfo: function compilerInfo() {
- var revision = _base.COMPILER_REVISION,
- versions = _base.REVISION_CHANGES[revision];
- return [revision, versions];
- },
-
- appendToBuffer: function appendToBuffer(source, location, explicit) {
- // Force a source as this simplifies the merge logic.
- if (!_utils.isArray(source)) {
- source = [source];
- }
- source = this.source.wrap(source, location);
-
- if (this.environment.isSimple) {
- return ['return ', source, ';'];
- } else if (explicit) {
- // This is a case where the buffer operation occurs as a child of another
- // construct, generally braces. We have to explicitly output these buffer
- // operations to ensure that the emitted code goes in the correct location.
- return ['buffer += ', source, ';'];
- } else {
- source.appendToBuffer = true;
- return source;
- }
- },
-
- initializeBuffer: function initializeBuffer() {
- return this.quotedString('');
- },
- // END PUBLIC API
- internalNameLookup: function internalNameLookup(parent, name) {
- this.lookupPropertyFunctionIsUsed = true;
- return ['lookupProperty(', parent, ',', JSON.stringify(name), ')'];
- },
-
- lookupPropertyFunctionIsUsed: false,
-
- compile: function compile(environment, options, context, asObject) {
- this.environment = environment;
- this.options = options;
- this.stringParams = this.options.stringParams;
- this.trackIds = this.options.trackIds;
- this.precompile = !asObject;
-
- this.name = this.environment.name;
- this.isChild = !!context;
- this.context = context || {
- decorators: [],
- programs: [],
- environments: []
- };
-
- this.preamble();
-
- this.stackSlot = 0;
- this.stackVars = [];
- this.aliases = {};
- this.registers = { list: [] };
- this.hashes = [];
- this.compileStack = [];
- this.inlineStack = [];
- this.blockParams = [];
-
- this.compileChildren(environment, options);
-
- this.useDepths = this.useDepths || environment.useDepths || environment.useDecorators || this.options.compat;
- this.useBlockParams = this.useBlockParams || environment.useBlockParams;
-
- var opcodes = environment.opcodes,
- opcode = undefined,
- firstLoc = undefined,
- i = undefined,
- l = undefined;
-
- for (i = 0, l = opcodes.length; i < l; i++) {
- opcode = opcodes[i];
-
- this.source.currentLocation = opcode.loc;
- firstLoc = firstLoc || opcode.loc;
- this[opcode.opcode].apply(this, opcode.args);
- }
-
- // Flush any trailing content that might be pending.
- this.source.currentLocation = firstLoc;
- this.pushSource('');
-
- /* istanbul ignore next */
- if (this.stackSlot || this.inlineStack.length || this.compileStack.length) {
- throw new _exception2['default']('Compile completed with content left on stack');
- }
-
- if (!this.decorators.isEmpty()) {
- this.useDecorators = true;
-
- this.decorators.prepend(['var decorators = container.decorators, ', this.lookupPropertyFunctionVarDeclaration(), ';\n']);
- this.decorators.push('return fn;');
-
- if (asObject) {
- this.decorators = Function.apply(this, ['fn', 'props', 'container', 'depth0', 'data', 'blockParams', 'depths', this.decorators.merge()]);
- } else {
- this.decorators.prepend('function(fn, props, container, depth0, data, blockParams, depths) {\n');
- this.decorators.push('}\n');
- this.decorators = this.decorators.merge();
- }
- } else {
- this.decorators = undefined;
- }
-
- var fn = this.createFunctionContext(asObject);
- if (!this.isChild) {
- var ret = {
- compiler: this.compilerInfo(),
- main: fn
- };
-
- if (this.decorators) {
- ret.main_d = this.decorators; // eslint-disable-line camelcase
- ret.useDecorators = true;
- }
-
- var _context = this.context;
- var programs = _context.programs;
- var decorators = _context.decorators;
-
- for (i = 0, l = programs.length; i < l; i++) {
- if (programs[i]) {
- ret[i] = programs[i];
- if (decorators[i]) {
- ret[i + '_d'] = decorators[i];
- ret.useDecorators = true;
- }
- }
- }
-
- if (this.environment.usePartial) {
- ret.usePartial = true;
- }
- if (this.options.data) {
- ret.useData = true;
- }
- if (this.useDepths) {
- ret.useDepths = true;
- }
- if (this.useBlockParams) {
- ret.useBlockParams = true;
- }
- if (this.options.compat) {
- ret.compat = true;
- }
-
- if (!asObject) {
- ret.compiler = JSON.stringify(ret.compiler);
-
- this.source.currentLocation = { start: { line: 1, column: 0 } };
- ret = this.objectLiteral(ret);
-
- if (options.srcName) {
- ret = ret.toStringWithSourceMap({ file: options.destName });
- ret.map = ret.map && ret.map.toString();
- } else {
- ret = ret.toString();
- }
- } else {
- ret.compilerOptions = this.options;
- }
-
- return ret;
- } else {
- return fn;
- }
- },
-
- preamble: function preamble() {
- // track the last context pushed into place to allow skipping the
- // getContext opcode when it would be a noop
- this.lastContext = 0;
- this.source = new _codeGen2['default'](this.options.srcName);
- this.decorators = new _codeGen2['default'](this.options.srcName);
- },
-
- createFunctionContext: function createFunctionContext(asObject) {
- // istanbul ignore next
-
- var _this = this;
-
- var varDeclarations = '';
-
- var locals = this.stackVars.concat(this.registers.list);
- if (locals.length > 0) {
- varDeclarations += ', ' + locals.join(', ');
- }
-
- // Generate minimizer alias mappings
- //
- // When using true SourceNodes, this will update all references to the given alias
- // as the source nodes are reused in situ. For the non-source node compilation mode,
- // aliases will not be used, but this case is already being run on the client and
- // we aren't concern about minimizing the template size.
- var aliasCount = 0;
- _Object$keys(this.aliases).forEach(function (alias) {
- var node = _this.aliases[alias];
- if (node.children && node.referenceCount > 1) {
- varDeclarations += ', alias' + ++aliasCount + '=' + alias;
- node.children[0] = 'alias' + aliasCount;
- }
- });
-
- if (this.lookupPropertyFunctionIsUsed) {
- varDeclarations += ', ' + this.lookupPropertyFunctionVarDeclaration();
- }
-
- var params = ['container', 'depth0', 'helpers', 'partials', 'data'];
-
- if (this.useBlockParams || this.useDepths) {
- params.push('blockParams');
- }
- if (this.useDepths) {
- params.push('depths');
- }
-
- // Perform a second pass over the output to merge content when possible
- var source = this.mergeSource(varDeclarations);
-
- if (asObject) {
- params.push(source);
-
- return Function.apply(this, params);
- } else {
- return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']);
- }
- },
- mergeSource: function mergeSource(varDeclarations) {
- var isSimple = this.environment.isSimple,
- appendOnly = !this.forceBuffer,
- appendFirst = undefined,
- sourceSeen = undefined,
- bufferStart = undefined,
- bufferEnd = undefined;
- this.source.each(function (line) {
- if (line.appendToBuffer) {
- if (bufferStart) {
- line.prepend(' + ');
- } else {
- bufferStart = line;
- }
- bufferEnd = line;
- } else {
- if (bufferStart) {
- if (!sourceSeen) {
- appendFirst = true;
- } else {
- bufferStart.prepend('buffer += ');
- }
- bufferEnd.add(';');
- bufferStart = bufferEnd = undefined;
- }
-
- sourceSeen = true;
- if (!isSimple) {
- appendOnly = false;
- }
- }
- });
-
- if (appendOnly) {
- if (bufferStart) {
- bufferStart.prepend('return ');
- bufferEnd.add(';');
- } else if (!sourceSeen) {
- this.source.push('return "";');
- }
- } else {
- varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer());
-
- if (bufferStart) {
- bufferStart.prepend('return buffer + ');
- bufferEnd.add(';');
- } else {
- this.source.push('return buffer;');
- }
- }
-
- if (varDeclarations) {
- this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n'));
- }
-
- return this.source.merge();
- },
-
- lookupPropertyFunctionVarDeclaration: function lookupPropertyFunctionVarDeclaration() {
- return '\n lookupProperty = container.lookupProperty || function(parent, propertyName) {\n if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n return parent[propertyName];\n }\n return undefined\n }\n '.trim();
- },
-
- // [blockValue]
- //
- // On stack, before: hash, inverse, program, value
- // On stack, after: return value of blockHelperMissing
- //
- // The purpose of this opcode is to take a block of the form
- // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and
- // replace it on the stack with the result of properly
- // invoking blockHelperMissing.
- blockValue: function blockValue(name) {
- var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'),
- params = [this.contextName(0)];
- this.setupHelperArgs(name, 0, params);
-
- var blockName = this.popStack();
- params.splice(1, 0, blockName);
-
- this.push(this.source.functionCall(blockHelperMissing, 'call', params));
- },
-
- // [ambiguousBlockValue]
- //
- // On stack, before: hash, inverse, program, value
- // Compiler value, before: lastHelper=value of last found helper, if any
- // On stack, after, if no lastHelper: same as [blockValue]
- // On stack, after, if lastHelper: value
- ambiguousBlockValue: function ambiguousBlockValue() {
- // We're being a bit cheeky and reusing the options value from the prior exec
- var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'),
- params = [this.contextName(0)];
- this.setupHelperArgs('', 0, params, true);
-
- this.flushInline();
-
- var current = this.topStack();
- params.splice(1, 0, current);
-
- this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']);
- },
-
- // [appendContent]
- //
- // On stack, before: ...
- // On stack, after: ...
- //
- // Appends the string value of `content` to the current buffer
- appendContent: function appendContent(content) {
- if (this.pendingContent) {
- content = this.pendingContent + content;
- } else {
- this.pendingLocation = this.source.currentLocation;
- }
-
- this.pendingContent = content;
- },
-
- // [append]
- //
- // On stack, before: value, ...
- // On stack, after: ...
- //
- // Coerces `value` to a String and appends it to the current buffer.
- //
- // If `value` is truthy, or 0, it is coerced into a string and appended
- // Otherwise, the empty string is appended
- append: function append() {
- if (this.isInline()) {
- this.replaceStack(function (current) {
- return [' != null ? ', current, ' : ""'];
- });
-
- this.pushSource(this.appendToBuffer(this.popStack()));
- } else {
- var local = this.popStack();
- this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']);
- if (this.environment.isSimple) {
- this.pushSource(['else { ', this.appendToBuffer("''", undefined, true), ' }']);
- }
- }
- },
-
- // [appendEscaped]
- //
- // On stack, before: value, ...
- // On stack, after: ...
- //
- // Escape `value` and append it to the buffer
- appendEscaped: function appendEscaped() {
- this.pushSource(this.appendToBuffer([this.aliasable('container.escapeExpression'), '(', this.popStack(), ')']));
- },
-
- // [getContext]
- //
- // On stack, before: ...
- // On stack, after: ...
- // Compiler value, after: lastContext=depth
- //
- // Set the value of the `lastContext` compiler value to the depth
- getContext: function getContext(depth) {
- this.lastContext = depth;
- },
-
- // [pushContext]
- //
- // On stack, before: ...
- // On stack, after: currentContext, ...
- //
- // Pushes the value of the current context onto the stack.
- pushContext: function pushContext() {
- this.pushStackLiteral(this.contextName(this.lastContext));
- },
-
- // [lookupOnContext]
- //
- // On stack, before: ...
- // On stack, after: currentContext[name], ...
- //
- // Looks up the value of `name` on the current context and pushes
- // it onto the stack.
- lookupOnContext: function lookupOnContext(parts, falsy, strict, scoped) {
- var i = 0;
-
- if (!scoped && this.options.compat && !this.lastContext) {
- // The depthed query is expected to handle the undefined logic for the root level that
- // is implemented below, so we evaluate that directly in compat mode
- this.push(this.depthedLookup(parts[i++]));
- } else {
- this.pushContext();
- }
-
- this.resolvePath('context', parts, i, falsy, strict);
- },
-
- // [lookupBlockParam]
- //
- // On stack, before: ...
- // On stack, after: blockParam[name], ...
- //
- // Looks up the value of `parts` on the given block param and pushes
- // it onto the stack.
- lookupBlockParam: function lookupBlockParam(blockParamId, parts) {
- this.useBlockParams = true;
-
- this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']);
- this.resolvePath('context', parts, 1);
- },
-
- // [lookupData]
- //
- // On stack, before: ...
- // On stack, after: data, ...
- //
- // Push the data lookup operator
- lookupData: function lookupData(depth, parts, strict) {
- if (!depth) {
- this.pushStackLiteral('data');
- } else {
- this.pushStackLiteral('container.data(data, ' + depth + ')');
- }
-
- this.resolvePath('data', parts, 0, true, strict);
- },
-
- resolvePath: function resolvePath(type, parts, i, falsy, strict) {
- // istanbul ignore next
-
- var _this2 = this;
-
- if (this.options.strict || this.options.assumeObjects) {
- this.push(strictLookup(this.options.strict && strict, this, parts, type));
- return;
- }
-
- var len = parts.length;
- for (; i < len; i++) {
- /* eslint-disable no-loop-func */
- this.replaceStack(function (current) {
- var lookup = _this2.nameLookup(current, parts[i], type);
- // We want to ensure that zero and false are handled properly if the context (falsy flag)
- // needs to have the special handling for these values.
- if (!falsy) {
- return [' != null ? ', lookup, ' : ', current];
- } else {
- // Otherwise we can use generic falsy handling
- return [' && ', lookup];
- }
- });
- /* eslint-enable no-loop-func */
- }
- },
-
- // [resolvePossibleLambda]
- //
- // On stack, before: value, ...
- // On stack, after: resolved value, ...
- //
- // If the `value` is a lambda, replace it on the stack by
- // the return value of the lambda
- resolvePossibleLambda: function resolvePossibleLambda() {
- this.push([this.aliasable('container.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']);
- },
-
- // [pushStringParam]
- //
- // On stack, before: ...
- // On stack, after: string, currentContext, ...
- //
- // This opcode is designed for use in string mode, which
- // provides the string value of a parameter along with its
- // depth rather than resolving it immediately.
- pushStringParam: function pushStringParam(string, type) {
- this.pushContext();
- this.pushString(type);
-
- // If it's a subexpression, the string result
- // will be pushed after this opcode.
- if (type !== 'SubExpression') {
- if (typeof string === 'string') {
- this.pushString(string);
- } else {
- this.pushStackLiteral(string);
- }
- }
- },
-
- emptyHash: function emptyHash(omitEmpty) {
- if (this.trackIds) {
- this.push('{}'); // hashIds
- }
- if (this.stringParams) {
- this.push('{}'); // hashContexts
- this.push('{}'); // hashTypes
- }
- this.pushStackLiteral(omitEmpty ? 'undefined' : '{}');
- },
- pushHash: function pushHash() {
- if (this.hash) {
- this.hashes.push(this.hash);
- }
- this.hash = { values: {}, types: [], contexts: [], ids: [] };
- },
- popHash: function popHash() {
- var hash = this.hash;
- this.hash = this.hashes.pop();
-
- if (this.trackIds) {
- this.push(this.objectLiteral(hash.ids));
- }
- if (this.stringParams) {
- this.push(this.objectLiteral(hash.contexts));
- this.push(this.objectLiteral(hash.types));
- }
-
- this.push(this.objectLiteral(hash.values));
- },
-
- // [pushString]
- //
- // On stack, before: ...
- // On stack, after: quotedString(string), ...
- //
- // Push a quoted version of `string` onto the stack
- pushString: function pushString(string) {
- this.pushStackLiteral(this.quotedString(string));
- },
-
- // [pushLiteral]
- //
- // On stack, before: ...
- // On stack, after: value, ...
- //
- // Pushes a value onto the stack. This operation prevents
- // the compiler from creating a temporary variable to hold
- // it.
- pushLiteral: function pushLiteral(value) {
- this.pushStackLiteral(value);
- },
-
- // [pushProgram]
- //
- // On stack, before: ...
- // On stack, after: program(guid), ...
- //
- // Push a program expression onto the stack. This takes
- // a compile-time guid and converts it into a runtime-accessible
- // expression.
- pushProgram: function pushProgram(guid) {
- if (guid != null) {
- this.pushStackLiteral(this.programExpression(guid));
- } else {
- this.pushStackLiteral(null);
- }
- },
-
- // [registerDecorator]
- //
- // On stack, before: hash, program, params..., ...
- // On stack, after: ...
- //
- // Pops off the decorator's parameters, invokes the decorator,
- // and inserts the decorator into the decorators list.
- registerDecorator: function registerDecorator(paramSize, name) {
- var foundDecorator = this.nameLookup('decorators', name, 'decorator'),
- options = this.setupHelperArgs(name, paramSize);
-
- this.decorators.push(['fn = ', this.decorators.functionCall(foundDecorator, '', ['fn', 'props', 'container', options]), ' || fn;']);
- },
-
- // [invokeHelper]
- //
- // On stack, before: hash, inverse, program, params..., ...
- // On stack, after: result of helper invocation
- //
- // Pops off the helper's parameters, invokes the helper,
- // and pushes the helper's return value onto the stack.
- //
- // If the helper is not found, `helperMissing` is called.
- invokeHelper: function invokeHelper(paramSize, name, isSimple) {
- var nonHelper = this.popStack(),
- helper = this.setupHelper(paramSize, name);
-
- var possibleFunctionCalls = [];
-
- if (isSimple) {
- // direct call to helper
- possibleFunctionCalls.push(helper.name);
- }
- // call a function from the input object
- possibleFunctionCalls.push(nonHelper);
- if (!this.options.strict) {
- possibleFunctionCalls.push(this.aliasable('container.hooks.helperMissing'));
- }
-
- var functionLookupCode = ['(', this.itemsSeparatedBy(possibleFunctionCalls, '||'), ')'];
- var functionCall = this.source.functionCall(functionLookupCode, 'call', helper.callParams);
- this.push(functionCall);
- },
-
- itemsSeparatedBy: function itemsSeparatedBy(items, separator) {
- var result = [];
- result.push(items[0]);
- for (var i = 1; i < items.length; i++) {
- result.push(separator, items[i]);
- }
- return result;
- },
- // [invokeKnownHelper]
- //
- // On stack, before: hash, inverse, program, params..., ...
- // On stack, after: result of helper invocation
- //
- // This operation is used when the helper is known to exist,
- // so a `helperMissing` fallback is not required.
- invokeKnownHelper: function invokeKnownHelper(paramSize, name) {
- var helper = this.setupHelper(paramSize, name);
- this.push(this.source.functionCall(helper.name, 'call', helper.callParams));
- },
-
- // [invokeAmbiguous]
- //
- // On stack, before: hash, inverse, program, params..., ...
- // On stack, after: result of disambiguation
- //
- // This operation is used when an expression like `{{foo}}`
- // is provided, but we don't know at compile-time whether it
- // is a helper or a path.
- //
- // This operation emits more code than the other options,
- // and can be avoided by passing the `knownHelpers` and
- // `knownHelpersOnly` flags at compile-time.
- invokeAmbiguous: function invokeAmbiguous(name, helperCall) {
- this.useRegister('helper');
-
- var nonHelper = this.popStack();
-
- this.emptyHash();
- var helper = this.setupHelper(0, name, helperCall);
-
- var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');
-
- var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')'];
- if (!this.options.strict) {
- lookup[0] = '(helper = ';
- lookup.push(' != null ? helper : ', this.aliasable('container.hooks.helperMissing'));
- }
-
- this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']);
- },
-
- // [invokePartial]
- //
- // On stack, before: context, ...
- // On stack after: result of partial invocation
- //
- // This operation pops off a context, invokes a partial with that context,
- // and pushes the result of the invocation back.
- invokePartial: function invokePartial(isDynamic, name, indent) {
- var params = [],
- options = this.setupParams(name, 1, params);
-
- if (isDynamic) {
- name = this.popStack();
- delete options.name;
- }
-
- if (indent) {
- options.indent = JSON.stringify(indent);
- }
- options.helpers = 'helpers';
- options.partials = 'partials';
- options.decorators = 'container.decorators';
-
- if (!isDynamic) {
- params.unshift(this.nameLookup('partials', name, 'partial'));
- } else {
- params.unshift(name);
- }
-
- if (this.options.compat) {
- options.depths = 'depths';
- }
- options = this.objectLiteral(options);
- params.push(options);
-
- this.push(this.source.functionCall('container.invokePartial', '', params));
- },
-
- // [assignToHash]
- //
- // On stack, before: value, ..., hash, ...
- // On stack, after: ..., hash, ...
- //
- // Pops a value off the stack and assigns it to the current hash
- assignToHash: function assignToHash(key) {
- var value = this.popStack(),
- context = undefined,
- type = undefined,
- id = undefined;
-
- if (this.trackIds) {
- id = this.popStack();
- }
- if (this.stringParams) {
- type = this.popStack();
- context = this.popStack();
- }
-
- var hash = this.hash;
- if (context) {
- hash.contexts[key] = context;
- }
- if (type) {
- hash.types[key] = type;
- }
- if (id) {
- hash.ids[key] = id;
- }
- hash.values[key] = value;
- },
-
- pushId: function pushId(type, name, child) {
- if (type === 'BlockParam') {
- this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : ''));
- } else if (type === 'PathExpression') {
- this.pushString(name);
- } else if (type === 'SubExpression') {
- this.pushStackLiteral('true');
- } else {
- this.pushStackLiteral('null');
- }
- },
-
- // HELPERS
-
- compiler: JavaScriptCompiler,
-
- compileChildren: function compileChildren(environment, options) {
- var children = environment.children,
- child = undefined,
- compiler = undefined;
-
- for (var i = 0, l = children.length; i < l; i++) {
- child = children[i];
- compiler = new this.compiler(); // eslint-disable-line new-cap
-
- var existing = this.matchExistingProgram(child);
-
- if (existing == null) {
- this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children
- var index = this.context.programs.length;
- child.index = index;
- child.name = 'program' + index;
- this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile);
- this.context.decorators[index] = compiler.decorators;
- this.context.environments[index] = child;
-
- this.useDepths = this.useDepths || compiler.useDepths;
- this.useBlockParams = this.useBlockParams || compiler.useBlockParams;
- child.useDepths = this.useDepths;
- child.useBlockParams = this.useBlockParams;
- } else {
- child.index = existing.index;
- child.name = 'program' + existing.index;
-
- this.useDepths = this.useDepths || existing.useDepths;
- this.useBlockParams = this.useBlockParams || existing.useBlockParams;
- }
- }
- },
- matchExistingProgram: function matchExistingProgram(child) {
- for (var i = 0, len = this.context.environments.length; i < len; i++) {
- var environment = this.context.environments[i];
- if (environment && environment.equals(child)) {
- return environment;
- }
- }
- },
-
- programExpression: function programExpression(guid) {
- var child = this.environment.children[guid],
- programParams = [child.index, 'data', child.blockParams];
-
- if (this.useBlockParams || this.useDepths) {
- programParams.push('blockParams');
- }
- if (this.useDepths) {
- programParams.push('depths');
- }
-
- return 'container.program(' + programParams.join(', ') + ')';
- },
-
- useRegister: function useRegister(name) {
- if (!this.registers[name]) {
- this.registers[name] = true;
- this.registers.list.push(name);
- }
- },
-
- push: function push(expr) {
- if (!(expr instanceof Literal)) {
- expr = this.source.wrap(expr);
- }
-
- this.inlineStack.push(expr);
- return expr;
- },
-
- pushStackLiteral: function pushStackLiteral(item) {
- this.push(new Literal(item));
- },
-
- pushSource: function pushSource(source) {
- if (this.pendingContent) {
- this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));
- this.pendingContent = undefined;
- }
-
- if (source) {
- this.source.push(source);
- }
- },
-
- replaceStack: function replaceStack(callback) {
- var prefix = ['('],
- stack = undefined,
- createdStack = undefined,
- usedLiteral = undefined;
-
- /* istanbul ignore next */
- if (!this.isInline()) {
- throw new _exception2['default']('replaceStack on non-inline');
- }
-
- // We want to merge the inline statement into the replacement statement via ','
- var top = this.popStack(true);
-
- if (top instanceof Literal) {
- // Literals do not need to be inlined
- stack = [top.value];
- prefix = ['(', stack];
- usedLiteral = true;
- } else {
- // Get or create the current stack name for use by the inline
- createdStack = true;
- var _name = this.incrStack();
-
- prefix = ['((', this.push(_name), ' = ', top, ')'];
- stack = this.topStack();
- }
-
- var item = callback.call(this, stack);
-
- if (!usedLiteral) {
- this.popStack();
- }
- if (createdStack) {
- this.stackSlot--;
- }
- this.push(prefix.concat(item, ')'));
- },
-
- incrStack: function incrStack() {
- this.stackSlot++;
- if (this.stackSlot > this.stackVars.length) {
- this.stackVars.push('stack' + this.stackSlot);
- }
- return this.topStackName();
- },
- topStackName: function topStackName() {
- return 'stack' + this.stackSlot;
- },
- flushInline: function flushInline() {
- var inlineStack = this.inlineStack;
- this.inlineStack = [];
- for (var i = 0, len = inlineStack.length; i < len; i++) {
- var entry = inlineStack[i];
- /* istanbul ignore if */
- if (entry instanceof Literal) {
- this.compileStack.push(entry);
- } else {
- var stack = this.incrStack();
- this.pushSource([stack, ' = ', entry, ';']);
- this.compileStack.push(stack);
- }
- }
- },
- isInline: function isInline() {
- return this.inlineStack.length;
- },
-
- popStack: function popStack(wrapped) {
- var inline = this.isInline(),
- item = (inline ? this.inlineStack : this.compileStack).pop();
-
- if (!wrapped && item instanceof Literal) {
- return item.value;
- } else {
- if (!inline) {
- /* istanbul ignore next */
- if (!this.stackSlot) {
- throw new _exception2['default']('Invalid stack pop');
- }
- this.stackSlot--;
- }
- return item;
- }
- },
-
- topStack: function topStack() {
- var stack = this.isInline() ? this.inlineStack : this.compileStack,
- item = stack[stack.length - 1];
-
- /* istanbul ignore if */
- if (item instanceof Literal) {
- return item.value;
- } else {
- return item;
- }
- },
-
- contextName: function contextName(context) {
- if (this.useDepths && context) {
- return 'depths[' + context + ']';
- } else {
- return 'depth' + context;
- }
- },
-
- quotedString: function quotedString(str) {
- return this.source.quotedString(str);
- },
-
- objectLiteral: function objectLiteral(obj) {
- return this.source.objectLiteral(obj);
- },
-
- aliasable: function aliasable(name) {
- var ret = this.aliases[name];
- if (ret) {
- ret.referenceCount++;
- return ret;
- }
-
- ret = this.aliases[name] = this.source.wrap(name);
- ret.aliasable = true;
- ret.referenceCount = 1;
-
- return ret;
- },
-
- setupHelper: function setupHelper(paramSize, name, blockHelper) {
- var params = [],
- paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper);
- var foundHelper = this.nameLookup('helpers', name, 'helper'),
- callContext = this.aliasable(this.contextName(0) + ' != null ? ' + this.contextName(0) + ' : (container.nullContext || {})');
-
- return {
- params: params,
- paramsInit: paramsInit,
- name: foundHelper,
- callParams: [callContext].concat(params)
- };
- },
-
- setupParams: function setupParams(helper, paramSize, params) {
- var options = {},
- contexts = [],
- types = [],
- ids = [],
- objectArgs = !params,
- param = undefined;
-
- if (objectArgs) {
- params = [];
- }
-
- options.name = this.quotedString(helper);
- options.hash = this.popStack();
-
- if (this.trackIds) {
- options.hashIds = this.popStack();
- }
- if (this.stringParams) {
- options.hashTypes = this.popStack();
- options.hashContexts = this.popStack();
- }
-
- var inverse = this.popStack(),
- program = this.popStack();
-
- // Avoid setting fn and inverse if neither are set. This allows
- // helpers to do a check for `if (options.fn)`
- if (program || inverse) {
- options.fn = program || 'container.noop';
- options.inverse = inverse || 'container.noop';
- }
-
- // The parameters go on to the stack in order (making sure that they are evaluated in order)
- // so we need to pop them off the stack in reverse order
- var i = paramSize;
- while (i--) {
- param = this.popStack();
- params[i] = param;
-
- if (this.trackIds) {
- ids[i] = this.popStack();
- }
- if (this.stringParams) {
- types[i] = this.popStack();
- contexts[i] = this.popStack();
- }
- }
-
- if (objectArgs) {
- options.args = this.source.generateArray(params);
- }
-
- if (this.trackIds) {
- options.ids = this.source.generateArray(ids);
- }
- if (this.stringParams) {
- options.types = this.source.generateArray(types);
- options.contexts = this.source.generateArray(contexts);
- }
-
- if (this.options.data) {
- options.data = 'data';
- }
- if (this.useBlockParams) {
- options.blockParams = 'blockParams';
- }
- return options;
- },
-
- setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) {
- var options = this.setupParams(helper, paramSize, params);
- options.loc = JSON.stringify(this.source.currentLocation);
- options = this.objectLiteral(options);
- if (useRegister) {
- this.useRegister('options');
- params.push('options');
- return ['options=', options];
- } else if (params) {
- params.push(options);
- return '';
- } else {
- return options;
- }
- }
- };
-
- (function () {
- var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' ');
-
- var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
-
- for (var i = 0, l = reservedWords.length; i < l; i++) {
- compilerWords[reservedWords[i]] = true;
- }
- })();
-
- /**
- * @deprecated May be removed in the next major version
- */
- JavaScriptCompiler.isValidJavaScriptVariableName = function (name) {
- return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name);
- };
-
- function strictLookup(requireTerminal, compiler, parts, type) {
- var stack = compiler.popStack(),
- i = 0,
- len = parts.length;
- if (requireTerminal) {
- len--;
- }
-
- for (; i < len; i++) {
- stack = compiler.nameLookup(stack, parts[i], type);
- }
-
- if (requireTerminal) {
- return [compiler.aliasable('container.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ', ', JSON.stringify(compiler.source.currentLocation), ' )'];
- } else {
- return stack;
- }
- }
-
- exports['default'] = JavaScriptCompiler;
- module.exports = exports['default'];
-
-/***/ }),
-/* 53 */
-/***/ (function(module, exports, __webpack_require__) {
-
- /* global define */
- 'use strict';
-
- var _Object$keys = __webpack_require__(13)['default'];
-
- exports.__esModule = true;
-
- var _utils = __webpack_require__(5);
-
- var SourceNode = undefined;
-
- try {
- /* istanbul ignore next */
- if (false) {
- // We don't support this in AMD environments. For these environments, we asusme that
- // they are running on the browser and thus have no need for the source-map library.
- var SourceMap = require('source-map');
- SourceNode = SourceMap.SourceNode;
- }
- } catch (err) {}
- /* NOP */
-
- /* istanbul ignore if: tested but not covered in istanbul due to dist build */
- if (!SourceNode) {
- SourceNode = function (line, column, srcFile, chunks) {
- this.src = '';
- if (chunks) {
- this.add(chunks);
- }
- };
- /* istanbul ignore next */
- SourceNode.prototype = {
- add: function add(chunks) {
- if (_utils.isArray(chunks)) {
- chunks = chunks.join('');
- }
- this.src += chunks;
- },
- prepend: function prepend(chunks) {
- if (_utils.isArray(chunks)) {
- chunks = chunks.join('');
- }
- this.src = chunks + this.src;
- },
- toStringWithSourceMap: function toStringWithSourceMap() {
- return { code: this.toString() };
- },
- toString: function toString() {
- return this.src;
- }
- };
- }
-
- function castChunk(chunk, codeGen, loc) {
- if (_utils.isArray(chunk)) {
- var ret = [];
-
- for (var i = 0, len = chunk.length; i < len; i++) {
- ret.push(codeGen.wrap(chunk[i], loc));
- }
- return ret;
- } else if (typeof chunk === 'boolean' || typeof chunk === 'number') {
- // Handle primitives that the SourceNode will throw up on
- return chunk + '';
- }
- return chunk;
- }
-
- function CodeGen(srcFile) {
- this.srcFile = srcFile;
- this.source = [];
- }
-
- CodeGen.prototype = {
- isEmpty: function isEmpty() {
- return !this.source.length;
- },
- prepend: function prepend(source, loc) {
- this.source.unshift(this.wrap(source, loc));
- },
- push: function push(source, loc) {
- this.source.push(this.wrap(source, loc));
- },
-
- merge: function merge() {
- var source = this.empty();
- this.each(function (line) {
- source.add([' ', line, '\n']);
- });
- return source;
- },
-
- each: function each(iter) {
- for (var i = 0, len = this.source.length; i < len; i++) {
- iter(this.source[i]);
- }
- },
-
- empty: function empty() {
- var loc = this.currentLocation || { start: {} };
- return new SourceNode(loc.start.line, loc.start.column, this.srcFile);
- },
- wrap: function wrap(chunk) {
- var loc = arguments.length <= 1 || arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1];
-
- if (chunk instanceof SourceNode) {
- return chunk;
- }
-
- chunk = castChunk(chunk, this, loc);
-
- return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk);
- },
-
- functionCall: function functionCall(fn, type, params) {
- params = this.generateList(params);
- return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']);
- },
-
- quotedString: function quotedString(str) {
- return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4
- .replace(/\u2029/g, '\\u2029') + '"';
- },
-
- objectLiteral: function objectLiteral(obj) {
- // istanbul ignore next
-
- var _this = this;
-
- var pairs = [];
-
- _Object$keys(obj).forEach(function (key) {
- var value = castChunk(obj[key], _this);
- if (value !== 'undefined') {
- pairs.push([_this.quotedString(key), ':', value]);
- }
- });
-
- var ret = this.generateList(pairs);
- ret.prepend('{');
- ret.add('}');
- return ret;
- },
-
- generateList: function generateList(entries) {
- var ret = this.empty();
-
- for (var i = 0, len = entries.length; i < len; i++) {
- if (i) {
- ret.add(',');
- }
-
- ret.add(castChunk(entries[i], this));
- }
-
- return ret;
- },
-
- generateArray: function generateArray(entries) {
- var ret = this.generateList(entries);
- ret.prepend('[');
- ret.add(']');
-
- return ret;
- }
- };
-
- exports['default'] = CodeGen;
- module.exports = exports['default'];
-
-/***/ })
-/******/ ])
-});
-;
\ No newline at end of file
diff --git a/frontend/js/libs/i18next.min.js b/frontend/js/libs/i18next.min.js
deleted file mode 100644
index 5f21d10d3..000000000
--- a/frontend/js/libs/i18next.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * i18next internationalization framework
- * @version 8.4.2
- * @license MIT
- * @see https://www.i18next.com/
- */
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.i18next=t()}(this,function(){"use strict";function e(e){return null==e?"":""+e}function t(e,t,n){e.forEach(function(e){t[e]&&(n[e]=t[e])})}function n(e,t,n){function o(e){return e&&e.indexOf("###")>-1?e.replace(/###/g,"."):e}function r(){return!e||"string"==typeof e}for(var i="string"!=typeof t?[].concat(t):t.split(".");i.length>1;){if(r())return{};var a=o(i.shift());!e[a]&&n&&(e[a]=new n),e=e[a]}return r()?{}:{obj:e,k:o(i.shift())}}function o(e,t,o){var r=n(e,t,Object),i=r.obj,a=r.k;i[a]=o}function r(e,t,o,r){var i=n(e,t,Object),a=i.obj,s=i.k;a[s]=a[s]||[],r&&(a[s]=a[s].concat(o)),r||a[s].push(o)}function i(e,t){var o=n(e,t),r=o.obj,i=o.k;if(r)return r[i]}function a(e,t,n){for(var o in t)o in e?"string"==typeof e[o]||e[o]instanceof String||"string"==typeof t[o]||t[o]instanceof String?n&&(e[o]=t[o]):a(e[o],t[o],n):e[o]=t[o];return e}function s(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}function l(e){return"string"==typeof e?e.replace(/[&<>"'\/]/g,function(e){return E[e]}):e}function u(e){return e.interpolation={unescapeSuffix:"HTML"},e.interpolation.prefix=e.interpolationPrefix||"__",e.interpolation.suffix=e.interpolationSuffix||"__",e.interpolation.escapeValue=e.escapeInterpolation||!1,e.interpolation.nestingPrefix=e.reusePrefix||"$t(",e.interpolation.nestingSuffix=e.reuseSuffix||")",e}function c(e){return e.resStore&&(e.resources=e.resStore),e.ns&&e.ns.defaultNs?(e.defaultNS=e.ns.defaultNs,e.ns=e.ns.namespaces):e.defaultNS=e.ns||"translation",e.fallbackToDefaultNS&&e.defaultNS&&(e.fallbackNS=e.defaultNS),e.saveMissing=e.sendMissing,e.saveMissingTo=e.sendMissingTo||"current",e.returnNull=!e.fallbackOnNull,e.returnEmptyString=!e.fallbackOnEmpty,e.returnObjects=e.returnObjectTrees,e.joinArrays="\n",e.returnedObjectHandler=e.objectTreeKeyHandler,e.parseMissingKeyHandler=e.parseMissingKey,e.appendNamespaceToMissingKey=!0,e.nsSeparator=e.nsseparator||":",e.keySeparator=e.keyseparator||".","sprintf"===e.shortcutFunction&&(e.overloadTranslationOptionHandler=function(e){for(var t=[],n=1;n1&&void 0!==arguments[1]?arguments[1]:{};S(this,e),this.init(t,n)}return e.prototype.init=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=t.prefix||"i18next:",this.logger=e||N,this.options=t,this.debug=t.debug},e.prototype.setDebug=function(e){this.debug=e},e.prototype.log=function(){for(var e=arguments.length,t=Array(e),n=0;n-1&&n.observers[e].splice(o,1)}else delete n.observers[e]})},e.prototype.emit=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),o=1;o":">",'"':""","'":"'","/":"/"},A=function(e){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:["translation"],defaultNS:"translation"};S(this,t);var r=O(this,e.call(this));return r.data=n,r.options=o,r}return w(t,e),t.prototype.addNamespaces=function(e){this.options.ns.indexOf(e)<0&&this.options.ns.push(e)},t.prototype.removeNamespaces=function(e){var t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1)},t.prototype.getResource=function(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},r=o.keySeparator||this.options.keySeparator;void 0===r&&(r=".");var a=[e,t];return n&&"string"!=typeof n&&(a=a.concat(n)),n&&"string"==typeof n&&(a=a.concat(r?n.split(r):n)),e.indexOf(".")>-1&&(a=e.split(".")),i(this.data,a)},t.prototype.addResource=function(e,t,n,r){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1},a=this.options.keySeparator;void 0===a&&(a=".");var s=[e,t];n&&(s=s.concat(a?n.split(a):n)),e.indexOf(".")>-1&&(s=e.split("."),r=t,t=s[1]),this.addNamespaces(t),o(this.data,s,r),i.silent||this.emit("added",e,t,n,r)},t.prototype.addResources=function(e,t,n){for(var o in n)"string"==typeof n[o]&&this.addResource(e,t,o,n[o],{silent:!0});this.emit("added",e,t,n)},t.prototype.addResourceBundle=function(e,t,n,r,s){var l=[e,t];e.indexOf(".")>-1&&(l=e.split("."),r=n,n=t,t=l[1]),this.addNamespaces(t);var u=i(this.data,l)||{};r?a(u,n,s):u=k({},u,n),o(this.data,l,u),this.emit("added",e,t,n)},t.prototype.removeResourceBundle=function(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit("removed",e,t)},t.prototype.hasResourceBundle=function(e,t){return void 0!==this.getResource(e,t)},t.prototype.getResourceBundle=function(e,t){return t||(t=this.options.defaultNS),"v1"===this.options.compatibilityAPI?k({},this.getResource(e,t)):this.getResource(e,t)},t.prototype.toJSON=function(){return this.data},t}(R),T={processors:{},addPostProcessor:function(e){this.processors[e.name]=e},handle:function(e,t,n,o,r){var i=this;return e.forEach(function(e){i.processors[e]&&(t=i.processors[e].process(t,n,o,r))}),t}},M=function(e){function n(o){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};S(this,n);var i=O(this,e.call(this));return t(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector"],o,i),i.options=r,i.logger=C.create("translator"),i}return w(n,e),n.prototype.changeLanguage=function(e){e&&(this.language=e)},n.prototype.exists=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}};return"v1"===this.options.compatibilityAPI&&(t=f(t)),void 0!==this.resolve(e,t)},n.prototype.extractFromKey=function(e,t){var n=t.nsSeparator||this.options.nsSeparator;void 0===n&&(n=":");var o=t.keySeparator||this.options.keySeparator||".",r=t.ns||this.options.defaultNS;if(n&&e.indexOf(n)>-1){var i=e.split(n);(n!==o||n===o&&this.options.ns.indexOf(i[0])>-1)&&(r=i.shift()),e=i.join(o)}return"string"==typeof r&&(r=[r]),{key:e,namespaces:r}},n.prototype.translate=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("object"!==("undefined"==typeof t?"undefined":x(t))?t=this.options.overloadTranslationOptionHandler(arguments):"v1"===this.options.compatibilityAPI&&(t=f(t)),void 0===e||null===e||""===e)return"";"number"==typeof e&&(e=String(e)),"string"==typeof e&&(e=[e]);var n=t.keySeparator||this.options.keySeparator||".",o=this.extractFromKey(e[e.length-1],t),r=o.key,i=o.namespaces,a=i[i.length-1],s=t.lng||this.language,l=t.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(s&&"cimode"===s.toLowerCase()){if(l){var u=t.nsSeparator||this.options.nsSeparator;return a+u+r}return r}var c=this.resolve(e,t),p=Object.prototype.toString.apply(c),g=["[object Number]","[object Function]","[object RegExp]"],h=void 0!==t.joinArrays?t.joinArrays:this.options.joinArrays;if(c&&"string"!=typeof c&&g.indexOf(p)<0&&(!h||"[object Array]"!==p)){if(!t.returnObjects&&!this.options.returnObjects)return this.logger.warn("accessing an object - but returnObjects options is not enabled!"),this.options.returnedObjectHandler?this.options.returnedObjectHandler(r,c,t):"key '"+r+" ("+this.language+")' returned an object instead of string.";if(t.keySeparator||this.options.keySeparator){var d="[object Array]"===p?[]:{};for(var v in c)Object.prototype.hasOwnProperty.call(c,v)&&(d[v]=this.translate(""+r+n+v,k({},t,{joinArrays:!1,ns:i})));c=d}}else if(h&&"[object Array]"===p)c=c.join(h),c&&(c=this.extendTranslation(c,r,t));else{var y=!1,b=!1;if(this.isValidLookup(c)||void 0===t.defaultValue||(y=!0,c=t.defaultValue),this.isValidLookup(c)||(b=!0,c=r),b||y){this.logger.log("missingKey",s,a,r,c);var m=[],S=this.languageUtils.getFallbackCodes(this.options.fallbackLng,t.lng||this.language);if("fallback"===this.options.saveMissingTo&&S&&S[0])for(var w=0;w1&&void 0!==arguments[1]?arguments[1]:{},o=void 0;return"string"==typeof e&&(e=[e]),e.forEach(function(e){if(!t.isValidLookup(o)){var r=t.extractFromKey(e,n),i=r.key,a=r.namespaces;t.options.fallbackNS&&(a=a.concat(t.options.fallbackNS));var s=void 0!==n.count&&"string"!=typeof n.count,l=void 0!==n.context&&"string"==typeof n.context&&""!==n.context,u=n.lngs?n.lngs:t.languageUtils.toResolveHierarchy(n.lng||t.language);a.forEach(function(e){t.isValidLookup(o)||u.forEach(function(r){if(!t.isValidLookup(o)){var a=i,u=[a],c=void 0;s&&(c=t.pluralResolver.getSuffix(r,n.count)),s&&l&&u.push(a+c),l&&u.push(a+=""+t.options.contextSeparator+n.context),s&&u.push(a+=c);for(var p=void 0;p=u.pop();)t.isValidLookup(o)||(o=t.getResource(r,e,p,n))}})})}}),o},n.prototype.isValidLookup=function(e){return!(void 0===e||!this.options.returnNull&&null===e||!this.options.returnEmptyString&&""===e)},n.prototype.getResource=function(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.resourceStore.getResource(e,t,n,o)},n}(R),_=function(){function e(t){S(this,e),this.options=t,this.whitelist=this.options.whitelist||!1,this.logger=C.create("languageUtils")}return e.prototype.getScriptPartFromCode=function(e){if(!e||e.indexOf("-")<0)return null;var t=e.split("-");return 2===t.length?null:(t.pop(),this.formatLanguageCode(t.join("-")))},e.prototype.getLanguagePartFromCode=function(e){if(!e||e.indexOf("-")<0)return e;var t=e.split("-");return this.formatLanguageCode(t[0])},e.prototype.formatLanguageCode=function(e){if("string"==typeof e&&e.indexOf("-")>-1){var t=["hans","hant","latn","cyrl","cans","mong","arab"],n=e.split("-");return this.options.lowerCaseLng?n=n.map(function(e){return e.toLowerCase()}):2===n.length?(n[0]=n[0].toLowerCase(),n[1]=n[1].toUpperCase(),t.indexOf(n[1].toLowerCase())>-1&&(n[1]=h(n[1].toLowerCase()))):3===n.length&&(n[0]=n[0].toLowerCase(),2===n[1].length&&(n[1]=n[1].toUpperCase()),"sgn"!==n[0]&&2===n[2].length&&(n[2]=n[2].toUpperCase()),t.indexOf(n[1].toLowerCase())>-1&&(n[1]=h(n[1].toLowerCase())),t.indexOf(n[2].toLowerCase())>-1&&(n[2]=h(n[2].toLowerCase()))),n.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e},e.prototype.isWhitelisted=function(e){return("languageOnly"===this.options.load||this.options.nonExplicitWhitelist)&&(e=this.getLanguagePartFromCode(e)),!this.whitelist||!this.whitelist.length||this.whitelist.indexOf(e)>-1},e.prototype.getFallbackCodes=function(e,t){if(!e)return[];if("string"==typeof e&&(e=[e]),"[object Array]"===Object.prototype.toString.apply(e))return e;if(!t)return e.default||[];var n=e[t];return n||(n=e[this.getScriptPartFromCode(t)]),n||(n=e[this.formatLanguageCode(t)]),n||(n=e.default),n||[]},e.prototype.toResolveHierarchy=function(e,t){var n=this,o=this.getFallbackCodes(t||this.options.fallbackLng||[],e),r=[],i=function(e){e&&(n.isWhitelisted(e)?r.push(e):n.logger.warn("rejecting non-whitelisted language code: "+e))};return"string"==typeof e&&e.indexOf("-")>-1?("languageOnly"!==this.options.load&&i(this.formatLanguageCode(e)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&i(this.getScriptPartFromCode(e)),"currentOnly"!==this.options.load&&i(this.getLanguagePartFromCode(e))):"string"==typeof e&&i(this.formatLanguageCode(e)),o.forEach(function(e){r.indexOf(e)<0&&i(n.formatLanguageCode(e))}),r},e}(),H=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","tg","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","es_ar","et","eu","fi","fo","fur","fy","gl","gu","ha","he","hi","hu","hy","ia","it","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt","pt_br","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","id","ja","jbo","ka","kk","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21}],U={1:function(e){return Number(e>1)},2:function(e){return Number(1!=e)},3:function(e){return 0},4:function(e){return Number(e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2)},5:function(e){return Number(0===e?0:1==e?1:2==e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5)},6:function(e){return Number(1==e?0:e>=2&&e<=4?1:2)},7:function(e){return Number(1==e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2)},8:function(e){return Number(1==e?0:2==e?1:8!=e&&11!=e?2:3)},9:function(e){return Number(e>=2)},10:function(e){return Number(1==e?0:2==e?1:e<7?2:e<11?3:4)},11:function(e){return Number(1==e||11==e?0:2==e||12==e?1:e>2&&e<20?2:3)},12:function(e){return Number(e%10!=1||e%100==11)},13:function(e){return Number(0!==e)},14:function(e){return Number(1==e?0:2==e?1:3==e?2:3)},15:function(e){return Number(e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2)},16:function(e){return Number(e%10==1&&e%100!=11?0:0!==e?1:2)},17:function(e){return Number(1==e||e%10==1?0:1)},18:function(e){return Number(0==e?0:1==e?1:2)},19:function(e){return Number(1==e?0:0===e||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3)},20:function(e){return Number(1==e?0:0===e||e%100>0&&e%100<20?1:2)},21:function(e){return Number(e%100==1?1:e%100==2?2:e%100==3||e%100==4?3:0)}},V=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};S(this,e),this.languageUtils=t,this.options=n,this.logger=C.create("pluralResolver"),this.rules=d()}return e.prototype.addRule=function(e,t){this.rules[e]=t},e.prototype.getRule=function(e){return this.rules[this.languageUtils.getLanguagePartFromCode(e)]},e.prototype.needsPlural=function(e){var t=this.getRule(e);return t&&t.numbers.length>1},e.prototype.getSuffix=function(e,t){var n=this,o=this.getRule(e);if(o){var r=function(){if(1===o.numbers.length)return{v:""};var e=o.noAbs?o.plurals(t):o.plurals(Math.abs(t)),r=o.numbers[e];n.options.simplifyPluralSuffix&&2===o.numbers.length&&1===o.numbers[0]&&(2===r?r="plural":1===r&&(r=""));var i=function(){return n.options.prepend&&r.toString()?n.options.prepend+r.toString():r.toString()};return"v1"===n.options.compatibilityJSON?1===r?{v:""}:"number"==typeof r?{v:"_plural_"+r.toString()}:{v:i()}:"v2"===n.options.compatibilityJSON||2===o.numbers.length&&1===o.numbers[0]?{v:i()}:2===o.numbers.length&&1===o.numbers[0]?{v:i()}:{v:n.options.prepend&&e.toString()?n.options.prepend+e.toString():e.toString()}}();if("object"===("undefined"==typeof r?"undefined":x(r)))return r.v}return this.logger.warn("no plural rule found for: "+e),""},e}(),I=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};S(this,t),this.logger=C.create("interpolator"),this.init(e,!0)}return t.prototype.init=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];t&&(this.options=e,this.format=e.interpolation&&e.interpolation.format||function(e){return e},this.escape=e.interpolation&&e.interpolation.escape||l),e.interpolation||(e.interpolation={escapeValue:!0});var n=e.interpolation;this.escapeValue=void 0===n.escapeValue||n.escapeValue,this.prefix=n.prefix?s(n.prefix):n.prefixEscaped||"{{",this.suffix=n.suffix?s(n.suffix):n.suffixEscaped||"}}",this.formatSeparator=n.formatSeparator?n.formatSeparator:n.formatSeparator||",",this.unescapePrefix=n.unescapeSuffix?"":n.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":n.unescapeSuffix||"",this.nestingPrefix=n.nestingPrefix?s(n.nestingPrefix):n.nestingPrefixEscaped||s("$t("),this.nestingSuffix=n.nestingSuffix?s(n.nestingSuffix):n.nestingSuffixEscaped||s(")"),this.resetRegExp()},t.prototype.reset=function(){this.options&&this.init(this.options)},t.prototype.resetRegExp=function(){var e=this.prefix+"(.+?)"+this.suffix;this.regexp=new RegExp(e,"g");var t=""+this.prefix+this.unescapePrefix+"(.+?)"+this.unescapeSuffix+this.suffix;this.regexpUnescape=new RegExp(t,"g");var n=this.nestingPrefix+"(.+?)"+this.nestingSuffix;this.nestingRegexp=new RegExp(n,"g")},t.prototype.interpolate=function(t,n,o){function r(e){return e.replace(/\$/g,"$$$$")}var a=this,s=void 0,l=void 0,u=function(e){if(e.indexOf(a.formatSeparator)<0)return i(n,e);var t=e.split(a.formatSeparator),r=t.shift().trim(),s=t.join(a.formatSeparator).trim();return a.format(i(n,r),s,o)};for(this.resetRegExp();s=this.regexpUnescape.exec(t);)l=u(s[1].trim()),t=t.replace(s[0],l),this.regexpUnescape.lastIndex=0;for(;s=this.regexp.exec(t);)l=u(s[1].trim()),"string"!=typeof l&&(l=e(l)),l||(this.logger.warn("missed to pass in variable "+s[1]+" for interpolating "+t),l=""),l=r(this.escapeValue?this.escape(l):l),t=t.replace(s[0],l),this.regexp.lastIndex=0;return t},t.prototype.nest=function(t,n){function o(e){if(e.indexOf(",")<0)return e;var t=e.split(",");e=t.shift();var n=t.join(",");n=this.interpolate(n,s),n=n.replace(/'/g,'"');try{s=JSON.parse(n)}catch(t){this.logger.error("failed parsing options string in nesting for key "+e,t)}return e}var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=void 0,a=void 0,s=k({},r);for(s.applyPostProcessor=!1;i=this.nestingRegexp.exec(t);){if(a=n(o.call(this,i[1].trim()),s),a&&i[0]===t&&"string"!=typeof a)return a;"string"!=typeof a&&(a=e(a)),a||(this.logger.warn("missed to resolve "+i[1]+" for nesting "+t),a=""),t=t.replace(i[0],a),this.regexp.lastIndex=0}return t},t}(),F=function(e){function t(n,o,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};S(this,t);var a=O(this,e.call(this));return a.backend=n,a.store=o,a.services=r,a.options=i,a.logger=C.create("backendConnector"),a.state={},a.queue=[],a.backend&&a.backend.init&&a.backend.init(r,i.backend,i),a}return w(t,e),t.prototype.queueLoad=function(e,t,n){var o=this,r=[],i=[],a=[],s=[];return e.forEach(function(e){var n=!0;t.forEach(function(t){var a=e+"|"+t;o.store.hasResourceBundle(e,t)?o.state[a]=2:o.state[a]<0||(1===o.state[a]?i.indexOf(a)<0&&i.push(a):(o.state[a]=1,n=!1,i.indexOf(a)<0&&i.push(a),r.indexOf(a)<0&&r.push(a),s.indexOf(t)<0&&s.push(t)))}),n||a.push(e)}),(r.length||i.length)&&this.queue.push({pending:i,loaded:{},errors:[],callback:n}),{toLoad:r,pending:i,toLoadLanguages:a,toLoadNamespaces:s}},t.prototype.loaded=function(e,t,n){var o=this,i=e.split("|"),a=L(i,2),s=a[0],l=a[1];t&&this.emit("failedLoading",s,l,t),n&&this.store.addResourceBundle(s,l,n),this.state[e]=t?-1:2,this.queue.forEach(function(n){r(n.loaded,[s],l),v(n.pending,e),t&&n.errors.push(t),0!==n.pending.length||n.done||(o.emit("loaded",n.loaded),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())}),this.queue=this.queue.filter(function(e){return!e.done})},t.prototype.read=function(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,r=this,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:250,a=arguments[5];return e.length?this.backend[n](e,t,function(s,l){return s&&l&&o<5?void setTimeout(function(){r.read.call(r,e,t,n,o+1,2*i,a)},i):void a(s,l)}):a(null,{})},t.prototype.load=function(e,t,n){var o=this;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),n&&n();var r=k({},this.backend.options,this.options.backend);"string"==typeof e&&(e=this.services.languageUtils.toResolveHierarchy(e)),"string"==typeof t&&(t=[t]);var a=this.queueLoad(e,t,n);return a.toLoad.length?void(r.allowMultiLoading&&this.backend.readMulti?this.read(a.toLoadLanguages,a.toLoadNamespaces,"readMulti",null,null,function(e,t){e&&o.logger.warn("loading namespaces "+a.toLoadNamespaces.join(", ")+" for languages "+a.toLoadLanguages.join(", ")+" via multiloading failed",e),!e&&t&&o.logger.log("successfully loaded namespaces "+a.toLoadNamespaces.join(", ")+" for languages "+a.toLoadLanguages.join(", ")+" via multiloading",t),a.toLoad.forEach(function(n){var r=n.split("|"),a=L(r,2),s=a[0],l=a[1],u=i(t,[s,l]);if(u)o.loaded(n,e,u);else{var c="loading namespace "+l+" for language "+s+" via multiloading failed";o.loaded(n,c),o.logger.error(c)}})}):a.toLoad.forEach(function(e){o.loadOne(e)})):(a.pending.length||n(),null)},t.prototype.reload=function(e,t){var n=this;this.backend||this.logger.warn("No backend was added via i18next.use. Will not load resources.");var o=k({},this.backend.options,this.options.backend);"string"==typeof e&&(e=this.services.languageUtils.toResolveHierarchy(e)),"string"==typeof t&&(t=[t]),o.allowMultiLoading&&this.backend.readMulti?this.read(e,t,"readMulti",null,null,function(o,r){o&&n.logger.warn("reloading namespaces "+t.join(", ")+" for languages "+e.join(", ")+" via multiloading failed",o),!o&&r&&n.logger.log("successfully reloaded namespaces "+t.join(", ")+" for languages "+e.join(", ")+" via multiloading",r),e.forEach(function(e){t.forEach(function(t){var a=i(r,[e,t]);if(a)n.loaded(e+"|"+t,o,a);else{var s="reloading namespace "+t+" for language "+e+" via multiloading failed";n.loaded(e+"|"+t,s),n.logger.error(s)}})})}):e.forEach(function(e){t.forEach(function(t){n.loadOne(e+"|"+t,"re")})})},t.prototype.loadOne=function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",o=e.split("|"),r=L(o,2),i=r[0],a=r[1];this.read(i,a,"read",null,null,function(o,r){o&&t.logger.warn(n+"loading namespace "+a+" for language "+i+" failed",o),!o&&r&&t.logger.log(n+"loaded namespace "+a+" for language "+i,r),t.loaded(e,o,r)})},t.prototype.saveMissing=function(e,t,n,o){this.backend&&this.backend.create&&this.backend.create(e,t,n,o),e&&e[0]&&this.store.addResource(e[0],t,n,o)},t}(R),D=function(e){function t(n,o,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};S(this,t);var a=O(this,e.call(this));return a.cache=n,a.store=o,a.services=r,a.options=i,a.logger=C.create("cacheConnector"),a.cache&&a.cache.init&&a.cache.init(r,i.cache,i),a}return w(t,e),t.prototype.load=function(e,t,n){var o=this;if(!this.cache)return n&&n();var r=k({},this.cache.options,this.options.cache),i="string"==typeof e?this.services.languageUtils.toResolveHierarchy(e):e;r.enabled?this.cache.load(i,function(e,t){if(e&&o.logger.error("loading languages "+i.join(", ")+" from cache failed",e),t)for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r))for(var a in t[r])if(Object.prototype.hasOwnProperty.call(t[r],a)&&"i18nStamp"!==a){var s=t[r][a];s&&o.store.addResourceBundle(r,a,s)}n&&n()}):n&&n()},t.prototype.save=function(){this.cache&&this.options.cache&&this.options.cache.enabled&&this.cache.save(this.store.data)},t}(R),K=function(e){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments[1];S(this,t);var r=O(this,e.call(this));if(r.options=b(n),r.services={},r.logger=C,r.modules={external:[]},o&&!r.isInitialized&&!n.isClone){var i;if(!r.options.initImmediate)return i=r.init(n,o),O(r,i);setTimeout(function(){r.init(n,o)},0)}return r}return w(t,e),t.prototype.init=function(e,t){function n(e){return e?"function"==typeof e?new e:e:null}var o=this;"function"==typeof e&&(t=e,e={}),e||(e={}),"v1"===e.compatibilityAPI?this.options=k({},y(),b(c(e)),{}):"v1"===e.compatibilityJSON?this.options=k({},y(),b(p(e)),{}):this.options=k({},y(),this.options,b(e)),this.format=this.options.interpolation.format,t||(t=m),this.options.isClone||!function(){o.modules.logger?C.init(n(o.modules.logger),o.options):C.init(null,o.options);var e=new _(o.options);o.store=new A(o.options.resources,o.options);var t=o.services;t.logger=C,t.resourceStore=o.store,t.resourceStore.on("added removed",function(e,n){t.cacheConnector.save()}),t.languageUtils=e,t.pluralResolver=new V(e,{prepend:o.options.pluralSeparator,compatibilityJSON:o.options.compatibilityJSON,simplifyPluralSuffix:o.options.simplifyPluralSuffix}),t.interpolator=new I(o.options),t.backendConnector=new F(n(o.modules.backend),t.resourceStore,t,o.options),t.backendConnector.on("*",function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r1?t-1:0),r=1;r1?t-1:0),r=1;r0&&void 0!==arguments[0]?arguments[0]:m;if(this.options.resources)t(null);else{var n=function(){if(e.language&&"cimode"===e.language.toLowerCase())return{v:t()};var n=[],o=function(t){if(t){var o=e.services.languageUtils.toResolveHierarchy(t);o.forEach(function(e){n.indexOf(e)<0&&n.push(e)})}};if(e.language)o(e.language);else{var r=e.services.languageUtils.getFallbackCodes(e.options.fallbackLng);r.forEach(function(e){return o(e)})}e.options.preload&&e.options.preload.forEach(function(e){return o(e)}),e.services.cacheConnector.load(n,e.options.ns,function(){e.services.backendConnector.load(n,e.options.ns,t)})}();if("object"===("undefined"==typeof n?"undefined":x(n)))return n.v}},t.prototype.reloadResources=function(e,t){e||(e=this.languages),t||(t=this.options.ns),this.services.backendConnector.reload(e,t)},t.prototype.use=function(e){return"backend"===e.type&&(this.modules.backend=e),"cache"===e.type&&(this.modules.cache=e),("logger"===e.type||e.log&&e.warn&&e.error)&&(this.modules.logger=e),"languageDetector"===e.type&&(this.modules.languageDetector=e),"postProcessor"===e.type&&T.addPostProcessor(e),"3rdParty"===e.type&&this.modules.external.push(e),this},t.prototype.changeLanguage=function(e,t){var n=this,o=function(e,o){o&&(n.emit("languageChanged",o),n.logger.log("languageChanged",o)),t&&t(e,function(){return n.t.apply(n,arguments)})},r=function(e){e&&(n.language=e,n.languages=n.services.languageUtils.toResolveHierarchy(e),n.translator.changeLanguage(e),n.services.languageDetector&&n.services.languageDetector.cacheUserLanguage(e)),n.loadResources(function(t){o(t,e)})};e||!this.services.languageDetector||this.services.languageDetector.async?!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(r):r(e):r(this.services.languageDetector.detect())},t.prototype.getFixedT=function(e,t){var n=this,o=function e(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=k({},o);return r.lng=r.lng||e.lng,r.ns=r.ns||e.ns,n.t(t,r)};return o.lng=e,o.ns=t,o},t.prototype.t=function(){var e;return this.translator&&(e=this.translator).translate.apply(e,arguments)},t.prototype.exists=function(){var e;return this.translator&&(e=this.translator).exists.apply(e,arguments)},t.prototype.setDefaultNamespace=function(e){this.options.defaultNS=e},t.prototype.loadNamespaces=function(e,t){var n=this;return this.options.ns?("string"==typeof e&&(e=[e]),e.forEach(function(e){n.options.ns.indexOf(e)<0&&n.options.ns.push(e)}),void this.loadResources(t)):t&&t()},t.prototype.loadLanguages=function(e,t){"string"==typeof e&&(e=[e]);var n=this.options.preload||[],o=e.filter(function(e){return n.indexOf(e)<0});return o.length?(this.options.preload=n.concat(o),void this.loadResources(t)):t()},t.prototype.dir=function(e){if(e||(e=this.languages&&this.languages.length>0?this.languages[0]:this.language),!e)return"rtl";var t=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam"];return t.indexOf(this.services.languageUtils.getLanguagePartFromCode(e))>=0?"rtl":"ltr"},t.prototype.createInstance=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments[1];return new t(e,n)},t.prototype.cloneInstance=function(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:m,r=k({},this.options,n,{isClone:!0}),i=new t(r,o),a=["store","services","language"];return a.forEach(function(t){i[t]=e[t]}),i.translator=new M(i.services,i.options),i.translator.on("*",function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),o=1;o0){var r=n[a].substring(0,i);r===e.lookupQuerystring&&(o=n[a].substring(i+1))}}return o}},l=void 0;try{l="undefined"!==window&&null!==window.localStorage;var s="i18next.translate.boo";window.localStorage.setItem(s,"foo"),window.localStorage.removeItem(s)}catch(e){l=!1}var g={name:"localStorage",lookup:function(e){var o=void 0;if(e.lookupLocalStorage&&l){var t=window.localStorage.getItem(e.lookupLocalStorage);t&&(o=t)}return o},cacheUserLanguage:function(e,o){o.lookupLocalStorage&&l&&window.localStorage.setItem(o.lookupLocalStorage,e)}},f={name:"navigator",lookup:function(e){var o=[];if("undefined"!=typeof navigator){if(navigator.languages)for(var t=0;t0?o:void 0}},d={name:"htmlTag",lookup:function(e){var o=void 0,t=e.htmlTag||("undefined"!=typeof document?document.documentElement:null);return t&&"function"==typeof t.getAttribute&&(o=t.getAttribute("lang")),o}},v=function(){function n(e){var o=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];t.classCallCheck(this,n),this.type="languageDetector",this.detectors={},this.init(e,o)}return t.createClass(n,[{key:"init",value:function(t){var n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],a=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];this.services=t,this.options=e(n,this.options||{},o()),this.i18nOptions=a,this.addDetector(u),this.addDetector(c),this.addDetector(g),this.addDetector(f),this.addDetector(d)}},{key:"addDetector",value:function(e){this.detectors[e.name]=e}},{key:"detect",value:function(e){var o=this;e||(e=this.options.order);var t=[];e.forEach(function(e){if(o.detectors[e]){var n=o.detectors[e].lookup(o.options);n&&"string"==typeof n&&(n=[n]),n&&(t=t.concat(n))}});var n=void 0;return t.forEach(function(e){if(!n){var t=o.services.languageUtils.formatLanguageCode(e);o.services.languageUtils.isWhitelisted(t)&&(n=t)}}),n||this.i18nOptions.fallbackLng[0]}},{key:"cacheUserLanguage",value:function(e,o){var t=this;o||(o=this.options.caches),o&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||o.forEach(function(o){t.detectors[o]&&t.detectors[o].cacheUserLanguage(e,t.options)}))}}]),n}();return v.type="languageDetector",v});
\ No newline at end of file
diff --git a/frontend/js/libs/i18nextXHRBackend.min.js b/frontend/js/libs/i18nextXHRBackend.min.js
deleted file mode 100644
index 23ac02b17..000000000
--- a/frontend/js/libs/i18nextXHRBackend.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * backend layer for i18next using browsers xhr
- * @version 1.4.2
- * @license MIT
- * @see https://github.com/i18next/i18next-xhr-backend
- */
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.i18nextXHRBackend=e()}(this,function(){"use strict";function t(t){return r.call(s.call(arguments,1),function(e){if(e)for(var n in e)void 0===t[n]&&(t[n]=e[n])}),t}function e(t,e){if(e&&"object"===("undefined"==typeof e?"undefined":u(e))){var n="",o=encodeURIComponent;for(var i in e)n+="&"+o(i)+"="+o(e[i]);if(!n)return t;t=t+(t.indexOf("?")!==-1?"&":"?")+n.slice(1)}return t}function n(t,n,o,i,a){i&&"object"===("undefined"==typeof i?"undefined":u(i))&&(a||(i._t=new Date),i=e("",i).slice(1)),n.queryStringParams&&(t=e(t,n.queryStringParams));try{var r;r=XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("MSXML2.XMLHTTP.3.0"),r.open(i?"POST":"GET",t,1),n.crossDomain||r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r.withCredentials=!!n.withCredentials,i&&r.setRequestHeader("Content-type","application/x-www-form-urlencoded");var s=n.customHeaders;if(s)for(var l in s)r.setRequestHeader(l,s[l]);r.onreadystatechange=function(){r.readyState>3&&o&&o(r.responseText,r)},r.send(i)}catch(t){console&&console.log(t)}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(){return{loadPath:"/locales/{{lng}}/{{ns}}.json",addPath:"locales/add/{{lng}}/{{ns}}",allowMultiLoading:!1,parse:JSON.parse,crossDomain:!1,ajax:n}}var a=[],r=a.forEach,s=a.slice,u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};o(this,e),this.init(t,n),this.type="backend"}return l(e,[{key:"init",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.services=e,this.options=t(n,this.options||{},i())}},{key:"readMulti",value:function(t,e,n){var o=this.options.loadPath;"function"==typeof this.options.loadPath&&(o=this.options.loadPath(t,e));var i=this.services.interpolator.interpolate(o,{lng:t.join("+"),ns:e.join("+")});this.loadUrl(i,n)}},{key:"read",value:function(t,e,n){var o=this.options.loadPath;"function"==typeof this.options.loadPath&&(o=this.options.loadPath([t],[e]));var i=this.services.interpolator.interpolate(o,{lng:t,ns:e});this.loadUrl(i,n)}},{key:"loadUrl",value:function(t,e){var n=this;this.options.ajax(t,this.options,function(o,i){if(i.status>=500&&i.status<600)return e("failed loading "+t,!0);if(i.status>=400&&i.status<500)return e("failed loading "+t,!1);var a=void 0,r=void 0;try{a=n.options.parse(o,t)}catch(e){r="failed parsing "+t+" to json"}return r?e(r,!1):void e(null,a)})}},{key:"create",value:function(t,e,n,o){var i=this;"string"==typeof t&&(t=[t]);var a={};a[n]=o||"",t.forEach(function(t){var n=i.services.interpolator.interpolate(i.options.addPath,{lng:t,ns:e});i.options.ajax(n,i.options,function(t,e){},a)})}}]),e}();return c.type="backend",c});
\ No newline at end of file
diff --git a/frontend/js/libs/jquery-1.8.0.js b/frontend/js/libs/jquery-1.8.0.js
deleted file mode 100644
index dfe5eb00a..000000000
--- a/frontend/js/libs/jquery-1.8.0.js
+++ /dev/null
@@ -1,9227 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.8.0
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: Thu Aug 09 2012 16:24:48 GMT-0400 (Eastern Daylight Time)
- */
-(function( window, undefined ) {
-var
- // A central reference to the root jQuery(document)
- rootjQuery,
-
- // The deferred used on DOM ready
- readyList,
-
- // Use the correct document accordingly with window argument (sandbox)
- document = window.document,
- location = window.location,
- navigator = window.navigator,
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- // Save a reference to some core methods
- core_push = Array.prototype.push,
- core_slice = Array.prototype.slice,
- core_indexOf = Array.prototype.indexOf,
- core_toString = Object.prototype.toString,
- core_hasOwn = Object.prototype.hasOwnProperty,
- core_trim = String.prototype.trim,
-
- // Define a local copy of jQuery
- jQuery = function( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
- },
-
- // Used for matching numbers
- core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
-
- // Used for detecting and trimming whitespace
- core_rnotwhite = /\S/,
- core_rspace = /\s+/,
-
- // IE doesn't match non-breaking spaces with \s
- rtrim = core_rnotwhite.test("\xA0") ? (/^[\s\xA0]+|[\s\xA0]+$/g) : /^\s+|\s+$/g,
-
- // A simple way to check for HTML strings
- // Prioritize #id over to avoid XSS via location.hash (#9521)
- rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
-
- // Matches dashed string for camelizing
- rmsPrefix = /^-ms-/,
- rdashAlpha = /-([\da-z])/gi,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function( all, letter ) {
- return ( letter + "" ).toUpperCase();
- },
-
- // The ready event handler and self cleanup method
- DOMContentLoaded = function() {
- if ( document.addEventListener ) {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- } else if ( document.readyState === "complete" ) {
- // we're here because readyState === "complete" in oldIE
- // which is good enough for us to call the dom ready!
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
- jQuery.ready();
- }
- },
-
- // [[Class]] -> type pairs
- class2type = {};
-
-jQuery.fn = jQuery.prototype = {
- constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
-
- // Handle $(""), $(null), $(undefined), $(false)
- if ( !selector ) {
- return this;
- }
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = rquickExpr.exec( selector );
- }
-
- // Match html or make sure no context is specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
- doc = ( context && context.nodeType ? context.ownerDocument || context : document );
-
- // scripts is true for back-compat
- selector = jQuery.parseHTML( match[1], doc, true );
- if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
- this.attr.call( selector, context, true );
- }
-
- return jQuery.merge( this, selector );
-
- // HANDLE: $(#id)
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector: "",
-
- // The current version of jQuery being used
- jquery: "1.8.0",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- toArray: function() {
- return core_slice.call( this );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems, name, selector ) {
-
- // Build a new jQuery matched element set
- var ret = jQuery.merge( this.constructor(), elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" ) {
- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready: function( fn ) {
- // Add the callback
- jQuery.ready.promise().done( fn );
-
- return this;
- },
-
- eq: function( i ) {
- i = +i;
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, i + 1 );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- slice: function() {
- return this.pushStack( core_slice.apply( this, arguments ),
- "slice", core_slice.call(arguments).join(",") );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
-
- end: function() {
- return this.prevObject || this.constructor(null);
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: core_push,
- sort: [].sort,
- splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray(src) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend({
- noConflict: function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
-
- // Abort if there are pending holds or we're already ready
- if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
- return;
- }
-
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger("ready").off("ready");
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return jQuery.type(obj) === "function";
- },
-
- isArray: Array.isArray || function( obj ) {
- return jQuery.type(obj) === "array";
- },
-
- isWindow: function( obj ) {
- return obj != null && obj == obj.window;
- },
-
- isNumeric: function( obj ) {
- return !isNaN( parseFloat(obj) ) && isFinite( obj );
- },
-
- type: function( obj ) {
- return obj == null ?
- String( obj ) :
- class2type[ core_toString.call(obj) ] || "object";
- },
-
- isPlainObject: function( obj ) {
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- try {
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !core_hasOwn.call(obj, "constructor") &&
- !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
- return false;
- }
- } catch ( e ) {
- // IE8,9 Will throw exceptions on certain host objects #9897
- return false;
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
-
- var key;
- for ( key in obj ) {}
-
- return key === undefined || core_hasOwn.call( obj, key );
- },
-
- isEmptyObject: function( obj ) {
- var name;
- for ( name in obj ) {
- return false;
- }
- return true;
- },
-
- error: function( msg ) {
- throw new Error( msg );
- },
-
- // data: string of html
- // context (optional): If specified, the fragment will be created in this context, defaults to document
- // scripts (optional): If true, will include scripts passed in the html string
- parseHTML: function( data, context, scripts ) {
- var parsed;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- if ( typeof context === "boolean" ) {
- scripts = context;
- context = 0;
- }
- context = context || document;
-
- // Single tag
- if ( (parsed = rsingleTag.exec( data )) ) {
- return [ context.createElement( parsed[1] ) ];
- }
-
- parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
- return jQuery.merge( [],
- (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
- },
-
- parseJSON: function( data ) {
- if ( !data || typeof data !== "string") {
- return null;
- }
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
-
- return ( new Function( "return " + data ) )();
-
- }
- jQuery.error( "Invalid JSON: " + data );
- },
-
- // Cross-browser xml parsing
- parseXML: function( data ) {
- var xml, tmp;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- try {
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data , "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
- } catch( e ) {
- xml = undefined;
- }
- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
- },
-
- noop: function() {},
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && core_rnotwhite.test( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Microsoft forgot to hump their vendor prefix (#9572)
- camelCase: function( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
- },
-
- // args is for internal usage only
- each: function( obj, callback, args ) {
- var name,
- i = 0,
- length = obj.length,
- isObj = length === undefined || jQuery.isFunction( obj );
-
- if ( args ) {
- if ( isObj ) {
- for ( name in obj ) {
- if ( callback.apply( obj[ name ], args ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.apply( obj[ i++ ], args ) === false ) {
- break;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isObj ) {
- for ( name in obj ) {
- if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
- break;
- }
- }
- }
- }
-
- return obj;
- },
-
- // Use native String.trim function wherever possible
- trim: core_trim ?
- function( text ) {
- return text == null ?
- "" :
- core_trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function( text ) {
- return text == null ?
- "" :
- text.toString().replace( rtrim, "" );
- },
-
- // results is for internal usage only
- makeArray: function( arr, results ) {
- var type,
- ret = results || [];
-
- if ( arr != null ) {
- // The window, strings (and functions) also have 'length'
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- type = jQuery.type( arr );
-
- if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
- core_push.call( ret, arr );
- } else {
- jQuery.merge( ret, arr );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, arr, i ) {
- var len;
-
- if ( arr ) {
- if ( core_indexOf ) {
- return core_indexOf.call( arr, elem, i );
- }
-
- len = arr.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
- for ( ; i < len; i++ ) {
- // Skip accessing in sparse arrays
- if ( i in arr && arr[ i ] === elem ) {
- return i;
- }
- }
- }
-
- return -1;
- },
-
- merge: function( first, second ) {
- var l = second.length,
- i = first.length,
- j = 0;
-
- if ( typeof l === "number" ) {
- for ( ; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, inv ) {
- var retVal,
- ret = [],
- i = 0,
- length = elems.length;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( ; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var value, key,
- ret = [],
- i = 0,
- length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return ret.concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- var tmp, args, proxy;
-
- if ( typeof context === "string" ) {
- tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- args = core_slice.call( arguments, 2 );
- proxy = function() {
- return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Multifunctional method to get and set values of a collection
- // The value/s can optionally be executed if it's a function
- access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
- var exec,
- bulk = key == null,
- i = 0,
- length = elems.length;
-
- // Sets many values
- if ( key && typeof key === "object" ) {
- for ( i in key ) {
- jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
- }
- chainable = 1;
-
- // Sets one value
- } else if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = pass === undefined && jQuery.isFunction( value );
-
- if ( bulk ) {
- // Bulk operations only iterate when executing function values
- if ( exec ) {
- exec = fn;
- fn = function( elem, key, value ) {
- return exec.call( jQuery( elem ), value );
- };
-
- // Otherwise they run against the entire set
- } else {
- fn.call( elems, value );
- fn = null;
- }
- }
-
- if ( fn ) {
- for (; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
- }
- }
-
- chainable = 1;
- }
-
- return chainable ?
- elems :
-
- // Gets
- bulk ?
- fn.call( elems ) :
- length ? fn( elems[0], key ) : emptyGet;
- },
-
- now: function() {
- return ( new Date() ).getTime();
- }
-});
-
-jQuery.ready.promise = function( obj ) {
- if ( !readyList ) {
-
- readyList = jQuery.Deferred();
-
- // Catch cases where $(document).ready() is called after the
- // browser event has already occurred.
- if ( document.readyState === "complete" || ( document.readyState !== "loading" && document.addEventListener ) ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- setTimeout( jQuery.ready, 1 );
-
- // Standards-based browsers support DOMContentLoaded
- } else if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
-
- // If IE event model is used
- } else {
- // Ensure firing before onload, maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var top = false;
-
- try {
- top = window.frameElement == null && document.documentElement;
- } catch(e) {}
-
- if ( top && top.doScroll ) {
- (function doScrollCheck() {
- if ( !jQuery.isReady ) {
-
- try {
- // Use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- top.doScroll("left");
- } catch(e) {
- return setTimeout( doScrollCheck, 50 );
- }
-
- // and execute any waiting functions
- jQuery.ready();
- }
- })();
- }
- }
- }
- return readyList.promise( obj );
-};
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-// String to Object options format cache
-var optionsCache = {};
-
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
- var object = optionsCache[ options ] = {};
- jQuery.each( options.split( core_rspace ), function( _, flag ) {
- object[ flag ] = true;
- });
- return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- * options: an optional list of space-separated options that will change how
- * the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
- // Convert options from String-formatted to Object-formatted if needed
- // (we check in cache first)
- options = typeof options === "string" ?
- ( optionsCache[ options ] || createOptions( options ) ) :
- jQuery.extend( {}, options );
-
- var // Last fire value (for non-forgettable lists)
- memory,
- // Flag to know if list was already fired
- fired,
- // Flag to know if list is currently firing
- firing,
- // First callback to fire (used internally by add and fireWith)
- firingStart,
- // End of the loop when firing
- firingLength,
- // Index of currently firing callback (modified by remove if needed)
- firingIndex,
- // Actual callback list
- list = [],
- // Stack of fire calls for repeatable lists
- stack = !options.once && [],
- // Fire callbacks
- fire = function( data ) {
- memory = options.memory && data;
- fired = true;
- firingIndex = firingStart || 0;
- firingStart = 0;
- firingLength = list.length;
- firing = true;
- for ( ; list && firingIndex < firingLength; firingIndex++ ) {
- if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
- memory = false; // To prevent further calls using add
- break;
- }
- }
- firing = false;
- if ( list ) {
- if ( stack ) {
- if ( stack.length ) {
- fire( stack.shift() );
- }
- } else if ( memory ) {
- list = [];
- } else {
- self.disable();
- }
- }
- },
- // Actual Callbacks object
- self = {
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
- // First, we save the current length
- var start = list.length;
- (function add( args ) {
- jQuery.each( args, function( _, arg ) {
- if ( jQuery.isFunction( arg ) && ( !options.unique || !self.has( arg ) ) ) {
- list.push( arg );
- } else if ( arg && arg.length ) {
- // Inspect recursively
- add( arg );
- }
- });
- })( arguments );
- // Do we need to add the callbacks to the
- // current firing batch?
- if ( firing ) {
- firingLength = list.length;
- // With memory, if we're not firing then
- // we should call right away
- } else if ( memory ) {
- firingStart = start;
- fire( memory );
- }
- }
- return this;
- },
- // Remove a callback from the list
- remove: function() {
- if ( list ) {
- jQuery.each( arguments, function( _, arg ) {
- var index;
- while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
- list.splice( index, 1 );
- // Handle firing indexes
- if ( firing ) {
- if ( index <= firingLength ) {
- firingLength--;
- }
- if ( index <= firingIndex ) {
- firingIndex--;
- }
- }
- }
- });
- }
- return this;
- },
- // Control if a given callback is in the list
- has: function( fn ) {
- return jQuery.inArray( fn, list ) > -1;
- },
- // Remove all callbacks from the list
- empty: function() {
- list = [];
- return this;
- },
- // Have the list do nothing anymore
- disable: function() {
- list = stack = memory = undefined;
- return this;
- },
- // Is it disabled?
- disabled: function() {
- return !list;
- },
- // Lock the list in its current state
- lock: function() {
- stack = undefined;
- if ( !memory ) {
- self.disable();
- }
- return this;
- },
- // Is it locked?
- locked: function() {
- return !stack;
- },
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- args = args || [];
- args = [ context, args.slice ? args.slice() : args ];
- if ( list && ( !fired || stack ) ) {
- if ( firing ) {
- stack.push( args );
- } else {
- fire( args );
- }
- }
- return this;
- },
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!fired;
- }
- };
-
- return self;
-};
-jQuery.extend({
-
- Deferred: function( func ) {
- var tuples = [
- // action, add listener, listener list, final state
- [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
- [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
- [ "notify", "progress", jQuery.Callbacks("memory") ]
- ],
- state = "pending",
- promise = {
- state: function() {
- return state;
- },
- always: function() {
- deferred.done( arguments ).fail( arguments );
- return this;
- },
- then: function( /* fnDone, fnFail, fnProgress */ ) {
- var fns = arguments;
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( tuples, function( i, tuple ) {
- var action = tuple[ 0 ],
- fn = fns[ i ];
- // deferred[ done | fail | progress ] for forwarding actions to newDefer
- deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
- function() {
- var returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise()
- .done( newDefer.resolve )
- .fail( newDefer.reject )
- .progress( newDefer.notify );
- } else {
- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
- }
- } :
- newDefer[ action ]
- );
- });
- fns = null;
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- return typeof obj === "object" ? jQuery.extend( obj, promise ) : promise;
- }
- },
- deferred = {};
-
- // Keep pipe for back-compat
- promise.pipe = promise.then;
-
- // Add list-specific methods
- jQuery.each( tuples, function( i, tuple ) {
- var list = tuple[ 2 ],
- stateString = tuple[ 3 ];
-
- // promise[ done | fail | progress ] = list.add
- promise[ tuple[1] ] = list.add;
-
- // Handle state
- if ( stateString ) {
- list.add(function() {
- // state = [ resolved | rejected ]
- state = stateString;
-
- // [ reject_list | resolve_list ].disable; progress_list.lock
- }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
- }
-
- // deferred[ resolve | reject | notify ] = list.fire
- deferred[ tuple[0] ] = list.fire;
- deferred[ tuple[0] + "With" ] = list.fireWith;
- });
-
- // Make the deferred a promise
- promise.promise( deferred );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when: function( subordinate /* , ..., subordinateN */ ) {
- var i = 0,
- resolveValues = core_slice.call( arguments ),
- length = resolveValues.length,
-
- // the count of uncompleted subordinates
- remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
- // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
- deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
- // Update function for both resolve and progress values
- updateFunc = function( i, contexts, values ) {
- return function( value ) {
- contexts[ i ] = this;
- values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
- if( values === progressValues ) {
- deferred.notifyWith( contexts, values );
- } else if ( !( --remaining ) ) {
- deferred.resolveWith( contexts, values );
- }
- };
- },
-
- progressValues, progressContexts, resolveContexts;
-
- // add listeners to Deferred subordinates; treat others as resolved
- if ( length > 1 ) {
- progressValues = new Array( length );
- progressContexts = new Array( length );
- resolveContexts = new Array( length );
- for ( ; i < length; i++ ) {
- if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
- resolveValues[ i ].promise()
- .done( updateFunc( i, resolveContexts, resolveValues ) )
- .fail( deferred.reject )
- .progress( updateFunc( i, progressContexts, progressValues ) );
- } else {
- --remaining;
- }
- }
- }
-
- // if we're not waiting on anything, resolve the master
- if ( !remaining ) {
- deferred.resolveWith( resolveContexts, resolveValues );
- }
-
- return deferred.promise();
- }
-});
-jQuery.support = (function() {
-
- var support,
- all,
- a,
- select,
- opt,
- input,
- fragment,
- eventName,
- i,
- isSupported,
- clickFn,
- div = document.createElement("div");
-
- // Preliminary tests
- div.setAttribute( "className", "t" );
- div.innerHTML = "
a";
-
- all = div.getElementsByTagName("*");
- a = div.getElementsByTagName("a")[ 0 ];
- a.style.cssText = "top:1px;float:left;opacity:.5";
-
- // Can't get basic test support
- if ( !all || !all.length || !a ) {
- return {};
- }
-
- // First batch of supports tests
- select = document.createElement("select");
- opt = select.appendChild( document.createElement("option") );
- input = div.getElementsByTagName("input")[ 0 ];
-
- support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody: !div.getElementsByTagName("tbody").length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName("link").length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- style: /top/.test( a.getAttribute("style") ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.5/.test( a.style.opacity ),
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat: !!a.style.cssFloat,
-
- // Make sure that if no value is specified for a checkbox
- // that it defaults to "on".
- // (WebKit defaults to "" instead)
- checkOn: ( input.value === "on" ),
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- optSelected: opt.selected,
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- getSetAttribute: div.className !== "t",
-
- // Tests for enctype support on a form(#6743)
- enctype: !!document.createElement("form").enctype,
-
- // Makes sure cloning an html5 element does not cause problems
- // Where outerHTML is undefined, this still works
- html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>",
-
- // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
- boxModel: ( document.compatMode === "CSS1Compat" ),
-
- // Will be defined later
- submitBubbles: true,
- changeBubbles: true,
- focusinBubbles: false,
- deleteExpando: true,
- noCloneEvent: true,
- inlineBlockNeedsLayout: false,
- shrinkWrapBlocks: false,
- reliableMarginRight: true,
- boxSizingReliable: true,
- pixelPosition: false
- };
-
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Test to see if it's possible to delete an expando from an element
- // Fails in Internet Explorer
- try {
- delete div.test;
- } catch( e ) {
- support.deleteExpando = false;
- }
-
- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
- div.attachEvent( "onclick", clickFn = function() {
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- support.noCloneEvent = false;
- });
- div.cloneNode( true ).fireEvent("onclick");
- div.detachEvent( "onclick", clickFn );
- }
-
- // Check if a radio maintains its value
- // after being appended to the DOM
- input = document.createElement("input");
- input.value = "t";
- input.setAttribute( "type", "radio" );
- support.radioValue = input.value === "t";
-
- input.setAttribute( "checked", "checked" );
-
- // #11217 - WebKit loses check when the name is after the checked attribute
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
- fragment = document.createDocumentFragment();
- fragment.appendChild( div.lastChild );
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
-
- fragment.removeChild( input );
- fragment.appendChild( div );
-
- // Technique from Juriy Zaytsev
- // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
- // We only care about the case where non-standard event systems
- // are used, namely in IE. Short-circuiting here helps us to
- // avoid an eval call (in setAttribute) which can cause CSP
- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
- if ( div.attachEvent ) {
- for ( i in {
- submit: true,
- change: true,
- focusin: true
- }) {
- eventName = "on" + i;
- isSupported = ( eventName in div );
- if ( !isSupported ) {
- div.setAttribute( eventName, "return;" );
- isSupported = ( typeof div[ eventName ] === "function" );
- }
- support[ i + "Bubbles" ] = isSupported;
- }
- }
-
- // Run tests that need a body at doc ready
- jQuery(function() {
- var container, div, tds, marginDiv,
- divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
- body = document.getElementsByTagName("body")[0];
-
- if ( !body ) {
- // Return for frameset docs that don't have a body
- return;
- }
-
- container = document.createElement("div");
- container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
- body.insertBefore( container, body.firstChild );
-
- // Construct the test element
- div = document.createElement("div");
- container.appendChild( div );
-
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
- div.innerHTML = "
t
";
- tds = div.getElementsByTagName("td");
- tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Check if empty table cells still have offsetWidth/Height
- // (IE <= 8 fail this test)
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
- // Check box-sizing and margin behavior
- div.innerHTML = "";
- div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
- support.boxSizing = ( div.offsetWidth === 4 );
- support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
-
- // NOTE: To any future maintainer, window.getComputedStyle was used here
- // instead of getComputedStyle because it gave a better gzip size.
- // The difference between window.getComputedStyle and getComputedStyle is
- // 7 bytes
- if ( window.getComputedStyle ) {
- support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
- support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. For more
- // info see bug #3333
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- marginDiv = document.createElement("div");
- marginDiv.style.cssText = div.style.cssText = divReset;
- marginDiv.style.marginRight = marginDiv.style.width = "0";
- div.style.width = "1px";
- div.appendChild( marginDiv );
- support.reliableMarginRight =
- !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
- }
-
- if ( typeof div.style.zoom !== "undefined" ) {
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- // (IE < 8 does this)
- div.innerHTML = "";
- div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "block";
- div.style.overflow = "visible";
- div.innerHTML = "";
- div.firstChild.style.width = "5px";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
- container.style.zoom = 1;
- }
-
- // Null elements to avoid leaks in IE
- body.removeChild( container );
- container = div = tds = marginDiv = null;
- });
-
- // Null elements to avoid leaks in IE
- fragment.removeChild( div );
- all = a = select = opt = input = fragment = div = null;
-
- return support;
-})();
-var rbrace = /^(?:\{.*\}|\[.*\])$/,
- rmultiDash = /([A-Z])/g;
-
-jQuery.extend({
- cache: {},
-
- deletedIds: [],
-
- // Please use with caution
- uuid: 0,
-
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
- "applet": true
- },
-
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data: function( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, ret,
- internalKey = jQuery.expando,
- getByName = typeof name === "string",
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
- return;
- }
-
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- elem[ internalKey ] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;
- } else {
- id = internalKey;
- }
- }
-
- if ( !cache[ id ] ) {
- cache[ id ] = {};
-
- // Avoids exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
- } else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
- }
- }
-
- thisCache = cache[ id ];
-
- // jQuery data() is stored in a separate object inside the object's internal data
- // cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
- }
-
- thisCache = thisCache.data;
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( getByName ) {
-
- // First Try to find as-is property data
- ret = thisCache[ name ];
-
- // Test for null|undefined property data
- if ( ret == null ) {
-
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
- }
- } else {
- ret = thisCache;
- }
-
- return ret;
- },
-
- removeData: function( elem, name, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, i, l,
-
- isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
-
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
- if ( thisCache ) {
-
- // Support array or space separated string names for data keys
- if ( !jQuery.isArray( name ) ) {
-
- // try the string as a key before any manipulation
- if ( name in thisCache ) {
- name = [ name ];
- } else {
-
- // split the camel cased version by spaces unless a key with the spaces exists
- name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split(" ");
- }
- }
- }
-
- for ( i = 0, l = name.length; i < l; i++ ) {
- delete thisCache[ name[i] ];
- }
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject( cache[ id ] ) ) {
- return;
- }
- }
-
- // Destroy the cache
- if ( isNode ) {
- jQuery.cleanData( [ elem ], true );
-
- // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
- } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
- delete cache[ id ];
-
- // When all else fails, null
- } else {
- cache[ id ] = null;
- }
- },
-
- // For internal use only.
- _data: function( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData: function( elem ) {
- var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- // nodes accept data unless otherwise specified; rejection can be conditional
- return !noData || noData !== true && elem.getAttribute("classid") === noData;
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ) {
- var parts, part, attr, name, l,
- elem = this[0],
- i = 0,
- data = null;
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = jQuery.data( elem );
-
- if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
- attr = elem.attributes;
- for ( l = attr.length; i < l; i++ ) {
- name = attr[i].name;
-
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.substring(5) );
-
- dataAttr( elem, name, data[ name ] );
- }
- }
- jQuery._data( elem, "parsedAttrs", true );
- }
- }
-
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each(function() {
- jQuery.data( this, key );
- });
- }
-
- parts = key.split( ".", 2 );
- parts[1] = parts[1] ? "." + parts[1] : "";
- part = parts[1] + "!";
-
- return jQuery.access( this, function( value ) {
-
- if ( value === undefined ) {
- data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
- // Try to fetch any internally stored data first
- if ( data === undefined && elem ) {
- data = jQuery.data( elem, key );
- data = dataAttr( elem, key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
- }
-
- parts[1] = value;
- this.each(function() {
- var self = jQuery( this );
-
- self.triggerHandler( "setData" + part, parts );
- jQuery.data( this, key, value );
- self.triggerHandler( "changeData" + part, parts );
- });
- }, null, value, arguments.length > 1, null, false );
- },
-
- removeData: function( key ) {
- return this.each(function() {
- jQuery.removeData( this, key );
- });
- }
-});
-
-function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
-
- var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- // Only convert to a number if it doesn't change the string
- +data + "" === data ? +data :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
- var name;
- for ( name in obj ) {
-
- // if the public data object is empty, the private is still empty
- if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
- continue;
- }
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
-jQuery.extend({
- queue: function( elem, type, data ) {
- var queue;
-
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- queue = jQuery._data( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !queue || jQuery.isArray(data) ) {
- queue = jQuery._data( elem, type, jQuery.makeArray(data) );
- } else {
- queue.push( data );
- }
- }
- return queue || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- fn = queue.shift(),
- hooks = jQuery._queueHooks( elem, type ),
- next = function() {
- jQuery.dequeue( elem, type );
- };
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- }
-
- if ( fn ) {
-
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- // clear up the last queue stop function
- delete hooks.stop;
- fn.call( elem, next, hooks );
- }
- if ( !queue.length && hooks ) {
- hooks.empty.fire();
- }
- },
-
- // not intended for public consumption - generates a queueHooks object, or returns the current one
- _queueHooks: function( elem, type ) {
- var key = type + "queueHooks";
- return jQuery._data( elem, key ) || jQuery._data( elem, key, {
- empty: jQuery.Callbacks("once memory").add(function() {
- jQuery.removeData( elem, type + "queue", true );
- jQuery.removeData( elem, key, true );
- })
- });
- }
-});
-
-jQuery.fn.extend({
- queue: function( type, data ) {
- var setter = 2;
-
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- setter--;
- }
-
- if ( arguments.length < setter ) {
- return jQuery.queue( this[0], type );
- }
-
- return data === undefined ?
- this :
- this.each(function() {
- var queue = jQuery.queue( this, type, data );
-
- // ensure a hooks for this queue
- jQuery._queueHooks( this, type );
-
- if ( type === "fx" && queue[0] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- dequeue: function( type ) {
- return this.each(function() {
- jQuery.dequeue( this, type );
- });
- },
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = setTimeout( next, time );
- hooks.stop = function() {
- clearTimeout( timeout );
- };
- });
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, obj ) {
- var tmp,
- count = 1,
- defer = jQuery.Deferred(),
- elements = this,
- i = this.length,
- resolve = function() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- };
-
- if ( typeof type !== "string" ) {
- obj = type;
- type = undefined;
- }
- type = type || "fx";
-
- while( i-- ) {
- if ( (tmp = jQuery._data( elements[ i ], type + "queueHooks" )) && tmp.empty ) {
- count++;
- tmp.empty.add( resolve );
- }
- }
- resolve();
- return defer.promise( obj );
- }
-});
-var nodeHook, boolHook, fixSpecified,
- rclass = /[\t\r\n]/g,
- rreturn = /\r/g,
- rtype = /^(?:button|input)$/i,
- rfocusable = /^(?:button|input|object|select|textarea)$/i,
- rclickable = /^a(?:rea|)$/i,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- getSetAttribute = jQuery.support.getSetAttribute;
-
-jQuery.fn.extend({
- attr: function( name, value ) {
- return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each(function() {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch( e ) {}
- });
- },
-
- addClass: function( value ) {
- var classNames, i, l, elem,
- setClass, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).addClass( value.call(this, j, this.className) );
- });
- }
-
- if ( value && typeof value === "string" ) {
- classNames = value.split( core_rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 ) {
- if ( !elem.className && classNames.length === 1 ) {
- elem.className = value;
-
- } else {
- setClass = " " + elem.className + " ";
-
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
- setClass += classNames[ c ] + " ";
- }
- }
- elem.className = jQuery.trim( setClass );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var removes, className, elem, c, cl, i, l;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).removeClass( value.call(this, j, this.className) );
- });
- }
- if ( (value && typeof value === "string") || value === undefined ) {
- removes = ( value || "" ).split( core_rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
- if ( elem.nodeType === 1 && elem.className ) {
-
- className = (" " + elem.className + " ").replace( rclass, " " );
-
- // loop over each item in the removal list
- for ( c = 0, cl = removes.length; c < cl; c++ ) {
- // Remove until there is nothing to remove,
- while ( className.indexOf(" " + removes[ c ] + " ") > -1 ) {
- className = className.replace( " " + removes[ c ] + " " , " " );
- }
- }
- elem.className = value ? jQuery.trim( className ) : "";
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( i ) {
- jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
- });
- }
-
- return this.each(function() {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- state = stateVal,
- classNames = value.split( core_rspace );
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space separated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
- }
-
- } else if ( type === "undefined" || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // toggle whole className
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
-
- hasClass: function( selector ) {
- var className = " " + selector + " ",
- i = 0,
- l = this.length;
- for ( ; i < l; i++ ) {
- if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val: function( value ) {
- var hooks, ret, isFunction,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
- // handle most common string cases
- ret.replace(rreturn, "") :
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return;
- }
-
- isFunction = jQuery.isFunction( value );
-
- return this.each(function( i ) {
- var val,
- self = jQuery(this);
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, self.val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map(val, function ( value ) {
- return value == null ? "" : value + "";
- });
- }
-
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- });
- }
-});
-
-jQuery.extend({
- valHooks: {
- option: {
- get: function( elem ) {
- // attributes.value is undefined in Blackberry 4.7 but
- // uses .value. See #6932
- var val = elem.attributes.value;
- return !val || val.specified ? elem.value : elem.text;
- }
- },
- select: {
- get: function( elem ) {
- var value, i, max, option,
- index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type === "select-one";
-
- // Nothing was selected
- if ( index < 0 ) {
- return null;
- }
-
- // Loop through all the selected options
- i = one ? index : 0;
- max = one ? index + 1 : options.length;
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // Don't return options that are disabled or in a disabled optgroup
- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var values = jQuery.makeArray( value );
-
- jQuery(elem).find("option").each(function() {
- this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
- });
-
- if ( !values.length ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
- attrFn: {},
-
- attr: function( elem, name, value, pass ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
- return jQuery( elem )[ name ]( value );
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- return jQuery.prop( elem, name, value );
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- // All attributes are lowercase
- // Grab necessary hook if one is defined
- if ( notxml ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
-
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, "" + value );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
-
- ret = elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret === null ?
- undefined :
- ret;
- }
- },
-
- removeAttr: function( elem, value ) {
- var propName, attrNames, name, isBool,
- i = 0;
-
- if ( value && elem.nodeType === 1 ) {
-
- attrNames = value.split( core_rspace );
-
- for ( ; i < attrNames.length; i++ ) {
- name = attrNames[ i ];
-
- if ( name ) {
- propName = jQuery.propFix[ name ] || name;
- isBool = rboolean.test( name );
-
- // See #9699 for explanation of this approach (setting first, then removal)
- // Do not do this for boolean attributes (see #10870)
- if ( !isBool ) {
- jQuery.attr( elem, name, "" );
- }
- elem.removeAttribute( getSetAttribute ? name : propName );
-
- // Set corresponding property to false for boolean attributes
- if ( isBool && propName in elem ) {
- elem[ propName ] = false;
- }
- }
- }
- }
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
- jQuery.error( "type property can't be changed" );
- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to it's default in case type is set after value
- // This is for element creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- },
- // Use the value property for back compat
- // Use the nodeHook for button elements in IE6/7 (#1954)
- value: {
- get: function( elem, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.get( elem, name );
- }
- return name in elem ?
- elem.value :
- null;
- },
- set: function( elem, value, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.set( elem, value, name );
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
- }
- },
-
- propFix: {
- tabindex: "tabIndex",
- readonly: "readOnly",
- "for": "htmlFor",
- "class": "className",
- maxlength: "maxLength",
- cellspacing: "cellSpacing",
- cellpadding: "cellPadding",
- rowspan: "rowSpan",
- colspan: "colSpan",
- usemap: "useMap",
- frameborder: "frameBorder",
- contenteditable: "contentEditable"
- },
-
- prop: function( elem, name, value ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- return ( elem[ name ] = value );
- }
-
- } else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- return elem[ name ];
- }
- }
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- var attributeNode = elem.getAttributeNode("tabindex");
-
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- undefined;
- }
- }
- }
-});
-
-// Hook for boolean attributes
-boolHook = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
- name.toLowerCase() :
- undefined;
- },
- set: function( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
- fixSpecified = {
- name: true,
- id: true,
- coords: true
- };
-
- // Use this for any attribute in IE6/7
- // This fixes almost every IE6/7 issue
- nodeHook = jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret;
- ret = elem.getAttributeNode( name );
- return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
- ret.value :
- undefined;
- },
- set: function( elem, value, name ) {
- // Set the existing or create a new attribute node
- var ret = elem.getAttributeNode( name );
- if ( !ret ) {
- ret = document.createAttribute( name );
- elem.setAttributeNode( ret );
- }
- return ( ret.value = value + "" );
- }
- };
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- });
- });
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- get: nodeHook.get,
- set: function( elem, value, name ) {
- if ( value === "" ) {
- value = "false";
- }
- nodeHook.set( elem, value, name );
- }
- };
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
- jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- get: function( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
- }
- });
- });
-}
-
-if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
- // Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
- },
- set: function( elem, value ) {
- return ( elem.style.cssText = "" + value );
- }
- };
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
- get: function( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- }
- });
-}
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
- jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
- jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- get: function( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- }
- };
- });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
- }
- }
- });
-});
-var rformElems = /^(?:textarea|input|select)$/i,
- rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
- rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|contextmenu)|click/,
- rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
- hoverHack = function( events ) {
- return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
- };
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
- add: function( elem, types, handler, data, selector ) {
-
- var elemData, eventHandle, events,
- t, tns, type, namespaces, handleObj,
- handleObjIn, handlers, special;
-
- // Don't attach events to noData or text/comment nodes (allow plain objects tho)
- if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- selector = handleObjIn.selector;
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- events = elemData.events;
- if ( !events ) {
- elemData.events = events = {};
- }
- eventHandle = elemData.handle;
- if ( !eventHandle ) {
- elemData.handle = eventHandle = function( e ) {
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
- undefined;
- };
- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
- eventHandle.elem = elem;
- }
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- types = jQuery.trim( hoverHack(types) ).split( " " );
- for ( t = 0; t < types.length; t++ ) {
-
- tns = rtypenamespace.exec( types[t] ) || [];
- type = tns[1];
- namespaces = ( tns[2] || "" ).split( "." ).sort();
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend({
- type: type,
- origType: tns[1],
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- namespace: namespaces.join(".")
- }, handleObjIn );
-
- // Init the event handler queue if we're the first
- handlers = events[ type ];
- if ( !handlers ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener/attachEvent if the special events handler returns false
- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- global: {},
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector, mappedTypes ) {
-
- var t, tns, type, origType, namespaces, origCount,
- j, events, special, eventType, handleObj,
- elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
- if ( !elemData || !(events = elemData.events) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
- for ( t = 0; t < types.length; t++ ) {
- tns = rtypenamespace.exec( types[t] ) || [];
- type = origType = tns[1];
- namespaces = tns[2];
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- for ( type in events ) {
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
- }
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector? special.delegateType : special.bindType ) || type;
- eventType = events[ type ] || [];
- origCount = eventType.length;
- namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-
- // Remove matching events
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
- eventType.splice( j--, 1 );
-
- if ( handleObj.selector ) {
- eventType.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( eventType.length === 0 && origCount !== eventType.length ) {
- if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- delete elemData.handle;
-
- // removeData also checks for emptiness and clears the expando if empty
- // so use it instead of delete
- jQuery.removeData( elem, "events", true );
- }
- },
-
- // Events that are safe to short-circuit if no handlers are attached.
- // Native DOM events should not be added, they may have inline handlers.
- customEvent: {
- "getData": true,
- "setData": true,
- "changeData": true
- },
-
- trigger: function( event, data, elem, onlyHandlers ) {
- // Don't do events on text and comment nodes
- if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
- return;
- }
-
- // Event object or event type
- var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
- type = event.type || event,
- namespaces = [];
-
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
- return;
- }
-
- if ( type.indexOf( "!" ) >= 0 ) {
- // Exclusive events trigger only for the exact event (no namespaces)
- type = type.slice(0, -1);
- exclusive = true;
- }
-
- if ( type.indexOf( "." ) >= 0 ) {
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split(".");
- type = namespaces.shift();
- namespaces.sort();
- }
-
- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
- // No jQuery handlers for this event type, and it can't have inline handlers
- return;
- }
-
- // Caller can pass in an Event, Object, or just an event type string
- event = typeof event === "object" ?
- // jQuery.Event object
- event[ jQuery.expando ] ? event :
- // Object literal
- new jQuery.Event( type, event ) :
- // Just the event type (string)
- new jQuery.Event( type );
-
- event.type = type;
- event.isTrigger = true;
- event.exclusive = exclusive;
- event.namespace = namespaces.join( "." );
- event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
- ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
- // Handle a global trigger
- if ( !elem ) {
-
- // TODO: Stop taunting the data cache; remove global events and always attach to document
- cache = jQuery.cache;
- for ( i in cache ) {
- if ( cache[ i ].events && cache[ i ].events[ type ] ) {
- jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
- }
- }
- return;
- }
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data != null ? jQuery.makeArray( data ) : [];
- data.unshift( event );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- eventPath = [[ elem, special.bindType || type ]];
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
- for ( old = elem; cur; cur = cur.parentNode ) {
- eventPath.push([ cur, bubbleType ]);
- old = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( old === (elem.ownerDocument || document) ) {
- eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
- }
- }
-
- // Fire handlers on the event path
- for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
- cur = eventPath[i][0];
- event.type = eventPath[i][1];
-
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
- // Note that this is a bare JS function and not a jQuery handler
- handle = ontype && cur[ ontype ];
- if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
- event.preventDefault();
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
- // Don't do default actions on window, that's where global variables be (#6170)
- // IE<9 dies on focus/blur to hidden element (#1486)
- if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
-
- if ( old ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- elem[ type ]();
- jQuery.event.triggered = undefined;
-
- if ( old ) {
- elem[ ontype ] = old;
- }
- }
- }
- }
-
- return event.result;
- },
-
- dispatch: function( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event || window.event );
-
- var i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related,
- handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
- delegateCount = handlers.delegateCount,
- args = [].slice.call( arguments ),
- run_all = !event.exclusive && !event.namespace,
- special = jQuery.event.special[ event.type ] || {},
- handlerQueue = [];
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[0] = event;
- event.delegateTarget = this;
-
- // Call the preDispatch hook for the mapped type, and let it bail if desired
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
- return;
- }
-
- // Determine handlers that should run if there are delegated events
- // Avoid non-left-click bubbling in Firefox (#3861)
- if ( delegateCount && !(event.button && event.type === "click") ) {
-
- // Pregenerate a single jQuery object for reuse with .is()
- jqcur = jQuery(this);
- jqcur.context = this;
-
- for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-
- // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #xxxx)
- if ( cur.disabled !== true || event.type !== "click" ) {
- selMatch = {};
- matches = [];
- jqcur[0] = cur;
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
- sel = handleObj.selector;
-
- if ( selMatch[ sel ] === undefined ) {
- selMatch[ sel ] = jqcur.is( sel );
- }
- if ( selMatch[ sel ] ) {
- matches.push( handleObj );
- }
- }
- if ( matches.length ) {
- handlerQueue.push({ elem: cur, matches: matches });
- }
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- if ( handlers.length > delegateCount ) {
- handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
- }
-
- // Run delegates first; they may want to stop propagation beneath us
- for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
- matched = handlerQueue[ i ];
- event.currentTarget = matched.elem;
-
- for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
- handleObj = matched.matches[ j ];
-
- // Triggered event must either 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
- if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
- .apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
- }
-
- return event.result;
- },
-
- // Includes some event props shared by KeyEvent and MouseEvent
- // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
- props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
- fixHooks: {},
-
- keyHooks: {
- props: "char charCode key keyCode".split(" "),
- filter: function( event, original ) {
-
- // Add which for key events
- if ( event.which == null ) {
- event.which = original.charCode != null ? original.charCode : original.keyCode;
- }
-
- return event;
- }
- },
-
- mouseHooks: {
- props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
- filter: function( event, original ) {
- var eventDoc, doc, body,
- button = original.button,
- fromElement = original.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && original.clientX != null ) {
- eventDoc = event.target.ownerDocument || document;
- doc = eventDoc.documentElement;
- body = eventDoc.body;
-
- event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
- event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && fromElement ) {
- event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && button !== undefined ) {
- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
- }
-
- return event;
- }
- },
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop,
- originalEvent = event,
- fixHook = jQuery.event.fixHooks[ event.type ] || {},
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = jQuery.Event( originalEvent );
-
- for ( i = copy.length; i; ) {
- prop = copy[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
- if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
- }
-
- // Target should not be a text node (#504, Safari)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
- event.metaKey = !!event.metaKey;
-
- return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
- },
-
- special: {
- ready: {
- // Make sure the ready event is setup
- setup: jQuery.bindReady
- },
-
- load: {
- // Prevent triggered image.load events from bubbling to window.load
- noBubble: true
- },
-
- focus: {
- delegateType: "focusin"
- },
- blur: {
- delegateType: "focusout"
- },
-
- beforeunload: {
- setup: function( data, namespaces, eventHandle ) {
- // We only want to do this special case on windows
- if ( jQuery.isWindow( this ) ) {
- this.onbeforeunload = eventHandle;
- }
- },
-
- teardown: function( namespaces, eventHandle ) {
- if ( this.onbeforeunload === eventHandle ) {
- this.onbeforeunload = null;
- }
- }
- }
- },
-
- simulate: function( type, elem, event, bubble ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- { type: type,
- isSimulated: true,
- originalEvent: {}
- }
- );
- if ( bubble ) {
- jQuery.event.trigger( e, null, elem );
- } else {
- jQuery.event.dispatch.call( elem, e );
- }
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
- }
-};
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function( elem, type, handle ) {
- var name = "on" + type;
-
- if ( elem.detachEvent ) {
-
- // #8545, #7054, preventing memory leaks for custom events in IE6-8 –
- // detachEvent needed property on element, by name of that event, to properly expose it to GC
- if ( typeof elem[ name ] === "undefined" ) {
- elem[ name ] = null;
- }
-
- elem.detachEvent( name, handle );
- }
- };
-
-jQuery.Event = function( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !(this instanceof jQuery.Event) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
- return false;
-}
-function returnTrue() {
- return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- preventDefault: function() {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
-
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // otherwise set the returnValue property of the original event to false (IE)
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation: function() {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
- // if stopPropagation exists run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation: function() {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var ret,
- target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj,
- selector = handleObj.selector;
-
- // For mousenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !jQuery._data( form, "_submit_attached" ) ) {
- jQuery.event.add( form, "submit._submit", function( event ) {
- event._submit_bubble = true;
- });
- jQuery._data( form, "_submit_attached", true );
- }
- });
- // return undefined since we don't need an event listener
- },
-
- postDispatch: function( event ) {
- // If form was submitted by the user, bubble the event up the tree
- if ( event._submit_bubble ) {
- delete event._submit_bubble;
- if ( this.parentNode && !event.isTrigger ) {
- jQuery.event.simulate( "submit", this.parentNode, event, true );
- }
- }
- },
-
- teardown: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
- jQuery.event.remove( this, "._submit" );
- }
- };
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
- jQuery.event.special.change = {
-
- setup: function() {
-
- if ( rformElems.test( this.nodeName ) ) {
- // IE doesn't fire change on a check/radio until blur; trigger it on click
- // after a propertychange. Eat the blur-change in special.change.handle.
- // This still fires onchange a second time for check/radio after blur.
- if ( this.type === "checkbox" || this.type === "radio" ) {
- jQuery.event.add( this, "propertychange._change", function( event ) {
- if ( event.originalEvent.propertyName === "checked" ) {
- this._just_changed = true;
- }
- });
- jQuery.event.add( this, "click._change", function( event ) {
- if ( this._just_changed && !event.isTrigger ) {
- this._just_changed = false;
- }
- // Allow triggered, simulated change events (#11500)
- jQuery.event.simulate( "change", this, event, true );
- });
- }
- return false;
- }
- // Delegated event; lazy-add a change handler on descendant inputs
- jQuery.event.add( this, "beforeactivate._change", function( e ) {
- var elem = e.target;
-
- if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
- jQuery.event.add( elem, "change._change", function( event ) {
- if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
- jQuery.event.simulate( "change", this.parentNode, event, true );
- }
- });
- jQuery._data( elem, "_change_attached", true );
- }
- });
- },
-
- handle: function( event ) {
- var elem = event.target;
-
- // Swallow native change events from checkbox/radio, we already triggered them above
- if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
- return event.handleObj.handler.apply( this, arguments );
- }
- },
-
- teardown: function() {
- jQuery.event.remove( this, "._change" );
-
- return rformElems.test( this.nodeName );
- }
- };
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
- jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0,
- handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
- }
- },
- teardown: function() {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
- }
- }
- };
- });
-}
-
-jQuery.fn.extend({
-
- on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
- var origFn, type;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) { // && selector != null
- // ( types-Object, data )
- data = data || selector;
- selector = undefined;
- }
- for ( type in types ) {
- this.on( type, selector, data, types[ type ], one );
- }
- return this;
- }
-
- if ( data == null && fn == null ) {
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return this;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return this.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- });
- },
- one: function( types, selector, data, fn ) {
- return this.on( types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- var handleObj, type;
- if ( types && types.preventDefault && types.handleObj ) {
- // ( event ) dispatched jQuery.Event
- handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
- // ( types-object [, selector] )
- for ( type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each(function() {
- jQuery.event.remove( this, types, fn, selector );
- });
- },
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- live: function( types, data, fn ) {
- jQuery( this.context ).on( types, this.selector, data, fn );
- return this;
- },
- die: function( types, fn ) {
- jQuery( this.context ).off( types, this.selector || "**", fn );
- return this;
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
- },
-
- trigger: function( type, data ) {
- return this.each(function() {
- jQuery.event.trigger( type, data, this );
- });
- },
- triggerHandler: function( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-});
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
- }
-
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
-
- if ( rkeyEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
- }
-
- if ( rmouseEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
- }
-});
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://sizzlejs.com/
- */
-(function( window, undefined ) {
-
-var cachedruns,
- dirruns,
- sortOrder,
- siblingCheck,
- assertGetIdNotName,
-
- document = window.document,
- docElem = document.documentElement,
-
- strundefined = "undefined",
- hasDuplicate = false,
- baseHasDuplicate = true,
- done = 0,
- slice = [].slice,
- push = [].push,
-
- expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
-
- // Regex
-
- // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
- whitespace = "[\\x20\\t\\r\\n\\f]",
- // http://www.w3.org/TR/css3-syntax/#characters
- characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
-
- // Loosely modeled on CSS identifier characters
- // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
- // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
- identifier = characterEncoding.replace( "w", "w#" ),
-
- // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
- operators = "([*^$|!~]?=)",
- attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
- "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
- pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",
- pos = ":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",
- combinators = whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*",
- groups = "(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|" + attributes + "|" + pseudos.replace( 2, 7 ) + "|[^\\\\(),])+",
-
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
- rcombinators = new RegExp( "^" + combinators ),
-
- // All simple (non-comma) selectors, excluding insignifant trailing whitespace
- rgroups = new RegExp( groups + "?(?=" + whitespace + "*,|$)", "g" ),
-
- // A selector, or everything after leading whitespace
- // Optionally followed in either case by a ")" for terminating sub-selectors
- rselector = new RegExp( "^(?:(?!,)(?:(?:^|,)" + whitespace + "*" + groups + ")*?|" + whitespace + "*(.*?))(\\)|$)" ),
-
- // All combinators and selector components (attribute test, tag, pseudo, etc.), the latter appearing together when consecutive
- rtokens = new RegExp( groups.slice( 19, -6 ) + "\\x20\\t\\r\\n\\f>+~])+|" + combinators, "g" ),
-
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
- rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
-
- rsibling = /[\x20\t\r\n\f]*[+~]/,
- rendsWithNot = /:not\($/,
-
- rheader = /h\d/i,
- rinputs = /input|select|textarea|button/i,
-
- rbackslash = /\\(?!\\)/g,
-
- matchExpr = {
- "ID": new RegExp( "^#(" + characterEncoding + ")" ),
- "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
- "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
- "TAG": new RegExp( "^(" + characterEncoding.replace( "[-", "[-\\*" ) + ")" ),
- "ATTR": new RegExp( "^" + attributes ),
- "PSEUDO": new RegExp( "^" + pseudos ),
- "CHILD": new RegExp( "^:(only|nth|last|first)-child(?:\\(" + whitespace +
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
- "POS": new RegExp( pos, "ig" ),
- // For use in libraries implementing .is()
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
- },
-
- classCache = {},
- cachedClasses = [],
- compilerCache = {},
- cachedSelectors = [],
-
- // Mark a function for use in filtering
- markFunction = function( fn ) {
- fn.sizzleFilter = true;
- return fn;
- },
-
- // Returns a function to use in pseudos for input types
- createInputFunction = function( type ) {
- return function( elem ) {
- // Check the input's nodeName and type
- return elem.nodeName.toLowerCase() === "input" && elem.type === type;
- };
- },
-
- // Returns a function to use in pseudos for buttons
- createButtonFunction = function( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && elem.type === type;
- };
- },
-
- // Used for testing something on an element
- assert = function( fn ) {
- var pass = false,
- div = document.createElement("div");
- try {
- pass = fn( div );
- } catch (e) {}
- // release memory in IE
- div = null;
- return pass;
- },
-
- // Check if attributes should be retrieved by attribute nodes
- assertAttributes = assert(function( div ) {
- div.innerHTML = "";
- var type = typeof div.lastChild.getAttribute("multiple");
- // IE8 returns a string for some attributes even when not present
- return type !== "boolean" && type !== "string";
- }),
-
- // Check if getElementById returns elements by name
- // Check if getElementsByName privileges form controls or returns elements by ID
- assertUsableName = assert(function( div ) {
- // Inject content
- div.id = expando + 0;
- div.innerHTML = "";
- docElem.insertBefore( div, docElem.firstChild );
-
- // Test
- var pass = document.getElementsByName &&
- // buggy browsers will return fewer than the correct 2
- document.getElementsByName( expando ).length ===
- // buggy browsers will return more than the correct 0
- 2 + document.getElementsByName( expando + 0 ).length;
- assertGetIdNotName = !document.getElementById( expando );
-
- // Cleanup
- docElem.removeChild( div );
-
- return pass;
- }),
-
- // Check if the browser returns only elements
- // when doing getElementsByTagName("*")
- assertTagNameNoComments = assert(function( div ) {
- div.appendChild( document.createComment("") );
- return div.getElementsByTagName("*").length === 0;
- }),
-
- // Check if getAttribute returns normalized href attributes
- assertHrefNotNormalized = assert(function( div ) {
- div.innerHTML = "";
- return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
- div.firstChild.getAttribute("href") === "#";
- }),
-
- // Check if getElementsByClassName can be trusted
- assertUsableClassName = assert(function( div ) {
- // Opera can't find a second classname (in 9.6)
- div.innerHTML = "";
- if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
- return false;
- }
-
- // Safari caches class attributes, doesn't catch changes (in 3.2)
- div.lastChild.className = "e";
- return div.getElementsByClassName("e").length !== 1;
- });
-
-var Sizzle = function( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
- var match, elem, xml, m,
- nodeType = context.nodeType;
-
- if ( nodeType !== 1 && nodeType !== 9 ) {
- return [];
- }
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- xml = isXML( context );
-
- if ( !xml && !seed ) {
- if ( (match = rquickExpr.exec( selector )) ) {
- // Speed-up: Sizzle("#ID")
- if ( (m = match[1]) ) {
- if ( nodeType === 9 ) {
- elem = context.getElementById( m );
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE, Opera, and Webkit return items
- // by name instead of ID
- if ( elem.id === m ) {
- results.push( elem );
- return results;
- }
- } else {
- return results;
- }
- } else {
- // Context is not a document
- if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
- contains( context, elem ) && elem.id === m ) {
- results.push( elem );
- return results;
- }
- }
-
- // Speed-up: Sizzle("TAG")
- } else if ( match[2] ) {
- push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
- return results;
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
- push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
- return results;
- }
- }
- }
-
- // All others
- return select( selector, context, results, seed, xml );
-};
-
-var Expr = Sizzle.selectors = {
-
- // Can be adjusted by the user
- cacheLength: 50,
-
- match: matchExpr,
-
- order: [ "ID", "TAG" ],
-
- attrHandle: {},
-
- createPseudo: markFunction,
-
- find: {
- "ID": assertGetIdNotName ?
- function( id, context, xml ) {
- if ( typeof context.getElementById !== strundefined && !xml ) {
- var m = context.getElementById( id );
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- } :
- function( id, context, xml ) {
- if ( typeof context.getElementById !== strundefined && !xml ) {
- var m = context.getElementById( id );
-
- return m ?
- m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
- [m] :
- undefined :
- [];
- }
- },
-
- "TAG": assertTagNameNoComments ?
- function( tag, context ) {
- if ( typeof context.getElementsByTagName !== strundefined ) {
- return context.getElementsByTagName( tag );
- }
- } :
- function( tag, context ) {
- var results = context.getElementsByTagName( tag );
-
- // Filter out possible comments
- if ( tag === "*" ) {
- var elem,
- tmp = [],
- i = 0;
-
- for ( ; (elem = results[i]); i++ ) {
- if ( elem.nodeType === 1 ) {
- tmp.push( elem );
- }
- }
-
- return tmp;
- }
- return results;
- }
- },
-
- relative: {
- ">": { dir: "parentNode", first: true },
- " ": { dir: "parentNode" },
- "+": { dir: "previousSibling", first: true },
- "~": { dir: "previousSibling" }
- },
-
- preFilter: {
- "ATTR": function( match ) {
- match[1] = match[1].replace( rbackslash, "" );
-
- // Move the given value to match[3] whether quoted or unquoted
- match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[3] = " " + match[3] + " ";
- }
-
- return match.slice( 0, 4 );
- },
-
- "CHILD": function( match ) {
- /* matches from matchExpr.CHILD
- 1 type (only|nth|...)
- 2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
- 3 xn-component of xn+y argument ([+-]?\d*n|)
- 4 sign of xn-component
- 5 x of xn-component
- 6 sign of y-component
- 7 y of y-component
- */
- match[1] = match[1].toLowerCase();
-
- if ( match[1] === "nth" ) {
- // nth-child requires argument
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // numeric x and y parameters for Expr.filter.CHILD
- // remember that false/true cast respectively to 0/1
- match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
- match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
-
- // other types prohibit arguments
- } else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- return match;
- },
-
- "PSEUDO": function( match ) {
- var argument,
- unquoted = match[4];
-
- if ( matchExpr["CHILD"].test( match[0] ) ) {
- return null;
- }
-
- // Relinquish our claim on characters in `unquoted` from a closing parenthesis on
- if ( unquoted && (argument = rselector.exec( unquoted )) && argument.pop() ) {
-
- match[0] = match[0].slice( 0, argument[0].length - unquoted.length - 1 );
- unquoted = argument[0].slice( 0, -1 );
- }
-
- // Quoted or unquoted, we have the full argument
- // Return only captures needed by the pseudo filter method (type and argument)
- match.splice( 2, 3, unquoted || match[3] );
- return match;
- }
- },
-
- filter: {
- "ID": assertGetIdNotName ?
- function( id ) {
- id = id.replace( rbackslash, "" );
- return function( elem ) {
- return elem.getAttribute("id") === id;
- };
- } :
- function( id ) {
- id = id.replace( rbackslash, "" );
- return function( elem ) {
- var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
- return node && node.value === id;
- };
- },
-
- "TAG": function( nodeName ) {
- if ( nodeName === "*" ) {
- return function() { return true; };
- }
- nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
-
- return function( elem ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
- };
- },
-
- "CLASS": function( className ) {
- var pattern = classCache[ className ];
- if ( !pattern ) {
- pattern = classCache[ className ] = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" );
- cachedClasses.push( className );
- // Avoid too large of a cache
- if ( cachedClasses.length > Expr.cacheLength ) {
- delete classCache[ cachedClasses.shift() ];
- }
- }
- return function( elem ) {
- return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
- };
- },
-
- "ATTR": function( name, operator, check ) {
- if ( !operator ) {
- return function( elem ) {
- return Sizzle.attr( elem, name ) != null;
- };
- }
-
- return function( elem ) {
- var result = Sizzle.attr( elem, name ),
- value = result + "";
-
- if ( result == null ) {
- return operator === "!=";
- }
-
- switch ( operator ) {
- case "=":
- return value === check;
- case "!=":
- return value !== check;
- case "^=":
- return check && value.indexOf( check ) === 0;
- case "*=":
- return check && value.indexOf( check ) > -1;
- case "$=":
- return check && value.substr( value.length - check.length ) === check;
- case "~=":
- return ( " " + value + " " ).indexOf( check ) > -1;
- case "|=":
- return value === check || value.substr( 0, check.length + 1 ) === check + "-";
- }
- };
- },
-
- "CHILD": function( type, argument, first, last ) {
-
- if ( type === "nth" ) {
- var doneName = done++;
-
- return function( elem ) {
- var parent, diff,
- count = 0,
- node = elem;
-
- if ( first === 1 && last === 0 ) {
- return true;
- }
-
- parent = elem.parentNode;
-
- if ( parent && (parent[ expando ] !== doneName || !elem.sizset) ) {
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.sizset = ++count;
- if ( node === elem ) {
- break;
- }
- }
- }
-
- parent[ expando ] = doneName;
- }
-
- diff = elem.sizset - last;
-
- if ( first === 0 ) {
- return diff === 0;
-
- } else {
- return ( diff % first === 0 && diff / first >= 0 );
- }
- };
- }
-
- return function( elem ) {
- var node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- /* falls through */
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- return true;
- }
- };
- },
-
- "PSEUDO": function( pseudo, argument, context, xml ) {
- // pseudo-class names are case-insensitive
- // http://www.w3.org/TR/selectors/#pseudo-classes
- // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
- var fn = Expr.pseudos[ pseudo ] || Expr.pseudos[ pseudo.toLowerCase() ];
-
- if ( !fn ) {
- Sizzle.error( "unsupported pseudo: " + pseudo );
- }
-
- // The user may set fn.sizzleFilter to indicate
- // that arguments are needed to create the filter function
- // just as Sizzle does
- if ( !fn.sizzleFilter ) {
- return fn;
- }
-
- return fn( argument, context, xml );
- }
- },
-
- pseudos: {
- "not": markFunction(function( selector, context, xml ) {
- // Trim the selector passed to compile
- // to avoid treating leading and trailing
- // spaces as combinators
- var matcher = compile( selector.replace( rtrim, "$1" ), context, xml );
- return function( elem ) {
- return !matcher( elem );
- };
- }),
-
- "enabled": function( elem ) {
- return elem.disabled === false;
- },
-
- "disabled": function( elem ) {
- return elem.disabled === true;
- },
-
- "checked": function( elem ) {
- // In CSS3, :checked should return both checked and selected elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- var nodeName = elem.nodeName.toLowerCase();
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
- },
-
- "selected": function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- "parent": function( elem ) {
- return !Expr.pseudos["empty"]( elem );
- },
-
- "empty": function( elem ) {
- // http://www.w3.org/TR/selectors/#empty-pseudo
- // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
- // not comment, processing instructions, or others
- // Thanks to Diego Perini for the nodeName shortcut
- // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
- var nodeType;
- elem = elem.firstChild;
- while ( elem ) {
- if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
- return false;
- }
- elem = elem.nextSibling;
- }
- return true;
- },
-
- "contains": markFunction(function( text ) {
- return function( elem ) {
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
- };
- }),
-
- "has": markFunction(function( selector ) {
- return function( elem ) {
- return Sizzle( selector, elem ).length > 0;
- };
- }),
-
- "header": function( elem ) {
- return rheader.test( elem.nodeName );
- },
-
- "text": function( elem ) {
- var type, attr;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" &&
- (type = elem.type) === "text" &&
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
- },
-
- // Input types
- "radio": createInputFunction("radio"),
- "checkbox": createInputFunction("checkbox"),
- "file": createInputFunction("file"),
- "password": createInputFunction("password"),
- "image": createInputFunction("image"),
-
- "submit": createButtonFunction("submit"),
- "reset": createButtonFunction("reset"),
-
- "button": function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === "button" || name === "button";
- },
-
- "input": function( elem ) {
- return rinputs.test( elem.nodeName );
- },
-
- "focus": function( elem ) {
- var doc = elem.ownerDocument;
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
- },
-
- "active": function( elem ) {
- return elem === elem.ownerDocument.activeElement;
- }
- },
-
- setFilters: {
- "first": function( elements, argument, not ) {
- return not ? elements.slice( 1 ) : [ elements[0] ];
- },
-
- "last": function( elements, argument, not ) {
- var elem = elements.pop();
- return not ? elements : [ elem ];
- },
-
- "even": function( elements, argument, not ) {
- var results = [],
- i = not ? 1 : 0,
- len = elements.length;
- for ( ; i < len; i = i + 2 ) {
- results.push( elements[i] );
- }
- return results;
- },
-
- "odd": function( elements, argument, not ) {
- var results = [],
- i = not ? 0 : 1,
- len = elements.length;
- for ( ; i < len; i = i + 2 ) {
- results.push( elements[i] );
- }
- return results;
- },
-
- "lt": function( elements, argument, not ) {
- return not ? elements.slice( +argument ) : elements.slice( 0, +argument );
- },
-
- "gt": function( elements, argument, not ) {
- return not ? elements.slice( 0, +argument + 1 ) : elements.slice( +argument + 1 );
- },
-
- "eq": function( elements, argument, not ) {
- var elem = elements.splice( +argument, 1 );
- return not ? elements : elem;
- }
- }
-};
-
-// Deprecated
-Expr.setFilters["nth"] = Expr.setFilters["eq"];
-
-// Back-compat
-Expr.filters = Expr.pseudos;
-
-// IE6/7 return a modified href
-if ( !assertHrefNotNormalized ) {
- Expr.attrHandle = {
- "href": function( elem ) {
- return elem.getAttribute( "href", 2 );
- },
- "type": function( elem ) {
- return elem.getAttribute("type");
- }
- };
-}
-
-// Add getElementsByName if usable
-if ( assertUsableName ) {
- Expr.order.push("NAME");
- Expr.find["NAME"] = function( name, context ) {
- if ( typeof context.getElementsByName !== strundefined ) {
- return context.getElementsByName( name );
- }
- };
-}
-
-// Add getElementsByClassName if usable
-if ( assertUsableClassName ) {
- Expr.order.splice( 1, 0, "CLASS" );
- Expr.find["CLASS"] = function( className, context, xml ) {
- if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
- return context.getElementsByClassName( className );
- }
- };
-}
-
-// If slice is not available, provide a backup
-try {
- slice.call( docElem.childNodes, 0 )[0].nodeType;
-} catch ( e ) {
- slice = function( i ) {
- var elem, results = [];
- for ( ; (elem = this[i]); i++ ) {
- results.push( elem );
- }
- return results;
- };
-}
-
-var isXML = Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-// Element contains another
-var contains = Sizzle.contains = docElem.compareDocumentPosition ?
- function( a, b ) {
- return !!( a.compareDocumentPosition( b ) & 16 );
- } :
- docElem.contains ?
- function( a, b ) {
- var adown = a.nodeType === 9 ? a.documentElement : a,
- bup = b.parentNode;
- return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
- } :
- function( a, b ) {
- while ( (b = b.parentNode) ) {
- if ( b === a ) {
- return true;
- }
- }
- return false;
- };
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-var getText = Sizzle.getText = function( elem ) {
- var node,
- ret = "",
- i = 0,
- nodeType = elem.nodeType;
-
- if ( nodeType ) {
- if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
- // Use textContent for elements
- // innerText usage removed for consistency of new lines (see #11153)
- if ( typeof elem.textContent === "string" ) {
- return elem.textContent;
- } else {
- // Traverse its children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
- // Do not include comment or processing instruction nodes
- } else {
-
- // If no nodeType, this is expected to be an array
- for ( ; (node = elem[i]); i++ ) {
- // Do not traverse comment nodes
- ret += getText( node );
- }
- }
- return ret;
-};
-
-Sizzle.attr = function( elem, name ) {
- var attr,
- xml = isXML( elem );
-
- if ( !xml ) {
- name = name.toLowerCase();
- }
- if ( Expr.attrHandle[ name ] ) {
- return Expr.attrHandle[ name ]( elem );
- }
- if ( assertAttributes || xml ) {
- return elem.getAttribute( name );
- }
- attr = elem.getAttributeNode( name );
- return attr ?
- typeof elem[ name ] === "boolean" ?
- elem[ name ] ? name : null :
- attr.specified ? attr.value : null :
- null;
-};
-
-Sizzle.error = function( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-// Check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-// Thus far that includes Google Chrome.
-[0, 0].sort(function() {
- return (baseHasDuplicate = 0);
-});
-
-
-if ( docElem.compareDocumentPosition ) {
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
- a.compareDocumentPosition :
- a.compareDocumentPosition(b) & 4
- ) ? -1 : 1;
- };
-
-} else {
- sortOrder = function( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
- siblingCheck = function( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
- };
-}
-
-// Document sorting and removing duplicates
-Sizzle.uniqueSort = function( results ) {
- var elem,
- i = 1;
-
- if ( sortOrder ) {
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( ; (elem = results[i]); i++ ) {
- if ( elem === results[ i - 1 ] ) {
- results.splice( i--, 1 );
- }
- }
- }
- }
-
- return results;
-};
-
-function multipleContexts( selector, contexts, results, seed ) {
- var i = 0,
- len = contexts.length;
- for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results, seed );
- }
-}
-
-function handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {
- var results,
- fn = Expr.setFilters[ posfilter.toLowerCase() ];
-
- if ( !fn ) {
- Sizzle.error( posfilter );
- }
-
- if ( selector || !(results = seed) ) {
- multipleContexts( selector || "*", contexts, (results = []), seed );
- }
-
- return results.length > 0 ? fn( results, argument, not ) : [];
-}
-
-function handlePOS( selector, context, results, seed, groups ) {
- var match, not, anchor, ret, elements, currentContexts, part, lastIndex,
- i = 0,
- len = groups.length,
- rpos = matchExpr["POS"],
- // This is generated here in case matchExpr["POS"] is extended
- rposgroups = new RegExp( "^" + rpos.source + "(?!" + whitespace + ")", "i" ),
- // This is for making sure non-participating
- // matching groups are represented cross-browser (IE6-8)
- setUndefined = function() {
- var i = 1,
- len = arguments.length - 2;
- for ( ; i < len; i++ ) {
- if ( arguments[i] === undefined ) {
- match[i] = undefined;
- }
- }
- };
-
- for ( ; i < len; i++ ) {
- // Reset regex index to 0
- rpos.exec("");
- selector = groups[i];
- ret = [];
- anchor = 0;
- elements = seed;
- while ( (match = rpos.exec( selector )) ) {
- lastIndex = rpos.lastIndex = match.index + match[0].length;
- if ( lastIndex > anchor ) {
- part = selector.slice( anchor, match.index );
- anchor = lastIndex;
- currentContexts = [ context ];
-
- if ( rcombinators.test(part) ) {
- if ( elements ) {
- currentContexts = elements;
- }
- elements = seed;
- }
-
- if ( (not = rendsWithNot.test( part )) ) {
- part = part.slice( 0, -5 ).replace( rcombinators, "$&*" );
- }
-
- if ( match.length > 1 ) {
- match[0].replace( rposgroups, setUndefined );
- }
- elements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );
- }
- }
-
- if ( elements ) {
- ret = ret.concat( elements );
-
- if ( (part = selector.slice( anchor )) && part !== ")" ) {
- if ( rcombinators.test(part) ) {
- multipleContexts( part, ret, results, seed );
- } else {
- Sizzle( part, context, results, seed ? seed.concat(elements) : elements );
- }
- } else {
- push.apply( results, ret );
- }
- } else {
- Sizzle( selector, context, results, seed );
- }
- }
-
- // Do not sort if this is a single filter
- return len === 1 ? results : Sizzle.uniqueSort( results );
-}
-
-function tokenize( selector, context, xml ) {
- var tokens, soFar, type,
- groups = [],
- i = 0,
-
- // Catch obvious selector issues: terminal ")"; nonempty fallback match
- // rselector never fails to match *something*
- match = rselector.exec( selector ),
- matched = !match.pop() && !match.pop(),
- selectorGroups = matched && selector.match( rgroups ) || [""],
-
- preFilters = Expr.preFilter,
- filters = Expr.filter,
- checkContext = !xml && context !== document;
-
- for ( ; (soFar = selectorGroups[i]) != null && matched; i++ ) {
- groups.push( tokens = [] );
-
- // Need to make sure we're within a narrower context if necessary
- // Adding a descendant combinator will generate what is needed
- if ( checkContext ) {
- soFar = " " + soFar;
- }
-
- while ( soFar ) {
- matched = false;
-
- // Combinators
- if ( (match = rcombinators.exec( soFar )) ) {
- soFar = soFar.slice( match[0].length );
-
- // Cast descendant combinators to space
- matched = tokens.push({ part: match.pop().replace( rtrim, " " ), captures: match });
- }
-
- // Filters
- for ( type in filters ) {
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
- (match = preFilters[ type ]( match, context, xml )) ) ) {
-
- soFar = soFar.slice( match.shift().length );
- matched = tokens.push({ part: type, captures: match });
- }
- }
-
- if ( !matched ) {
- break;
- }
- }
- }
-
- if ( !matched ) {
- Sizzle.error( selector );
- }
-
- return groups;
-}
-
-function addCombinator( matcher, combinator, context ) {
- var dir = combinator.dir,
- doneName = done++;
-
- if ( !matcher ) {
- // If there is no matcher to check, check against the context
- matcher = function( elem ) {
- return elem === context;
- };
- }
- return combinator.first ?
- function( elem, context ) {
- while ( (elem = elem[ dir ]) ) {
- if ( elem.nodeType === 1 ) {
- return matcher( elem, context ) && elem;
- }
- }
- } :
- function( elem, context ) {
- var cache,
- dirkey = doneName + "." + dirruns,
- cachedkey = dirkey + "." + cachedruns;
- while ( (elem = elem[ dir ]) ) {
- if ( elem.nodeType === 1 ) {
- if ( (cache = elem[ expando ]) === cachedkey ) {
- return elem.sizset;
- } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
- if ( elem.sizset ) {
- return elem;
- }
- } else {
- elem[ expando ] = cachedkey;
- if ( matcher( elem, context ) ) {
- elem.sizset = true;
- return elem;
- }
- elem.sizset = false;
- }
- }
- }
- };
-}
-
-function addMatcher( higher, deeper ) {
- return higher ?
- function( elem, context ) {
- var result = deeper( elem, context );
- return result && higher( result === true ? elem : result, context );
- } :
- deeper;
-}
-
-// ["TAG", ">", "ID", " ", "CLASS"]
-function matcherFromTokens( tokens, context, xml ) {
- var token, matcher,
- i = 0;
-
- for ( ; (token = tokens[i]); i++ ) {
- if ( Expr.relative[ token.part ] ) {
- matcher = addCombinator( matcher, Expr.relative[ token.part ], context );
- } else {
- token.captures.push( context, xml );
- matcher = addMatcher( matcher, Expr.filter[ token.part ].apply( null, token.captures ) );
- }
- }
-
- return matcher;
-}
-
-function matcherFromGroupMatchers( matchers ) {
- return function( elem, context ) {
- var matcher,
- j = 0;
- for ( ; (matcher = matchers[j]); j++ ) {
- if ( matcher(elem, context) ) {
- return true;
- }
- }
- return false;
- };
-}
-
-var compile = Sizzle.compile = function( selector, context, xml ) {
- var tokens, group, i,
- cached = compilerCache[ selector ];
-
- // Return a cached group function if already generated (context dependent)
- if ( cached && cached.context === context ) {
- return cached;
- }
-
- // Generate a function of recursive functions that can be used to check each element
- group = tokenize( selector, context, xml );
- for ( i = 0; (tokens = group[i]); i++ ) {
- group[i] = matcherFromTokens( tokens, context, xml );
- }
-
- // Cache the compiled function
- cached = compilerCache[ selector ] = matcherFromGroupMatchers( group );
- cached.context = context;
- cached.runs = cached.dirruns = 0;
- cachedSelectors.push( selector );
- // Ensure only the most recent are cached
- if ( cachedSelectors.length > Expr.cacheLength ) {
- delete compilerCache[ cachedSelectors.shift() ];
- }
- return cached;
-};
-
-Sizzle.matches = function( expr, elements ) {
- return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
- return Sizzle( expr, null, null, [ elem ] ).length > 0;
-};
-
-var select = function( selector, context, results, seed, xml ) {
- // Remove excessive whitespace
- selector = selector.replace( rtrim, "$1" );
- var elements, matcher, i, len, elem, token,
- type, findContext, notTokens,
- match = selector.match( rgroups ),
- tokens = selector.match( rtokens ),
- contextNodeType = context.nodeType;
-
- // POS handling
- if ( matchExpr["POS"].test(selector) ) {
- return handlePOS( selector, context, results, seed, match );
- }
-
- if ( seed ) {
- elements = slice.call( seed, 0 );
-
- // To maintain document order, only narrow the
- // set if there is one group
- } else if ( match && match.length === 1 ) {
-
- // Take a shortcut and set the context if the root selector is an ID
- if ( tokens.length > 1 && contextNodeType === 9 && !xml &&
- (match = matchExpr["ID"].exec( tokens[0] )) ) {
-
- context = Expr.find["ID"]( match[1], context, xml )[0];
- if ( !context ) {
- return results;
- }
-
- selector = selector.slice( tokens.shift().length );
- }
-
- findContext = ( (match = rsibling.exec( tokens[0] )) && !match.index && context.parentNode ) || context;
-
- // Get the last token, excluding :not
- notTokens = tokens.pop();
- token = notTokens.split(":not")[0];
-
- for ( i = 0, len = Expr.order.length; i < len; i++ ) {
- type = Expr.order[i];
-
- if ( (match = matchExpr[ type ].exec( token )) ) {
- elements = Expr.find[ type ]( (match[1] || "").replace( rbackslash, "" ), findContext, xml );
-
- if ( elements == null ) {
- continue;
- }
-
- if ( token === notTokens ) {
- selector = selector.slice( 0, selector.length - notTokens.length ) +
- token.replace( matchExpr[ type ], "" );
-
- if ( !selector ) {
- push.apply( results, slice.call(elements, 0) );
- }
- }
- break;
- }
- }
- }
-
- // Only loop over the given elements once
- // If selector is empty, we're already done
- if ( selector ) {
- matcher = compile( selector, context, xml );
- dirruns = matcher.dirruns++;
-
- if ( elements == null ) {
- elements = Expr.find["TAG"]( "*", (rsibling.test( selector ) && context.parentNode) || context );
- }
- for ( i = 0; (elem = elements[i]); i++ ) {
- cachedruns = matcher.runs++;
- if ( matcher(elem, context) ) {
- results.push( elem );
- }
- }
- }
-
- return results;
-};
-
-if ( document.querySelectorAll ) {
- (function() {
- var disconnectedMatch,
- oldSelect = select,
- rescape = /'|\\/g,
- rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
- rbuggyQSA = [],
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
- // A support test would require too much code (would include document ready)
- // just skip matchesSelector for :active
- rbuggyMatches = [":active"],
- matches = docElem.matchesSelector ||
- docElem.mozMatchesSelector ||
- docElem.webkitMatchesSelector ||
- docElem.oMatchesSelector ||
- docElem.msMatchesSelector;
-
- // Build QSA regex
- // Regex strategy adopted from Diego Perini
- assert(function( div ) {
- div.innerHTML = "";
-
- // IE8 - Some boolean attributes are not treated correctly
- if ( !div.querySelectorAll("[selected]").length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
- }
-
- // Webkit/Opera - :checked should return selected option elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- // IE8 throws error here (do not put tests after this one)
- if ( !div.querySelectorAll(":checked").length ) {
- rbuggyQSA.push(":checked");
- }
- });
-
- assert(function( div ) {
-
- // Opera 10-12/IE9 - ^= $= *= and empty values
- // Should not select anything
- div.innerHTML = "";
- if ( div.querySelectorAll("[test^='']").length ) {
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
- }
-
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
- // IE8 throws error here (do not put tests after this one)
- div.innerHTML = "";
- if ( !div.querySelectorAll(":enabled").length ) {
- rbuggyQSA.push(":enabled", ":disabled");
- }
- });
-
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-
- select = function( selector, context, results, seed, xml ) {
- // Only use querySelectorAll when not filtering,
- // when this is not xml,
- // and when no QSA bugs apply
- if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
- if ( context.nodeType === 9 ) {
- try {
- push.apply( results, slice.call(context.querySelectorAll( selector ), 0) );
- return results;
- } catch(qsaError) {}
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- var old = context.getAttribute("id"),
- nid = old || expando,
- newContext = rsibling.test( selector ) && context.parentNode || context;
-
- if ( old ) {
- nid = nid.replace( rescape, "\\$&" );
- } else {
- context.setAttribute( "id", nid );
- }
-
- try {
- push.apply( results, slice.call( newContext.querySelectorAll(
- selector.replace( rgroups, "[id='" + nid + "'] $&" )
- ), 0 ) );
- return results;
- } catch(qsaError) {
- } finally {
- if ( !old ) {
- context.removeAttribute("id");
- }
- }
- }
- }
-
- return oldSelect( selector, context, results, seed, xml );
- };
-
- if ( matches ) {
- assert(function( div ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9)
- disconnectedMatch = matches.call( div, "div" );
-
- // This should fail with an exception
- // Gecko does not error, returns false instead
- try {
- matches.call( div, "[test!='']:sizzle" );
- rbuggyMatches.push( Expr.match.PSEUDO );
- } catch ( e ) {}
- });
-
- // rbuggyMatches always contains :active, so no need for a length check
- rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
-
- Sizzle.matchesSelector = function( elem, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace( rattributeQuotes, "='$1']" );
-
- // rbuggyMatches always contains :active, so no need for an existence check
- if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {
- try {
- var ret = matches.call( elem, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9
- elem.document && elem.document.nodeType !== 11 ) {
- return ret;
- }
- } catch(e) {}
- }
-
- return Sizzle( expr, null, null, [ elem ] ).length > 0;
- };
- }
- })();
-}
-
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})( window );
-var runtil = /Until$/,
- rparentsprev = /^(?:parents|prev(?:Until|All))/,
- isSimple = /^.[^:#\[\.,]*$/,
- rneedsContext = jQuery.expr.match.needsContext,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend({
- find: function( selector ) {
- var i, l, length, n, r, ret,
- self = this;
-
- if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter(function() {
- for ( i = 0, l = self.length; i < l; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- });
- }
-
- ret = this.pushStack( "", "find", selector );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice(n--, 1);
- break;
- }
- }
- }
- }
- }
-
- return ret;
- },
-
- has: function( target ) {
- var i,
- targets = jQuery( target, this ),
- len = targets.length;
-
- return this.filter(function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- });
- },
-
- not: function( selector ) {
- return this.pushStack( winnow(this, selector, false), "not", selector);
- },
-
- filter: function( selector ) {
- return this.pushStack( winnow(this, selector, true), "filter", selector );
- },
-
- is: function( selector ) {
- return !!selector && (
- typeof selector === "string" ?
- // If this is a positional/relative selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- rneedsContext.test( selector ) ?
- jQuery( selector, this.context ).index( this[0] ) >= 0 :
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
- },
-
- closest: function( selectors, context ) {
- var cur,
- i = 0,
- l = this.length,
- ret = [],
- pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( ; i < l; i++ ) {
- cur = this[i];
-
- while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
- if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
- ret.push( cur );
- break;
- }
- cur = cur.parentNode;
- }
- }
-
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
- }
-
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[0], jQuery( elem ) );
- }
-
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add: function( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
- },
-
- addBack: function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter(selector)
- );
- }
-});
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-function sibling( cur, dir ) {
- do {
- cur = cur[ dir ];
- } while ( cur && cur.nodeType !== 1 );
-
- return cur;
-}
-
-jQuery.each({
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return sibling( elem, "nextSibling" );
- },
- prev: function( elem ) {
- return sibling( elem, "previousSibling" );
- },
- nextAll: function( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.merge( [], elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until );
-
- if ( !runtil.test( name ) ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
- if ( this.length > 1 && rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
-
- return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
- };
-});
-
-jQuery.extend({
- filter: function( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 ?
- jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
- jQuery.find.matches(expr, elems);
- },
-
- dir: function( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep(elements, function( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
- });
-
- } else if ( qualifier.nodeType ) {
- return jQuery.grep(elements, function( elem, i ) {
- return ( elem === qualifier ) === keep;
- });
-
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep(elements, function( elem ) {
- return elem.nodeType === 1;
- });
-
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter(qualifier, filtered, !keep);
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
- }
- }
-
- return jQuery.grep(elements, function( elem, i ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
- });
-}
-function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
- "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
- rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
- rtagName = /<([\w:]+)/,
- rtbody = /]", "i"),
- rcheckableType = /^(?:checkbox|radio)$/,
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptType = /\/(java|ecma)script/i,
- rcleanScript = /^\s*\s*$/g,
- wrapMap = {
- option: [ 1, "" ],
- legend: [ 1, "" ],
- thead: [ 1, "
", "
" ],
- tr: [ 2, "
", "
" ],
- td: [ 3, "
", "
" ],
- col: [ 2, "
", "
" ],
- area: [ 1, "" ],
- _default: [ 0, "", "" ]
- },
- safeFragment = createSafeFragment( document ),
- fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-// unless wrapped in a div with non-breaking characters in front of it.
-if ( !jQuery.support.htmlSerialize ) {
- wrapMap._default = [ 1, "X
", "
" ];
-}
-
-jQuery.fn.extend({
- text: function( value ) {
- return jQuery.access( this, function( value ) {
- return value === undefined ?
- jQuery.text( this ) :
- this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
- }, null, value, arguments.length );
- },
-
- wrapAll: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapAll( html.call(this, i) );
- });
- }
-
- if ( this[0] ) {
- // The elements to wrap the target around
- var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
- if ( this[0].parentNode ) {
- wrap.insertBefore( this[0] );
- }
-
- wrap.map(function() {
- var elem = this;
-
- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
- elem = elem.firstChild;
- }
-
- return elem;
- }).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapInner( html.call(this, i) );
- });
- }
-
- return this.each(function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- });
- },
-
- wrap: function( html ) {
- var isFunction = jQuery.isFunction( html );
-
- return this.each(function(i) {
- jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
- });
- },
-
- unwrap: function() {
- return this.parent().each(function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- }).end();
- },
-
- append: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 ) {
- this.appendChild( elem );
- }
- });
- },
-
- prepend: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 ) {
- this.insertBefore( elem, this.firstChild );
- }
- });
- },
-
- before: function() {
- if ( !isDisconnected( this[0] ) ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this );
- });
- }
-
- if ( arguments.length ) {
- var set = jQuery.clean( arguments );
- return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
- }
- },
-
- after: function() {
- if ( !isDisconnected( this[0] ) ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- });
- }
-
- if ( arguments.length ) {
- var set = jQuery.clean( arguments );
- return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
- }
- },
-
- // keepData is for internal use only--do not document
- remove: function( selector, keepData ) {
- var elem,
- i = 0;
-
- for ( ; (elem = this[i]) != null; i++ ) {
- if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
- if ( !keepData && elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- jQuery.cleanData( [ elem ] );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
- }
- }
-
- return this;
- },
-
- empty: function() {
- var elem,
- i = 0;
-
- for ( ; (elem = this[i]) != null; i++ ) {
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- }
-
- // Remove any remaining nodes
- while ( elem.firstChild ) {
- elem.removeChild( elem.firstChild );
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function () {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- });
- },
-
- html: function( value ) {
- return jQuery.access( this, function( value ) {
- var elem = this[0] || {},
- i = 0,
- l = this.length;
-
- if ( value === undefined ) {
- return elem.nodeType === 1 ?
- elem.innerHTML.replace( rinlinejQuery, "" ) :
- undefined;
- }
-
- // See if we can take a shortcut and just use innerHTML
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
- ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
- !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
-
- value = value.replace( rxhtmlTag, "<$1>$2>" );
-
- try {
- for (; i < l; i++ ) {
- // Remove element nodes and prevent memory leaks
- elem = this[i] || {};
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName( "*" ) );
- elem.innerHTML = value;
- }
- }
-
- elem = 0;
-
- // If using innerHTML throws an exception, use the fallback method
- } catch(e) {}
- }
-
- if ( elem ) {
- this.empty().append( value );
- }
- }, null, value, arguments.length );
- },
-
- replaceWith: function( value ) {
- if ( !isDisconnected( this[0] ) ) {
- // Make sure that the elements are removed from the DOM before they are inserted
- // this can help fix replacing a parent with child elements
- if ( jQuery.isFunction( value ) ) {
- return this.each(function(i) {
- var self = jQuery(this), old = self.html();
- self.replaceWith( value.call( this, i, old ) );
- });
- }
-
- if ( typeof value !== "string" ) {
- value = jQuery( value ).detach();
- }
-
- return this.each(function() {
- var next = this.nextSibling,
- parent = this.parentNode;
-
- jQuery( this ).remove();
-
- if ( next ) {
- jQuery(next).before( value );
- } else {
- jQuery(parent).append( value );
- }
- });
- }
-
- return this.length ?
- this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
- this;
- },
-
- detach: function( selector ) {
- return this.remove( selector, true );
- },
-
- domManip: function( args, table, callback ) {
-
- // Flatten any nested arrays
- args = [].concat.apply( [], args );
-
- var results, first, fragment, iNoClone,
- i = 0,
- value = args[0],
- scripts = [],
- l = this.length;
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
- return this.each(function() {
- jQuery(this).domManip( args, table, callback );
- });
- }
-
- if ( jQuery.isFunction(value) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- args[0] = value.call( this, i, table ? self.html() : undefined );
- self.domManip( args, table, callback );
- });
- }
-
- if ( this[0] ) {
- results = jQuery.buildFragment( args, this, scripts );
- fragment = results.fragment;
- first = fragment.firstChild;
-
- if ( fragment.childNodes.length === 1 ) {
- fragment = first;
- }
-
- if ( first ) {
- table = table && jQuery.nodeName( first, "tr" );
-
- // Use the original fragment for the last item instead of the first because it can end up
- // being emptied incorrectly in certain situations (#8070).
- // Fragments from the fragment cache must always be cloned and never used in place.
- for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
- callback.call(
- table && jQuery.nodeName( this[i], "table" ) ?
- findOrAppend( this[i], "tbody" ) :
- this[i],
- i === iNoClone ?
- fragment :
- jQuery.clone( fragment, true, true )
- );
- }
- }
-
- // Fix #11809: Avoid leaking memory
- fragment = first = null;
-
- if ( scripts.length ) {
- jQuery.each( scripts, function( i, elem ) {
- if ( elem.src ) {
- if ( jQuery.ajax ) {
- jQuery.ajax({
- url: elem.src,
- type: "GET",
- dataType: "script",
- async: false,
- global: false,
- "throws": true
- });
- } else {
- jQuery.error("no ajax");
- }
- } else {
- jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
- });
- }
- }
-
- return this;
- }
-});
-
-function findOrAppend( elem, tag ) {
- return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
-}
-
-function cloneCopyEvent( src, dest ) {
-
- if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
- return;
- }
-
- var type, i, l,
- oldData = jQuery._data( src ),
- curData = jQuery._data( dest, oldData ),
- events = oldData.events;
-
- if ( events ) {
- delete curData.handle;
- curData.events = {};
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
-
- // make the cloned public data object a copy from the original
- if ( curData.data ) {
- curData.data = jQuery.extend( {}, curData.data );
- }
-}
-
-function cloneFixAttributes( src, dest ) {
- var nodeName;
-
- // We do not need to do anything for non-Elements
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- // clearAttributes removes the attributes, which we don't want,
- // but also removes the attachEvent events, which we *do* want
- if ( dest.clearAttributes ) {
- dest.clearAttributes();
- }
-
- // mergeAttributes, in contrast, only merges back on the
- // original attributes, not the events
- if ( dest.mergeAttributes ) {
- dest.mergeAttributes( src );
- }
-
- nodeName = dest.nodeName.toLowerCase();
-
- if ( nodeName === "object" ) {
- // IE6-10 improperly clones children of object elements using classid.
- // IE10 throws NoModificationAllowedError if parent is null, #12132.
- if ( dest.parentNode ) {
- dest.outerHTML = src.outerHTML;
- }
-
- // This path appears unavoidable for IE9. When cloning an object
- // element in IE9, the outerHTML strategy above is not sufficient.
- // If the src has innerHTML and the destination does not,
- // copy the src.innerHTML into the dest.innerHTML. #10324
- if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
- dest.innerHTML = src.innerHTML;
- }
-
- } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
- // IE6-8 fails to persist the checked state of a cloned checkbox
- // or radio button. Worse, IE6-7 fail to give the cloned element
- // a checked appearance if the defaultChecked value isn't also set
-
- dest.defaultChecked = dest.checked = src.checked;
-
- // IE6-7 get confused and end up setting the value of a cloned
- // checkbox/radio button to an empty string instead of "on"
- if ( dest.value !== src.value ) {
- dest.value = src.value;
- }
-
- // IE6-8 fails to return the selected option to the default selected
- // state when cloning options
- } else if ( nodeName === "option" ) {
- dest.selected = src.defaultSelected;
-
- // IE6-8 fails to set the defaultValue to the correct value when
- // cloning other types of input fields
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
-
- // IE blanks contents when cloning scripts
- } else if ( nodeName === "script" && dest.text !== src.text ) {
- dest.text = src.text;
- }
-
- // Event data gets referenced instead of copied if the expando
- // gets copied too
- dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, context, scripts ) {
- var fragment, cacheable, cachehit,
- first = args[ 0 ];
-
- // Set context from what may come in as undefined or a jQuery collection or a node
- context = context || document;
- context = (context[0] || context).ownerDocument || context[0] || context;
-
- // Ensure that an attr object doesn't incorrectly stand in as a document object
- // Chrome and Firefox seem to allow this to occur and will throw exception
- // Fixes #8950
- if ( typeof context.createDocumentFragment === "undefined" ) {
- context = document;
- }
-
- // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
- // Cloning options loses the selected state, so don't cache them
- // IE 6 doesn't like it when you put