5165 lines
1.0 MiB
HTML
5165 lines
1.0 MiB
HTML
|
<!DOCTYPE html>
|
||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
|
<head>
|
||
|
|
||
|
<meta charset="utf-8">
|
||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||
|
<meta name="generator" content="pandoc" />
|
||
|
|
||
|
|
||
|
|
||
|
<title>Rozkład danych diamentów</title>
|
||
|
|
||
|
<meta property="og:title" content="Rozkład danych diamentów" />
|
||
|
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||
|
|
||
|
<link href="data:image/x-icon;" rel="icon" type="image/x-icon">
|
||
|
|
||
|
|
||
|
<script type="text/javascript">
|
||
|
window.FlexDashboardComponents = [];
|
||
|
</script>
|
||
|
|
||
|
<script>/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
|
||
|
!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function A
|
||
|
}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNum
|
||
|
marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expa
|
||
|
padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
|
||
|
</script>
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
|
<style type="text/css">@font-face {
|
||
|
font-family: 'Source Sans Pro';
|
||
|
font-style: normal;
|
||
|
font-weight: 300;
|
||
|
src: url(data:application/x-font-truetype;base64,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
|
||
|
}
|
||
|
@font-face {
|
||
|
font-family: 'Source Sans Pro';
|
||
|
font-style: normal;
|
||
|
font-weight: 400;
|
||
|
src: url(data:application/x-font-truetype;base64,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
|
||
|
}
|
||
|
@font-face {
|
||
|
font-family: 'Source Sans Pro';
|
||
|
font-style: normal;
|
||
|
font-weight: 700;
|
||
|
src: url(data:application/x-font-truetype;base64,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
|
||
|
}
|
||
|
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url(data:application/vnd.ms-fontobject;base64,n04AAEFNAAACAAIABAAAAAAABQAAAAAAAAABAJABAAAEAExQAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAJxJ/LAAAAAAAAAAAAAAAAAAAAAAAACgARwBMAFkAUABIAEkAQwBPAE4AUwAgAEgAYQBsAGYAbABpAG4AZwBzAAAADgBSAGUAZwB1AGwAYQByAAAAeABWAGUAcgBzAGkAbwBuACAAMQAuADAAMAA5ADsAUABTACAAMAAwADEALgAwADAAOQA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOAAzADIAOQAAADgARwBMAFkAUABIAEkAQwBPAE4AUwAgAEgAYQBsAGYAbABpAG4AZwBzACAAUgBlAGcAdQBsAGEAcgAAAAAAQlNHUAAAAAAAAAAAAAAAAAAAAAADAKncAE0TAE0ZAEbuFM3pjM/SEdmjKHUbyow8ATBE40IvWA3vTu8LiABDQ+pexwUMcm1SMnNryctQSiI1K5ZnbOlXKmnVV5YvRe6RnNMFNCOs1KNVpn6yZhCJkRtVRNzEufeIq7HgSrcx4S8h/v4vnrrKc6oCNxmSk2uKlZQHBii6iKFoH0746ThvkO1kJHlxjrkxs+LWORaDQBEtiYJIR5IB9Bi1UyL4Rmr0BNigNkMzlKQmnofBHviqVzUxwdMb3NdCn69hy+pRYVKGVS/1tnsqv4LL7wCCPZZAZPT4aCShHjHJVNuXbmMrY5LeQaGnvAkXlVrJgKRAUdFjrWEah9XebPeQMj7KS7DIBAFt8ycgC5PLGUOHSE3ErGZCiViNLL5ZARfywnCoZaKQCu6NuFX42AEeKtKUGnr/Cm2Cy8tpFhBPMW5Fxi4Qm4TkDWh4IWFDClhU2hRWosUWqcKLlgyXB+lSHaWaHiWlBAR8SeSgSPCQxdVQgzUixWKSTrIQEbU94viDctkvX+VSjJuUmV8L4CXShI11esnp0pjWNZIyxKHS4wVQ2ime1P4RnhvGw0aDN1OLAXGERsB7buFpFGGBAre4QEQR0HOIO5oYH305G+KspT/FupEGGa
|
||
|
</style>
|
||
|
<script>/*!
|
||
|
* Bootstrap v3.3.5 (http://getbootstrap.com)
|
||
|
* Copyright 2011-2015 Twitter, Inc.
|
||
|
* Licensed under the MIT license
|
||
|
*/
|
||
|
if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==type
|
||
|
d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affi
|
||
|
<script>/**
|
||
|
* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
|
||
|
*/
|
||
|
// Only run this code in IE 8
|
||
|
if (!!window.navigator.userAgent.match("MSIE 8")) {
|
||
|
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document);
|
||
|
};
|
||
|
</script>
|
||
|
<script>/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
|
||
|
* Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
|
||
|
* */
|
||
|
|
||
|
// Only run this code in IE 8
|
||
|
if (!!window.navigator.userAgent.match("MSIE 8")) {
|
||
|
!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmVal
|
||
|
};
|
||
|
</script>
|
||
|
<script>!function(a,b){"use strict";function c(c,g){var h=this;h.$el=a(c),h.el=c,h.id=e++,h.$el.bind("destroyed",a.proxy(h.teardown,h)),h.$clonedHeader=null,h.$originalHeader=null,h.cachedHeaderHeight=null,h.isSticky=!1,h.hasBeenSticky=!1,h.leftOffset=null,h.topOffset=null,h.init=function(){h.setOptions(g),h.$el.each(function(){var b=a(this);b.css("padding",0),h.$originalHeader=a("thead:first",this),h.$clonedHeader=h.$originalHeader.clone(),b.trigger("clonedHeader."+d,[h.$clonedHeader]),h.$clonedHeader.addClass("tableFloatingHeader"),h.$clonedHeader.css({display:"none",opacity:0}),h.$originalHeader.addClass("tableFloatingHeaderOriginal"),h.$originalHeader.after(h.$clonedHeader),h.$printStyle=a('<style type="text/css" media="print">.tableFloatingHeader{display:none !important;}.tableFloatingHeaderOriginal{position:static !important;}</style>'),h.$head.append(h.$printStyle)}),h.updateWidth(),h.toggleHeaders(),h.bind()},h.destroy=function(){h.$el.unbind("destroyed",h.teardown),h.teardown()},h.teardown=function(){h.isSticky&&h.$originalHeader.css("position","static"),a.removeData(h.el,"plugin_"+d),h.unbind(),h.$clonedHeader.remove(),h.$originalHeader.removeClass("tableFloatingHeaderOriginal"),h.$originalHeader.css("visibility","visible"),h.$printStyle.remove(),h.el=null,h.$el=null},h.bind=function(){h.$scrollableArea.on("scroll."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.on("scroll."+d+h.id,h.setPositionValues),h.$window.on("resize."+d+h.id,h.toggleHeaders)),h.$scrollableArea.on("resize."+d,h.toggleHeaders),h.$scrollableArea.on("resize."+d,h.updateWidth)},h.unbind=function(){h.$scrollableArea.off("."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.off("."+d+h.id,h.setPositionValues),h.$window.off("."+d+h.id,h.toggleHeaders)),h.$scrollableArea.off("."+d,h.updateWidth)},h.debounce=function(a,b){var c=null;return function(){var d=this,e=arguments;clearTimeout(c),c=setTimeout(function(){a.apply(d,e)},b)}},h.toggleHeaders=h.debounce(function(){h.$el&&h.$el.each(function(){var b,c=a(this),e=h.isWindowScrolling?isNaN(h.options.fixedOffset)?h.options.fixedOffset.outerHeight():h.options.fixedOffset:h.$scrollableArea.offset().top+(isNaN(h.options.fixedOffset)?0:h.options.fixedOffset),f=c.offset(),g=h.$scrollableArea.scrollTop()+e,i=h.$scrollableArea.scrollLeft(),j=h.options.cacheHeaderHeight?h.cachedHeaderHeight:h.$clonedHeader.height(),k=h.isWindowScrolling?g>f.top:e>f.top,l=(h.isWindowScrolling?g:0)<f.top+c.height()-j-(h.isWindowScrolling?0:e);k&&l?(b=f.left-i+h.options.leftOffset,h.$originalHeader.css({position:"fixed","margin-top":h.options.marginTop,left:b,"z-index":3}),h.leftOffset=b,h.topOffset=e,h.$clonedHeader.css("display",""),h.isSticky||(h.isSticky=!0,h.updateWidth(),c.trigger("enabledStickiness."+d)),h.setPositionValues()):h.isSticky&&(h.$originalHeader.css("position","static"),h.$clonedHeader.css("display","none"),h.isSticky=!1,h.resetWidth(a("td,th",h.$clonedHeader),a("td,th",h.$originalHeader)),c.trigger("disabledStickiness."+d))})},0),h.setPositionValues=h.debounce(function(){var a=h.$window.scrollTop(),b=h.$window.scrollLeft();!h.isSticky||0>a||a+h.$window.height()>h.$document.height()||0>b||b+h.$window.width()>h.$document.width()||h.$originalHeader.css({top:h.topOffset-(h.isWindowScrolling?0:a),left:h.leftOffset-(h.isWindowScrolling?0:b)})},0),h.updateWidth=h.debounce(function(){if(h.isSticky){h.$originalHeaderCells||(h.$originalHeaderCells=a("th,td",h.$originalHeader)),h.$clonedHeaderCells||(h.$clonedHeaderCells=a("th,td",h.$clonedHeader));var b=h.getWidth(h.$clonedHeaderCells);h.setWidth(b,h.$clonedHeaderCells,h.$originalHeaderCells),h.$originalHeader.css("width",h.$clonedHeader.width()),h.options.cacheHeaderHeight&&(h.cachedHeaderHeight=h.$clonedHeader.height())}},0),h.getWidth=function(c){var d=[];return c.each(function(c){var e,f=a(this);if("border-box"===f.css("box-sizing")){var g=f[0].getBoundingClientRect();e=g.width?g.width:g.right-g.left}else{var i=a("th",h.$originalHeader);if("collapse"===i.css("border-collapse"))if(b.getComputedStyle)e=parseFloat(b.getComputedStyle(this,null).width);else{var
|
||
|
<script>(function() {
|
||
|
// If window.HTMLWidgets is already defined, then use it; otherwise create a
|
||
|
// new object. This allows preceding code to set options that affect the
|
||
|
// initialization process (though none currently exist).
|
||
|
window.HTMLWidgets = window.HTMLWidgets || {};
|
||
|
|
||
|
// See if we're running in a viewer pane. If not, we're in a web browser.
|
||
|
var viewerMode = window.HTMLWidgets.viewerMode =
|
||
|
/\bviewer_pane=1\b/.test(window.location);
|
||
|
|
||
|
// See if we're running in Shiny mode. If not, it's a static document.
|
||
|
// Note that static widgets can appear in both Shiny and static modes, but
|
||
|
// obviously, Shiny widgets can only appear in Shiny apps/documents.
|
||
|
var shinyMode = window.HTMLWidgets.shinyMode =
|
||
|
typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings;
|
||
|
|
||
|
// We can't count on jQuery being available, so we implement our own
|
||
|
// version if necessary.
|
||
|
function querySelectorAll(scope, selector) {
|
||
|
if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) {
|
||
|
return scope.find(selector);
|
||
|
}
|
||
|
if (scope.querySelectorAll) {
|
||
|
return scope.querySelectorAll(selector);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function asArray(value) {
|
||
|
if (value === null)
|
||
|
return [];
|
||
|
if ($.isArray(value))
|
||
|
return value;
|
||
|
return [value];
|
||
|
}
|
||
|
|
||
|
// Implement jQuery's extend
|
||
|
function extend(target /*, ... */) {
|
||
|
if (arguments.length == 1) {
|
||
|
return target;
|
||
|
}
|
||
|
for (var i = 1; i < arguments.length; i++) {
|
||
|
var source = arguments[i];
|
||
|
for (var prop in source) {
|
||
|
if (source.hasOwnProperty(prop)) {
|
||
|
target[prop] = source[prop];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return target;
|
||
|
}
|
||
|
|
||
|
// IE8 doesn't support Array.forEach.
|
||
|
function forEach(values, callback, thisArg) {
|
||
|
if (values.forEach) {
|
||
|
values.forEach(callback, thisArg);
|
||
|
} else {
|
||
|
for (var i = 0; i < values.length; i++) {
|
||
|
callback.call(thisArg, values[i], i, values);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Replaces the specified method with the return value of funcSource.
|
||
|
//
|
||
|
// Note that funcSource should not BE the new method, it should be a function
|
||
|
// that RETURNS the new method. funcSource receives a single argument that is
|
||
|
// the overridden method, it can be called from the new method. The overridden
|
||
|
// method can be called like a regular function, it has the target permanently
|
||
|
// bound to it so "this" will work correctly.
|
||
|
function overrideMethod(target, methodName, funcSource) {
|
||
|
var superFunc = target[methodName] || function() {};
|
||
|
var superFuncBound = function() {
|
||
|
return superFunc.apply(target, arguments);
|
||
|
};
|
||
|
target[methodName] = funcSource(superFuncBound);
|
||
|
}
|
||
|
|
||
|
// Add a method to delegator that, when invoked, calls
|
||
|
// delegatee.methodName. If there is no such method on
|
||
|
// the delegatee, but there was one on delegator before
|
||
|
// delegateMethod was called, then the original version
|
||
|
// is invoked instead.
|
||
|
// For example:
|
||
|
//
|
||
|
// var a = {
|
||
|
// method1: function() { console.log('a1'); }
|
||
|
// method2: function() { console.log('a2'); }
|
||
|
// };
|
||
|
// var b = {
|
||
|
// method1: function() { console.log('b1'); }
|
||
|
// };
|
||
|
// delegateMethod(a, b, "method1");
|
||
|
// delegateMethod(a, b, "method2");
|
||
|
// a.method1();
|
||
|
// a.method2();
|
||
|
//
|
||
|
// The output would be "b1", "a2".
|
||
|
function delegateMethod(delegator, delegatee, methodName) {
|
||
|
var inherited = delegator[methodName];
|
||
|
delegator[methodName] = function() {
|
||
|
var target = delegatee;
|
||
|
var method = delegatee[methodName];
|
||
|
|
||
|
// The method doesn't exist on the delegatee. Instead,
|
||
|
// call the method on the delegator, if it exists.
|
||
|
if (!method) {
|
||
|
target = delegator;
|
||
|
method = inherited;
|
||
|
}
|
||
|
|
||
|
if (method) {
|
||
|
return method.apply(target, arguments);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
// Implement a vague facsimilie of jQuery's data method
|
||
|
function elementData(el, name, value) {
|
||
|
if (arguments.length == 2) {
|
||
|
return el["htmlwidget_data_" + name];
|
||
|
} else if (arguments.length == 3) {
|
||
|
el["htmlwidget_data_" + name] = value;
|
||
|
return el;
|
||
|
} else {
|
||
|
throw new Error("Wrong number of arguments for elementData: " +
|
||
|
arguments.length);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
|
||
|
function escapeRegExp(str) {
|
||
|
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
||
|
}
|
||
|
|
||
|
function hasClass(el, className) {
|
||
|
var re = new RegExp("\\b" + escapeRegExp(className) + "\\b");
|
||
|
return re.test(el.className);
|
||
|
}
|
||
|
|
||
|
// elements - array (or array-like object) of HTML elements
|
||
|
// className - class name to test for
|
||
|
// include - if true, only return elements with given className;
|
||
|
// if false, only return elements *without* given className
|
||
|
function filterByClass(elements, className, include) {
|
||
|
var results = [];
|
||
|
for (var i = 0; i < elements.length; i++) {
|
||
|
if (hasClass(elements[i], className) == include)
|
||
|
results.push(elements[i]);
|
||
|
}
|
||
|
return results;
|
||
|
}
|
||
|
|
||
|
function on(obj, eventName, func) {
|
||
|
if (obj.addEventListener) {
|
||
|
obj.addEventListener(eventName, func, false);
|
||
|
} else if (obj.attachEvent) {
|
||
|
obj.attachEvent(eventName, func);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function off(obj, eventName, func) {
|
||
|
if (obj.removeEventListener)
|
||
|
obj.removeEventListener(eventName, func, false);
|
||
|
else if (obj.detachEvent) {
|
||
|
obj.detachEvent(eventName, func);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Translate array of values to top/right/bottom/left, as usual with
|
||
|
// the "padding" CSS property
|
||
|
// https://developer.mozilla.org/en-US/docs/Web/CSS/padding
|
||
|
function unpackPadding(value) {
|
||
|
if (typeof(value) === "number")
|
||
|
value = [value];
|
||
|
if (value.length === 1) {
|
||
|
return {top: value[0], right: value[0], bottom: value[0], left: value[0]};
|
||
|
}
|
||
|
if (value.length === 2) {
|
||
|
return {top: value[0], right: value[1], bottom: value[0], left: value[1]};
|
||
|
}
|
||
|
if (value.length === 3) {
|
||
|
return {top: value[0], right: value[1], bottom: value[2], left: value[1]};
|
||
|
}
|
||
|
if (value.length === 4) {
|
||
|
return {top: value[0], right: value[1], bottom: value[2], left: value[3]};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Convert an unpacked padding object to a CSS value
|
||
|
function paddingToCss(paddingObj) {
|
||
|
return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px";
|
||
|
}
|
||
|
|
||
|
// Makes a number suitable for CSS
|
||
|
function px(x) {
|
||
|
if (typeof(x) === "number")
|
||
|
return x + "px";
|
||
|
else
|
||
|
return x;
|
||
|
}
|
||
|
|
||
|
// Retrieves runtime widget sizing information for an element.
|
||
|
// The return value is either null, or an object with fill, padding,
|
||
|
// defaultWidth, defaultHeight fields.
|
||
|
function sizingPolicy(el) {
|
||
|
var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']");
|
||
|
if (!sizingEl)
|
||
|
return null;
|
||
|
var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}");
|
||
|
if (viewerMode) {
|
||
|
return sp.viewer;
|
||
|
} else {
|
||
|
return sp.browser;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// @param tasks Array of strings (or falsy value, in which case no-op).
|
||
|
// Each element must be a valid JavaScript expression that yields a
|
||
|
// function. Or, can be an array of objects with "code" and "data"
|
||
|
// properties; in this case, the "code" property should be a string
|
||
|
// of JS that's an expr that yields a function, and "data" should be
|
||
|
// an object that will be added as an additional argument when that
|
||
|
// function is called.
|
||
|
// @param target The object that will be "this" for each function
|
||
|
// execution.
|
||
|
// @param args Array of arguments to be passed to the functions. (The
|
||
|
// same arguments will be passed to all functions.)
|
||
|
function evalAndRun(tasks, target, args) {
|
||
|
if (tasks) {
|
||
|
forEach(tasks, function(task) {
|
||
|
var theseArgs = args;
|
||
|
if (typeof(task) === "object") {
|
||
|
theseArgs = theseArgs.concat([task.data]);
|
||
|
task = task.code;
|
||
|
}
|
||
|
var taskFunc = tryEval(task);
|
||
|
if (typeof(taskFunc) !== "function") {
|
||
|
throw new Error("Task must be a function! Source:\n" + task);
|
||
|
}
|
||
|
taskFunc.apply(target, theseArgs);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Attempt eval() both with and without enclosing in parentheses.
|
||
|
// Note that enclosing coerces a function declaration into
|
||
|
// an expression that eval() can parse
|
||
|
// (otherwise, a SyntaxError is thrown)
|
||
|
function tryEval(code) {
|
||
|
var result = null;
|
||
|
try {
|
||
|
result = eval(code);
|
||
|
} catch(error) {
|
||
|
if (!error instanceof SyntaxError) {
|
||
|
throw error;
|
||
|
}
|
||
|
try {
|
||
|
result = eval("(" + code + ")");
|
||
|
} catch(e) {
|
||
|
if (e instanceof SyntaxError) {
|
||
|
throw error;
|
||
|
} else {
|
||
|
throw e;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
function initSizing(el) {
|
||
|
var sizing = sizingPolicy(el);
|
||
|
if (!sizing)
|
||
|
return;
|
||
|
|
||
|
var cel = document.getElementById("htmlwidget_container");
|
||
|
if (!cel)
|
||
|
return;
|
||
|
|
||
|
if (typeof(sizing.padding) !== "undefined") {
|
||
|
document.body.style.margin = "0";
|
||
|
document.body.style.padding = paddingToCss(unpackPadding(sizing.padding));
|
||
|
}
|
||
|
|
||
|
if (sizing.fill) {
|
||
|
document.body.style.overflow = "hidden";
|
||
|
document.body.style.width = "100%";
|
||
|
document.body.style.height = "100%";
|
||
|
document.documentElement.style.width = "100%";
|
||
|
document.documentElement.style.height = "100%";
|
||
|
if (cel) {
|
||
|
cel.style.position = "absolute";
|
||
|
var pad = unpackPadding(sizing.padding);
|
||
|
cel.style.top = pad.top + "px";
|
||
|
cel.style.right = pad.right + "px";
|
||
|
cel.style.bottom = pad.bottom + "px";
|
||
|
cel.style.left = pad.left + "px";
|
||
|
el.style.width = "100%";
|
||
|
el.style.height = "100%";
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
getWidth: function() { return cel.offsetWidth; },
|
||
|
getHeight: function() { return cel.offsetHeight; }
|
||
|
};
|
||
|
|
||
|
} else {
|
||
|
el.style.width = px(sizing.width);
|
||
|
el.style.height = px(sizing.height);
|
||
|
|
||
|
return {
|
||
|
getWidth: function() { return el.offsetWidth; },
|
||
|
getHeight: function() { return el.offsetHeight; }
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Default implementations for methods
|
||
|
var defaults = {
|
||
|
find: function(scope) {
|
||
|
return querySelectorAll(scope, "." + this.name);
|
||
|
},
|
||
|
renderError: function(el, err) {
|
||
|
var $el = $(el);
|
||
|
|
||
|
this.clearError(el);
|
||
|
|
||
|
// Add all these error classes, as Shiny does
|
||
|
var errClass = "shiny-output-error";
|
||
|
if (err.type !== null) {
|
||
|
// use the classes of the error condition as CSS class names
|
||
|
errClass = errClass + " " + $.map(asArray(err.type), function(type) {
|
||
|
return errClass + "-" + type;
|
||
|
}).join(" ");
|
||
|
}
|
||
|
errClass = errClass + " htmlwidgets-error";
|
||
|
|
||
|
// Is el inline or block? If inline or inline-block, just display:none it
|
||
|
// and add an inline error.
|
||
|
var display = $el.css("display");
|
||
|
$el.data("restore-display-mode", display);
|
||
|
|
||
|
if (display === "inline" || display === "inline-block") {
|
||
|
$el.hide();
|
||
|
if (err.message !== "") {
|
||
|
var errorSpan = $("<span>").addClass(errClass);
|
||
|
errorSpan.text(err.message);
|
||
|
$el.after(errorSpan);
|
||
|
}
|
||
|
} else if (display === "block") {
|
||
|
// If block, add an error just after the el, set visibility:none on the
|
||
|
// el, and position the error to be on top of the el.
|
||
|
// Mark it with a unique ID and CSS class so we can remove it later.
|
||
|
$el.css("visibility", "hidden");
|
||
|
if (err.message !== "") {
|
||
|
var errorDiv = $("<div>").addClass(errClass).css("position", "absolute")
|
||
|
.css("top", el.offsetTop)
|
||
|
.css("left", el.offsetLeft)
|
||
|
// setting width can push out the page size, forcing otherwise
|
||
|
// unnecessary scrollbars to appear and making it impossible for
|
||
|
// the element to shrink; so use max-width instead
|
||
|
.css("maxWidth", el.offsetWidth)
|
||
|
.css("height", el.offsetHeight);
|
||
|
errorDiv.text(err.message);
|
||
|
$el.after(errorDiv);
|
||
|
|
||
|
// Really dumb way to keep the size/position of the error in sync with
|
||
|
// the parent element as the window is resized or whatever.
|
||
|
var intId = setInterval(function() {
|
||
|
if (!errorDiv[0].parentElement) {
|
||
|
clearInterval(intId);
|
||
|
return;
|
||
|
}
|
||
|
errorDiv
|
||
|
.css("top", el.offsetTop)
|
||
|
.css("left", el.offsetLeft)
|
||
|
.css("maxWidth", el.offsetWidth)
|
||
|
.css("height", el.offsetHeight);
|
||
|
}, 500);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
clearError: function(el) {
|
||
|
var $el = $(el);
|
||
|
var display = $el.data("restore-display-mode");
|
||
|
$el.data("restore-display-mode", null);
|
||
|
|
||
|
if (display === "inline" || display === "inline-block") {
|
||
|
if (display)
|
||
|
$el.css("display", display);
|
||
|
$(el.nextSibling).filter(".htmlwidgets-error").remove();
|
||
|
} else if (display === "block"){
|
||
|
$el.css("visibility", "inherit");
|
||
|
$(el.nextSibling).filter(".htmlwidgets-error").remove();
|
||
|
}
|
||
|
},
|
||
|
sizing: {}
|
||
|
};
|
||
|
|
||
|
// Called by widget bindings to register a new type of widget. The definition
|
||
|
// object can contain the following properties:
|
||
|
// - name (required) - A string indicating the binding name, which will be
|
||
|
// used by default as the CSS classname to look for.
|
||
|
// - initialize (optional) - A function(el) that will be called once per
|
||
|
// widget element; if a value is returned, it will be passed as the third
|
||
|
// value to renderValue.
|
||
|
// - renderValue (required) - A function(el, data, initValue) that will be
|
||
|
// called with data. Static contexts will cause this to be called once per
|
||
|
// element; Shiny apps will cause this to be called multiple times per
|
||
|
// element, as the data changes.
|
||
|
window.HTMLWidgets.widget = function(definition) {
|
||
|
if (!definition.name) {
|
||
|
throw new Error("Widget must have a name");
|
||
|
}
|
||
|
if (!definition.type) {
|
||
|
throw new Error("Widget must have a type");
|
||
|
}
|
||
|
// Currently we only support output widgets
|
||
|
if (definition.type !== "output") {
|
||
|
throw new Error("Unrecognized widget type '" + definition.type + "'");
|
||
|
}
|
||
|
// TODO: Verify that .name is a valid CSS classname
|
||
|
|
||
|
// Support new-style instance-bound definitions. Old-style class-bound
|
||
|
// definitions have one widget "object" per widget per type/class of
|
||
|
// widget; the renderValue and resize methods on such widget objects
|
||
|
// take el and instance arguments, because the widget object can't
|
||
|
// store them. New-style instance-bound definitions have one widget
|
||
|
// object per widget instance; the definition that's passed in doesn't
|
||
|
// provide renderValue or resize methods at all, just the single method
|
||
|
// factory(el, width, height)
|
||
|
// which returns an object that has renderValue(x) and resize(w, h).
|
||
|
// This enables a far more natural programming style for the widget
|
||
|
// author, who can store per-instance state using either OO-style
|
||
|
// instance fields or functional-style closure variables (I guess this
|
||
|
// is in contrast to what can only be called C-style pseudo-OO which is
|
||
|
// what we required before).
|
||
|
if (definition.factory) {
|
||
|
definition = createLegacyDefinitionAdapter(definition);
|
||
|
}
|
||
|
|
||
|
if (!definition.renderValue) {
|
||
|
throw new Error("Widget must have a renderValue function");
|
||
|
}
|
||
|
|
||
|
// For static rendering (non-Shiny), use a simple widget registration
|
||
|
// scheme. We also use this scheme for Shiny apps/documents that also
|
||
|
// contain static widgets.
|
||
|
window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || [];
|
||
|
// Merge defaults into the definition; don't mutate the original definition.
|
||
|
var staticBinding = extend({}, defaults, definition);
|
||
|
overrideMethod(staticBinding, "find", function(superfunc) {
|
||
|
return function(scope) {
|
||
|
var results = superfunc(scope);
|
||
|
// Filter out Shiny outputs, we only want the static kind
|
||
|
return filterByClass(results, "html-widget-output", false);
|
||
|
};
|
||
|
});
|
||
|
window.HTMLWidgets.widgets.push(staticBinding);
|
||
|
|
||
|
if (shinyMode) {
|
||
|
// Shiny is running. Register the definition with an output binding.
|
||
|
// The definition itself will not be the output binding, instead
|
||
|
// we will make an output binding object that delegates to the
|
||
|
// definition. This is because we foolishly used the same method
|
||
|
// name (renderValue) for htmlwidgets definition and Shiny bindings
|
||
|
// but they actually have quite different semantics (the Shiny
|
||
|
// bindings receive data that includes lots of metadata that it
|
||
|
// strips off before calling htmlwidgets renderValue). We can't
|
||
|
// just ignore the difference because in some widgets it's helpful
|
||
|
// to call this.renderValue() from inside of resize(), and if
|
||
|
// we're not delegating, then that call will go to the Shiny
|
||
|
// version instead of the htmlwidgets version.
|
||
|
|
||
|
// Merge defaults with definition, without mutating either.
|
||
|
var bindingDef = extend({}, defaults, definition);
|
||
|
|
||
|
// This object will be our actual Shiny binding.
|
||
|
var shinyBinding = new Shiny.OutputBinding();
|
||
|
|
||
|
// With a few exceptions, we'll want to simply use the bindingDef's
|
||
|
// version of methods if they are available, otherwise fall back to
|
||
|
// Shiny's defaults. NOTE: If Shiny's output bindings gain additional
|
||
|
// methods in the future, and we want them to be overrideable by
|
||
|
// HTMLWidget binding definitions, then we'll need to add them to this
|
||
|
// list.
|
||
|
delegateMethod(shinyBinding, bindingDef, "getId");
|
||
|
delegateMethod(shinyBinding, bindingDef, "onValueChange");
|
||
|
delegateMethod(shinyBinding, bindingDef, "onValueError");
|
||
|
delegateMethod(shinyBinding, bindingDef, "renderError");
|
||
|
delegateMethod(shinyBinding, bindingDef, "clearError");
|
||
|
delegateMethod(shinyBinding, bindingDef, "showProgress");
|
||
|
|
||
|
// The find, renderValue, and resize are handled differently, because we
|
||
|
// want to actually decorate the behavior of the bindingDef methods.
|
||
|
|
||
|
shinyBinding.find = function(scope) {
|
||
|
var results = bindingDef.find(scope);
|
||
|
|
||
|
// Only return elements that are Shiny outputs, not static ones
|
||
|
var dynamicResults = results.filter(".html-widget-output");
|
||
|
|
||
|
// It's possible that whatever caused Shiny to think there might be
|
||
|
// new dynamic outputs, also caused there to be new static outputs.
|
||
|
// Since there might be lots of different htmlwidgets bindings, we
|
||
|
// schedule execution for later--no need to staticRender multiple
|
||
|
// times.
|
||
|
if (results.length !== dynamicResults.length)
|
||
|
scheduleStaticRender();
|
||
|
|
||
|
return dynamicResults;
|
||
|
};
|
||
|
|
||
|
// Wrap renderValue to handle initialization, which unfortunately isn't
|
||
|
// supported natively by Shiny at the time of this writing.
|
||
|
|
||
|
shinyBinding.renderValue = function(el, data) {
|
||
|
Shiny.renderDependencies(data.deps);
|
||
|
// Resolve strings marked as javascript literals to objects
|
||
|
if (!(data.evals instanceof Array)) data.evals = [data.evals];
|
||
|
for (var i = 0; data.evals && i < data.evals.length; i++) {
|
||
|
window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]);
|
||
|
}
|
||
|
if (!bindingDef.renderOnNullValue) {
|
||
|
if (data.x === null) {
|
||
|
el.style.visibility = "hidden";
|
||
|
return;
|
||
|
} else {
|
||
|
el.style.visibility = "inherit";
|
||
|
}
|
||
|
}
|
||
|
if (!elementData(el, "initialized")) {
|
||
|
initSizing(el);
|
||
|
|
||
|
elementData(el, "initialized", true);
|
||
|
if (bindingDef.initialize) {
|
||
|
var result = bindingDef.initialize(el, el.offsetWidth,
|
||
|
el.offsetHeight);
|
||
|
elementData(el, "init_result", result);
|
||
|
}
|
||
|
}
|
||
|
bindingDef.renderValue(el, data.x, elementData(el, "init_result"));
|
||
|
evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]);
|
||
|
};
|
||
|
|
||
|
// Only override resize if bindingDef implements it
|
||
|
if (bindingDef.resize) {
|
||
|
shinyBinding.resize = function(el, width, height) {
|
||
|
// Shiny can call resize before initialize/renderValue have been
|
||
|
// called, which doesn't make sense for widgets.
|
||
|
if (elementData(el, "initialized")) {
|
||
|
bindingDef.resize(el, width, height, elementData(el, "init_result"));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
Shiny.outputBindings.register(shinyBinding, bindingDef.name);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var scheduleStaticRenderTimerId = null;
|
||
|
function scheduleStaticRender() {
|
||
|
if (!scheduleStaticRenderTimerId) {
|
||
|
scheduleStaticRenderTimerId = setTimeout(function() {
|
||
|
scheduleStaticRenderTimerId = null;
|
||
|
window.HTMLWidgets.staticRender();
|
||
|
}, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Render static widgets after the document finishes loading
|
||
|
// Statically render all elements that are of this widget's class
|
||
|
window.HTMLWidgets.staticRender = function() {
|
||
|
var bindings = window.HTMLWidgets.widgets || [];
|
||
|
forEach(bindings, function(binding) {
|
||
|
var matches = binding.find(document.documentElement);
|
||
|
forEach(matches, function(el) {
|
||
|
var sizeObj = initSizing(el, binding);
|
||
|
|
||
|
if (hasClass(el, "html-widget-static-bound"))
|
||
|
return;
|
||
|
el.className = el.className + " html-widget-static-bound";
|
||
|
|
||
|
var initResult;
|
||
|
if (binding.initialize) {
|
||
|
initResult = binding.initialize(el,
|
||
|
sizeObj ? sizeObj.getWidth() : el.offsetWidth,
|
||
|
sizeObj ? sizeObj.getHeight() : el.offsetHeight
|
||
|
);
|
||
|
elementData(el, "init_result", initResult);
|
||
|
}
|
||
|
|
||
|
if (binding.resize) {
|
||
|
var lastSize = {
|
||
|
w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,
|
||
|
h: sizeObj ? sizeObj.getHeight() : el.offsetHeight
|
||
|
};
|
||
|
var resizeHandler = function(e) {
|
||
|
var size = {
|
||
|
w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,
|
||
|
h: sizeObj ? sizeObj.getHeight() : el.offsetHeight
|
||
|
};
|
||
|
if (size.w === 0 && size.h === 0)
|
||
|
return;
|
||
|
if (size.w === lastSize.w && size.h === lastSize.h)
|
||
|
return;
|
||
|
lastSize = size;
|
||
|
binding.resize(el, size.w, size.h, initResult);
|
||
|
};
|
||
|
|
||
|
on(window, "resize", resizeHandler);
|
||
|
|
||
|
// This is needed for cases where we're running in a Shiny
|
||
|
// app, but the widget itself is not a Shiny output, but
|
||
|
// rather a simple static widget. One example of this is
|
||
|
// an rmarkdown document that has runtime:shiny and widget
|
||
|
// that isn't in a render function. Shiny only knows to
|
||
|
// call resize handlers for Shiny outputs, not for static
|
||
|
// widgets, so we do it ourselves.
|
||
|
if (window.jQuery) {
|
||
|
window.jQuery(document).on(
|
||
|
"shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets",
|
||
|
resizeHandler
|
||
|
);
|
||
|
window.jQuery(document).on(
|
||
|
"hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets",
|
||
|
resizeHandler
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// This is needed for the specific case of ioslides, which
|
||
|
// flips slides between display:none and display:block.
|
||
|
// Ideally we would not have to have ioslide-specific code
|
||
|
// here, but rather have ioslides raise a generic event,
|
||
|
// but the rmarkdown package just went to CRAN so the
|
||
|
// window to getting that fixed may be long.
|
||
|
if (window.addEventListener) {
|
||
|
// It's OK to limit this to window.addEventListener
|
||
|
// browsers because ioslides itself only supports
|
||
|
// such browsers.
|
||
|
on(document, "slideenter", resizeHandler);
|
||
|
on(document, "slideleave", resizeHandler);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']");
|
||
|
if (scriptData) {
|
||
|
var data = JSON.parse(scriptData.textContent || scriptData.text);
|
||
|
// Resolve strings marked as javascript literals to objects
|
||
|
if (!(data.evals instanceof Array)) data.evals = [data.evals];
|
||
|
for (var k = 0; data.evals && k < data.evals.length; k++) {
|
||
|
window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]);
|
||
|
}
|
||
|
binding.renderValue(el, data.x, initResult);
|
||
|
evalAndRun(data.jsHooks.render, initResult, [el, data.x]);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
invokePostRenderHandlers();
|
||
|
}
|
||
|
|
||
|
|
||
|
function has_jQuery3() {
|
||
|
if (!window.jQuery) {
|
||
|
return false;
|
||
|
}
|
||
|
var $version = window.jQuery.fn.jquery;
|
||
|
var $major_version = parseInt($version.split(".")[0]);
|
||
|
return $major_version >= 3;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
/ Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's
|
||
|
/ on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now
|
||
|
/ really means $(setTimeout(fn)).
|
||
|
/ https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous
|
||
|
/
|
||
|
/ Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny
|
||
|
/ one tick later than it did before, which means staticRender() is
|
||
|
/ called renderValue() earlier than (advanced) widget authors might be expecting.
|
||
|
/ https://github.com/rstudio/shiny/issues/2630
|
||
|
/
|
||
|
/ For a concrete example, leaflet has some methods (e.g., updateBounds)
|
||
|
/ which reference Shiny methods registered in initShiny (e.g., setInputValue).
|
||
|
/ Since leaflet is privy to this life-cycle, it knows to use setTimeout() to
|
||
|
/ delay execution of those methods (until Shiny methods are ready)
|
||
|
/ https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268
|
||
|
/
|
||
|
/ Ideally widget authors wouldn't need to use this setTimeout() hack that
|
||
|
/ leaflet uses to call Shiny methods on a staticRender(). In the long run,
|
||
|
/ the logic initShiny should be broken up so that method registration happens
|
||
|
/ right away, but binding happens later.
|
||
|
*/
|
||
|
function maybeStaticRenderLater() {
|
||
|
if (shinyMode && has_jQuery3()) {
|
||
|
window.jQuery(window.HTMLWidgets.staticRender);
|
||
|
} else {
|
||
|
window.HTMLWidgets.staticRender();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (document.addEventListener) {
|
||
|
document.addEventListener("DOMContentLoaded", function() {
|
||
|
document.removeEventListener("DOMContentLoaded", arguments.callee, false);
|
||
|
maybeStaticRenderLater();
|
||
|
}, false);
|
||
|
} else if (document.attachEvent) {
|
||
|
document.attachEvent("onreadystatechange", function() {
|
||
|
if (document.readyState === "complete") {
|
||
|
document.detachEvent("onreadystatechange", arguments.callee);
|
||
|
maybeStaticRenderLater();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
|
||
|
window.HTMLWidgets.getAttachmentUrl = function(depname, key) {
|
||
|
// If no key, default to the first item
|
||
|
if (typeof(key) === "undefined")
|
||
|
key = 1;
|
||
|
|
||
|
var link = document.getElementById(depname + "-" + key + "-attachment");
|
||
|
if (!link) {
|
||
|
throw new Error("Attachment " + depname + "/" + key + " not found in document");
|
||
|
}
|
||
|
return link.getAttribute("href");
|
||
|
};
|
||
|
|
||
|
window.HTMLWidgets.dataframeToD3 = function(df) {
|
||
|
var names = [];
|
||
|
var length;
|
||
|
for (var name in df) {
|
||
|
if (df.hasOwnProperty(name))
|
||
|
names.push(name);
|
||
|
if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") {
|
||
|
throw new Error("All fields must be arrays");
|
||
|
} else if (typeof(length) !== "undefined" && length !== df[name].length) {
|
||
|
throw new Error("All fields must be arrays of the same length");
|
||
|
}
|
||
|
length = df[name].length;
|
||
|
}
|
||
|
var results = [];
|
||
|
var item;
|
||
|
for (var row = 0; row < length; row++) {
|
||
|
item = {};
|
||
|
for (var col = 0; col < names.length; col++) {
|
||
|
item[names[col]] = df[names[col]][row];
|
||
|
}
|
||
|
results.push(item);
|
||
|
}
|
||
|
return results;
|
||
|
};
|
||
|
|
||
|
window.HTMLWidgets.transposeArray2D = function(array) {
|
||
|
if (array.length === 0) return array;
|
||
|
var newArray = array[0].map(function(col, i) {
|
||
|
return array.map(function(row) {
|
||
|
return row[i]
|
||
|
})
|
||
|
});
|
||
|
return newArray;
|
||
|
};
|
||
|
// Split value at splitChar, but allow splitChar to be escaped
|
||
|
// using escapeChar. Any other characters escaped by escapeChar
|
||
|
// will be included as usual (including escapeChar itself).
|
||
|
function splitWithEscape(value, splitChar, escapeChar) {
|
||
|
var results = [];
|
||
|
var escapeMode = false;
|
||
|
var currentResult = "";
|
||
|
for (var pos = 0; pos < value.length; pos++) {
|
||
|
if (!escapeMode) {
|
||
|
if (value[pos] === splitChar) {
|
||
|
results.push(currentResult);
|
||
|
currentResult = "";
|
||
|
} else if (value[pos] === escapeChar) {
|
||
|
escapeMode = true;
|
||
|
} else {
|
||
|
currentResult += value[pos];
|
||
|
}
|
||
|
} else {
|
||
|
currentResult += value[pos];
|
||
|
escapeMode = false;
|
||
|
}
|
||
|
}
|
||
|
if (currentResult !== "") {
|
||
|
results.push(currentResult);
|
||
|
}
|
||
|
return results;
|
||
|
}
|
||
|
// Function authored by Yihui/JJ Allaire
|
||
|
window.HTMLWidgets.evaluateStringMember = function(o, member) {
|
||
|
var parts = splitWithEscape(member, '.', '\\');
|
||
|
for (var i = 0, l = parts.length; i < l; i++) {
|
||
|
var part = parts[i];
|
||
|
// part may be a character or 'numeric' member name
|
||
|
if (o !== null && typeof o === "object" && part in o) {
|
||
|
if (i == (l - 1)) { // if we are at the end of the line then evalulate
|
||
|
if (typeof o[part] === "string")
|
||
|
o[part] = tryEval(o[part]);
|
||
|
} else { // otherwise continue to next embedded object
|
||
|
o = o[part];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Retrieve the HTMLWidget instance (i.e. the return value of an
|
||
|
// HTMLWidget binding's initialize() or factory() function)
|
||
|
// associated with an element, or null if none.
|
||
|
window.HTMLWidgets.getInstance = function(el) {
|
||
|
return elementData(el, "init_result");
|
||
|
};
|
||
|
|
||
|
// Finds the first element in the scope that matches the selector,
|
||
|
// and returns the HTMLWidget instance (i.e. the return value of
|
||
|
// an HTMLWidget binding's initialize() or factory() function)
|
||
|
// associated with that element, if any. If no element matches the
|
||
|
// selector, or the first matching element has no HTMLWidget
|
||
|
// instance associated with it, then null is returned.
|
||
|
//
|
||
|
// The scope argument is optional, and defaults to window.document.
|
||
|
window.HTMLWidgets.find = function(scope, selector) {
|
||
|
if (arguments.length == 1) {
|
||
|
selector = scope;
|
||
|
scope = document;
|
||
|
}
|
||
|
|
||
|
var el = scope.querySelector(selector);
|
||
|
if (el === null) {
|
||
|
return null;
|
||
|
} else {
|
||
|
return window.HTMLWidgets.getInstance(el);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Finds all elements in the scope that match the selector, and
|
||
|
// returns the HTMLWidget instances (i.e. the return values of
|
||
|
// an HTMLWidget binding's initialize() or factory() function)
|
||
|
// associated with the elements, in an array. If elements that
|
||
|
// match the selector don't have an associated HTMLWidget
|
||
|
// instance, the returned array will contain nulls.
|
||
|
//
|
||
|
// The scope argument is optional, and defaults to window.document.
|
||
|
window.HTMLWidgets.findAll = function(scope, selector) {
|
||
|
if (arguments.length == 1) {
|
||
|
selector = scope;
|
||
|
scope = document;
|
||
|
}
|
||
|
|
||
|
var nodes = scope.querySelectorAll(selector);
|
||
|
var results = [];
|
||
|
for (var i = 0; i < nodes.length; i++) {
|
||
|
results.push(window.HTMLWidgets.getInstance(nodes[i]));
|
||
|
}
|
||
|
return results;
|
||
|
};
|
||
|
|
||
|
var postRenderHandlers = [];
|
||
|
function invokePostRenderHandlers() {
|
||
|
while (postRenderHandlers.length) {
|
||
|
var handler = postRenderHandlers.shift();
|
||
|
if (handler) {
|
||
|
handler();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Register the given callback function to be invoked after the
|
||
|
// next time static widgets are rendered.
|
||
|
window.HTMLWidgets.addPostRenderHandler = function(callback) {
|
||
|
postRenderHandlers.push(callback);
|
||
|
};
|
||
|
|
||
|
// Takes a new-style instance-bound definition, and returns an
|
||
|
// old-style class-bound definition. This saves us from having
|
||
|
// to rewrite all the logic in this file to accomodate both
|
||
|
// types of definitions.
|
||
|
function createLegacyDefinitionAdapter(defn) {
|
||
|
var result = {
|
||
|
name: defn.name,
|
||
|
type: defn.type,
|
||
|
initialize: function(el, width, height) {
|
||
|
return defn.factory(el, width, height);
|
||
|
},
|
||
|
renderValue: function(el, x, instance) {
|
||
|
return instance.renderValue(x);
|
||
|
},
|
||
|
resize: function(el, width, height, instance) {
|
||
|
return instance.resize(width, height);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
if (defn.find)
|
||
|
result.find = defn.find;
|
||
|
if (defn.renderError)
|
||
|
result.renderError = defn.renderError;
|
||
|
if (defn.clearError)
|
||
|
result.clearError = defn.clearError;
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
})();
|
||
|
|
||
|
</script>
|
||
|
<style type="text/css">.dt-crosstalk-fade {
|
||
|
opacity: 0.2;
|
||
|
}
|
||
|
html body div.DTS div.dataTables_scrollBody {
|
||
|
background: none;
|
||
|
}
|
||
|
|
||
|
table.dataTable {
|
||
|
display: table;
|
||
|
}
|
||
|
</style>
|
||
|
<script>(function() {
|
||
|
|
||
|
// some helper functions: using a global object DTWidget so that it can be used
|
||
|
// in JS() code, e.g. datatable(options = list(foo = JS('code'))); unlike R's
|
||
|
// dynamic scoping, when 'code' is eval()'ed, JavaScript does not know objects
|
||
|
// from the "parent frame", e.g. JS('DTWidget') will not work unless it was made
|
||
|
// a global object
|
||
|
var DTWidget = {};
|
||
|
|
||
|
// 123456666.7890 -> 123,456,666.7890
|
||
|
var markInterval = function(d, digits, interval, mark, decMark, precision) {
|
||
|
x = precision ? d.toPrecision(digits) : d.toFixed(digits);
|
||
|
if (!/^-?[\d.]+$/.test(x)) return x;
|
||
|
var xv = x.split('.');
|
||
|
if (xv.length > 2) return x; // should have at most one decimal point
|
||
|
xv[0] = xv[0].replace(new RegExp('\\B(?=(\\d{' + interval + '})+(?!\\d))', 'g'), mark);
|
||
|
return xv.join(decMark);
|
||
|
};
|
||
|
|
||
|
DTWidget.formatCurrency = function(data, currency, digits, interval, mark, decMark, before) {
|
||
|
var d = parseFloat(data);
|
||
|
if (isNaN(d)) return '';
|
||
|
var res = markInterval(d, digits, interval, mark, decMark);
|
||
|
res = before ? (/^-/.test(res) ? '-' + currency + res.replace(/^-/, '') : currency + res) :
|
||
|
res + currency;
|
||
|
return res;
|
||
|
};
|
||
|
|
||
|
DTWidget.formatString = function(data, prefix, suffix) {
|
||
|
var d = data;
|
||
|
if (d === null) return '';
|
||
|
return prefix + d + suffix;
|
||
|
};
|
||
|
|
||
|
DTWidget.formatPercentage = function(data, digits, interval, mark, decMark) {
|
||
|
var d = parseFloat(data);
|
||
|
if (isNaN(d)) return '';
|
||
|
return markInterval(d * 100, digits, interval, mark, decMark) + '%';
|
||
|
};
|
||
|
|
||
|
DTWidget.formatRound = function(data, digits, interval, mark, decMark) {
|
||
|
var d = parseFloat(data);
|
||
|
if (isNaN(d)) return '';
|
||
|
return markInterval(d, digits, interval, mark, decMark);
|
||
|
};
|
||
|
|
||
|
DTWidget.formatSignif = function(data, digits, interval, mark, decMark) {
|
||
|
var d = parseFloat(data);
|
||
|
if (isNaN(d)) return '';
|
||
|
return markInterval(d, digits, interval, mark, decMark, true);
|
||
|
};
|
||
|
|
||
|
DTWidget.formatDate = function(data, method, params) {
|
||
|
var d = data;
|
||
|
if (d === null) return '';
|
||
|
// (new Date('2015-10-28')).toDateString() may return 2015-10-27 because the
|
||
|
// actual time created could be like 'Tue Oct 27 2015 19:00:00 GMT-0500 (CDT)',
|
||
|
// i.e. the date-only string is treated as UTC time instead of local time
|
||
|
if ((method === 'toDateString' || method === 'toLocaleDateString') && /^\d{4,}\D\d{2}\D\d{2}$/.test(d)) {
|
||
|
d = d.split(/\D/);
|
||
|
d = new Date(d[0], d[1] - 1, d[2]);
|
||
|
} else {
|
||
|
d = new Date(d);
|
||
|
}
|
||
|
return d[method].apply(d, params);
|
||
|
};
|
||
|
|
||
|
window.DTWidget = DTWidget;
|
||
|
|
||
|
var transposeArray2D = function(a) {
|
||
|
return a.length === 0 ? a : HTMLWidgets.transposeArray2D(a);
|
||
|
};
|
||
|
|
||
|
var crosstalkPluginsInstalled = false;
|
||
|
|
||
|
function maybeInstallCrosstalkPlugins() {
|
||
|
if (crosstalkPluginsInstalled)
|
||
|
return;
|
||
|
crosstalkPluginsInstalled = true;
|
||
|
|
||
|
$.fn.dataTable.ext.afnFiltering.push(
|
||
|
function(oSettings, aData, iDataIndex) {
|
||
|
var ctfilter = oSettings.nTable.ctfilter;
|
||
|
if (ctfilter && !ctfilter[iDataIndex])
|
||
|
return false;
|
||
|
|
||
|
var ctselect = oSettings.nTable.ctselect;
|
||
|
if (ctselect && !ctselect[iDataIndex])
|
||
|
return false;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
|
||
|
HTMLWidgets.widget({
|
||
|
name: "datatables",
|
||
|
type: "output",
|
||
|
renderOnNullValue: true,
|
||
|
initialize: function(el, width, height) {
|
||
|
$(el).html(' ');
|
||
|
return {
|
||
|
data: null,
|
||
|
ctfilterHandle: new crosstalk.FilterHandle(),
|
||
|
ctfilterSubscription: null,
|
||
|
ctselectHandle: new crosstalk.SelectionHandle(),
|
||
|
ctselectSubscription: null
|
||
|
};
|
||
|
},
|
||
|
renderValue: function(el, data, instance) {
|
||
|
if (el.offsetWidth === 0 || el.offsetHeight === 0) {
|
||
|
instance.data = data;
|
||
|
return;
|
||
|
}
|
||
|
instance.data = null;
|
||
|
var $el = $(el);
|
||
|
$el.empty();
|
||
|
|
||
|
if (data === null) {
|
||
|
$el.append(' ');
|
||
|
// clear previous Shiny inputs (if any)
|
||
|
for (var i in instance.clearInputs) instance.clearInputs[i]();
|
||
|
instance.clearInputs = {};
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var crosstalkOptions = data.crosstalkOptions;
|
||
|
if (!crosstalkOptions) crosstalkOptions = {
|
||
|
'key': null, 'group': null
|
||
|
};
|
||
|
if (crosstalkOptions.group) {
|
||
|
maybeInstallCrosstalkPlugins();
|
||
|
instance.ctfilterHandle.setGroup(crosstalkOptions.group);
|
||
|
instance.ctselectHandle.setGroup(crosstalkOptions.group);
|
||
|
}
|
||
|
|
||
|
// If we are in a flexdashboard scroll layout then we:
|
||
|
// (a) Always want to use pagination (otherwise we'll have
|
||
|
// a "double scroll bar" effect on the phone); and
|
||
|
// (b) Never want to fill the container (we want the pagination
|
||
|
// level to determine the size of the container)
|
||
|
if (window.FlexDashboard && !window.FlexDashboard.isFillPage()) {
|
||
|
data.options.bPaginate = true;
|
||
|
data.fillContainer = false;
|
||
|
}
|
||
|
|
||
|
// if we are in the viewer then we always want to fillContainer and
|
||
|
// and autoHideNavigation (unless the user has explicitly set these)
|
||
|
if (window.HTMLWidgets.viewerMode) {
|
||
|
if (!data.hasOwnProperty("fillContainer"))
|
||
|
data.fillContainer = true;
|
||
|
if (!data.hasOwnProperty("autoHideNavigation"))
|
||
|
data.autoHideNavigation = true;
|
||
|
}
|
||
|
|
||
|
// propagate fillContainer to instance (so we have it in resize)
|
||
|
instance.fillContainer = data.fillContainer;
|
||
|
|
||
|
var cells = data.data;
|
||
|
|
||
|
if (cells instanceof Array) cells = transposeArray2D(cells);
|
||
|
|
||
|
$el.append(data.container);
|
||
|
var $table = $el.find('table');
|
||
|
if (data.class) $table.addClass(data.class);
|
||
|
if (data.caption) $table.prepend(data.caption);
|
||
|
|
||
|
if (!data.selection) data.selection = {
|
||
|
mode: 'none', selected: null, target: 'row'
|
||
|
};
|
||
|
if (HTMLWidgets.shinyMode && data.selection.mode !== 'none' &&
|
||
|
data.selection.target === 'row+column') {
|
||
|
if ($table.children('tfoot').length === 0) {
|
||
|
$table.append($('<tfoot>'));
|
||
|
$table.find('thead tr').clone().appendTo($table.find('tfoot'));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// column filters
|
||
|
var filterRow;
|
||
|
switch (data.filter) {
|
||
|
case 'top':
|
||
|
$table.children('thead').append(data.filterHTML);
|
||
|
filterRow = $table.find('thead tr:last td');
|
||
|
break;
|
||
|
case 'bottom':
|
||
|
if ($table.children('tfoot').length === 0) {
|
||
|
$table.append($('<tfoot>'));
|
||
|
}
|
||
|
$table.children('tfoot').prepend(data.filterHTML);
|
||
|
filterRow = $table.find('tfoot tr:first td');
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
var options = { searchDelay: 1000 };
|
||
|
if (cells !== null) $.extend(options, {
|
||
|
data: cells
|
||
|
});
|
||
|
|
||
|
// options for fillContainer
|
||
|
var bootstrapActive = typeof($.fn.popover) != 'undefined';
|
||
|
if (instance.fillContainer) {
|
||
|
|
||
|
// force scrollX/scrollY and turn off autoWidth
|
||
|
options.scrollX = true;
|
||
|
options.scrollY = "100px"; // can be any value, we'll adjust below
|
||
|
|
||
|
// if we aren't paginating then move around the info/filter controls
|
||
|
// to save space at the bottom and rephrase the info callback
|
||
|
if (data.options.bPaginate === false) {
|
||
|
|
||
|
// we know how to do this cleanly for bootstrap, not so much
|
||
|
// for other themes/layouts
|
||
|
if (bootstrapActive) {
|
||
|
options.dom = "<'row'<'col-sm-4'i><'col-sm-8'f>>" +
|
||
|
"<'row'<'col-sm-12'tr>>";
|
||
|
}
|
||
|
|
||
|
options.fnInfoCallback = function(oSettings, iStart, iEnd,
|
||
|
iMax, iTotal, sPre) {
|
||
|
return Number(iTotal).toLocaleString() + " records";
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// auto hide navigation if requested
|
||
|
if (data.autoHideNavigation === true) {
|
||
|
if (bootstrapActive && data.options.bPaginate !== false) {
|
||
|
// strip all nav if length >= cells
|
||
|
if ((cells instanceof Array) && data.options.iDisplayLength >= cells.length)
|
||
|
options.dom = "<'row'<'col-sm-12'tr>>";
|
||
|
// alternatively lean things out for flexdashboard mobile portrait
|
||
|
else if (window.FlexDashboard && window.FlexDashboard.isMobilePhone())
|
||
|
options.dom = "<'row'<'col-sm-12'f>>" +
|
||
|
"<'row'<'col-sm-12'tr>>" +
|
||
|
"<'row'<'col-sm-12'p>>";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$.extend(true, options, data.options || {});
|
||
|
|
||
|
var searchCols = options.searchCols;
|
||
|
if (searchCols) {
|
||
|
searchCols = searchCols.map(function(x) {
|
||
|
return x === null ? '' : x.search;
|
||
|
});
|
||
|
// FIXME: this means I don't respect the escapeRegex setting
|
||
|
delete options.searchCols;
|
||
|
}
|
||
|
|
||
|
// server-side processing?
|
||
|
var server = options.serverSide === true;
|
||
|
|
||
|
// use the dataSrc function to pre-process JSON data returned from R
|
||
|
var DT_rows_all = [], DT_rows_current = [];
|
||
|
if (server && HTMLWidgets.shinyMode && typeof options.ajax === 'object' &&
|
||
|
/^session\/[\da-z]+\/dataobj/.test(options.ajax.url) && !options.ajax.dataSrc) {
|
||
|
options.ajax.dataSrc = function(json) {
|
||
|
DT_rows_all = $.makeArray(json.DT_rows_all);
|
||
|
DT_rows_current = $.makeArray(json.DT_rows_current);
|
||
|
var data = json.data;
|
||
|
if (!colReorderEnabled()) return data;
|
||
|
var table = $table.DataTable(), order = table.colReorder.order(), flag = true, i, j, row;
|
||
|
for (i = 0; i < order.length; ++i) if (order[i] !== i) flag = false;
|
||
|
if (flag) return data;
|
||
|
for (i = 0; i < data.length; ++i) {
|
||
|
row = data[i].slice();
|
||
|
for (j = 0; j < order.length; ++j) data[i][j] = row[order[j]];
|
||
|
}
|
||
|
return data;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
var thiz = this;
|
||
|
if (instance.fillContainer) $table.on('init.dt', function(e) {
|
||
|
thiz.fillAvailableHeight(el, $(el).innerHeight());
|
||
|
});
|
||
|
// If the page contains serveral datatables and one of which enables colReorder,
|
||
|
// the table.colReorder.order() function will exist but throws error when called.
|
||
|
// So it seems like the only way to know if colReorder is enabled or not is to
|
||
|
// check the options.
|
||
|
var colReorderEnabled = function() { return "colReorder" in options; };
|
||
|
var table = $table.DataTable(options);
|
||
|
$el.data('datatable', table);
|
||
|
|
||
|
// Unregister previous Crosstalk event subscriptions, if they exist
|
||
|
if (instance.ctfilterSubscription) {
|
||
|
instance.ctfilterHandle.off("change", instance.ctfilterSubscription);
|
||
|
instance.ctfilterSubscription = null;
|
||
|
}
|
||
|
if (instance.ctselectSubscription) {
|
||
|
instance.ctselectHandle.off("change", instance.ctselectSubscription);
|
||
|
instance.ctselectSubscription = null;
|
||
|
}
|
||
|
|
||
|
if (!crosstalkOptions.group) {
|
||
|
$table[0].ctfilter = null;
|
||
|
$table[0].ctselect = null;
|
||
|
} else {
|
||
|
var key = crosstalkOptions.key;
|
||
|
function keysToMatches(keys) {
|
||
|
if (!keys) {
|
||
|
return null;
|
||
|
} else {
|
||
|
var selectedKeys = {};
|
||
|
for (var i = 0; i < keys.length; i++) {
|
||
|
selectedKeys[keys[i]] = true;
|
||
|
}
|
||
|
var matches = {};
|
||
|
for (var j = 0; j < key.length; j++) {
|
||
|
if (selectedKeys[key[j]])
|
||
|
matches[j] = true;
|
||
|
}
|
||
|
return matches;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function applyCrosstalkFilter(e) {
|
||
|
$table[0].ctfilter = keysToMatches(e.value);
|
||
|
table.draw();
|
||
|
}
|
||
|
instance.ctfilterSubscription = instance.ctfilterHandle.on("change", applyCrosstalkFilter);
|
||
|
applyCrosstalkFilter({value: instance.ctfilterHandle.filteredKeys});
|
||
|
|
||
|
function applyCrosstalkSelection(e) {
|
||
|
if (e.sender !== instance.ctselectHandle) {
|
||
|
table
|
||
|
.rows('.' + selClass, {search: 'applied'})
|
||
|
.nodes()
|
||
|
.to$()
|
||
|
.removeClass(selClass);
|
||
|
if (selectedRows)
|
||
|
changeInput('rows_selected', selectedRows(), void 0, true);
|
||
|
}
|
||
|
|
||
|
if (e.sender !== instance.ctselectHandle && e.value && e.value.length) {
|
||
|
var matches = keysToMatches(e.value);
|
||
|
|
||
|
// persistent selection with plotly (& leaflet)
|
||
|
var ctOpts = crosstalk.var("plotlyCrosstalkOpts").get() || {};
|
||
|
if (ctOpts.persistent === true) {
|
||
|
var matches = $.extend(matches, $table[0].ctselect);
|
||
|
}
|
||
|
|
||
|
$table[0].ctselect = matches;
|
||
|
table.draw();
|
||
|
} else {
|
||
|
if ($table[0].ctselect) {
|
||
|
$table[0].ctselect = null;
|
||
|
table.draw();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
instance.ctselectSubscription = instance.ctselectHandle.on("change", applyCrosstalkSelection);
|
||
|
// TODO: This next line doesn't seem to work when renderDataTable is used
|
||
|
applyCrosstalkSelection({value: instance.ctselectHandle.value});
|
||
|
}
|
||
|
|
||
|
var inArray = function(val, array) {
|
||
|
return $.inArray(val, $.makeArray(array)) > -1;
|
||
|
};
|
||
|
|
||
|
// encode + to %2B when searching in the table on server side, because
|
||
|
// shiny::parseQueryString() treats + as spaces, and DataTables does not
|
||
|
// encode + to %2B (or % to %25) when sending the request
|
||
|
var encode_plus = function(x) {
|
||
|
return server ? x.replace(/%/g, '%25').replace(/\+/g, '%2B') : x;
|
||
|
};
|
||
|
|
||
|
// search the i-th column
|
||
|
var searchColumn = function(i, value) {
|
||
|
var regex = false, ci = true;
|
||
|
if (options.search) {
|
||
|
regex = options.search.regex,
|
||
|
ci = options.search.caseInsensitive !== false;
|
||
|
}
|
||
|
return table.column(i).search(encode_plus(value), regex, !regex, ci);
|
||
|
};
|
||
|
|
||
|
if (data.filter !== 'none') {
|
||
|
|
||
|
filterRow.each(function(i, td) {
|
||
|
|
||
|
var $td = $(td), type = $td.data('type'), filter;
|
||
|
var $input = $td.children('div').first().children('input');
|
||
|
$input.prop('disabled', !table.settings()[0].aoColumns[i].bSearchable || type === 'disabled');
|
||
|
$input.on('input blur', function() {
|
||
|
$input.next('span').toggle(Boolean($input.val()));
|
||
|
});
|
||
|
// Bootstrap sets pointer-events to none and we won't be able to click
|
||
|
// the clear button
|
||
|
$input.next('span').css('pointer-events', 'auto').hide().click(function() {
|
||
|
$(this).hide().prev('input').val('').trigger('input').focus();
|
||
|
});
|
||
|
var searchCol; // search string for this column
|
||
|
if (searchCols && searchCols[i]) {
|
||
|
searchCol = searchCols[i];
|
||
|
$input.val(searchCol).trigger('input');
|
||
|
}
|
||
|
var $x = $td.children('div').last();
|
||
|
|
||
|
// remove the overflow: hidden attribute of the scrollHead
|
||
|
// (otherwise the scrolling table body obscures the filters)
|
||
|
// The workaround and the discussion from
|
||
|
// https://github.com/rstudio/DT/issues/554#issuecomment-518007347
|
||
|
// Otherwise the filter selection will not be anchored to the values
|
||
|
// when the columns number is many and scrollX is enabled.
|
||
|
var scrollHead = $(el).find('.dataTables_scrollHead,.dataTables_scrollFoot');
|
||
|
var cssOverflowHead = scrollHead.css('overflow');
|
||
|
var scrollBody = $(el).find('.dataTables_scrollBody');
|
||
|
var cssOverflowBody = scrollBody.css('overflow');
|
||
|
var scrollTable = $(el).find('.dataTables_scroll');
|
||
|
var cssOverflowTable = scrollTable.css('overflow');
|
||
|
if (cssOverflowHead === 'hidden') {
|
||
|
$x.on('show hide', function(e) {
|
||
|
if (e.type === 'show') {
|
||
|
scrollHead.css('overflow', 'visible');
|
||
|
scrollBody.css('overflow', 'visible');
|
||
|
scrollTable.css('overflow-x', 'scroll');
|
||
|
} else {
|
||
|
scrollHead.css('overflow', cssOverflowHead);
|
||
|
scrollBody.css('overflow', cssOverflowBody);
|
||
|
scrollTable.css('overflow-x', cssOverflowTable);
|
||
|
}
|
||
|
});
|
||
|
$x.css('z-index', 25);
|
||
|
}
|
||
|
|
||
|
if (inArray(type, ['factor', 'logical'])) {
|
||
|
$input.on({
|
||
|
click: function() {
|
||
|
$input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus();
|
||
|
},
|
||
|
input: function() {
|
||
|
if ($input.val() === '') filter[0].selectize.setValue([]);
|
||
|
}
|
||
|
});
|
||
|
var $input2 = $x.children('select');
|
||
|
filter = $input2.selectize({
|
||
|
options: $input2.data('options').map(function(v, i) {
|
||
|
return ({text: v, value: v});
|
||
|
}),
|
||
|
plugins: ['remove_button'],
|
||
|
hideSelected: true,
|
||
|
onChange: function(value) {
|
||
|
if (value === null) value = []; // compatibility with jQuery 3.0
|
||
|
$input.val(value.length ? JSON.stringify(value) : '');
|
||
|
if (value.length) $input.trigger('input');
|
||
|
$input.attr('title', $input.val());
|
||
|
if (server) {
|
||
|
table.column(i).search(value.length ? encode_plus(JSON.stringify(value)) : '').draw();
|
||
|
return;
|
||
|
}
|
||
|
// turn off filter if nothing selected
|
||
|
$td.data('filter', value.length > 0);
|
||
|
table.draw(); // redraw table, and filters will be applied
|
||
|
}
|
||
|
});
|
||
|
if (searchCol) filter[0].selectize.setValue(JSON.parse(searchCol));
|
||
|
filter[0].selectize.on('blur', function() {
|
||
|
$x.hide().trigger('hide'); $input.parent().show(); $input.trigger('blur');
|
||
|
});
|
||
|
filter.next('div').css('margin-bottom', 'auto');
|
||
|
} else if (type === 'character') {
|
||
|
var fun = function() {
|
||
|
searchColumn(i, $input.val()).draw();
|
||
|
};
|
||
|
if (server) {
|
||
|
fun = $.fn.dataTable.util.throttle(fun, options.searchDelay);
|
||
|
}
|
||
|
$input.on('input', fun);
|
||
|
} else if (inArray(type, ['number', 'integer', 'date', 'time'])) {
|
||
|
var $x0 = $x;
|
||
|
$x = $x0.children('div').first();
|
||
|
$x0.css({
|
||
|
'background-color': '#fff',
|
||
|
'border': '1px #ddd solid',
|
||
|
'border-radius': '4px',
|
||
|
'padding': '20px 20px 10px 20px'
|
||
|
});
|
||
|
var $spans = $x0.children('span').css({
|
||
|
'margin-top': '10px',
|
||
|
'white-space': 'nowrap'
|
||
|
});
|
||
|
var $span1 = $spans.first(), $span2 = $spans.last();
|
||
|
var r1 = +$x.data('min'), r2 = +$x.data('max');
|
||
|
// when the numbers are too small or have many decimal places, the
|
||
|
// slider may have numeric precision problems (#150)
|
||
|
var scale = Math.pow(10, Math.max(0, +$x.data('scale') || 0));
|
||
|
r1 = Math.round(r1 * scale); r2 = Math.round(r2 * scale);
|
||
|
var scaleBack = function(x, scale) {
|
||
|
if (scale === 1) return x;
|
||
|
var d = Math.round(Math.log(scale) / Math.log(10));
|
||
|
// to avoid problems like 3.423/100 -> 0.034230000000000003
|
||
|
return (x / scale).toFixed(d);
|
||
|
};
|
||
|
$input.on({
|
||
|
focus: function() {
|
||
|
$x0.show().trigger('show');
|
||
|
// first, make sure the slider div leaves at least 20px between
|
||
|
// the two (slider value) span's
|
||
|
$x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20));
|
||
|
// then, if the input is really wide, make the slider the same
|
||
|
// width as the input
|
||
|
if ($x0.outerWidth() < $input.outerWidth()) {
|
||
|
$x0.outerWidth($input.outerWidth());
|
||
|
}
|
||
|
// make sure the slider div does not reach beyond the right margin
|
||
|
if ($(window).width() < $x0.offset().left + $x0.width()) {
|
||
|
$x0.offset({
|
||
|
'left': $input.offset().left + $input.outerWidth() - $x0.outerWidth()
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
blur: function() {
|
||
|
$x0.hide().trigger('hide');
|
||
|
},
|
||
|
input: function() {
|
||
|
if ($input.val() === '') filter.val([r1, r2]);
|
||
|
},
|
||
|
change: function() {
|
||
|
var v = $input.val().replace(/\s/g, '');
|
||
|
if (v === '') return;
|
||
|
v = v.split('...');
|
||
|
if (v.length !== 2) {
|
||
|
$input.parent().addClass('has-error');
|
||
|
return;
|
||
|
}
|
||
|
if (v[0] === '') v[0] = r1;
|
||
|
if (v[1] === '') v[1] = r2;
|
||
|
$input.parent().removeClass('has-error');
|
||
|
// treat date as UTC time at midnight
|
||
|
var strTime = function(x) {
|
||
|
var s = type === 'date' ? 'T00:00:00Z' : '';
|
||
|
var t = new Date(x + s).getTime();
|
||
|
// add 10 minutes to date since it does not hurt the date, and
|
||
|
// it helps avoid the tricky floating point arithmetic problems,
|
||
|
// e.g. sometimes the date may be a few milliseconds earlier
|
||
|
// than the midnight due to precision problems in noUiSlider
|
||
|
return type === 'date' ? t + 3600000 : t;
|
||
|
};
|
||
|
if (inArray(type, ['date', 'time'])) {
|
||
|
v[0] = strTime(v[0]);
|
||
|
v[1] = strTime(v[1]);
|
||
|
}
|
||
|
if (v[0] != r1) v[0] *= scale;
|
||
|
if (v[1] != r2) v[1] *= scale;
|
||
|
filter.val(v);
|
||
|
}
|
||
|
});
|
||
|
var formatDate = function(d, isoFmt) {
|
||
|
d = scaleBack(d, scale);
|
||
|
if (type === 'number') return d;
|
||
|
if (type === 'integer') return parseInt(d);
|
||
|
var x = new Date(+d);
|
||
|
var fmt = ('filterDateFmt' in data) ? data.filterDateFmt[i] : undefined;
|
||
|
if (fmt !== undefined && isoFmt === false) return x[fmt.method].apply(x, fmt.params);
|
||
|
if (type === 'date') {
|
||
|
var pad0 = function(x) {
|
||
|
return ('0' + x).substr(-2, 2);
|
||
|
};
|
||
|
return x.getUTCFullYear() + '-' + pad0(1 + x.getUTCMonth())
|
||
|
+ '-' + pad0(x.getUTCDate());
|
||
|
} else {
|
||
|
return x.toISOString();
|
||
|
}
|
||
|
};
|
||
|
var opts = type === 'date' ? { step: 60 * 60 * 1000 } :
|
||
|
type === 'integer' ? { step: 1 } : {};
|
||
|
filter = $x.noUiSlider($.extend({
|
||
|
start: [r1, r2],
|
||
|
range: {min: r1, max: r2},
|
||
|
connect: true
|
||
|
}, opts));
|
||
|
if (scale > 1) (function() {
|
||
|
var t1 = r1, t2 = r2;
|
||
|
var val = filter.val();
|
||
|
while (val[0] > r1 || val[1] < r2) {
|
||
|
if (val[0] > r1) {
|
||
|
t1 -= val[0] - r1;
|
||
|
}
|
||
|
if (val[1] < r2) {
|
||
|
t2 += r2 - val[1];
|
||
|
}
|
||
|
filter = $x.noUiSlider($.extend({
|
||
|
start: [t1, t2],
|
||
|
range: {min: t1, max: t2},
|
||
|
connect: true
|
||
|
}, opts), true);
|
||
|
val = filter.val();
|
||
|
}
|
||
|
r1 = t1; r2 = t2;
|
||
|
})();
|
||
|
var updateSliderText = function(v1, v2) {
|
||
|
$span1.text(formatDate(v1, false)); $span2.text(formatDate(v2, false));
|
||
|
};
|
||
|
updateSliderText(r1, r2);
|
||
|
var updateSlider = function(e) {
|
||
|
var val = filter.val();
|
||
|
// turn off filter if in full range
|
||
|
$td.data('filter', val[0] > r1 || val[1] < r2);
|
||
|
var v1 = formatDate(val[0]), v2 = formatDate(val[1]), ival;
|
||
|
if ($td.data('filter')) {
|
||
|
ival = v1 + ' ... ' + v2;
|
||
|
$input.attr('title', ival).val(ival).trigger('input');
|
||
|
} else {
|
||
|
$input.attr('title', '').val('');
|
||
|
}
|
||
|
updateSliderText(val[0], val[1]);
|
||
|
if (e.type === 'slide') return; // no searching when sliding only
|
||
|
if (server) {
|
||
|
table.column(i).search($td.data('filter') ? ival : '').draw();
|
||
|
return;
|
||
|
}
|
||
|
table.draw();
|
||
|
};
|
||
|
filter.on({
|
||
|
set: updateSlider,
|
||
|
slide: updateSlider
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// server-side processing will be handled by R (or whatever server
|
||
|
// language you use); the following code is only needed for client-side
|
||
|
// processing
|
||
|
if (server) {
|
||
|
// if a search string has been pre-set, search now
|
||
|
if (searchCol) searchColumn(i, searchCol).draw();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var customFilter = function(settings, data, dataIndex) {
|
||
|
// there is no way to attach a search function to a specific table,
|
||
|
// and we need to make sure a global search function is not applied to
|
||
|
// all tables (i.e. a range filter in a previous table should not be
|
||
|
// applied to the current table); we use the settings object to
|
||
|
// determine if we want to perform searching on the current table,
|
||
|
// since settings.sTableId will be different to different tables
|
||
|
if (table.settings()[0] !== settings) return true;
|
||
|
// no filter on this column or no need to filter this column
|
||
|
if (typeof filter === 'undefined' || !$td.data('filter')) return true;
|
||
|
|
||
|
var r = filter.val(), v, r0, r1;
|
||
|
var i_data = function(i) {
|
||
|
if (!colReorderEnabled()) return i;
|
||
|
var order = table.colReorder.order(), k;
|
||
|
for (k = 0; k < order.length; ++k) if (order[k] === i) return k;
|
||
|
return i; // in theory it will never be here...
|
||
|
}
|
||
|
v = data[i_data(i)];
|
||
|
if (type === 'number' || type === 'integer') {
|
||
|
v = parseFloat(v);
|
||
|
// how to handle NaN? currently exclude these rows
|
||
|
if (isNaN(v)) return(false);
|
||
|
r0 = parseFloat(scaleBack(r[0], scale))
|
||
|
r1 = parseFloat(scaleBack(r[1], scale));
|
||
|
if (v >= r0 && v <= r1) return true;
|
||
|
} else if (type === 'date' || type === 'time') {
|
||
|
v = new Date(v);
|
||
|
r0 = new Date(r[0] / scale); r1 = new Date(r[1] / scale);
|
||
|
if (v >= r0 && v <= r1) return true;
|
||
|
} else if (type === 'factor') {
|
||
|
if (r.length === 0 || inArray(v, r)) return true;
|
||
|
} else if (type === 'logical') {
|
||
|
if (r.length === 0) return true;
|
||
|
if (inArray(v === '' ? 'na' : v, r)) return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
$.fn.dataTable.ext.search.push(customFilter);
|
||
|
|
||
|
// search for the preset search strings if it is non-empty
|
||
|
if (searchCol) {
|
||
|
if (inArray(type, ['factor', 'logical'])) {
|
||
|
filter[0].selectize.setValue(JSON.parse(searchCol));
|
||
|
} else if (type === 'character') {
|
||
|
$input.trigger('input');
|
||
|
} else if (inArray(type, ['number', 'integer', 'date', 'time'])) {
|
||
|
$input.trigger('change');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
}
|
||
|
|
||
|
// highlight search keywords
|
||
|
var highlight = function() {
|
||
|
var body = $(table.table().body());
|
||
|
// removing the old highlighting first
|
||
|
body.unhighlight();
|
||
|
|
||
|
// don't highlight the "not found" row, so we get the rows using the api
|
||
|
if (table.rows({ filter: 'applied' }).data().length === 0) return;
|
||
|
// highlight global search keywords
|
||
|
body.highlight($.trim(table.search()).split(/\s+/));
|
||
|
// then highlight keywords from individual column filters
|
||
|
if (filterRow) filterRow.each(function(i, td) {
|
||
|
var $td = $(td), type = $td.data('type');
|
||
|
if (type !== 'character') return;
|
||
|
var $input = $td.children('div').first().children('input');
|
||
|
var column = table.column(i).nodes().to$(),
|
||
|
val = $.trim($input.val());
|
||
|
if (type !== 'character' || val === '') return;
|
||
|
column.highlight(val.split(/\s+/));
|
||
|
});
|
||
|
};
|
||
|
|
||
|
if (options.searchHighlight) {
|
||
|
table
|
||
|
.on('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth', highlight)
|
||
|
.on('destroy', function() {
|
||
|
// remove event handler
|
||
|
table.off('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth');
|
||
|
});
|
||
|
|
||
|
// Set the option for escaping regex characters in our search string. This will be used
|
||
|
// for all future matching.
|
||
|
jQuery.fn.highlight.options.escapeRegex = (!options.search || !options.search.regex);
|
||
|
|
||
|
// initial highlight for state saved conditions and initial states
|
||
|
highlight();
|
||
|
}
|
||
|
|
||
|
// run the callback function on the table instance
|
||
|
if (typeof data.callback === 'function') data.callback(table);
|
||
|
|
||
|
// double click to edit the cell, row, column, or all cells
|
||
|
if (data.editable) table.on('dblclick.dt', 'tbody td', function(e) {
|
||
|
// only bring up the editor when the cell itself is dbclicked, and ignore
|
||
|
// other dbclick events bubbled up (e.g. from the <input>)
|
||
|
if (e.target !== this) return;
|
||
|
var target = [], immediate = false;
|
||
|
switch (data.editable.target) {
|
||
|
case 'cell':
|
||
|
target = [this];
|
||
|
immediate = true; // edit will take effect immediately
|
||
|
break;
|
||
|
case 'row':
|
||
|
target = table.cells(table.cell(this).index().row, '*').nodes();
|
||
|
break;
|
||
|
case 'column':
|
||
|
target = table.cells('*', table.cell(this).index().column).nodes();
|
||
|
break;
|
||
|
case 'all':
|
||
|
target = table.cells().nodes();
|
||
|
break;
|
||
|
default:
|
||
|
throw 'The editable parameter must be "cell", "row", "column", or "all"';
|
||
|
}
|
||
|
var disableCols = data.editable.disable ? data.editable.disable.columns : null;
|
||
|
for (var i = 0; i < target.length; i++) {
|
||
|
(function(cell, current) {
|
||
|
var $cell = $(cell), html = $cell.html();
|
||
|
var _cell = table.cell(cell), value = _cell.data();
|
||
|
var $input = $('<input type="text">'), changed = false;
|
||
|
if (!immediate) {
|
||
|
$cell.data('input', $input).data('html', html);
|
||
|
$input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel');
|
||
|
}
|
||
|
$input.val(value);
|
||
|
if (inArray(_cell.index().column, disableCols)) {
|
||
|
$input.attr('readonly', '').css('filter', 'invert(25%)');
|
||
|
}
|
||
|
$cell.empty().append($input);
|
||
|
if (cell === current) $input.focus();
|
||
|
$input.css('width', '100%');
|
||
|
|
||
|
if (immediate) $input.on('change', function() {
|
||
|
changed = true;
|
||
|
var valueNew = $input.val();
|
||
|
if (valueNew != value) {
|
||
|
_cell.data(valueNew);
|
||
|
if (HTMLWidgets.shinyMode) {
|
||
|
changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: "event"});
|
||
|
}
|
||
|
// for server-side processing, users have to call replaceData() to update the table
|
||
|
if (!server) table.draw(false);
|
||
|
} else {
|
||
|
$cell.html(html);
|
||
|
}
|
||
|
$input.remove();
|
||
|
}).on('blur', function() {
|
||
|
if (!changed) $input.trigger('change');
|
||
|
}).on('keyup', function(e) {
|
||
|
// hit Escape to cancel editing
|
||
|
if (e.keyCode === 27) $input.trigger('blur');
|
||
|
});
|
||
|
|
||
|
// bulk edit (row, column, or all)
|
||
|
if (!immediate) $input.on('keyup', function(e) {
|
||
|
var removeInput = function($cell, restore) {
|
||
|
$cell.data('input').remove();
|
||
|
if (restore) $cell.html($cell.data('html'));
|
||
|
}
|
||
|
if (e.keyCode === 27) {
|
||
|
for (var i = 0; i < target.length; i++) {
|
||
|
removeInput($(target[i]), true);
|
||
|
}
|
||
|
} else if (e.keyCode === 13 && e.ctrlKey) {
|
||
|
// Ctrl + Enter
|
||
|
var cell, $cell, _cell, cellData = [];
|
||
|
for (var i = 0; i < target.length; i++) {
|
||
|
cell = target[i]; $cell = $(cell); _cell = table.cell(cell);
|
||
|
_cell.data($cell.data('input').val());
|
||
|
HTMLWidgets.shinyMode && cellData.push(cellInfo(cell));
|
||
|
removeInput($cell, false);
|
||
|
}
|
||
|
if (HTMLWidgets.shinyMode) {
|
||
|
changeInput('cell_edit', cellData, 'DT.cellInfo', null, {priority: "event"});
|
||
|
}
|
||
|
if (!server) table.draw(false);
|
||
|
}
|
||
|
});
|
||
|
})(target[i], this);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// interaction with shiny
|
||
|
if (!HTMLWidgets.shinyMode && !crosstalkOptions.group) return;
|
||
|
|
||
|
var methods = {};
|
||
|
var shinyData = {};
|
||
|
|
||
|
methods.updateCaption = function(caption) {
|
||
|
if (!caption) return;
|
||
|
$table.children('caption').replaceWith(caption);
|
||
|
}
|
||
|
|
||
|
// register clear functions to remove input values when the table is removed
|
||
|
instance.clearInputs = {};
|
||
|
|
||
|
var changeInput = function(id, value, type, noCrosstalk, opts) {
|
||
|
var event = id;
|
||
|
id = el.id + '_' + id;
|
||
|
if (type) id = id + ':' + type;
|
||
|
// do not update if the new value is the same as old value
|
||
|
if (event !== 'cell_edit' && shinyData.hasOwnProperty(id) && shinyData[id] === JSON.stringify(value))
|
||
|
return;
|
||
|
shinyData[id] = JSON.stringify(value);
|
||
|
if (HTMLWidgets.shinyMode && Shiny.setInputValue) {
|
||
|
Shiny.setInputValue(id, value, opts);
|
||
|
if (!instance.clearInputs[id]) instance.clearInputs[id] = function() {
|
||
|
Shiny.setInputValue(id, null);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// HACK
|
||
|
if (event === "rows_selected" && !noCrosstalk) {
|
||
|
if (crosstalkOptions.group) {
|
||
|
var keys = crosstalkOptions.key;
|
||
|
var selectedKeys = null;
|
||
|
if (value) {
|
||
|
selectedKeys = [];
|
||
|
for (var i = 0; i < value.length; i++) {
|
||
|
// The value array's contents use 1-based row numbers, so we must
|
||
|
// convert to 0-based before indexing into the keys array.
|
||
|
selectedKeys.push(keys[value[i] - 1]);
|
||
|
}
|
||
|
}
|
||
|
instance.ctselectHandle.set(selectedKeys);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var addOne = function(x) {
|
||
|
return x.map(function(i) { return 1 + i; });
|
||
|
};
|
||
|
|
||
|
var unique = function(x) {
|
||
|
var ux = [];
|
||
|
$.each(x, function(i, el){
|
||
|
if ($.inArray(el, ux) === -1) ux.push(el);
|
||
|
});
|
||
|
return ux;
|
||
|
}
|
||
|
|
||
|
// change the row index of a cell
|
||
|
var tweakCellIndex = function(cell) {
|
||
|
var info = cell.index();
|
||
|
// some cell may not be valid. e.g, #759
|
||
|
// when using the RowGroup extension, datatables will
|
||
|
// generate the row label and the cells are not part of
|
||
|
// the data thus contain no row/col info
|
||
|
if (info === undefined)
|
||
|
return {row: null, col: null};
|
||
|
if (server) {
|
||
|
info.row = DT_rows_current[info.row];
|
||
|
} else {
|
||
|
info.row += 1;
|
||
|
}
|
||
|
return {row: info.row, col: info.column};
|
||
|
}
|
||
|
|
||
|
// a flag to indicates if select extension is initialized or not
|
||
|
var flagSelectExt = table.settings()[0]._select !== undefined;
|
||
|
// the Select extension should only be used in the client mode and
|
||
|
// when the selection.mode is set to none
|
||
|
if (data.selection.mode === 'none' && !server && flagSelectExt) {
|
||
|
var updateRowsSelected = function() {
|
||
|
var rows = table.rows({selected: true});
|
||
|
var selected = [];
|
||
|
$.each(rows.indexes().toArray(), function(i, v) {
|
||
|
selected.push(v + 1);
|
||
|
});
|
||
|
changeInput('rows_selected', selected);
|
||
|
}
|
||
|
var updateColsSelected = function() {
|
||
|
var columns = table.columns({selected: true});
|
||
|
changeInput('columns_selected', columns.indexes().toArray());
|
||
|
}
|
||
|
var updateCellsSelected = function() {
|
||
|
var cells = table.cells({selected: true});
|
||
|
var selected = [];
|
||
|
cells.every(function() {
|
||
|
var row = this.index().row;
|
||
|
var col = this.index().column;
|
||
|
selected = selected.concat([[row + 1, col]]);
|
||
|
});
|
||
|
changeInput('cells_selected', transposeArray2D(selected), 'shiny.matrix');
|
||
|
}
|
||
|
table.on('select deselect', function(e, dt, type, indexes) {
|
||
|
updateRowsSelected();
|
||
|
updateColsSelected();
|
||
|
updateCellsSelected();
|
||
|
})
|
||
|
}
|
||
|
|
||
|
var selMode = data.selection.mode, selTarget = data.selection.target;
|
||
|
if (inArray(selMode, ['single', 'multiple'])) {
|
||
|
var selClass = inArray(data.style, ['bootstrap', 'bootstrap4']) ? 'active' : 'selected';
|
||
|
var selected = data.selection.selected, selected1, selected2;
|
||
|
// selected1: row indices; selected2: column indices
|
||
|
if (selected === null) {
|
||
|
selected1 = selected2 = [];
|
||
|
} else if (selTarget === 'row') {
|
||
|
selected1 = $.makeArray(selected);
|
||
|
} else if (selTarget === 'column') {
|
||
|
selected2 = $.makeArray(selected);
|
||
|
} else if (selTarget === 'row+column') {
|
||
|
selected1 = $.makeArray(selected.rows);
|
||
|
selected2 = $.makeArray(selected.cols);
|
||
|
}
|
||
|
|
||
|
// After users reorder the rows or filter the table, we cannot use the table index
|
||
|
// directly. Instead, we need this function to find out the rows between the two clicks.
|
||
|
// If user filter the table again between the start click and the end click, the behavior
|
||
|
// would be undefined, but it should not be a problem.
|
||
|
var shiftSelRowsIndex = function(start, end) {
|
||
|
var indexes = server ? DT_rows_all : table.rows({ search: 'applied' }).indexes().toArray();
|
||
|
start = indexes.indexOf(start); end = indexes.indexOf(end);
|
||
|
// if start is larger than end, we need to swap
|
||
|
if (start > end) {
|
||
|
var tmp = end; end = start; start = tmp;
|
||
|
}
|
||
|
return indexes.slice(start, end + 1);
|
||
|
}
|
||
|
|
||
|
var serverRowIndex = function(clientRowIndex) {
|
||
|
return server ? DT_rows_current[clientRowIndex] : clientRowIndex + 1;
|
||
|
}
|
||
|
|
||
|
// row, column, or cell selection
|
||
|
var lastClickedRow;
|
||
|
if (inArray(selTarget, ['row', 'row+column'])) {
|
||
|
var selectedRows = function() {
|
||
|
var rows = table.rows('.' + selClass);
|
||
|
var idx = rows.indexes().toArray();
|
||
|
if (!server) return addOne(idx);
|
||
|
idx = idx.map(function(i) {
|
||
|
return DT_rows_current[i];
|
||
|
});
|
||
|
selected1 = selMode === 'multiple' ? unique(selected1.concat(idx)) : idx;
|
||
|
return selected1;
|
||
|
}
|
||
|
table.on('mousedown.dt', 'tbody tr', function(e) {
|
||
|
var $this = $(this), thisRow = table.row(this);
|
||
|
if (selMode === 'multiple') {
|
||
|
if (e.shiftKey && lastClickedRow !== undefined) {
|
||
|
// select or de-select depends on the last clicked row's status
|
||
|
var flagSel = !$this.hasClass(selClass);
|
||
|
var crtClickedRow = serverRowIndex(thisRow.index());
|
||
|
if (server) {
|
||
|
var rowsIndex = shiftSelRowsIndex(lastClickedRow, crtClickedRow);
|
||
|
// update current page's selClass
|
||
|
rowsIndex.map(function(i) {
|
||
|
var rowIndex = DT_rows_current.indexOf(i);
|
||
|
if (rowIndex >= 0) {
|
||
|
var row = table.row(rowIndex).nodes().to$();
|
||
|
var flagRowSel = !row.hasClass(selClass);
|
||
|
if (flagSel === flagRowSel) row.toggleClass(selClass);
|
||
|
}
|
||
|
});
|
||
|
// update selected1
|
||
|
if (flagSel) {
|
||
|
selected1 = unique(selected1.concat(rowsIndex));
|
||
|
} else {
|
||
|
selected1 = selected1.filter(function(index) {
|
||
|
return !inArray(index, rowsIndex);
|
||
|
});
|
||
|
}
|
||
|
} else {
|
||
|
// js starts from 0
|
||
|
shiftSelRowsIndex(lastClickedRow - 1, crtClickedRow - 1).map(function(value) {
|
||
|
var row = table.row(value).nodes().to$();
|
||
|
var flagRowSel = !row.hasClass(selClass);
|
||
|
if (flagSel === flagRowSel) row.toggleClass(selClass);
|
||
|
});
|
||
|
}
|
||
|
e.preventDefault();
|
||
|
} else {
|
||
|
$this.toggleClass(selClass);
|
||
|
}
|
||
|
} else {
|
||
|
if ($this.hasClass(selClass)) {
|
||
|
$this.removeClass(selClass);
|
||
|
} else {
|
||
|
table.$('tr.' + selClass).removeClass(selClass);
|
||
|
$this.addClass(selClass);
|
||
|
}
|
||
|
}
|
||
|
if (server && !$this.hasClass(selClass)) {
|
||
|
var id = DT_rows_current[thisRow.index()];
|
||
|
// remove id from selected1 since its class .selected has been removed
|
||
|
if (inArray(id, selected1)) selected1.splice($.inArray(id, selected1), 1);
|
||
|
}
|
||
|
changeInput('rows_selected', selectedRows());
|
||
|
changeInput('row_last_clicked', serverRowIndex(thisRow.index()));
|
||
|
lastClickedRow = serverRowIndex(thisRow.index());
|
||
|
});
|
||
|
changeInput('rows_selected', selected1);
|
||
|
var selectRows = function() {
|
||
|
table.$('tr.' + selClass).removeClass(selClass);
|
||
|
if (selected1.length === 0) return;
|
||
|
if (server) {
|
||
|
table.rows({page: 'current'}).every(function() {
|
||
|
if (inArray(DT_rows_current[this.index()], selected1)) {
|
||
|
$(this.node()).addClass(selClass);
|
||
|
}
|
||
|
});
|
||
|
} else {
|
||
|
var selected0 = selected1.map(function(i) { return i - 1; });
|
||
|
$(table.rows(selected0).nodes()).addClass(selClass);
|
||
|
}
|
||
|
}
|
||
|
selectRows(); // in case users have specified pre-selected rows
|
||
|
// restore selected rows after the table is redrawn (e.g. sort/search/page);
|
||
|
// client-side tables will preserve the selections automatically; for
|
||
|
// server-side tables, we have to *real* row indices are in `selected1`
|
||
|
if (server) table.on('draw.dt', selectRows);
|
||
|
methods.selectRows = function(selected) {
|
||
|
selected1 = $.makeArray(selected);
|
||
|
selectRows();
|
||
|
changeInput('rows_selected', selected1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (inArray(selTarget, ['column', 'row+column'])) {
|
||
|
if (selTarget === 'row+column') {
|
||
|
$(table.columns().footer()).css('cursor', 'pointer');
|
||
|
}
|
||
|
var callback = function() {
|
||
|
var colIdx = selTarget === 'column' ? table.cell(this).index().column :
|
||
|
$.inArray(this, table.columns().footer()),
|
||
|
thisCol = $(table.column(colIdx).nodes());
|
||
|
if (colIdx === -1) return;
|
||
|
if (thisCol.hasClass(selClass)) {
|
||
|
thisCol.removeClass(selClass);
|
||
|
selected2.splice($.inArray(colIdx, selected2), 1);
|
||
|
} else {
|
||
|
if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass);
|
||
|
thisCol.addClass(selClass);
|
||
|
selected2 = selMode === 'single' ? [colIdx] : unique(selected2.concat([colIdx]));
|
||
|
}
|
||
|
changeInput('columns_selected', selected2);
|
||
|
}
|
||
|
if (selTarget === 'column') {
|
||
|
$(table.table().body()).on('click.dt', 'td', callback);
|
||
|
} else {
|
||
|
$(table.table().footer()).on('click.dt', 'tr th', callback);
|
||
|
}
|
||
|
changeInput('columns_selected', selected2);
|
||
|
var selectCols = function() {
|
||
|
table.columns().nodes().flatten().to$().removeClass(selClass);
|
||
|
if (selected2.length > 0)
|
||
|
table.columns(selected2).nodes().flatten().to$().addClass(selClass);
|
||
|
}
|
||
|
selectCols(); // in case users have specified pre-selected columns
|
||
|
if (server) table.on('draw.dt', selectCols);
|
||
|
methods.selectColumns = function(selected) {
|
||
|
selected2 = $.makeArray(selected);
|
||
|
selectCols();
|
||
|
changeInput('columns_selected', selected2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (selTarget === 'cell') {
|
||
|
var selected3;
|
||
|
if (selected === null) {
|
||
|
selected3 = [];
|
||
|
} else {
|
||
|
selected3 = selected;
|
||
|
}
|
||
|
var findIndex = function(ij) {
|
||
|
for (var i = 0; i < selected3.length; i++) {
|
||
|
if (ij[0] === selected3[i][0] && ij[1] === selected3[i][1]) return i;
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
table.on('click.dt', 'tbody td', function() {
|
||
|
var $this = $(this), info = tweakCellIndex(table.cell(this));
|
||
|
if ($this.hasClass(selClass)) {
|
||
|
$this.removeClass(selClass);
|
||
|
selected3.splice(findIndex([info.row, info.col]), 1);
|
||
|
} else {
|
||
|
if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass);
|
||
|
$this.addClass(selClass);
|
||
|
selected3 = selMode === 'single' ? [[info.row, info.col]] :
|
||
|
unique(selected3.concat([[info.row, info.col]]));
|
||
|
}
|
||
|
changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix');
|
||
|
});
|
||
|
changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix');
|
||
|
var selectCells = function() {
|
||
|
table.$('td.' + selClass).removeClass(selClass);
|
||
|
if (selected3.length === 0) return;
|
||
|
if (server) {
|
||
|
table.cells({page: 'current'}).every(function() {
|
||
|
var info = tweakCellIndex(this);
|
||
|
if (findIndex([info.row, info.col], selected3) > -1)
|
||
|
$(this.node()).addClass(selClass);
|
||
|
});
|
||
|
} else {
|
||
|
selected3.map(function(ij) {
|
||
|
$(table.cell(ij[0] - 1, ij[1]).node()).addClass(selClass);
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
selectCells(); // in case users have specified pre-selected columns
|
||
|
if (server) table.on('draw.dt', selectCells);
|
||
|
methods.selectCells = function(selected) {
|
||
|
selected3 = selected ? selected : [];
|
||
|
selectCells();
|
||
|
changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix');
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// expose some table info to Shiny
|
||
|
var updateTableInfo = function(e, settings) {
|
||
|
// TODO: is anyone interested in the page info?
|
||
|
// changeInput('page_info', table.page.info());
|
||
|
var updateRowInfo = function(id, modifier) {
|
||
|
var idx;
|
||
|
if (server) {
|
||
|
idx = modifier.page === 'current' ? DT_rows_current : DT_rows_all;
|
||
|
} else {
|
||
|
var rows = table.rows($.extend({
|
||
|
search: 'applied',
|
||
|
page: 'all'
|
||
|
}, modifier));
|
||
|
idx = addOne(rows.indexes().toArray());
|
||
|
}
|
||
|
changeInput('rows' + '_' + id, idx);
|
||
|
};
|
||
|
updateRowInfo('current', {page: 'current'});
|
||
|
updateRowInfo('all', {});
|
||
|
}
|
||
|
table.on('draw.dt', updateTableInfo);
|
||
|
updateTableInfo();
|
||
|
|
||
|
// state info
|
||
|
table.on('draw.dt column-visibility.dt', function() {
|
||
|
changeInput('state', table.state());
|
||
|
});
|
||
|
changeInput('state', table.state());
|
||
|
|
||
|
// search info
|
||
|
var updateSearchInfo = function() {
|
||
|
changeInput('search', table.search());
|
||
|
if (filterRow) changeInput('search_columns', filterRow.toArray().map(function(td) {
|
||
|
return $(td).find('input').first().val();
|
||
|
}));
|
||
|
}
|
||
|
table.on('draw.dt', updateSearchInfo);
|
||
|
updateSearchInfo();
|
||
|
|
||
|
var cellInfo = function(thiz) {
|
||
|
var info = tweakCellIndex(table.cell(thiz));
|
||
|
info.value = table.cell(thiz).data();
|
||
|
return info;
|
||
|
}
|
||
|
// the current cell clicked on
|
||
|
table.on('click.dt', 'tbody td', function() {
|
||
|
changeInput('cell_clicked', cellInfo(this));
|
||
|
})
|
||
|
changeInput('cell_clicked', {});
|
||
|
|
||
|
// do not trigger table selection when clicking on links unless they have classes
|
||
|
table.on('click.dt', 'tbody td a', function(e) {
|
||
|
if (this.className === '') e.stopPropagation();
|
||
|
});
|
||
|
|
||
|
methods.addRow = function(data, rowname) {
|
||
|
var data0 = table.row(0).data(), n = data0.length, d = n - data.length;
|
||
|
if (d === 1) {
|
||
|
data = rowname.concat(data)
|
||
|
} else if (d !== 0) {
|
||
|
console.log(data);
|
||
|
console.log(data0);
|
||
|
throw 'New data must be of the same length as current data (' + n + ')';
|
||
|
};
|
||
|
table.row.add(data).draw();
|
||
|
}
|
||
|
|
||
|
methods.updateSearch = function(keywords) {
|
||
|
if (keywords.global !== null)
|
||
|
$(table.table().container()).find('input[type=search]').first()
|
||
|
.val(keywords.global).trigger('input');
|
||
|
var columns = keywords.columns;
|
||
|
if (!filterRow || columns === null) return;
|
||
|
filterRow.toArray().map(function(td, i) {
|
||
|
var v = typeof columns === 'string' ? columns : columns[i];
|
||
|
if (typeof v === 'undefined') {
|
||
|
console.log('The search keyword for column ' + i + ' is undefined')
|
||
|
return;
|
||
|
}
|
||
|
$(td).find('input').first().val(v);
|
||
|
searchColumn(i, v);
|
||
|
});
|
||
|
table.draw();
|
||
|
}
|
||
|
|
||
|
methods.hideCols = function(hide, reset) {
|
||
|
if (reset) table.columns().visible(true, false);
|
||
|
table.columns(hide).visible(false);
|
||
|
}
|
||
|
|
||
|
methods.showCols = function(show, reset) {
|
||
|
if (reset) table.columns().visible(false, false);
|
||
|
table.columns(show).visible(true);
|
||
|
}
|
||
|
|
||
|
methods.colReorder = function(order, origOrder) {
|
||
|
table.colReorder.order(order, origOrder);
|
||
|
}
|
||
|
|
||
|
methods.selectPage = function(page) {
|
||
|
if (table.page.info().pages < page || page < 1) {
|
||
|
throw 'Selected page is out of range';
|
||
|
};
|
||
|
table.page(page - 1).draw(false);
|
||
|
}
|
||
|
|
||
|
methods.reloadData = function(resetPaging, clearSelection) {
|
||
|
// empty selections first if necessary
|
||
|
if (methods.selectRows && inArray('row', clearSelection)) methods.selectRows([]);
|
||
|
if (methods.selectColumns && inArray('column', clearSelection)) methods.selectColumns([]);
|
||
|
if (methods.selectCells && inArray('cell', clearSelection)) methods.selectCells([]);
|
||
|
table.ajax.reload(null, resetPaging);
|
||
|
}
|
||
|
|
||
|
table.shinyMethods = methods;
|
||
|
},
|
||
|
resize: function(el, width, height, instance) {
|
||
|
if (instance.data) this.renderValue(el, instance.data, instance);
|
||
|
|
||
|
// dynamically adjust height if fillContainer = TRUE
|
||
|
if (instance.fillContainer)
|
||
|
this.fillAvailableHeight(el, height);
|
||
|
|
||
|
this.adjustWidth(el);
|
||
|
},
|
||
|
|
||
|
// dynamically set the scroll body to fill available height
|
||
|
// (used with fillContainer = TRUE)
|
||
|
fillAvailableHeight: function(el, availableHeight) {
|
||
|
|
||
|
// see how much of the table is occupied by header/footer elements
|
||
|
// and use that to compute a target scroll body height
|
||
|
var dtWrapper = $(el).find('div.dataTables_wrapper');
|
||
|
var dtScrollBody = $(el).find($('div.dataTables_scrollBody'));
|
||
|
var framingHeight = dtWrapper.innerHeight() - dtScrollBody.innerHeight();
|
||
|
var scrollBodyHeight = availableHeight - framingHeight;
|
||
|
|
||
|
// set the height
|
||
|
dtScrollBody.height(scrollBodyHeight + 'px');
|
||
|
},
|
||
|
|
||
|
// adjust the width of columns; remove the hard-coded widths on table and the
|
||
|
// scroll header when scrollX/Y are enabled
|
||
|
adjustWidth: function(el) {
|
||
|
var $el = $(el), table = $el.data('datatable');
|
||
|
if (table) table.columns.adjust();
|
||
|
$el.find('.dataTables_scrollHeadInner').css('width', '')
|
||
|
.children('table').css('margin-left', '');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (!HTMLWidgets.shinyMode) return;
|
||
|
|
||
|
Shiny.addCustomMessageHandler('datatable-calls', function(data) {
|
||
|
var id = data.id;
|
||
|
var el = document.getElementById(id);
|
||
|
var table = el ? $(el).data('datatable') : null;
|
||
|
if (!table) {
|
||
|
console.log("Couldn't find table with id " + id);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var methods = table.shinyMethods, call = data.call;
|
||
|
if (methods[call.method]) {
|
||
|
methods[call.method].apply(table, call.args);
|
||
|
} else {
|
||
|
console.log("Unknown method " + call.method);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
})();
|
||
|
</script>
|
||
|
<style type="text/css">table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC)}table.dataTable thead .sorting_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}table.dataTable thead .sorting_asc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAW0lEQVQoz2NgoCm4w3Vnwh02wspK7/y6k01Ikdadx3f+37l9RxmfIsY7c4GKQHDiHUbcyhzvvIMq+3THBpci3jv7oIpAcMcdduzKEu/8vPMdDn/eiWQYBYMKAAC3ykIEuYQJUgAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAWUlEQVQoz2NgGAWDCtyJvPPzznc4/HknEbsy9js77vyHw313eHGZZ3PnE1TRuzuOuK1lvDMRqmzuHUZ87lO+cxuo6PEdLUIeyb7z604pYf+y3Zlwh4u2YQoAc7ZCBHH4jigAAAAASUVORK5CYII=)}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,t
|
||
|
</style>
|
||
|
<style type="text/css">
|
||
|
table.dataTable tr.selected td, table.dataTable td.selected {
|
||
|
background-color: #b0bed9 !important;
|
||
|
}
|
||
|
|
||
|
.dataTables_scrollBody .dataTables_sizing {
|
||
|
visibility: hidden;
|
||
|
}
|
||
|
|
||
|
div.datatables {
|
||
|
color: #333;
|
||
|
}
|
||
|
</style>
|
||
|
<script>/*!
|
||
|
Copyright 2008-2019 SpryMedia Ltd.
|
||
|
|
||
|
This source file is free software, available under the following license:
|
||
|
MIT license - http://datatables.net/license
|
||
|
|
||
|
This source file is distributed in the hope that it will be useful, but
|
||
|
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||
|
or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
|
||
|
|
||
|
For details please refer to: http://www.datatables.net
|
||
|
DataTables 1.10.20
|
||
|
©2008-2019 SpryMedia Ltd - datatables.net/license
|
||
|
*/
|
||
|
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(f,z,y){f instanceof String&&(f=String(f));for(var p=f.length,H=0;H<p;H++){var L=f[H];if(z.call(y,L,H,f))return{i:H,v:L}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;
|
||
|
$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(f,z,y){f!=Array.prototype&&f!=Object.prototype&&(f[z]=y.value)};$jscomp.getGlobal=function(f){return"undefined"!=typeof window&&window===f?f:"undefined"!=typeof global&&null!=global?global:f};$jscomp.global=$jscomp.getGlobal(this);
|
||
|
$jscomp.polyfill=function(f,z,y,p){if(z){y=$jscomp.global;f=f.split(".");for(p=0;p<f.length-1;p++){var H=f[p];H in y||(y[H]={});y=y[H]}f=f[f.length-1];p=y[f];z=z(p);z!=p&&null!=z&&$jscomp.defineProperty(y,f,{configurable:!0,writable:!0,value:z})}};$jscomp.polyfill("Array.prototype.find",function(f){return f?f:function(f,y){return $jscomp.findInternal(this,f,y).v}},"es6","es3");
|
||
|
(function(f){"function"===typeof define&&define.amd?define(["jquery"],function(z){return f(z,window,document)}):"object"===typeof exports?module.exports=function(z,y){z||(z=window);y||(y="undefined"!==typeof window?require("jquery"):require("jquery")(z));return f(y,z,z.document)}:f(jQuery,window,document)})(function(f,z,y,p){function H(a){var b,c,d={};f.each(a,function(e,h){(b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" ")&&(c=e.replace(b[0],b[2].toLowerCase()),
|
||
|
d[c]=e,"o"===b[1]&&H(a[e]))});a._hungarianMap=d}function L(a,b,c){a._hungarianMap||H(a);var d;f.each(b,function(e,h){d=a._hungarianMap[e];d===p||!c&&b[d]!==p||("o"===d.charAt(0)?(b[d]||(b[d]={}),f.extend(!0,b[d],b[e]),L(a[d],b[d],c)):b[d]=b[e])})}function Ga(a){var b=q.defaults.oLanguage,c=b.sDecimal;c&&Ha(c);if(a){var d=a.sZeroRecords;!a.sEmptyTable&&d&&"No data available in table"===b.sEmptyTable&&M(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&d&&"Loading..."===b.sLoadingRecords&&M(a,a,
|
||
|
"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&c!==a&&Ha(a)}}function jb(a){F(a,"ordering","bSort");F(a,"orderMulti","bSortMulti");F(a,"orderClasses","bSortClasses");F(a,"orderCellsTop","bSortCellsTop");F(a,"order","aaSorting");F(a,"orderFixed","aaSortingFixed");F(a,"paging","bPaginate");F(a,"pagingType","sPaginationType");F(a,"pageLength","iDisplayLength");F(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":
|
||
|
"");"boolean"===typeof a.scrollX&&(a.scrollX=a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&L(q.models.oSearch,a[b])}function kb(a){F(a,"orderable","bSortable");F(a,"orderData","aDataSort");F(a,"orderSequence","asSorting");F(a,"orderDataType","sortDataType");var b=a.aDataSort;"number"!==typeof b||f.isArray(b)||(a.aDataSort=[b])}function lb(a){if(!q.__browser){var b={};q.__browser=b;var c=f("<div/>").css({position:"fixed",top:0,left:-1*f(z).scrollLeft(),height:1,width:1,
|
||
|
overflow:"hidden"}).append(f("<div/>").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(f("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}f.extend(a.oBrowser,q.__browser);a.oScroll.iBarWidth=q.__browser.barWidth}
|
||
|
function mb(a,b,c,d,e,h){var g=!1;if(c!==p){var k=c;g=!0}for(;d!==e;)a.hasOwnProperty(d)&&(k=g?b(k,a[d],d,a):a[d],g=!0,d+=h);return k}function Ia(a,b){var c=q.defaults.column,d=a.aoColumns.length;c=f.extend({},q.models.oColumn,c,{nTh:b?b:y.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=f.extend({},q.models.oSearch,c[d]);ma(a,d,f(b).data())}function ma(a,b,c){b=a.aoColumns[b];
|
||
|
var d=a.oClasses,e=f(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var h=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);h&&(b.sWidthOrig=h[1])}c!==p&&null!==c&&(kb(c),L(q.defaults.column,c,!0),c.mDataProp===p||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),f.extend(b,c),M(b,c,"sWidth","sWidthOrig"),c.iDataSort!==p&&(b.aDataSort=[c.iDataSort]),M(b,c,"aDataSort"));var g=b.mData,k=U(g),
|
||
|
l=b.mRender?U(b.mRender):null;c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=f.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=k(a,b,p,c);return l&&b?l(d,b,a,c):d};b.fnSetData=function(a,b,c){return Q(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==f.inArray("asc",b.asSorting);c=-1!==f.inArray("desc",b.asSorting);b.bSortable&&(a||c)?a&&!c?(b.sSortingClass=
|
||
|
d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function aa(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ja(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;""===b.sY&&""===b.sX||na(a);A(a,null,"column-sizing",[a])}function ba(a,b){a=oa(a,"bVisible");return"number"===
|
||
|
typeof a[b]?a[b]:null}function ca(a,b){a=oa(a,"bVisible");b=f.inArray(b,a);return-1!==b?b:null}function W(a){var b=0;f.each(a.aoColumns,function(a,d){d.bVisible&&"none"!==f(d.nTh).css("display")&&b++});return b}function oa(a,b){var c=[];f.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ka(a){var b=a.aoColumns,c=a.aoData,d=q.ext.type.detect,e,h,g;var k=0;for(e=b.length;k<e;k++){var f=b[k];var n=[];if(!f.sType&&f._sManualType)f.sType=f._sManualType;else if(!f.sType){var m=0;for(h=
|
||
|
d.length;m<h;m++){var w=0;for(g=c.length;w<g;w++){n[w]===p&&(n[w]=I(a,w,k,"type"));var u=d[m](n[w],a);if(!u&&m!==d.length-1)break;if("html"===u)break}if(u){f.sType=u;break}}f.sType||(f.sType="string")}}}function nb(a,b,c,d){var e,h,g,k=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){var l=b[e];var n=l.targets!==p?l.targets:l.aTargets;f.isArray(n)||(n=[n]);var m=0;for(h=n.length;m<h;m++)if("number"===typeof n[m]&&0<=n[m]){for(;k.length<=n[m];)Ia(a);d(n[m],l)}else if("number"===typeof n[m]&&0>n[m])d(k.length+
|
||
|
n[m],l);else if("string"===typeof n[m]){var w=0;for(g=k.length;w<g;w++)("_all"==n[m]||f(k[w].nTh).hasClass(n[m]))&&d(w,l)}}if(c)for(e=0,a=c.length;e<a;e++)d(e,c[e])}function R(a,b,c,d){var e=a.aoData.length,h=f.extend(!0,{},q.models.oRow,{src:c?"dom":"data",idx:e});h._aData=b;a.aoData.push(h);for(var g=a.aoColumns,k=0,l=g.length;k<l;k++)g[k].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==p&&(a.aIds[b]=h);!c&&a.oFeatures.bDeferRender||La(a,e,c,d);return e}function pa(a,b){var c;b instanceof
|
||
|
f||(b=f(b));return b.map(function(b,e){c=Ma(a,e);return R(a,c.data,e,c.cells)})}function I(a,b,c,d){var e=a.iDraw,h=a.aoColumns[c],g=a.aoData[b]._aData,k=h.sDefaultContent,f=h.fnGetData(g,d,{settings:a,row:b,col:c});if(f===p)return a.iDrawError!=e&&null===k&&(O(a,0,"Requested unknown parameter "+("function"==typeof h.mData?"{function}":"'"+h.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),k;if((f===g||null===f)&&null!==k&&d!==p)f=k;else if("function"===typeof f)return f.call(g);return null===
|
||
|
f&&"display"==d?"":f}function ob(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}function Na(a){return f.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\\./g,".")})}function U(a){if(f.isPlainObject(a)){var b={};f.each(a,function(a,c){c&&(b[a]=U(c))});return function(a,c,h,g){var d=b[c]||b._;return d!==p?d(a,c,h,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,h,g){return a(b,c,h,g)};if("string"!==typeof a||
|
||
|
-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("("))return function(b,c){return b[a]};var c=function(a,b,h){if(""!==h){var d=Na(h);for(var e=0,l=d.length;e<l;e++){h=d[e].match(da);var n=d[e].match(X);if(h){d[e]=d[e].replace(da,"");""!==d[e]&&(a=a[d[e]]);n=[];d.splice(0,e+1);d=d.join(".");if(f.isArray(a))for(e=0,l=a.length;e<l;e++)n.push(c(a[e],b,d));a=h[0].substring(1,h[0].length-1);a=""===a?n:n.join(a);break}else if(n){d[e]=d[e].replace(X,"");a=a[d[e]]();continue}if(null===a||a[d[e]]===
|
||
|
p)return p;a=a[d[e]]}}return a};return function(b,e){return c(b,e,a)}}function Q(a){if(f.isPlainObject(a))return Q(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"!==typeof a||-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("("))return function(b,d){b[a]=d};var b=function(a,d,e){e=Na(e);var c=e[e.length-1];for(var g,k,l=0,n=e.length-1;l<n;l++){g=e[l].match(da);k=e[l].match(X);if(g){e[l]=e[l].replace(da,"");a[e[l]]=[];c=e.slice();
|
||
|
c.splice(0,l+1);g=c.join(".");if(f.isArray(d))for(k=0,n=d.length;k<n;k++)c={},b(c,d[k],g),a[e[l]].push(c);else a[e[l]]=d;return}k&&(e[l]=e[l].replace(X,""),a=a[e[l]](d));if(null===a[e[l]]||a[e[l]]===p)a[e[l]]={};a=a[e[l]]}if(c.match(X))a[c.replace(X,"")](d);else a[c.replace(da,"")]=d};return function(c,d){return b(c,d,a)}}function Oa(a){return J(a.aoData,"_aData")}function qa(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function ra(a,b,c){for(var d=-1,e=0,h=a.length;e<
|
||
|
h;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===p&&a.splice(d,1)}function ea(a,b,c,d){var e=a.aoData[b],h,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=I(a,b,d,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var k=e.anCells;if(k)if(d!==p)g(k[d],d);else for(c=0,h=k.length;c<h;c++)g(k[c],c)}else e._aData=Ma(a,e,d,d===p?p:e._aData).data;e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==p)g[d].sType=null;else{c=0;for(h=g.length;c<h;c++)g[c].sType=null;
|
||
|
Pa(a,e)}}function Ma(a,b,c,d){var e=[],h=b.firstChild,g,k=0,l,n=a.aoColumns,m=a._rowReadObject;d=d!==p?d:m?{}:[];var w=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),Q(a)(d,b.getAttribute(c)))}},u=function(a){if(c===p||c===k)g=n[k],l=f.trim(a.innerHTML),g&&g._bAttrSrc?(Q(g.mData._)(d,l),w(g.mData.sort,a),w(g.mData.type,a),w(g.mData.filter,a)):m?(g._setter||(g._setter=Q(g.mData)),g._setter(d,l)):d[k]=l;k++};if(h)for(;h;){var q=h.nodeName.toUpperCase();if("TD"==
|
||
|
q||"TH"==q)u(h),e.push(h);h=h.nextSibling}else for(e=b.anCells,h=0,q=e.length;h<q;h++)u(e[h]);(b=b.firstChild?b:b.nTr)&&(b=b.getAttribute("id"))&&Q(a.rowId)(d,b);return{data:d,cells:e}}function La(a,b,c,d){var e=a.aoData[b],h=e._aData,g=[],k,l;if(null===e.nTr){var n=c||y.createElement("tr");e.nTr=n;e.anCells=g;n._DT_RowIndex=b;Pa(a,e);var m=0;for(k=a.aoColumns.length;m<k;m++){var w=a.aoColumns[m];var p=(l=c?!1:!0)?y.createElement(w.sCellType):d[m];p._DT_CellIndex={row:b,column:m};g.push(p);if(l||
|
||
|
!(c&&!w.mRender&&w.mData===m||f.isPlainObject(w.mData)&&w.mData._===m+".display"))p.innerHTML=I(a,b,m,"display");w.sClass&&(p.className+=" "+w.sClass);w.bVisible&&!c?n.appendChild(p):!w.bVisible&&c&&p.parentNode.removeChild(p);w.fnCreatedCell&&w.fnCreatedCell.call(a.oInstance,p,I(a,b,m),h,b,m)}A(a,"aoRowCreatedCallback",null,[n,h,b,g])}e.nTr.setAttribute("role","row")}function Pa(a,b){var c=b.nTr,d=b._aData;if(c){if(a=a.rowIdFn(d))c.id=a;d.DT_RowClass&&(a=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?
|
||
|
ta(b.__rowc.concat(a)):a,f(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&f(c).attr(d.DT_RowAttr);d.DT_RowData&&f(c).data(d.DT_RowData)}}function pb(a){var b,c,d=a.nTHead,e=a.nTFoot,h=0===f("th, td",d).length,g=a.oClasses,k=a.aoColumns;h&&(c=f("<tr/>").appendTo(d));var l=0;for(b=k.length;l<b;l++){var n=k[l];var m=f(n.nTh).addClass(n.sClass);h&&m.appendTo(c);a.oFeatures.bSort&&(m.addClass(n.sSortingClass),!1!==n.bSortable&&(m.attr("tabindex",a.iTabIndex).attr("aria-controls",
|
||
|
a.sTableId),Qa(a,n.nTh,l)));n.sTitle!=m[0].innerHTML&&m.html(n.sTitle);Ra(a,"header")(a,m,n,g)}h&&fa(a.aoHeader,d);f(d).find(">tr").attr("role","row");f(d).find(">tr>th, >tr>td").addClass(g.sHeaderTH);f(e).find(">tr>th, >tr>td").addClass(g.sFooterTH);if(null!==e)for(a=a.aoFooter[0],l=0,b=a.length;l<b;l++)n=k[l],n.nTf=a[l].cell,n.sClass&&f(n.nTf).addClass(n.sClass)}function ha(a,b,c){var d,e,h=[],g=[],k=a.aoColumns.length;if(b){c===p&&(c=!1);var l=0;for(d=b.length;l<d;l++){h[l]=b[l].slice();h[l].nTr=
|
||
|
b[l].nTr;for(e=k-1;0<=e;e--)a.aoColumns[e].bVisible||c||h[l].splice(e,1);g.push([])}l=0;for(d=h.length;l<d;l++){if(a=h[l].nTr)for(;e=a.firstChild;)a.removeChild(e);e=0;for(b=h[l].length;e<b;e++){var n=k=1;if(g[l][e]===p){a.appendChild(h[l][e].cell);for(g[l][e]=1;h[l+k]!==p&&h[l][e].cell==h[l+k][e].cell;)g[l+k][e]=1,k++;for(;h[l][e+n]!==p&&h[l][e].cell==h[l][e+n].cell;){for(c=0;c<k;c++)g[l+c][e+n]=1;n++}f(h[l][e].cell).attr("rowspan",k).attr("colspan",n)}}}}}function S(a){var b=A(a,"aoPreDrawCallback",
|
||
|
"preDraw",[a]);if(-1!==f.inArray(!1,b))K(a,!1);else{b=[];var c=0,d=a.asStripeClasses,e=d.length,h=a.oLanguage,g=a.iInitDisplayStart,k="ssp"==D(a),l=a.aiDisplay;a.bDrawing=!0;g!==p&&-1!==g&&(a._iDisplayStart=k?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);g=a._iDisplayStart;var n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,K(a,!1);else if(!k)a.iDraw++;else if(!a.bDestroying&&!qb(a))return;if(0!==l.length)for(h=k?a.aoData.length:n,k=k?0:g;k<h;k++){var m=l[k],w=a.aoData[m];
|
||
|
null===w.nTr&&La(a,m);var u=w.nTr;if(0!==e){var q=d[c%e];w._sRowStripe!=q&&(f(u).removeClass(w._sRowStripe).addClass(q),w._sRowStripe=q)}A(a,"aoRowCallback",null,[u,w._aData,c,k,m]);b.push(u);c++}else c=h.sZeroRecords,1==a.iDraw&&"ajax"==D(a)?c=h.sLoadingRecords:h.sEmptyTable&&0===a.fnRecordsTotal()&&(c=h.sEmptyTable),b[0]=f("<tr/>",{"class":e?d[0]:""}).append(f("<td />",{valign:"top",colSpan:W(a),"class":a.oClasses.sRowEmpty}).html(c))[0];A(a,"aoHeaderCallback","header",[f(a.nTHead).children("tr")[0],
|
||
|
Oa(a),g,n,l]);A(a,"aoFooterCallback","footer",[f(a.nTFoot).children("tr")[0],Oa(a),g,n,l]);d=f(a.nTBody);d.children().detach();d.append(f(b));A(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function V(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&rb(a);d?ia(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;S(a);a._drawHold=!1}function sb(a){var b=a.oClasses,c=f(a.nTable);c=f("<div/>").insertBefore(c);var d=a.oFeatures,e=
|
||
|
f("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var h=a.sDom.split(""),g,k,l,n,m,p,u=0;u<h.length;u++){g=null;k=h[u];if("<"==k){l=f("<div/>")[0];n=h[u+1];if("'"==n||'"'==n){m="";for(p=2;h[u+p]!=n;)m+=h[u+p],p++;"H"==m?m=b.sJUIHeader:"F"==m&&(m=b.sJUIFooter);-1!=m.indexOf(".")?(n=m.split("."),l.id=n[0].substr(1,n[0].length-1),l.className=n[1]):"#"==m.charAt(0)?l.id=m.substr(1,
|
||
|
m.length-1):l.className=m;u+=p}e.append(l);e=f(l)}else if(">"==k)e=e.parent();else if("l"==k&&d.bPaginate&&d.bLengthChange)g=tb(a);else if("f"==k&&d.bFilter)g=ub(a);else if("r"==k&&d.bProcessing)g=vb(a);else if("t"==k)g=wb(a);else if("i"==k&&d.bInfo)g=xb(a);else if("p"==k&&d.bPaginate)g=yb(a);else if(0!==q.ext.feature.length)for(l=q.ext.feature,p=0,n=l.length;p<n;p++)if(k==l[p].cFeature){g=l[p].fnInit(a);break}g&&(l=a.aanFeatures,l[k]||(l[k]=[]),l[k].push(g),e.append(g))}c.replaceWith(e);a.nHolding=
|
||
|
null}function fa(a,b){b=f(b).children("tr");var c,d,e;a.splice(0,a.length);var h=0;for(e=b.length;h<e;h++)a.push([]);h=0;for(e=b.length;h<e;h++){var g=b[h];for(c=g.firstChild;c;){if("TD"==c.nodeName.toUpperCase()||"TH"==c.nodeName.toUpperCase()){var k=1*c.getAttribute("colspan");var l=1*c.getAttribute("rowspan");k=k&&0!==k&&1!==k?k:1;l=l&&0!==l&&1!==l?l:1;var n=0;for(d=a[h];d[n];)n++;var m=n;var p=1===k?!0:!1;for(d=0;d<k;d++)for(n=0;n<l;n++)a[h+n][m+d]={cell:c,unique:p},a[h+n].nTr=g}c=c.nextSibling}}}
|
||
|
function ua(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],fa(c,b)));b=0;for(var e=c.length;b<e;b++)for(var h=0,g=c[b].length;h<g;h++)!c[b][h].unique||d[h]&&a.bSortCellsTop||(d[h]=c[b][h].cell);return d}function va(a,b,c){A(a,"aoServerParams","serverParams",[b]);if(b&&f.isArray(b)){var d={},e=/(.*?)\[\]$/;f.each(b,function(a,b){(a=b.name.match(e))?(a=a[0],d[a]||(d[a]=[]),d[a].push(b.value)):d[b.name]=b.value});b=d}var h=a.ajax,g=a.oInstance,k=function(b){A(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(f.isPlainObject(h)&&
|
||
|
h.data){var l=h.data;var n="function"===typeof l?l(b,a):l;b="function"===typeof l&&n?n:f.extend(!0,b,n);delete h.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&O(a,0,c);a.json=b;k(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c,d){d=A(a,null,"xhr",[a,null,a.jqXHR]);-1===f.inArray(!0,d)&&("parsererror"==c?O(a,0,"Invalid JSON response",1):4===b.readyState&&O(a,0,"Ajax error",7));K(a,!1)}};a.oAjaxData=b;A(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(g,
|
||
|
a.sAjaxSource,f.map(b,function(a,b){return{name:b,value:a}}),k,a):a.sAjaxSource||"string"===typeof h?a.jqXHR=f.ajax(f.extend(n,{url:h||a.sAjaxSource})):"function"===typeof h?a.jqXHR=h.call(g,b,k,a):(a.jqXHR=f.ajax(f.extend(n,h)),h.data=l)}function qb(a){return a.bAjaxDataGet?(a.iDraw++,K(a,!0),va(a,zb(a),function(b){Ab(a,b)}),!1):!0}function zb(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,h=a.aoPreSearchCols,g=[],k=Y(a);var l=a._iDisplayStart;var n=!1!==d.bPaginate?a._iDisplayLength:
|
||
|
-1;var m=function(a,b){g.push({name:a,value:b})};m("sEcho",a.iDraw);m("iColumns",c);m("sColumns",J(b,"sName").join(","));m("iDisplayStart",l);m("iDisplayLength",n);var p={draw:a.iDraw,columns:[],order:[],start:l,length:n,search:{value:e.sSearch,regex:e.bRegex}};for(l=0;l<c;l++){var u=b[l];var sa=h[l];n="function"==typeof u.mData?"function":u.mData;p.columns.push({data:n,name:u.sName,searchable:u.bSearchable,orderable:u.bSortable,search:{value:sa.sSearch,regex:sa.bRegex}});m("mDataProp_"+l,n);d.bFilter&&
|
||
|
(m("sSearch_"+l,sa.sSearch),m("bRegex_"+l,sa.bRegex),m("bSearchable_"+l,u.bSearchable));d.bSort&&m("bSortable_"+l,u.bSortable)}d.bFilter&&(m("sSearch",e.sSearch),m("bRegex",e.bRegex));d.bSort&&(f.each(k,function(a,b){p.order.push({column:b.col,dir:b.dir});m("iSortCol_"+a,b.col);m("sSortDir_"+a,b.dir)}),m("iSortingCols",k.length));b=q.ext.legacy.ajax;return null===b?a.sAjaxSource?g:p:b?g:p}function Ab(a,b){var c=function(a,c){return b[a]!==p?b[a]:b[c]},d=wa(a,b),e=c("sEcho","draw"),h=c("iTotalRecords",
|
||
|
"recordsTotal");c=c("iTotalDisplayRecords","recordsFiltered");if(e){if(1*e<a.iDraw)return;a.iDraw=1*e}qa(a);a._iRecordsTotal=parseInt(h,10);a._iRecordsDisplay=parseInt(c,10);e=0;for(h=d.length;e<h;e++)R(a,d[e]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;S(a);a._bInitComplete||xa(a,b);a.bAjaxDataGet=!0;K(a,!1)}function wa(a,b){a=f.isPlainObject(a.ajax)&&a.ajax.dataSrc!==p?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===a?b.aaData||b[a]:""!==a?U(a)(b):b}function ub(a){var b=a.oClasses,c=
|
||
|
a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,h=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',k=d.sSearch;k=k.match(/_INPUT_/)?k.replace("_INPUT_",g):k+g;b=f("<div/>",{id:h.f?null:c+"_filter","class":b.sFilter}).append(f("<label/>").append(k));h=function(){var b=this.value?this.value:"";b!=e.sSearch&&(ia(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,S(a))};g=null!==a.searchDelay?a.searchDelay:"ssp"===D(a)?400:0;var l=f("input",
|
||
|
b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",g?Sa(h,g):h).on("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);f(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{l[0]!==y.activeElement&&l.val(e.sSearch)}catch(w){}});return b[0]}function ia(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,h=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive},g=function(a){return a.bEscapeRegex!==
|
||
|
p?!a.bEscapeRegex:a.bRegex};Ka(a);if("ssp"!=D(a)){Bb(a,b.sSearch,c,g(b),b.bSmart,b.bCaseInsensitive);h(b);for(b=0;b<e.length;b++)Cb(a,e[b].sSearch,b,g(e[b]),e[b].bSmart,e[b].bCaseInsensitive);Db(a)}else h(b);a.bFiltered=!0;A(a,null,"search",[a])}function Db(a){for(var b=q.ext.search,c=a.aiDisplay,d,e,h=0,g=b.length;h<g;h++){for(var k=[],l=0,n=c.length;l<n;l++)e=c[l],d=a.aoData[e],b[h](a,d._aFilterData,e,d._aData,l)&&k.push(e);c.length=0;f.merge(c,k)}}function Cb(a,b,c,d,e,h){if(""!==b){var g=[],k=
|
||
|
a.aiDisplay;d=Ta(b,d,e,h);for(e=0;e<k.length;e++)b=a.aoData[k[e]]._aFilterData[c],d.test(b)&&g.push(k[e]);a.aiDisplay=g}}function Bb(a,b,c,d,e,h){e=Ta(b,d,e,h);var g=a.oPreviousSearch.sSearch,k=a.aiDisplayMaster;h=[];0!==q.ext.search.length&&(c=!0);var f=Eb(a);if(0>=b.length)a.aiDisplay=k.slice();else{if(f||c||d||g.length>b.length||0!==b.indexOf(g)||a.bSorted)a.aiDisplay=k.slice();b=a.aiDisplay;for(c=0;c<b.length;c++)e.test(a.aoData[b[c]]._sFilterRow)&&h.push(b[c]);a.aiDisplay=h}}function Ta(a,b,
|
||
|
c,d){a=b?a:Ua(a);c&&(a="^(?=.*?"+f.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0)){var b=a.match(/^"(.*)"$/);a=b?b[1]:a}return a.replace('"',"")}).join(")(?=.*?")+").*$");return new RegExp(a,d?"i":"")}function Eb(a){var b=a.aoColumns,c,d,e=q.ext.type.search;var h=!1;var g=0;for(c=a.aoData.length;g<c;g++){var k=a.aoData[g];if(!k._aFilterData){var f=[];var n=0;for(d=b.length;n<d;n++){h=b[n];if(h.bSearchable){var m=I(a,g,n,"filter");e[h.sType]&&(m=e[h.sType](m));null===m&&(m="");
|
||
|
"string"!==typeof m&&m.toString&&(m=m.toString())}else m="";m.indexOf&&-1!==m.indexOf("&")&&(ya.innerHTML=m,m=$b?ya.textContent:ya.innerText);m.replace&&(m=m.replace(/[\r\n\u2028]/g,""));f.push(m)}k._aFilterData=f;k._sFilterRow=f.join(" ");h=!0}}return h}function Fb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Gb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function xb(a){var b=a.sTableId,c=a.aanFeatures.i,
|
||
|
d=f("<div/>",{"class":a.oClasses.sInfo,id:c?null:b+"_info"});c||(a.aoDrawCallback.push({fn:Hb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),f(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Hb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd(),h=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),k=g?c.sInfo:c.sInfoEmpty;g!==h&&(k+=" "+c.sInfoFiltered);k+=c.sInfoPostFix;k=Ib(a,k);c=c.fnInfoCallback;null!==c&&(k=c.call(a.oInstance,
|
||
|
a,d,e,h,g,k));f(b).html(k)}}function Ib(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,h=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,h)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(h/e)))}function ja(a){var b=a.iInitDisplayStart,c=a.aoColumns;var d=a.oFeatures;var e=a.bDeferLoading;if(a.bInitialised){sb(a);
|
||
|
pb(a);ha(a,a.aoHeader);ha(a,a.aoFooter);K(a,!0);d.bAutoWidth&&Ja(a);var h=0;for(d=c.length;h<d;h++){var g=c[h];g.sWidth&&(g.nTh.style.width=B(g.sWidth))}A(a,null,"preInit",[a]);V(a);c=D(a);if("ssp"!=c||e)"ajax"==c?va(a,[],function(c){var d=wa(a,c);for(h=0;h<d.length;h++)R(a,d[h]);a.iInitDisplayStart=b;V(a);K(a,!1);xa(a,c)},a):(K(a,!1),xa(a))}else setTimeout(function(){ja(a)},200)}function xa(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&aa(a);A(a,null,"plugin-init",[a,b]);A(a,"aoInitComplete","init",
|
||
|
[a,b])}function Va(a,b){b=parseInt(b,10);a._iDisplayLength=b;Wa(a);A(a,null,"length",[a,b])}function tb(a){var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=f.isArray(d[0]),h=e?d[0]:d;d=e?d[1]:d;e=f("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect});for(var g=0,k=h.length;g<k;g++)e[0][g]=new Option("number"===typeof d[g]?a.fnFormatNumber(d[g]):d[g],h[g]);var l=f("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(l[0].id=c+"_length");l.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",
|
||
|
e[0].outerHTML));f("select",l).val(a._iDisplayLength).on("change.DT",function(b){Va(a,f(this).val());S(a)});f(a.nTable).on("length.dt.DT",function(b,c,d){a===c&&f("select",l).val(d)});return l[0]}function yb(a){var b=a.sPaginationType,c=q.ext.pager[b],d="function"===typeof c,e=function(a){S(a)};b=f("<div/>").addClass(a.oClasses.sPaging+b)[0];var h=a.aanFeatures;d||c.fnInit(a,b,e);h.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,g=a._iDisplayLength,
|
||
|
f=a.fnRecordsDisplay(),m=-1===g;b=m?0:Math.ceil(b/g);g=m?1:Math.ceil(f/g);f=c(b,g);var p;m=0;for(p=h.p.length;m<p;m++)Ra(a,"pageButton")(a,h.p[m],m,f,b,g)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Xa(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,h=a.fnRecordsDisplay();0===h||-1===e?d=0:"number"===typeof b?(d=b*e,d>h&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<h&&(d+=e):"last"==b?d=Math.floor((h-1)/e)*e:O(a,0,"Unknown paging action: "+b,5);b=
|
||
|
a._iDisplayStart!==d;a._iDisplayStart=d;b&&(A(a,null,"page",[a]),c&&S(a));return b}function vb(a){return f("<div/>",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function K(a,b){a.oFeatures.bProcessing&&f(a.aanFeatures.r).css("display",b?"block":"none");A(a,null,"processing",[a,b])}function wb(a){var b=f(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,
|
||
|
h=a.oClasses,g=b.children("caption"),k=g.length?g[0]._captionSide:null,l=f(b[0].cloneNode(!1)),n=f(b[0].cloneNode(!1)),m=b.children("tfoot");m.length||(m=null);l=f("<div/>",{"class":h.sScrollWrapper}).append(f("<div/>",{"class":h.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?B(d):null:"100%"}).append(f("<div/>",{"class":h.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===k?g:null).append(b.children("thead"))))).append(f("<div/>",
|
||
|
{"class":h.sScrollBody}).css({position:"relative",overflow:"auto",width:d?B(d):null}).append(b));m&&l.append(f("<div/>",{"class":h.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?B(d):null:"100%"}).append(f("<div/>",{"class":h.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",0).append("bottom"===k?g:null).append(b.children("tfoot")))));b=l.children();var p=b[0];h=b[1];var u=m?b[2]:null;if(d)f(h).on("scroll.DT",function(a){a=this.scrollLeft;p.scrollLeft=a;m&&(u.scrollLeft=a)});
|
||
|
f(h).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=p;a.nScrollBody=h;a.nScrollFoot=u;a.aoDrawCallback.push({fn:na,sName:"scrolling"});return l[0]}function na(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var h=f(a.nScrollHead),g=h[0].style,k=h.children("div"),l=k[0].style,n=k.children("table");k=a.nScrollBody;var m=f(k),w=k.style,u=f(a.nScrollFoot).children("div"),q=u.children("table"),t=f(a.nTHead),r=f(a.nTable),v=r[0],za=v.style,T=a.nTFoot?f(a.nTFoot):null,A=a.oBrowser,
|
||
|
x=A.bScrollOversize,ac=J(a.aoColumns,"nTh"),Ya=[],y=[],z=[],C=[],G,H=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};var D=k.scrollHeight>k.clientHeight;if(a.scrollBarVis!==D&&a.scrollBarVis!==p)a.scrollBarVis=D,aa(a);else{a.scrollBarVis=D;r.children("thead, tfoot").remove();if(T){var E=T.clone().prependTo(r);var F=T.find("tr");E=E.find("tr")}var I=t.clone().prependTo(r);t=t.find("tr");D=I.find("tr");I.find("th, td").removeAttr("tabindex");
|
||
|
c||(w.width="100%",h[0].style.width="100%");f.each(ua(a,I),function(b,c){G=ba(a,b);c.style.width=a.aoColumns[G].sWidth});T&&N(function(a){a.style.width=""},E);h=r.outerWidth();""===c?(za.width="100%",x&&(r.find("tbody").height()>k.offsetHeight||"scroll"==m.css("overflow-y"))&&(za.width=B(r.outerWidth()-b)),h=r.outerWidth()):""!==d&&(za.width=B(d),h=r.outerWidth());N(H,D);N(function(a){z.push(a.innerHTML);Ya.push(B(f(a).css("width")))},D);N(function(a,b){-1!==f.inArray(a,ac)&&(a.style.width=Ya[b])},
|
||
|
t);f(D).height(0);T&&(N(H,E),N(function(a){C.push(a.innerHTML);y.push(B(f(a).css("width")))},E),N(function(a,b){a.style.width=y[b]},F),f(E).height(0));N(function(a,b){a.innerHTML='<div class="dataTables_sizing">'+z[b]+"</div>";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=Ya[b]},D);T&&N(function(a,b){a.innerHTML='<div class="dataTables_sizing">'+C[b]+"</div>";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=y[b]},E);r.outerWidth()<
|
||
|
h?(F=k.scrollHeight>k.offsetHeight||"scroll"==m.css("overflow-y")?h+b:h,x&&(k.scrollHeight>k.offsetHeight||"scroll"==m.css("overflow-y"))&&(za.width=B(F-b)),""!==c&&""===d||O(a,1,"Possible column misalignment",6)):F="100%";w.width=B(F);g.width=B(F);T&&(a.nScrollFoot.style.width=B(F));!e&&x&&(w.height=B(v.offsetHeight+b));c=r.outerWidth();n[0].style.width=B(c);l.width=B(c);d=r.height()>k.clientHeight||"scroll"==m.css("overflow-y");e="padding"+(A.bScrollbarLeft?"Left":"Right");l[e]=d?b+"px":"0px";T&&
|
||
|
(q[0].style.width=B(c),u[0].style.width=B(c),u[0].style[e]=d?b+"px":"0px");r.children("colgroup").insertBefore(r.children("thead"));m.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(k.scrollTop=0)}}function N(a,b,c){for(var d=0,e=0,h=b.length,g,k;e<h;){g=b[e].firstChild;for(k=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,k,d):a(g,d),d++),g=g.nextSibling,k=c?k.nextSibling:null;e++}}function Ja(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,e=d.sY,h=d.sX,g=d.sXInner,k=c.length,l=oa(a,"bVisible"),
|
||
|
n=f("th",a.nTHead),m=b.getAttribute("width"),p=b.parentNode,u=!1,q,t=a.oBrowser;d=t.bScrollOversize;(q=b.style.width)&&-1!==q.indexOf("%")&&(m=q);for(q=0;q<l.length;q++){var r=c[l[q]];null!==r.sWidth&&(r.sWidth=Jb(r.sWidthOrig,p),u=!0)}if(d||!u&&!h&&!e&&k==W(a)&&k==n.length)for(q=0;q<k;q++)l=ba(a,q),null!==l&&(c[l].sWidth=B(n.eq(q).width()));else{k=f(b).clone().css("visibility","hidden").removeAttr("id");k.find("tbody tr").remove();var v=f("<tr/>").appendTo(k.find("tbody"));k.find("thead, tfoot").remove();
|
||
|
k.append(f(a.nTHead).clone()).append(f(a.nTFoot).clone());k.find("tfoot th, tfoot td").css("width","");n=ua(a,k.find("thead")[0]);for(q=0;q<l.length;q++)r=c[l[q]],n[q].style.width=null!==r.sWidthOrig&&""!==r.sWidthOrig?B(r.sWidthOrig):"",r.sWidthOrig&&h&&f(n[q]).append(f("<div/>").css({width:r.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(q=0;q<l.length;q++)u=l[q],r=c[u],f(Kb(a,u)).clone(!1).append(r.sContentPadding).appendTo(v);f("[name]",k).removeAttr("name");r=f("<div/>").css(h||
|
||
|
e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(k).appendTo(p);h&&g?k.width(g):h?(k.css("width","auto"),k.removeAttr("width"),k.width()<p.clientWidth&&m&&k.width(p.clientWidth)):e?k.width(p.clientWidth):m&&k.width(m);for(q=e=0;q<l.length;q++)p=f(n[q]),g=p.outerWidth()-p.width(),p=t.bBounding?Math.ceil(n[q].getBoundingClientRect().width):p.outerWidth(),e+=p,c[l[q]].sWidth=B(p-g);b.style.width=B(e);r.remove()}m&&(b.style.width=B(m));!m&&!h||a._reszEvt||(b=function(){f(z).on("resize.DT-"+
|
||
|
a.sInstance,Sa(function(){aa(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0)}function Jb(a,b){if(!a)return 0;a=f("<div/>").css("width",B(a)).appendTo(b||y.body);b=a[0].offsetWidth;a.remove();return b}function Kb(a,b){var c=Lb(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]:f("<td/>").html(I(a,c,b,"display"))[0]}function Lb(a,b){for(var c,d=-1,e=-1,h=0,g=a.aoData.length;h<g;h++)c=I(a,h,b,"display")+"",c=c.replace(bc,""),c=c.replace(/ /g," "),c.length>d&&(d=c.length,e=h);return e}
|
||
|
function B(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Y(a){var b=[],c=a.aoColumns;var d=a.aaSortingFixed;var e=f.isPlainObject(d);var h=[];var g=function(a){a.length&&!f.isArray(a[0])?h.push(a):f.merge(h,a)};f.isArray(d)&&g(d);e&&d.pre&&g(d.pre);g(a.aaSorting);e&&d.post&&g(d.post);for(a=0;a<h.length;a++){var k=h[a][0];g=c[k].aDataSort;d=0;for(e=g.length;d<e;d++){var l=g[d];var n=c[l].sType||"string";h[a]._idx===p&&(h[a]._idx=f.inArray(h[a][1],c[l].asSorting));
|
||
|
b.push({src:k,col:l,dir:h[a][1],index:h[a]._idx,type:n,formatter:q.ext.type.order[n+"-pre"]})}}return b}function rb(a){var b,c=[],d=q.ext.type.order,e=a.aoData,h=0,g=a.aiDisplayMaster;Ka(a);var k=Y(a);var f=0;for(b=k.length;f<b;f++){var n=k[f];n.formatter&&h++;Mb(a,n.col)}if("ssp"!=D(a)&&0!==k.length){f=0;for(b=g.length;f<b;f++)c[g[f]]=f;h===k.length?g.sort(function(a,b){var d,h=k.length,g=e[a]._aSortData,f=e[b]._aSortData;for(d=0;d<h;d++){var l=k[d];var m=g[l.col];var n=f[l.col];m=m<n?-1:m>n?1:0;
|
||
|
if(0!==m)return"asc"===l.dir?m:-m}m=c[a];n=c[b];return m<n?-1:m>n?1:0}):g.sort(function(a,b){var h,g=k.length,f=e[a]._aSortData,l=e[b]._aSortData;for(h=0;h<g;h++){var m=k[h];var n=f[m.col];var p=l[m.col];m=d[m.type+"-"+m.dir]||d["string-"+m.dir];n=m(n,p);if(0!==n)return n}n=c[a];p=c[b];return n<p?-1:n>p?1:0})}a.bSorted=!0}function Nb(a){var b=a.aoColumns,c=Y(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d<e;d++){var h=b[d];var g=h.asSorting;var k=h.sTitle.replace(/<.*?>/g,"");var f=h.nTh;f.removeAttribute("aria-sort");
|
||
|
h.bSortable&&(0<c.length&&c[0].col==d?(f.setAttribute("aria-sort","asc"==c[0].dir?"ascending":"descending"),h=g[c[0].index+1]||g[0]):h=g[0],k+="asc"===h?a.sSortAscending:a.sSortDescending);f.setAttribute("aria-label",k)}}function Za(a,b,c,d){var e=a.aaSorting,h=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===p&&(c=f.inArray(a[1],h));return c+1<h.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=f.inArray(b,J(e,"0")),-1!==c?(b=g(e[c],!0),null===
|
||
|
b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=h[b],e[c]._idx=b)):(e.push([b,h[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=h[b],e[0]._idx=b):(e.length=0,e.push([b,h[0]]),e[0]._idx=0);V(a);"function"==typeof d&&d(a)}function Qa(a,b,c,d){var e=a.aoColumns[c];$a(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(K(a,!0),setTimeout(function(){Za(a,c,b.shiftKey,d);"ssp"!==D(a)&&K(a,!1)},0)):Za(a,c,b.shiftKey,d))})}function Aa(a){var b=a.aLastSort,
|
||
|
c=a.oClasses.sSortColumn,d=Y(a),e=a.oFeatures,h;if(e.bSort&&e.bSortClasses){e=0;for(h=b.length;e<h;e++){var g=b[e].src;f(J(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3))}e=0;for(h=d.length;e<h;e++)g=d[e].src,f(J(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Mb(a,b){var c=a.aoColumns[b],d=q.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ca(a,b)));for(var h,g=q.ext.type.order[c.sType+"-pre"],k=0,f=a.aoData.length;k<f;k++)if(c=a.aoData[k],c._aSortData||(c._aSortData=
|
||
|
[]),!c._aSortData[b]||d)h=d?e[k]:I(a,k,b,"sort"),c._aSortData[b]=g?g(h):h}function Ba(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:f.extend(!0,[],a.aaSorting),search:Fb(a.oPreviousSearch),columns:f.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:Fb(a.aoPreSearchCols[d])}})};A(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Ob(a,b,c){var d,
|
||
|
e,h=a.aoColumns;b=function(b){if(b&&b.time){var g=A(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===f.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g||b.columns&&h.length!==b.columns.length))){a.oLoadedState=f.extend(!0,{},b);b.start!==p&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==p&&(a._iDisplayLength=b.length);b.order!==p&&(a.aaSorting=[],f.each(b.order,function(b,c){a.aaSorting.push(c[0]>=h.length?[0,c[1]]:c)}));b.search!==p&&f.extend(a.oPreviousSearch,
|
||
|
Gb(b.search));if(b.columns)for(d=0,e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==p&&(h[d].bVisible=g.visible),g.search!==p&&f.extend(a.aoPreSearchCols[d],Gb(g.search));A(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==p&&b(g)}else c()}function Ca(a){var b=q.settings;a=f.inArray(a,J(b,"nTable"));return-1!==a?b[a]:null}function O(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+
|
||
|
d);if(b)z.console&&console.log&&console.log(c);else if(b=q.ext,b=b.sErrMode||b.errMode,a&&A(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function M(a,b,c,d){f.isArray(c)?f.each(c,function(c,d){f.isArray(d)?M(a,b,d[0],d[1]):M(a,b,d)}):(d===p&&(d=c),b[c]!==p&&(a[d]=b[c]))}function ab(a,b,c){var d;for(d in b)if(b.hasOwnProperty(d)){var e=b[d];f.isPlainObject(e)?(f.isPlainObject(a[d])||(a[d]={}),f.extend(!0,a[d],e)):c&&"data"!==d&&"aaData"!==
|
||
|
d&&f.isArray(e)?a[d]=e.slice():a[d]=e}return a}function $a(a,b,c){f(a).on("click.DT",b,function(b){f(a).blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function E(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function A(a,b,c,d){var e=[];b&&(e=f.map(a[b].slice().reverse(),function(b,c){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=f.Event(c+".dt"),f(a.nTable).trigger(b,d),e.push(b.result));return e}function Wa(a){var b=a._iDisplayStart,
|
||
|
c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ra(a,b){a=a.renderer;var c=q.ext.renderer[b];return f.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]||c._:c._}function D(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ka(a,b){var c=Pb.numbers_length,d=Math.floor(c/2);b<=c?a=Z(0,b):a<=d?(a=Z(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=Z(b-(c-2),b):(a=Z(a-d+2,a+d-1),a.push("ellipsis"),
|
||
|
a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function Ha(a){f.each({num:function(b){return Da(b,a)},"num-fmt":function(b){return Da(b,a,bb)},"html-num":function(b){return Da(b,a,Ea)},"html-num-fmt":function(b){return Da(b,a,Ea,bb)}},function(b,c){C.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(C.type.search[b+a]=C.type.search.html)})}function Qb(a){return function(){var b=[Ca(this[q.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return q.ext.internal[a].apply(this,
|
||
|
b)}}var q=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new v(Ca(this[C.iApiIndex])):new v(this)};this.fnAddData=function(a,b){var c=this.api(!0);a=f.isArray(a)&&(f.isArray(a[0])||f.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===p||b)&&c.draw();return a.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===p||a?b.draw(!1):
|
||
|
(""!==d.sX||""!==d.sY)&&na(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===p||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0);a=d.rows(a);var e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===p||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,f){e=this.api(!0);null===b||b===p?
|
||
|
e.search(a,c,d,f):e.column(b).search(a,c,d,f);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==p){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==p||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==p?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),
|
||
|
[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){a=this.api(!0).page(a);(b===p||b)&&a.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===p||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return Ca(this[C.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=
|
||
|
function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===p||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===p||e)&&h.columns.adjust();(d===p||d)&&h.draw();return 0};this.fnVersionCheck=C.fnVersionCheck;var b=this,c=a===p,d=this.length;c&&(a={});this.oApi=this.internal=C.internal;for(var e in q.ext.internal)e&&(this[e]=Qb(e));this.each(function(){var e={},g=1<d?ab(e,a,!0):a,k=0,l;e=this.getAttribute("id");var n=!1,m=q.defaults,w=f(this);if("table"!=
|
||
|
this.nodeName.toLowerCase())O(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{jb(m);kb(m.column);L(m,m,!0);L(m.column,m.column,!0);L(m,f.extend(g,w.data()),!0);var u=q.settings;k=0;for(l=u.length;k<l;k++){var t=u[k];if(t.nTable==this||t.nTHead&&t.nTHead.parentNode==this||t.nTFoot&&t.nTFoot.parentNode==this){var v=g.bRetrieve!==p?g.bRetrieve:m.bRetrieve;if(c||v)return t.oInstance;if(g.bDestroy!==p?g.bDestroy:m.bDestroy){t.oInstance.fnDestroy();break}else{O(t,0,"Cannot reinitialise DataTable",
|
||
|
3);return}}if(t.sTableId==this.id){u.splice(k,1);break}}if(null===e||""===e)this.id=e="DataTables_Table_"+q.ext._unique++;var r=f.extend(!0,{},q.models.oSettings,{sDestroyWidth:w[0].style.width,sInstance:e,sTableId:e});r.nTable=this;r.oApi=b.internal;r.oInit=g;u.push(r);r.oInstance=1===b.length?b:w.dataTable();jb(g);Ga(g.oLanguage);g.aLengthMenu&&!g.iDisplayLength&&(g.iDisplayLength=f.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]);g=ab(f.extend(!0,{},m),g);M(r.oFeatures,g,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));
|
||
|
M(r,g,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]);M(r.oScroll,g,[["sScrollX","sX"],["sScrollXInner","sXInner"],
|
||
|
["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);M(r.oLanguage,g,"fnInfoCallback");E(r,"aoDrawCallback",g.fnDrawCallback,"user");E(r,"aoServerParams",g.fnServerParams,"user");E(r,"aoStateSaveParams",g.fnStateSaveParams,"user");E(r,"aoStateLoadParams",g.fnStateLoadParams,"user");E(r,"aoStateLoaded",g.fnStateLoaded,"user");E(r,"aoRowCallback",g.fnRowCallback,"user");E(r,"aoRowCreatedCallback",g.fnCreatedRow,"user");E(r,"aoHeaderCallback",g.fnHeaderCallback,"user");E(r,"aoFooterCallback",g.fnFooterCallback,
|
||
|
"user");E(r,"aoInitComplete",g.fnInitComplete,"user");E(r,"aoPreDrawCallback",g.fnPreDrawCallback,"user");r.rowIdFn=U(g.rowId);lb(r);var x=r.oClasses;f.extend(x,q.ext.classes,g.oClasses);w.addClass(x.sTable);r.iInitDisplayStart===p&&(r.iInitDisplayStart=g.iDisplayStart,r._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(r.bDeferLoading=!0,e=f.isArray(g.iDeferLoading),r._iRecordsDisplay=e?g.iDeferLoading[0]:g.iDeferLoading,r._iRecordsTotal=e?g.iDeferLoading[1]:g.iDeferLoading);var y=r.oLanguage;
|
||
|
f.extend(!0,y,g.oLanguage);y.sUrl&&(f.ajax({dataType:"json",url:y.sUrl,success:function(a){Ga(a);L(m.oLanguage,a);f.extend(!0,y,a);ja(r)},error:function(){ja(r)}}),n=!0);null===g.asStripeClasses&&(r.asStripeClasses=[x.sStripeOdd,x.sStripeEven]);e=r.asStripeClasses;var z=w.children("tbody").find("tr").eq(0);-1!==f.inArray(!0,f.map(e,function(a,b){return z.hasClass(a)}))&&(f("tbody tr",this).removeClass(e.join(" ")),r.asDestroyStripes=e.slice());e=[];u=this.getElementsByTagName("thead");0!==u.length&&
|
||
|
(fa(r.aoHeader,u[0]),e=ua(r));if(null===g.aoColumns)for(u=[],k=0,l=e.length;k<l;k++)u.push(null);else u=g.aoColumns;k=0;for(l=u.length;k<l;k++)Ia(r,e?e[k]:null);nb(r,g.aoColumnDefs,u,function(a,b){ma(r,a,b)});if(z.length){var B=function(a,b){return null!==a.getAttribute("data-"+b)?b:null};f(z[0]).children("th, td").each(function(a,b){var c=r.aoColumns[a];if(c.mData===a){var d=B(b,"sort")||B(b,"order");b=B(b,"filter")||B(b,"search");if(null!==d||null!==b)c.mData={_:a+".display",sort:null!==d?a+".@data-"+
|
||
|
d:p,type:null!==d?a+".@data-"+d:p,filter:null!==b?a+".@data-"+b:p},ma(r,a)}})}var C=r.oFeatures;e=function(){if(g.aaSorting===p){var a=r.aaSorting;k=0;for(l=a.length;k<l;k++)a[k][1]=r.aoColumns[k].asSorting[0]}Aa(r);C.bSort&&E(r,"aoDrawCallback",function(){if(r.bSorted){var a=Y(r),b={};f.each(a,function(a,c){b[c.src]=c.dir});A(r,null,"order",[r,a,b]);Nb(r)}});E(r,"aoDrawCallback",function(){(r.bSorted||"ssp"===D(r)||C.bDeferRender)&&Aa(r)},"sc");a=w.children("caption").each(function(){this._captionSide=
|
||
|
f(this).css("caption-side")});var b=w.children("thead");0===b.length&&(b=f("<thead/>").appendTo(w));r.nTHead=b[0];b=w.children("tbody");0===b.length&&(b=f("<tbody/>").appendTo(w));r.nTBody=b[0];b=w.children("tfoot");0===b.length&&0<a.length&&(""!==r.oScroll.sX||""!==r.oScroll.sY)&&(b=f("<tfoot/>").appendTo(w));0===b.length||0===b.children().length?w.addClass(x.sNoFooter):0<b.length&&(r.nTFoot=b[0],fa(r.aoFooter,r.nTFoot));if(g.aaData)for(k=0;k<g.aaData.length;k++)R(r,g.aaData[k]);else(r.bDeferLoading||
|
||
|
"dom"==D(r))&&pa(r,f(r.nTBody).children("tr"));r.aiDisplay=r.aiDisplayMaster.slice();r.bInitialised=!0;!1===n&&ja(r)};g.bStateSave?(C.bStateSave=!0,E(r,"aoDrawCallback",Ba,"state_save"),Ob(r,g,e)):e()}});b=null;return this},C,t,x,cb={},Rb=/[\r\n\u2028]/g,Ea=/<.*?>/g,cc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,dc=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,bb=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,P=function(a){return a&&!0!==a&&"-"!==a?!1:
|
||
|
!0},Sb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Tb=function(a,b){cb[b]||(cb[b]=new RegExp(Ua(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(cb[b],"."):a},db=function(a,b,c){var d="string"===typeof a;if(P(a))return!0;b&&d&&(a=Tb(a,b));c&&d&&(a=a.replace(bb,""));return!isNaN(parseFloat(a))&&isFinite(a)},Ub=function(a,b,c){return P(a)?!0:P(a)||"string"===typeof a?db(a.replace(Ea,""),b,c)?!0:null:null},J=function(a,b,c){var d=[],e=0,h=a.length;if(c!==
|
||
|
p)for(;e<h;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<h;e++)a[e]&&d.push(a[e][b]);return d},la=function(a,b,c,d){var e=[],h=0,g=b.length;if(d!==p)for(;h<g;h++)a[b[h]][c]&&e.push(a[b[h]][c][d]);else for(;h<g;h++)e.push(a[b[h]][c]);return e},Z=function(a,b){var c=[];if(b===p){b=0;var d=a}else d=b,b=a;for(a=b;a<d;a++)c.push(a);return c},Vb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);return b},ta=function(a){a:{if(!(2>a.length)){var b=a.slice().sort();for(var c=b[0],d=1,
|
||
|
e=b.length;d<e;d++){if(b[d]===c){b=!1;break a}c=b[d]}}b=!0}if(b)return a.slice();b=[];e=a.length;var h,g=0;d=0;a:for(;d<e;d++){c=a[d];for(h=0;h<g;h++)if(b[h]===c)continue a;b.push(c);g++}return b};q.util={throttle:function(a,b){var c=b!==p?b:200,d,e;return function(){var b=this,g=+new Date,f=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=p;a.apply(b,f)},c)):(d=g,a.apply(b,f))}},escapeRegex:function(a){return a.replace(dc,"\\$1")}};var F=function(a,b,c){a[b]!==p&&(a[c]=a[b])},da=/\[.*?\]$/,
|
||
|
X=/\(\)$/,Ua=q.util.escapeRegex,ya=f("<div>")[0],$b=ya.textContent!==p,bc=/<.*?>/g,Sa=q.util.throttle,Wb=[],G=Array.prototype,ec=function(a){var b,c=q.settings,d=f.map(c,function(a,b){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e=f.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?b=f(a):a instanceof f&&(b=a)}else return[];if(b)return b.map(function(a){e=f.inArray(this,
|
||
|
d);return-1!==e?c[e]:null}).toArray()};var v=function(a,b){if(!(this instanceof v))return new v(a,b);var c=[],d=function(a){(a=ec(a))&&c.push.apply(c,a)};if(f.isArray(a))for(var e=0,h=a.length;e<h;e++)d(a[e]);else d(a);this.context=ta(c);b&&f.merge(this,b);this.selector={rows:null,cols:null,opts:null};v.extend(this,this,Wb)};q.Api=v;f.extend(v.prototype,{any:function(){return 0!==this.count()},concat:G.concat,context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=
|
||
|
this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new v(b[a],this[a]):null},filter:function(a){var b=[];if(G.filter)b=G.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new v(this.context,b)},flatten:function(){var a=[];return new v(this.context,a.concat.apply(a,this.toArray()))},join:G.join,indexOf:G.indexOf||function(a,b){b=b||0;for(var c=this.length;b<c;b++)if(this[b]===
|
||
|
a)return b;return-1},iterator:function(a,b,c,d){var e=[],h,g,f=this.context,l,n=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);var m=0;for(h=f.length;m<h;m++){var q=new v(f[m]);if("table"===b){var u=c.call(q,f[m],m);u!==p&&e.push(u)}else if("columns"===b||"rows"===b)u=c.call(q,f[m],this[m],m),u!==p&&e.push(u);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){var t=this[m];"column-rows"===b&&(l=Fa(f[m],n.opts));var x=0;for(g=t.length;x<g;x++)u=t[x],u="cell"===b?c.call(q,f[m],u.row,
|
||
|
u.column,m,x):c.call(q,f[m],u,m,x,l),u!==p&&e.push(u)}}return e.length||d?(a=new v(f,a?e.concat.apply([],e):e),b=a.selector,b.rows=n.rows,b.cols=n.cols,b.opts=n.opts,a):this},lastIndexOf:G.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(G.map)b=G.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new v(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},
|
||
|
pop:G.pop,push:G.push,reduce:G.reduce||function(a,b){return mb(this,a,b,0,this.length,1)},reduceRight:G.reduceRight||function(a,b){return mb(this,a,b,this.length-1,-1,-1)},reverse:G.reverse,selector:null,shift:G.shift,slice:function(){return new v(this.context,this)},sort:G.sort,splice:G.splice,toArray:function(){return G.slice.call(this)},to$:function(){return f(this)},toJQuery:function(){return f(this)},unique:function(){return new v(this.context,ta(this))},unshift:G.unshift});v.extend=function(a,
|
||
|
b,c){if(c.length&&b&&(b instanceof v||b.__dt_wrapper)){var d,e=function(a,b,c){return function(){var d=b.apply(a,arguments);v.extend(d,d,c.methodExt);return d}};var h=0;for(d=c.length;h<d;h++){var g=c[h];b[g.name]="function"===g.type?e(a,g.val,g):"object"===g.type?{}:g.val;b[g.name].__dt_wrapper=!0;v.extend(a,b[g.name],g.propExt)}}};v.register=t=function(a,b){if(f.isArray(a))for(var c=0,d=a.length;c<d;c++)v.register(a[c],b);else{d=a.split(".");var e=Wb,h;a=0;for(c=d.length;a<c;a++){var g=(h=-1!==
|
||
|
d[a].indexOf("()"))?d[a].replace("()",""):d[a];a:{var k=0;for(var l=e.length;k<l;k++)if(e[k].name===g){k=e[k];break a}k=null}k||(k={name:g,val:{},methodExt:[],propExt:[],type:"object"},e.push(k));a===c-1?(k.val=b,k.type="function"===typeof b?"function":f.isPlainObject(b)?"object":"other"):e=h?k.methodExt:k.propExt}}};v.registerPlural=x=function(a,b,c){v.register(a,c);v.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof v?a.length?f.isArray(a[0])?new v(a.context,
|
||
|
a[0]):a[0]:p:a})};var fc=function(a,b){if("number"===typeof a)return[b[a]];var c=f.map(b,function(a,b){return a.nTable});return f(c).filter(a).map(function(a){a=f.inArray(this,c);return b[a]}).toArray()};t("tables()",function(a){return a?new v(fc(a,this.context)):this});t("table()",function(a){a=this.tables(a);var b=a.context;return b.length?new v(b[0]):a});x("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});x("tables().body()","table().body()",
|
||
|
function(){return this.iterator("table",function(a){return a.nTBody},1)});x("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});x("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});x("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});t("draw()",function(a){return this.iterator("table",function(b){"page"===
|
||
|
a?S(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),V(b,!1===a))})});t("page()",function(a){return a===p?this.page.info().page:this.iterator("table",function(b){Xa(b,a)})});t("page.info()",function(a){if(0===this.context.length)return p;a=this.context[0];var b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d,
|
||
|
serverSide:"ssp"===D(a)}});t("page.len()",function(a){return a===p?0!==this.context.length?this.context[0]._iDisplayLength:p:this.iterator("table",function(b){Va(b,a)})});var Xb=function(a,b,c){if(c){var d=new v(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==D(a))V(a,b);else{K(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();va(a,[],function(c){qa(a);c=wa(a,c);for(var d=0,e=c.length;d<e;d++)R(a,c[d]);V(a,b);K(a,!1)})}};t("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});
|
||
|
t("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});t("ajax.reload()",function(a,b){return this.iterator("table",function(c){Xb(c,!1===b,a)})});t("ajax.url()",function(a){var b=this.context;if(a===p){if(0===b.length)return p;b=b[0];return b.ajax?f.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){f.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});t("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Xb(c,
|
||
|
!1===b,a)})});var eb=function(a,b,c,d,e){var h=[],g,k,l;var n=typeof b;b&&"string"!==n&&"function"!==n&&b.length!==p||(b=[b]);n=0;for(k=b.length;n<k;n++){var m=b[n]&&b[n].split&&!b[n].match(/[\[\(:]/)?b[n].split(","):[b[n]];var q=0;for(l=m.length;q<l;q++)(g=c("string"===typeof m[q]?f.trim(m[q]):m[q]))&&g.length&&(h=h.concat(g))}a=C.selector[a];if(a.length)for(n=0,k=a.length;n<k;n++)h=a[n](d,e,h);return ta(h)},fb=function(a){a||(a={});a.filter&&a.search===p&&(a.search=a.filter);return f.extend({search:"none",
|
||
|
order:"current",page:"all"},a)},gb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Fa=function(a,b){var c=[],d=a.aiDisplay;var e=a.aiDisplayMaster;var h=b.search;var g=b.order;b=b.page;if("ssp"==D(a))return"removed"===h?[]:Z(0,e.length);if("current"==b)for(g=a._iDisplayStart,a=a.fnDisplayEnd();g<a;g++)c.push(d[g]);else if("current"==g||"applied"==g)if("none"==h)c=e.slice();else if("applied"==h)c=
|
||
|
d.slice();else{if("removed"==h){var k={};g=0;for(a=d.length;g<a;g++)k[d[g]]=null;c=f.map(e,function(a){return k.hasOwnProperty(a)?null:a})}}else if("index"==g||"original"==g)for(g=0,a=a.aoData.length;g<a;g++)"none"==h?c.push(g):(e=f.inArray(g,d),(-1===e&&"removed"==h||0<=e&&"applied"==h)&&c.push(g));return c},gc=function(a,b,c){var d;return eb("row",b,function(b){var e=Sb(b),g=a.aoData;if(null!==e&&!c)return[e];d||(d=Fa(a,c));if(null!==e&&-1!==f.inArray(e,d))return[e];if(null===b||b===p||""===b)return d;
|
||
|
if("function"===typeof b)return f.map(d,function(a){var c=g[a];return b(a,c._aData,c.nTr)?a:null});if(b.nodeName){e=b._DT_RowIndex;var k=b._DT_CellIndex;if(e!==p)return g[e]&&g[e].nTr===b?[e]:[];if(k)return g[k.row]&&g[k.row].nTr===b.parentNode?[k.row]:[];e=f(b).closest("*[data-dt-row]");return e.length?[e.data("dt-row")]:[]}if("string"===typeof b&&"#"===b.charAt(0)&&(e=a.aIds[b.replace(/^#/,"")],e!==p))return[e.idx];e=Vb(la(a.aoData,d,"nTr"));return f(e).filter(b).map(function(){return this._DT_RowIndex}).toArray()},
|
||
|
a,c)};t("rows()",function(a,b){a===p?a="":f.isPlainObject(a)&&(b=a,a="");b=fb(b);var c=this.iterator("table",function(c){return gc(c,a,b)},1);c.selector.rows=a;c.selector.opts=b;return c});t("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||p},1)});t("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return la(a.aoData,b,"_aData")},1)});x("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){b=b.aoData[c];
|
||
|
return"search"===a?b._aFilterData:b._aSortData},1)});x("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ea(b,c,a)})});x("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});x("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,d=0,e=c.length;d<e;d++)for(var h=0,g=this[d].length;h<g;h++){var f=c[d].rowIdFn(c[d].aoData[this[d][h]]._aData);b.push((!0===a?"#":"")+f)}return new v(c,b)});x("rows().remove()",
|
||
|
"row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,h=e[c],g,f;e.splice(c,1);var l=0;for(g=e.length;l<g;l++){var n=e[l];var m=n.anCells;null!==n.nTr&&(n.nTr._DT_RowIndex=l);if(null!==m)for(n=0,f=m.length;n<f;n++)m[n]._DT_CellIndex.row=l}ra(b.aiDisplayMaster,c);ra(b.aiDisplay,c);ra(a[d],c,!1);0<b._iRecordsDisplay&&b._iRecordsDisplay--;Wa(b);c=b.rowIdFn(h._aData);c!==p&&delete b.aIds[c]});this.iterator("table",function(a){for(var b=0,d=a.aoData.length;b<d;b++)a.aoData[b].idx=
|
||
|
b});return this});t("rows.add()",function(a){var b=this.iterator("table",function(b){var c,d=[];var g=0;for(c=a.length;g<c;g++){var f=a[g];f.nodeName&&"TR"===f.nodeName.toUpperCase()?d.push(pa(b,f)[0]):d.push(R(b,f))}return d},1),c=this.rows(-1);c.pop();f.merge(c,b);return c});t("row()",function(a,b){return gb(this.rows(a,b))});t("row().data()",function(a){var b=this.context;if(a===p)return b.length&&this.length?b[0].aoData[this[0]]._aData:p;var c=b[0].aoData[this[0]];c._aData=a;f.isArray(a)&&c.nTr.id&&
|
||
|
Q(b[0].rowId)(a,c.nTr.id);ea(b[0],this[0],"data");return this});t("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});t("row.add()",function(a){a instanceof f&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?pa(b,a)[0]:R(b,a)});return this.row(b[0])});var hc=function(a,b,c,d){var e=[],h=function(b,c){if(f.isArray(b)||b instanceof f)for(var d=0,g=b.length;d<g;d++)h(b[d],c);else b.nodeName&&
|
||
|
"tr"===b.nodeName.toLowerCase()?e.push(b):(d=f("<tr><td/></tr>").addClass(c),f("td",d).addClass(c).html(b)[0].colSpan=W(a),e.push(d[0]))};h(c,d);b._details&&b._details.detach();b._details=f(e);b._detailsShow&&b._details.insertAfter(b.nTr)},hb=function(a,b){var c=a.context;c.length&&(a=c[0].aoData[b!==p?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=p,a._details=p)},Yb=function(a,b){var c=a.context;c.length&&a.length&&(a=c[0].aoData[a[0]],a._details&&((a._detailsShow=b)?a._details.insertAfter(a.nTr):
|
||
|
a._details.detach(),ic(c[0])))},ic=function(a){var b=new v(a),c=a.aoData;b.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<J(c,"_details").length&&(b.on("draw.dt.DT_details",function(d,e){a===e&&b.rows({page:"current"}).eq(0).each(function(a){a=c[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),b.on("column-visibility.dt.DT_details",function(b,e,f,g){if(a===e)for(e=W(e),f=0,g=c.length;f<g;f++)b=c[f],b._details&&b._details.children("td[colspan]").attr("colspan",
|
||
|
e)}),b.on("destroy.dt.DT_details",function(d,e){if(a===e)for(d=0,e=c.length;d<e;d++)c[d]._details&&hb(b,d)}))};t("row().child()",function(a,b){var c=this.context;if(a===p)return c.length&&this.length?c[0].aoData[this[0]]._details:p;!0===a?this.child.show():!1===a?hb(this):c.length&&this.length&&hc(c[0],c[0].aoData[this[0]],a,b);return this});t(["row().child.show()","row().child().show()"],function(a){Yb(this,!0);return this});t(["row().child.hide()","row().child().hide()"],function(){Yb(this,!1);
|
||
|
return this});t(["row().child.remove()","row().child().remove()"],function(){hb(this);return this});t("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var jc=/^([^:]+):(name|visIdx|visible)$/,Zb=function(a,b,c,d,e){c=[];d=0;for(var f=e.length;d<f;d++)c.push(I(a,e[d],b));return c},kc=function(a,b,c){var d=a.aoColumns,e=J(d,"sName"),h=J(d,"nTh");return eb("column",b,function(b){var g=Sb(b);if(""===b)return Z(d.length);if(null!==
|
||
|
g)return[0<=g?g:d.length+g];if("function"===typeof b){var l=Fa(a,c);return f.map(d,function(c,d){return b(d,Zb(a,d,0,0,l),h[d])?d:null})}var n="string"===typeof b?b.match(jc):"";if(n)switch(n[2]){case "visIdx":case "visible":g=parseInt(n[1],10);if(0>g){var m=f.map(d,function(a,b){return a.bVisible?b:null});return[m[m.length+g]]}return[ba(a,g)];case "name":return f.map(e,function(a,b){return a===n[1]?b:null});default:return[]}if(b.nodeName&&b._DT_CellIndex)return[b._DT_CellIndex.column];g=f(h).filter(b).map(function(){return f.inArray(this,
|
||
|
h)}).toArray();if(g.length||!b.nodeName)return g;g=f(b).closest("*[data-dt-column]");return g.length?[g.data("dt-column")]:[]},a,c)};t("columns()",function(a,b){a===p?a="":f.isPlainObject(a)&&(b=a,a="");b=fb(b);var c=this.iterator("table",function(c){return kc(c,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});x("columns().header()","column().header()",function(a,b){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});x("columns().footer()","column().footer()",function(a,
|
||
|
b){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});x("columns().data()","column().data()",function(){return this.iterator("column-rows",Zb,1)});x("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});x("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return la(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});x("columns().nodes()",
|
||
|
"column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return la(a.aoData,e,"anCells",b)},1)});x("columns().visible()","column().visible()",function(a,b){var c=this,d=this.iterator("column",function(b,c){if(a===p)return b.aoColumns[c].bVisible;var d=b.aoColumns,e=d[c],h=b.aoData,n;if(a!==p&&e.bVisible!==a){if(a){var m=f.inArray(!0,J(d,"bVisible"),c+1);d=0;for(n=h.length;d<n;d++){var q=h[d].nTr;b=h[d].anCells;q&&q.insertBefore(b[c],b[m]||null)}}else f(J(b.aoData,"anCells",
|
||
|
c)).detach();e.bVisible=a}});a!==p&&this.iterator("table",function(d){ha(d,d.aoHeader);ha(d,d.aoFooter);d.aiDisplay.length||f(d.nTBody).find("td[colspan]").attr("colspan",W(d));Ba(d);c.iterator("column",function(c,d){A(c,null,"column-visibility",[c,d,a,b])});(b===p||b)&&c.columns.adjust()});return d});x("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?ca(b,c):c},1)});t("columns.adjust()",function(){return this.iterator("table",function(a){aa(a)},
|
||
|
1)});t("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return ba(c,b);if("fromData"===a||"toVisible"===a)return ca(c,b)}});t("column()",function(a,b){return gb(this.columns(a,b))});var lc=function(a,b,c){var d=a.aoData,e=Fa(a,c),h=Vb(la(d,e,"anCells")),g=f([].concat.apply([],h)),k,l=a.aoColumns.length,n,m,q,u,t,v;return eb("cell",b,function(b){var c="function"===typeof b;if(null===b||b===p||c){n=[];m=0;for(q=e.length;m<q;m++)for(k=
|
||
|
e[m],u=0;u<l;u++)t={row:k,column:u},c?(v=d[k],b(t,I(a,k,u),v.anCells?v.anCells[u]:null)&&n.push(t)):n.push(t);return n}if(f.isPlainObject(b))return b.column!==p&&b.row!==p&&-1!==f.inArray(b.row,e)?[b]:[];c=g.filter(b).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray();if(c.length||!b.nodeName)return c;v=f(b).closest("*[data-dt-row]");return v.length?[{row:v.data("dt-row"),column:v.data("dt-column")}]:[]},a,c)};t("cells()",function(a,b,c){f.isPlainObject(a)&&
|
||
|
(a.row===p?(c=a,a=null):(c=b,b=null));f.isPlainObject(b)&&(c=b,b=null);if(null===b||b===p)return this.iterator("table",function(b){return lc(b,a,fb(c))});var d=c?{page:c.page,order:c.order,search:c.search}:{},e=this.columns(b,d),h=this.rows(a,d),g,k,l,n;d=this.iterator("table",function(a,b){a=[];g=0;for(k=h[b].length;g<k;g++)for(l=0,n=e[b].length;l<n;l++)a.push({row:h[b][g],column:e[b][l]});return a},1);d=c&&c.selected?this.cells(d,c):d;f.extend(d.selector,{cols:b,rows:a,opts:c});return d});x("cells().nodes()",
|
||
|
"cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&a.anCells?a.anCells[c]:p},1)});t("cells().data()",function(){return this.iterator("cell",function(a,b,c){return I(a,b,c)},1)});x("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});x("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return I(b,c,d,a)},
|
||
|
1)});x("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:ca(a,c)}},1)});x("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){ea(b,c,a,d)})});t("cell()",function(a,b,c){return gb(this.cells(a,b,c))});t("cell().data()",function(a){var b=this.context,c=this[0];if(a===p)return b.length&&c.length?I(b[0],c[0].row,c[0].column):p;ob(b[0],c[0].row,c[0].column,a);ea(b[0],c[0].row,
|
||
|
"data",c[0].column);return this});t("order()",function(a,b){var c=this.context;if(a===p)return 0!==c.length?c[0].aaSorting:p;"number"===typeof a?a=[[a,b]]:a.length&&!f.isArray(a[0])&&(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});t("order.listener()",function(a,b,c){return this.iterator("table",function(d){Qa(d,a,b,c)})});t("order.fixed()",function(a){if(!a){var b=this.context;b=b.length?b[0].aaSortingFixed:p;return f.isArray(b)?{pre:b}:
|
||
|
b}return this.iterator("table",function(b){b.aaSortingFixed=f.extend(!0,{},a)})});t(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];f.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});t("search()",function(a,b,c,d){var e=this.context;return a===p?0!==e.length?e[0].oPreviousSearch.sSearch:p:this.iterator("table",function(e){e.oFeatures.bFilter&&ia(e,f.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===
|
||
|
c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});x("columns().search()","column().search()",function(a,b,c,d){return this.iterator("column",function(e,h){var g=e.aoPreSearchCols;if(a===p)return g[h].sSearch;e.oFeatures.bFilter&&(f.extend(g[h],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),ia(e,e.oPreviousSearch,1))})});t("state()",function(){return this.context.length?this.context[0].oSavedState:null});t("state.clear()",function(){return this.iterator("table",
|
||
|
function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});t("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});t("state.save()",function(){return this.iterator("table",function(a){Ba(a)})});q.versionCheck=q.fnVersionCheck=function(a){var b=q.version.split(".");a=a.split(".");for(var c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};q.isDataTable=q.fnIsDataTable=function(a){var b=f(a).get(0),c=!1;if(a instanceof
|
||
|
q.Api)return!0;f.each(q.settings,function(a,e){a=e.nScrollHead?f("table",e.nScrollHead)[0]:null;var d=e.nScrollFoot?f("table",e.nScrollFoot)[0]:null;if(e.nTable===b||a===b||d===b)c=!0});return c};q.tables=q.fnTables=function(a){var b=!1;f.isPlainObject(a)&&(b=a.api,a=a.visible);var c=f.map(q.settings,function(b){if(!a||a&&f(b.nTable).is(":visible"))return b.nTable});return b?new v(c):c};q.camelToHungarian=L;t("$()",function(a,b){b=this.rows(b).nodes();b=f(b);return f([].concat(b.filter(a).toArray(),
|
||
|
b.find(a).toArray()))});f.each(["on","one","off"],function(a,b){t(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0]=f.map(a[0].split(/\s/),function(a){return a.match(/\.dt\b/)?a:a+".dt"}).join(" ");var d=f(this.tables().nodes());d[b].apply(d,a);return this})});t("clear()",function(){return this.iterator("table",function(a){qa(a)})});t("settings()",function(){return new v(this.context,this.context)});t("init()",function(){var a=this.context;return a.length?a[0].oInit:null});t("data()",
|
||
|
function(){return this.iterator("table",function(a){return J(a.aoData,"_aData")}).flatten()});t("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,h=b.nTBody,g=b.nTHead,k=b.nTFoot,l=f(e);h=f(h);var n=f(b.nTableWrapper),m=f.map(b.aoData,function(a){return a.nTr}),p;b.bDestroying=!0;A(b,"aoDestroyCallback","destroy",[b]);a||(new v(b)).columns().visible(!0);n.off(".DT").find(":not(tbody *)").off(".DT");f(z).off(".DT-"+b.sInstance);
|
||
|
e!=g.parentNode&&(l.children("thead").detach(),l.append(g));k&&e!=k.parentNode&&(l.children("tfoot").detach(),l.append(k));b.aaSorting=[];b.aaSortingFixed=[];Aa(b);f(m).removeClass(b.asStripeClasses.join(" "));f("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);h.children().detach();h.append(m);g=a?"remove":"detach";l[g]();n[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),l.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&
|
||
|
h.children().each(function(a){f(this).addClass(b.asDestroyStripes[a%p])}));c=f.inArray(b,q.settings);-1!==c&&q.settings.splice(c,1)})});f.each(["column","row","cell"],function(a,b){t(b+"s().every()",function(a){var c=this.selector.opts,e=this;return this.iterator(b,function(d,f,k,l,n){a.call(e[b](f,"cell"===b?k:c,"cell"===b?c:p),f,k,l,n)})})});t("i18n()",function(a,b,c){var d=this.context[0];a=U(a)(d.oLanguage);a===p&&(a=b);c!==p&&f.isPlainObject(a)&&(a=a[c]!==p?a[c]:a._);return a.replace("%d",c)});
|
||
|
q.version="1.10.20";q.settings=[];q.models={};q.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};q.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};q.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,
|
||
|
sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};q.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,
|
||
|
bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},
|
||
|
fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",
|
||
|
sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:f.extend({},q.models.oSearch),sAjaxDataProp:"data",
|
||
|
sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};H(q.defaults);q.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};H(q.defaults.column);q.models.oSettings=
|
||
|
{oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},
|
||
|
aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,
|
||
|
aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:p,oAjaxData:p,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==D(this)?1*this._iRecordsTotal:
|
||
|
this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==D(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};q.ext=C={buttons:{},
|
||
|
classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:q.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:q.version};f.extend(C,{afnFiltering:C.search,aTypes:C.type.detect,ofnSearch:C.type.search,oSort:C.type.order,afnSortData:C.order,aoFeatures:C.feature,oApi:C.internal,oStdClasses:C.classes,oPagination:C.pager});
|
||
|
f.extend(q.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",
|
||
|
sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",
|
||
|
sJUIHeader:"",sJUIFooter:""});var Pb=q.ext.pager;f.extend(Pb,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[ka(a,b)]},simple_numbers:function(a,b){return["previous",ka(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ka(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ka(a,b),"last"]},_numbers:ka,numbers_length:7});f.extend(!0,q.ext.renderer,{pageButton:{_:function(a,b,
|
||
|
c,d,e,h){var g=a.oClasses,k=a.oLanguage.oPaginate,l=a.oLanguage.oAria.paginate||{},n,m,q=0,t=function(b,d){var p,r=g.sPageButtonDisabled,u=function(b){Xa(a,b.data.action,!0)};var w=0;for(p=d.length;w<p;w++){var v=d[w];if(f.isArray(v)){var x=f("<"+(v.DT_el||"div")+"/>").appendTo(b);t(x,v)}else{n=null;m=v;x=a.iTabIndex;switch(v){case "ellipsis":b.append('<span class="ellipsis">…</span>');break;case "first":n=k.sFirst;0===e&&(x=-1,m+=" "+r);break;case "previous":n=k.sPrevious;0===e&&(x=-1,m+=
|
||
|
" "+r);break;case "next":n=k.sNext;e===h-1&&(x=-1,m+=" "+r);break;case "last":n=k.sLast;e===h-1&&(x=-1,m+=" "+r);break;default:n=v+1,m=e===v?g.sPageButtonActive:""}null!==n&&(x=f("<a>",{"class":g.sPageButton+" "+m,"aria-controls":a.sTableId,"aria-label":l[v],"data-dt-idx":q,tabindex:x,id:0===c&&"string"===typeof v?a.sTableId+"_"+v:null}).html(n).appendTo(b),$a(x,{action:v},u),q++)}}};try{var v=f(b).find(y.activeElement).data("dt-idx")}catch(mc){}t(f(b).empty(),d);v!==p&&f(b).find("[data-dt-idx="+
|
||
|
v+"]").focus()}}});f.extend(q.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return db(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!cc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||P(a)?"date":null},function(a,b){b=b.oLanguage.sDecimal;return db(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return Ub(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return Ub(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return P(a)||"string"===
|
||
|
typeof a&&-1!==a.indexOf("<")?"html":null}]);f.extend(q.ext.type.search,{html:function(a){return P(a)?a:"string"===typeof a?a.replace(Rb," ").replace(Ea,""):""},string:function(a){return P(a)?a:"string"===typeof a?a.replace(Rb," "):a}});var Da=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Tb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};f.extend(C.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return P(a)?
|
||
|
"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return P(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});Ha("");f.extend(!0,q.ext.renderer,{header:{_:function(a,b,c,d){f(a.nTable).on("order.dt.DT",function(e,f,g,k){a===f&&(e=c.idx,b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass("asc"==k[e]?d.sSortAsc:"desc"==k[e]?d.sSortDesc:
|
||
|
c.sSortingClass))})},jqueryui:function(a,b,c,d){f("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(f("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);f(a.nTable).on("order.dt.DT",function(e,f,g,k){a===f&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==k[e]?d.sSortAsc:"desc"==k[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"==
|
||
|
k[e]?d.sSortJUIAsc:"desc"==k[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var ib=function(a){return"string"===typeof a?a.replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):a};q.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return ib(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
|
||
|
a)+f+(e||"")}}},text:function(){return{display:ib,filter:ib}}};f.extend(q.ext.internal,{_fnExternApiFunc:Qb,_fnBuildAjax:va,_fnAjaxUpdate:qb,_fnAjaxParameters:zb,_fnAjaxUpdateDraw:Ab,_fnAjaxDataSrc:wa,_fnAddColumn:Ia,_fnColumnOptions:ma,_fnAdjustColumnSizing:aa,_fnVisibleToColumnIndex:ba,_fnColumnIndexToVisible:ca,_fnVisbleColumns:W,_fnGetColumns:oa,_fnColumnTypes:Ka,_fnApplyColumnDefs:nb,_fnHungarianMap:H,_fnCamelToHungarian:L,_fnLanguageCompat:Ga,_fnBrowserDetect:lb,_fnAddData:R,_fnAddTr:pa,_fnNodeToDataIndex:function(a,
|
||
|
b){return b._DT_RowIndex!==p?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return f.inArray(c,a.aoData[b].anCells)},_fnGetCellData:I,_fnSetCellData:ob,_fnSplitObjNotation:Na,_fnGetObjectDataFn:U,_fnSetObjectDataFn:Q,_fnGetDataMaster:Oa,_fnClearTable:qa,_fnDeleteIndex:ra,_fnInvalidate:ea,_fnGetRowElements:Ma,_fnCreateTr:La,_fnBuildHead:pb,_fnDrawHead:ha,_fnDraw:S,_fnReDraw:V,_fnAddOptionsHtml:sb,_fnDetectHeader:fa,_fnGetUniqueThs:ua,_fnFeatureHtmlFilter:ub,_fnFilterComplete:ia,_fnFilterCustom:Db,
|
||
|
_fnFilterColumn:Cb,_fnFilter:Bb,_fnFilterCreateSearch:Ta,_fnEscapeRegex:Ua,_fnFilterData:Eb,_fnFeatureHtmlInfo:xb,_fnUpdateInfo:Hb,_fnInfoMacros:Ib,_fnInitialise:ja,_fnInitComplete:xa,_fnLengthChange:Va,_fnFeatureHtmlLength:tb,_fnFeatureHtmlPaginate:yb,_fnPageChange:Xa,_fnFeatureHtmlProcessing:vb,_fnProcessingDisplay:K,_fnFeatureHtmlTable:wb,_fnScrollDraw:na,_fnApplyToChildren:N,_fnCalculateColumnWidths:Ja,_fnThrottle:Sa,_fnConvertToWidth:Jb,_fnGetWidestNode:Kb,_fnGetMaxLenString:Lb,_fnStringToCss:B,
|
||
|
_fnSortFlatten:Y,_fnSort:rb,_fnSortAria:Nb,_fnSortListener:Za,_fnSortAttachListener:Qa,_fnSortingClasses:Aa,_fnSortData:Mb,_fnSaveState:Ba,_fnLoadState:Ob,_fnSettingsFromNode:Ca,_fnLog:O,_fnMap:M,_fnBindAction:$a,_fnCallbackReg:E,_fnCallbackFire:A,_fnLengthOverflow:Wa,_fnRenderer:Ra,_fnDataSource:D,_fnRowAttributes:Pa,_fnExtend:ab,_fnCalculateEnd:function(){}});f.fn.dataTable=q;q.$=f;f.fn.dataTableSettings=q.settings;f.fn.dataTableExt=q.ext;f.fn.DataTable=function(a){return f(this).dataTable(a).api()};
|
||
|
f.each(q,function(a,b){f.fn.DataTable[a]=b});return f.fn.dataTable});
|
||
|
</script>
|
||
|
<style type="text/css">
|
||
|
.container-fluid.crosstalk-bscols {
|
||
|
margin-left: -30px;
|
||
|
margin-right: -30px;
|
||
|
white-space: normal;
|
||
|
}
|
||
|
|
||
|
body > .container-fluid.crosstalk-bscols {
|
||
|
margin-left: auto;
|
||
|
margin-right: auto;
|
||
|
}
|
||
|
.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {
|
||
|
display: inline-block;
|
||
|
padding-right: 12px;
|
||
|
vertical-align: top;
|
||
|
}
|
||
|
@media only screen and (max-width:480px) {
|
||
|
.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {
|
||
|
display: block;
|
||
|
padding-right: inherit;
|
||
|
}
|
||
|
}
|
||
|
</style>
|
||
|
<script>!function o(u,a,l){function s(n,e){if(!a[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(f)return f(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[n]={exports:{}};u[n][0].call(i.exports,function(e){var t=u[n][1][e];return s(t||e)},i,i.exports,o,u,a,l)}return a[n].exports}for(var f="function"==typeof require&&require,e=0;e<l.length;e++)s(l[e]);return s}({1:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}();var i=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._types={},this._seq=0}return r(e,[{key:"on",value:function(e,t){var n=this._types[e];n||(n=this._types[e]={});var r="sub"+this._seq++;return n[r]=t,r}},{key:"off",value:function(e,t){var n=this._types[e];if("function"==typeof t){for(var r in n)if(n.hasOwnProperty(r)&&n[r]===t)return delete n[r],r;return!1}if("string"==typeof t)return!(!n||!n[t])&&(delete n[t],t);throw new Error("Unexpected type for listener")}},{key:"trigger",value:function(e,t,n){var r=this._types[e];for(var i in r)r.hasOwnProperty(i)&&r[i].call(n,t)}}]),e}();n.default=i},{}],2:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.FilterHandle=void 0;var r=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}(),i=l(e("./events")),o=l(e("./filterset")),u=l(e("./group")),a=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(e("./util"));function l(e){return e&&e.__esModule?e:{default:e}}var s=1;n.FilterHandle=function(){function n(e,t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n),this._eventRelay=new i.default,this._emitter=new a.SubscriptionTracker(this._eventRelay),this._group=null,this._filterSet=null,this._filterVar=null,this._varOnChangeSub=null,this._extraInfo=a.extend({sender:this},t),this._id="filter"+s++,this.setGroup(e)}return r(n,[{key:"setGroup",value:function(e){var t,n,r=this;if(this._group!==e&&((this._group||e)&&(this._filterVar&&(this._filterVar.off("change",this._varOnChangeSub),this.clear(),this._varOnChangeSub=null,this._filterVar=null,this._filterSet=null),this._group=e))){e=(0,u.default)(e),this._filterSet=(t=e.var("filterset"),(n=t.get())||(n=new o.default,t.set(n)),n),this._filterVar=(0,u.default)(e).var("filter");var i=this._filterVar.on("change",function(e){r._eventRelay.trigger("change",e,r)});this._varOnChangeSub=i}}},{key:"_mergeExtraInfo",value:function(e){return a.extend({},this._extraInfo?this._extraInfo:null,e||null)}},{key:"close",value:function(){this._emitter.removeAllListeners(),this.clear(),this.setGroup(null)}},{key:"clear",value:function(e){this._filterSet&&(this._filterSet.clear(this._id),this._onChange(e))}},{key:"set",value:function(e,t){this._filterSet&&(this._filterSet.update(this._id,e),this._onChange(t))}},{key:"on",value:function(e,t){return this._emitter.on(e,t)}},{key:"off",value:function(e,t){return this._emitter.off(e,t)}},{key:"_onChange",value:function(e){this._filterSet&&this._filterVar.set(this._filterSet.value,this._mergeExtraInfo(e))}},{key:"filteredKeys",get:function(){return this._filterSet?this._filterSet.value:null}}]),n}()},{"./events":1,"./filterset":3,"./group":4,"./util":11}],3:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.k
|
||
|
//# sourceMappingURL=crosstalk.min.js.map</script>
|
||
|
<style type="text/css">
|
||
|
|
||
|
/*
|
||
|
Dashboard CSS from Keen IO Dashboards
|
||
|
(https://github.com/keen/dashboards)
|
||
|
*/
|
||
|
|
||
|
body {
|
||
|
background: #f2f2f2;
|
||
|
padding: 60px 0 0 8px; /* padding-top overridden by theme */
|
||
|
}
|
||
|
|
||
|
body hr {
|
||
|
border-color: #d7d7d7;
|
||
|
margin: 10px 0;
|
||
|
}
|
||
|
|
||
|
.navbar-inverse .navbar-nav > li > a,
|
||
|
.navbar .navbar-brand {
|
||
|
text-decoration: none;
|
||
|
}
|
||
|
|
||
|
.navbar-logo {
|
||
|
margin-top: 1px;
|
||
|
}
|
||
|
|
||
|
.navbar-logo img {
|
||
|
margin-right: 12px;
|
||
|
}
|
||
|
|
||
|
.navbar-author {
|
||
|
margin-left: 10px;
|
||
|
font-size: 15px;
|
||
|
}
|
||
|
|
||
|
.navbar .dropdown-menu .fa {
|
||
|
min-width: 20px;
|
||
|
}
|
||
|
|
||
|
.navbar .dropdown-menu {
|
||
|
min-width: 150px;
|
||
|
max-height: 500px;
|
||
|
overflow: auto;
|
||
|
}
|
||
|
|
||
|
.chart-wrapper,
|
||
|
.nav-tabs-custom,
|
||
|
.sbframe-commentary
|
||
|
{
|
||
|
background: #fff;
|
||
|
border: 1px solid #e2e2e2;
|
||
|
border-radius: 3px;
|
||
|
margin-bottom: 8px;
|
||
|
margin-right: 8px;
|
||
|
}
|
||
|
|
||
|
.chart-title {
|
||
|
border-bottom: 1px solid #d7d7d7;
|
||
|
color: #666;
|
||
|
font-size: 14px;
|
||
|
font-weight: 300;
|
||
|
padding: 7px 10px 4px;
|
||
|
}
|
||
|
|
||
|
.chart-wrapper .chart-title:empty {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
.chart-wrapper .chart-stage {
|
||
|
overflow: hidden;
|
||
|
padding: 5px 10px;
|
||
|
position: relative;
|
||
|
}
|
||
|
|
||
|
.chart-wrapper .chart-notes {
|
||
|
background: #fbfbfb;
|
||
|
border-top: 1px solid #e2e2e2;
|
||
|
color: #808080;
|
||
|
font-size: 12px;
|
||
|
padding: 8px 10px 5px;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
CSS for handling flexbox layout
|
||
|
*/
|
||
|
|
||
|
#dashboard-container {
|
||
|
visibility: hidden;
|
||
|
}
|
||
|
|
||
|
.tab-content>.dashboard-page-wrapper.active {
|
||
|
display: -webkit-box;
|
||
|
display: -webkit-flex;
|
||
|
display: -ms-flexbox;
|
||
|
display: flex;
|
||
|
}
|
||
|
|
||
|
.dashboard-page-wrapper {
|
||
|
display: -webkit-box;
|
||
|
display: -webkit-flex;
|
||
|
display: -ms-flexbox;
|
||
|
display: flex;
|
||
|
-webkit-box-orient: vertical;
|
||
|
-webkit-box-direction: normal;
|
||
|
-webkit-flex-direction: column;
|
||
|
-ms-flex-direction: column;
|
||
|
flex-direction: column;
|
||
|
}
|
||
|
|
||
|
.dashboard-row-orientation {
|
||
|
display: -webkit-box;
|
||
|
display: -webkit-flex;
|
||
|
display: -ms-flexbox;
|
||
|
display: flex;
|
||
|
-webkit-box-orient: vertical;
|
||
|
-webkit-box-direction: normal;
|
||
|
-webkit-flex-direction: column;
|
||
|
-ms-flex-direction: column;
|
||
|
flex-direction: column;
|
||
|
}
|
||
|
|
||
|
.dashboard-row {
|
||
|
display: -webkit-box;
|
||
|
display: -webkit-flex;
|
||
|
display: -ms-flexbox;
|
||
|
display: flex;
|
||
|
-webkit-box-orient: horizontal;
|
||
|
-webkit-box-direction: normal;
|
||
|
-webkit-flex-direction: row;
|
||
|
-ms-flex-direction: row;
|
||
|
flex-direction: row;
|
||
|
}
|
||
|
|
||
|
.dashboard-row-flex {
|
||
|
-webkit-box-flex: 1;
|
||
|
-webkit-flex: 1;
|
||
|
-ms-flex: 1;
|
||
|
flex: 1;
|
||
|
}
|
||
|
|
||
|
.dashboard-column-orientation {
|
||
|
display: -webkit-box;
|
||
|
display: -webkit-flex;
|
||
|
display: -ms-flexbox;
|
||
|
display: flex;
|
||
|
-webkit-box-orient: horizontal;
|
||
|
-webkit-box-direction: normal;
|
||
|
-webkit-flex-direction: row;
|
||
|
-ms-flex-direction: row;
|
||
|
flex-direction: row;
|
||
|
}
|
||
|
|
||
|
.dashboard-column {
|
||
|
-webkit-box-flex: 1;
|
||
|
-webkit-flex: 1;
|
||
|
-ms-flex: 1;
|
||
|
flex: 1;
|
||
|
display: -webkit-box;
|
||
|
display: -webkit-flex;
|
||
|
display: -ms-flexbox;
|
||
|
display: flex;
|
||
|
-webkit-box-orient: vertical;
|
||
|
-webkit-box-direction: normal;
|
||
|
-webkit-flex-direction: column;
|
||
|
-ms-flex-direction: column;
|
||
|
flex-direction: column;
|
||
|
}
|
||
|
|
||
|
.chart-wrapper-flex {
|
||
|
-webkit-box-flex: 1;
|
||
|
-webkit-flex: 1;
|
||
|
-ms-flex: 1;
|
||
|
flex: 1;
|
||
|
display: -webkit-box;
|
||
|
display: -webkit-flex;
|
||
|
display: -ms-flexbox;
|
||
|
display: flex;
|
||
|
-webkit-box-orient: vertical;
|
||
|
-webkit-box-direction: normal;
|
||
|
-webkit-flex-direction: column;
|
||
|
-ms-flex-direction: column;
|
||
|
flex-direction: column;
|
||
|
}
|
||
|
|
||
|
.chart-stage-flex {
|
||
|
-webkit-box-flex: 1;
|
||
|
-webkit-flex: 1;
|
||
|
-ms-flex: 1;
|
||
|
flex: 1;
|
||
|
position: relative;
|
||
|
}
|
||
|
|
||
|
.chart-shim {
|
||
|
position: absolute;
|
||
|
left: 8px; top: 8px; right: 8px; bottom: 8px;
|
||
|
}
|
||
|
|
||
|
.no-padding .chart-shim {
|
||
|
left: 0; top: 0; right: 0; bottom: 0;
|
||
|
}
|
||
|
|
||
|
.flowing-content-shim {
|
||
|
overflow: auto;
|
||
|
left: 0; top: 0; right: 0; bottom: 0;
|
||
|
padding-left: 8px;
|
||
|
padding-right: 8px;
|
||
|
}
|
||
|
|
||
|
.flowing-content-container {
|
||
|
padding-top: 8px;
|
||
|
padding-bottom: 8px;
|
||
|
}
|
||
|
|
||
|
.chart-stage .table-bordered {
|
||
|
border: none;
|
||
|
}
|
||
|
|
||
|
.chart-stage .table-bordered > tbody > tr > th,
|
||
|
.chart-stage .table-bordered > tfoot > tr > th,
|
||
|
.chart-stage .table-bordered > tbody > tr > td,
|
||
|
.chart-stage .table-bordered > tfoot > tr > td {
|
||
|
border: none;
|
||
|
}
|
||
|
|
||
|
.chart-stage .table-bordered > tbody > tr > td {
|
||
|
border-top: 1px solid #dddddd;
|
||
|
}
|
||
|
|
||
|
.chart-stage .table-bordered > thead > tr > th {
|
||
|
border: none;
|
||
|
border-bottom: 2px solid #dddddd;
|
||
|
}
|
||
|
|
||
|
.bootstrap-table table>thead {
|
||
|
background-color: #fff;
|
||
|
}
|
||
|
|
||
|
.bootstrap-table table.data,
|
||
|
.bootstrap-table table.shiny-table {
|
||
|
width: inherit !important;
|
||
|
}
|
||
|
|
||
|
.bootstrap-table table.data>tbody>tr>th,
|
||
|
.bootstrap-table table.shiny-table>tbody>tr>th {
|
||
|
border-top: none;
|
||
|
border-bottom: 2px solid #dddddd;
|
||
|
padding: 5px;
|
||
|
}
|
||
|
|
||
|
.bootstrap-table .data td[align=right] {
|
||
|
font-family: inherit;
|
||
|
}
|
||
|
|
||
|
.chart-wrapper form {
|
||
|
padding-left: 5px;
|
||
|
padding-right: 5px;
|
||
|
}
|
||
|
|
||
|
.shiny-input-container label {
|
||
|
font-weight: normal;
|
||
|
}
|
||
|
|
||
|
.chart-stage .html-widget {
|
||
|
width: 100% !important;
|
||
|
height: 100% !important;
|
||
|
}
|
||
|
|
||
|
.chart-stage .html-widget-static-bound {
|
||
|
width: 100% !important;
|
||
|
height: 100% !important;
|
||
|
}
|
||
|
|
||
|
.chart-stage .shiny-bound-output {
|
||
|
width: 100% !important;
|
||
|
height: 100% !important;
|
||
|
}
|
||
|
|
||
|
/* Omit display of empty paragraphs */
|
||
|
|
||
|
.chart-shim>p:empty {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
.chart-stage>p:empty {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
/* Omit display of special knitr options div*/
|
||
|
|
||
|
.chart-stage .knitr-options {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
/* Automatically resizing images */
|
||
|
|
||
|
.image-container {
|
||
|
position: absolute;
|
||
|
top: 0;
|
||
|
left: 0;
|
||
|
right: 0;
|
||
|
bottom: 0;
|
||
|
margin: 0;
|
||
|
}
|
||
|
|
||
|
.image-container img {
|
||
|
opacity: 0;
|
||
|
overflow: hidden;
|
||
|
}
|
||
|
|
||
|
/* Value box */
|
||
|
|
||
|
.value-box {
|
||
|
border-radius: 2px;
|
||
|
position: relative;
|
||
|
display: block;
|
||
|
margin-right: 8px;
|
||
|
margin-bottom: 8px;
|
||
|
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
|
||
|
}
|
||
|
|
||
|
.value-box > .inner {
|
||
|
padding: 10px;
|
||
|
padding-left: 20px;
|
||
|
padding-right: 20px;
|
||
|
}
|
||
|
|
||
|
.value-box .value {
|
||
|
font-size: 38px;
|
||
|
font-weight: bold;
|
||
|
margin: 0 0 3px 0;
|
||
|
white-space: nowrap;
|
||
|
padding: 0;
|
||
|
}
|
||
|
|
||
|
.value-box .caption {
|
||
|
font-size: 15px;
|
||
|
}
|
||
|
.value-box .caption > small {
|
||
|
display: block;
|
||
|
font-size: 13px;
|
||
|
margin-top: 5px;
|
||
|
}
|
||
|
|
||
|
.value-box .icon i {
|
||
|
position: absolute;
|
||
|
top: 15px;
|
||
|
right: 15px;
|
||
|
font-size: 80px;
|
||
|
color: rgba(0, 0, 0, 0.15);
|
||
|
}
|
||
|
|
||
|
.linked-value:hover {
|
||
|
cursor: pointer;
|
||
|
}
|
||
|
|
||
|
.value-box.linked-value:hover {
|
||
|
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
|
||
|
}
|
||
|
|
||
|
/* STORYBOARD */
|
||
|
|
||
|
.storyboard-nav button {
|
||
|
background: transparent;
|
||
|
border: 0;
|
||
|
opacity: .3;
|
||
|
outline: none;
|
||
|
padding: 0;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav button:hover,
|
||
|
.storyboard-nav button:hover {
|
||
|
opacity: .5;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav button:disabled,
|
||
|
.storyboard-nav button:disabled {
|
||
|
opacity: .1;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav .sbnext,
|
||
|
.storyboard-nav .sbprev {
|
||
|
float: left;
|
||
|
width: 2%;
|
||
|
height: 120px;
|
||
|
font-size: 50px;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav .sbprev {
|
||
|
text-align: left;
|
||
|
width: 2%;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav .sbnext {
|
||
|
float: right;
|
||
|
text-align: right;
|
||
|
margin-right: 8px;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav .sbframelist {
|
||
|
margin: 0 auto;
|
||
|
width: 94%;
|
||
|
height: 120px;
|
||
|
overflow: hidden;
|
||
|
text-shadow: none;
|
||
|
margin-bottom: 8px;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav .sbframelist ul {
|
||
|
list-style: none;
|
||
|
margin: 0;
|
||
|
padding: 0;
|
||
|
height: 100%;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav .sbframelist ul li {
|
||
|
float: left;
|
||
|
width: 270px;
|
||
|
height: 100%;
|
||
|
padding: 10px 10px 10px 10px;
|
||
|
margin-right: 8px;
|
||
|
background: #fff;
|
||
|
border: 1px solid #e2e2e2;
|
||
|
border-radius: 3px;
|
||
|
color: #3a3c47;
|
||
|
text-align: left;
|
||
|
font-size: 14px;
|
||
|
cursor: pointer;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav .sbframelist ul li:last-child {
|
||
|
margin-right: 0px;
|
||
|
}
|
||
|
|
||
|
.storyboard-nav .sbframelist ul li.active {
|
||
|
color: #fff;
|
||
|
background: #B8B8B8;
|
||
|
}
|
||
|
|
||
|
.sbframe-commentary {
|
||
|
width: 300px;
|
||
|
background: #fbfbfb;
|
||
|
font-size: 14px;
|
||
|
}
|
||
|
|
||
|
.sbframe-commentary ul {
|
||
|
padding-left: 22px;
|
||
|
}
|
||
|
|
||
|
.sbframe.active {
|
||
|
display: flex;
|
||
|
}
|
||
|
|
||
|
.sbframe:not(.active) {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
/* NAV TABS */
|
||
|
|
||
|
.nav-tabs-custom > .nav-tabs {
|
||
|
margin: 0;
|
||
|
border-bottom: 1px solid #d7d7d7;
|
||
|
color: #666;
|
||
|
font-size: 14px;
|
||
|
font-weight: 300;
|
||
|
border-top-right-radius: 3px;
|
||
|
border-top-left-radius: 3px;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li {
|
||
|
border-top: 3px solid transparent;
|
||
|
margin-bottom: -1px;
|
||
|
margin-right: 5px;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li > a,
|
||
|
.nav-tabs-custom > .nav-tabs > li > a:active {
|
||
|
color: #666;
|
||
|
font-weight: 300;
|
||
|
font-size: 14px;
|
||
|
border-radius: 0;
|
||
|
padding: 3px 10px 5px;
|
||
|
text-transform: none;
|
||
|
}
|
||
|
|
||
|
.nav-tabs-custom > .nav-tabs > li:not(.active) > a {
|
||
|
border-bottom-color: transparent;
|
||
|
}
|
||
|
|
||
|
.nav-tabs-custom > .nav-tabs > li > a.text-muted {
|
||
|
color: #999;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li > a,
|
||
|
.nav-tabs-custom > .nav-tabs > li > a:hover {
|
||
|
background: transparent;
|
||
|
margin: 0;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li > a:hover {
|
||
|
color: #999;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover,
|
||
|
.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus,
|
||
|
.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active {
|
||
|
border-color: transparent;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li.active {
|
||
|
border-top-color: #3c8dbc;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li.active > a,
|
||
|
.nav-tabs-custom > .nav-tabs > li.active:hover > a {
|
||
|
background-color: #fff;
|
||
|
color: #666;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li.active > a {
|
||
|
border-top-color: transparent;
|
||
|
border-left-color: #d7d7d7;
|
||
|
border-right-color: #d7d7d7;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li:first-of-type {
|
||
|
margin-left: 0;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a {
|
||
|
border-left-color: transparent;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs.pull-right {
|
||
|
float: none !important;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs.pull-right > li {
|
||
|
float: right;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type {
|
||
|
margin-right: 0;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a {
|
||
|
border-left-width: 1px;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a {
|
||
|
border-left-color: #d7d7d7;
|
||
|
border-right-color: transparent;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li.header {
|
||
|
line-height: 35px;
|
||
|
padding: 0 10px;
|
||
|
font-size: 20px;
|
||
|
color: #666;
|
||
|
}
|
||
|
.nav-tabs-custom > .nav-tabs > li.header > .fa,
|
||
|
.nav-tabs-custom > .nav-tabs > li.header > .glyphicon,
|
||
|
.nav-tabs-custom > .nav-tabs > li.header > .ion {
|
||
|
margin-right: 5px;
|
||
|
}
|
||
|
.nav-tabs-custom > .tab-content {
|
||
|
background: #fff;
|
||
|
padding: 0;
|
||
|
border-bottom-right-radius: 3px;
|
||
|
border-bottom-left-radius: 3px;
|
||
|
display: -webkit-box;
|
||
|
display: -webkit-flex;
|
||
|
display: -ms-flexbox;
|
||
|
display: flex;
|
||
|
}
|
||
|
|
||
|
.nav-tabs-custom > .tab-content > .chart-wrapper {
|
||
|
background: #fff;
|
||
|
border: none;
|
||
|
margin: 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
.nav-tabs-custom > .tab-content > .active {
|
||
|
display: -webkit-box;
|
||
|
display: -webkit-flex;
|
||
|
display: -ms-flexbox;
|
||
|
display: flex;
|
||
|
}
|
||
|
|
||
|
.nav-tabs-custom .dropdown.open > a:active,
|
||
|
.nav-tabs-custom .dropdown.open > a:focus {
|
||
|
background: transparent;
|
||
|
color: #999;
|
||
|
}
|
||
|
|
||
|
|
||
|
@media (max-width: 767px) {
|
||
|
.value-box {
|
||
|
text-align: center;
|
||
|
margin-right: 8px;
|
||
|
}
|
||
|
.value-box .icon {
|
||
|
display: none;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Fixed position sidebar */
|
||
|
|
||
|
.section.sidebar {
|
||
|
position: fixed;
|
||
|
top: 51px; /* overridden by theme */
|
||
|
left: 0;
|
||
|
bottom: 0;
|
||
|
border-right: 1px solid #e2e2e2;
|
||
|
background-color: white; /* overridden by theme */
|
||
|
padding-left: 10px;
|
||
|
padding-right: 10px;
|
||
|
visibility: hidden;
|
||
|
overflow: auto;
|
||
|
}
|
||
|
|
||
|
.section.sidebar form p:first-child {
|
||
|
margin-top: 10px;
|
||
|
}
|
||
|
|
||
|
/* Embedded source code */
|
||
|
|
||
|
#flexdashboard-source-code {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
.featherlight-content #flexdashboard-source-code {
|
||
|
display: inline-block;
|
||
|
}
|
||
|
|
||
|
.featherlight-content {
|
||
|
width: 80%;
|
||
|
max-width: 800px;
|
||
|
padding: 0 !important;
|
||
|
border-bottom: none !important;
|
||
|
}
|
||
|
|
||
|
.featherlight:last-of-type {
|
||
|
background: rgba(0, 0, 0, 0.7);
|
||
|
}
|
||
|
|
||
|
.featherlight-inner {
|
||
|
width: 100%;
|
||
|
}
|
||
|
|
||
|
.featherlight-content pre {
|
||
|
margin: 0;
|
||
|
border: 0;
|
||
|
background: #fff;
|
||
|
font-size: 12px;
|
||
|
}
|
||
|
|
||
|
.unselectable {
|
||
|
-ms-user-select: none;
|
||
|
-webkit-user-select: none;
|
||
|
-khtml-user-select: none;
|
||
|
-moz-user-select: -moz-none;
|
||
|
-o-user-select: none;
|
||
|
user-select: none;
|
||
|
}
|
||
|
|
||
|
#flexdashboard-source-code code {
|
||
|
-ms-user-select: text;
|
||
|
-webkit-user-select: text;
|
||
|
-khtml-user-select: text;
|
||
|
-moz-user-select: text;
|
||
|
-o-user-select: text;
|
||
|
user-select: text;
|
||
|
}
|
||
|
|
||
|
/* DataTables Tweaks */
|
||
|
|
||
|
.dataTables_filter input[type="search"] {
|
||
|
-webkit-appearance: searchfield;
|
||
|
outline: none;
|
||
|
}
|
||
|
|
||
|
.dataTables_wrapper.no-footer
|
||
|
.dataTables_info {
|
||
|
padding-top: 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
table.dataTable thead th {
|
||
|
border-bottom: 1px solid #d7d7d7;
|
||
|
}
|
||
|
|
||
|
.dataTables_wrapper.no-footer .dataTables_scrollBody {
|
||
|
border-bottom: 1px solid #d7d7d7;
|
||
|
}
|
||
|
|
||
|
/* Mobile phone only CSS */
|
||
|
|
||
|
.desktop-layout div.section.mobile {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
.mobile-layout div.section.no-mobile {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
.mobile-figure {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
body {
|
||
|
padding-top: 60px;
|
||
|
}
|
||
|
|
||
|
.section.sidebar {
|
||
|
top: 51px;
|
||
|
background-color: rgba(39, 128, 227, 0.1);
|
||
|
}
|
||
|
|
||
|
.value-box {
|
||
|
color: #f9f9f9;
|
||
|
}
|
||
|
|
||
|
.bg-primary {
|
||
|
background-color: rgba(39, 128, 227, 0.7);
|
||
|
}
|
||
|
|
||
|
.storyboard-nav .sbframelist ul li.active {
|
||
|
background-color: rgba(39, 128, 227, 0.7);
|
||
|
}
|
||
|
|
||
|
.nav-tabs-custom > .nav-tabs > li.active {
|
||
|
border-top-color: rgba(39, 128, 227, 0.7);
|
||
|
}
|
||
|
|
||
|
.bg-info {
|
||
|
background-color: rgba(153, 84, 187, 0.7);
|
||
|
}
|
||
|
|
||
|
.bg-warning {
|
||
|
background-color: rgba(255, 117, 24, 0.7);
|
||
|
}
|
||
|
|
||
|
.bg-danger {
|
||
|
background-color: rgba(255, 0, 57, 0.7);
|
||
|
}
|
||
|
|
||
|
.bg-success {
|
||
|
background-color: rgba(63, 182, 24, 0.7);
|
||
|
}
|
||
|
|
||
|
.chart-title {
|
||
|
font-weight: 500;
|
||
|
}
|
||
|
|
||
|
.nav-tabs-custom > .nav-tabs > li > a,
|
||
|
.nav-tabs-custom > .nav-tabs > li > a:active {
|
||
|
font-weight: 500;
|
||
|
}
|
||
|
|
||
|
@media only screen and (min-width: 768px) {
|
||
|
html, body {
|
||
|
height: 100%;
|
||
|
}
|
||
|
|
||
|
#dashboard-container {
|
||
|
height: 100%;
|
||
|
}
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
|
||
|
|
||
|
</head>
|
||
|
|
||
|
<body>
|
||
|
|
||
|
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
||
|
<div class="container-fluid">
|
||
|
<div class="navbar-header">
|
||
|
|
||
|
<button id="navbar-button" type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar">
|
||
|
<span class="icon-bar"></span>
|
||
|
<span class="icon-bar"></span>
|
||
|
<span class="icon-bar"></span>
|
||
|
</button>
|
||
|
|
||
|
<span class="navbar-logo pull-left">
|
||
|
|
||
|
</span>
|
||
|
<span class="navbar-brand">
|
||
|
Rozkład danych diamentów
|
||
|
<span class="navbar-author">
|
||
|
</span>
|
||
|
</span>
|
||
|
|
||
|
</div>
|
||
|
<div id="navbar" class="navbar-collapse collapse">
|
||
|
<ul class="nav navbar-nav navbar-left">
|
||
|
</ul>
|
||
|
<ul class="nav navbar-nav navbar-right">
|
||
|
</ul>
|
||
|
</div><!--/.nav-collapse-->
|
||
|
</div><!--/.container-->
|
||
|
</div><!--/.navbar-->
|
||
|
|
||
|
<img class="mobile-figure" data-mobile-figure-id="fig1" src="data:image/png;base64,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
|
||
|
<img class="mobile-figure" data-mobile-figure-id="fig2" src="data:image/png;base64,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
|
||
|
<img class="mobile-figure" data-mobile-figure-id="fig3" src="data:image/png;base64,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
|
||
|
<script type="text/javascript">
|
||
|
|
||
|
|
||
|
var FlexDashboard = (function () {
|
||
|
|
||
|
// initialize options
|
||
|
var _options = {};
|
||
|
|
||
|
var FlexDashboard = function() {
|
||
|
|
||
|
// default options
|
||
|
_options = $.extend(_options, {
|
||
|
theme: "cosmo",
|
||
|
fillPage: false,
|
||
|
orientation: 'columns',
|
||
|
storyboard: false,
|
||
|
defaultFigWidth: 576,
|
||
|
defaultFigHeight: 461,
|
||
|
defaultFigWidthMobile: 360,
|
||
|
defaultFigHeightMobile: 461,
|
||
|
isMobile: false,
|
||
|
isPortrait: false
|
||
|
});
|
||
|
};
|
||
|
|
||
|
function init(options) {
|
||
|
|
||
|
// extend default options
|
||
|
$.extend(true, _options, options);
|
||
|
|
||
|
// add ids to sections that don't have them (pandoc won't assign ids
|
||
|
// to e.g. sections with titles consisting of only chinese characters)
|
||
|
var nextId = 1;
|
||
|
$('.level1:not([id]),.level2:not([id]),.level3:not([id])').each(function() {
|
||
|
$(this).attr('id', 'dashboard-' + nextId++);
|
||
|
});
|
||
|
|
||
|
// find navbar items
|
||
|
var navbarItems = $('#flexdashboard-navbar');
|
||
|
if (navbarItems.length)
|
||
|
navbarItems = JSON.parse(navbarItems.html());
|
||
|
addNavbarItems(navbarItems);
|
||
|
|
||
|
// find the main dashboard container
|
||
|
var dashboardContainer = $('#dashboard-container');
|
||
|
|
||
|
// resolve mobile classes
|
||
|
resolveMobileClasses(dashboardContainer);
|
||
|
|
||
|
// one time global initialization for components
|
||
|
componentsInit(dashboardContainer);
|
||
|
|
||
|
// look for a global sidebar
|
||
|
var globalSidebar = dashboardContainer.find(".section.level1.sidebar");
|
||
|
if (globalSidebar.length > 0) {
|
||
|
|
||
|
// global layout for fullscreen displays
|
||
|
if (!isMobilePhone()) {
|
||
|
|
||
|
// hoist it up to the top level
|
||
|
globalSidebar.insertBefore(dashboardContainer);
|
||
|
|
||
|
// lay it out (set width/positions)
|
||
|
layoutSidebar(globalSidebar, dashboardContainer);
|
||
|
|
||
|
// tuck sidebar into first page for mobile phones
|
||
|
} else {
|
||
|
|
||
|
// convert it into a level3 section
|
||
|
globalSidebar.removeClass('sidebar');
|
||
|
globalSidebar.removeClass('level1');
|
||
|
globalSidebar.addClass('level3');
|
||
|
var h1 = globalSidebar.children('h1');
|
||
|
var h3 = $('<h3></h3>');
|
||
|
h3.html(h1.html());
|
||
|
h3.insertBefore(h1);
|
||
|
h1.remove();
|
||
|
|
||
|
// move it into the first page
|
||
|
var page = dashboardContainer.find('.section.level1').first();
|
||
|
if (page.length > 0)
|
||
|
page.prepend(globalSidebar);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// look for pages to layout
|
||
|
var pages = $('div.section.level1');
|
||
|
if (pages.length > 0) {
|
||
|
|
||
|
// find the navbar and collapse on clicked
|
||
|
var navbar = $('#navbar');
|
||
|
navbar.on("click", "a[data-toggle!=dropdown]", null, function () {
|
||
|
navbar.collapse('hide');
|
||
|
});
|
||
|
|
||
|
// envelop the dashboard container in a tab content div
|
||
|
dashboardContainer.wrapInner('<div class="tab-content"></div>');
|
||
|
|
||
|
pages.each(function(index) {
|
||
|
|
||
|
// lay it out
|
||
|
layoutDashboardPage($(this));
|
||
|
|
||
|
// add it to the navbar
|
||
|
addToNavbar($(this), index === 0);
|
||
|
|
||
|
});
|
||
|
|
||
|
} else {
|
||
|
|
||
|
// remove the navbar and navbar button if we don't
|
||
|
// have any navbuttons
|
||
|
if (navbarItems.length === 0) {
|
||
|
$('#navbar').remove();
|
||
|
$('#navbar-button').remove();
|
||
|
}
|
||
|
|
||
|
// add the storyboard class if requested
|
||
|
if (_options.storyboard)
|
||
|
dashboardContainer.addClass('storyboard');
|
||
|
|
||
|
// layout the entire page
|
||
|
layoutDashboardPage(dashboardContainer);
|
||
|
}
|
||
|
|
||
|
// if we are in shiny we need to trigger a window resize event to
|
||
|
// force correct layout of shiny-bound-output elements
|
||
|
if (isShinyDoc())
|
||
|
$(window).trigger('resize');
|
||
|
|
||
|
// make main components visible
|
||
|
$('.section.sidebar').css('visibility', 'visible');
|
||
|
dashboardContainer.css('visibility', 'visible');
|
||
|
|
||
|
// handle location hash
|
||
|
handleLocationHash();
|
||
|
|
||
|
// intialize prism highlighting
|
||
|
initPrismHighlighting();
|
||
|
|
||
|
// record mobile and orientation state then register a handler
|
||
|
// to refresh if it changes
|
||
|
_options.isMobile = isMobilePhone();
|
||
|
_options.isPortrait = isPortrait();
|
||
|
$(window).on('resize', function() {
|
||
|
if (_options.isMobile !== isMobilePhone() ||
|
||
|
_options.isPortrait !== isPortrait()) {
|
||
|
window.location.reload();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// trigger layoutcomplete event
|
||
|
dashboardContainer.trigger('flexdashboard:layoutcomplete');
|
||
|
}
|
||
|
|
||
|
function resolveMobileClasses(dashboardContainer) {
|
||
|
// add top level layout class
|
||
|
dashboardContainer.addClass(isMobilePhone() ? 'mobile-layout' :
|
||
|
'desktop-layout');
|
||
|
|
||
|
// look for .mobile sections and add .no-mobile to their peers
|
||
|
var mobileSections = $('.section.mobile');
|
||
|
mobileSections.each(function() {
|
||
|
var id = $(this).attr('id');
|
||
|
var nomobileId = id.replace(/-\d+$/, '');
|
||
|
$('#' + nomobileId).addClass('no-mobile');
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function addNavbarItems(navbarItems) {
|
||
|
|
||
|
var navbarLeft = $('ul.navbar-left');
|
||
|
var navbarRight = $('ul.navbar-right');
|
||
|
|
||
|
for (var i = 0; i<navbarItems.length; i++) {
|
||
|
|
||
|
// get the item
|
||
|
var item = navbarItems[i];
|
||
|
|
||
|
// determine the container
|
||
|
var container = null;
|
||
|
if (item.align === "left")
|
||
|
container = navbarLeft;
|
||
|
else
|
||
|
container = navbarRight;
|
||
|
|
||
|
// navbar menu if we have multiple items
|
||
|
if (item.items) {
|
||
|
var menu = navbarMenu(null, item.icon, item.title, container);
|
||
|
for (var j = 0; j<item.items.length; j++) {
|
||
|
var subItem = item.items[j];
|
||
|
var li = $('<li></li>');
|
||
|
li.append(navbarLink(subItem.icon, subItem.title, subItem.href, subItem.target));
|
||
|
menu.append(li);
|
||
|
}
|
||
|
} else {
|
||
|
var li = $('<li></li>');
|
||
|
li.append(navbarLink(item.icon, item.title, item.href, item.target));
|
||
|
container.append(li);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// create or get a reference to an existing dropdown menu
|
||
|
function navbarMenu(id, icon, title, container) {
|
||
|
var existingMenu = [];
|
||
|
if (id)
|
||
|
existingMenu = container.children('#' + id);
|
||
|
if (existingMenu.length > 0) {
|
||
|
return existingMenu.children('ul');
|
||
|
} else {
|
||
|
var li = $('<li></li>');
|
||
|
if (id)
|
||
|
li.attr('id', id);
|
||
|
li.addClass('dropdown');
|
||
|
// auto add "Share" title on mobile if necessary
|
||
|
if (!title && icon && (icon === "fa-share-alt") && isMobilePhone())
|
||
|
title = "Share";
|
||
|
if (title) {
|
||
|
title = title + ' <span class="caret"></span>';
|
||
|
}
|
||
|
var a = navbarLink(icon, title, "#");
|
||
|
a.addClass('dropdown-toggle');
|
||
|
a.attr('data-toggle', 'dropdown');
|
||
|
a.attr('role', 'button');
|
||
|
a.attr('aria-expanded', 'false');
|
||
|
li.append(a);
|
||
|
var ul = $('<ul class="dropdown-menu"></ul>');
|
||
|
ul.attr('role', 'menu');
|
||
|
li.append(ul);
|
||
|
container.append(li);
|
||
|
return ul;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function addToNavbar(page, active) {
|
||
|
|
||
|
// capture the id and data-icon attribute (if any)
|
||
|
var id = page.attr('id');
|
||
|
var icon = page.attr('data-icon');
|
||
|
var navmenu = page.attr('data-navmenu');
|
||
|
|
||
|
// get hidden state (transfer this to navbar)
|
||
|
var hidden = page.hasClass('hidden');
|
||
|
page.removeClass('hidden');
|
||
|
|
||
|
// sanitize the id for use with bootstrap tabs
|
||
|
id = id.replace(/[.\/?&!#<>]/g, '').replace(/\s/g, '_');
|
||
|
page.attr('id', id);
|
||
|
|
||
|
// get the wrapper
|
||
|
var wrapper = page.closest('.dashboard-page-wrapper');
|
||
|
|
||
|
// move the id to the wrapper
|
||
|
page.removeAttr('id');
|
||
|
wrapper.attr('id', id);
|
||
|
|
||
|
// add the tab-pane class to the wrapper
|
||
|
wrapper.addClass('tab-pane');
|
||
|
if (active)
|
||
|
wrapper.addClass('active');
|
||
|
|
||
|
// get a reference to the h1, discover it's id and title, then remove it
|
||
|
var h1 = wrapper.find('h1').first();
|
||
|
var title = h1.html();
|
||
|
h1.remove();
|
||
|
|
||
|
// create a navbar item
|
||
|
var li = $('<li></li>');
|
||
|
var a = navbarLink(icon, title, '#' + id);
|
||
|
a.attr('data-toggle', 'tab');
|
||
|
li.append(a);
|
||
|
|
||
|
// add it to the navbar (or navbar menu if specified)
|
||
|
var container = $('ul.navbar-left');
|
||
|
if (navmenu) {
|
||
|
var menuId = navmenu.replace(/\s+/g, '');
|
||
|
var menu = navbarMenu(menuId, null, navmenu, container);
|
||
|
menu.append(li);
|
||
|
} else {
|
||
|
container.append(li);
|
||
|
}
|
||
|
|
||
|
// hide it if requested
|
||
|
if (hidden)
|
||
|
li.addClass('hidden');
|
||
|
}
|
||
|
|
||
|
function navbarLink(icon, title, href, target) {
|
||
|
|
||
|
var a = $('<a></a>');
|
||
|
if (icon) {
|
||
|
|
||
|
// get the name of the icon set and icon
|
||
|
var dashPos = icon.indexOf("-");
|
||
|
var iconSet = icon.substring(0, dashPos);
|
||
|
var iconName = icon.substring(dashPos + 1);
|
||
|
|
||
|
// create the icon
|
||
|
var iconElement = $('<span class="' + iconSet + ' ' + icon + '"></span>');
|
||
|
if (title)
|
||
|
iconElement.css('margin-right', '7px');
|
||
|
a.append(iconElement);
|
||
|
// if href is null see if we can auto-generate based on icon (e.g. social)
|
||
|
if (!href)
|
||
|
maybeGenerateLinkFromIcon(iconName, a);
|
||
|
}
|
||
|
if (title)
|
||
|
a.append(title);
|
||
|
|
||
|
// add the href.
|
||
|
if (href) {
|
||
|
if (href === "source_embed") {
|
||
|
a.attr('href', '#');
|
||
|
a.attr('data-featherlight', "#flexdashboard-source-code");
|
||
|
a.featherlight({
|
||
|
beforeOpen: function(event){
|
||
|
$('body').addClass('unselectable');
|
||
|
},
|
||
|
afterClose: function(event){
|
||
|
$('body').removeClass('unselectable');
|
||
|
}
|
||
|
});
|
||
|
} else {
|
||
|
a.attr('href', href);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// add the arget
|
||
|
if (target)
|
||
|
a.attr('target', target);
|
||
|
|
||
|
return a;
|
||
|
}
|
||
|
|
||
|
// auto generate a link from an icon name (e.g. twitter) when possible
|
||
|
function maybeGenerateLinkFromIcon(iconName, a) {
|
||
|
|
||
|
var serviceLinks = {
|
||
|
"twitter": "https://twitter.com/share?text=" + encodeURIComponent(document.title) + "&url="+encodeURIComponent(location.href),
|
||
|
"facebook": "https://www.facebook.com/sharer/sharer.php?s=100&p[url]="+encodeURIComponent(location.href),
|
||
|
"google-plus": "https://plus.google.com/share?url="+encodeURIComponent(location.href),
|
||
|
"linkedin": "https://www.linkedin.com/shareArticle?mini=true&url="+encodeURIComponent(location.href) + "&title=" + encodeURIComponent(document.title),
|
||
|
"pinterest": "https://pinterest.com/pin/create/link/?url="+encodeURIComponent(location.href) + "&description=" + encodeURIComponent(document.title)
|
||
|
};
|
||
|
|
||
|
var makeSocialLink = function(a, href) {
|
||
|
a.attr('href', '#');
|
||
|
a.on('click', function(e) {
|
||
|
e.preventDefault();
|
||
|
window.open(href);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
$.each(serviceLinks, function(key, value) {
|
||
|
if (iconName.indexOf(key) !== -1)
|
||
|
makeSocialLink(a, value);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// layout a dashboard page
|
||
|
function layoutDashboardPage(page) {
|
||
|
|
||
|
// use a page wrapper so that free form content above the
|
||
|
// dashboard appears at the top rather than the side (as it
|
||
|
// would without the wrapper in a column orientation)
|
||
|
var wrapper = $('<div class="dashboard-page-wrapper"></div>');
|
||
|
page.wrap(wrapper);
|
||
|
|
||
|
// if there are no level2 or level3 headers synthesize a level3
|
||
|
// header to contain the (e.g. frame it, scroll container, etc.)
|
||
|
var headers = page.find('h2,h3');
|
||
|
if (headers.length === 0)
|
||
|
page.wrapInner('<div class="section level3"></div>');
|
||
|
|
||
|
// hoist up any content before level 2 or level 3 headers
|
||
|
var children = page.children();
|
||
|
children.each(function(index) {
|
||
|
if ($(this).hasClass('level2') || $(this).hasClass('level3'))
|
||
|
return false;
|
||
|
$(this).insertBefore(page);
|
||
|
});
|
||
|
|
||
|
// determine orientation and fillPage behavior for distinct media
|
||
|
var orientation, fillPage, storyboard;
|
||
|
|
||
|
// media: mobile phone
|
||
|
if (isMobilePhone()) {
|
||
|
|
||
|
// if there is a sidebar we need to ensure it's content
|
||
|
// is properly framed as an h3
|
||
|
var sidebar = page.find('.section.sidebar');
|
||
|
sidebar.removeClass('sidebar');
|
||
|
sidebar.wrapInner('<div class="section level3"></div>');
|
||
|
var h2 = sidebar.find('h2');
|
||
|
var h3 = $('<h3></h3>');
|
||
|
h3.html(h2.html());
|
||
|
h3.insertBefore(h2);
|
||
|
h2.remove();
|
||
|
|
||
|
// wipeout h2 elements then enclose them in a single h2
|
||
|
var level2 = page.find('div.section.level2');
|
||
|
level2.each(function() {
|
||
|
level2.children('h2').remove();
|
||
|
level2.children().unwrap();
|
||
|
});
|
||
|
page.wrapInner('<div class="section level2"></div>');
|
||
|
|
||
|
// substitute mobile images
|
||
|
if (isPortrait()) {
|
||
|
var mobileFigures = $('img.mobile-figure');
|
||
|
mobileFigures.each(function() {
|
||
|
// get the src (might be base64 encoded)
|
||
|
var src = $(this).attr('src');
|
||
|
|
||
|
// find it's peer
|
||
|
var id = $(this).attr('data-mobile-figure-id');
|
||
|
var img = $('img[data-figure-id=' + id + "]");
|
||
|
img.attr('src', src)
|
||
|
.attr('width', _options.defaultFigWidthMobile)
|
||
|
.attr('height', _options.defaultFigHeightMobile);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// hoist storyboard commentary into it's own section
|
||
|
if (page.hasClass('storyboard')) {
|
||
|
var commentaryHR = page.find('div.section.level3 hr');
|
||
|
commentaryHR.each(function() {
|
||
|
var commentary = $(this).nextAll().detach();
|
||
|
var commentarySection = $('<div class="section level3"></div>');
|
||
|
commentarySection.append(commentary);
|
||
|
commentarySection.insertAfter($(this).closest('div.section.level3'));
|
||
|
$(this).remove();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// force a non full screen layout by columns
|
||
|
orientation = _options.orientation = 'columns';
|
||
|
fillPage = _options.fillPage = false;
|
||
|
storyboard = _options.storyboard = false;
|
||
|
|
||
|
// media: desktop
|
||
|
} else {
|
||
|
|
||
|
// determine orientation
|
||
|
orientation = page.attr('data-orientation');
|
||
|
if (orientation !== 'rows' && orientation != 'columns')
|
||
|
orientation = _options.orientation;
|
||
|
|
||
|
// determine storyboard mode
|
||
|
storyboard = page.hasClass('storyboard');
|
||
|
|
||
|
// fillPage based on options (force for storyboard)
|
||
|
fillPage = _options.fillPage || storyboard;
|
||
|
|
||
|
// handle sidebar
|
||
|
var sidebar = page.find('.section.level2.sidebar');
|
||
|
if (sidebar.length > 0)
|
||
|
layoutSidebar(sidebar, page);
|
||
|
}
|
||
|
|
||
|
// give it and it's parent divs height: 100% if we are in fillPage mode
|
||
|
if (fillPage) {
|
||
|
page.addClass('vertical-layout-fill');
|
||
|
page.css('height', '100%');
|
||
|
page.parents('div').css('height', '100%');
|
||
|
} else {
|
||
|
page.addClass('vertical-layout-scroll');
|
||
|
}
|
||
|
|
||
|
// perform the layout
|
||
|
if (storyboard)
|
||
|
layoutPageAsStoryboard(page);
|
||
|
else if (orientation === 'rows')
|
||
|
layoutPageByRows(page, fillPage);
|
||
|
else if (orientation === 'columns')
|
||
|
layoutPageByColumns(page, fillPage);
|
||
|
}
|
||
|
|
||
|
function layoutSidebar(sidebar, content) {
|
||
|
|
||
|
// get it out of the header hierarchy
|
||
|
sidebar = sidebar.first();
|
||
|
if (sidebar.hasClass('level1')) {
|
||
|
sidebar.removeClass('level1');
|
||
|
sidebar.children('h1').remove();
|
||
|
} else if (sidebar.hasClass('level2')) {
|
||
|
sidebar.removeClass('level2');
|
||
|
sidebar.children('h2').remove();
|
||
|
}
|
||
|
|
||
|
// determine width
|
||
|
var sidebarWidth = isTablet() ? 220 : 250;
|
||
|
var dataWidth = parseInt(sidebar.attr('data-width'));
|
||
|
if (dataWidth)
|
||
|
sidebarWidth = dataWidth;
|
||
|
|
||
|
// set the width and shift the page right to accomodate the sidebar
|
||
|
sidebar.css('width', sidebarWidth + 'px');
|
||
|
content.css('padding-left', sidebarWidth + 'px');
|
||
|
|
||
|
// wrap it's contents in a form
|
||
|
sidebar.wrapInner($('<form></form>'));
|
||
|
}
|
||
|
|
||
|
function layoutPageAsStoryboard(page) {
|
||
|
|
||
|
// create storyboard navigation
|
||
|
var nav = $('<div class="storyboard-nav"></div>');
|
||
|
|
||
|
// add navigation buttons
|
||
|
var prev = $('<button class="sbprev"><i class="fa fa-angle-left"></i></button>');
|
||
|
nav.append(prev);
|
||
|
var next= $('<button class="sbnext"><i class="fa fa-angle-right"></i></button>');
|
||
|
nav.append(next);
|
||
|
|
||
|
// add navigation frame
|
||
|
var frameList = $('<div class="sbframelist"></div>');
|
||
|
nav.append(frameList);
|
||
|
var ul = $('<ul></ul>');
|
||
|
frameList.append(ul);
|
||
|
|
||
|
// find all the level3 sections (those are the storyboard frames)
|
||
|
var frames = page.find('div.section.level3');
|
||
|
frames.each(function() {
|
||
|
|
||
|
// mark it
|
||
|
$(this).addClass('sbframe');
|
||
|
|
||
|
// divide it into chart content and (optional) commentary
|
||
|
$(this).addClass('dashboard-column-orientation');
|
||
|
|
||
|
// stuff the chart into it's own div w/ flex
|
||
|
$(this).wrapInner('<div class="sbframe-component"></div>');
|
||
|
setFlex($(this), 1);
|
||
|
var frame = $(this).children('.sbframe-component');
|
||
|
|
||
|
// extract the title from the h3
|
||
|
var li = $('<li></li>');
|
||
|
var h3 = frame.children('h3');
|
||
|
li.html(h3.html());
|
||
|
h3.remove();
|
||
|
ul.append(li);
|
||
|
|
||
|
// extract commentary
|
||
|
var hr = frame.children('hr');
|
||
|
if (hr.length) {
|
||
|
var commentary = hr.nextAll().detach();
|
||
|
hr.remove();
|
||
|
var commentaryFrame = $('<div class="sbframe-commentary"></div>');
|
||
|
commentaryFrame.addClass('flowing-content-shim');
|
||
|
commentaryFrame.addClass('flowing-content-container');
|
||
|
commentaryFrame.append(commentary);
|
||
|
$(this).append(commentaryFrame);
|
||
|
|
||
|
// look for a data-commentary-width attribute
|
||
|
var commentaryWidth = $(this).attr('data-commentary-width');
|
||
|
if (commentaryWidth)
|
||
|
commentaryFrame.css('width', commentaryWidth + 'px');
|
||
|
}
|
||
|
|
||
|
// layout the chart (force flex)
|
||
|
var result = layoutChart(frame, true);
|
||
|
|
||
|
// ice the notes if there are none
|
||
|
if (!result.notes)
|
||
|
frame.find('.chart-notes').remove();
|
||
|
|
||
|
// set flex on chart
|
||
|
setFlex(frame, 1);
|
||
|
});
|
||
|
|
||
|
// create a div to hold all the frames
|
||
|
var frameContent = $('<div class="sbframe-content"></div>');
|
||
|
frameContent.addClass('dashboard-row-orientation');
|
||
|
frameContent.append(frames.detach());
|
||
|
|
||
|
// row orientation to stack nav and frame content
|
||
|
page.addClass('dashboard-row-orientation');
|
||
|
page.append(nav);
|
||
|
page.append(frameContent);
|
||
|
setFlex(frameContent, 1);
|
||
|
|
||
|
// initialize sly
|
||
|
var sly = new Sly(frameList, {
|
||
|
horizontal: true,
|
||
|
itemNav: 'basic',
|
||
|
smart: true,
|
||
|
activateOn: 'click',
|
||
|
startAt: 0,
|
||
|
scrollBy: 1,
|
||
|
activatePageOn: 'click',
|
||
|
speed: 200,
|
||
|
moveBy: 600,
|
||
|
dragHandle: true,
|
||
|
dynamicHandle: true,
|
||
|
clickBar: true,
|
||
|
keyboardNavBy: 'items',
|
||
|
next: next,
|
||
|
prev: prev
|
||
|
}).init();
|
||
|
|
||
|
// make first frame active
|
||
|
frames.removeClass('active');
|
||
|
frames.first().addClass('active');
|
||
|
|
||
|
// subscribe to frame changed events
|
||
|
sly.on('active', function (eventName, itemIndex) {
|
||
|
frames.removeClass('active');
|
||
|
frames.eq(itemIndex).addClass('active')
|
||
|
.trigger('shown');
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function layoutPageByRows(page, fillPage) {
|
||
|
|
||
|
// row orientation
|
||
|
page.addClass('dashboard-row-orientation');
|
||
|
|
||
|
// find all the level2 sections (those are the rows)
|
||
|
var rows = page.find('div.section.level2');
|
||
|
|
||
|
// if there are no level2 sections then treat the
|
||
|
// entire page as if it's a level 2 section
|
||
|
if (rows.length === 0) {
|
||
|
page.wrapInner('<div class="section level2"></div>');
|
||
|
rows = page.find('div.section.level2');
|
||
|
}
|
||
|
|
||
|
rows.each(function () {
|
||
|
|
||
|
// flags
|
||
|
var haveNotes = false;
|
||
|
var haveFlexHeight = true;
|
||
|
|
||
|
// remove the h2
|
||
|
$(this).children('h2').remove();
|
||
|
|
||
|
// check for a tabset
|
||
|
var isTabset = $(this).hasClass('tabset');
|
||
|
if (isTabset)
|
||
|
layoutTabset($(this));
|
||
|
|
||
|
// give it row layout semantics if it's not a tabset
|
||
|
if (!isTabset)
|
||
|
$(this).addClass('dashboard-row');
|
||
|
|
||
|
// find all of the level 3 subheads
|
||
|
var columns = $(this).find('div.section.level3');
|
||
|
|
||
|
// determine figureSizes sizes
|
||
|
var figureSizes = chartFigureSizes(columns);
|
||
|
|
||
|
// fixup the columns
|
||
|
columns.each(function(index) {
|
||
|
|
||
|
// layout the chart (force flex if we are in a tabset)
|
||
|
var result = layoutChart($(this), isTabset);
|
||
|
|
||
|
// update flexHeight state
|
||
|
if (!result.flex)
|
||
|
haveFlexHeight = false;
|
||
|
|
||
|
// update state
|
||
|
if (result.notes)
|
||
|
haveNotes = true;
|
||
|
|
||
|
// set the column flex based on the figure width
|
||
|
// (value boxes will just get the default figure width)
|
||
|
var chartWidth = figureSizes[index].width;
|
||
|
setFlex($(this), chartWidth + ' ' + chartWidth + ' 0px');
|
||
|
|
||
|
});
|
||
|
|
||
|
// remove empty chart note divs
|
||
|
if (isTabset)
|
||
|
$(this).find('.chart-notes').filter(function() {
|
||
|
return $(this).html() === " ";
|
||
|
}).remove();
|
||
|
if (!haveNotes)
|
||
|
$(this).find('.chart-notes').remove();
|
||
|
|
||
|
// make it a flexbox row
|
||
|
if (haveFlexHeight)
|
||
|
$(this).addClass('dashboard-row-flex');
|
||
|
|
||
|
// now we can set the height on all the wrappers (based on maximum
|
||
|
// figure height + room for title and notes, or data-height on the
|
||
|
// container if specified). However, don't do this if there is
|
||
|
// no flex on any of the constituent columns
|
||
|
var flexHeight = null;
|
||
|
var dataHeight = parseInt($(this).attr('data-height'));
|
||
|
if (dataHeight)
|
||
|
flexHeight = adjustedHeight(dataHeight, columns.first());
|
||
|
else if (haveFlexHeight)
|
||
|
flexHeight = maxChartHeight(figureSizes, columns);
|
||
|
if (flexHeight) {
|
||
|
if (fillPage)
|
||
|
setFlex($(this), flexHeight + ' ' + flexHeight + ' 0px');
|
||
|
else {
|
||
|
$(this).css('height', flexHeight + 'px');
|
||
|
setFlex($(this), '0 0 ' + flexHeight + 'px');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function layoutPageByColumns(page, fillPage) {
|
||
|
|
||
|
// column orientation
|
||
|
page.addClass('dashboard-column-orientation');
|
||
|
|
||
|
// find all the level2 sections (those are the columns)
|
||
|
var columns = page.find('div.section.level2');
|
||
|
|
||
|
// if there are no level2 sections then treat the
|
||
|
// entire page as if it's a level 2 section
|
||
|
if (columns.length === 0) {
|
||
|
page.wrapInner('<div class="section level2"></div>');
|
||
|
columns = page.find('div.section.level2');
|
||
|
}
|
||
|
|
||
|
// layout each column
|
||
|
columns.each(function (index) {
|
||
|
|
||
|
// remove the h2
|
||
|
$(this).children('h2').remove();
|
||
|
|
||
|
// make it a flexbox column
|
||
|
$(this).addClass('dashboard-column');
|
||
|
|
||
|
// check for a tabset
|
||
|
var isTabset = $(this).hasClass('tabset');
|
||
|
if (isTabset)
|
||
|
layoutTabset($(this));
|
||
|
|
||
|
// find all the h3 elements
|
||
|
var rows = $(this).find('div.section.level3');
|
||
|
|
||
|
// get the figure sizes for the rows
|
||
|
var figureSizes = chartFigureSizes(rows);
|
||
|
|
||
|
// column flex is the max row width (or data-width if specified)
|
||
|
var flexWidth;
|
||
|
var dataWidth = parseInt($(this).attr('data-width'));
|
||
|
if (dataWidth)
|
||
|
flexWidth = dataWidth;
|
||
|
else
|
||
|
flexWidth = maxChartWidth(figureSizes);
|
||
|
setFlex($(this), flexWidth + ' ' + flexWidth + ' 0px');
|
||
|
|
||
|
// layout each chart
|
||
|
rows.each(function(index) {
|
||
|
|
||
|
// perform the layout
|
||
|
var result = layoutChart($(this), false);
|
||
|
|
||
|
// ice the notes if there are none
|
||
|
if (!result.notes)
|
||
|
$(this).find('.chart-notes').remove();
|
||
|
|
||
|
// set flex height based on figHeight, then adjust
|
||
|
if (result.flex) {
|
||
|
var chartHeight = figureSizes[index].height;
|
||
|
chartHeight = adjustedHeight(chartHeight, $(this));
|
||
|
if (fillPage)
|
||
|
setFlex($(this), chartHeight + ' ' + chartHeight + ' 0px');
|
||
|
else {
|
||
|
$(this).css('height', chartHeight + 'px');
|
||
|
setFlex($(this), chartHeight + ' ' + chartHeight + ' ' + chartHeight + 'px');
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function chartFigureSizes(charts) {
|
||
|
|
||
|
// sizes
|
||
|
var figureSizes = new Array(charts.length);
|
||
|
|
||
|
// check each chart
|
||
|
charts.each(function(index) {
|
||
|
|
||
|
// start with default
|
||
|
figureSizes[index] = {
|
||
|
width: _options.defaultFigWidth,
|
||
|
height: _options.defaultFigHeight
|
||
|
};
|
||
|
|
||
|
// look for data-height or data-width then knit options
|
||
|
var dataWidth = parseInt($(this).attr('data-width'));
|
||
|
var dataHeight = parseInt($(this).attr('data-height'));
|
||
|
var knitrOptions = $(this).find('.knitr-options:first');
|
||
|
var knitrWidth, knitrHeight;
|
||
|
if (knitrOptions) {
|
||
|
knitrWidth = parseInt(knitrOptions.attr('data-fig-width'));
|
||
|
knitrHeight = parseInt(knitrOptions.attr('data-fig-height'));
|
||
|
}
|
||
|
|
||
|
// width
|
||
|
if (dataWidth)
|
||
|
figureSizes[index].width = dataWidth;
|
||
|
else if (knitrWidth)
|
||
|
figureSizes[index].width = knitrWidth;
|
||
|
|
||
|
// height
|
||
|
if (dataHeight)
|
||
|
figureSizes[index].height = dataHeight;
|
||
|
else if (knitrHeight)
|
||
|
figureSizes[index].height = knitrHeight;
|
||
|
});
|
||
|
|
||
|
// return sizes
|
||
|
return figureSizes;
|
||
|
}
|
||
|
|
||
|
function maxChartHeight(figureSizes, charts) {
|
||
|
|
||
|
// first compute the maximum height
|
||
|
var maxHeight = _options.defaultFigHeight;
|
||
|
for (var i = 0; i<figureSizes.length; i++)
|
||
|
if (figureSizes[i].height > maxHeight)
|
||
|
maxHeight = figureSizes[i].height;
|
||
|
|
||
|
// now add offests for chart title and chart notes
|
||
|
if (charts.length)
|
||
|
maxHeight = adjustedHeight(maxHeight, charts.first());
|
||
|
|
||
|
return maxHeight;
|
||
|
}
|
||
|
|
||
|
function adjustedHeight(height, chart) {
|
||
|
if (chart.length > 0) {
|
||
|
var chartTitle = chart.find('.chart-title');
|
||
|
if (chartTitle.length)
|
||
|
height += chartTitle.first().outerHeight();
|
||
|
var chartNotes = chart.find('.chart-notes');
|
||
|
if (chartNotes.length)
|
||
|
height += chartNotes.first().outerHeight();
|
||
|
}
|
||
|
return height;
|
||
|
}
|
||
|
|
||
|
function maxChartWidth(figureSizes) {
|
||
|
var maxWidth = _options.defaultFigWidth;
|
||
|
for (var i = 0; i<figureSizes.length; i++)
|
||
|
if (figureSizes[i].width > maxWidth)
|
||
|
maxWidth = figureSizes[i].width;
|
||
|
return maxWidth;
|
||
|
}
|
||
|
|
||
|
// layout a chart
|
||
|
function layoutChart(chart, forceFlex) {
|
||
|
|
||
|
// state to return
|
||
|
var result = {
|
||
|
notes: false,
|
||
|
flex: false
|
||
|
};
|
||
|
|
||
|
// extract the title
|
||
|
var title = extractTitle(chart);
|
||
|
|
||
|
// find components that apply to this container
|
||
|
var components = componentsFind(chart);
|
||
|
|
||
|
// if it's a custom component then call it and return
|
||
|
var customComponents = componentsCustom(components);
|
||
|
if (customComponents.length) {
|
||
|
componentsLayout(customComponents, title, chart);
|
||
|
result.notes = false;
|
||
|
result.flex = forceFlex || componentsFlex(customComponents);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
// put all the content in a chart wrapper div
|
||
|
chart.addClass('chart-wrapper');
|
||
|
chart.wrapInner('<div class="chart-stage"></div>');
|
||
|
var chartContent = chart.children('.chart-stage');
|
||
|
|
||
|
// flex the content if appropriate
|
||
|
result.flex = forceFlex || componentsFlex(components);
|
||
|
if (result.flex) {
|
||
|
// add flex classes
|
||
|
chart.addClass('chart-wrapper-flex');
|
||
|
chartContent.addClass('chart-stage-flex');
|
||
|
|
||
|
// additional shim to break out of flexbox sizing
|
||
|
chartContent.wrapInner('<div class="chart-shim"></div>');
|
||
|
chartContent = chartContent.children('.chart-shim');
|
||
|
}
|
||
|
|
||
|
// set custom data-padding attribute
|
||
|
var pad = chart.attr('data-padding');
|
||
|
if (pad) {
|
||
|
if (pad === "0")
|
||
|
chart.addClass('no-padding');
|
||
|
else {
|
||
|
pad = pad + 'px';
|
||
|
chartContent.css('left', pad)
|
||
|
.css('top', pad)
|
||
|
.css('right', pad)
|
||
|
.css('bottom', pad)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// call compoents
|
||
|
componentsLayout(components, title, chartContent);
|
||
|
|
||
|
// also activate components on shiny output
|
||
|
findShinyOutput(chartContent).on('shiny:value',
|
||
|
function(event) {
|
||
|
var element = $(event.target);
|
||
|
setTimeout(function() {
|
||
|
|
||
|
// see if we opted out of flex based on our output (for shiny
|
||
|
// we can't tell what type of output we have until after the
|
||
|
// value is bound)
|
||
|
var components = componentsFind(element);
|
||
|
var flex = forceFlex || componentsFlex(components);
|
||
|
if (!flex) {
|
||
|
chart.css('height', "");
|
||
|
setFlex(chart, "");
|
||
|
chart.removeClass('chart-wrapper-flex');
|
||
|
chartContent.removeClass('chart-stage-flex');
|
||
|
chartContent.children().unwrap();
|
||
|
}
|
||
|
|
||
|
// perform layout
|
||
|
componentsLayout(components, title, element.parent());
|
||
|
}, 10);
|
||
|
});
|
||
|
|
||
|
// add the title
|
||
|
var chartTitle = $('<div class="chart-title"></div>');
|
||
|
chartTitle.html(title);
|
||
|
chart.prepend(chartTitle);
|
||
|
|
||
|
// add the notes section
|
||
|
var chartNotes = $('<div class="chart-notes"></div>');
|
||
|
chartNotes.html(' ');
|
||
|
chart.append(chartNotes);
|
||
|
|
||
|
// attempt to extract notes if we have a component
|
||
|
if (components.length)
|
||
|
result.notes = extractChartNotes(chartContent, chartNotes);
|
||
|
|
||
|
// return result
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
// build a tabset from a section div with the .tabset class
|
||
|
function layoutTabset(tabset) {
|
||
|
|
||
|
// check for fade option
|
||
|
var fade = tabset.hasClass("tabset-fade");
|
||
|
var navClass = "nav-tabs";
|
||
|
|
||
|
// determine the heading level of the tabset and tabs
|
||
|
var match = tabset.attr('class').match(/level(\d) /);
|
||
|
if (match === null)
|
||
|
return;
|
||
|
var tabsetLevel = Number(match[1]);
|
||
|
var tabLevel = tabsetLevel + 1;
|
||
|
|
||
|
// find all subheadings immediately below
|
||
|
var tabs = tabset.find("div.section.level" + tabLevel);
|
||
|
if (!tabs.length)
|
||
|
return;
|
||
|
|
||
|
// create tablist and tab-content elements
|
||
|
var tabList = $('<ul class="nav ' + navClass + '" role="tablist"></ul>');
|
||
|
$(tabs[0]).before(tabList);
|
||
|
var tabContent = $('<div class="tab-content"></div>');
|
||
|
$(tabs[0]).before(tabContent);
|
||
|
|
||
|
// build the tabset
|
||
|
tabs.each(function(i) {
|
||
|
|
||
|
// get the tab div
|
||
|
var tab = $(tabs[i]);
|
||
|
|
||
|
// get the id then sanitize it for use with bootstrap tabs
|
||
|
var id = tab.attr('id');
|
||
|
|
||
|
// sanitize the id for use with bootstrap tabs
|
||
|
id = id.replace(/[.\/?&!#<>]/g, '').replace(/\s/g, '_');
|
||
|
tab.attr('id', id);
|
||
|
|
||
|
// get the heading element within it and grab it's text
|
||
|
var heading = tab.find('h' + tabLevel + ':first');
|
||
|
var headingText = heading.html();
|
||
|
|
||
|
// build and append the tab list item
|
||
|
var a = $('<a role="tab" data-toggle="tab">' + headingText + '</a>');
|
||
|
a.attr('href', '#' + id);
|
||
|
a.attr('aria-controls', id);
|
||
|
var li = $('<li role="presentation"></li>');
|
||
|
li.append(a);
|
||
|
if (i === 0)
|
||
|
li.attr('class', 'active');
|
||
|
tabList.append(li);
|
||
|
|
||
|
// set it's attributes
|
||
|
tab.attr('role', 'tabpanel');
|
||
|
tab.addClass('tab-pane');
|
||
|
tab.addClass('tabbed-pane');
|
||
|
tab.addClass('no-title');
|
||
|
if (fade)
|
||
|
tab.addClass('fade');
|
||
|
if (i === 0) {
|
||
|
tab.addClass('active');
|
||
|
if (fade)
|
||
|
tab.addClass('in');
|
||
|
}
|
||
|
|
||
|
// move it into the tab content div
|
||
|
tab.detach().appendTo(tabContent);
|
||
|
});
|
||
|
|
||
|
// add nav-tabs-custom
|
||
|
tabset.addClass('nav-tabs-custom');
|
||
|
|
||
|
// internal layout is dashboard-column with tab-content flexing
|
||
|
tabset.addClass('dashboard-column');
|
||
|
setFlex(tabContent, 1);
|
||
|
}
|
||
|
|
||
|
// one time global initialization for components
|
||
|
function componentsInit(dashboardContainer) {
|
||
|
for (var i=0; i<window.FlexDashboardComponents.length; i++) {
|
||
|
var component = window.FlexDashboardComponents[i];
|
||
|
if (component.init)
|
||
|
component.init(dashboardContainer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// find components that apply within a container
|
||
|
function componentsFind(container) {
|
||
|
|
||
|
// look for components
|
||
|
var components = [];
|
||
|
for (var i=0; i<window.FlexDashboardComponents.length; i++) {
|
||
|
var component = window.FlexDashboardComponents[i];
|
||
|
if (component.find(container).length)
|
||
|
components.push(component);
|
||
|
}
|
||
|
|
||
|
// if there were none then use a special flowing content component
|
||
|
// that just adds a scrollbar in fillPage mode
|
||
|
if (components.length == 0) {
|
||
|
components.push({
|
||
|
find: function(container) {
|
||
|
return container;
|
||
|
},
|
||
|
|
||
|
flex: function(fillPage) {
|
||
|
return fillPage;
|
||
|
},
|
||
|
|
||
|
layout: function(title, container, element, fillPage) {
|
||
|
if (fillPage) {
|
||
|
container.addClass('flowing-content-shim');
|
||
|
container.addClass('flowing-content-container');
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return components;
|
||
|
}
|
||
|
|
||
|
// if there is a custom component then pick it out
|
||
|
function componentsCustom(components) {
|
||
|
var customComponent = [];
|
||
|
for (var i=0; i<components.length; i++)
|
||
|
if (components[i].type === "custom") {
|
||
|
customComponent.push(components[i]);
|
||
|
break;
|
||
|
}
|
||
|
return customComponent;
|
||
|
}
|
||
|
|
||
|
// query all components for flex
|
||
|
function componentsFlex(components) {
|
||
|
|
||
|
// no components at all means no flex
|
||
|
if (components.length === 0)
|
||
|
return false;
|
||
|
|
||
|
// otherwise query components (assume true unless we see false)
|
||
|
var isMobile = isMobilePhone();
|
||
|
for (var i=0; i<components.length; i++)
|
||
|
if (components[i].flex && !components[i].flex(_options.fillPage))
|
||
|
return false;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// layout all components
|
||
|
function componentsLayout(components, title, container) {
|
||
|
var isMobile = isMobilePhone();
|
||
|
for (var i=0; i<components.length; i++) {
|
||
|
var element = components[i].find(container);
|
||
|
if (components[i].layout) {
|
||
|
// call layout (don't call other components if it returns false)
|
||
|
var result = components[i].layout(title, container, element, _options.fillPage);
|
||
|
if (result === false)
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// get a reference to the h3, discover it's inner html, and remove it
|
||
|
function extractTitle(container) {
|
||
|
var h3 = container.children('h3').first();
|
||
|
var title = '';
|
||
|
if (!container.hasClass('no-title'))
|
||
|
title = h3.html();
|
||
|
h3.remove();
|
||
|
return title;
|
||
|
}
|
||
|
|
||
|
// extract chart notes
|
||
|
function extractChartNotes(chartContent, chartNotes) {
|
||
|
// look for a terminating blockquote or image caption
|
||
|
var blockquote = chartContent.children('blockquote:last-child');
|
||
|
var caption = chartContent.children('div.image-container')
|
||
|
.children('p.caption');
|
||
|
if (blockquote.length) {
|
||
|
chartNotes.html(blockquote.children('p:first-child').html());
|
||
|
blockquote.remove();
|
||
|
return true;
|
||
|
} else if (caption.length) {
|
||
|
chartNotes.html(caption.html());
|
||
|
caption.remove();
|
||
|
return true;
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function findShinyOutput(chartContent) {
|
||
|
return chartContent.find('.shiny-text-output, .shiny-html-output');
|
||
|
}
|
||
|
|
||
|
// safely detect rendering on a mobile phone
|
||
|
function isMobilePhone() {
|
||
|
try
|
||
|
{
|
||
|
return ! window.matchMedia("only screen and (min-width: 768px)").matches;
|
||
|
}
|
||
|
catch(e) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function isFillPage() {
|
||
|
return _options.fillPage;
|
||
|
}
|
||
|
|
||
|
// detect portrait mode
|
||
|
function isPortrait() {
|
||
|
return ($(window).width() < $(window).height());
|
||
|
}
|
||
|
|
||
|
// safely detect rendering on a tablet
|
||
|
function isTablet() {
|
||
|
try
|
||
|
{
|
||
|
return window.matchMedia("only screen and (min-width: 769px) and (max-width: 992px)").matches;
|
||
|
}
|
||
|
catch(e) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// test whether this is a shiny doc
|
||
|
function isShinyDoc() {
|
||
|
return (typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings);
|
||
|
}
|
||
|
|
||
|
// set flex using vendor specific prefixes
|
||
|
function setFlex(el, flex) {
|
||
|
el.css('-webkit-box-flex', flex)
|
||
|
.css('-webkit-flex', flex)
|
||
|
.css('-ms-flex', flex)
|
||
|
.css('flex', flex);
|
||
|
}
|
||
|
|
||
|
// support bookmarking of pages
|
||
|
function handleLocationHash() {
|
||
|
|
||
|
// restore tab/page from bookmark
|
||
|
var hash = window.location.hash;
|
||
|
if (hash.length > 0)
|
||
|
$('ul.nav a[href="' + hash + '"]').tab('show');
|
||
|
FlexDashboardUtils.manageActiveNavbarMenu();
|
||
|
|
||
|
// navigate to a tab when the history changes
|
||
|
window.addEventListener("popstate", function(e) {
|
||
|
var hash = window.location.hash;
|
||
|
var activeTab = $('ul.nav a[href="' + hash + '"]');
|
||
|
if (activeTab.length) {
|
||
|
activeTab.tab('show');
|
||
|
} else {
|
||
|
$('ul.nav a:first').tab('show');
|
||
|
}
|
||
|
FlexDashboardUtils.manageActiveNavbarMenu();
|
||
|
});
|
||
|
|
||
|
// add a hash to the URL when the user clicks on a tab/page
|
||
|
$('.navbar-nav a[data-toggle="tab"]').on('click', function(e) {
|
||
|
var baseUrl = FlexDashboardUtils.urlWithoutHash(window.location.href);
|
||
|
var hash = FlexDashboardUtils.urlHash($(this).attr('href'));
|
||
|
var href = baseUrl + hash;
|
||
|
FlexDashboardUtils.setLocation(href);
|
||
|
});
|
||
|
|
||
|
// handle clicks of other links that should activate pages
|
||
|
var navPages = $('ul.navbar-nav li a[data-toggle=tab]');
|
||
|
navPages.each(function() {
|
||
|
var href = $(this).attr('href');
|
||
|
var links = $('a[href="' + href + '"][data-toggle!=tab]');
|
||
|
links.each(function() {
|
||
|
$(this).on('click', function(e) {
|
||
|
window.FlexDashboardUtils.showPage(href);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// tweak Prism highlighting
|
||
|
function initPrismHighlighting() {
|
||
|
|
||
|
if (window.Prism) {
|
||
|
Prism.languages.insertBefore('r', 'comment', {
|
||
|
'heading': [
|
||
|
{
|
||
|
// title 1
|
||
|
// =======
|
||
|
|
||
|
// title 2
|
||
|
// -------
|
||
|
pattern: /\w+.*(?:\r?\n|\r)(?:====+|----+)/,
|
||
|
alias: 'operator'
|
||
|
},
|
||
|
{
|
||
|
// ### title 3
|
||
|
pattern: /(^\s*)###[^#].+/m,
|
||
|
lookbehind: true,
|
||
|
alias: 'operator'
|
||
|
}
|
||
|
]
|
||
|
});
|
||
|
|
||
|
// prism highlight
|
||
|
Prism.highlightAll();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// get theme color
|
||
|
var themeColors = {
|
||
|
bootstrap: {
|
||
|
primary: "rgba(51, 122, 183, 0.4)",
|
||
|
info: "rgb(217, 237, 247)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(252, 248, 227)",
|
||
|
danger: "rgb(242, 222, 222)"
|
||
|
},
|
||
|
cerulean: {
|
||
|
primary: "rgb(47, 164, 231)",
|
||
|
info: "rgb(217, 237, 247)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(252, 248, 227)",
|
||
|
danger: "rgb(242, 222, 222)"
|
||
|
},
|
||
|
journal: {
|
||
|
primary: "rgba(235, 104, 100, 0.70)",
|
||
|
info: "rgb(217, 237, 247)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(252, 248, 227)",
|
||
|
danger: "rgb(242, 222, 222)"
|
||
|
},
|
||
|
flatly: {
|
||
|
primary: "rgba(44, 62, 80, 0.70)",
|
||
|
info: "rgba(52, 152, 219, 0.70)",
|
||
|
success: "rgba(24, 188, 156, 0.70)",
|
||
|
warning: "rgba(243, 156, 18, 0.70)",
|
||
|
danger: "rgba(231, 76, 60, 0.70)"
|
||
|
},
|
||
|
readable: {
|
||
|
primary: "rgba(69, 130, 236, 0.4)",
|
||
|
info: "rgb(217, 237, 247)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(252, 248, 227)",
|
||
|
danger: "rgb(242, 222, 222)"
|
||
|
},
|
||
|
spacelab: {
|
||
|
primary: "rgba(68, 110, 155, 0.25)",
|
||
|
info: "rgb(217, 237, 247)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(252, 248, 227)",
|
||
|
danger: "rgb(242, 222, 222)"
|
||
|
},
|
||
|
united: {
|
||
|
primary: "rgba(221, 72, 20, 0.30)",
|
||
|
info: "rgb(217, 237, 247)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(252, 248, 227)",
|
||
|
danger: "rgb(242, 222, 222)"
|
||
|
},
|
||
|
cosmo: {
|
||
|
primary: "rgba(39, 128, 227, 0.7)",
|
||
|
info: "rgba(153, 84, 187, 0.7)",
|
||
|
success: "rgba(63, 182, 24, 0.7)",
|
||
|
warning: "rgba(255, 117, 24, 0.7)",
|
||
|
danger: "rgba(255, 0, 57, 0.7)"
|
||
|
},
|
||
|
lumen: {
|
||
|
primary: "rgba(21, 140, 186, 0.70)",
|
||
|
info: "rgba(117, 202, 235, 0.90)",
|
||
|
success: "rgba(40, 182, 44, 0.70)",
|
||
|
warning: "rgba(255, 133, 27, 0.70)",
|
||
|
danger: "rgba(255, 65, 54, 0.70)"
|
||
|
},
|
||
|
paper: {
|
||
|
primary: "rgba(33, 150, 243, 0.35)",
|
||
|
info: "rgb(225, 190, 231)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(255, 224, 178)",
|
||
|
danger: "rgb(249, 189, 187)"
|
||
|
},
|
||
|
sandstone: {
|
||
|
primary: "rgba(50, 93, 136, 0.3)",
|
||
|
info: "rgb(217, 237, 247)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(252, 248, 227)",
|
||
|
danger: "rgb(242, 222, 222)"
|
||
|
},
|
||
|
simplex: {
|
||
|
primary: "rgba(217, 35, 15, 0.25)",
|
||
|
info: "rgb(217, 237, 247)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(252, 248, 227)",
|
||
|
danger: "rgb(242, 222, 222)"
|
||
|
},
|
||
|
yeti: {
|
||
|
primary: "rgba(0, 140, 186, 0.298039)",
|
||
|
info: "rgb(217, 237, 247)",
|
||
|
success: "rgb(223, 240, 216)",
|
||
|
warning: "rgb(252, 248, 227)",
|
||
|
danger: "rgb(242, 222, 222)"
|
||
|
}
|
||
|
}
|
||
|
function themeColor(color) {
|
||
|
return themeColors[_options.theme][color];
|
||
|
}
|
||
|
|
||
|
FlexDashboard.prototype = {
|
||
|
constructor: FlexDashboard,
|
||
|
init: init,
|
||
|
isMobilePhone: isMobilePhone,
|
||
|
isFillPage: isFillPage,
|
||
|
themeColor: themeColor
|
||
|
};
|
||
|
|
||
|
return FlexDashboard;
|
||
|
|
||
|
})();
|
||
|
|
||
|
// utils
|
||
|
window.FlexDashboardUtils = {
|
||
|
resizableImage: function(img) {
|
||
|
var src = img.attr('src');
|
||
|
var url = 'url("' + src + '")';
|
||
|
img.parent().css('background', url)
|
||
|
.css('background-size', 'contain')
|
||
|
.css('background-repeat', 'no-repeat')
|
||
|
.css('background-position', 'center')
|
||
|
.addClass('image-container');
|
||
|
},
|
||
|
setLocation: function(href) {
|
||
|
if (history && history.pushState) {
|
||
|
history.pushState(null, null, href);
|
||
|
} else {
|
||
|
window.location.replace(href);
|
||
|
}
|
||
|
setTimeout(function() {
|
||
|
window.scrollTo(0, 0);
|
||
|
}, 10);
|
||
|
this.manageActiveNavbarMenu();
|
||
|
},
|
||
|
showPage: function(href) {
|
||
|
$('ul.navbar-nav li a[href="' + href + '"]').tab('show');
|
||
|
var baseUrl = this.urlWithoutHash(window.location.href);
|
||
|
var loc = baseUrl + href;
|
||
|
this.setLocation(loc);
|
||
|
},
|
||
|
showLinkedValue: function(href) {
|
||
|
// check for a page link
|
||
|
if ($('ul.navbar-nav li a[data-toggle=tab][href="' + href + '"]').length > 0)
|
||
|
this.showPage(href);
|
||
|
else
|
||
|
window.open(href);
|
||
|
},
|
||
|
urlWithoutHash: function(url) {
|
||
|
var hashLoc = url.indexOf('#');
|
||
|
if (hashLoc != -1)
|
||
|
return url.substring(0, hashLoc);
|
||
|
else
|
||
|
return url;
|
||
|
},
|
||
|
urlHash: function(url) {
|
||
|
var hashLoc = url.indexOf('#');
|
||
|
if (hashLoc != -1)
|
||
|
return url.substring(hashLoc);
|
||
|
else
|
||
|
return "";
|
||
|
},
|
||
|
manageActiveNavbarMenu: function () {
|
||
|
// remove active from anyone currently active
|
||
|
$('.navbar ul.nav').find('li').removeClass('active');
|
||
|
// find the active tab
|
||
|
var activeTab = $('.dashboard-page-wrapper.tab-pane.active');
|
||
|
if (activeTab.length > 0) {
|
||
|
var tabId = activeTab.attr('id');
|
||
|
if (tabId)
|
||
|
$(".navbar ul.nav a[href='#" + tabId + "']").parents('li').addClass('active');
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
window.FlexDashboard = new FlexDashboard();
|
||
|
|
||
|
// empty content
|
||
|
window.FlexDashboardComponents.push({
|
||
|
find: function(container) {
|
||
|
if (container.find('p').length == 0)
|
||
|
return container;
|
||
|
else
|
||
|
return $();
|
||
|
}
|
||
|
})
|
||
|
|
||
|
// plot image
|
||
|
window.FlexDashboardComponents.push({
|
||
|
|
||
|
find: function(container) {
|
||
|
return container.children('p')
|
||
|
.children('img:only-child');
|
||
|
},
|
||
|
|
||
|
layout: function(title, container, element, fillPage) {
|
||
|
FlexDashboardUtils.resizableImage(element);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// plot image (figure style)
|
||
|
window.FlexDashboardComponents.push({
|
||
|
|
||
|
find: function(container) {
|
||
|
return container.children('div.figure').children('img');
|
||
|
},
|
||
|
|
||
|
layout: function(title, container, element, fillPage) {
|
||
|
FlexDashboardUtils.resizableImage(element);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// htmlwidget
|
||
|
window.FlexDashboardComponents.push({
|
||
|
|
||
|
init: function(dashboardContainer) {
|
||
|
// trigger "shown" after initial layout to force static htmlwidgets
|
||
|
// in runtime: shiny to be resized after the dom has been transformed
|
||
|
dashboardContainer.on('flexdashboard:layoutcomplete', function(event) {
|
||
|
setTimeout(function() {
|
||
|
dashboardContainer.trigger('shown');
|
||
|
}, 200);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
find: function(container) {
|
||
|
return container.children('div[id^="htmlwidget-"],div.html-widget');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// gauge
|
||
|
window.FlexDashboardComponents.push({
|
||
|
|
||
|
find: function(container) {
|
||
|
return container.children('div.html-widget.gauge');
|
||
|
},
|
||
|
|
||
|
flex: function(fillPage) {
|
||
|
return false;
|
||
|
},
|
||
|
|
||
|
layout: function(title, container, element, fillPage) {
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
// shiny output
|
||
|
window.FlexDashboardComponents.push({
|
||
|
find: function(container) {
|
||
|
return container.children('div[class^="shiny-"]');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// datatables
|
||
|
window.FlexDashboardComponents.push({
|
||
|
find: function(container) {
|
||
|
return container.find('.datatables');
|
||
|
},
|
||
|
flex: function(fillPage) {
|
||
|
return fillPage;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// bootstrap table
|
||
|
window.FlexDashboardComponents.push({
|
||
|
|
||
|
find: function(container) {
|
||
|
var bsTable = container.find('table.table');
|
||
|
if (bsTable.length !== 0)
|
||
|
return bsTable;
|
||
|
else
|
||
|
return container.find('tr.header').parent('thead').parent('table');
|
||
|
},
|
||
|
|
||
|
flex: function(fillPage) {
|
||
|
return fillPage;
|
||
|
},
|
||
|
|
||
|
layout: function(title, container, element, fillPage) {
|
||
|
|
||
|
// alias variables
|
||
|
var bsTable = element;
|
||
|
|
||
|
// fixup xtable generated tables with a proper thead
|
||
|
var headerRow = bsTable.find('tbody > tr:first-child > th').parent();
|
||
|
if (headerRow.length > 0) {
|
||
|
var thead = $('<thead></thead>');
|
||
|
bsTable.prepend(thead);
|
||
|
headerRow.detach().appendTo(thead);
|
||
|
}
|
||
|
|
||
|
// improve appearance
|
||
|
container.addClass('bootstrap-table');
|
||
|
|
||
|
// for fill page provide scrolling w/ sticky headers
|
||
|
if (fillPage) {
|
||
|
// force scrollbar on overflow
|
||
|
container.addClass('flowing-content-shim');
|
||
|
|
||
|
// stable table headers when scrolling
|
||
|
bsTable.stickyTableHeaders({
|
||
|
scrollableArea: container
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// embedded shiny app
|
||
|
window.FlexDashboardComponents.push({
|
||
|
|
||
|
find: function(container) {
|
||
|
return container.find('iframe.shiny-frame');
|
||
|
},
|
||
|
|
||
|
flex: function(fillPage) {
|
||
|
return fillPage;
|
||
|
},
|
||
|
|
||
|
layout: function(title, container, element, fillPage) {
|
||
|
if (fillPage) {
|
||
|
element.attr('height', '100%');
|
||
|
} else {
|
||
|
// provide default height if necessary
|
||
|
var height = element.get(0).style.height;
|
||
|
if (!height)
|
||
|
height = element.attr('height');
|
||
|
if (!height)
|
||
|
element.attr('height', 500);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// shiny fillRow or fillCol
|
||
|
window.FlexDashboardComponents.push({
|
||
|
|
||
|
find: function(container) {
|
||
|
return container.find('.flexfill-container');
|
||
|
},
|
||
|
|
||
|
flex: function(fillPage) {
|
||
|
return fillPage;
|
||
|
},
|
||
|
|
||
|
layout: function(title, container, element, fillPage) {
|
||
|
if (fillPage)
|
||
|
element.css('height', '100%');
|
||
|
else {
|
||
|
// provide default height if necessary
|
||
|
var height = element.get(0).style.height;
|
||
|
if (height === "100%" || height === "auto" || height === "initial" ||
|
||
|
height === "inherit" || !height) {
|
||
|
element.css('height', 500);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// valueBox
|
||
|
window.FlexDashboardComponents.push({
|
||
|
|
||
|
type: "custom",
|
||
|
|
||
|
find: function(container) {
|
||
|
if (container.find('span.value-output, .shiny-valuebox-output').length)
|
||
|
return container;
|
||
|
else
|
||
|
return $();
|
||
|
},
|
||
|
|
||
|
flex: function(fillPage) {
|
||
|
return false;
|
||
|
},
|
||
|
|
||
|
layout: function(title, container, element, fillPage) {
|
||
|
|
||
|
// alias variables
|
||
|
var chartTitle = title;
|
||
|
var valueBox = element;
|
||
|
|
||
|
// add value-box class to container
|
||
|
container.addClass('value-box');
|
||
|
|
||
|
// value paragraph
|
||
|
var value = $('<p class="value"></p>');
|
||
|
|
||
|
// if we have shiny-text-output then just move it in
|
||
|
var valueOutputSpan = [];
|
||
|
var shinyOutput = valueBox.find('.shiny-valuebox-output').detach();
|
||
|
if (shinyOutput.length) {
|
||
|
valueBox.children().remove();
|
||
|
shinyOutput.html("—");
|
||
|
value.append(shinyOutput);
|
||
|
} else {
|
||
|
// extract the value (remove leading vector index)
|
||
|
var chartValue = valueBox.text().trim();
|
||
|
chartValue = chartValue.replace("[1] ", "");
|
||
|
valueOutputSpan = valueBox.find('span.value-output').detach();
|
||
|
valueBox.children().remove();
|
||
|
value.text(chartValue);
|
||
|
}
|
||
|
|
||
|
// caption
|
||
|
var caption = $('<p class="caption"></p>');
|
||
|
caption.html(chartTitle);
|
||
|
|
||
|
// build inner div for value box and add it
|
||
|
var inner = $('<div class="inner"></div>');
|
||
|
inner.append(value);
|
||
|
inner.append(caption);
|
||
|
valueBox.append(inner);
|
||
|
|
||
|
// add icon if specified
|
||
|
var icon = $('<div class="icon"><i></i></div>');
|
||
|
valueBox.append(icon);
|
||
|
function setIcon(chartIcon) {
|
||
|
var iconLib = "";
|
||
|
var components = chartIcon.split("-");
|
||
|
if (components.length > 1)
|
||
|
iconLib = components[0];
|
||
|
icon.children('i').attr('class', iconLib + ' ' + chartIcon);
|
||
|
}
|
||
|
var chartIcon = valueBox.attr('data-icon');
|
||
|
if (chartIcon)
|
||
|
setIcon(chartIcon);
|
||
|
|
||
|
// set color based on data-background if necessary
|
||
|
var dataBackground = valueBox.attr('data-background');
|
||
|
if (dataBackground)
|
||
|
valueBox.css('background-color', bgColor);
|
||
|
else {
|
||
|
// default to bg-primary if no other background is specified
|
||
|
if (!valueBox.hasClass('bg-primary') &&
|
||
|
!valueBox.hasClass('bg-info') &&
|
||
|
!valueBox.hasClass('bg-warning') &&
|
||
|
!valueBox.hasClass('bg-success') &&
|
||
|
!valueBox.hasClass('bg-danger')) {
|
||
|
valueBox.addClass('bg-primary');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// handle data attributes in valueOutputSpan
|
||
|
function handleValueOutput(valueOutput) {
|
||
|
|
||
|
// caption
|
||
|
var dataCaption = valueOutput.attr('data-caption');
|
||
|
if (dataCaption)
|
||
|
caption.html(dataCaption);
|
||
|
|
||
|
// icon
|
||
|
var dataIcon = valueOutput.attr('data-icon');
|
||
|
if (dataIcon)
|
||
|
setIcon(dataIcon);
|
||
|
|
||
|
// color
|
||
|
var dataColor = valueOutput.attr('data-color');
|
||
|
if (dataColor) {
|
||
|
if (dataColor.indexOf('bg-') === 0) {
|
||
|
valueBox.css('background-color', '');
|
||
|
if (!valueBox.hasClass(dataColor)) {
|
||
|
valueBox.removeClass('bg-primary bg-info bg-warning bg-danger bg-success');
|
||
|
valueBox.addClass(dataColor);
|
||
|
}
|
||
|
} else {
|
||
|
valueBox.removeClass('bg-primary bg-info bg-warning bg-danger bg-success');
|
||
|
valueBox.css('background-color', dataColor);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// url
|
||
|
var dataHref = valueOutput.attr('data-href');
|
||
|
if (dataHref) {
|
||
|
valueBox.addClass('linked-value');
|
||
|
valueBox.off('click.value-box');
|
||
|
valueBox.on('click.value-box', function(e) {
|
||
|
window.FlexDashboardUtils.showLinkedValue(dataHref);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// check for a valueOutputSpan
|
||
|
if (valueOutputSpan.length > 0) {
|
||
|
handleValueOutput(valueOutputSpan);
|
||
|
}
|
||
|
|
||
|
// if we have a shinyOutput then bind a listener to handle
|
||
|
// new valueOutputSpan values
|
||
|
shinyOutput.on('shiny:value',
|
||
|
function(event) {
|
||
|
var element = $(event.target);
|
||
|
setTimeout(function() {
|
||
|
var valueOutputSpan = element.find('span.value-output');
|
||
|
if (valueOutputSpan.length > 0)
|
||
|
handleValueOutput(valueOutputSpan);
|
||
|
}, 10);
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
|
||
|
</script>
|
||
|
|
||
|
<div id="dashboard-container">
|
||
|
|
||
|
<div id="kolumna-1" class="section level2">
|
||
|
<h2>Kolumna 1</h2>
|
||
|
<div id="karaty-zmienna-carat" class="section level3">
|
||
|
<h3>Karaty (zmienna carat)</h3>
|
||
|
<div class="knitr-options" data-fig-width="480" data-fig-height="160">
|
||
|
|
||
|
</div>
|
||
|
<p><img src="data:image/png;base64,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
|
||
|
</div>
|
||
|
<div id="szlif-zmienna-cut" class="section level3">
|
||
|
<h3>Szlif (zmienna cut)</h3>
|
||
|
<div class="knitr-options" data-fig-width="480" data-fig-height="160">
|
||
|
|
||
|
</div>
|
||
|
<p><img src="data:image/png;base64,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
|
||
|
</div>
|
||
|
<div id="kolor-zmienna-color" class="section level3">
|
||
|
<h3>Kolor (zmienna color)</h3>
|
||
|
<div class="knitr-options" data-fig-width="480" data-fig-height="160">
|
||
|
|
||
|
</div>
|
||
|
<p><img src="data:image/png;base64,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
|
||
|
</div>
|
||
|
</div>
|
||
|
<div id="kolumna-2" class="section level2">
|
||
|
<h2>Kolumna 2</h2>
|
||
|
<div id="największe-diamenty" class="section level3">
|
||
|
<h3>Największe diamenty</h3>
|
||
|
<div class="knitr-options" data-fig-width="480" data-fig-height="160">
|
||
|
|
||
|
</div>
|
||
|
<div id="htmlwidget-5c635f2e124b8bb2ab51" style="width:100%;height:auto;" class="datatables html-widget"></div>
|
||
|
<script type="application/json" data-for="htmlwidget-5c635f2e124b8bb2ab51">{"x":{"filter":"none","fillContainer":true,"data":[["1","2","3","4","5","6","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","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100"],[5.01,4.5,4.13,4.01,4.01,4,3.67,3.65,3.51,3.5,3.4,3.24,3.22,3.11,3.05,3.04,3.04,3.02,3.01,3.01,3.01,3.01,3.01,3.01,3.01,3.01,3.01,3.01,3.01,3.01,3.01,3.01,3,3,3,3,3,3,3,3,2.8,2.8,2.77,2.75,2.75,2.74,2.74,2.74,2.72,2.72,2.72,2.71,2.7,2.68,2.68,2.67,2.66,2.66,2.66,2.65,2.64,2.63,2.63,2.63,2.61,2.61,2.61,2.6,2.6,2.6,2.59,2.58,2.58,2.58,2.57,2.57,2.57,2.56,2.56,2.56,2.55,2.55,2.55,2.54,2.54,2.54,2.54,2.54,2.54,2.54,2.54,2.54,2.53,2.53,2.53,2.53,2.53,2.53,2.53,2.53],["Fair","Fair","Fair","Premium","Premium","Very Good","Premium","Fair","Premium","Ideal","Fair","Premium","Ideal","Fair","Premium","Very Good","Premium","Fair","Premium","Premium","Fair","Premium","Ideal","Ideal","Premium","Fair","Fair","Good","Good","Good","Premium","Premium","Very Good","Fair","Good","Good","Premium","Good","Premium","Fair","Premium","Good","Premium","Ideal","Premium","Fair","Very Good","Very Good","Fair","Ideal","Ideal","Premium","Very Good","Premium","Very Good","Good","Good","Good","Good","Premium","Ideal","Very Good","Premium","Ideal","Good","Ideal","Ideal","Fair","Premium","Ideal","Ideal","Fair","Very Good","Premium","Premium","Premium","Premium","Good","Premium","Ideal","Premium","Good","Premium","Very Good","Ideal","Ideal","Premium","Very Good","Very Good","Very Good","Ideal","Very Good","Premium","Premium","Ideal","Ideal","Premium","Fair","Premium","Premium"],["J","J","H","I","J","I","I","H","J","H","D","H","I","J","E","I","I","I","I","F","H","G","J","J","I","I","I","I","I","H","J","J","H","H","I","E","G","J","I","I","I","G","H","D","H","J","J","H","J","H","J","E","H","G","I","F","H","H","H","G","H","J","J","J","I","J","I","G","J","J","J","F","D","H","E","D","J","J","J","J","I","H","I","I","I","G","H","I","H","H","G","I","H","H","J","I","J","H","H","H"],[18018,18531,17329,15223,15223,15984,16193,11668,18701,12587,15964,12300,12545,9823,10453,15354,18559,10577,8040,9925,10761,14220,16037,16538,18242,18242,18242,18242,18242,18593,18710,18710,6512,8044,10863,11548,13203,14918,16970,16970,15030,18788,10424,13156,15415,8807,17164,17184,6870,11594,17801,17146,14341,8419,9665,18686,16239,16239,18495,16314,17407,10437,10628,16914,13784,17209,18756,17027,17209,18369,16465,12500,14749,16195,17116,17924,18485,15231,17186,17753,14351,14775,18766,12095,12687,14421,14717,15394,16353,16353,17339,17996,14659,15148,15993,16709,16934,17103,17591,18254]],"container":"<table class=\"display fill-container\">\n <thead>\n <tr>\n <th> <\/th>\n <th>carat<\/th>\n <th>cut<\/th>\n <th>color<\/th>\n <th>price<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"columnDefs":[{"className":"dt-right","targets":[1,4]},{"orderable":false,"targets":0}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
</div>
|
||
|
|
||
|
<script>
|
||
|
|
||
|
$(document).ready(function () {
|
||
|
|
||
|
// add bootstrap table styles to pandoc tables
|
||
|
$('tr.header').parent('thead').parent('table').addClass('table table-condensed');
|
||
|
|
||
|
// initialize mathjax
|
||
|
var script = document.createElement("script");
|
||
|
script.type = "text/javascript";
|
||
|
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
|
||
|
document.getElementsByTagName("head")[0].appendChild(script);
|
||
|
|
||
|
});
|
||
|
</script>
|
||
|
|
||
|
<script type="text/javascript">
|
||
|
$(document).ready(function () {
|
||
|
FlexDashboard.init({
|
||
|
theme: "cosmo",
|
||
|
fillPage: true,
|
||
|
orientation: "columns",
|
||
|
storyboard: false,
|
||
|
defaultFigWidth: 576,
|
||
|
defaultFigHeight: 460,
|
||
|
defaultFigWidthMobile: 360,
|
||
|
defaultFigHeightMobile: 460
|
||
|
});
|
||
|
});
|
||
|
</script>
|
||
|
|
||
|
</body>
|
||
|
</html>
|