{ "version": 3, "sources": ["../node_modules/ev-emitter/ev-emitter.js", "../node_modules/get-size/get-size.js", "../node_modules/desandro-matches-selector/matches-selector.js", "../node_modules/fizzy-ui-utils/utils.js", "../node_modules/outlayer/item.js", "../node_modules/outlayer/outlayer.js", "../node_modules/masonry-layout/masonry.js", "../src/stats_views.js", "../src/stats.mjs"], "sourcesContent": ["/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice(0);\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( var i=0; i < listeners.length; i++ ) {\n var listener = listeners[i]\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n", "/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n", "/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n", "/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'desandro-matches-selector/matches-selector'\n ], function( matchesSelector ) {\n return factory( window, matchesSelector );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n\n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n clearTimeout( timeout );\n\n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n", "/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( [\n 'ev-emitter/ev-emitter',\n 'get-size/get-size'\n ],\n factory\n );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n require('ev-emitter'),\n require('get-size')\n );\n } else {\n // browser global\n window.Outlayer = {};\n window.Outlayer.Item = factory(\n window.EvEmitter,\n window.getSize\n );\n }\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n for ( var prop in obj ) {\n return false;\n }\n prop = null;\n return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n 'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n 'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n WebkitTransition: 'webkitTransitionEnd',\n transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n transform: transformProperty,\n transition: transitionProperty,\n transitionDuration: transitionProperty + 'Duration',\n transitionProperty: transitionProperty + 'Property',\n transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n if ( !element ) {\n return;\n }\n\n this.element = element;\n // parent layout class, i.e. Masonry, Isotope, or Packery\n this.layout = layout;\n this.position = {\n x: 0,\n y: 0\n };\n\n this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n // transition objects\n this._transn = {\n ingProperties: {},\n clean: {},\n onEnd: {}\n };\n\n this.css({\n position: 'absolute'\n });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n var elemStyle = this.element.style;\n\n for ( var prop in style ) {\n // use vendor property if available\n var supportedProp = vendorProperties[ prop ] || prop;\n elemStyle[ supportedProp ] = style[ prop ];\n }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n var style = getComputedStyle( this.element );\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n var x = parseFloat( xValue );\n var y = parseFloat( yValue );\n // convert percent to pixels\n var layoutSize = this.layout.size;\n if ( xValue.indexOf('%') != -1 ) {\n x = ( x / 100 ) * layoutSize.width;\n }\n if ( yValue.indexOf('%') != -1 ) {\n y = ( y / 100 ) * layoutSize.height;\n }\n // clean up 'auto' or other non-integer values\n x = isNaN( x ) ? 0 : x;\n y = isNaN( y ) ? 0 : y;\n // remove padding from measurement\n x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n this.position.x = x;\n this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n var layoutSize = this.layout.size;\n var style = {};\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n\n // x\n var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n var xProperty = isOriginLeft ? 'left' : 'right';\n var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n var x = this.position.x + layoutSize[ xPadding ];\n // set in percentage or pixels\n style[ xProperty ] = this.getXValue( x );\n // reset other property\n style[ xResetProperty ] = '';\n\n // y\n var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n var yProperty = isOriginTop ? 'top' : 'bottom';\n var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n var y = this.position.y + layoutSize[ yPadding ];\n // set in percentage or pixels\n style[ yProperty ] = this.getYValue( y );\n // reset other property\n style[ yResetProperty ] = '';\n\n this.css( style );\n this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && !isHorizontal ?\n ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && isHorizontal ?\n ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n this.getPosition();\n // get current x & y from top/left\n var curX = this.position.x;\n var curY = this.position.y;\n\n var didNotMove = x == this.position.x && y == this.position.y;\n\n // save end position\n this.setPosition( x, y );\n\n // if did not move and not transitioning, just go to layout\n if ( didNotMove && !this.isTransitioning ) {\n this.layoutPosition();\n return;\n }\n\n var transX = x - curX;\n var transY = y - curY;\n var transitionStyle = {};\n transitionStyle.transform = this.getTranslate( transX, transY );\n\n this.transition({\n to: transitionStyle,\n onTransitionEnd: {\n transform: this.layoutPosition\n },\n isCleaning: true\n });\n};\n\nproto.getTranslate = function( x, y ) {\n // flip cooridinates if origin on right or bottom\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n x = isOriginLeft ? x : -x;\n y = isOriginTop ? y : -y;\n return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n this.setPosition( x, y );\n this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n this.position.x = parseFloat( x );\n this.position.y = parseFloat( y );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n this.css( args.to );\n if ( args.isCleaning ) {\n this._removeStyles( args.to );\n }\n for ( var prop in args.onTransitionEnd ) {\n args.onTransitionEnd[ prop ].call( this );\n }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n * @param {Object} to - style to transition to\n * @param {Object} from - style to start transition from\n * @param {Boolean} isCleaning - removes transition styles after transition\n * @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n // redirect to nonTransition if no transition duration\n if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n this._nonTransition( args );\n return;\n }\n\n var _transition = this._transn;\n // keep track of onTransitionEnd callback by css property\n for ( var prop in args.onTransitionEnd ) {\n _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n }\n // keep track of properties that are transitioning\n for ( prop in args.to ) {\n _transition.ingProperties[ prop ] = true;\n // keep track of properties to clean up when transition is done\n if ( args.isCleaning ) {\n _transition.clean[ prop ] = true;\n }\n }\n\n // set from styles\n if ( args.from ) {\n this.css( args.from );\n // force redraw. http://blog.alexmaccaw.com/css-transitions\n var h = this.element.offsetHeight;\n // hack for JSHint to hush about unused var\n h = null;\n }\n // enable transition\n this.enableTransition( args.to );\n // set styles that are transitioning\n this.css( args.to );\n\n this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n return str.replace( /([A-Z])/g, function( $1 ) {\n return '-' + $1.toLowerCase();\n });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n // HACK changing transitionProperty during a transition\n // will cause transition to jump\n if ( this.isTransitioning ) {\n return;\n }\n\n // make `transition: foo, bar, baz` from style object\n // HACK un-comment this when enableTransition can work\n // while a transition is happening\n // var transitionValues = [];\n // for ( var prop in style ) {\n // // dash-ify camelCased properties like WebkitTransition\n // prop = vendorProperties[ prop ] || prop;\n // transitionValues.push( toDashedAll( prop ) );\n // }\n // munge number to millisecond, to match stagger\n var duration = this.layout.options.transitionDuration;\n duration = typeof duration == 'number' ? duration + 'ms' : duration;\n // enable transition styles\n this.css({\n transitionProperty: transitionProps,\n transitionDuration: duration,\n transitionDelay: this.staggerDelay || 0\n });\n // listen for transition end event\n this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n // disregard bubbled events from children\n if ( event.target !== this.element ) {\n return;\n }\n var _transition = this._transn;\n // get property name of transitioned property, convert to prefix-free\n var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n // remove property that has completed transitioning\n delete _transition.ingProperties[ propertyName ];\n // check if any properties are still transitioning\n if ( isEmptyObj( _transition.ingProperties ) ) {\n // all properties have completed transitioning\n this.disableTransition();\n }\n // clean style\n if ( propertyName in _transition.clean ) {\n // clean up style\n this.element.style[ event.propertyName ] = '';\n delete _transition.clean[ propertyName ];\n }\n // trigger onTransitionEnd callback\n if ( propertyName in _transition.onEnd ) {\n var onTransitionEnd = _transition.onEnd[ propertyName ];\n onTransitionEnd.call( this );\n delete _transition.onEnd[ propertyName ];\n }\n\n this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n this.removeTransitionStyles();\n this.element.removeEventListener( transitionEndEvent, this, false );\n this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n // clean up transition styles\n var cleanStyle = {};\n for ( var prop in style ) {\n cleanStyle[ prop ] = '';\n }\n this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n transitionProperty: '',\n transitionDuration: '',\n transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n // remove transition\n this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n delay = isNaN( delay ) ? 0 : delay;\n this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n this.element.parentNode.removeChild( this.element );\n // remove display: none\n this.css({ display: '' });\n this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n // just remove element if no transition support or no transition\n if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n this.removeElem();\n return;\n }\n\n // start transition\n this.once( 'transitionEnd', function() {\n this.removeElem();\n });\n this.hide();\n};\n\nproto.reveal = function() {\n delete this.isHidden;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n this.transition({\n from: options.hiddenStyle,\n to: options.visibleStyle,\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onRevealTransitionEnd = function() {\n // check if still visible\n // during transition, item may have been hidden\n if ( !this.isHidden ) {\n this.emitEvent('reveal');\n }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n var optionStyle = this.layout.options[ styleProperty ];\n // use opacity\n if ( optionStyle.opacity ) {\n return 'opacity';\n }\n // get first property\n for ( var prop in optionStyle ) {\n return prop;\n }\n};\n\nproto.hide = function() {\n // set flag\n this.isHidden = true;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n this.transition({\n from: options.visibleStyle,\n to: options.hiddenStyle,\n // keep hidden stuff hidden\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onHideTransitionEnd = function() {\n // check if still hidden\n // during transition, item may have been un-hidden\n if ( this.isHidden ) {\n this.css({ display: 'none' });\n this.emitEvent('hide');\n }\n};\n\nproto.destroy = function() {\n this.css({\n position: '',\n left: '',\n right: '',\n top: '',\n bottom: '',\n transition: '',\n transform: ''\n });\n};\n\nreturn Item;\n\n}));\n", "/*!\n * Outlayer v2.1.1\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n 'use strict';\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( [\n 'ev-emitter/ev-emitter',\n 'get-size/get-size',\n 'fizzy-ui-utils/utils',\n './item'\n ],\n function( EvEmitter, getSize, utils, Item ) {\n return factory( window, EvEmitter, getSize, utils, Item);\n }\n );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./item')\n );\n } else {\n // browser global\n window.Outlayer = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n window.Outlayer.Item\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for ' + this.constructor.namespace +\n ': ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // add id for Outlayer.getFromElement\n var id = ++GUID;\n this.element.outlayerGUID = id; // expando\n instances[ id ] = this; // associate via id\n\n // kick it off\n this._create();\n\n var isInitLayout = this._getOption('initLayout');\n if ( isInitLayout ) {\n this.layout();\n }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n containerStyle: {\n position: 'relative'\n },\n initLayout: true,\n originLeft: true,\n originTop: true,\n resize: true,\n resizeContainer: true,\n // item options\n transitionDuration: '0.4s',\n hiddenStyle: {\n opacity: 0,\n transform: 'scale(0.001)'\n },\n visibleStyle: {\n opacity: 1,\n transform: 'scale(1)'\n }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n var oldOption = this.constructor.compatOptions[ option ];\n return oldOption && this.options[ oldOption ] !== undefined ?\n this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n // currentName: oldName\n initLayout: 'isInitLayout',\n horizontal: 'isHorizontal',\n layoutInstant: 'isLayoutInstant',\n originLeft: 'isOriginLeft',\n originTop: 'isOriginTop',\n resize: 'isResizeBound',\n resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n // get items from children\n this.reloadItems();\n // elements that affect layout, but are not laid out\n this.stamps = [];\n this.stamp( this.options.stamp );\n // set container style\n utils.extend( this.element.style, this.options.containerStyle );\n\n // bind resize method\n var canBindResize = this._getOption('resize');\n if ( canBindResize ) {\n this.bindResize();\n }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n // collection of item elements\n this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n var itemElems = this._filterFindItemElements( elems );\n var Item = this.constructor.Item;\n\n // create new Outlayer Items for collection\n var items = [];\n for ( var i=0; i < itemElems.length; i++ ) {\n var elem = itemElems[i];\n var item = new Item( elem, this );\n items.push( item );\n }\n\n return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n return this.items.map( function( item ) {\n return item.element;\n });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n this._resetLayout();\n this._manageStamps();\n\n // don't animate first layout\n var layoutInstant = this._getOption('layoutInstant');\n var isInstant = layoutInstant !== undefined ?\n layoutInstant : !this._isLayoutInited;\n this.layoutItems( this.items, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n this.getSize();\n};\n\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n var option = this.options[ measurement ];\n var elem;\n if ( !option ) {\n // default to 0\n this[ measurement ] = 0;\n } else {\n // use option as an element\n if ( typeof option == 'string' ) {\n elem = this.element.querySelector( option );\n } else if ( option instanceof HTMLElement ) {\n elem = option;\n }\n // use size of element, if element\n this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n items = this._getItemsForLayout( items );\n\n this._layoutItems( items, isInstant );\n\n this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n return items.filter( function( item ) {\n return !item.isIgnored;\n });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n this._emitCompleteOnItems( 'layout', items );\n\n if ( !items || !items.length ) {\n // no items, emit event with empty array\n return;\n }\n\n var queue = [];\n\n items.forEach( function( item ) {\n // get x/y object from method\n var position = this._getItemLayoutPosition( item );\n // enqueue\n position.item = item;\n position.isInstant = isInstant || item.isLayoutInstant;\n queue.push( position );\n }, this );\n\n this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n return {\n x: 0,\n y: 0\n };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n this.updateStagger();\n queue.forEach( function( obj, i ) {\n this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n var stagger = this.options.stagger;\n if ( stagger === null || stagger === undefined ) {\n this.stagger = 0;\n return;\n }\n this.stagger = getMilliseconds( stagger );\n return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n if ( isInstant ) {\n // if not transition, just set CSS\n item.goTo( x, y );\n } else {\n item.stagger( i * this.stagger );\n item.moveTo( x, y );\n }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n var isResizingContainer = this._getOption('resizeContainer');\n if ( !isResizingContainer ) {\n return;\n }\n var size = this._getContainerSize();\n if ( size ) {\n this._setContainerMeasure( size.width, true );\n this._setContainerMeasure( size.height, false );\n }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n * @param {Number} width\n * @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n if ( measure === undefined ) {\n return;\n }\n\n var elemSize = this.size;\n // add padding and border width if border box\n if ( elemSize.isBorderBox ) {\n measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n elemSize.borderLeftWidth + elemSize.borderRightWidth :\n elemSize.paddingBottom + elemSize.paddingTop +\n elemSize.borderTopWidth + elemSize.borderBottomWidth;\n }\n\n measure = Math.max( measure, 0 );\n this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n var _this = this;\n function onComplete() {\n _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n }\n\n var count = items.length;\n if ( !items || !count ) {\n onComplete();\n return;\n }\n\n var doneCount = 0;\n function tick() {\n doneCount++;\n if ( doneCount == count ) {\n onComplete();\n }\n }\n\n // bind callback\n items.forEach( function( item ) {\n item.once( eventName, tick );\n });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n // add original event to arguments\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery ) {\n // set this.$element\n this.$element = this.$element || jQuery( this.element );\n if ( event ) {\n // create jQuery event\n var $event = jQuery.Event( event );\n $event.type = type;\n this.$element.trigger( $event, args );\n } else {\n // just trigger with type if no event available\n this.$element.trigger( type, args );\n }\n }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n item.isIgnored = true;\n }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n delete item.isIgnored;\n }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ) {\n return;\n }\n\n this.stamps = this.stamps.concat( elems );\n // ignore\n elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ){\n return;\n }\n\n elems.forEach( function( elem ) {\n // filter out removed stamp elements\n utils.removeFrom( this.stamps, elem );\n this.unignore( elem );\n }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n if ( !elems ) {\n return;\n }\n // if string, use argument as selector string\n if ( typeof elems == 'string' ) {\n elems = this.element.querySelectorAll( elems );\n }\n elems = utils.makeArray( elems );\n return elems;\n};\n\nproto._manageStamps = function() {\n if ( !this.stamps || !this.stamps.length ) {\n return;\n }\n\n this._getBoundingRect();\n\n this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n // get bounding rect for container element\n var boundingRect = this.element.getBoundingClientRect();\n var size = this.size;\n this._boundingRect = {\n left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n var boundingRect = elem.getBoundingClientRect();\n var thisRect = this._boundingRect;\n var size = getSize( elem );\n var offset = {\n left: boundingRect.left - thisRect.left - size.marginLeft,\n top: boundingRect.top - thisRect.top - size.marginTop,\n right: thisRect.right - boundingRect.right - size.marginRight,\n bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n };\n return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n window.addEventListener( 'resize', this );\n this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n window.removeEventListener( 'resize', this );\n this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n // don't trigger if size did not change\n // or if resize was unbound. See #9\n if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n return;\n }\n\n this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n var size = getSize( this.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.size && size;\n return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n var items = this._itemize( elems );\n // add items to collection\n if ( items.length ) {\n this.items = this.items.concat( items );\n }\n return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // layout and reveal just the new items\n this.layoutItems( items, true );\n this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // add items to beginning of collection\n var previousItems = this.items.slice(0);\n this.items = items.concat( previousItems );\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // layout new stuff without transition\n this.layoutItems( items, true );\n this.reveal( items );\n // layout previous items\n this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n this._emitCompleteOnItems( 'reveal', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.reveal();\n });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n this._emitCompleteOnItems( 'hide', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.hide();\n });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n // loop through items to get the one that matches\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n if ( item.element == elem ) {\n // return item\n return item;\n }\n }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n elems = utils.makeArray( elems );\n var items = [];\n elems.forEach( function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n items.push( item );\n }\n }, this );\n\n return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n var removeItems = this.getItems( elems );\n\n this._emitCompleteOnItems( 'remove', removeItems );\n\n // bail if no items to remove\n if ( !removeItems || !removeItems.length ) {\n return;\n }\n\n removeItems.forEach( function( item ) {\n item.remove();\n // remove item from collection\n utils.removeFrom( this.items, item );\n }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n // clean up dynamic styles\n var style = this.element.style;\n style.height = '';\n style.position = '';\n style.width = '';\n // destroy items\n this.items.forEach( function( item ) {\n item.destroy();\n });\n\n this.unbindResize();\n\n var id = this.element.outlayerGUID;\n delete instances[ id ]; // remove reference to instance by id\n delete this.element.outlayerGUID;\n // remove data for jQuery\n if ( jQuery ) {\n jQuery.removeData( this.element, this.constructor.namespace );\n }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.outlayerGUID;\n return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n // sub-class Outlayer\n var Layout = subclass( Outlayer );\n // apply new options and compatOptions\n Layout.defaults = utils.extend( {}, Outlayer.defaults );\n utils.extend( Layout.defaults, options );\n Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );\n\n Layout.namespace = namespace;\n\n Layout.data = Outlayer.data;\n\n // sub-class Item\n Layout.Item = subclass( Item );\n\n // -------------------------- declarative -------------------------- //\n\n utils.htmlInit( Layout, namespace );\n\n // -------------------------- jQuery bridge -------------------------- //\n\n // make into jQuery plugin\n if ( jQuery && jQuery.bridget ) {\n jQuery.bridget( namespace, Layout );\n }\n\n return Layout;\n};\n\nfunction subclass( Parent ) {\n function SubClass() {\n Parent.apply( this, arguments );\n }\n\n SubClass.prototype = Object.create( Parent.prototype );\n SubClass.prototype.constructor = SubClass;\n\n return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n ms: 1,\n s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n if ( typeof time == 'number' ) {\n return time;\n }\n var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n var num = matches && matches[1];\n var unit = matches && matches[2];\n if ( !num.length ) {\n return 0;\n }\n num = parseFloat( num );\n var mult = msUnits[ unit ] || 1;\n return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n", "/*!\n * Masonry v4.2.2\n * Cascading grid layout library\n * https://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'outlayer/outlayer',\n 'get-size/get-size'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer'),\n require('get-size')\n );\n } else {\n // browser global\n window.Masonry = factory(\n window.Outlayer,\n window.getSize\n );\n }\n\n}( window, function factory( Outlayer, getSize ) {\n\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Masonry = Outlayer.create('masonry');\n // isFitWidth -> fitWidth\n Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n var proto = Masonry.prototype;\n\n proto._resetLayout = function() {\n this.getSize();\n this._getMeasurement( 'columnWidth', 'outerWidth' );\n this._getMeasurement( 'gutter', 'outerWidth' );\n this.measureColumns();\n\n // reset column Y\n this.colYs = [];\n for ( var i=0; i < this.cols; i++ ) {\n this.colYs.push( 0 );\n }\n\n this.maxY = 0;\n this.horizontalColIndex = 0;\n };\n\n proto.measureColumns = function() {\n this.getContainerWidth();\n // if columnWidth is 0, default to outerWidth of first item\n if ( !this.columnWidth ) {\n var firstItem = this.items[0];\n var firstItemElem = firstItem && firstItem.element;\n // columnWidth fall back to item of first element\n this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n // if first elem has no width, default to size of container\n this.containerWidth;\n }\n\n var columnWidth = this.columnWidth += this.gutter;\n\n // calculate columns\n var containerWidth = this.containerWidth + this.gutter;\n var cols = containerWidth / columnWidth;\n // fix rounding errors, typically with gutters\n var excess = columnWidth - containerWidth % columnWidth;\n // if overshoot is less than a pixel, round up, otherwise floor it\n var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n cols = Math[ mathMethod ]( cols );\n this.cols = Math.max( cols, 1 );\n };\n\n proto.getContainerWidth = function() {\n // container is parent if fit width\n var isFitWidth = this._getOption('fitWidth');\n var container = isFitWidth ? this.element.parentNode : this.element;\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var size = getSize( container );\n this.containerWidth = size && size.innerWidth;\n };\n\n proto._getItemLayoutPosition = function( item ) {\n item.getSize();\n // how many columns does this brick span\n var remainder = item.size.outerWidth % this.columnWidth;\n var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n // round if off by 1 pixel, otherwise use ceil\n var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n colSpan = Math.min( colSpan, this.cols );\n // use horizontal or top column position\n var colPosMethod = this.options.horizontalOrder ?\n '_getHorizontalColPosition' : '_getTopColPosition';\n var colPosition = this[ colPosMethod ]( colSpan, item );\n // position the brick\n var position = {\n x: this.columnWidth * colPosition.col,\n y: colPosition.y\n };\n // apply setHeight to necessary columns\n var setHeight = colPosition.y + item.size.outerHeight;\n var setMax = colSpan + colPosition.col;\n for ( var i = colPosition.col; i < setMax; i++ ) {\n this.colYs[i] = setHeight;\n }\n\n return position;\n };\n\n proto._getTopColPosition = function( colSpan ) {\n var colGroup = this._getTopColGroup( colSpan );\n // get the minimum Y value from the columns\n var minimumY = Math.min.apply( Math, colGroup );\n\n return {\n col: colGroup.indexOf( minimumY ),\n y: minimumY,\n };\n };\n\n /**\n * @param {Number} colSpan - number of columns the element spans\n * @returns {Array} colGroup\n */\n proto._getTopColGroup = function( colSpan ) {\n if ( colSpan < 2 ) {\n // if brick spans only one column, use all the column Ys\n return this.colYs;\n }\n\n var colGroup = [];\n // how many different places could this brick fit horizontally\n var groupCount = this.cols + 1 - colSpan;\n // for each group potential horizontal position\n for ( var i = 0; i < groupCount; i++ ) {\n colGroup[i] = this._getColGroupY( i, colSpan );\n }\n return colGroup;\n };\n\n proto._getColGroupY = function( col, colSpan ) {\n if ( colSpan < 2 ) {\n return this.colYs[ col ];\n }\n // make an array of colY values for that one group\n var groupColYs = this.colYs.slice( col, col + colSpan );\n // and get the max value of the array\n return Math.max.apply( Math, groupColYs );\n };\n\n // get column position based on horizontal index. #873\n proto._getHorizontalColPosition = function( colSpan, item ) {\n var col = this.horizontalColIndex % this.cols;\n var isOver = colSpan > 1 && col + colSpan > this.cols;\n // shift to next row if item can't fit on current row\n col = isOver ? 0 : col;\n // don't let zero-size items take up space\n var hasSize = item.size.outerWidth && item.size.outerHeight;\n this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n return {\n col: col,\n y: this._getColGroupY( col, colSpan ),\n };\n };\n\n proto._manageStamp = function( stamp ) {\n var stampSize = getSize( stamp );\n var offset = this._getElementOffset( stamp );\n // get the columns that this stamp affects\n var isOriginLeft = this._getOption('originLeft');\n var firstX = isOriginLeft ? offset.left : offset.right;\n var lastX = firstX + stampSize.outerWidth;\n var firstCol = Math.floor( firstX / this.columnWidth );\n firstCol = Math.max( 0, firstCol );\n var lastCol = Math.floor( lastX / this.columnWidth );\n // lastCol should not go over if multiple of columnWidth #425\n lastCol -= lastX % this.columnWidth ? 0 : 1;\n lastCol = Math.min( this.cols - 1, lastCol );\n // set colYs to bottom of the stamp\n\n var isOriginTop = this._getOption('originTop');\n var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n stampSize.outerHeight;\n for ( var i = firstCol; i <= lastCol; i++ ) {\n this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n }\n };\n\n proto._getContainerSize = function() {\n this.maxY = Math.max.apply( Math, this.colYs );\n var size = {\n height: this.maxY\n };\n\n if ( this._getOption('fitWidth') ) {\n size.width = this._getContainerFitWidth();\n }\n\n return size;\n };\n\n proto._getContainerFitWidth = function() {\n var unusedCols = 0;\n // count unused columns\n var i = this.cols;\n while ( --i ) {\n if ( this.colYs[i] !== 0 ) {\n break;\n }\n unusedCols++;\n }\n // fit container to columns that have been used\n return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n };\n\n proto.needsResizeLayout = function() {\n var previousWidth = this.containerWidth;\n this.getContainerWidth();\n return previousWidth != this.containerWidth;\n };\n\n return Masonry;\n\n}));\n", "/*\n * Welcome to the stats views library. This is a collection of functions that\n * are used across the stats views. Could use a bit of clean-up (understatement).\n *\n * Refactoring Spreadsheet, helpful to see various functions:\n *\t https://docs.google.com/spreadsheets/d/1r3O4Xuv3zhv_iDJKxXMdZCwzwt8zf68TQT6N1EgrFCU/edit#gid=1686320176\n * Some helpful areas to refactor:\n * URL Generation: \"DOCKET_SEARCH_URL, ...get_load_more_url\n * Rendering functions\n * Rendering utility functions\n * \t typical_analytics_filters and other filters\n * Sidebar\n */\n/* stats.js is currently still globally imported:\nimport {\n\tagg_to_dict,\n\targs_obj_to_args_ar,\n\tdeparam_url,\n\tfilter_and_combine_subbuckets,\n\n\tget_filter_obj,\n\tget_json_results,\n\tget_query_str,\n\n\tviewarg_to_obj,\n\tget_viewargs_obj,\n\tparam_query,\n\tupdate_dict,\n\tval_to_key,\n\n\t_hash_to_obj\n} from \"./stats.js\";\n*/\n\n// Globals are not good, but put them into a single namespace.\nvar stats_views_globals = {\n\ttemplate_filters : template_filters,\n\trender_analytics : template_render_analytics,\n\trender_analytics_sequence : render_analytics_sequence,\n\tparser_start_year : \"2015\",\n\t// Previously was fa-eye.\n\tview_only_icon : \"fa-duotone fa-circle-up-right\",\n\tuser_logged_in : user_logged_in,\n\tparty_roles : party_roles,\n\tstate_names : state_names,\n};\n// Very simple test, this should eventually be it's own function.\nvar re_stats_outcome = /^granted|denied|sustained|dismissed|affirmed|reversed/;\n\n\n/**\n * Correct small edit distance issues with keys in the buckets. This should\n * ideally be done in the backend, but this can help save embarrasing results.\n * @param buckets The items we need to review and merge.\n * @param edits Number of edits to consider two items the same. Default is 3.\n */\nfunction correct_edit_distance_subbuckets(buckets, edits) {\n\tif(!edits) {\n\t\tedits = 3;\n\t}\n\tfunction edit_distance(a, b){\n\t\tif(a.length == 0) return b.length;\n\t\tif(b.length == 0) return a.length;\n\t\t// increment along the first column of each row\n\t\tvar matrix = [];\n\t\tfor(var i = 0; i <= b.length; i++){\n\t\t\tmatrix[i] = [i];\n\t\t}\n\t\t// increment each column in the first row\n\t\tfor(var j = 0; j <= a.length; j++){\n\t\t\tmatrix[0][j] = j;\n\t\t}\n\t\t// Fill in the rest of the matrix\n\t\tfor(i = 1; i <= b.length; i++){\n\t\t\tfor(j = 1; j <= a.length; j++){\n\t\t\t if(b.charAt(i-1) == a.charAt(j-1)){\n\t\t\t\tmatrix[i][j] = matrix[i-1][j-1];\n\t\t\t } else {\n\t\t\t\tmatrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution\n\t\t\t\t\t\t\t\t\t\tMath.min(matrix[i][j-1] + 1, // insertion\n\t\t\t\t\t\t\t\t\t\t\t\t matrix[i-1][j] + 1)); // deletion\n\t\t\t }\n\t\t\t}\n\t\t}\n\t\treturn matrix[b.length][a.length];\n\t}\n\n\tvar to_rem = [];\n\tbuckets.forEach(function (b1, b1_i) {\n\t\tbuckets.forEach(function (b2, b2_i) {\n\t\t\tif(b1_i >= b2_i) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar d = edit_distance(b1.key, b2.key);\n\t\t\tif(d > edits || b1.doc_count == b2.doc_count) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tto_rem.push(b2_i);\n\t\t\tb1.doc_count += b2.doc_count;\n\t\t\tfor (var k in b2) {\n\t\t\t\tif(k != 'key' && k != 'doc_count') {\n\t\t\t\t\tconsole.warn(\"Not copying aggregation: \" + k);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\tto_rem.sort().reverse().forEach(function (i) {\n\t\tdelete buckets[i];\n\t});\n\treturn buckets;\n}\n\n\n///////////////////////////\n// Views Specific Data Manipulation Utilities\n\nfunction sortByKey(array, get_key, reverse) {\n\tif(!get_key) {\n\t\tconsole.log(\"Cannot sort array, no key.\")\n\t\treturn array;\n\t}\n\treturn !reverse ?\n\t\tarray.sort(function(a, b) {\n\t\t\tvar x = get_key(a);\n\t\t\tvar y = get_key(b);\n\t\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t}):\n\t\tarray.sort(function(a, b) {\n\t\t\tvar x = get_key(a);\n\t\t\tvar y = get_key(b);\n\t\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t})\n}\n\n/**\n * Get the current date, subtracting the given number of months.\n * @param months How many months to subtract.\n * @param first_of_month If true, return the first of the month. If false, 3 months prior.\n * @param start_date If null, use current date.\n * @returns {Date}\n */\nfunction get_months_prev(months, first_of_month, start_date) {\n if(!months) {\n months = 3;\n }\n var monthsbefore = start_date || new Date();\n\tmonthsbefore.setUTCMilliseconds(0);\n\tmonthsbefore.setUTCSeconds(0);\n\tmonthsbefore.setUTCMinutes(0);\n\tmonthsbefore.setUTCHours(0);\n\tmonthsbefore.setUTCMonth(monthsbefore.getUTCMonth() - months);\n\tif(first_of_month) {\n\t\tmonthsbefore.setUTCDate(1);\n\t}\n\treturn monthsbefore;\n}\nfunction get_totals_and_before(agg) {\n\t// Three months before\n\tvar monthsbefore = get_months_prev(3, true);\n\t// Get Seconds\n\tvar monthsbeforeS = monthsbefore.getTime();\n\n\t// Go through the data, and get the average\n\tvar total = 0, totalbefore = 0;\n\tfor (var i in agg.buckets) {\n\t\tvar doc_count = agg.buckets[i].doc_count;\n\t\ttotal += doc_count;\n\t\t// Get the rolling average\n\t\tif(agg.buckets[i].key >= monthsbeforeS)\n\t\t\ttotalbefore += \tdoc_count\n\t}\n\treturn {\n\t\tmonthsbefore \t: monthsbefore,\n\t\ttotal\t\t\t: total,\n\t\ttotalbefore\t\t: totalbefore,\n\t}\n}\n\nfunction get_granted_total(buckets, partial_counts) {\n\tvar total = 0;\n\tfor(var i = 0; i < buckets.length; i++) {\n\t\tif(granted_keys.indexOf(buckets[i].key) >= 0 ||\n\t\t\t(partial_counts && granted_test(buckets[i].key))) {\n\t\t\ttotal += buckets[i].doc_count;\n\t\t}\n\t}\n\treturn total;\n}\n\nfunction get_denied_total(buckets, partial_counts) {\n\tvar total = 0;\n\tfor(var i = 0; i < buckets.length; i++) {\n\t\tif(denied_keys.indexOf([i].key) >= 0 ||\n\t\t\t(partial_counts && denied_test(buckets[i].key))) {\n\t\t\ttotal += buckets[i].doc_count;\n\t\t}\n\t}\n\treturn total;\n}\n\n/**\n * One function that returns all of the necessary information above\n */\nfunction get_grant_rates(ag, partial_counts) {\n\tif(!ag || !ag.doc_count) {\n\t\treturn {total:0, granted:0, granted_rate:0}\n\t}\n\tvar granted = get_granted_total(ag.buckets, partial_counts);\n\treturn {\n\t\ttotal: ag.doc_count,\n\t\tgranted: granted,\n\t\tgranted_rate: granted / ag.doc_count\n\t}\n}\n\n/**\n * Determine if an aggregation uses an existence statistic or a granted/denied\n * stat. If it uses an existence stat, return the rate that it exists, and the\n * total in a structure, otherwise return false.\n *\n * Existence stats are used to show the percent of times an event occurs,\n * whereas a granted/denied stat shows how often a stat is granted.\n **/\nfunction uses_existance_rates(ag, total_docs) {\n if (!ag) {\n return 0;\n }\n if (ag.count) {\n // If we have a specific count aggregation, use it.\n var count = typeof ag.count == 'number' ? ag.count:\n\t\t\tag.count.value || ag.count.doc_count || 0;\n return {\n \tcount : count,\n rate: count / total_docs,\n exists: !!count,\n };\n }\n if (!total_docs || !ag.doc_count) {\n // If there is no real data, then return 1, defaulting to grant/deny.\n return 0;\n }\n // If the aggregation has buckets, we can create a rate.\n if (ag.buckets && ag.buckets.length == 1 && ag.buckets[0].key === \"\") {\n // This is a exist/not exist analysis.\n return {\n rate: ag.buckets[0].doc_count / total_docs,\n exists: ag.buckets[0].doc_count,\n };\n }\n return false;\n}\n\n// Given a set of search parameters, return a link to searh results as well.\nfunction DOCKET_SEARCH_URL(params) {\n\t// When we have a link filter provided, use it. Add the filter.\n\tif(!params.f) {\n\t\tparams.f = []\n\t} else if(!Array.isArray(params.f)) {\n\t\tparams.f = [params.f];\n\t}\n\tif(params.v) { delete params.v; }\n\tif(params.viewargs) {\n\t\t// Convert viewargs into filters.\n\t\tvar varg = {};\n\t\tvar pvarg = typeof params.viewargs == \"string\" ?\n\t\t\t[params.viewargs] : params.viewargs;\n\t\tpvarg.forEach(function (va) {\n\t\t\tvar k = va.split(\"-\", 1)[0];\n\t\t\tvarg[k] = va.slice(k.length + 1);\n\t\t});\n\t\t// Limit by party type and entity information.\n\t\tif(varg.party_exact && varg.party_type_exact) {\n\t\t\tparams.f.push('q_analytics_party_type-party:(name_exact:\"' +\n\t\t\t\tvarg.party_exact + '\" type_exact:\"' +\n\t\t\t\tvarg.party_type_exact + '\")');\n\t\t\tparams.fname_q_analytics_party_type = 'Party ' +\n\t\t\t\tvarg.party_exact + \" as \" + varg.party_type_exact;\n\t\t}\n\t\tif(varg.firm_exact && varg.party_type_exact) {\n\t\t\tparams.f.push('q_analytics_firm_type-party:(firm:(name_exact:\"' +\n\t\t\t\tvarg.firm_exact + '\") type_exact:\"' +\n\t\t\t\tvarg.party_type_exact + '\")');\n\t\t\tparams.fname_q_analytics_firm_type = 'Firm ' +\n\t\t\t\tvarg.firm_exact + \" representing \" + varg.party_type_exact;\n\t\t}\n\t\tif(varg.attorney_exact && varg.party_type_exact) {\n\t\t\tparams.f.push('q_analytics_attorney_type-party:(firm:(attorney_exact:\"' +\n\t\t\t\tvarg.attorney_exact + '\") type_exact:\"' +\n\t\t\t\tvarg.party_type_exact + '\")');\n\t\t\tparams.fname_q_analytics_attorney_type = 'Attorney ' +\n\t\t\t\tvarg.attorney_exact + \" representing \" + varg.party_type_exact;\n\t\t}\n\t\tdelete params.viewargs;\n\t}\n\tif(!params.q) {\n\t params.q = \"\";\n\t}\n\treturn template_link_filter(params);\n}\nfunction DOCUMENT_SEARCH_URL(params) {\n\treturn DOCKET_SEARCH_URL(params).replace(\"/dockets/\", \"/documents/\");\n}\n\n/**\n * Help format a query into its parts, to ultimately make it human readable.\n * @param params (Optional) An object with key-value pairs of the encoded URL\n * query. If blank, uses the query on the current page.\n * @returns {Array}\n */\nfunction query_to_list(params) {\n\tif(!params) {\n\t\tparams = deparam_url();\n\t}\n\tvar page_title_f = null;\n\tif(params.v && params.v.endsWith(\"_profile\")) {\n\t\t// On some views (e.g., profiles), certain filters aren't really filters\n\t\t// but are part of the real title.\n\t\tpage_title_f = params.v.slice(0, -8)\n\t}\n\n\tfunction default_format_value(k, key_title, v, is_title) {\n\t\t// Format the value.\n\t\tv = v.startsWith(key_title) ? v.slice(key_title.length) : v;\n\t\treturn (is_title ? \"\" : key_title.strip() + \" \") + v.strip();\n\t}\n\tfunction patent_format_value(k, key_title, v, is_title) {\n\t\t// Start with the default value.\n\t\tv = default_format_value(k, key_title, v, is_title);\n\t\t// Special case for patent numbers.\n\t\tif(key_title == \"Patent\" || key_title == \"patent\" || k == 'q_patent') {\n\t\t\t// Format design and reissue patent numbers nicely.\n\t\t\tv = v.replace(/^(D|RE)(\\d+)(\\d\\d\\d)$/ig, \"$1$2,$3\");\n\t\t\t// Handle standard number-only patent numbers.\n\t\t\tif(v.search(/^\\d+$/ig) == 0) {\n\t\t\t\tv = number_with_commas(v);\n\t\t\t}\n\t\t\tv = \"U.S. Patent No. \" + v;\n\t\t}\n\t\treturn v;\n\t}\n\t// Date keys are formatted differently.\n\tvar re_date_key = /^date_(.*)$/ig\n\tfunction query_key_to_title(k) {\n\t\t// Hacky. Come up with a reasonable name for this filter.\n\t\tk = k.endsWith(\"_exact\") ? k.slice(0, -6) : k;\n\t\tif (k.startsWith(\"q_\")) {\n\t\t\tk = k.slice(2);\n\t\t}\n\t\t// Remove _obj, and .name, they don't help the name.\n\t\tk = k.replaceAll(\"_obj\", \"\").replaceAll(\".name\", \"\");\n\t\t// Shorten party.firm down to firm\n\t\tk = k.replaceAll(\"party.firm\", \"firm\");\n\t\t// Move remove to the front.\n\t\tif (k.endsWith(\"_remove\")) {\n\t\t\tk = \"Remove \" + k.slice(0, -(\"_remove\".length));\n\t\t}\n\t\t// Special case for date filters.\n\t\tvar m_date_key = re_date_key.exec(k);\n\t\tif(m_date_key) {\n\t\t\t// Move the \"date\" to the end of the key.\n\t\t\tk = m_date_key[1] + \" Date\";\n\t\t}\n\t\tk = k.replaceAll(\"_\", \" \");\n\t\tk = capitalize(k);\n\t\treturn k;\n\t}\n\tvar _identifier_dict = null;\n\tfunction identifier_dict() {\n\t\tif(!_identifier_dict) {\n\t\t\tvar list = _get_viewargs_identifiers(_hash_to_obj(params.viewargs)).identifier_list;\n\t\t\t_identifier_dict = list ? parser_stats_utils.get_identifier_dict(list) : null;\n\t\t}\n\t\treturn _identifier_dict || {};\n\t}\n\t/**\n\t * Convert a single filter into a nicely formatted name.\n\t * @param f A string filter in the form \"filter_key-filter_value\"\n\t * @returns {null|{name: *, remove_link: *, title: boolean}}\n\t */\n\tfunction get_filter_name(f) {\n\t var f_orig = f;\n\t\t// Get the first hyphen spit up.\n\t\tf = f.split(\"-\");\n\t\tif (f.length < 2) {\n\t\t\tconsole.log(\"Bad filter: \" + f);\n\t\t\treturn {name : \"filter\" };\n\t\t}\n\t\t// We don't care about hyphens after the first.\n\t\tf = [f[0], f.slice(1).join(\"-\")];\n\t\tvar f_key = f[0];\n\t\tif(f_key == 'event_identifier') {\n\t\t\tif(params.views == 'Event_Info_Counts' ||\n\t\t\t\tparams.views == 'Event_Histogram' ||\n\t\t\t\tparams.views == 'Event_Length_Histogram') {\n\t\t\t\t// Don't need to display the identifier on these views, it's shown elsewhere.\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar pinfo = identifier_dict()[f[1]];\n\t\t\treturn {\n\t\t\t\tname : pinfo ? pinfo.name_display : f[1],\n\t\t\t\ttitle : false,\n\t\t\t\tis_identifier : true,\n\t\t\t}\n\t\t}\n\n\t\t// Determine the removal link, the link to this page w/o the filter.\n\t\tvar new_params = $.extend({}, params);\n\t\tif(typeof new_params.f == \"string\") {\n\t\t new_params.f = [new_params.f]\n }\n\t\tvar found = false;\n\t\t// Get down the list of filters.\n\t\tnew_params.f = (new_params.f || []).filter(function (f_exist) {\n if(f_orig == f_exist) {\n found = true;\n return false;\n }\n\t\t return true;\n });\n\t\tvar remove_link = found ? $.param(new_params, true) : null;\n\n\t\t// Check if there is a\n\t\tvar key_no_exact = f_key.endsWith(\"_exact\") ? f_key.slice(0, -6) : f_key;\n\t\t// The fname parameter can contain the name of the filter.\n\t\tvar filter_name = params['fname_' + f_key] || params['fname_' + key_no_exact];\n\t\tif(filter_name) {\n // Hack: Deam this to be a title if we're searching a entity type.\n var fname_is_title = /^q_(entity|party|attorney|firm|judge)/.test(key_no_exact);\n\t\t\treturn {name : filter_name, title : fname_is_title, remove_link:remove_link };\n\t\t}\n\n\t\tvar key_title = query_key_to_title(f_key);\n\t\t// Determine if this is a title.\n\t\tvar is_title = page_title_f && (key_title.toLowerCase() == page_title_f.toLowerCase());\n\t\t// We may want to treat entity filters a bit differently.\n\t\tvar is_entity = /^(party|attorney|firm|judge)(_exact)?$/.test(f_key);\n\t\t// Allow the view info to specify the facet that generates the title.\n\t\tif(params.v && gbl_view_infos[params.v] && gbl_view_infos[params.v].title_facets &&\n\t\t\tgbl_view_infos[params.v].title_facets.indexOf(key_title) >= 0) {\n\t\t\tis_title = true;\n\t\t}\n\t\tvar value = f[1];\n\t\tvar formatter = key_title.search(/^patent$/ig) >= 0 ? patent_format_value:\n\t\t\tdefault_format_value;\n\t\tvar name = formatter(f_key, key_title, value, is_title);\n\t\treturn {\n\t\t\tname : name,\n\t\t\ttitle : is_title,\n remove_link:remove_link,\n\t\t\tis_entity : is_entity\n\t\t}\n\t}\n\t// Some (most?) view arguments should not be displayed b/c there are other UI indicator.\n\tvar skip_viewarg = /^date_histogram_type-|unknown_outcomes-|max_[a-z]+-|gender-|interval_days-|include_percentiles-|length_histogram_type-/;\n\tvar removable_args = /^date_identifier_start-|party_type(_exact)?-/\n\tfunction get_viewargs_name(viewarg) {\n\t\tif(skip_viewarg.test(viewarg)) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// A view argument is not the same as a filter, but the function above\n\t\t// basically does what we need it to.\n\t\tvar out = get_filter_name(viewarg);\n\t\t// Special case certain viewargs.\n\t\tif(out && (out.remove_link || removable_args.test(viewarg))) {\n\t\t\tvar v_split = viewarg.split(\"-\", 2)\n\t\t\tvar cur_hash = get_url_hash();\n\t\t\tvar frag_obj = url_params_to_object(cur_hash);\n\t\t\tvar viewargs = get_viewargs_obj(cur_hash);\n\t\t\tif(v_split.length > 1 && viewargs[v_split[0]] == v_split[1]) {\n\t\t\t\tdelete viewargs[v_split[0]];\n\t\t\t\tfrag_obj.viewargs = args_obj_to_args_ar(viewargs);\n\t\t\t\tvar new_hash = $.param(frag_obj, true);\n\t\t\t\tif (window.location.hash != new_hash) {\n\t\t\t\t\tout.remove_link = new_hash;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\tvar filters = [];\n\t// Start building the list of filters.\n\tif (Array.isArray(params.f)) {\n\t\tfilters = params.f.map(get_filter_name);\n\t} else if (params.f && params.f.length) {\n\t\tfilters.push(get_filter_name(params.f));\n\t}\n\t// Remove empties.\n\tfilters = filters.filter(function (x) { return x != null; });\n\n\t// Add the query as a filter, if a name for it wasn't specified.\n\tif(params.q && params.q.length) {\n\t\tif(params.qname) {\n\t\t\t// A title was explicitly specified, honor it.\n\t\t\tfilters.push({\n\t\t\t\tname : params.qname,\n\t\t\t\ttitle : true\n\t\t\t});\n\t\t} else {\n\t\t\t// No name for it specified, be a bit generic.\n\t\t\tfilters.push({\n\t\t\t\tname : \"query: \" + jQuery.bbq.getState(\"q\"),\n\t\t\t\ttitle : false\n\t\t\t});\n\t\t}\n\t}\n\t// Add a message about the time range.\n\tfunction to_time(date_filed) {\n\t\t// All of our time is in UTC, so adjust accordingly.\n\t var tdate = new Date(date_filed*1000);\n\t return new Date(date_filed*1000 + tdate.getTimezoneOffset()*60*1000);\n }\n\t// Each attribute is optional, so handle all cases.\n\tif(params.date_filed_start && params.date_filed_end) {\n\t\tvar tlo = to_time(params.date_filed_start);\n\t\tvar thi = to_time(params.date_filed_end);\n\t\tfilters.push({title: false, name : \"Cases from \" +\n\t\t\t$.datepicker.formatDate(tlo.getFullYear() == thi.getFullYear() ?\n\t\t\t\t'M d' : 'M d, yy', tlo) + \" to \" +\n\t\t\t$.datepicker.formatDate('M d, yy', thi)});\n\t} else if (params.date_filed_start) {\n\t var tlo_alone = to_time(params.date_filed_start);\n\t filters.push({title: false, name : \"Cases from \" +\n\t\t\t$.datepicker.formatDate('M d, yy', tlo_alone)});\n } else if (params.date_filed_end) {\n\t var thi_alone = to_time(params.date_filed_end);\n\t filters.push({title: false, name : \"Cases to \" +\n\t\t\t$.datepicker.formatDate('M d, yy', thi_alone)});\n }\n\n\t// Add the view arguments, but they only apply to specific views.\n\tvar viewargs = Array.isArray(params.viewargs) ? params.viewargs:\n\t\tparams.viewargs && params.viewargs.length ? [params.viewargs]: [];\n\tviewargs.forEach(function (va) {\n\t\tvar arr = viewarg_to_obj(va);\n\t\tif(!arr || !arr.v || !arr.v.length) {\n\t\t\treturn;\n\t\t}\n\t\t// Add the view arg.\n\t\tvar fname = get_viewargs_name(va);\n\t\tif(!fname) {\n return;\n }\n\t\t// Don't add the view arg if it already exists in another filter.\n var has_similar = filters.some(function (o) {\n return o.title == fname.title && o.name.indexOf(arr.v) >= 0;\n });\n\t\tif(has_similar) {\n\t\t\treturn;\n\t\t}\n filters.push(fname);\n\t});\n\n\t// Separate filters and titles.\n\tvar titles = filters.filter(function (f) { return f.title; });\n\tfilters = filters.filter(function (f) { return !f.title; });\n\t// There should only be one title\n\tif(titles.length > 1) {\n\t\tconsole.log(\"Too many titles: \" + titles);\n\t\t// Turn the title into a filter.\n\t\tfilters = filters.concat(titles.slice(1));\n\t}\n\treturn {\n\t\ttitle : titles.length ? titles[0] : null,\n\t\tfilters : filters\n\t};\n}\n\n/**\n * Get the URL to filtered analytics.\n * @param filter_key What to filter on.\n * @param filter_val The filter value\n * @param view The v to use.\n * @param viewargs Any additional viewarguments.\n * @returns {string}\n */\nfunction get_filtered_view_url(filter_key, filter_val, view, viewargs) {\n\tvar cur = deparam_url();\n\tif(!cur.f) {\n\t\tcur.f = [];\n\t} else if (!Array.isArray(cur.f)) {\n\t\tcur.f = [cur.f];\n\t}\n\n\t// Add filters.\n\tvar f = filter_key + \"-\" + filter_val;\n\tif (cur.f.indexOf(f) == -1) {\n\t\tcur.f.push(f);\n\t}\n\n\t// Add the view arguments, which should be an array.\n\tif(viewargs) {\n\t\tif(!Array.isArray(viewargs)) {\n\t\t\tthrow \"viewargs should be an array\";\n\t\t}\n\t\tcur.viewargs = Array.isArray(cur.viewargs) ? cur.viewargs:\n\t\t\tcur.viewargs && cur.viewargs.length ? [cur.viewargs]: [];\n\t\tcur.viewargs = cur.viewargs.concat(viewargs)\n\t}\n\tcur.v = view;\n\treturn param_query(cur);\n}\n\n/**\n * Returns a link that loads more data. Only relevant for the list of parties.\n */\nfunction get_load_more_url(cur_buckets) {\n\tvar url_hash = get_url_hash();\n\tvar viewargs = get_viewargs_obj(url_hash);\n\t// Get the current viewargs\n\tvar max_entities = parseInt(viewargs.max_entities);\n\tcur_buckets = parseInt(cur_buckets);\n\t// Get the new max_entities\n\tif(isNaN(max_entities)) {\n\t\t// The max entities field is not set. The default is set on the server,\n\t\t// which we don't know. Assume it's a multiple of ten, so if we have a\n\t\t// non-multiple of ten, then we hit the max.\n\t\tif(!isNaN(cur_buckets) && cur_buckets % 10 != 0) {\n\t\t\treturn null;\n\t\t}\n\t\t// Default to 50\n\t\tviewargs.max_entities = 50;\n\t} else if (!isNaN(cur_buckets) && cur_buckets < max_entities) {\n\t\t// max_entities is set higher than the number of bcukets that we have.\n\t\t// Don't show the load more.\n\t\treturn null;\n\t} else if(max_entities < 100) {\n\t\t// First load more should be 100.\n\t\tviewargs.max_entities = 100;\n\t} else if(max_entities < 250) {\n\t\t// Then 1000.\n\t\tviewargs.max_entities = 250;\n\t} else {\n\t\t// Double max_entities after that.\n\t\tviewargs.max_entities = max_entities * 2;\n\t}\n\n\t// Setup the current viewargs\n\tvar cur = deparam_url(url_hash);\n\tcur.viewargs = args_obj_to_args_ar(viewargs);\n\n\treturn \"#\" + param_query(cur);\n}\n\n/**\n * Display a percentage in better terms. If it's > 0 but really small, we\n * display \"< 1%\".\n * @param percent 0 to 1 percent\n * @param first_choice Text after percent.\n * @param br\t\tAdd a break between the key and the percentage.\n **/\nfunction get_perc_text(percent, first_choice, zero_choice, br) {\n\tbr = br ? \"
\" : \" \";\n\tif (percent === null || isNaN(percent)) {\n\t\treturn \"N/A\" + br + \"No Cases\";\n\t}\n\tif(percent < 1e-5) {\n\t\t// Instead of shoing 0%, show 100% of the other type.\n\t\treturn \"100%\" + br + zero_choice;\n\t}\n\t// Show a fixed percentage, but indicate if non-zero or less than 100%.\n\tvar percent_str =\n\t\tpercent < .01 ? \"< 1\":\n\t\tpercent > .99 && percent < .9999 ? \" > 99\":\n\t\t(percent*100).toFixed(0);\n\treturn percent_str + \"%\" + br + first_choice;\n}\n\n///////////////////////////\n// Aggregation Specific Views\n\n/**\n * Renders the chart showing the summary overview of the court.\n * Also graphs the number of new filings. Agg info options include:\n * filing_str\twhat to call the new filings\n **/\nfunction render_new_filings(obj_id, agg_info, agg_name, agg,\n\tfiltered_name, filtered_agg, cumulative) {\n\tvar filing_str = agg_info.filing_str;\n\n\tvar $obj = $(\"#\" + obj_id);\n\tvar stats_agg = filtered_agg || agg;\n\t// Get cumulative data, or try to create it from\n var cum = cumulative || get_totals_and_before(stats_agg);\n\tvar startdate = stats_agg.buckets && stats_agg.buckets.length ?\n\t\t\t\t\t\tnew Date(stats_agg.buckets[0].key) : new Date();\n\n\tfunction get_average_text(avg) {\n\t\treturn avg > 150*24 ? (avg/24/60).toFixed(2).toString() + \"/minute\":\n\t\t\tavg > 200 ? (avg/24).toFixed(1).toString() + \"/hour\":\n\t\t\tavg > .8 ? avg.toFixed(1).toString() + \"/day\":\n\t\t\tavg*7 > .8 ? (7*avg).toFixed(1).toString() + \"/week\":\n\t\t\t(30*avg).toFixed(1).toString() + \"/month\";\n\t}\n\tfunction onClick(d, nextd) {\n\t\t// Break down the current url.\n\t\tvar cur = deparam_url();\n\t\t// Set the low date limit.\n\t\tif(d) {\n\t\t\tcur.date_filed_start = d.x/1000;\n\t\t}\n\t\t// Set a high date limit if we have one.\n\t\tif(nextd) {\n\t\t\tcur.date_filed_end = nextd.x/1000;\n\t\t}\n\t\t// Return the docket search url.\n\t\treturn DOCKET_SEARCH_URL(cur);\n\t}\n\t// Figure out the averages per day overall and for trailing 3 months.\n\tvar now = new Date();\n\tvar num_days = now - startdate;\n\tvar avg_p_day = num_days ? cum.total / (num_days / (1000*3600*24)) : 0;\n\tvar avg_p_day_bef = cum.totalbefore / ((now - cum.monthsbefore) / (1000*3600*24));\n\tvar perc_busy = (avg_p_day_bef / avg_p_day - 1.0);\n\tvar perc_busy_txt = perc_busy > 0 ?\n\t\t\"busier than average in the past three months\":\n\t\t\"less busy than average in the past three months\";\n\n\tvar url_all = onClick();\n\tvar url_bef = onClick({x: cum.monthsbefore.getTime()});\n\n\t// Convert the percentage to degrees\n\tvar degs = 90 * (1 - Math.exp(-1 * Math.abs(perc_busy) * 4));\n\tif(perc_busy < 0) {\n\t\tdegs = -degs;\n\t\tperc_busy = -perc_busy;\n\t}\n\tdegs = (degs + 90).toFixed(0); // At 90 degrees, the needle is in the middle.\n\n\t// Create the summary view.\n\t$obj.append($(\".summary.original\").clone().removeClass(\"original\").show());\n\t$obj\n\t\t.find(\".perc\").text((perc_busy * 100).toFixed(0).toString() + \"%\").end()\n\t\t.find(\".perc_sub\").text(perc_busy_txt).end()\n\n\t\t.find(\".avg\").text(get_average_text(avg_p_day)).end()\n\t\t.find(\".avg_super\").text(\"Average Rate\").end()\n\t\t.find(\".avg_sub\").text(\"average new \" + plural(2, filing_str) +\n\t\t\t\" overall\").end()\n\n\t\t.find(\".avg_recent\").text(get_average_text(avg_p_day_bef)).end()\n\t\t.find(\".avg_recent_super\").text(\"Average Rate for Past 3 Months\").end()\n\t\t.find(\".avg_recent_sub\").text(\"average new \" + plural(2, filing_str) +\n\t\t\t\" in the past three months\").end()\n\n\t\t.find(\".total a\").text(cum.total.toLocaleString())\n\t\t\t.attr(\"href\", url_all).attr(\"target\", \"_blank\").end()\n\t\t.find(\".total_super\").text(\"overall\").end()\n\t\t.find(\".total_sub\").text(\"new \" + plural(2, filing_str)).end()\n\n\t\t.find(\".total_recent a\").text(cum.totalbefore.toLocaleString())\n\t\t\t.attr(\"href\", url_bef).attr(\"target\", \"_blank\").end()\n\t\t.find(\".total_recent_super\").text(\"Past 3 Months\").end()\n\t\t.find(\".total_recent_sub\").text(\"total new \" + plural(2, filing_str) +\n\t\t\t\" in the past three months\").end()\n\n\t\t.find(\".avg_recent, .total_recent\").powerTip({\n popupClass : 'stats_tip',\n\t\t\tcloseDelay: 1000,\n\t\t\tfadeOutTime: 100,\n\t\t\tmouseOnToPopup: true\n\t\t}).data('powertip', function () {\n\t\t\t\tvar d = new Date(cum.monthsbefore);\n\t\t\t\td.setMinutes(d.getMinutes() + d.getTimezoneOffset());\n\t\t\t\tvar dstr = $.datepicker.formatDate(\"MM d, yy\", d);\n\t\t\t\t// Get the UTC Date without the time.\n\t\t\t\tvar href = $(this).find(\"a\").attr('href');\n\t\t\t\treturn $(hover_original)\n\t\t\t\t\t\t.find(\".xval\").text('Past 3 Months').end()\n\t\t\t\t\t\t.find(\".series\").text(\"Since:\").addClass('visible').end()\n\t\t\t\t\t\t.find(\".yval\").addClass(\"inline\").text(dstr).end()\n\t\t\t\t\t\t.find(\"a.viewmore\").attr(\"href\", href)\n\t\t\t\t\t\t\t.css(\"display\", href ? \"auto\" : \"none\").end()\n\t\t\t\t\t\t.html();\n\t\t\t}).end()\n\t\t.find(\".needle\").css(\"transform\", \"rotateZ(\" + degs + \"deg)\").end();\n\n\t// Add a motion chooser.\n\tif(parser_stats_utils.uses_motion_chooser()) {\n\t\tvar viewargs = get_viewargs_obj();\n \tvar p_identifier = viewargs.event_identifier;\n\t\tvar $gtitle = $obj.find(\".graph_title .options, .graph_title\").first();\n\t\tif(!$gtitle.length) {\n\t\t\t$gtitle = $obj.parents(\".chart\").find(\".graph_title .options, .graph_title\").first();\n\t\t}\n\t\tif(p_identifier) {\n\t\t\t$gtitle.append(parser_stats_utils.profile_only_link());\n\t\t}\n\t\t$gtitle.append(parser_stats_utils.drop_down(\n\t\t\tnull, null, true, (p_identifier ? \"Change\" : \"Add\") + \" Motion Analytics\"));\n\t}\n\n\tif(cum.totalbefore == 0) {\n\t\t// Provide the number rather than \"recent filings\"\n\t\t$obj.addClass(\"pump_and_onegroup\")\n\t\t\t.find(\".perc\").text(\"no\").end()\n\t\t\t.find(\".perc_sub\").text(\"recent \" + plural(2, filing_str) +\n\t\t\t\t\" in the past three months\").end()\n\t}\n\tif(agg.buckets && agg.buckets.length) {\n\t\t// Create the date histogram\n\t\tvar new_id = obj_id + \"_Histogram\";\n\t\t$obj.append(\"

New \" +\n\t\t\tcapitalize(plural(2, filing_str)) + \" Each Month

\");\n\n\t\t$obj.append(\"
\");\n\t\tvar series = [{\n\t\t\tcolor: 'steelblue',\n\t\t\trenderer: 'lineplot',\n\t\t\tclassName : 'series_0',\n\t\t\tname: \"Number of \" + capitalize(plural(2, filing_str)) + \" Filed\",\n\t\t\tdata : agg.buckets.map(function(b) {\n\t\t\t\treturn { x : b.key/1000, y : b.doc_count };\n\t\t\t})\n\t\t}];\n\t\t// Add the filtered aggregation, if it exists.\n\t\tvar filtered_agg_buckets = filtered_agg && filtered_agg.buckets;\n\t\tif(filtered_agg_buckets && filtered_agg_buckets.length) {\n\t\t\tseries.push({\n\t\t\t\tcolor: 'steelblue',\n\t\t\t\tclassName : 'series_1',\n\t\t\t\tname: filtered_name,\n\t\t\t\tdata : filtered_agg_buckets.map(function(b) {\n\t\t\t\t\treturn { x : b.key/1000, y : b.doc_count };\n\t\t\t\t})\n\t\t\t});\n\t\t} else if(filtered_agg_buckets) {\n\t\t // The aggregation exists, but there is no data.\n console.warn(\"TODO: tell user there is no data.\");\n }\n\t\t$(\"#\" + new_id).addClass(\"datehistogram\")\n\t\t\t.append(\"
\");\n\t\tvar xAxis = _render_time_series(0, new_id, series, onClick, null, null,\n 'lineplot');\n\t\txAxis.graph.configure({\n\t\t\tclassName \t: 'lineplotline',\n\t\t\tinterpolation : 'linear',\n\t\t});\n\n\t\txAxis.graph.renderer.areaFill = true;\n\t\tif(filtered_agg) {\n\t\t\tvar legend = add_legend_to_graph(xAxis, series);\n\t\t\t// When displaying a filtered view, default to showing just that.\n\t\t\tif(legend.lines.length == 2) {\n\t\t\t var line = legend.lines[0];\n\t\t\t line.series.disable();\n\t\t\t addClass(line.element, 'disabled');\n }\n\t\t}\n\n\t\txAxis.graph.render();\n\t}\n}\n\nfunction render_case_length(obj_id, agg_info, agg_name, agg,\n\tfiltered_name, filtered_agg) {\n\tvar stats_agg = filtered_agg || agg;\n\tvar compare_agg = filtered_agg ? agg : null;\n\tvar blen = (stats_agg.buckets.length && stats_agg.buckets.length) || 0;\n\tvar SERVER_INTERVAL = 1;\n\tvar is_parser = false;\n\tvar MAX_TICKS = 300 / SERVER_INTERVAL;\n\t_process_and_render_histogram(agg_name, obj_id, is_parser, stats_agg,\n\t\t// new_id\n\t\tobj_id + \"_Claims_Histogram\",\n\t\t// val_title\n\t\t\"Case Length Histogram\",\n\t\t// val_legend_name\n\t\t\"Number of Days\",\n\t\t// xaxis_name\n\t\t\"Case Length\",\n\t\t// val_units\n\t\t\"day\",\n\t\t// event_type, q_range_filter\n\t\tnull, \"num_days\",\n\t\t// INTERVAL\n\t\tblen > 30*MAX_TICKS ? 365 : blen > 7*MAX_TICKS ? 30 : 7,\n\t\t// compare_data & compare_legend_name\n\t\tcompare_agg, compare_agg ? \"Number of Days\" : null\n\t);\n}\n\n/**\n * Before we can render a histogram, we need to massage the data a bit.\n * @param agg_name The name of the greater aggregation.\n * @param obj_id The id where the larger agg sits.\n * @param is_parser True if this is a parser request.\n * @param histo_data An array of buckets of data.\n * @param new_id An id for the new histogram (can be null).\n * @param val_title Chart title\n * @param val_legend_name A function that takes a series number and returns a legend name.\n * @param xaxis_name\n * @param val_units\n * @param event_type\n * @param q_range_filter The internal filter to use inside of the event to limit by day.\n * @param INTERVAL a constant set on the server.\n * @param compare_data To show two sets of data at once, send more data here.\n * @param compare_legend_name\n **/\nfunction _process_and_render_histogram(agg_name, obj_id, is_parser, histo_data, new_id,\n\tval_title, val_legend_name, xaxis_name, val_units,\n\tevent_type, q_range_filter,\n\tINTERVAL, compare_data, compare_legend_name, main_value_func) {\n\t// Get the domain.\n\tvar all_data = typeof histo_data == \"function\" ? histo_data() :\n histo_data ? [histo_data] : [];\n\tif(compare_data && compare_data.buckets && compare_data.buckets.length) {\n\t\tall_data.push(compare_data);\n\t}\n\t// Safety checks.\n\tif(!all_data || !all_data.length || !all_data[0].buckets || !all_data[0].buckets.length) {\n\t\treturn;\n\t}\n\tif(!new_id) {\n\t\tnew_id = obj_id + \"_histogram\";\n\t}\n\n\t// Add the title.\n\t$(\"#\" + obj_id).append(\"

\" + val_title +\"

\" +\n\t\t\"
\");\n\n\tvar max_k = Math.max.apply(null, all_data.map(function (a) {\n\t\treturn a.buckets[a.buckets.length - 1].key;\n\t}));\n\tvar min_k = Math.min.apply(null, all_data.map(function (a) {\n\t\treturn a.buckets[0].key;\n\t}));\n\tfunction get_legend_name(idx) {\n\t\treturn typeof val_legend_name == 'function'?\n val_legend_name(idx):\n (idx == 0 ? val_legend_name : compare_legend_name);\n\t}\n\t// Fill in zero entries for the histogram. Generate statistics.\n\tfunction normalize_data_and_get_stats(in_data) {\n\t\tvar out = {\n\t\t\tvals_dict : [],\n\t\t\tvals_bucket : [],\n\t\t\tstats : []\n\t\t};\n\t\tfor(var a_i in in_data) {\n\t\t\tvar data = in_data[a_i];\n\t\t\t// Generate stats about the agg\n\t\t\tvar stat = { n : 0, total : 0, totalsq : 0 };\n\t\t\t// Turn the agg into a dictionary\n\t\t\tvar vals = {};\n\t\t\tfor(var i in data.buckets) {\n\t\t\t\tvar datum = data.buckets[i];\n\t\t\t\tvals[datum.key] = datum.doc_count;\n\t\t\t\tvar amt = datum.doc_count*datum.key;\n\t\t\t\tstat.n += datum.doc_count;\n\t\t\t\tstat.total += amt;\n\t\t\t\tstat.totalsq += amt*amt;\n\t\t\t}\n\t\t\t// Additional stats.\n\t\t\tstat.avg = stat.total / stat.n;\n\t\t\tstat.stddev = Math.sqrt(stat.totalsq/stat.n - stat.avg*stat.avg);\n\n\t\t\tvar shift = 0;\n\t\t\t// The comparison chart is drawn as a line, so it's shifted.\n\t\t\tif(compare_data && a_i > 0) {\n\t\t\t shift = INTERVAL / 2\n }\n\t\t\tvar legend_name = get_legend_name(a_i);\n\t\t\tvar new_agg = {\n\t\t\t\tbuckets: [],\n className : data.className,\n\t\t\t\tkey : legend_name +\n\t\t\t\t\t\" \" + roundNumber(stat.avg, 1) +\n\t\t\t\t\t\t\" \" + plural(stat.avg, val_units) + \" average\"\n\t\t\t};\n\t\t\tfor(var k=min_k; k <= max_k; k += INTERVAL) {\n\t\t\t\tnew_agg.buckets.push({\n\t\t\t\t\t// This is the number of claims granted, we never have 0 granted\n\t\t\t\t\tkey : (k + (k < max_k ? shift : 0)) || 1,\n\t\t\t\t\tdoc_count : vals[k] || 0\n\t\t\t\t});\n\t\t\t}\n\t\t\tout.vals_bucket.push(new_agg);\n\t\t\tout.vals_dict.push(vals);\n\t\t\tout.stats.push(stat);\n\t\t}\n\t\treturn out;\n\t}\n\n\t// Prepare the data\n\tvar D = normalize_data_and_get_stats(all_data);\n\n\tfunction _histo_hover_formatter(obj, i, series, x, y, className) {\n\t\t// Make xhi inclusive.\n\t\tvar xhi = i >= 0 && i < series.data.length - 1 ? series.data[i+1].x - 1 : \"\";\n\t\t// English description of the range.\n\t\tvar range_txt = xhi == \"\" ? plural_n(x, val_units) + \" and above\":\n\t\t\t\t\t\txhi == x ? x: x + \" to \" + plural_n(xhi, val_units);\n\n\t\tvar cur = deparam_url();\n\t\tif(!cur.f) {\n\t\t\tcur.f = [];\n\t\t} else if (!Array.isArray(cur.f)) {\n\t\t\tcur.f = [cur.f];\n\t\t}\n\t\t// Check for outcomes.\n\t\tvar el_class = $(obj).attr('class');\n\t\tvar outcome_q = re_stats_outcome.test(el_class || '') ?\n\t\t\t// If it's an outcome, the parser query expects words.\n\t\t\tel_class.replaceAll(\"_\", \" \") : '';\n\t\tvar outcome_msg = '';\n\t\tif(outcome_q && outcome_q.length) {\n\t\t\toutcome_msg = \" with outcome \" + capitalize(outcome_q);\n\t\t\toutcome_q = \" outcome_exact:(\" + outcome_q + \")\";\n\t\t}\n\n\t\tvar q = q_range_filter + \":[\" + x + \",\" + xhi + \"]\";\n\t\tvar f_key = 'fname_q_event_date';\n\t\tif (event_type) {\n\t\t\t// We manually create it here. Should add something to PleadingTag.\n\t\t\tvar f_start = (is_parser ? \"parser_obj:(identifier:\": \"event:(type:\");\n\n\t\t\t// Put the query together.\n\t\t\tq = f_start + \"(\" + event_type + \") AND \" + q + outcome_q + \")\";\n\t\t\t// Put the message together.\n\t\t\tcur[f_key] = \"Showing \" + event_type +\n\t\t\t\t\" that took between \" + x + \" and \" + plural_n(xhi, val_units) + outcome_msg;\n\t\t} else {\n\t\t\tcur[f_key] = \"Between \" + x + \" and \" + plural_n(xhi, val_units) + outcome_msg;\n\t\t}\n\t\tcur.f.push(\"q_event_date-\" + q);\n\t\tvar url = DOCKET_SEARCH_URL(cur);\n\n\t\tvar series_idx = null;\n\t\tthis.graph.series.forEach(function (s, s_i) {\n\t\t\tif(s == series) {\n\t\t\t\tseries_idx = s_i;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\t// Get the legend name based on the series number.\n\t\tvar legend_name = get_legend_name(series_idx);\n\t\t// Finish building the \"x value\" line in the tip.\n\t\tvar x_val = range_txt + (legend_name ? \": \" + legend_name : \"\");\n\n\t\tvar compare_values =\n\t\t\tD.vals_dict.length == 2 && series_idx == 0 && D.vals_dict[1][x] !== undefined ?\n\t\t\t\thtml_tag(\"div\", \"compare\",\n\t\t\t\t\t\"Compare \" + (get_legend_name(1) || \"overall\") + \": \" +\n\t\t\t\t\tnumber_with_commas(D.vals_dict[1][x] || 0)\n\t\t\t\t): \"\";\n\t\tvar main_value = main_value_func ? main_value_func(y):\n\t\t\t\"Occurred in \" + number_with_commas(roundNumber(y, 1)) +\n\t\t\t\tplural(y, \" \" + case_str);\n\n\t\t// Build the hover tooltip.\n\t\treturn $(hover_original).clone()\n\t\t\t.find(\".xval\").text(x_val).end()\n\t\t\t.find(\".yval\").html(main_value + compare_values).end()\n\t\t\t.find(\"a.viewmore\").attr(\"href\", url).end()\n\t\t\t.html();\n\t}\n\n\t// Call the standard drawing routines.\n\trender_histogram(0, agg_name, D.vals_bucket, new_id, _histo_hover_formatter,\n\t\t10, 100, xaxis_name, null, compare_data ? [1] : []);\n}\n\n/**\n * Add a control to the graph that changes the interval.\n * @param obj_id\n * @param xAxis\n */\nfunction add_date_gap_changer(obj_id, xAxis) {\n var $obj = $(\"#\" + obj_id);\n if (!$obj.length || $obj.find('.interval').length || !xAxis) {\n // Already created / bad input.\n return;\n }\n if (!$obj.find('.interval').length) {\n var lis = ['default', 'year', 'month', 'day'].map(function (i) {\n var txt = i == 'default' ? \"Default Interval\" :\n i == 'day' ? 'Daily' :\n capitalize(i) + \"ly\";\n return wrap_html(txt, \"option\", 'val', {}, {value: i});\n });\n var $ul = $(wrap_html(lis.join(\"\"), 'select', 'interval'));\n $obj.append($ul);\n }\n ///////\n // Setup the loader.\n if (!$obj.find(\".loader\").length) {\n $obj.append('\"throbber\"');\n }\n var cur_hash = get_url_hash();\n var frag_obj = url_params_to_object(cur_hash);\n var viewargs = get_viewargs_obj(cur_hash);\n $obj.find('.interval').change(function _on_click() {\n viewargs.interval = $(this).val();\n if (viewargs.interval == 'default') {\n delete viewargs['interval'];\n }\n var new_hash = $.extend({}, frag_obj);\n new_hash.viewargs = args_obj_to_args_ar(viewargs);\n var new_hash_url = param_query(new_hash);\n if (window.location.hash != new_hash_url) {\n window.location.hash = new_hash_url;\n }\n return false;\n });\n $obj.find(\".interval\").val(viewargs.interval || \"default\");\n\n $obj.css('visibility', 'visible').hide().fadeIn(\"fast\");\n}\n\nvar parser_stats_utils = {\n\t/**\n\t * True if this page supports motion tags.\n\t * @returns {boolean}\n\t */\n\tuses_motion_chooser : function _uses_motion_chooser() {\n\t\t// For now, hard code FederalCourts. May need to make this more extensible.\n\t\treturn window.location.pathname.search(/\\/FederalCourts\\//) >= 0;\n\t},\n\ton_event_profile : function on_event_profile() {\n\t\treturn $.bbq.getState(\"v\") == 'event_profile';\n\t},\n\t/**\n\t * Return a jquery link that, when clicked, will remove any applied motion identifier.\n\t * @returns {*|jQuery}\n\t */\n\tprofile_only_link : function () {\n\t\tvar v = $.bbq.getState(\"v\");\n\t\tif(!v.search(/_profile$/) == -1 || !this.uses_motion_chooser()) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar icon = wrap_html(\"\", \"i\", stats_views_globals.view_only_icon);\n\t\tvar html = wrap_html(icon + \"Remove Motion\", \"a\", \"view_all_stats\");\n\t\treturn $(html).click(function () {\n\t\t\tvar cur_hash = get_url_hash();\n\t\t\tvar viewargs = get_viewargs_obj(cur_hash);\n\t\t\tvar frag_obj = url_params_to_object(cur_hash);\n\t\t\tdelete viewargs['event_identifier'];\n\t\t\tfrag_obj.viewargs = args_obj_to_args_ar(viewargs);\n\t\t\tvar new_hash = $.param(frag_obj, true);\n\t\t\tif (window.location.hash != new_hash) {\n\t\t\t\twindow.location.hash = new_hash;\n\t\t\t}\n\t\t});\n\t},\n\tother_links : function other_links(selected_identifier) {\n var html = '';\n if($.bbq.getState(\"v\") != 'event_profile') {\n var view_all = '#q=&v=event_profile&viewargs=event_identifier-' + selected_identifier;\n\t\t\tvar icon = wrap_html(\"\", \"i\", stats_views_globals.view_only_icon);\n\t\t\thtml += wrap_html(icon + \"All event stats\", \"a\", \"view_all_stats\",\n {}, { href : view_all });\n }\n return $(html);\n },\n\tidentifier_tip : function identifier_tip(identifier_info, not_event_profile) {\n\t\tif(not_event_profile == true && this.on_event_profile()) {\n\t\t\treturn '';\n\t\t}\n\t\tif(!identifier_info.tip) {\n\t\t\treturn '';\n\t\t}\n\t\treturn html_tag(\"p\", \"identifier_tip\", identifier_info.tip);\n\n\t},\n\tdrop_down : function drop_down(selected_identifier, identifier_dict, not_event_profile, btn_txt) {\n\t\tif(not_event_profile == true && this.on_event_profile()) {\n\t\t\treturn '';\n\t\t}\n\t\t// Default button text.\n\t\tif(!btn_txt) {\n\t\t\tbtn_txt = \"More Motion Analytics\";\n\t\t}\n var $motion_chooser = $(wrap_html(\"\", \"div\", \"motion_chooser_wrapper\"));\n var $show_button = $(wrap_html(\n wrap_html(\"\", \"i\", \"fad fa-analytics\") + btn_txt,\n\t\t\t\"div\", \"motion_chooser_btn\"));\n var search_url = window.location.origin + DOCKET_SEARCH_URL(deparam_url());\n analytics_track(\"MotionChooser\", \"dropdown\");\n setup_motion_chooser({\n $object : $motion_chooser,\n search_url: search_url,\n sort: \"priority\",\n auto_expand: true,\n // This expander is on the right, put tooltips on the left.\n tip_placement : 'nw',\n max_types : 0,\n\t\t\tanalytics_link_toggle: true,\n create_href : parser_stats_utils.create_analytics_link,\n done : function () {\n\n }\n });\n function toggle_show() {\n $motion_chooser.toggle();\n $show_button.toggleClass(\"selected\");\n }\n $show_button\n .append($motion_chooser.hide())\n .click(function (ev) {\n // only continue if the target itself has been clicked\n if(ev.target != this && ev.target !== $(this).find(\"i\")[0])\n return;\n toggle_show();\n });\n // The global dropdown allows the user to click anywhere to hide.\n add_global_dropdown(\".motion_chooser_wrapper\", $show_button, toggle_show)\n return $show_button;\n },\n\tupdate_agg_info : function update_agg_info(agg_info, p_identifier, name) {\n\t\tupdate_dict(agg_info, {\n\t\t\tis_parser : true,\n\t\t\tname: 'Analytics on ' + name,\n\t\t\tmap_name : function(it) {\n\t\t\t\treturn capitalize(it.key);\n\t\t\t},\n\t\t\tmap_short_name : function _get_short_name(it) {\n\t\t\t\treturn capitalize(it.key);\n\t\t\t},\n\t\t\tclassName : function _get_short_name(it) {\n\t\t\t\treturn it.key;\n\t\t\t},\n\t\t\tsort_series \t: sort_grant,\n\t\t\tclick_searches_dockets : true,\n\t\t\tclick_type\t\t: null,\n\t\t\tclick_identifier : p_identifier,\n\t\t\t// Specific to render_event_success\n\t\t\tdays_from_name : case_str + \" Start\",\n\t\t\tdays_to_name : name,\n\t\t\t// Specific to patent claim analysis (so far only PTAB uses it)\n\t\t\tclaims_grant_name : null,\n\t\t\t// Special function specific to render_event_success\n\t\t\tget_stat : null && function (agg) {\n\t\t\t\treturn {\n\t\t\t\t\tstat : (100*this.get_stat_filtered(agg).stat\n\t\t\t\t\t\t).toFixed(0).toString() + \"%\",\n\t\t\t\t\tp : e.percent_success\n\t\t\t\t}\n\t\t\t},\n\t\t\t// Generates a percentage statistic for filtered data.\n\t\t\tget_stat_filtered : function(agg) {\n\t\t\t\tvar total = 0;\n\t\t\t\tvar counts = {};\n\t\t\t\tfor(var i in agg.buckets) {\n\t\t\t\t\tvar bucket = agg.buckets[i];\n\t\t\t\t\tvar types = bucket.type && bucket.type.buckets || [];\n\t\t\t\t\ttotal += bucket.doc_count;\n\t\t\t\t\ttypes.forEach(function (type_bucket) {\n\t\t\t\t\t\tcounts[type_bucket.key] = (counts[type_bucket.key] || 0) + type_bucket.doc_count;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tvar total_stat = counts['order'] || 0;\n\t\t\t\treturn {\n\t\t\t\t\tstat \t: total ? total_stat / total : null,\n\t\t\t\t\tp \t\t: \"Total Orders\",\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Turn a list of identifiers into a dictionary.\n\t * @param identifier_list\n\t * @returns {{}}\n\t */\n\tget_identifier_dict : function get_identifier_dict(identifier_list) {\n\t\tvar identifier_dict = {};\n\t\tidentifier_list.forEach(function (info) {\n\t\t\tidentifier_dict[info.identifier] = info;\n\t\t});\n\t\treturn identifier_dict;\n\t},\n\n\t// The \"recent time\" view argument controls the recent stats that are shown on the right.\n\trecent_time_options : {\n\t\t\"7days\" : \"Last Week\",\n\t\t\"3months\" : \"Last 3 Months\",\n\t\t\"12months\" : \"Last Year\",\n\t\t\"2years\" : \"Last 2 Years\",\n\t},\n\t// Must match server's default.\n\trecent_time_default : \"3months\",\n\trecent_time_dropdown : function recent_time_dropdown(recent_val) {\n\t\treturn this.create_viewargs_dropdown(recent_val, this.recent_time_options, this.recent_time_default, 'recent_time', 'recent');\n\t},\n\n\t// Histogram type controls the type of parser hitogram we show.\n\tdate_histogram_type_options : {\n\t\t'order_outcomes' : 'Orders and outcomes',\n\t\t'order_known_outcomes' : 'Orders and known outcomes',\n\t\t'all_types' : 'Orders, motions, responses, replies',\n\t\t'motions' : 'Motions',\n\t},\n\tdate_histogram_type_default : \"order_outcomes\",\n\tdate_histogram_type_dropdown : function date_histogram_type_dropdown(histo_val) {\n\t\treturn this.create_viewargs_dropdown(histo_val, this.date_histogram_type_options, this.date_histogram_type_default, 'date_histogram_type', 'date_histogram_type');\n\t},\n\tinterval_days_options : {\n\t\t'1' : 'Daily Interval (up to 50 days)',\n\t\t'2' : '2 Day Intervals (up to 100 days)',\n\t\t'5' : '5 Day Intervals (up to 250 days)',\n\t\t'10' : '10 Day Intervals (up to 500 days)',\n\t\t'30': '30 Day Intervals (Up to 1500 days)',\n\t\t'100': '100 Day Intervals (Up to 5000 days)',\n\t\t'250': '250 Day Intervals (Up to 12,500 days)',\n\t},\n\tinterval_days_default : 10,\n\tinterval_days_dropdown : function interval_days_dropdown(interval_days) {\n\t\treturn this.create_viewargs_dropdown(interval_days, this.interval_days_options, this.interval_days_default, 'interval_days', 'interval_days');\n\t},\n\n\tlength_histogram_info : [\n\t\t{key:'Days_To_Motion', name:'Case Start \u2192 Motion', q_filter : \"type:motion days\"},\n\t\t{key:'Days_Sequence', name:'Motion \u2192 Decision', q_filter : \"days_sequence\"},\n\t\t{key:'Days_Decision', name:'Fully Briefed \u2192 Decision', q_filter : \"days_decision\"},\n\t\t{key:'Days_Briefing', name:'Motion \u2192 Fully Briefed', q_filter : \"days_briefing\"},\n\t\t// The q_filter below is a bit of a hack to limit to only orders/motions.\n\t\t{key:'Days_To_Decision', name:'Case Start \u2192 Decision', q_filter : \"type:order days\"},\n\t],\n\t// The default values depending on whether viewing histogram or a row, and whether timing dat ais available.\n\ttiming_defaults : stats_views_globals.render_analytics_sequence ? {\n\t\thisto: \"days_sequence+outcome\",\n\t\trow: \"days_sequence\"\n\t} : {\n\t\thisto : \"days_to_decision+outcome\",\n\t\trow : \"days_to_decision\"\n\t},\n\tlength_histogram_type_options : function length_histogram_type_options() {\n\t\tvar key_to_name = {};\n\t\tthis.length_histogram_info.forEach(function (info) {\n\t\t\tvar kew_lower = info.key.toLowerCase();\n\t\t\tkey_to_name[kew_lower] = info.name;\n\t\t});\n\t\treturn stats_views_globals.render_analytics_sequence ? {\n\t\t\t// The most important ones.\n\t\t\t'days_sequence+outcome' : 'Motion \u2192 Decision with Outcomes',\n\t\t\t'days_decision+outcome' : 'Fully Briefed \u2192 Decision with Outcomes',\n\n\t\t\t// Second Tier - maybe remove?\n\t\t\t'days_to_decision+outcome' : 'Case Start \u2192 Decision with Outcomes',\n\t\t\t'days_to_decision' : 'Case Start \u2192 Decision',\n\t\t\t'days_to_decision,days_to_motion' : 'Case Start \u2192 Motion + Decision',\n\t\t\t'days_to_motion' : key_to_name['days_to_motion'],\n\n\t\t\t// Third Tier\n\t\t\t'days_sequence,days_briefing' : 'Motion \u2192 Decision + Fully Briefed',\n\t\t\t'days_briefing' : key_to_name['days_briefing'],\n\t\t\t'days_sequence' : key_to_name['days_sequence'],\n\t\t\t'days_decision' : key_to_name['days_decision'],\n\t\t} : {\n\t\t\t// Case Start timing w/o linking.\n\t\t\t'days_to_decision+outcome' : 'Case Start \u2192 Decision with Outcomes',\n\t\t\t'days_to_decision' : 'Case Start \u2192 Decision',\n\t\t\t'days_to_decision,days_to_motion' : 'Case Start \u2192 Motion + Decision',\n\t\t\t'days_to_motion' : 'Case Start \u2192 Motion',\n\t\t};\n\t},\n\n\tlength_histogram_type_dropdown : function length_histogram_type_dropdown(event_histo_val) {\n\t\tvar options = this.length_histogram_type_options();\n\t\tvar opt_default = this.timing_defaults.histo;\n\t\treturn this.create_viewargs_dropdown(event_histo_val, options, opt_default,\n\t\t\t'length_histogram_type', 'length_histogram_type');\n\t},\n\t// The stats row timing shares many similarities with the length histogram timing, but not the same.\n\tstats_row_timing_type_options : function stats_row_timing_type_options() {\n\t\tvar info_options = {};\n\t\tthis.length_histogram_info.forEach(function (info) { info_options[info.key.toLowerCase()] = info.name; });\n\t\treturn stats_views_globals.render_analytics_sequence ? {\n\t\t\t'days_sequence' : info_options['days_sequence'],\n\t\t\t'days_to_decision' : info_options['days_to_decision'],\n\t\t\t'days_to_motion' : info_options['days_to_motion'],\n\t\t\t'days_decision' : info_options['days_decision'],\n\t\t\t// Needs testing b/c we're filtered on\n\t\t\t// 'days_briefing' : info_options['days_briefing'],\n\t\t} : {\n\t\t\t'days_to_decision' : info_options['days_to_decision'],\n\t\t\t'days_to_motion' : info_options['days_to_motion'],\n\t\t}\n\t},\n\tstats_row_timing_type_dropdown : function stats_row_timing_type_dropdown(stats_row_timing_type_val) {\n\t\tvar options = this.stats_row_timing_type_options();\n\t\tvar opt_default = this.timing_defaults.row;\n\t\treturn this.create_viewargs_dropdown(stats_row_timing_type_val,\n\t\t\toptions, opt_default, 'stats_row_timing_type', 'stats_row_timing_type');\n\t},\n\n\t/**\n\t * Create a dropdown menu that will change the view arguments when changed.\n\t * @param curviewargs_val The current viewargs val (null if not set).\n\t * @param options A viewargs value --> human display dictionary.\n\t * @param default_val Default value.\n\t * @param klass Any additional klass.\n\t * @param viewargs_key The view arguments key you want to change.\n\t * @returns {*|jQuery}\n\t */\n\tcreate_viewargs_dropdown : function create_viewargs_dropdown(curviewargs_val, options, default_val, klass, viewargs_key) {\n\t\tvar html_options = [];\n\t\tfor(var val in options) {\n\t\t\tvar name = options[val];\n\t\t\tvar attrs = {value:val};\n\t\t\tif(val == curviewargs_val || (!curviewargs_val && val == default_val)) {\n\t\t\t\tattrs.selected = true;\n\t\t\t}\n\t\t\thtml_options.push(html_tag(\"option\", \"\", name, {}, attrs));\n\t\t}\n\t\tvar html = html_tag(\"select\", klass, html_options.join(\"\"));\n\t\treturn $(html).change(function _recent_dropdown_changed() {\n\t\t\tvar cur_hash = get_url_hash();\n\t\t\tvar frag_obj = url_params_to_object(cur_hash);\n\t\t\tvar viewargs = get_viewargs_obj(cur_hash);\n\t\t\tviewargs[viewargs_key] = $(this).val();\n\t\t\tfrag_obj.viewargs = args_obj_to_args_ar(viewargs);\n\t\t\tvar new_hash = $.param(frag_obj, true);\n\t\t\tif (window.location.hash != new_hash) {\n\t\t\t\twindow.location.hash = new_hash;\n\t\t\t}\n\t\t})\n\t},\n\n\trender_basic_stats : function render_basic_stats(p_info, viewargs, agg) {\n\n\t\t// Create a single statistic.\n\t\tfunction do_stat(name, agg_val, icon_klass, klass, q_type, recent_time) {\n\t\t\tvar icon = html_tag(\"i\", icon_klass, \"\");\n\t\t\tvar subtitle = agg_val.cases ? html_tag(\"div\", \"subtitle\",\n\t\t\t\t\"in \" + plural_n(agg_val.cases.doc_count, case_str)) : \"\";\n\t\t\tvar main = plural_n(agg_val.count || agg_val.doc_count || 0, name);\n\t\t\tvar link = q_type ? get_parser_query(p_info, q_type, null, recent_time) : \"\";\n\n\t\t\treturn html_tag(link ? \"a\" : \"div\", \"one_stat \" + (klass || ''),\n\t\t\t\ticon + main + subtitle, {}, link?{target:\"_blank\", href:link}:null);\n\t\t}\n\t\t// Create a single outcome statistics\n\t\tfunction do_outcome_stat(name, agg_count, agg_dict, icon_klass, klass, recent_time) {\n\t\t\tvar icon = html_tag(\"i\", icon_klass, \"\");\n\t\t\tvar full_klass = \"one_stat outcome \" + (klass || '');\n\t\t\tif(!agg_count) {\n\t\t\t\treturn html_tag(\"div\", full_klass + \" empty\", icon + \"-\");\n\t\t\t}\n\t\t\tvar link = get_parser_query(p_info, 'order', [klass], recent_time);\n\n\t\t\tvar count = agg_dict ? agg_dict.count : 0;\n\t\t\tvar percentage = (100 * count / agg_count).toFixed(0);\n\t\t\tvar title = percentage + \"% \" + name;\n\t\t\treturn html_tag(\"a\", full_klass, icon + title, {}, {href:link, target: \"_blank\"});\n\t\t}\n\t\t// create a single time statistic.\n\t\tvar timing_icon = \"fad fa-calendar\";\n\t\t// Return a dict with the stat, cases, and percentiles for the timing key.\n\t\tfunction get_timing_aggs(agg_val) {\n\t\t\tvar keys = ['days_sequence', 'days_to_decision', 'days_to_motion', 'days_decision'];\n\t\t\t// Return the first key we find with the correct statistic.\n\t\t\tvar timing_key = keys.find(function (key) { return agg_val[key + \"_stats\"]; });\n\t\t\treturn {\n\t\t\t\tstat : agg_val[timing_key + \"_stats\"],\n\t\t\t\tcases : agg_val[timing_key + \"_cases\"],\n\t\t\t\tperc : agg_val[timing_key + \"_percentiles\"],\n\t\t\t}\n\t\t}\n\t\tfunction do_time_stat(agg_val) {\n\t\t\tvar icon = html_tag(\"i\", timing_icon, \"\");\n\t\t\tvar a_timing = get_timing_aggs(agg_val);\n\t\t\tif(!a_timing.stat.count) {\n\t\t\t\treturn html_tag(\"div\", \"one_stat time empty\", icon + '-');\n\t\t\t}\n\t\t\tvar subtitle =\n\t\t\t\thtml_tag(\"div\", \"subtitle\", \"Motions \u2192 Decisions\") +\n\t\t\t\thtml_tag(\"div\", \"subtitle\",\n\t\t\t\t\"in \" + plural_n(a_timing.stat.count, \"Motion\"));\n\t\t\t// Add the case count if we were given it.\n\t\t\tif(a_timing.cases && a_timing.cases.doc_count) {\n\t\t\t\tsubtitle += html_tag(\"div\", \"subtitle\",\n\t\t\t\t\t\"across \" + plural_n(a_timing.cases.doc_count, case_str));\n\t\t\t}\n\n\t\t\tvar count = plural_n(a_timing.stat.avg.toFixed(0), \"day\") + \" avg.\";\n\n\t\t\tvar percentile = '';\n\t\t\tif(a_timing.perc && a_timing.stat.count > 1) {\n\t\t\t\tvar values = a_timing.perc.values;\n\t\t\t\tpercentile += html_tag(\"div\", \"percentile subtitle\", \"Common Range: \" +\n\t\t\t\t\tparseInt(values['25.0']).toFixed(0) + \"-\" +\n\t\t\t\t\tparseInt(values['75.0']).toFixed(0) + \" days\", {\n\t\t\t\t\t\tpowertip: \"Common Range: The day range between the 25th and 75th percentiles (i.e., the middle 50%) \u2014 estimating a common statistical range.\"\n\t\t\t\t}\t);\n\t\t\t}\n\t\t\treturn html_tag(\"div\", \"one_stat time\", icon + count + subtitle + percentile);\n\t\t}\n\n\t\t// Get a list of statistics. Code is shared between all time and recent.\n\t\tfunction get_stats_list(agg, outcome_agg, recent_time) {\n\t\t\tvar outcomes = agg_to_dict(outcome_agg);\n\t\t\tvar known_outcomes = outcome_agg.doc_count - ((outcomes.unknown || {}).count || 0);\n\t\t\treturn [\n\t\t\t\tdo_stat(\"Order\",agg.Orders, parser_fontawesome_icons.order,\"orders\", \"order\", recent_time),\n\t\t\t\tdo_outcome_stat(\"Granted\", known_outcomes, outcomes.granted, 'fad fa-check',\"granted\", recent_time),\n\t\t\t\tdo_outcome_stat(\"Denied\", known_outcomes, outcomes.denied, 'fad fa-thumbs-down',\"denied\", recent_time),\n\t\t\t\thtml_tag(\"div\", \"one_stat outcome_subtitle\", \" of \" + plural_n(known_outcomes, \"known outcome\")),\n\t\t\t\tdo_time_stat(agg.Orders),\n\t\t\t\tdo_stat(\"Motion\", agg.Motions, parser_fontawesome_icons.motion, \"motions\", \"motion\", recent_time),\n\t\t\t];\n\t\t}\n\t\tfunction pie_chart_div(outcomes_agg) {\n\t\t\tvar buckets = ((outcomes_agg || {}).buckets || []);\n\t\t\t// Setup the buckets so they can be displayed.\n\t\t\tbuckets.forEach(function _setup_bucket_for_display(b) {\n\t\t\t\tb.outcome = b.key;\n\t\t\t\tb.short_name = capitalize(b.key);\n\t\t\t\tb.className = b.key.replaceAll(\" \", \"_\");\n\t\t\t\tb.k = b.short_name;\n\t\t\t});\n\t\t\treturn html_tag(\"div\", \"outcome_pie_chart\", \"\");\n\t\t}\n\t\tfunction outcome_pie_chart_click(recent_time) {\n\t\t\treturn function _inner_pie_click(data, iteration, element) {\n\t\t\t\tvar outcome = data.data && data.data.k;\n\t\t\t\tvar link = get_parser_query(p_info, 'order', [outcome], recent_time);\n\t\t\t\treturn link;\n\t\t\t}\n\t\t}\n\n\t\tvar recent_time = viewargs_get_recent_date(viewargs);\n\t\tvar recent_time_name = parser_stats_utils.recent_time_options[viewargs.recent || parser_stats_utils.recent_time_default] || \"Since \" + $.datepicker.formatDate('m/d/yy', recent_time);\n\n\t\tvar html =\n\t\thtml_tag(\"div\", \"stat_section all_time\",\n\t\t\thtml_tag(\"div\", \"stat_title\", \"Since \" + stats_views_globals.parser_start_year) +\n\t\t\thtml_tag(\"div\", \"stat_list\", get_stats_list(agg, agg.Outcome).join(\"\")) +\n\t\t\tpie_chart_div(agg.Outcome),\n\t\t) +\n\t\thtml_tag(\"div\", \"stat_section recent\",\n\t\t\thtml_tag(\"div\", \"stat_title\", recent_time_name) +\n\t\t\thtml_tag(\"div\", \"stat_list\", get_stats_list(agg.Recent, agg.Recent_Outcome, recent_time).join(\"\")) +\n\t\t\tpie_chart_div(agg.Recent_Outcome),\n\t\t);\n\t\tvar $html = $(html)\n\t\t\t.find(\"[data-powertip]\").powerTip({\n\t\t\t\tsmartPlacement:true,\n\t\t\t\tpopupClass : 'small_powertip'\n\t\t\t}).end();\n\n\t\t// The pie charts are all in javascript.\n\t\tsetup_pie_chart(2, \"All Time\", agg.Outcome,\n\t\t\t$html.find(\".outcome_pie_chart\").first(),\n\t\t\tnull, outcome_pie_chart_click());\n\t\tsetup_pie_chart(2, \"Recent\", agg.Recent_Outcome,\n\t\t\t$html.find(\".outcome_pie_chart\").last(),\n\t\t\tnull, outcome_pie_chart_click(recent_time));\n\n\t\treturn $html;\n\t}\n}\n\n/**\n * Parse the view argument to get the \"recent\" date.\n * @param viewargs\n * @returns {null|Date}\n */\nfunction viewargs_get_recent_date(viewargs) {\n\tvar key = viewargs.recent;\n\tif(key == undefined) {\n\t\tkey = parser_stats_utils.recent_time_default;\n\t}\n\tvar d = new Date();\n\n\tvar years = /-?(\\d)\\s*years?/.exec(key);\n\tif(years) {\n\t\td.setFullYear(d.getFullYear() - parseInt(years[1]));\n\t\treturn d;\n\t}\n\tvar months = /-?(\\d)\\s*mo\\.?(nths?)?/.exec(key);\n\tif(months) {\n\t\td.setMonth(d.getMonth() - parseInt(months[1]));\n\t\treturn d;\n\t}\n\tvar days = /-?(\\d)\\s*days?/.exec(key);\n\tif (days) {\n\t\t d.setDate(d.getDate() - parseInt(days[1]));\n\t\t return d;\n\t}\n\treturn null;\n}\n\n/**\n * Wrap a rendering function that takes the standard arguments, and add two\n * additional arguments at the start.\n * @param render_func Takes standard rendering arguments, plust an identifier_dict, and was_synchronous input params.\n * @returns {*}\n */\nfunction render_with_identifier_dict(render_func) {\n\tvar render_no = 0;\n\treturn function _render_with_identifier(obj_id, agg_info, agg_name, agg) {\n\t\tvar was_synchronous = true;\n\t\trender_no++;\n\t\tvar cur_render_no = render_no;\n\t\tvar did_done = false;\n\t\twas_synchronous = get_identifier_list({\n\t\t\tsearch_url: false, // Just get the static list\n\t\t\tsort: 'priority',\n\t\t\t// Filter down to the given type.\n\t\t\tfilter_types: null,\n\t\t\tmax_identifiers: 1,\n\t\t\tmax_types: 100,\n\t\t\t// Try to call done synchronously if possible.\n\t\t\tsynchronous: true,\n\t\t\tdone: function _done(identifier_list) {\n\t\t\t\tdid_done = true;\n\t\t\t\tif(cur_render_no != render_no) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Turn the list into a dict.\n\t\t\t\tvar identifier_dict = parser_stats_utils.get_identifier_dict(identifier_list);\n\t\t\t\trender_func(identifier_dict, was_synchronous, obj_id, agg_info, agg_name, agg);\n\t\t\t},\n\t\t\terror: function _error(error) {\n\t\t\t\tdid_done = true;\n\t\t\t\tconsole.log(\"Error Getting Identifier List: \" + error);\n\t\t\t}\n\t\t});\n\t\twas_synchronous = false;\n\n\t\t// If we're still waiting after a second, display a message.\n\t\tsetTimeout(function () {\n\t\t\tif(!did_done && cur_render_no == render_no) {\n\t\t\t\t$(\"#\" + obj_id).text(\"Loading pleading tag info...\");\n\t\t\t}\n\t\t}, 1000);\n\t}\n}\n\nfunction render_event_counts_viewargs(identifier_dict, was_synchronous, obj_id, agg_info, agg_name, agg) {\n\tvar viewargs = get_viewargs_obj();\n var p_identifier = viewargs.event_identifier;\n\tvar $obj = $(\"#\" + obj_id).addClass(\"eventcounts\");\n function type_to_title(p_type) {\n return capitalize(p_type);\n }\n parser_stats_utils.update_agg_info(agg_info, p_identifier, p_identifier);\n var has = {};\n has.unknown_outcomes = viewargs.unknown_outcomes == undefined;\n\n var check_options= [];\n check_options.push([\"Show Unknown Outcomes\", has.unknown_outcomes,\n \"unknown_outcomes\", null, unknown_outcome_tip()]);\n\n\t// Get the info on the given event key.\n\tvar p_info = identifier_dict[p_identifier];\n\tif(!p_info) {\n\t\thandle_error(p_identifier ?\n\t\t\t\"Unknown identifier: \" + p_identifier : \"Identifier is required.\");\n\t\treturn;\n\t}\n\tvar $dropdown = parser_stats_utils.drop_down(p_identifier, identifier_dict);\n\tvar $identifier_tip = parser_stats_utils.identifier_tip(identifier_dict[p_identifier]);\n\tvar $other_links = parser_stats_utils.other_links(p_identifier);\n\tvar $recent_dropdown = parser_stats_utils.recent_time_dropdown(viewargs.recent);\n\tvar $outcome_options = get_checkbox_viewargs_row(check_options, obj_id);\n\tvar $options = $outcome_options.append($recent_dropdown)\n\t\t.append($other_links).append($dropdown);\n\tfunction get_title() {\n\t\treturn p_info.name_display + \": Overview\";\n\t}\n\t$obj.find(\".graph_title\")\n\t\t.addClass(\"no_suggest\")\n\t\t.addClass(\"no_export\")\n\t\t// Update the title.\n\t\t.find(\".name\").text(get_title()).end()\n\t\t.append($options)\n\t\t.append($identifier_tip)\n\t;\n\n\tupdate_dict(agg_info, {\n\t\tname : p_info.name,\n\t});\n\tvar html = parser_stats_utils.render_basic_stats(p_info, viewargs, agg);\n\n\t$obj.append(html);\n}\n\n/**\n * Render a parser event histogram.\n * @param obj_id\n * @param agg_info\n * @param agg_name\n * @param agg\n */\nfunction render_date_event_histogram(identifier_dict, was_synchronous, obj_id, agg_info, agg_name, agg) {\n\tvar viewargs = get_viewargs_obj();\n\tvar p_identifier = viewargs.event_identifier;\n\tvar $obj = $(\"#\" + obj_id).addClass(\"eventdatehistogram\");\n\n\tparser_stats_utils.update_agg_info(agg_info, p_identifier, name);\n\tvar has = {};\n\thas.unknown_outcomes = viewargs.unknown_outcomes == undefined;\n\n\tvar check_options = [];\n\tcheck_options.push([\"Show Unknown Outcomes\", has.unknown_outcomes,\n\t\t\"unknown_outcomes\", null, unknown_outcome_tip()]);\n\n\t// Get the info on the given event key.\n\tvar p_info = identifier_dict[p_identifier];\n\tif (!p_info) {\n\t\thandle_error(p_identifier ?\n\t\t\t\"Unknown identifier: \" + p_identifier : \"Identifier is required.\");\n\t\treturn;\n\t}\n\tvar $dropdown = parser_stats_utils.drop_down(p_identifier, identifier_dict, true);\n\tvar $identifier_tip = parser_stats_utils.identifier_tip(identifier_dict[p_identifier], true);\n\tvar $other_links = parser_stats_utils.other_links(p_identifier);\n\tvar $date_histogram_type_dropdown = parser_stats_utils.date_histogram_type_dropdown(viewargs.date_histogram_type);\n\tvar $outcome_options = get_checkbox_viewargs_row(\n\t\tcheck_options, obj_id).addClass(\"outcome_option\");\n\tvar $options = $(wrap_html(\"\", \"div\", \"options\"))\n\t\t.append($date_histogram_type_dropdown)\n\t\t.append($other_links).append($dropdown);\n\n\tfunction get_title() {\n\t\tvar histo_title = parser_stats_utils.date_histogram_type_options[viewargs.date_histogram_type || parser_stats_utils.date_histogram_type_default]\n\t\treturn p_info.name_display + \": \" + histo_title;\n\t}\n\n\t$obj.find(\".graph_title\")\n\t\t.addClass(\"no_suggest\")\n\t\t.addClass(\"no_export\")\n\t\t// Update the title.\n\t\t.find(\".name\").text(get_title()).end()\n\t\t.append($options)\n\t\t.append($identifier_tip)\n\t\t.append(\"
\");\n\n\tupdate_dict(agg_info, {\n\t\tname: p_info.name,\n\t});\n\tvar no_outcomes = false;\n\ttransform_agg(agg, agg_info.filter, agg_info.map, agg_info.map_name,\n\t\tagg_info.map_className, agg_info.sort_series);\n\n\tfunction get_url(el, start_d, end_d) {\n\t\t// The element's class name has the data series it's from.\n\t\tvar el_class = $(el).attr('class');\n\t\t// is_parser_type is a global defined in pleading_tags.js\n\t\tvar type_val = is_parser_type && is_parser_type(el_class) ? el_class : \"order\";\n\t\tvar outcome = re_stats_outcome.test(el_class) ?\n\t\t\t// If it's an outcome, the parser query expects an array.\n\t\t\t[el_class.replaceAll(\"_\", \" \")] : null;\n\t\treturn get_parser_query(p_info, type_val, outcome, start_d, end_d);\n\t}\n\trender_event_success_histogram($obj, agg, agg_name, agg_info, no_outcomes, get_url, \"parser\");\n}\n\nfunction render_length_event_histogram(identifier_dict, was_synchronous, obj_id, agg_info, agg_name, agg) {\n\tvar viewargs = get_viewargs_obj() || {};\n\tvar p_identifier = viewargs.event_identifier;\n\tvar $obj = $(\"#\" + obj_id).addClass(\"eventlengthhistogram\");\n\tvar cur_histogram_type = viewargs.length_histogram_type ||\n\t\tparser_stats_utils.timing_defaults.histo;\n\n\tparser_stats_utils.update_agg_info(agg_info, p_identifier, name);\n\tvar has = {};\n\thas.unknown_outcomes = viewargs.unknown_outcomes == undefined;\n\thas.length_histogram_do_range = viewargs.length_histogram_do_range;\n\thas.outcomes = cur_histogram_type.search(/\\+outcomes?$/ig) >= 0;\n\n\tvar check_options = [];\n\tcheck_options.push([\"Show as pie chart\", has.length_histogram_do_range,\n\t\t\"length_histogram_do_range\", true, \"Show in a pie chart as days, \" +\n\t\t\"weeks, months, years, etc, rather than as a histogram.\"]);\n\n\t// Get the info on the given event key.\n\tvar p_info = identifier_dict[p_identifier];\n\tif (!p_info) {\n\t\thandle_error(p_identifier ?\n\t\t\t\"Unknown identifier: \" + p_identifier : \"Identifier is required.\");\n\t\treturn;\n\t}\n\tvar $dropdown = parser_stats_utils.drop_down(p_identifier, identifier_dict, true);\n\tvar $identifier_tip = parser_stats_utils.identifier_tip(identifier_dict[p_identifier], true);\n\tvar $other_links = parser_stats_utils.other_links(p_identifier);\n\tvar $interval_days_dropdown = parser_stats_utils.interval_days_dropdown(viewargs.interval_days);\n\tvar has_sequence_timing = p_info.can.sequence && stats_views_globals.render_analytics_sequence;\n\tvar $length_histogram_type_dropdown = parser_stats_utils.length_histogram_type_dropdown(\n\t\tviewargs.length_histogram_type, has_sequence_timing);\n\tvar $outcome_options = get_checkbox_viewargs_row(\n\t\tcheck_options, obj_id).addClass(\"outcome_option\");\n\tvar $options = $(wrap_html(\"\", \"div\", \"options\"))\n\t\t.append($interval_days_dropdown)\n\t\t.append($length_histogram_type_dropdown)\n\t\t.append($outcome_options)\n\t\t.append($other_links).append($dropdown);\n\n\tfunction get_title(main_agg) {\n\t\tvar options = parser_stats_utils.length_histogram_type_options();\n\t\tvar name = options[cur_histogram_type];\n\t\tif(!name) {\n\t\t\tname = main_agg && main_agg.name || '';\n\t\t}\n\t\treturn p_info.name_display + \": Timing \" + name;\n\t}\n\tvar main_agg_info = null, compare_agg_info = null;\n\tvar main_data = null, compare_data = null;\n\tparser_stats_utils.length_histogram_info.forEach(function (agg_info) {\n\t\tvar agg_data = agg[agg_info.key];\n\t\tif(agg_data) {\n\t\t\tif(!main_agg_info) {\n\t\t\t\tmain_agg_info = agg_info;\n\t\t\t\tmain_data = agg_data;\n\t\t\t} else if(!compare_agg_info) {\n\t\t\t\tcompare_agg_info = agg_info;\n\t\t\t\tcompare_data = agg_data;\n\t\t\t} else {\n\t\t\t\tconsole.warning(\"Ignoring data: \" + agg_info.name);\n\t\t\t}\n\t\t}\n\t});\n\t$obj.find(\".graph_title\")\n\t\t.addClass(\"no_suggest\")\n\t\t.addClass(\"no_export\")\n\t\t// Update the title.\n\t\t.find(\".name\").text(get_title(main_agg_info)).end()\n\t\t.append($options)\n\t\t.append($identifier_tip)\n\t\t.append(\"
\");\n\n\tif(!main_agg_info) {\n\t\t$obj.find(\"#Event_Length_Histogram\").text(\"No Data\");\n\t\treturn;\n\t}\n\tupdate_dict(agg_info, {\n\t\tname: p_info.name,\n\t});\n\ttransform_agg(agg, agg_info.filter, agg_info.map, agg_info.map_name,\n\t\tagg_info.map_className, agg_info.sort_series);\n\n\tif(has.length_histogram_do_range) {\n\t\t// If we get data as a named range, there may be buckets.\n\t\tfunction _buckets_to_arrays(data) {\n\t\t\tif(!data || !data.buckets || typeof data.buckets != \"object\") {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tvar buckets_ar = [];\n\t\t\tfor(var k in data.buckets) {\n\t\t\t\tvar b = data.buckets[k];\n\t\t\t\tif(b.from === undefined) {\n\t\t\t\t\tconsole.warning(\"Bad Range Bucket: \" + b.name);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(b.key == undefined) {\n\t\t\t\t\t// May have already changed it.\n\t\t\t\t\tb.key = k;\n\t\t\t\t}\n\t\t\t\tbuckets_ar.push(b);\n\t\t\t}\n\t\t\tbuckets_ar.sort(function (a, b) {\n\t\t\t\treturn a.from - b.from;\n\t\t\t});\n\t\t\tdata.buckets_dict = data.buckets;\n\t\t\tdata.buckets = buckets_ar;\n\t\t}\n\t\tfunction do_one_pie(main, sub, histogram) {\n\t\t\tvar histo_copy = $.extend({}, histogram)\n\t\t\t_buckets_to_arrays(histo_copy);\n\t\t\tif(!histo_copy.doc_count || !histo_copy.buckets || !histo_copy.buckets.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar subtitle_html = (sub ? html_tag(\"div\", \"subtitle\", capitalize(sub)) : \"\");\n\t\t\tvar title_html = html_tag(\"div\", \"pietitle\", main + subtitle_html);\n\t\t\tvar $pie = $(\"
\").append(title_html);\n\t\t\t$obj.append($pie)\n\t\t\tsetup_pie_chart(sub ? 1 : 0, title_html,\n\t\t\t\thisto_copy, $pie, null, null);\n\t\t}\n\t\tif(has.outcomes) {\n\t\t\tmain_data.buckets.forEach(function (b) {\n\t\t\t\tdo_one_pie(main_agg_info.name, b.key, b.histogram);\n\t\t\t});\n\t\t\t((compare_data || {}).buckets || []).forEach(function (b) {\n\t\t\t\tdo_one_pie(compare_agg_info.name, b.key, b.histogram);\n\t\t\t});\n\t\t} else {\n\t\t\tdo_one_pie(main_agg_info.name, null, main_data);\n\t\t\tif(compare_agg_info) {\n\t\t\t\tdo_one_pie(compare_agg_info.name, null, compare_data);\n\t\t\t}\n\t\t}\n\t\t$obj.append(html_tag(\"p\", \"warning\", \"These pie charts are an \" +\n\t\t\t\"experimental preview showing timing divided into common \" +\n\t\t\t\"cumulative buckets, i.e., the week slice is really 2-7 days, the \" +\n\t\t\t\"month slice is 8 to 30 days, etc. Additional visualizations are coming soon.\"));\n\t\treturn;\n\t}\n\tvar histogram_bucket_interval_days = parseInt(viewargs.interval_days || 10);\n\tvar main_histo_buckets = [main_data];\n\tif(has.outcomes) {\n\t\tmain_histo_buckets = (main_data.buckets || []).map(function _to_histo_bucket(b) {\n\t\t\tif(!b || !b.histogram || !b.histogram.buckets){\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tb.className = b.key.replaceAll(/[\\s/]+/ig, \"_\")\n\t\t\tb.buckets = b.histogram.buckets\n\t\t\tb.doc_count = b.histogram.doc_count;\n\t\t\treturn b;\n\t\t}).filter(function (b) { return b; });\n\t}\n\t_process_and_render_histogram(agg_name, obj_id, agg_info.is_parser,\n\t\t\tfunction _get_histo_data() {\n\t\t\t\treturn main_histo_buckets;\n\t\t\t},\n\t\t\tobj_id + \"_\" + main_agg_info.key,\n\t\t\tmain_agg_info.name,\n\t\t\tfunction _legend_name(idx) {\n\t\t\t\tif(has.outcomes) {\n\t\t\t\t\treturn main_agg_info.name + \": \" + capitalize(main_histo_buckets[idx].key);\n\t\t\t\t}\n\t\t\t\treturn idx == 0 ? main_agg_info.name:\n\t\t\t\t\tidx > 0 && compare_agg_info ? compare_agg_info.name:\n\t\t\t\t\t\t\"Extra Data\";\n\t\t\t},\n\t\t\tmain_agg_info.name,\n\t\t\t\"day\",\n\t\t\tp_identifier,\n\t\t\tmain_agg_info.q_filter,\n\t\t\thistogram_bucket_interval_days,\n\t\t\tcompare_data,\n\t\t\tcompare_agg_info && compare_agg_info.name,\n\t\t\tfunction _main_value_func(y) {\n\t\t\t\t// Sometimes we get floats.\n\t\t\t\treturn \"Occurred \" + plural_n(parseInt(y), \"time\") + \".\";\n\t\t\t}\n\t\t);\n}\n\n/**\n * Deprecated, will be removed in favor of render_event_counts_viewargs\n */\nfunction render_event_success_viewargs(identifier_dict, was_synchronous, obj_id, agg_info, agg_name, agg) {\n var viewargs = get_viewargs_obj();\n const p_identifier = viewargs.event_identifier;\n const p_type = viewargs.event_type;\n function type_to_title(p_type) {\n return capitalize(p_type);\n }\n\n parser_stats_utils.update_agg_info(agg_info, p_identifier, p_identifier);\n var has = {};\n has.unknown_outcomes = viewargs.unknown_outcomes == undefined;\n\n var check_options= [];\n check_options.push([\"Show Unknown Outcomes\", has.unknown_outcomes,\n \"unknown_outcomes\", null, unknown_outcome_tip()]);\n\n\t// Get the info on the given event key.\n\tvar p_info = identifier_dict[p_identifier];\n\tif(!p_info) {\n\t\thandle_error(p_identifier ?\n\t\t\t\"Unknown identifier: \" + p_identifier : \"Identifier is required.\");\n\t\treturn;\n\t}\n\tvar $obj = $(\"#\" + obj_id);\n\tvar $dropdown = parser_stats_utils.drop_down(p_identifier, identifier_dict);\n\tvar $identifier_tip = parser_stats_utils.identifier_tip(identifier_dict[p_identifier]);\n\tvar $other_links = parser_stats_utils.other_links(p_identifier);\n\tvar $outcome_options = get_checkbox_viewargs_row(\n\t\tcheck_options, obj_id).addClass(\"outcome_option\");\n\tvar $options = $(wrap_html(\"\", \"div\", \"options\")).append($other_links).append($dropdown);\n\n\t$obj.find(\".graph_title\")\n\t\t.addClass(\"no_suggest\")\n\t\t.addClass(\"no_export\")\n\t\t// Update the title.\n\t\t.find(\".name\").text(p_info.name).end()\n\t\t.append($options)\n\t\t.append($identifier_tip);\n\n\tupdate_dict(agg_info, {\n\t\tname : p_info.name,\n\t});\n\n\trender_event_success(obj_id, agg_info, agg_name, agg, 0, true);\n\n\tvar u_id = uniqueid();\n\t$obj.append(wrap_html(\"\", \"div\", \"outcome_analysis\", {}, {id:u_id}))\n\t$obj.find(\".outcome_analysis\").append($outcome_options);\n\trender_event_success(u_id, agg_info, agg_name, agg, 0, true, \"Outcome\")\n\n\tvar compare_agg = null;\n\tvar days_to_name = p_info.name;\n\tvar HISTOGRAM_DATE_BUCKET_DAYS = 10;\n\t_process_and_render_histogram(agg_name, obj_id, agg_info.is_parser,\n\t\tfunction _get_data() {\n\t\t\tvar buckets = agg.Days_from_Filing.buckets || [];\n\t\t\treturn buckets.map(function (b) {\n\t\t\t\treturn {\n\t\t\t\t\tkey : b.key,\n\t\t\t\t\tclassName : b.key,\n\t\t\t\t\tdoc_count : b.doc_count,\n\t\t\t\t\tbuckets : b.days.buckets,\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tobj_id + \"_Days_Histogram\",\n\t\t\"Time to \" + days_to_name,\n\t\tfunction _legend_name(idx) {\n\t\t\tvar p_type = agg.Days_from_Filing.buckets[idx].key;\n\t\t\treturn \"Days to \" + type_to_title(p_type);\n\t\t},\n\t\t\"Days from \" + agg_info.days_from_name + \" to \" + days_to_name +\n\t\t(compare_agg ? added_name : \"\"),\n\t\t\"day\",\n\t\tagg_info.click_type,\n\t\t\"days\",\n\t\tHISTOGRAM_DATE_BUCKET_DAYS,\n\t\tcompare_agg ? compare_agg.Days_from_Filing : null,\n\t\tcompare_agg ? (\"Days to \" + days_to_name +\n\t\t\tadded_compare_name) : null\n\t);\n\tvar other_histos = ['Days_to_Decision', 'Days_for_Sequence', 'Days_for_Briefing'];\n\tvar other_histo_info = {\n\t\tDays_to_Decision : {\n\t\t\tq_filter : \"days_decision\"\n\t\t},\n\t\tDays_for_Sequence : {\n\t\t\tq_filter : \"days_sequence\"\n\t\t},\n\t\tDays_for_Briefing : {\n\t\t\tq_filter : \"days_briefing\"\n\t\t}\n\t}\n\tother_histos.forEach(function(name) {\n\t\tvar days_agg = agg[name];\n\t\tif(!days_agg || !days_agg.buckets) {\n\t\t\treturn;\n\t\t}\n\t\tvar name_human = name.replaceAll(\"_\", \" \");\n\t\tvar info = other_histo_info[name];\n\t\t_process_and_render_histogram(agg_name, obj_id, agg_info.is_parser,\n\t\t\tdays_agg,\n\t\t\tobj_id + \"_\" + name,\n\t\t\tname_human,\n\t\t\tfunction _legend_name(idx) {\n\t\t\t\treturn name_human;\n\t\t\t},\n\t\t\tname_human,\n\t\t\t\"day\",\n\t\t\tp_identifier,\n\t\t\tinfo.q_filter,\n\t\t\tHISTOGRAM_DATE_BUCKET_DAYS,\n\t\t\tcompare_agg ? compare_agg[name] : null,\n\t\t\tcompare_agg ? (name_human + added_compare_name) : null\n\t\t);\n\t});\n}\n\n/**\n * Given information on pleading tag, generate a search URL.\n * @param identifier_info\n * @param type\n * @param outcome\n * @param date_gte\n * @param date_lte\n * @returns {string}\n */\nfunction get_parser_query(identifier_info, type, outcome, date_gte, date_lte) {\n\tvar identifier = identifier_info && identifier_info.identifier;\n\tvar tag_info = new PleadingTagInfo(type, identifier, identifier_info, null, outcome)\n\tvar info = tag_info.to_query_info({date_gte: date_gte, date_lte: date_lte});\n\n\tvar cur = deparam_url();\n\tif(cur.v) {\n\t\tdelete cur.v;\n\t}\n\tif(cur.views) {\n\t\tdelete cur.views;\n\t}\n\tfunction prep_field_array(d, k) {\n\t\tif(!d[k]) {\n\t\t\td[k] = [];\n\t\t} else if (typeof d[k] == 'string') {\n\t\t\td[k] = [d[k]];\n\t\t}\n\t}\n\tprep_field_array(cur, 'f');\n\tcur.f.push(\"q_pleading_tag-\" + info.query);\n\tcur.fname_q_pleading_tag = info.name;\n\tvar url = DOCKET_SEARCH_URL(cur);\n\t// Don't do docket only.\n\turl = url.replace(\"/dockets/\", \"/\");\n\treturn url;\n}\n\n/**\n * DEPRECATED Function, use get_parser_query, which returns nicer titles.\n */\nfunction get_event_query(is_parser, type, identifier, outcome, date_min, date_max) {\n var base_filter = is_parser ? \"parser_obj\": \"event\";\n var type_q = type ? \"type:'\" + type + \"' \" : \"\";\n var ident_q = identifier ? \"identifier:'\" + identifier + \"' \" : \"\";\n var outcome_unknown = outcome == 'unknown';\n var outcome_q = outcome_unknown ? \"not outcome:'' \":\n outcome ? \"outcome_exact:'\" + outcome + \"' \" : \"\";\n\n function fix_d(d) {\n return d && typeof d == 'number'?\n $.datepicker.formatDate('m/d/yy', new Date(d)): d;\n }\n var startd = date_min ? ' date:(from:' + fix_d(date_min) + \")\":\"\";\n var endd = date_max ? ' date:(to:' + fix_d(date_max) + \")\":\"\";\n\n return base_filter + \":(\" + type_q + outcome_q + ident_q + startd + endd + \")\"\n}\n\n/**\n * Create a histogram that can accept different outcomes.\n * @param $obj\n * @param date_agg\n * @param agg_name\n * @param agg_info\n * @param no_outcomes\n * @param get_url Function that takes in the element, the x pos, and the next x pos.\n */\nfunction render_event_success_histogram($obj, date_agg, agg_name, agg_info, no_outcomes, get_url, q_base_filter) {\n\t// Show the main chart over time.\n\tvar new_id = uniqueid() + \"_Histogram\";\n\tvar viewargs = get_viewargs_obj();\n\t// Don't automatically assume the interval monthly. It's a default.\n\tvar interval = (viewargs && viewargs.interval) || null;\n\tvar date_color_key = agg_info.date_color_key || null;\n\tvar interval_cap = interval ? capitalize(interval) + \" to \" +\n\t\tcapitalize(interval): \"Date\";\n\t$obj.append(\n\t\t\"

\" + interval_cap + \" Histogram

\" +\n\t\t\"
\");\n\tvar $histogram = $obj.find(\".histogram\");\n\n\t// click_type must be defined for the onClick method\n\tvar onClick = null, q_key = '';\n\tif(get_url && (agg_info.click_type || agg_info.click_identifier)) {\n\t\tonClick = function _onClick(d, nextd, i, el) {\n\t\t\treturn get_url(el, d.x, nextd ? nextd.x : null);\n\t\t}\n\t\tq_key = \"q_date_\" +\n\t\t\t(agg_info.click_type ? \"_\" + agg_info.click_type.replaceAll(\" \", \"_\") : \"\") +\n\t\t\t(agg_info.click_identifier ? \"_\" + agg_info.click_identifier.replaceAll(\" \", \"_\") : \"\");\n\t}\n\t// Add the ability to remove date filters, if there are any.\n\tfunction remove_old_filter(frag_obj) {\n\t\tif (!frag_obj.f) {\n\t\t\tfrag_obj.f = [];\n\t\t} else if (!Array.isArray(frag_obj.f)) {\n\t\t\tfrag_obj.f = [frag_obj.f];\n\t\t}\n\t\tvar orig_len = frag_obj.f.length;\n\t\t// Remove the old facet filters.\n\t\tfrag_obj.f = frag_obj.f.filter(function (f) {\n\t\t\treturn f.split(\"-\")[0] != q_key;\n\t\t});\n\t\t// Remove the old facet filter name.\n\t\tif (frag_obj[\"fname_\" + q_key]) {\n\t\t\tdelete frag_obj[\"fname_\" + q_key]\n\t\t}\n\t\treturn frag_obj.f.length < orig_len;\n\t}\n\tvar xAxis;\n\tif(no_outcomes) {\n\t\t// There are no substantive outcomes for this aggregation.\n\t\tvar data_series = [{\n\t\t\t// color: 'steelblue',\n\t\t\tclassName : 'series_1',\n\t\t\tname: agg_info.name,\n\t\t\tdata : (date_agg.buckets || []).map(function(b) {\n\t\t\t\treturn { x : b.key/1000, y : b.doc_count };\n\t\t\t})\n\t\t}];\n\t\t// Instead of displaying stacked time series, display a normal one.\n\t\t$histogram.addClass(\"datehistogram\").append(\"
\");\n\t\txAxis = _render_time_series(0, new_id, data_series, onClick, interval);\n\t} else {\n\t\t// Display a stacked histogram that shows all of the different outocmes.\n\t\tvar has_legend = date_agg.buckets && date_agg.buckets.length > 0 && agg_info.is_parser;\n\t\txAxis = render_stacked_date_histogram(0, agg_name, date_agg, new_id, onClick, interval, date_color_key, has_legend);\n\t\tfunction on_slider_changed(val_min, val_max) {\n\t\t\tvar frag_obj = url_params_to_object(get_url_hash());\n\t\t\tvar click_type = agg_info.click_type;\n\t\t\tvar click_identifier = agg_info.click_identifier\n\t\t\t// Make sure the facet filters are properly setup.\n\t\t\tvar had_filter = remove_old_filter(frag_obj);\n\t\t\tvar q_sl_key = 'q_slider' + (click_type ? \"_\" + click_type:\"\");\n\t\t\tvar qfilter = q_sl_key + \"-\" + q_base_filter + \":(\" +\n\t\t\t\t(click_type ? \"type:'\" + click_type + \"'\" : \"\") +\n\t\t\t\t(click_identifier ? \"identifier:'\" + click_identifier + \"'\":\"\") +\n\t\t\t\t\" date:(\";\n\t\t\tvar qfilter_name = agg_info.name + \":\";\n\t\t\tvar domain = xAxis.graph.dataDomain();\n\t\t\tif (val_min && (had_filter || val_min != domain[0])) {\n\t\t\t\tvar d = new Date(val_min);\n\t\t\t\tqfilter += \" from:\" + $.datepicker.formatDate('m/d/yy', d);\n\t\t\t\tqfilter_name += \" From \" + $.datepicker.formatDate('M d, yy', d);\n\t\t\t}\n\t\t\tif (val_max && (had_filter || val_max != domain[1])) {\n\t\t\t\tvar d = new Date(val_max);\n\t\t\t\tqfilter += \" to:\" + $.datepicker.formatDate('m/d/yy', d);\n\t\t\t\tqfilter_name += \" To \" + $.datepicker.formatDate('M d, yy', d);\n\t\t\t}\n\t\t\tqfilter += \"))\";\n\t\t\tif (val_min || val_max) {\n\t\t\t\tfrag_obj.f.push(qfilter);\n\t\t\t\tfrag_obj['fname_' + q_sl_key] = qfilter_name;\n\t\t\t}\n\t\t\tvar new_hash = \"#\" + param_query(frag_obj);\n\t\t\tif (window.location.hash != new_hash) {\n\t\t\t\twindow.location.hash = new_hash;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\t// Add the slider below.\n\t\tadd_jqueryui_slider_to_graph(new_id, xAxis, null, null, on_slider_changed);\n\t}\n\t// Add the interval changer.\n\tadd_date_gap_changer(new_id, xAxis);\n\tif(remove_old_filter(url_params_to_object(get_url_hash()))) {\n\t\t$histogram.find(\".clear_date\").show();\n\t}\n}\n\n/**\n * Intended for showing whether an event was successful or not.\n * The agg_info structure must specify the following:\n *\tclaims_grant_name\n *\tdays_from_name\n *\tdays_to_name\n *\tget_stat\n *\tget_stat_filtered\n * click_searches_dockets Whether clicking on the histograms does a search\n *\t\t\t\t\tfor the corresponding documents or the dockets.\n */\nfunction render_event_success(obj_id, agg_info, agg_name, agg, pie_lev,\n\t\tomit_histograms, date_agg_key) {\n\tvar $obj = $(\"#\" + obj_id).addClass(\"eventsuccess\");\n\t// The Main Date Histogram Aggregation\n\tvar date_agg = agg[date_agg_key || 'Date_Histogram'];\n\t// Protect against no data\n\tif(!date_agg || !date_agg.buckets) {\n\t\tdate_agg = {buckets:[]};\n\t}\n\tvar q_base_filter = agg_info.is_parser ? \"parser_obj\": \"event\";\n\tvar HISTOGRAM_INTERVAL_TIMING = 10;\n\tvar HISTOGRAM_INTERVAL_CLAIMS = 2;\n\n\ttransform_agg(date_agg, agg_info.filter, agg_info.map, agg_info.map_name,\n\t\tagg_info.map_className, agg_info.sort_series);\n\n\tvar cumlative = {};\n\tvar cum_len = 0;\n\tfor(var i in date_agg.buckets) {\n\t\tvar subagg = _get_sub_agg_from_bucket(date_agg.buckets[i]);\n\t\tif(subagg) {\n\t\t cumlative[date_agg.buckets[i].key] = get_totals_and_before(subagg);\n\t\t cum_len += 1;\n }\n\t}\n\t// Figure out if there are no substantive outcomes. If so, hide the summary.\n\tvar no_outcomes = !cum_len || (\n\t // I am not sure what this old logic is from.\n\t date_agg.buckets.length == 1 && date_agg.buckets[0].key === \"\");\n\t// Create new cumulative aggregations.\n\tvar agg_before = {\n\t\tname \t\t: 'Trailing Three Months',\n\t\tbuckets \t: [] ,\n\t\tdoc_count \t: 0\n\t};\n\tvar agg_total = {\n\t\tname \t\t: 'Total',\n\t\tbuckets \t: [],\n\t\tdoc_count \t: 0\n\t};\n\tfor(var k in cumlative) {\n\t\t// Get the name\n\t\tvar n = agg_info.map_name({key : k });\n\t\tvar sn = agg_info.map_short_name({key : k });\n\t\tvar className = agg_info.map_className ?\n\t\t\t\t\tagg_info.map_className({key : k }) : null;\n\t\t// Add the key\n\t\tagg_total.buckets.push({ key : n, doc_count : cumlative[k].total,\n\t\t\t\t\t\t\t\tshort_name : sn, className : className });\n\t\tagg_before.buckets.push({key : n, doc_count : cumlative[k].totalbefore,\n\t\t\t\t\t\t\t\tshort_name : sn, className : className });\n\t\t// Add to the total\n\t\tagg_total.doc_count += cumlative[k].total;\n\t\tagg_before.doc_count += cumlative[k].totalbefore;\n\t}\n\n\t// Two pie charts, one for total success, and one for trailing.\n\tvar agg_total_name \t= agg_name + \"_Total\";\n\tvar agg_before_name = agg_name + \"_Before\";\n\n\t// I hate rendering html in JS, but it'll do for now.\n\t$obj.append(\n\t\t\"
\" +\n\t\t\"
\" +\n\t\t\t\"

For All Time

\" +\n\t\t\t\"

\" +\n\t\t\t\"
\" +\n\t\t\"
\" +\n\t\t\t\"

Last Three Months

\" +\n\t\t\t\"

\" +\n\t\t\t\"
\" +\n\t\t\"
\");\n\t// Hide the summary if there's nothing substantive to show.\n\tif(no_outcomes) {\n\t $obj.find(\".eventsummary\").hide();\n }\n\t// Show a single statistic in each of the two areas.\n\tif(agg_info.get_stat) {\n\t\tif(agg_total.doc_count > 0) {\n\t\t\t// Show the statistic for the total\n\t\t\tvar stat_total \t= agg_info.get_stat(agg_total);\n\t\t\t$obj.find(\".total.subgroup\")\n\t\t\t\t\t.find(\".stat\").text(agg_total.doc_count > 0 ? stat_total.stat : \"No Filings\").end()\n\t\t\t\t\t.find(\"p\").text(stat_total.p).end()\n\t\t\t\t.end();\n\t\t} else {\n\t\t\t// Handle no data cases gracefully.\n\t\t\t$obj.find(\".total.subgroup\").addClass(\"no_filings\")\n\t\t\t\t\t.find(\".stat\").html(_render_no_cases()).end()\n\t\t\t\t\t.find(\"p\").text(\"\").end();\n\t\t}\n\t\tif(agg_before.doc_count > 0) {\n\t\t\t// Show the \"before\" statistic\n\t\t\tvar stat_before = agg_info.get_stat(agg_before);\n\t\t\t$obj.find(\".before.subgroup\")\n\t\t\t\t\t.find(\".stat\").text(stat_before.stat).end()\n\t\t\t\t\t.find(\"p\").text(stat_before.p).end();\n\t\t} else {\n\t\t\t// Handle no data cases gracefully.\n\t\t\t$obj.find(\".before.subgroup\").addClass(\"no_filings\")\n\t\t\t\t\t.find(\".stat\").html(_render_no_cases()).end()\n\t\t\t\t\t.find(\"p\").text(\"\").end();\n\t\t}\n\t}\n\tfunction getURL(el, startd, endd) {\n\t\t// Figure out which outcome this element is.\n\t\tvar click_type = agg_info.click_type;\n\t\tvar click_identifier = agg_info.click_identifier;\n\n\t\tvar outcome = null;\n\t\tvar outcome_name = null;\n\t\tvar classList = getClassList(el);\n\t\tfor (var cls_i = 0; cls_i < classList.length; cls_i++) {\n\t\t\tvar c = classList[cls_i];\n\t\t\tif(granted_test(c) || denied_test(c)) {\n // Convert from class to search outcome.\n outcome = c.replaceAll(\"_\", \" \");\n outcome_name = capitalize(outcome).replaceAll(\" And \", \" and \");\n break;\n } else if (agg_info.is_parser && c == \"unknown\") {\n\t\t\t outcome = c;\n\t\t\t outcome_name = capitalize(c);\n\t\t\t // If they are looking for unknown outcomes, then they're looking for orders.\n\t\t\t if(!click_type) {\n\t\t\t click_type = 'order';\n }\n\t\t\t} else if (is_parser_type(c) && agg_info.is_parser && !click_type) {\n\t\t\t click_type = c;\n\t\t\t} else if (c == \"\") {\n\t\t\t // This happens for events without an outcome.\n\t\t\t outcome_name = agg_info.name;\n\t\t\t break;\n }\n\t\t}\n\n\t\tvar base = deparam_url();\n\n\t\tvar date_search = '', date_search_nice = '';\n\t\t// If we're searching documents, we can set the date filter.\n\t\tif(!agg_info.click_searches_dockets) {\n\t\t\t// Set the low date limit.\n\t\t\tbase.date_filed_start = startd ? startd/1000 : null;\n\t\t\tif(!base.date_filed_start) delete base.date_filed_start;\n\t\t\t// Set a high date limit if we have one.\n\t\t\tbase.date_filed_end = endd ? endd/1000 : null;\n\t\t\tif(!base.date_filed_end) delete base.date_filed_end;\n\t\t} else if (startd || endd) {\n\t\t\t// We must do the date search within the query.\n\t\t\tdate_search = \"date:[\" +\n\t\t\t\t(startd ? startd : \"\") + \",\" +\n\t\t\t\t(endd ? endd-1 : \"\") + \"]\";\n\t\t\tdate_search_nice =\n\t\t\t\t(startd ? \", from \" + niceDate(startd) : \"\") +\n\t\t\t\t(endd ? \" to \" + niceDate(endd - 1) : \"\")\n\t\t}\n\n\t\t// Add the real query filter.\n\t\tif(!base.f) {\n\t\t\tbase.f = [];\n\t\t} else if (!Array.isArray(base.f)) {\n\t\t\tbase.f = [base.f];\n\t\t}\n\t\tfunction get_filter_info(outcome) {\n\t\t // Create the search filter.\n var query = get_event_query(agg_info.is_parser, click_type, click_identifier, outcome, startd, endd);\n\t\t var q_name = \"q_pie\";\n\t\t return {\n\t\t f : q_name + \"-\" + query,\n name : q_name,\n title : (click_type ? capitalize(click_type) + \": \" : \"\") +\n (outcome_name ? outcome_name + \" \" : \"\") +\n (click_identifier ? capitalize(click_identifier) + \" \" : \"\") +\n (date_search_nice.length ? \": \" + date_search_nice : \"\")\n }\n }\n\t\tvar f_info = get_filter_info(outcome);\n base.f.push(f_info.f);\n base['fname_' + f_info.name] = f_info.title;\n\n\t\t// Turn it back into a query url.\n\t\treturn (agg_info.click_searches_dockets ?\n\t\t\tDOCKET_SEARCH_URL : DOCUMENT_SEARCH_URL)(base);\n\t}\n\n\t// Draw pie charts showing cumulative data.\n\tpie_lev = pie_lev || 2;\n\tfunction getOnClickPieFunc(before) {\n\t\treturn function (d, i, el) {\n\t\t\tvar start_time = null;\n\t\t\tif(before) {\n\t\t\t\t// Not a real loop, just used to get the first item.\n\t\t\t\tfor(var k in cumlative) {\n\t\t\t\t\tstart_time = cumlative[k].monthsbefore.getTime();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn getURL(el, start_time, null);\n\t\t}\n\t}\n\tvar total_selector = \"#\" + obj_id + \" #\" + agg_total_name;\n\tvar before_selector = \"#\" + obj_id + \" #\" + agg_before_name;\n\tsetup_pie_chart(pie_lev, agg_total_name, agg_total, total_selector,\n\t\t\t\t\t\t\t\t\t\t\tnull, getOnClickPieFunc(false));\n\tsetup_pie_chart(pie_lev, agg_before_name, agg_before, before_selector,\n\t\t\t\t\t\t\t\t\t\t\tnull, getOnClickPieFunc(true));\n\n\tif(date_agg.buckets.length) {\n\t\trender_event_success_histogram($obj, date_agg, agg_name, agg_info, no_outcomes, getURL, agg_info.is_parser ? \"parser_obj\": \"event\");\n\t}\n\n\t// The function that renders the two histograms.\n\tthis.render_histograms = function(compare_agg,\n\t\t\tadded_name, added_compare_name) {\n\t\t// The two other aggregation.\n\t\t_process_and_render_histogram(agg_name, obj_id, agg_info.is_parser,\n\t\t\tagg.Number_of_Claims_Granted,\n\t\t\tobj_id + \"_Claims_Histogram\",\n\t\t\t\"Histogram of \" + agg_info.claims_grant_name,\n\t\t\t\"Number of \" + agg_info.claims_grant_name +\n\t\t\t\t(compare_agg ? added_name : \"\"),\n\t\t\tagg_info.claims_grant_name + (compare_agg ? added_name : \"\"),\n\t\t\t\" claims\", agg_info.click_type, \"claims_num_grant\",\n\t\t\tHISTOGRAM_INTERVAL_CLAIMS,\n\t\t\tcompare_agg ? compare_agg.Number_of_Claims_Granted : null,\n\t\t\tcompare_agg ? (\"Number of \" + agg_info.claims_grant_name +\n\t\t\t\tadded_compare_name) : null\n\t\t);\n\t\t_process_and_render_histogram(agg_name, obj_id, agg_info.is_parser,\n\t\t\tagg.Days_from_Filing,\n\t\t\tobj_id + \"_Days_Histogram\",\n\t\t\t\"Time to \" + agg_info.days_to_name,\n\t\t\t\"Days to \" + agg_info.days_to_name + (compare_agg ? added_name : \"\"),\n\t\t\t\"Days from \" + agg_info.days_from_name + \" to \" + agg_info.days_to_name +\n\t\t\t\t(compare_agg ? added_name : \"\"),\n\t\t\t\"day\", agg_info.click_type, \"days\", HISTOGRAM_INTERVAL_TIMING,\n\t\t\tcompare_agg ? compare_agg.Days_from_Filing : null,\n\t\t\tcompare_agg ? (\"Days to \" + agg_info.days_to_name +\n\t\t\t\tadded_compare_name) : null\n\t\t);\n\t};\n\n\t// Render the histograms immediately unless we're told otherwise.\n\tif(!omit_histograms) {\n\t\tthis.render_histograms();\n\t}\n}\n\n/**\n * Much like the above rendered, but this one handles filtered data and compares\n * it to cumulative data.\n */\nfunction render_filtered_event_success(obj_id, agg_info, agg_name, agg,\n\t\tfiltered_name, filtered_agg) {\n\t// The goal is compare the filtered data against the unfiltered data to\n\t// determine if the event is more or less likely. First we calculate data.\n\tif(!agg_info.get_stat_filtered) {\n\t\tthrow \"Expecting this aggregation to have a statistic.\";\n\t}\n\n\t// The Main Date Histogram Aggregation\n\tvar date_agg = agg['Date_Histogram'];\n\tvar filtered_date_agg = filtered_agg['Date_Histogram'];\n\t// Caution against these being null\n\tif(!date_agg || !date_agg.buckets) {\n\t\tdate_agg = {buckets:[]};\n\t}\n\tif(!filtered_date_agg || !filtered_date_agg.buckets) {\n\t\tfiltered_date_agg = {buckets : []};\n\t}\n\n\t// Get totals for the aggregations\n\tvar cum_agg = {};\n\tvar cum_filt = {};\n\tfor(var i in date_agg.buckets) {\n\t\tvar subagg = _get_sub_agg_from_bucket(date_agg.buckets[i]);\n\t\tif(subagg) {\n\t\t cum_agg[date_agg.buckets[i].key] = get_totals_and_before(subagg);\n }\n\t}\n\tfor(i in filtered_date_agg.buckets) {\n\t\tvar subagg = _get_sub_agg_from_bucket(filtered_date_agg.buckets[i]);\n\t\tif(subagg) {\n\t\t cum_filt[filtered_date_agg.buckets[i].key] = get_totals_and_before(subagg);\n }\n\t}\n\n\t// Convert the cumulative and filtered cumulative data into aggregations.\n\tvar cum_agg_total = {\n\t\tname \t\t: 'Cumulative',\n\t\tbuckets \t: [] ,\n\t\tdoc_count \t: 0\n\t};\n\tvar cum_agg_filtered = {\n\t\tname \t\t: 'Filtered',\n\t\tbuckets \t: [],\n\t\tdoc_count \t: 0\n\t};\n\tfor(var k in cum_agg) {\n\t\t// Get the name\n\t\tvar n \t= agg_info.map_name({key : k });\n\t\tvar sn \t= agg_info.map_short_name({key : k });\n\t\tvar className = agg_info.map_className ?\n\t\t\t\t\tagg_info.map_className({key : k }) : null;\n\t\tvar cum_filt_total = cum_filt[k] ? cum_filt[k].total : 0;\n\n\t\t// Add the key\n\t\tcum_agg_total.buckets.push({ key : n, doc_count : cum_agg[k].total,\n\t\t\t\t\t\t\t\tshort_name : sn, className : className });\n\t\tcum_agg_filtered.buckets.push({key : n, doc_count : cum_filt_total,\n\t\t\t\t\t\t\t\tshort_name : sn, className : className });\n\t\t// Add to the total\n\t\tcum_agg_total.doc_count \t+= cum_agg[k].total;\n\t\tcum_agg_filtered.doc_count \t+= cum_filt_total;\n\t}\n\tfunction format_perc(stat) {\n\t\treturn (100*stat).toFixed(1) + \"%\";\n\t}\n\n\t// Show a single statistic in each of the two areas.\n\tvar stat_total \t= agg_info.get_stat_filtered(cum_agg_total);\n\tvar stat_filtered = agg_info.get_stat_filtered(cum_agg_filtered);\n\tif(stat_total.stat < 0 || stat_total.stat > 1)\n\t\tthrow \"Expecting total statistic to be between 0 and 1\";\n\tif(stat_filtered.stat < 0 || stat_filtered.stat > 1)\n\t\tthrow \"Expecting total statistic to be between 0 and 1\";\n\n\t// How much more likely is one percentage than the other.\n\tvar likely = stat_total.stat ? stat_filtered.stat / stat_total.stat : 1;\n\t// This is the odds ratio, but it can be confusing:\n\t// likely = stat_filtered.stat / (1-stat_filtered.stat) /\n\t//\t\t\t( stat_total.stat / (1-stat_total.stat) );\n\n\tvar more = 1;\n\tvar threshold = .01;\n\tif(likely < 1) {\n\t\t// It is less likely, convert.\n\t\tlikely = 1/likely;\n\t\tmore = -1;\n\t}\n\t// Subtract 1, because that means they are no more or less likely.\n\tlikely -= 1.0;\n\t// Convert the percentage to degrees\n\tvar degs = more*90 * (1 - Math.exp(-1 * likely * 4));\n\tdegs += 90; // 90 is the middle.\n\tdegs = degs.toFixed(0);\n\t// Build a user-friendly text string regarding how likely they are.\n\tvar likely_txt = stat_filtered.stat == null ? \"\":\n\t\t\tlikely < threshold ? \"not\":\n\t\t\t// If very large, then use English\n\t\t\tlikely > 20 ? \"much\":\n\t\t\t// Use multipliers if greater than 1. We have to add the 1 back in.\n\t\t\tlikely > 1 ? (1.0 + likely).toFixed(1).toString() + \"x\":\n\t\t\t// User percentages if less than 1\n\t\t\t(likely * 100).toFixed(0).toString() + \"%\";\n\n\t// Only say it's more/less likely if we show a figure.\n\tvar more_txt = stat_filtered.stat == null ? \"more or less likely\" :\n\t\tmore < 0 && likely > threshold ? \"less likely\" : \"more likely\";\n\tvar add_period = \"\";\n\tif(filtered_name && filtered_name.length) {\n\t\tmore_txt = stat_filtered.stat == null ?\n\t\t\t\"Cannot form a statistic on whether \" + filtered_name + \" is \" +\n\t\t\tlikely_txt + \" \" + more_txt:\n\t\t\t\"Compared to the average, \" + filtered_name + \" is \" +\n\t\t\tlikely_txt + \" \" + more_txt;\n\t\t// This is now a complete sentence, so add a period.\n\t\tadd_period = \".\";\n\t}\n\n\t// Create a confidence score using Normal_approximation_interval.\n\t// See http://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval\n\tfunction get_conf(n, p) {\n\t\tvar z = 1 - .5 * .95; // 95% confidence level\n\t\t// Normal approximation interval\n\t\t// var interval = z * Math.sqrt(1/n * p * (1-p ));\n\t\t// Wilson score interval\n\t\treturn z * Math.sqrt(1/n * p * (1-p ) + z*z/(4*n*n));\n\t}\n\tvar plural_cases = plural(2, case_str).toLowerCase();\n\tvar interval = 1 - (1-get_conf(cum_agg_filtered.doc_count, stat_filtered.stat))*\n\t\t\t\t\t\t(1-get_conf(cum_agg_total.doc_count, stat_total.stat));\n\t// Form the statistic, if possible\n\tvar confidence_txt_maj = stat_filtered.stat == null ?\n\t\t\"N/A\" : \"±\" + format_perc(interval);\n\tvar confidence_txt_min =\n\t\tstat_filtered.stat == null ?\n\t\t\t\"Too few \" + plural_cases + \" to form a statistic at all\":\n\t\t// Wilson score breaks down with too few samples.\n\t\tinterval*2 >= likely || cum_agg_filtered.doc_count < 10 ?\n\t\t\t\"Too few \" + plural_cases + \" to form a confident statistic\":\n\t\tinterval*1.5 >= likely ?\n\t\t\t\"Too few \" + plural_cases + \" to form a confident statistic\":\n\t\t\t\"Sufficient \" + plural_cases + \" to form a confident statistic\";\n\n\tvar user_agg = agg_info.name || agg_name.replaceAll(\"_\", \" \");\n\n\t// Now start creating the object\n\tvar $obj = $(\"#\" + obj_id).addClass(\"eventsuccess_filtered\");\n\t$obj.append($(\".filtered_event.original\").clone().removeClass(\"original\").show());\n\t$obj\n\t\t// .find(\".title\").text(\"Summary of \" + user_agg + \" for \" + filter_name).end()\n\t\t.find(\".title\").text(\"\").end()\n\t\t// Add a Tool Tip\n\t\t.find(\".perc\").text(likely_txt).powerTip({\n popupClass : 'stats_tip',\n }).data('powertip',\n\t\t\t'
' +\n\t\t\t// Explain the overall statistic.\n\t\t\t(stat_total.stat == null ? \"\" :\n\t\t\t'Overall: ' + format_perc(stat_total.stat) + ' ±' +\n\t\t\t\tformat_perc(get_conf(cum_agg_total.doc_count, stat_total.stat)) +\n\t\t\t\t'
') +\n\t\t\t// Explain the filtered statistic.\n\t\t\tfiltered_name + \": \" + (stat_filtered.stat == null ?\n\t\t\t\t'Cannot form a static':\n\t\t\t\t'' + format_perc(stat_filtered.stat) + ' ±' +\n\t\t\t\t\tformat_perc(get_conf(cum_agg_filtered.doc_count,\n\t\t\t\t\t\tstat_filtered.stat))) +\n\t\t\t'
'\n\t\t\t)\n\t\t\t.end()\n\t\t.find(\".perc_sub\").text(more_txt + \" \" + stat_total.p + add_period).end()\n\n\t\t.find(\".total\").text(cum_agg_filtered.doc_count.toLocaleString()).end()\n\t\t.find(\".total_sub\").text(user_agg.toLowerCase() + \" analyzed\" +\n (filtered_name ? \" for \" + filtered_name : \"\")).end()\n\n\t\t.find(\".conf\").html(confidence_txt_maj).end()\n\t\t.find(\".conf_sub\").text(confidence_txt_min).end()\n\n\t\t.find(\".busy\").text(\"more likely\").end()\n\t\t.find(\".notbusy\").text(\"less likely\").end()\n\n\t\t.find(\".needle\").css(\"transform\", \"rotateZ(\" + degs + \"deg)\");\n\n\tif(stat_filtered.stat == null) {\n\t\t// If there is no statistic, hide these elemen\n\t\t$obj.find(\".needle, .busy, .notbusy, .perc_sub, p.error\").hide().end()\n\t\t\t.find(\"img.gauge\").addClass(\"disabled\");\n\t}\n\t// Render the normal histogram underneath.\n\tvar obj_id_sub = obj_id + \"_filtered\";\n\t$obj.find(\".filtered_event\").append(\"
\");\n\tvar evsuccess = new render_event_success(obj_id_sub, agg_info, agg_name,\n\t\tfiltered_agg, 3, true);\n\tevsuccess.render_histograms(agg, \" for \" + filtered_name, \" Overall\");\n\t// Do DOM jujitsu: move the summary into eventsuccess_filtered\n\t$obj.find(\".eventsummary\").appendTo($obj.find(\".group.right .eventsuccess\"));\n}\n\n/**\n * If we're currently viewing a profile page (party, firm, etc.), return that entity type.\n **/\nfunction get_current_profile_type(base) {\n if(!base) {\n base = deparam_url();\n }\n // Figure out the entity that we're analyzing here.\n var re_base_entity_type = /^([a-z]+)_profile(-|$)/g;\n var entity_type = null;\n if(base.v) {\n entity_type = re_base_entity_type.exec(base.v);\n entity_type = entity_type && entity_type[1]\n }\n if(!entity_type) {\n // Look in the viewarg filters for the any \"_exact\" queries.\n var entities = base.viewargs.map(function( varg){\n var found = /^([a-z]+)_exact-/.exec(varg);\n return found && found[1];\n }).filter(function (varg) { return varg && varg.length; });\n if(entities.length == 1) {\n entity_type = entities[0];\n }\n }\n // If we can't figure it out from the view, then use the query url.\n if(!entity_type) {\n var p_type = $.deparam(window.location.search.slice(1)).profile_type;\n entity_type = p_type && re_base_entity_type.exec(p_type);\n entity_type = entity_type && entity_type[1];\n }\n return entity_type;\n}\n\nfunction render_top_entity_histogram(obj_id, agg_info, agg_name, agg,\n\t\tfiltered_name, filtered_agg) {\n if(!agg || !agg.buckets) {\n return;\n }\n // If true, we are looking for entities that don't represent this entity.\n var non_represent = obj_id.search(\"Nonrepresent\") > -1;\n // Show the main chart over time.\n var new_id = obj_id + \"Entity_Histogram\";\n var $obj = $(\"#\" + obj_id);\n $obj.append(\"
\");\n function getURL(entity, startd, endd) {\n var click_type = agg_info.click_type;\n\t\tvar base = deparam_url();\n\t\tvar viewargs = get_viewargs_obj();\n\t\tvar date_search = '';\n\t\t// If we're searching documents, we can set the date filter.\n if(startd) {\n date_search += \"from:\" + niceDate(startd);\n }\n if(endd) {\n if(date_search.length) {\n date_search += \" \";\n }\n date_search += \"to:\" + niceDate(endd);\n }\n\n var entity_type = get_current_profile_type(base);\n if(entity_type == \"party\") {\n var base_entity_name = viewargs[entity_type] ||\n viewargs[entity_type + \"_exact\"];\n base.f = [];\n if(non_represent) {\n base.f.push(\"q_entity-party:(name:(\" + base_entity_name +\n \") and not firm:(name:(\" + entity + \"))) and firm:(\" + entity + \")\");\n base.fname_q_entity = \"Party \" + base_entity_name +\n \" not represented by \" + entity;\n } else {\n base.f.push(\"q_entity-party:(name:(\" + base_entity_name +\n \") firm:(name:(\" + entity + \")))\");\n base.fname_q_entity = \"Party \" + base_entity_name +\n \" represented by \" + entity;\n }\n } else if (entity_type) {\n console.warn(\"Cannot generate link for type: \" + entity_type);\n } else {\n console.warn(\"Cannot determine entity type\");\n\t\t}\n\t\tif(date_search.length) {\n\t\t base.f.push(\"q_date_range-\" + date_search);\n }\n\t\t// Turn it back into a query url.\n\t\treturn DOCKET_SEARCH_URL(base);\n }\n function onClick(d, nextd, i, el) {\n var re_series = /^series-(\\d+)$/g;\n var match = re_series.exec(el.classList[0]);\n var series_i = parseInt(match[1]);\n var entity = agg.buckets[series_i].key;\n return getURL(entity, d.x, d.x + 3600*24*365*1000 - 1000);\n }\n var series = agg.buckets.map(function (a, idx) {\n var subagg = _get_sub_agg_from_bucket(a);\n a.className = 'series-' + idx.toString();\n return {\n // color: 'steelblue',\n className: a.className,\n name: a.key,\n data: subagg && subagg.buckets ? subagg.buckets.map(function (b) {\n return {x: b.key / 1000, y: b.doc_count};\n }) : []\n };\n });\n function color_key() {\n return \"Set3\";\n }\n var xAxis = render_stacked_date_histogram(0, agg_name, agg, new_id,\n onClick, \"year\", color_key);\n var legend = add_legend_to_graph(xAxis, series);\n // Always put this legend at the bottom\n $(legend.element).addClass(\"below\");\n xAxis.graph.render();\n}\n\n/**\n * Custom Aggregation Renderer for Top Players. Agg Info Options\n * party_types: The types of parties to analyze.\n *\t sub_pane:\tAdditional event information on each party can be obtained.\n *\t\tevent:\t\tThe event name in standard english.\n *\t\tevent_short\tA shorter version of the event name.\n *\t\taggview:\tThe aggregation view to obtain the event from the server.\n *\t\taggkey:\t\tThe aggregation key once it is received.\n */\nfunction render_filtered_top_players(obj_id, agg_info, agg_name, agg,\n\tfiltered_name, filtered_agg) {\n\t////\n\t// Grab the options\n\tvar party_types = agg_info.party_roles;\n\tvar sub_pane = agg_info.sub_pane || {\n\t\tevent : \"Motion for Joinder\",\n\t\tevent_short : \"motion\",\n\t\taggview : null, // This is just an example.\n\t\taggkey : \"Motion_for_Joinder\"\n\t};\n\tvar filing_str = agg_info.filing_str;\n\n\tvar key_to_class = {};\n\tparty_types.forEach(function (e) {\n\t\tkey_to_class[e] = e.toLowerCase().replace(\" \", \"_\");\n\t});\n\tif(filtered_agg) {\n\t\t// Use the filtered data.\n\t\tagg = filtered_agg;\n\t}\n\tvar $obj = $(\"#\" + obj_id).addClass(\"top_players\");\n\t// Remove assignees\n\tfunction filter_party_types(buckets) {\n\t\treturn buckets ? buckets.filter(function (it) {\n\t\t\treturn party_types.indexOf(it.key) != -1;\n\t\t}) : null;\n\t}\n\n\t// Render tables of top parties\n\t$obj.append(\"
\" + party_types.map(function (p) {\n\t\treturn \"
\" +\n\t\t\t\"
\";\n\t\t}).join(\"\") + \"
\" +\n\t\t\"

Law Firms for Top Parties

\" +\n\t\t\"
\" + party_types.map(function (p) {\n\t\t\treturn \"

Representing \" +\n\t\t\t\tplural(2, p) + \"

\";\n\t\t}).join(\"\") + \"
\"\n\t);\n\n\t/**\n\t * A few utility functions to help manipulate URLs\n\t **/\n\tfunction val_to_id(val) {\n\t\t// Convert val into html-friendly id, replace all non alpha-nums.\n\t\treturn val.replaceAll(\" \", \"_\").replace(/[^a-z0-9_]+|\\s+/gmi, \"\");\n\t}\n\tfunction add_party_to_q(cur, party, role) {\n\t\tif(!cur.f) {\n\t\t\tcur.f = [];\n\t\t} else if (!Array.isArray(cur.f)) {\n\t\t\tcur.f = [cur.f];\n\t\t}\n\t\tif(role) {\n\t\t // Needs updating since #2178.\n\t\t console.warn(\"party_w_type_exact not supported\");\n\t\t\tcur.f.push(\"party_w_type_exact-\" + party + \" # \" + role);\n\t\t} else {\n\t\t\tcur.f.push(\"party_exact-\" + party);\n\t\t}\n\t\treturn cur;\n\t}\n\tfunction add_outcome_to_q(cur, event, grant, deny, grantdeny) {\n\t\tif(!cur.f) {\n\t\t\tcur.f = [];\n\t\t} else if (!Array.isArray(cur.f)) {\n\t\t\tcur.f = [cur.f];\n\t\t}\n\t\tvar use_or = ((grant?1:0) + (deny?1:0) + (grantdeny?1:0)) > 1;\n\t\tvar f = (use_or ? \"outcome_exact_or-\": \"outcome_exact-\") + event + \" - \";\n\t\tif (grant) {\n\t\t\tcur.f.push(f + \"Granted\");\n\t\t}\n\t\tif (deny) {\n\t\t\tcur.f.push(f + \"Denied\");\n\t\t}\n\t\tif (grant) {\n\t\t\tcur.f.push(f + \"Granted and Denied\");\n\t\t}\n\t\treturn cur;\n\t}\n\tfunction get_search_party_url(party, role) {\n\t\treturn DOCKET_SEARCH_URL(add_party_to_q(\n\t\t\tdeparam_url(), party, role));\n\t}\n\tfunction get_search_event_url(party, role, event, grant, deny, grantdeny) {\n\t\treturn DOCUMENT_SEARCH_URL(add_party_to_q(\n\t\t\t\tadd_outcome_to_q(deparam_url(), event,\n\t\t\t\tgrant, deny, grantdeny), party, role));\n\t}\n\tfunction plural_events(n) {\n\t\treturn \"\" + plural_n(n, sub_pane.event_short) + \" \" +\n\t\t\tplural_have(n) + \"\";\n\t}\n\n\t/**\n\t * Setup the party information on the right of the screen.\n\t **/\n\tfunction setup_party_info($info, party_name, role,\n\t\t\tparty_info, party_role_info) {\n\t\tif(!party_name) {\n\t\t\t$info.removeClass(\"loading\").html(\"

Party Information

\" +\n\t\t\t\t\"

Click on a party to the left to \" +\n\t\t\t\t\"see their statistics.

\");\n\t\t\treturn;\n\t\t}\n\t\t$info.removeClass(\"loading\").html(\n\t\t\t\"

\" + party_name + \"

\" +\n\t\t\t\"View Full Report\" +\n\t\t\t\"

Party Preference

\" +\n\t\t\t\t\"

\" +\n\t\t\t\"

\" + sub_pane.event + \" Rate

\" +\n\t\t\t\t\"

\" +\n\t\t\t\"

Recent Cases

\" +\n\t\t\t\t\"View All Cases
\");\n\n\t\t// Setup the list of most recent cases.\n\t\tvar lis = \"\";\n\t\tvar results = party_role_info.search_results;\n\t\tfor(var j=0; j < results.length; j++) {\n\t\t\tlis += \"
  • \" +\n\t\t\t\tresults[j].title + \"
  • \";\n\t\t}\n\t\t// Get URL for the full list of info.\n\t\tvar full_url = get_search_party_url(party_name, role);\n\t\tvar $ul = $info.find(\".sec.big\")\n\t\t\t.find(\"h4\").text(\"Recent Cases as \" + role).end()\n\t\t\t.find(\"ul\").append(lis).end()\n\t\t\t.find(\".all_cases\").attr(\"href\", full_url);\n\n\t\tif(party_info) {\n\t\t\t// Get the top party type info.\n\t\t\tvar role_buckets = party_info.aggs.Party_Roles ?\n\t\t\t\tfilter_and_combine_subbuckets(\n\t\t\t\t\tparty_info.aggs.Party_Roles.buckets, party_name) : null;\n\t\t\tif(role_buckets && role_buckets.Party_Roles &&\n\t\t\t\trole_buckets.Party_Roles.buckets) {\n\t\t\t\trole_buckets = filter_party_types(role_buckets.Party_Roles.buckets);\n\t\t\t}\n\n\t\t\t// Figure out their party type preference.\n\t\t\tif (role_buckets && role_buckets.length) {\n\t\t\t\tvar preference = role_buckets[0].key;\n\t\t\t\tvar num_total = sum_doc_counts(role_buckets);\n\t\t\t\tvar percent = 100 * role_buckets[0].doc_count / num_total;\n\t\t\t\tpercent = roundNumber(percent, 1); // Round to one decimal.\n\n\t\t\t\tvar explain = \"\";\n\t\t\t\tif(filtered_name) {\n\t\t\t\t\texplain = \"In cases with \" + filtered_name + \", \" + party_name +\n\t\t\t\t\t\t\" acts as \" + preference + \" \" + percent + \"% of the time.\";\n\t\t\t\t} else {\n\t\t\t\t\texplain = party_name + \" acts as \" + preference + \" in \" +\n\t\t\t\t\t\tpercent + \"% of cases.\";\n\t\t\t\t}\n\n\t\t\t\t// Add a link to the other cases.\n\t\t\t\tif (role_buckets[0].doc_count != num_total && role_buckets.length > 1) {\n\t\t\t\t\tvar other_url = get_search_party_url(party_name, role_buckets[1].key);\n\t\t\t\t\texplain += \" View the \" +\n\t\t\t\t\t\t(num_total - role_buckets[0].doc_count) + \" other cases.\";\n\t\t\t\t}\n\t\t\t\t$info.find(\".preference\")\n\t\t\t\t\t.removeClass(\"loading\")\n\t\t\t\t\t.find(\".val\").text(preference).end()\n\t\t\t\t\t.find(\"p\").html(explain);\n\t\t\t} else {\n\t\t\t\t$info.find(\".preference\")\n\t\t\t\t\t.removeClass(\"loading\")\n\t\t\t\t\t.find(\".val\").text(\"N/A\").end()\n\t\t\t\t\t.find(\"p\").text(\"Not enough data to calculate preferred party role.\");\n\t\t\t}\n\t\t} else {\n\t\t\t// party_info is still loading\n\t\t\t$info.find(\".preference\")\n\t\t\t\t\t.addClass(\"loading\")\n\t\t\t\t\t.find(\"p\").html(\"Additional information on this party is loading.\");\n\t\t}\n\n\t\t// Figure out the institution rate\n\t\tvar inst_buckets = party_role_info.aggs[sub_pane.aggkey] &&\n\t\t\t\t\t\t\t\t\t\t\tparty_role_info.aggs[sub_pane.aggkey].buckets ?\n\t\t\tparty_role_info.aggs[sub_pane.aggkey].buckets : [];\n\t\tif(inst_buckets.length) {\n\t\t\tvar granted = get_granted_total(inst_buckets, true);\n\t\t\tvar denied = get_denied_total(inst_buckets, false);\n\t\t\tvar inst_percent = 100 * granted / (granted + denied);\n\t\t\tinst_percent = roundNumber(inst_percent, 1); // Round to one decimal\n\n\t\t\tvar grant_url = get_search_event_url(party_name, role, sub_pane.event,\n\t\t\t\ttrue, false, true);\n\t\t\tvar deny_url = get_search_event_url(party_name, role, sub_pane.event,\n\t\t\t\tfalse, true, false);\n\t\t\t// Add the start about the filter.\n\t\t\tvar inst_explain = \"\" +\n plural_events(granted) +\n\t\t\t\t\t\" been granted and \" +\n\t\t\t\t\tplural_events(denied) + \" been denied in cases \" +\n\t\t\t\t\t(filtered_name ? (\"with \" + filtered_name + \" and \"): \"\") +\n\t\t\t\t\t\"where \" + party_name + \" is \" + role + \".\";\n\t\t\t$info.find(\".inst_rate\")\n\t\t\t\t.find(\".val\").text(inst_percent + \"%\").end()\n\t\t\t\t.find(\"p\").html(inst_explain);\n\t\t} else {\n\t\t\t$info.find(\".inst_rate\")\n\t\t\t\t.find(\".val\").text(\"N/A\").end()\n\t\t\t\t.find(\"p\").text(\"Not enough data to calculate institution rate.\");\n\t\t}\n\t}\n\n\tfunction setup_party_type(a, $table, $info, $firm_info) {\n\t\tvar subagg = _get_sub_agg_from_bucket(a);\n\t\tvar buckets = subagg.buckets;\n\t\t// Setup the table of parties\n\t\tsetup_bar_table({\n\t\t\t$obj : $table,\n\t\t\tcols : [\n\t\t\t\t{text:a.key},\n\t\t\t\t{text:\"No. \" + capitalize(plural(2, filing_str)),\n\t\t\t\t\trange:[0, buckets[0].doc_count]}\n\t\t\t],\n\t\t\thide_export : true,\n\t\t\tnum_rows : buckets.length,\n\t\t\tnum_rows_displayed : 10,\n\t\t\t// We need a closure so that the agg name is within scope.\n\t\t\tget_row : function(j) {\n\t\t\t\treturn [\n\t\t\t\t\t{text:buckets[j].key, 'class':'key'},\n\t\t\t\t\t{val:buckets[j].doc_count, 'class':'val'}\n\t\t\t\t];\n\t\t\t},\n\n\t\t\tclicked : function (row, key, event) {\n\t\t\t\tvar filter = add_party_to_q(deparam_url(),\n\t\t\t\t\t\t\t\t\t\t\tbuckets[row].key, a.key);\n\t\t\t\tfilter.limit = 7;\n\t\t\t\t$info.html(\"loading
    throbber\").addClass(\"loading\");\n\n\t\t\t\tget_json_results({\n\t\t\t\t\trequests : [\n\t\t\t\t\t// Do not filter by role to determine the party roles.\n\t\t\t\t\t{\n\t\t\t\t\t\tviews : [\"Party_Roles\"],\n\t\t\t\t\t\tfilter : add_party_to_q(deparam_url(),\n\t\t\t\t\t\t\t\t\t\t\tbuckets[row].key)\n\t\t\t\t\t},\n\t\t\t\t\t// Filter the results by party role as well to determine success rate.\n\t\t\t\t\t{\n\t\t\t\t\t\tviews : [sub_pane.aggview],\n\t\t\t\t\t\tfilter : filter\n\t\t\t\t\t}],\n\t\t\t\t\ton_success : function on_render(results) {\n\t\t\t\t\t\tsetup_party_info($info, buckets[row].key, a.key,\n\t\t\t\t\t\t\tresults[0], results[1]);\n\t\t\t\t\t},\n\t\t\t\t\ton_finished_request : function (i, response) {\n\t\t\t\t\t\tif(i === 1) {\n\t\t\t\t\t\t\tsetup_party_info($info, buckets[row].key, a.key, null, response);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\ton_fail : function () {\n\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// When we start, we have no party info, so give it null;\n\t\tsetup_party_info($info);\n\n\t\tfunction quote(q) {\n\t\t\treturn q.search(\" \") >= 0 ? '\"' + q + '\"' : q;\n\t\t}\n\t\tfunction get_firm_click(party, party_type) {\n\t\t\treturn function (d, i, el) {\n\t\t\t\tif (!d || !d.data || !d.data.k || d.data.k == \"Other\") {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tvar cur = deparam_url();\n\t\t\t\tcur.q = (cur.q && cur.q.length ? cur.q + \" AND \" : \"\") +\n\t\t\t\t\t\"party_obj:(name:\" + quote(party) + \" type:\" + quote(party_type) +\n\t\t\t\t\t\" firm.name:\" + quote(d.data.k) + \")\";\n\t\t\t\treturn DOCKET_SEARCH_URL(cur);\n\t\t\t}\n\t\t}\n\n\t\tfor(var j in buckets) {\n\t\t\t// Get the firms representing this party\n\t\t\tvar firmssubagg = _get_sub_agg_from_bucket(buckets[j]);\n\t\t\t// We don't always know the firms, so this can be null\n\t\t\tif(firmssubagg && firmssubagg.buckets && firmssubagg.buckets.length) {\n\t\t\t\t// Insert a pie chart of firms representing those parties\n\t\t\t\tvar pie_id = obj_id + \"_\" + val_to_id(a.key) + \"_\" +\n\t\t\t\t\t\t\t\tval_to_id(subagg.buckets[j].key);\n\t\t\t\t// Add the item\n\t\t\t\t$firm_info.append(\"
    \" +\n\t\t\t\t\t\"

    \" + truncate(subagg.buckets[j].key, 12) + \"

    \" +\n\t\t\t\t\t\"
    \" +\n\t\t\t\t\t\"
    \");\n\t\t\t\t// Provide the overall doc count so we can include \"other\"\n\t\t\t\tfirmssubagg.doc_count = subagg.buckets[j].doc_count;\n\t\t\t\tsetup_pie_chart(2, \"fiz\", firmssubagg, \"#\" + pie_id, null,\n\t\t\t\t\tget_firm_click(subagg.buckets[j].key, a.key));\n\t\t\t}\n\t\t}\n\t}\n\n\tvar $parties \t= $obj.find(\".parties\");\n\tvar $firms \t\t= $obj.find(\".firms\");\n\tvar po_pet_parties = filter_party_types(agg.buckets);\n\tfor(var i in po_pet_parties) {\n\t\tvar a = po_pet_parties[i];\n\t\tvar $party = $parties.find(\".party.\" + key_to_class[a.key]);\n\t\t// For the pie charts of firms representing those parties\n\t\tvar $firm = $firms.find(\" .\" + key_to_class[a.key]);\n\t\tsetup_party_type(a, $party.find(\".table\"), $party.find(\".info\"), $firm);\n\t}\n\n}\n\n/**\n * Returns a function that truncates the main key appropriately in barCharts\n */\nfunction truncate_key_reports_func(range, $table) {\n\tvar DO_TRUNCATE = false;\n\tvar NAME_MAX_WIDTH = Math.min($table.width()/3, 400);\n\tvar NAME_MIN_WIDTH = 120;\n\n\t// Create the function we use to truncate.\n\treturn function truncated_key(key, doc_count) {\n\t\tif(!DO_TRUNCATE) {\n\t\t\treturn key;\n\t\t}\n\t\tvar doc_perc = (doc_count - range[0]) / (range[1] - range[0]);\n\t\treturn truncate_by_width(key,\n\t\t\t\tMath.max(NAME_MIN_WIDTH, doc_perc*NAME_MAX_WIDTH), \"11pt\", true);\n\t}\n}\n\nfunction event_powertip(e, rates) {\n\t// Put together powertip text based on the outcome of a particular event.\n\tvar dec = e.full.toLowerCase();\n\tif (!(/(decision|opinion|judgment)$/i).test(dec)) {\n\t\tdec += \" decision\"\n\t}\n\tvar being_granted = e.resulted_in || (\n\t\t\" being granted\" + (e.partial_counts ? \" in full or part\" : \"\"));\n\tvar tip_sentence = e.powertip ? e.powertip(rates):\n\t\t\t\trates && rates.total ? (\"Out of \" + plural_n(rates.total, dec) + \", \" +\n\t\t\t\t\trates.granted + \" resulted in \" + being_granted + \".\"):\n\t\t\t\t\"No \" + plural(0, dec) + \".\";\n\treturn wrap_html(e.full, \"div\", \"xval\") +\n\t\twrap_html(tip_sentence, \"div\", \"yval\");\n}\n\n/**\n * Return a row of checkboxes, based on the given array.\n * @param txt_checked \tAn array of 5-arrays:\n * [0] the text of the checkbox\n * [1] a bool if it's checked.\n * [2] The viewargs attribute\n * [3] Value to set set viewargs to if checked.\n * If null: remove the viewarg attribute when checked, and set to false when unchecked.\n * [4] Tooltip.\n **/\nfunction get_checkbox_viewargs_row(txt_checked, parent_id) {\n // Parent id is just used to de-dup IDs, not really needed.\n if(!parent_id) {\n parent_id = uniqueid();\n }\n var all_are_show = txt_checked.every(function (chk_array) {\n return chk_array[0].startsWith(\"Show \")\n });\n var remove_show = all_are_show && txt_checked.length > 2;\n\n var $html = join_jquery(txt_checked.map(function (chk_array) {\n\t\tvar txt = chk_array[0], is_checked = chk_array[1];\n\t\t// We generate the key from the text.\n\t\tvar key = txt.toLowerCase().replaceAll(/[\\s/]+/ig, \"_\");\n\t\tvar full_id = key + \"_\" + parent_id;\n\t\tvar label_data = chk_array.length < 5 ? {} : {\n\t\t powertip : chk_array[4]\n\t\t};\n\t\tif(remove_show) {\n\t\t txt = txt.replace(/^Show /, \"\");\n }\n\t\tvar label = wrap_html(txt, \"label\", null, label_data, { 'for' : full_id });\n\t\treturn \"\" + label;\n\t}), \"options\", \"div\");\n\n // We removed the word \"show\", add it back to the front.\n if(remove_show) {\n $html.prepend(wrap_html(\"Show: \", \"span\", \"show_msg\"));\n }\n\n\t// Now add click handlers.\n\tvar url_hash = get_url_hash();\n\tvar viewargs = get_viewargs_obj(url_hash);\n\ttxt_checked.forEach(function (chk_array) {\n\t\t// We generate the key from the text.\n\t\tvar key = chk_array[0].toLowerCase().replaceAll(/[\\s/]+/ig, \"_\");\n\t\tvar viewargs_key = chk_array[2], viewargs_def = chk_array[3];\n\t\t$html.find(\".\" + key).click(function () {\n\t\t\tif ($(this).is(\":checked\")) {\n\t\t\t if(viewargs_def === null) {\n\t\t\t delete viewargs[viewargs_key];\n } else {\n\t\t\t\t viewargs[viewargs_key] = viewargs_def;\n }\n\t\t\t} else if(viewargs_def === null) {\n viewargs[viewargs_key] = 'false';\n } else if(viewargs[viewargs_key]) {\n delete viewargs[viewargs_key];\n }\n\t\t\t// Setup the current viewargs\n\t\t\tvar cur = deparam_url(url_hash);\n\t\t\tcur.viewargs = args_obj_to_args_ar(viewargs);\n\t\t\twindow.location.hash = \"#\" + param_query(cur);\n\t\t\treturn false;\n\t\t}).end()\n .find(\"[data-powertip]\").powerTip({\n smartPlacement : true,\n popupClass : 'small_powertip'\n });\n\t});\n\n\treturn $html;\n}\n\nfunction get_sort_func(name, case_str_plural, mid_columns, events,\n\tneeds_cases) {\n\tswitch(name) {\n\t\tcase 'No. ' + case_str_plural + ' Ascending':\n\t\tcase 'No. ' + case_str_plural + ' Descending':\n\t\t\treturn {\n\t\t\t\tget_key : needs_cases ?\n\t\t\t\t\tfunction (o) { return o.Cases.doc_count; }:\n\t\t\t\t\tfunction (o) { return o.doc_count; },\n\t\t\t\treverse : name.endsWith('Descending')\n\t\t\t};\n\t\tcase 'Name Ascending':\n\t\tcase 'Name Descending':\n\t\t\treturn {\n\t\t\t\tget_key : function (o) { return o.key.toLowerCase(); },\n\t\t\t\treverse : name.endsWith('Descending')\n\t\t\t};\n\t\tcase 'Law Firm Gender Ascending':\n\t\tcase 'Law Firm Gender Descending':\n\t\t\treturn {\n\t\t\t\tget_key : function (b) {\n\t\t\t\t\tvar total = b.male.value + b.female.value;\n\t\t\t\t\treturn total ? b.female.value / total : -1;\n\t\t\t\t},\n\t\t\t\treverse : name.endsWith('Descending')\n\t\t\t};\n\t\tcase 'Top Courts Ascending':\n\t\tcase 'Top Courts Descending':\n\t\t\treturn {\n\t\t\t\tget_key : function (b) {\n\t\t\t\t\tvar bcourts = (b.Cases && b.Cases.Courts) || b.Courts;\n\t\t\t\t\treturn bcourts && bcourts.buckets ? bcourts.buckets[0].key : \"\";\n\t\t\t\t},\n\t\t\t\treverse : name.endsWith('Descending')\n\t\t\t}\n\t\tcase 'Cases Ascending':\n\t\tcase 'Cases Descending':\n\t\t\treturn {\n\t\t\t\tget_key : function (b) {\n\t\t\t\t\treturn b.Cases ? b.Cases.doc_count : b.doc_count || -1;\n\t\t\t\t},\n\t\t\t\treverse : name.endsWith('Descending')\n\t\t\t}\n\n\t}\n\n\t// Handle middle columns.\n\tfor(var i = 0; i < mid_columns.length; i++) {\n\t\tvar h = mid_columns[i].header;\n\t\tif(name.startsWith(h)) {\n\t\t\treturn {\n\t\t\t\tget_key : mid_columns[i].get_key,\n\t\t\t\treverse : name.endsWith('Descending')\n\t\t\t};\n\t\t}\n\t}\n\tvar percentile_search = /^(\\d+)[a-z]+\\s+Perc(\\.|entile)\\s+(Ascending|Descending)$/;\n\n\t// Handle sorting of all of legacy events and parser identifier events.\n var get_item = needs_cases ?\n function(o) { return o.Cases; } : function(o) { return o; };\n\tfor(i = 0; i < events.length; i++) {\n\t\tconst e = events[i];\n\t\tconst e_key = e.key;\n\t\tif(name.startsWith(e.abrev + \" Rate\")) {\n // Handle sorting rates.\n return {\n get_key: function _get_rate_sort_key(o) {\n var o_ag = get_item(o);\n if (!o_ag.doc_count) {\n return -1;\n }\n var exist_rate = uses_existance_rates(o_ag[e_key],\n o_ag.doc_count);\n if (exist_rate && exist_rate.rate !== undefined) {\n return exist_rate.rate;\n }\n var rate = get_grant_rates(o_ag[e_key], e.partial_counts);\n // Make the total a tie breaker.\n return 1e7 * rate.granted_rate + rate.total;\n },\n reverse: name.endsWith('Descending')\n };\n } else if(name.startsWith(e.full + \" Grant Rate\")) {\n return {\n get_key : function (o) {\n var outcomes = o[e.key] && o[e.key].outcomes;\n if(!outcomes) {\n return -1;\n }\n var rates = get_grant_rates(outcomes, e.partial_counts);\n return rates.granted_rate;\n },\n reverse: name.endsWith('Descending')\n }\n\t\t} else if(name.startsWith('Days to ' + (e.abrev || '')) ||\n\t\t\t(name.search(/\u2192 Decision/) >= 0) && e.type == 'order' ||\n\t\t\t(name.search(/\u2192 Motion/) >= 0) && e.type == 'order') {\n // Handle sorting # of days.\n\t\t return {\n\t\t\t\tget_key : function _get_days_sort_key(o) {\n\t\t\t\t var o_ag = get_item(o);\n\t\t\t\t if(!o_ag.doc_count) {\n\t\t\t\t return -3;\n }\n\t\t\t\t var e_agg = o_ag[e_key] || o[e_key];\n\t\t\t\t if(!e_agg) {\n\t\t\t\t return -2;\n }\n\t\t\t\t var stats = e_agg.stats || e_agg.timing_stats;\n\t\t\t\t return stats && stats.avg ? stats.avg: -1;\n\t\t\t\t},\n\t\t\t\treverse : name.endsWith('Descending')\n\t\t\t}\n\t\t} else if(name.search(percentile_search) >= 0 && e.type == 'order') {\n var perc_key = name.match(percentile_search)[1] + \".0\";\n\t\t return {\n\t\t\t\tget_key : function _get_days_sort_key(o) {\n\t\t\t\t var o_ag = get_item(o);\n\t\t\t\t if(!o_ag.doc_count) {\n\t\t\t\t return -3;\n }\n\t\t\t\t var e_agg = o_ag[e_key] || o[e_key];\n\t\t\t\t if(!e_agg) {\n\t\t\t\t return -2;\n }\n\t\t\t\t var all_percs = e_agg.timing_percentiles && e_agg.timing_percentiles.values;\n\t\t\t\t if(!all_percs) {\n\t\t\t\t return -1;\n\t\t\t\t\t}\n\t\t\t\t var perc_val = all_percs && all_percs[perc_key];\n\t\t\t\t return perc_val || 0;\n\t\t\t\t},\n\t\t\t\treverse : name.endsWith('Descending')\n\t\t\t}\n\t\t} else if(name.startsWith(e.full)) {\n\t\t return {\n\t\t get_key : function _get_count_key(o) {\n\t\t var o_ag = get_item(o);\n\t\t var e_agg = o_ag[e_key] || o[e_key];\n\t\t return e_agg.count ? e_agg.doc_count : 0;\n },\n reverse : name.endsWith('Descending')\n }\n }\n\t}\n\tconsole.warn(\"No sort handler for: \" + name);\n\treturn { get_key : null, reverse : false };\n}\n\n/**\n * Given the party roles in the aggregation, and all party roles, return a\n * column in bar chart that is suitable for drawing. */\nfunction get_party_percental_column(Party_Roles, set_roles, tipPrefix,\n\trequires_unnest) {\n\tfunction getcount(x) {\n\t\tif(requires_unnest && x.count && !x.sub.Cases) {\n\t\t\tconsole.warn(\"No Cases to unnest.\");\n\t\t\treturn x.count;\n\t\t}\n\t\t// Use the unnested Cases sub-aggregation if we have it, even if not required.\n\t\treturn x.sub && x.sub.Cases ? x.sub.Cases.doc_count : x.count || 0;\n\t}\n // Convert the role names to keys.\n\tvar role_key = set_roles.map(val_to_key);\n\tvar case_str_lower = case_str.toLowerCase();\n\t// Get the party role.\n\tvar b_role = agg_to_dict(Party_Roles, set_roles);\n\tvar sum_roles = role_key.reduce(function (sum, role) {\n\t\treturn sum + getcount(b_role[role])}, 0);\n\tif (sum_roles == 0){\n\t // No party role information.\n return {\n\t\t\tperc : 0, 'class':'perc',\n\t\t\ttext: get_perc_text(role_perc, set_roles[0], set_roles[1], false),\n\t\t\tpowertip: \"No party roles were identified.\"\n\n\t\t};\n } else if (role_key.length == 2) {\n\t\t// When there are two roles, we show the percentage.\n\t\tvar role_perc = (getcount(b_role[role_key[0]])) / sum_roles;\n\t\tvar lis = role_key.map(function (r, r_i) {\n\t\t\tvar count = getcount(b_role[r]);\n\t\t\tif(!count) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tvar role = wrap_html(set_roles[r_i],\"span\",\"key\");\n\t\t\tvar val = wrap_html(count, \"span\", \"value\") + \" \" + plural(count, case_str_lower);\n\t\t\treturn wrap_html(val + \" as \" + role, \"li\");\n\t\t});\n\t\tvar ul = wrap_html(lis.join(\"\"), \"ul\")\n\t\treturn {\n\t\t\tperc : role_perc, 'class':'perc',\n\t\t\ttext: get_perc_text(role_perc, set_roles[0], set_roles[1], false),\n\t\t\tpowertip: wrap_html(tipPrefix || 'Party Roles', \"div\", \"xval\") +\n\t\t\t\twrap_html(ul, \"div\", \"yval\")\n\n\n\t\t};\n\t} else if(role_key.length && Party_Roles &&\n (Party_Roles.buckets || []).length) {\n\t\t// There are more than two party types, a percentage is too simple.\n\t\tvar maxkey = val_to_key(Party_Roles.buckets[0].key);\n\t\tvar count = getcount(b_role[maxkey]);\n\t\tif(role_key.indexOf(maxkey) == -1) {\n\t\t\t// The party role may not be in the list of\n\t\t\tsum_roles += count;\n\t\t}\n\t\t// Get the percentage of the most common type.\n\t\tvar role_perc = count / sum_roles;\n\t\treturn {\n\t\t\tperc2 : role_perc,\n\t\t\ttext: get_perc_text(role_perc, Party_Roles.buckets[0].key,\n\t\t\t\t'Not ' + Party_Roles.buckets[0].key, false),\n\t\t\t// Return a list of all of the non-zero types.\n\t\t\tpowertip: top_entities_powertip(tipPrefix || 'Party Roles', Party_Roles.buckets),\n\t\t};\n\t} else {\n\t\treturn {};\n\t}\n}\n\n/**\n * Return a column to go into a bar chart that formats a case type. However,\n * by changing parameters, it can be suitable for other data as well\n * @param list_several \tIf true, then list several of the case types, otherwise\n\t\t\t\t\t\tjust list the most popular one.\n * @param k \t\t\tThe aggregation key to use, defaults to Case_Type\n * @param header\t\tThe header or title of the column, default to Case Type.\n * @param klass\t\t\tClass to the surrounding td cell to change styling.\n **/\nfunction get_case_type_column(list_several, k, header, klass) {\n\tif(!k) {\n\t\tk = 'Case_Type'\n\t}\n\tif(!header) {\n\t\theader = 'Case Type'\n\t}\n\tvar case_str_lower = case_str.toLowerCase();\n\treturn {\n\t\theader : header,\n\t\tget_row : function _getrow(b) {\n\t\t\tvar key = b.key;\n\t\t\t// Get the top tech center.\n\t\t\tif(b.Cases) {\n\t\t\t\tb = b.Cases;\n\t\t\t}\n\t\t\tvar buckets = b[k] && b[k].buckets;\n\t\t\tif(!buckets || !buckets.length) {\n\t\t\t\treturn list_several ? {\n\t\t\t\t\tclass : klass || '',\n\t\t\t\t\tlist_perc : [],\n\t\t\t\t\tpowertip: 'No ' + case_str_lower + 's.'\n\t\t\t\t} : {\n\t\t\t\t\tclass : klass || '',\n\t\t\t\t\tperc2 : 0,\n\t\t\t\t\ttext : '',\n\t\t\t\t\tpowertip: 'No ' + case_str_lower + 's.'\n\t\t\t\t};\n\t\t\t}\n\t\t\tvar total = b[k].doc_count;\n\t\t\tif(list_several) {\n\t\t\t\tbuckets.forEach(function (item) {\n\t\t\t\t\titem.perc = item.doc_count / total;\n\t\t\t\t});\n\t\t\t\t// List the top items.\n\t\t\t\treturn {\n\t\t\t\t\tclass : klass || '',\n\t\t\t\t\tlist_perc : buckets,\n\t\t\t\t\tpowertip: top_entities_powertip(plural(2, header), buckets),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tvar top_case = buckets[0];\n\t\t\t\tvar perc = top_case.doc_count / total;\n\t\t\t\tvar ptip = top_case.key + 's constitute ' + roundNumber(perc*100) +\n\t\t\t\t\t\t\t'% of ' + key + \"’s \" + case_str_lower + \"s.\";\n\t\t\t\t// Get any extra case types.\n\t\t\t\tvar extra_buck = buckets.slice(1).filter(function(ct) {\n\t\t\t\t\treturn ct.doc_count > 0;\n\t\t\t\t});\n\t\t\t\tif(extra_buck.length > 0) {\n\t\t\t\t\tptip += \" In addition, \" + extra_buck.map(function (ct) {\n\t\t\t\t\t\treturn get_perc_text(ct.doc_count / total,\n\t\t\t\t\t\t\t' are ' + ct.key + 's', '', false);\n\t\t\t\t\t}).join(\", \") + \".\";\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tclass : klass || '',\n\t\t\t\t\tperc2 : perc,\n\t\t\t\t\ttext: get_perc_text(perc, top_case.key, '', false),\n\t\t\t\t\tpowertip: ptip,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\tget_key : function _get_key(o) {\n\t\t\t\tif(o.Cases) {\n\t\t\t\t\to = o.Cases || {};\n\t\t\t\t}\n\t\t\t\to = o[k];\n\t\t\t\t// Return the greatest percentage of cases.\n\t\t\t\treturn o.doc_count && o.buckets.length ?\n\t\t\t\t\to.buckets[0].doc_count / o.doc_count : 0;\n\t\t}\n\t};\n}\n\n/**\n * Generate a nice tooltip for law firm gender information. It can be confusing.\n **/\nfunction law_firm_gender_tip(b) {\n var tip= \"\";\n if(b) {\n var total = b.male.value + b.female.value;\n tip += total ? \"

    Gender Identification of Attorney First Names

    \" :\n \"

    No identified attorney genders.

    \";\n tip += \"\";\n }\n tip += \"

    How Firm Gender is Counted

    \" +\n \"

    We analyze the first name of attorneys that make an appearance \" +\n \"and classify each as male identifying, female identifying, or unknown. \" +\n \"Determining gender identification based on first name is imperfect, but \" +\n \"can still provide meaningful diversity insights.

    \" +\n \"

    Gender is counted when an attorney makes a notice of appearance \" +\n \"for each party. If one attorney represents multiple parties in a \" +\n \"single case, they will be counted multiple times.

    \";\n return \"
    \" + tip + \"
    \";\n}\nfunction unknown_outcome_tip() {\n return wrap_html(\"Unknown Outcomes\", \"h3\") +\n wrap_html(\"Unknown outcomes occur when we identify an order on a docket \" +\n \"sheet, but the docket text is ambiguous as to whether it was granted or denied.\", \"p\");\n}\nvar bartable_defaults = {\n\tdefault_row : function default_row(b, row_min_width, row_0_max_width, trunc_key) {\n\t\tvar bsub_doc_count = (b.Cases ? b.Cases : b).doc_count;\n\t\tvar bcount_str = number_with_commas(bsub_doc_count);\n\t\tvar babrev_str = number_with_abbrev(bsub_doc_count);\n\t\treturn [{\n\t\t\tval: bsub_doc_count,\n\t\t\tmin_width: row_min_width,\n\t\t\tmax_width : row_0_max_width,\n\t\t\ttext : \"\" + trunc_key(b.key, bsub_doc_count) +\n\t\t\t\t\t\"\",\n\t\t\t'class':'val',\n\t\t\t// powertip: wrap_html(b.key, \"div\", \"xval\") + wrap_html(bcount_str, \"div\", \"yval\")\n\t\t}];\n\t},\n\n\t/**\n\t * Internal bar table function. Given a list of event aggregations, return the\n\t * column names and export column names that will go into the bar table.\n\t * @param first_b\n\t * @param events\n\t * @returns {{all: *[], columns: *[], export_columns: *[]}}\n\t */\n\tdefault_event_cols : function default_event_cols(first_b, events) {\n\t\t// Get the first bucket's total doc count.\n\t\tvar first_doc_count = (first_b.Cases || first_b).doc_count;\n\t\tvar all_events_custom_cols = [];\n\n\t\t// Do some basic checks on this structure that is used to get more columns\n\t\t// for each event.\n\t\tfunction check_custom_event_structure(s) {\n\t\t\tif(!s) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!s.get_columns || !s.get_cells) {\n\t\t\t\tconsole.error(\"No get_columns or cells functions.\");\n\t\t\t}\n\t\t\tif(!s.get_export_cells || !s.get_export_columns) {\n\t\t\t\tconsole.warn(\"No export columns or cells.\");\n\t\t\t}\n\t\t}\n\n\t\tvar export_columns = [];\n\t\tvar columns = [];\n\t\tfor(var e_i = 0; e_i < events.length; e_i++) {\n\t\t\tvar e = events[e_i];\n\t\t\t// Get the event in the first bucket item. We need a sample to create columns\n\t\t\tvar first_e_val = first_b[e.key] || (first_b.Cases && first_b.Cases[e.key]);\n\t\t\tvar custom_event_columns = e.custom_columns && e.custom_columns(e, first_b, first_e_val);\n\t\t\tcheck_custom_event_structure(custom_event_columns);\n\n\t\t\tall_events_custom_cols.push(custom_event_columns);\n\t\t\tif(!first_e_val) {\n\t\t\t\tconsole.warn(\"Could not find event key: \" + e.key);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar ev_full = e.full || e.abrev;\n\t\t\t// show_rate defaults to true, so make sure it isn't false\n\t\t\tif(e.show_rate !== false) {\n\t\t\t\tvar rate_abrev = (e.abrev || '') + \" Rate\";\n\t\t\t\tcolumns.push({\n\t\t\t\t\ttext: rate_abrev,\n\t\t\t\t\tsort:[rate_abrev + ' Ascending', rate_abrev + ' Descending']\n\t\t\t\t});\n\t\t\t\tvar exist_rates = uses_existance_rates(first_e_val, first_doc_count);\n\t\t\t\tif(exist_rates) {\n\t\t\t\t\texport_columns.push(ev_full);\n\t\t\t\t\texport_columns.push(ev_full + \" Rate\");\n\t\t\t\t} else {\n\t\t\t\t\t// And the total granted.\n\t\t\t\t\texport_columns.push(ev_full + (e.partial_counts ?\n\t\t\t\t\t\t\" Granted\": \" Granted in Full\"));\n\t\t\t\t\t// And the total overall.\n\t\t\t\t\texport_columns.push(ev_full + \" Total\");\n\t\t\t\t\t// We'll insert the rate.\n\t\t\t\t\texport_columns.push(ev_full + \" Rate\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(custom_event_columns) {\n\t\t\t\tcolumns = columns.concat(custom_event_columns.get_columns());\n\t\t\t\texport_columns = export_columns.concat(custom_event_columns.get_export_columns());\n\t\t\t}\n\t\t\tif(e.show_outcome) {\n\t\t\t\tif(!first_e_val.outcomes && !first_e_val.outcome) {\n\t\t\t\t\tconsole.warn(\"No outcome data for \" + e.key);\n\t\t\t\t} else {\n\t\t\t\t\tvar rate_abrev = ev_full + \" Grant Rate\";\n\t\t\t\t\tcolumns.push({\n\t\t\t\t\t\ttext : e.abrev +\" Outcome\",\n\t\t\t\t\t\tsort:[rate_abrev + ' Ascending', rate_abrev + ' Descending']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tcolumns : columns,\n\t\t\texport_columns:export_columns,\n\t\t\tall:all_events_custom_cols\n\t\t}\n\t},\n\n\t/**\n\t * Given a bucket and the event aggregations\n\t * @param b Data bucket\n\t * @param events event aggregations.\n\t * @param event_cols\n\t * @param bucket_to_url A function that turns a bucket into a URL.\n\t * @returns {*[]}\n\t */\n\tdefault_event_rows : function default_event_rows(b, events, event_cols, bucket_to_url) {\n\t\tvar row = [];\n\t\tvar total_count = (b.Cases || b).doc_count\n\t\t// Get their event rate.\n\t\tfor(var e_i = 0; e_i < events.length; e_i++) {\n\t\t\tconst e = events[e_i];\n\t\t\tvar custom_event_columns = event_cols.all[e_i];\n\t\t\tvar e_ag = b[e.key] || (b.Cases ? b.Cases[e.key] : null);\n\t\t\tif(!e_ag){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// show_rate defaults to true, so make sure it isn't false\n\t\t\tif(e.show_rate !== false) {\n\t\t\t\tvar exist_rates = uses_existance_rates(e_ag, total_count);\n\t\t\t\tif (exist_rates && exist_rates.rate !== undefined) {\n\t\t\t\t\t// We're measuring how often this event occurs in the case.\n\t\t\t\t\trow.push({\n\t\t\t\t\t\tgauge: exist_rates.rate,\n\t\t\t\t\t\tgauge_count : exist_rates.count,\n\t\t\t\t\t\t'class': 'gauge',\n\t\t\t\t\t\tpowertip: exist_rates.exists + \" of \" +\n\t\t\t\t\t\t\tplural_n(e_ag.doc_count, \" have \" + e.full)\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// We're measuring how often the event is granted when it\n\t\t\t\t\t// occurs in the case.\n\t\t\t\t\tvar grant_rates = get_grant_rates(e_ag, e.partial_counts);\n\t\t\t\t\trow.push({\n\t\t\t\t\t\tgauge: grant_rates.total == 0 ? null : grant_rates.granted_rate,\n\t\t\t\t\t\t'class': 'gauge',\n\t\t\t\t\t\tpowertip: event_powertip(e, grant_rates)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(custom_event_columns) {\n\t\t\t\trow = row.concat(custom_event_columns.get_cells(b, e_ag, filing_str));\n\t\t\t}\n\t\t\tif(e.show_outcome) {\n\t\t\t\tvar $obj = $(\"
    \");\n\t\t\t\tif(e.map_outcome && e_ag.outcomes && e_ag.outcomes.buckets) {\n\t\t\t\t\te_ag.outcomes.buckets.forEach(function (b) {\n\t\t\t\t\t\tb.outcome = b.key;\n\t\t\t\t\t\tb.short_name = e.map_outcome(b.key);\n\t\t\t\t\t\tb.className = b.key.replaceAll(/[\\s/]/ig, \"_\");\n\t\t\t\t\t\tb.k = b.short_name;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tvar rates = get_grant_rates(e_ag.outcomes, e.partial_counts);\n\t\t\t\tvar rate_html = wrap_html(rates.granted_rate ?\n\t\t\t\t\tget_perc_text(rates.granted_rate, \"granted\", null, false):\"\",\n\t\t\t\t\t\"span\", \"granted_rate\");\n\t\t\t\t// Get the URL of the outcome.\n\t\t\t\tvar bucket_url = bucket_to_url ? bucket_to_url(b) : null;\n\t\t\t\t// Remove the initial hash/query.\n\t\t\t\tvar bucket_params = bucket_url ? bucket_url.slice(1) : null;\n\n\t\t\t\tfunction get_event_pie_url(slice, index, el) {\n\t\t\t\t\t// Generate the new URL from the bucket URL, adding the outcome.\n\t\t\t\t\tvar base = deparam_url(bucket_params);\n\t\t\t\t\t// Get the outcome, not sure why there are two ways of getting it.\n\t\t\t\t\tvar data_outcome = slice.data.outcome || slice.data.k;\n\t\t\t\t\t// Figure out which outcome this element is.\n\t\t\t\t\tvar q = get_event_query(e.is_parser, e.type, e.identifier, data_outcome);\n\t\t\t\t\tbase.fname_q_outcome = \"Outcome: \" + slice.data.short_name;\n\t\t\t\t\tif(!base.f) {\n\t\t\t\t\t\tbase.f = [];\n\t\t\t\t\t} else if (!Array.isArray(base.f)) {\n\t\t\t\t\t\tbase.f = [base.f];\n\t\t\t\t\t}\n\t\t\t\t\tbase.f.push(\"q_outcome-\" + q);\n\t\t\t\t\treturn DOCKET_SEARCH_URL(base);\n\t\t\t\t}\n\t\t\t\tif(e_ag.outcomes) {\n\t\t\t\t\tsetup_pie_chart(8, e.abrev, e_ag.outcomes, $obj, 0, get_event_pie_url);\n\t\t\t\t}\n\t\t\t\t$obj.append(rate_html);\n\n\t\t\t\trow.push({\n\t\t\t\t\tjquery : $obj,\n\t\t\t\t\t'class' : 'jquery',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn row;\n\t}\n}\n\n/**\n * The bar tables are all quite similar and are defined by their mid_columns\n * and events. This function takes many of these common inputs and builds the\n * structure that will be passed to the more general bar table.\n * @param $obj Location of the bar table.\n * @param case_str What to call a row of data cases/orders.\n * @param buckets\n * @param mid_columns List of internal columns to show.\n * @param events List of events to show.\n * @param bucket_to_url A function that takes a bucket and returns a click URL.\n */\nfunction default_bar_table_options($obj, case_str, buckets, mid_columns, events, bucket_to_url) {\n\tvar $table = $obj.find(\".table\");\n\n\t// Get min/max ranges. We cannot assume the data is sorted.\n\tvar num_range = [null, null];\n\tfor(var i=0; i < buckets.length; i++) {\n\t\tvar val = buckets[i].Cases ?\n\t\t\tbuckets[i].Cases.doc_count : buckets[i].doc_count;\n\t\t if(num_range[0] === null || val < num_range[0]) {\n\t\t\tnum_range[0] = val;\n\t\t }\n\t\t if(num_range[1] === null || val > num_range[1]) {\n\t\t\tnum_range[1] = val;\n\t\t }\n\t}\n\t// If no data, then provide dummy ranges.\n\tif(!num_range[0]) {\n\t\tnum_range = [0, 10];\n\t}\n\n\tvar trunc_key = truncate_key_reports_func(num_range, $table);\n\tvar case_str_plural = plural(2, case_str);\n\n\t// Use this function to determine if the mid_column was already added.\n\tvar top_name = $obj.attr('id').replaceAll(\"_\", \" \");\n\tfunction mid_column_exists(header) {\n\t\tif(top_name == header) {\n\t\t\t// If the entire table is based on this column, don't insert it.\n\t\t\treturn true;\n\t\t}\n\t\treturn mid_columns.some(function(c) { return c.header == header});\n\t}\n\n\t////////////////\n\t// Setup capabilities for this bar table, the \"has\" field stores capabilities.\n\tvar has = {};\n\n\t// Add the courts column if we have one.\n\thas.courts = buckets.some(function (b) {\n\t\treturn (b.Cases && b.Cases.Courts) || b.Courts;\n\t});\n\tif(has.courts && !mid_column_exists('Top Courts')) {\n\t\tmid_columns.push({\n\t\t\theader:'Top Courts',\n\t\t\tget_row : function (b) {\n\t\t\t\t// Handle both nested and unnested cases.\n\t\t\t\tvar bcourts = (b.Cases && b.Cases.Courts) || b.Courts;\n\t\t\t\treturn bcourts && bcourts.buckets ? {\n\t\t\t\t\tlist : bcourts.buckets,\n\t\t\t\t\t'class' : 'list',\n\t\t\t\t\t// Top Courts are always done on a case level.\n\t\t\t\t\tpowertip: top_entities_powertip(\"Courts\", bcourts.buckets, 'case')\n\t\t\t\t} : null;\n\t\t\t},\n\t\t\tget_key : function (b) {\n\t\t\t\tvar bcourts = (b.Cases && b.Cases.Courts) || b.Courts;\n\t\t\t\treturn bcourts && bcourts.buckets ? bcourts.buckets[0].key : \"\";\n\t\t\t}\n\t\t});\n\t}\n\t// Add a law firm gender column, if we have one.\n\thas.case_length = buckets.some(function (b) {\n\t\treturn (b.Cases && b.Cases.Case_Length) || b.Case_Length;\n\t});\n\tif(has.case_length && !mid_column_exists('Case Length')) {\n\t\tfunction days_to_str(num_days, abbrev) {\n\t\t\tvar num_year = Math.floor(num_days / 365);\n\t\t\tvar num_day = Math.round(num_days % 365);\n\t\t\treturn (num_year ? plural_n(num_year, abbrev ? \"yr\" : \"year\") + \" \" : \"\") +\n\t\t\t\tplural_n(num_day, abbrev ? \"dy\" : \"day\");\n\t\t}\n\n\t\tmid_columns.push({\n\t\t\theader:'Case Length',\n\t\t\tget_row : function (b) {\n\t\t\t\t// Handle both nested and unnested cases.\n\t\t\t\tvar blen = (b.Cases && b.Cases.Case_Length) || b.Case_Length;\n\t\t\t\tif(!blen.count){\n\t\t\t\t\treturn { class : \"stat nodata\", exported : '', text : \"No data\" };\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tclass : 'stat',\n\t\t\t\t\texported : Math.round(blen.avg),\n\t\t\t\t\ttext : days_to_str(blen.avg) + (blen.std_deviation ?\n\t\t\t\t\t\t\"
    ± \" +\n\t\t\t\t\t\t\tdays_to_str(blen.std_deviation, true) + \"\": \"\"),\n\t\t\t\t\tpowertip: \"Case Length Statistics:\"\n\t\t\t\t};\n\t\t\t},\n\t\t\tget_key : function (b) {\n\t\t\t\tvar blen = (b.Cases && b.Cases.Case_Length) || b.Case_Length;\n\t\t\t\treturn (blen && blen.avg) || -1;\n\t\t\t}\n\t\t});\n\t}\n\n\t// Add Case_Type column if we have one.\n\thas.casetype = buckets.some(function (b) {\n\t\treturn (b.Cases && b.Cases.Case_Type) || b.Case_Type;\n\t});\n\tif(has.casetype && !mid_column_exists('Case Type')) {\n\t\tmid_columns.push(get_case_type_column(true));\n\t}\n\t// Add Tag column if we have one.\n\thas.casetag = buckets.some(function (b) {\n\t\treturn (b.Cases && b.Cases.Case_Tag) || b.Case_Tag;\n\t});\n\tif(has.casetag && !mid_column_exists('Tags')) {\n\t\tmid_columns.push(get_case_type_column(true,\n\t\t\t'Case_Tag', 'Tags'));\n\t}\n\t// Add Case_Status column if we have one.\n\thas.casestatus = buckets.some(function (b) {\n\t\treturn (b.Cases && b.Cases.Case_Status) || b.Case_Status;\n\t});\n\tif(has.casestatus && !mid_column_exists('Case Status')) {\n\t\tmid_columns.push(get_case_type_column(true,\n\t\t\t'Case_Status', 'Case Status', 'alt'));\n\t}\n\t// Add a law firm gender column, if we have one.\n\thas.gender = buckets.some(function (b) {\n\t\treturn b.male || b.female || b.unknown;\n\t});\n\tif (has.gender) {\n\t\tmid_columns.push({\n\t\t\theader : \"Law Firm Gender\",\n\t\t\tget_row : function(b) {\n\t\t\t\t// Get the top clients.\n\t\t\t\tvar total = b.male.value + b.female.value;\n\t\t\t\tvar perc_gender = total ? b.female.value / total : null;\n\t\t\t\tvar values = [{x:'Female', y:b.female.value},\n {x:'Male', y:b.male.value},\n {x:'Unknown', y:b.unknown_gender.value}]\n\t\t\t\treturn {\n\t\t\t\t\tlinear_pie : values,\n\t\t\t\t\t'class':'alt', // Adding \"alt\" makes it a different color.\n\t\t\t\t\ttext: get_perc_text(perc_gender, \"Female\", 'Male', false),\n\t\t\t\t // Generate a nice tooltip to ease possible confusion.\n\t\t\t\t\tpowertip: law_firm_gender_tip(b)\n\t\t\t\t};\n\t\t\t},\n\t\t\tget_key : function (b) {\n\t\t\t\tvar total = b.male.value + b.female.value;\n\t\t\t\treturn total ? b.female.value / total : -1;\n\t\t\t}\n\t\t});\n\t}\n\t// If one of our events is a parser event.\n\thas.parser_events = events.some(function (ev) {\n\t\treturn ev.is_parser;\n\t});\n\n\n\t////////////////\n\t// Build the columns, a list of dictionaries.\n\tvar columns = [];\n\tvar export_columns = [];\n\n\t// Normally we show the middle columns, then the events.\n\t// With parser tags, we reverse that.\n\tvar middle_cols_then_events = !has.parser_events;\n\n\t// Show basic column info, but not when displaying parser events. This\n\t// needs to be changed to check only when we're filtering on a parser events.\n\tvar show_basic_count = !has.parser_events;\n\tif(show_basic_count) {\n\t\tcolumns.push({\n\t\t\ttext: \"No. of \" + case_str_plural, range: num_range,\n\t\t\tsort: ['No. ' + case_str_plural + ' Descending',\n\t\t\t\t'No. ' + case_str_plural + ' Ascending',\n\t\t\t\t'Name Ascending', 'Name Descending']\n\t\t});\n\t\texport_columns = ['Name', 'No. of ' + case_str_plural];\n\t}\n ////////////\n\t// Add the event columns.\n\tvar event_cols = bartable_defaults.default_event_cols(buckets[0], events);\n\tif(!middle_cols_then_events) {\n\t\tcolumns = columns.concat(event_cols.columns);\n\t\texport_columns = export_columns.concat(event_cols.export_columns)\n\t}\n\t// Add the mid_columns\n\tfor(var i = 0; i < mid_columns.length; i++) {\n\t\tvar h = mid_columns[i].header;\n\t\tcolumns.push({ text: h, sort:[h + ' Ascending', h + ' Descending'] });\n\t\texport_columns.push(h);\n\t}\n\tif(middle_cols_then_events) {\n\t\tcolumns = columns.concat(event_cols.columns);\n\t\texport_columns = export_columns.concat(event_cols.export_columns)\n\t}\n\n\tvar bartable_title = $obj.find(\".graph_title\").clone()\n\t\t.find(\".filter_list, .export, .options, .link-view-text, .motion_chooser_btn, .view_all_stats\")\n\t\t\t.remove().end().text();\n\tvar bartable_subtitle = $obj.find(\".graph_title .filter_list\").text();\n\n\tvar row_min_width = Math.min($table.width() / columns.length, 155);\n\tvar row_0_max_width =\n (columns.length < 2 ? .95:\n columns.length < 3 ? .5:\n columns.length < 5 ? .4:\n columns.length < 6 ? .37 :\n .33) * $table.width();\n\treturn {\n\t\t$obj : $table,\n\t\tcols : columns,\n\t\ttitle : bartable_title,\n\t\tsubtitle : bartable_subtitle,\n\n\t\tnum_rows : buckets.length,\n\t\tload_more : get_load_more_url(buckets.length),\n\t\t$export_btn : $obj.find(\".export\"),\n\n\t\t// We need a closure so that the agg name is within scope.\n\t\tget_row : function _default_get_row(j) {\n\t\t\tvar b = buckets[j];\n\t\t\tvar row = [];\n\n\t\t\t// Add the basic information.\n\t\t\tif(show_basic_count) {\n\t\t\t\trow = row.concat(bartable_defaults.default_row(b, row_min_width, row_0_max_width, trunc_key));\n\t\t\t}\n\n\t\t\t// Get the middle columns.\n\t\t\tvar middle_cols = mid_columns.map(function (m) { return m.get_row(b); })\n\t\t\t// The event columns.\n\t\t\tvar event_rows = bartable_defaults.default_event_rows(b, events, event_cols, bucket_to_url);\n\t\t\t// Add them teogether properly.\n\t\t\trow = middle_cols_then_events ?\n\t\t\t\trow.concat(middle_cols, event_rows):\n\t\t\t\trow.concat(event_rows, middle_cols);\n\n\t\t\treturn row;\n\t\t},\n\n\t\tcols_export : export_columns,\n\t\tget_row_export : function (j) {\n\t\t\tvar b = buckets[j];\n\t\t\tvar bsub_doc_count = (b.Cases ? b.Cases : b).doc_count;\n\t\t\t// Add the basic information.\n\t\t\tvar row = show_basic_count ? [b.key, bsub_doc_count] : [];\n\t\t\t// Get the middle columns.\n\t\t\tfor(var i = 0; i < mid_columns.length; i++) {\n\t\t\t\tvar mid = mid_columns[i].get_row(b);\n\t\t\t\t// This is a bit of guesswork as to what we end up exporting.\n\t\t\t\trow.push(mid.exported !== undefined ? mid.exported:\n\t\t\t\t\tmid.perc !== undefined ? {type: 'percent', value: mid.perc}:\n\t\t\t\t\tmid.val != undefined ? mid.val:\n\t\t\t\t\tmid.list != undefined ? mid.list.map(\n\t\t\t\t\t\tfunction (f) { return f.key; }).join(\", \"):\n\t\t\t\t\tmid.text ? mid.text.replaceAll(\"&\", \"&\"):\n\t\t\t\t\t'');\n\t\t\t}\n\t\t\t// Export event data to a table.\n\t\t\tfor(var e_i = 0; e_i < events.length; e_i++) {\n var e = events[e_i];\n var e_ag = b[e.key] || (b.Cases ? b.Cases[e.key] : null);\n var custom_event_columns = event_cols.all[e_i];\n // show_rate defaults to true, so make sure it isn't false\n\t\t if(e.show_rate !== false) {\n var exist_rates = uses_existance_rates(e_ag, bsub_doc_count);\n if (exist_rates) {\n row.push(exist_rates.exists);\n row.push({type: 'percent', value: exist_rates.rate});\n } else {\n var rates = get_grant_rates(e_ag, e.partial_counts);\n row.push(rates.total ? rates.granted : '');\n row.push(rates.total);\n row.push({type: 'percent', value: (rates.total ? rates.granted_rate : '')});\n }\n }\n if(custom_event_columns) {\n\t\t\t\t\trow = row.concat(custom_event_columns.get_export_cells(e_ag));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn row;\n\t\t}\n\t};\n}\n\n/**\n * Render text and url based on the key\n **/\nfunction render_link_to_view(agg_info_key) {\n var cur_hash = url_params_to_object(get_url_hash());\n var params = {\n // Keep the query the same\n q: cur_hash.q,\n /// Keep all the filters the same too.\n f: cur_hash.f,\n // The view arguments (the little checkboxes), should also stay the same.\n viewargs: cur_hash.viewargs,\n };\n // Certain views have a \"v\" profiel that has more options.\n\tvar views_to_v = {\n\t\tTop_Law_Firms: 'firms',\n\t\tTop_Attorneys: 'attorneys',\n\t\tTop_Parties : 'parties',\n\t\tTop_Judges: 'judges',\n\t\tTop_Courts: 'courts',\n\t\tTop_Case_Types: 'case_types',\n\t\tTop_Classes: 'classes',\n\t\tTop_Tags: 'tags',\n\t\tTop_Patents: 'patents',\n\t}[agg_info_key];\n\tif(views_to_v) {\n\t\tparams.v = views_to_v;\n\t} else {\n\t\tparams.views = agg_info_key\n\t}\n\n if(\"embed\" in cur_hash) {\n params.embed = undefined; // Doesn't need a real value, undefined okay.\n }\n // Generate a new URL.\n var $link = '#' + $.param(params, true);\n // Generate the HTML from the link.\n return \"\" +\n // A nice little icon.\n wrap_html(\"\", \"i\", stats_views_globals.view_only_icon) +\n // A message to the user.\n \"View only this report\";\n}\n\n/**\n * If there are no aggregations, return some html to show the user, or\n * optionally append it to an object.\n **/\nfunction _render_no_cases(agg, $obj) {\n\tif(agg && agg.buckets && agg.buckets.length) {\n\t\treturn false;\n\t}\n\tvar html = \"
    No \" + plural(2, case_str).toLowerCase() +\n\t\t\".
    \";\n\tif($obj)\n\t\t$obj.append(html);\n\treturn html;\n}\n\nfunction _get_viewargs_identifiers(viewargs) {\n if(!viewargs) {\n viewargs = get_viewargs_obj(null, true);\n }\n var output = {\n identifiers: viewargs.event_identifier,\n types : viewargs.event_type,\n // Identifier list is null until it's filled, or error is set.\n identifier_list : null,\n };\n if(viewargs.event_identifier && viewargs.event_identifier.length) {\n // Get the full identifier list, not just those matching the type.\n static_identifier_list('priority', null,\n function _done(identifier_list) {\n output.identifier_list = identifier_list;\n },\n function _error(error) {\n output.error = error;\n console.warn(\"Identifier list error: \" + error);\n },\n true);\n }\n return output;\n}\n\nfunction get_identifier_bar_table_info(e, first_bucket, first_event_val) {\n\tif(!e.is_parser || !first_event_val) {\n\t\treturn null;\n\t}\n\tvar viewargs = get_viewargs_obj() || {};\n\tvar options = parser_stats_utils.stats_row_timing_type_options();\n\tvar timing_key = viewargs.stats_row_timing_type || parser_stats_utils.timing_defaults.row;\n\tvar timing_name = options[timing_key];\n\tif(!timing_name) {\n\t\tconsole.warn(\"Unknown timing key: \" + timing_key);\n\t}\n\tvar has = {\n\t\tpercentiles : first_event_val.timing_percentiles && first_event_val.timing_percentiles.values\n\t}\n\treturn {\n\t\tget_columns : function get_columns() {\n\t\t\t// Put the columns into the correct format.\n\t\t\tfunction str_to_col(h) {\n\t\t\t\treturn { text: h, sort:[h + ' Ascending', h + ' Descending'] };\n\t\t\t}\n\t\t\tvar orders = str_to_col('Orders');\n\t\t\torders.range = [0, first_event_val.doc_count];\n\t\t\tvar cols = [orders, str_to_col('Cases with Order')];\n\t\t\tif(has.percentiles) {\n\t\t\t\tcols.push(str_to_col(\"25th Perc.\"));\n\t\t\t\tcols.push(str_to_col(timing_name));\n\t\t\t\tcols.push(str_to_col(\"75th Perc.\"));\n\t\t\t} else {\n\t\t\t\tcols.push(str_to_col(timing_name));\n\t\t\t}\n\t\t\treturn cols;\n\t\t},\n\t\tget_cells : function get_cells(bucket, e_ag, filing_str) {\n\t\t\tvar cells = [];\n\n\t\t\t// Create a basic count HTML.\n\t\t\tvar order_count = e_ag.doc_count || 0;\n\t\t\tvar case_count = e_ag.cases ? e_ag.cases.doc_count : null;\n\t\t\tvar order_count_html = wrap_html(bucket.key, \"div\", \"name\");\n\t\t\tvar case_count_html = wrap_html(plural_n(case_count, \"case\"), \"div\", \"cases\");\n\t\t\tvar case_with_motion = wrap_html(\"Cases with Motion: \" + wrap_html(plural_n(bucket.doc_count, \"case\"), \"span\", \"value\"), \"div\");\n\t\t\tvar order_x_val = wrap_html(e.full + \"
    \" + order_count_html, \"div\", \"xval\");\n\t\t\tvar order_y_val = wrap_html(order_count == 0 ?\n\t\t\t\t\t\"No Orders.\" + case_with_motion +\n\t\t\t\t\twrap_html(\"Appears because motions exist.\", \"div\", \"notes\"):\n\t\t\t\t\t\"Order Count: \" + wrap_html(number_with_commas(order_count), \"span\", \"value\") +\n\t\t\t\t\twrap_html(\"Cases with Orders: \" + wrap_html(plural_n(case_count, \"case\"), \"span\", \"value\"), \"div\") +\n\t\t\t\t\tcase_with_motion, \"div\", \"yval\");\n\t\t\tvar order_tip = order_x_val + order_y_val;\n\n\t\t\tcells.push({\n\t\t\t\tval : order_count,\n\t\t\t\ttext : order_count_html,\n\t\t\t\tmin_width: 150,\n\t\t\t\tmax_width : 400,\n\t\t\t\t'class' : 'val',\n\t\t\t\tpowertip: order_tip,\n\t\t\t});\n\t\t\tcells.push({\n\t\t\t\ttext : case_count_html,\n\t\t\t\t'class' : 'cases',\n\t\t\t\tpowertip: order_tip,\n\t\t\t});\n\n\t\t\tvar stats = e_ag.timing_stats || {};\n\t\t\tvar timing_html = stats.count ?\n\t\t\t\twrap_html(stats.avg.toFixed(0), \"div\", \"value\") +\n\t\t\t\t\twrap_html(\"days avg.\", \"span\", \"msg\"):\n\t\t\t\twrap_html(\"\", \"span\", \"no_results\");\n\t\t\tvar percentiles = e_ag.timing_percentiles && e_ag.timing_percentiles.values;\n\t\t\tvar tip = '';\n\t\t\tif(stats.count) {\n\t\t\t\ttip += order_x_val +\n\t\t\t\t\twrap_html(\"Average: \" + stats.avg.toFixed(0) + \" days\" +\n\t\t\t\t\t\twrap_html(\"across \" + wrap_html(plural_n(stats.count, filing_str), \"em\"), \"div\", \"notes\"), \"div\", \"yval\");\n\t\t\t\tif(stats.min || stats.max) {\n\t\t\t\t\ttip += wrap_html(\"Range: \" + plural_n(stats.min, \"day\") + \" minimum to \" + stats.max + \" days max\", \"div\", \"compare\");\n\t\t\t\t}\n\t\t\t\tif(percentiles) {\n\t\t\t\t\ttip += wrap_html(\"Middle 50% Range: \" + percentiles[\"25.0\"].toFixed(0) + \" to \" + percentiles[\"75.0\"].toFixed(0) + \" days\", \"div\", \"compare\");\n\t\t\t\t}\n\t\t\t\tif(stats.std_deviation) {\n\t\t\t\t\ttip += wrap_html(\"Std. Dev.: \" + stats.std_deviation.toFixed(0) + \" days\", \"div\", \"compare\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttip = event_powertip(e, {total:0});\n\t\t\t}\n\t\t\tif(has.percentiles) {\n\t\t\t\tcells.push(percentiles ? {\n\t\t\t\t\t'class': 'average',\n\t\t\t\t\tpowertip: tip,\n\t\t\t\t\ttext : wrap_html(percentiles[\"25.0\"].toFixed(0), \"div\", \"value\") +\n\t\t\t\t\t\twrap_html(\"days 25th\", \"span\", \"msg\"),\n\t\t\t\t} : {'class':'average', text:\"-\"});\n\t\t\t}\n\t\t\tcells.push({\n\t\t\t\t'class': 'average',\n\t\t\t\ttext : timing_html,\n\t\t\t\texists : stats.count,\n\t\t\t\tpowertip: tip\n\t\t\t});\n\t\t\tif(has.percentiles) {\n\t\t\t\tcells.push(percentiles ? {\n\t\t\t\t\t'class': 'average',\n\t\t\t\t\tpowertip: tip,\n\t\t\t\t\ttext : wrap_html(percentiles[\"75.0\"].toFixed(0), \"div\", \"value\") +\n\t\t\t\t\t\twrap_html(\"days 75th\", \"span\", \"msg\"),\n\t\t\t\t} : {'class':'average', text:\"-\"});\n\t\t\t}\n\t\t\treturn cells;\n\t\t},\n\t\tget_export_columns : function () {\n\t\t var cols = [\n\t\t \t\"Orders\", \"Cases with Order\",\n\t\t\t\ttiming_name + \" Num Motions\",\n\t\t \ttiming_name + \" Avg Days\",\n\t\t\t\ttiming_name + \" Min Days\",\n\t\t\t\ttiming_name + \" Max Days\"];\n\t\t if(has.percentiles) {\n\t\t \tcols.push(\"25th Perc.\");\n\t\t\t\tcols.push(\"75th Perc.\");\n\t\t\t}\n\t\t return cols;\n\t\t},\n\t\tget_export_cells : function get_export_cells(e_ag) {\n\t\t\tvar order_count = e_ag.doc_count || 0;\n\t\t\tvar case_count = e_ag.cases ? e_ag.cases.doc_count : '';\n\n\t\t\tvar stats = e_ag.timing_stats;\n\t\t\tvar cells = [order_count, case_count, stats.count, stats.avg, stats.min, stats.max];\n\t\t\tif(has.percentiles) {\n\t\t\t\tvar percentiles = e_ag.timing_percentiles && e_ag.timing_percentiles.values;\n\t\t\t\tcells.push(percentiles[\"25.0\"]);\n\t\t\t\tcells.push(percentiles[\"75.0\"]);\n\t\t\t}\n\t\t\treturn cells;\n\t\t}\n\t}\n}\n/**\n * Convert a parser info structure into an event structure that can be fed into\n * default_bar_table_options, and then eventually into the bar table.\n * Provides a higher level interface than going into the bar table itself.\n **/\nfunction _identifier_info_to_event(identifier_info, types) {\n var p = identifier_info;\n if(types) {\n console.warn(\"Nothing really implemented with types.\");\n }\n var key = (types && types.length == 1 ? types[0] : \"\") + \"_\" + p.identifier;\n return [{\n // User readable name of the parser aggretaion.\n name: p.name,\n type : \"motion\",\n identifier : p.identifier,\n // The key into the aggregation results so we can find the data.\n key: \"motion_\" + p.identifier,\n // Not sure about this one.\n full: p.name,\n // Use the full name even for the abbreviation.\n abrev: p.abrev || p.name,\n // Rate name is used in sentences like \"The [__] rate is 32%.\"\n rate_name: p.name,\n\t\tcustom_columns : get_identifier_bar_table_info,\n show_rate: false,\n // TODO: To get clicking to work, we need to refactor all of the\n // query_type / click_type code.\n query_type: p.identifier,\n is_parser: true,\n days_from_name: \"Case Filing\",\n },{\n // User readable name of the parser aggregation.\n name: p.name,\n type : \"order\",\n identifier : p.identifier,\n // The key into the aggregation results, so we can find the data.\n key: \"order_\" + p.identifier,\n // Not sure about this one.\n full: \"Order on \" + p.name,\n // Abbrevited name of the aggregation.\n abrev: (p.abrev || p.name_display || p.name) + \" Order\",\n // Rate name is used in sentences like \"The [__] rate is 32%.\"\n rate_name: p.name,\n custom_columns : get_identifier_bar_table_info,\n show_rate: false,\n show_outcome: true,\n map_outcome : function (k) {\n return capitalize(k);\n },\n // TODO: To get clicking to work, we need to refactor all of the\n // query_type / click_type code.\n query_type: p.identifier,\n is_parser: true,\n days_from_name: \"Case Filing\",\n }];\n}\nfunction _identifier_list_to_event_list(identifier_infos, types) {\n return identifier_infos.map(function (info) {\n return _identifier_info_to_event(info, types);\n }).flat();\n}\n\n/**\n * Create a common powertip for a given set of entities.\n * @param entity_name The entity being counted.\n * @param entities Aggregation of entities.\n * @param case_s The types of things being counted, cases, orders, etc.\n * @returns {string}\n */\nfunction top_entities_powertip(entity_name, entities, case_s) {\n\tif(!case_s) {\n\t\tcase_s = case_str.toLowerCase();\n\t}\n\tvar lis = entities.map(function (l, i) {\n\t\tif(!l.doc_count) {\n\t\t\treturn \"\";\n\t\t}\n\t\tvar val = wrap_html(number_with_commas(l.doc_count), \"span\", \"value\") +\n\t\t\tplural(l.doc_count, \" \" + case_s);\n\t\treturn wrap_html(wrap_html(l.key, \"span\", \"key\") + \": \" + val, \"li\");\n\t});\n\t// Use the xval and yval which has better CSS styling.\n\treturn wrap_html(entity_name, \"div\", \"xval\") +\n\t\twrap_html(lis.join(\"\"), \"ul\", \"yval\");\n}\n\nfunction get_default_case_str(agg_info, has) {\n\tif(has.identifier && (!agg_info.case_str || agg_info.case_str == case_str)) {\n\t\treturn \"Order\";\n\t} else {\n\t\treturn agg_info.case_str || case_str || \"Case\";\n\t}\n}\n\n\n/**\n * Generate a list of top anything. The anything must be a field in the top\n * level mapping of the index. Allowed agg_info options:\n * \tcase_str\tWhat to call the cases (e.g., case, proceeding, etc.)\n * \tevents\t\tA list of case event dictionaries in the table.\n *\tmid_columns\tAny additional columns to put into the table.\n *\n * @param filter_term The filter that you are using.\n * @param top_class Optional class used for custom styling.\n * @param table_class Optional class used for\n * @param allow a dictionary in the form {\n * gender:bool, // Add a gender analytics checkbox.\n * top_parties:bool, // Add a top parties checkbox\n * top_firms:bool // Add a top law firms checkbox.\n * }\n */\nfunction render_top_terms(obj_id, agg_info, agg_name, agg,\n filter_term, top_class, table_class, profile_name,\n suggest_term, suggest_title, val_to_query,\n allow) {\n\tif(!top_class) {\n\t\ttop_class = \"top_entities\";\n\t}\n\tif(!table_class) {\n\t\ttable_class = \"entities_full\";\n\t}\n // Default settings for the special checkboxes.\n\tif(!allow) { allow = {} }\n\tif(allow.gender === undefined) { allow.gender = true; }\n\tif(allow.top_parties === undefined) { allow.top_parties = true; }\n\tif(allow.top_firms === undefined) { allow.top_firms = true; }\n\n // Create copies of the array so we don't change it.\n\tvar mid_columns = (agg_info.mid_columns || []).slice(0);\n\tvar events = (agg_info.events || []).slice(0);\n\n\tvar $obj = $(\"#\" + obj_id).addClass(top_class);\n\tif(_render_no_cases(agg, $obj)) {\n\t\treturn;\n\t}\n\n var identifier_viewargs = _get_viewargs_identifiers();\n\tvar viewargs = get_viewargs_obj();\n // Look at the first bucket to see what aggregations we have selected.\n var b1 = agg.buckets && agg.buckets.length ? agg.buckets[0] : {};\n var has = {\n gender: (b1.male || b1.female || b1.unknown) ? true:false,\n top_parties: b1.Parties ? true:false,\n top_firms: b1.Firms ? true:false,\n identifier: identifier_viewargs && identifier_viewargs.identifiers &&\n identifier_viewargs.identifiers.length > 0,\n unknown_outcomes : viewargs.unknown_outcomes == undefined,\n\t\tinclude_percentiles : viewargs.include_percentiles,\n };\n var case_str = get_default_case_str(agg_info, has);\n\tvar check_options = [];\n\tif(allow.top_parties || has.top_parties) {\n\t check_options.push([\"Show Parties\", has.top_parties, \"max_parties\", 3]);\n }\n\tif(allow.top_firms || has.top_firms) {\n\t check_options.push([\"Show Firms\", has.top_firms, \"max_firms\", 3]);\n }\n\tif(allow.gender || has.gender) {\n // Show gender analytics option link.\n var gender_desc = filter_term && filter_term.startsWith(\"judge\") ?\n \"Show Attorney Gender\" : \"Show Law Firm Gender\";\n check_options.push([gender_desc, has.gender, \"gender\", \"true\", law_firm_gender_tip()]);\n }\n\tif(has.identifier) {\n\t\tcheck_options.push([\"Show Unknown Outcomes\", has.unknown_outcomes,\n\t\t\t\"unknown_outcomes\", null, unknown_outcome_tip()]);\n\t\tcheck_options.push([\"Show Percentiles\", has.include_percentiles,\n\t\t\t\"include_percentiles\", \"true\", \"Show 25th and 75th percentile.\"]);\n\t}\n\n\tvar $check_options = get_checkbox_viewargs_row(check_options, obj_id);\n\n\t// Add the dropdown too.\n\tif(has.identifier) {\n\t var $timing_dropdown = parser_stats_utils.stats_row_timing_type_dropdown(viewargs.stats_row_timing_type);\n\t $check_options.append($timing_dropdown)\n }\n\n\t$obj.find(\".graph_title\").append(\"
    Export
    \")\n\t\t\t.append($check_options).end()\n\t\t.append(\"
    \")\n\t\t.find(\".\" + table_class + \" .table\");\n\n\t// Render two tables of top parties\n\tif(suggest_term) {\n\t\t$obj.find(\".graph_title\")\n\t\t\t\t.append(suggest_bar_html(suggest_title || \"Search\"));\n\t\tsuggest_bar_setup($obj, suggest_term);\n\t} else {\n\t\t$obj.find(\".graph_title\").addClass(\"no_suggest\");\n\t}\n\n\t// Top clients take a while to calculate and are not always available.\n\tif(has.top_parties) {\n\t\t// Implment the top clients as a mid column. Concat so we don't mutate.\n\t\tmid_columns = mid_columns.concat([{\n\t\t\theader : \"Top Parties\",\n\t\t\tget_row : function(b) {\n\t\t\t\t// Get the top clients.\n\t\t\t\tvar parties = b.Parties && b.Parties.buckets ?\n\t\t\t\t\tb.Parties.buckets.slice(0, 10) : [];\n\t\t\t\t// Sort by the number of cases, not # of representations.\n\t\t\t\tsortByKey(parties, function (p) { return p.doc_count}, true);\n\t\t\t\treturn {\n\t\t\t\t\tlist : parties,\n\t\t\t\t\t'class':'list',\n\t\t\t\t\tpowertip: top_entities_powertip(\"Clients\", parties, case_str)\n\t\t\t\t};\n\t\t\t},\n\t\t\tget_key : function (b) {\n\t\t\t\tvar party = b.Parties && b.Parties.buckets ?\n\t\t\t\t\tb.Parties.buckets[0] : null;\n\t\t\t\treturn party ? party.key : '';\n\t\t\t}\n\n\t\t}]);\n\t}\n\tif(has.top_firms) {\n\t\t// Implment the top clients as a mid column. Concat so we don't mutate.\n\t\tmid_columns = mid_columns.concat([{\n\t\t\theader : \"Top Firms\",\n\t\t\tget_row : function(b) {\n\t\t\t\t// Get the top clients.\n\t\t\t\tvar firms = b.Firms && b.Firms.buckets ?\n\t\t\t\t\tcorrect_edit_distance_subbuckets(\n\t\t\t\t\t\tb.Firms.buckets).slice(0, 10) : [];\n\t\t\t\t// Sort by the number of cases, not # of representations.\n\t\t\t\tsortByKey(firms, function (p) { return p.doc_count}, true);\n\t\t\t\treturn {\n\t\t\t\t\tlist : firms,\n\t\t\t\t\t'class':'list',\n\t\t\t\t\tpowertip: top_entities_powertip(\"Firms\", firms, case_str)\n\t\t\t\t};\n\t\t\t},\n\t\t\tget_key : function (b) {\n\t\t\t\tvar party = b.Firms && b.Firms.buckets ?\n\t\t\t\t\tb.Firms.buckets[0] : null;\n\t\t\t\treturn party ? party.key : '';\n\t\t\t}\n\t\t}]);\n\t}\n\tif(has.identifier && identifier_viewargs.identifier_list) {\n // Get all of the information on the active identifiers\n\t var active_identifier_info = identifier_viewargs.identifier_list.filter(function f_id(info) {\n return identifier_viewargs.identifiers.indexOf(info.identifier) != -1;\n });\n\t events = events.concat(_identifier_list_to_event_list(active_identifier_info, identifier_viewargs.types));\n }\n\tfunction bucket_to_url(b) {\n\t\t var filter_val = val_to_query ? val_to_query(b.key) : b.key;\n\t return \"#\" + get_filtered_view_url(filter_term,\n\t\t\tfilter_val, profile_name, [\"max_entities=20\"]);\n\t}\n\tvar options = default_bar_table_options($obj, case_str, agg.buckets,\n\t\tmid_columns, events, bucket_to_url);\n\toptions.sort = function (name) {\n\t\tvar sorter = get_sort_func(name, plural(2, case_str), mid_columns,\n\t\t\tevents, false);\n\t\tif(!sorter.get_key) {\n\t\t\tshow_error_usermsg(\"Cannot currently sort by: \" + name)\n\t\t} else {\n\t\t\tsortByKey(agg.buckets, sorter.get_key, sorter.reverse);\n\t\t}\n\t};\n\toptions.clicked = profile_name ? function (row, key, event) {\n\t var new_hash = bucket_to_url(agg.buckets[row]);\n\t\tif(window.location.hash == new_hash) {\n\t\t\tshow_error_usermsg(\"Already viewing \" + agg.buckets[row].key);\n\t\t} else {\n\t\t\topen_url(new_hash, true);\n\t\t}\n\t} : null;\n\tsetup_bar_table(options);\n}\n\n/**\n * Generate a list of top judges. Allowed agg_info options:\n * \tcase_str\tWhat to call the cases (e.g., case, proceeding, etc.)\n * \tevents\t\tA list of case event dictionaries in the table.\n *\tmid_columns\tAny additional columns to put into the table.\n */\nfunction render_top_judges(obj_id, agg_info, agg_name, agg) {\n\t// Use our generic \"top\" list generator.\n\trender_top_terms(obj_id, agg_info, agg_name, agg,\n\t\t// Add Judge specific options.\n\t\t\"judge_exact\", \"top_judges\", \"judges_full\", \"judge_profile\",\n\t\t\"judge\", \"Search for a Judge\");\n}\n\nfunction render_top_case_types(obj_id, agg_info, agg_name, agg) {\n\t// Use our generic \"top\" list generator.\n\trender_top_terms(obj_id, agg_info, agg_name, agg,\n 'fact', // filter_term\n null, // top_class: for custom css styling\n null, // table_class: for custom css styling\n \"case_type_profile\", // has_profile: If the user can click on it.\n null, // suggest_term\n null, // suggest_title\n function _(v) { // val_to_query\n\t return 'type:\"Case Type\" value:(\"' + v + '\")'\n }\n );\n}\nfunction render_top_classes(obj_id, agg_info, agg_name, agg) {\n\t// Use our generic \"top\" list generator.\n\trender_top_terms(obj_id, agg_info, agg_name, agg,\n 'fact', // filter_term\n null, // top_class: for custom css styling\n null, // table_class: for custom css styling\n \"classes_profile\", // has_profile: If the user can click on it.\n null, // suggest_term\n null, // suggest_title\n function _(v) { // val_to_query\n\t return 'type:\"Class\" value:(\"' + v + '\")'\n }\n );\n}\n\nfunction render_top_roles(obj_id, agg_info, agg_name, agg) {\n\t// Use our generic \"top\" list generator.\n\trender_top_terms(obj_id, agg_info, agg_name, agg,\n 'party.type', // filter_term\n null, // top_class: for custom css styling\n null, // table_class: for custom css styling\n null, // has_profile: If the user can click on it.\n null, // suggest_term\n null, // suggest_title\n function _(v) { // val_to_query\n\t return 'party:(type:(\"' + v + '\")'\n }\n );\n}\n\nfunction render_top_courts(obj_id, agg_info, agg_name, agg) {\n\t// Use our generic \"top\" list generator.\n\trender_top_terms(obj_id, agg_info, agg_name, agg, \"court_exact\",\n\t\tnull, null, \"court_profile\");\n}\n\nfunction render_top_tags(obj_id, agg_info, agg_name, agg) {\n\t// Use our generic \"top\" list generator.\n\trender_top_terms(obj_id, agg_info, agg_name, agg, \"tag_exact\",\n\t\tnull, null, \"tags_profile\");\n}\nfunction render_top_patents(obj_id, agg_info, agg_name, agg) {\n render_top_terms(obj_id, agg_info, agg_name, agg,\n 'patent', // filter_term\n null, // top_class: for custom css styling\n null, // table_class: for custom css styling\n \"patent_profile\", // has_profile: If the user can click on it.\n \"patent\", // suggest_term\n null, // suggest_title\n null, // val_to_query\n {gender:false, top_parties:true, top_firms:true}\n );\n}\n\n/**\n * Generate a list of top parties. Allowed agg_info options:\n *\tset_roles The roles of the parties that should be analyzed.\n * \tcase_str\tWhat to call the cases (e.g., case, proceeding, etc.)\n * \tevents\t\tA list of case event dictionaries in the table.\n *\tmid_columns\tAny additional columns to put into the table.\n */\nfunction render_top_parties(obj_id, agg_info, agg_name, agg) {\n\tvar events = agg_info.events || [];\n\tvar mid_columns = agg_info.mid_columns || [];\n\t// What type of profile should we link to when the user clicks on a link.\n\tvar profile_agg = agg_info.profile_agg || \"party_profile\";\n\n\tvar $obj = $(\"#\" + obj_id).addClass(\"top_parties\");\n\tif(_render_no_cases(agg, $obj)) {\n\t\treturn;\n\t}\n\tvar buckets = agg.buckets;\n var viewargs = get_viewargs_obj();\n var identifier_viewargs = _get_viewargs_identifiers();\n\t// Figure out what features we will show:\n\tvar has = {\n\t // Column on list of top firms.\n\t top_firms : (buckets || []).some(function (b) {\n return b.Law_Firms && b.Law_Firms.buckets && b.Law_Firms.buckets.length;\n }),\n // Gender analytics column\n gender : (buckets || []).some(function (b) {\n return b.male || b.female || b.unknown;\n }),\n // Party roles column\n proles : !viewargs.party_type_exact &&\n buckets.some(function (b) { return b.Party_Roles; }),\n // Top case types column\n casetype : buckets.some(function (b) { return b.Case_Type; }),\n // Identifier column\n identifier: identifier_viewargs && identifier_viewargs.identifiers &&\n identifier_viewargs.identifiers.length > 0,\n unknown_outcomes : viewargs.unknown_outcomes == undefined,\n };\n\tvar case_str = get_default_case_str(agg_info, has);\n var set_roles = agg_info.set_roles;\n\tif(!set_roles || !set_roles.length) {\n\t // Generate the roles from the buckets.\n var set_roles_dict = {};\n buckets.forEach(function (b) {\n (b.Party_Roles.buckets || []).forEach(function (r){\n set_roles_dict[r.key] = true;\n });\n });\n set_roles = [];\n for(var r_k in set_roles_dict) {\n set_roles.push(r_k);\n }\n }\n\tvar check_options = [[\"Show Firms\", has.top_firms, \"max_firms\", 3],\n\t\t[\"Show Law Firm Gender\", has.gender, \"gender\", \"true\", law_firm_gender_tip()]];\n\n\tif(has.identifier) {\n\t check_options.push([\"Show Unknown Outcomes\", has.unknown_outcomes,\n \"unknown_outcomes\", null, unknown_outcome_tip()]);\n }\n\n\t$obj.find(\".graph_title\")\n\t\t\t.append(get_checkbox_viewargs_row(check_options, obj_id))\n\t\t\t.append(suggest_bar_html(\"Search for a Party\"))\n\t\t\t.append(\"
    Export
    \").end()\n\t\t.append(\"
    \")\n\t\t.find(\".parties_full .table\");\n\tsuggest_bar_setup($obj, \"party\");\n\n\t// If we have Party Roles, then add it as a standard middle column.\n // If the exact party type is specified, then don't display it.\n\tmid_columns = (has.proles ? [{\n\t\theader : \"Party Type\",\n\t\tget_row : function (b) {\n\t\t\treturn get_party_percental_column(b.Party_Roles, set_roles);\n\t\t},\n\t\tget_key : function (b) {\n\t\t\treturn get_party_percental_column(b.Party_Roles, set_roles).perc;\n\t\t}\n\t}] : [])\n\t.concat(has.casetype ? [get_case_type_column()] : [])\n\t.concat(mid_columns);\n\n\tif(has.top_firms) {\n\t\tmid_columns = mid_columns.concat([{\n\t\t\theader : \"Top Law Firms\",\n\t\t\tget_row : function (b) {\n\t\t\t\tvar law_firms = b.Law_Firms && b.Law_Firms.buckets ?\n\t\t\t\t\tb.Law_Firms.buckets.slice(0, 3) : [];\n\t\t\t\treturn {\n\t\t\t\t\tlist : law_firms, 'class':'list',\n\t\t\t\t\tpowertip:top_entities_powertip(\"Law Firms\", law_firms, case_str)\n\t\t\t\t};\n\t\t\t},\n\t\t\tget_key : function(b) {\n\t\t\t\tvar law_firm = b.Law_Firms && b.Law_Firms.buckets ?\n\t\t\t\t\tb.Law_Firms.buckets[0] : null;\n\t\t\t\treturn law_firm ? law_firm.key : '';\n\t\t\t}\n\t\t}]);\n\t}\n\t// Remove events which do not exist in the data itself.\n\tevents = events.filter(function (e) {\n\t\treturn buckets && buckets.some(function(b) { return b[e.key] });\n\t});\n\n\tif(has.identifier && identifier_viewargs.identifier_list) {\n // Get all of the information on the active identifiers\n\t var active_identifier_info = identifier_viewargs.identifier_list.filter(function f_id(info) {\n return identifier_viewargs.identifiers.indexOf(info.identifier) != -1;\n });\n\t events = events.concat(_identifier_list_to_event_list(active_identifier_info, identifier_viewargs.types));\n }\n\tfunction bucket_to_url(b) {\n\t\treturn \"#\" + get_filtered_view_url(\"party_exact\",\n\t\t\t\tb.key, profile_agg, [\"party_exact-\" + b.key, \"max_entities-20\"]);\n\t}\n\tvar options = default_bar_table_options($obj, case_str, buckets,\n\t\tmid_columns, events, bucket_to_url);\n\toptions.sort = function (name) {\n\t\tvar sorter = get_sort_func(name, plural(2, case_str), mid_columns,\n\t\t\tevents, false);\n\t\tif (name =='First Firm Ascending' || name == 'First Firm Descending') {\n\t\t\tsorter.get_key = function (o) {\n\t\t\t\treturn o.Law_Firms && o.Law_Firms.buckets &&\n\t\t\t\t\to.Law_Firms.buckets.length ? o.Law_Firms.buckets[0].key : \"\";\n\t\t\t};\n\t\t\tsorter.reverse = (name === 'First Firm Descending');\n\t\t}\n\t\tsortByKey(buckets, sorter.get_key, sorter.reverse);\n\t};\n\toptions.clicked = function (row, key, event) {\n\t\tvar hash_url = bucket_to_url(buckets[row]);\n\t\tif(window.location.hash == hash_url) {\n\t\t\tshow_error_usermsg(\"Already viewing report for \" + buckets[row].key);\n\t\t} else {\n\t\t // Open in new tab\n\t\t\topen_url(hash_url, true);\n\t\t}\n\t};\n\tsetup_bar_table(options);\n}\n\n/**\n * Generate a list of top law firms. Allowed agg_info options:\n *\tset_roles The roles of the parties that should be analyzed.\n * \tcase_str\tWhat to call the cases (e.g., case, proceeding, etc.)\n * \tevents\t\tA list of case event dictionaries in the table.\n *\tmid_columns\tAny additional columns to put into the table.\n */\nfunction render_top_firms(obj_id, agg_info, agg_name, agg) {\n\tvar events = agg_info.events || [];\n\tvar mid_columns = agg_info.mid_columns || [];\n\t// This function works for attorneys as well.\n\tvar is_firm = agg_info.name.search(/Attorneys/) >= 0 ? false : true;\n\tvar non_represent = obj_id.search(\"Nonrepresent\") > -1;\n\n\tvar $obj = $(\"#\" + obj_id).addClass(is_firm ? \"top_firms\" : \"top_attorneys\")\n\t\t.addClass(\"top_entities\");\n\tif(_render_no_cases(agg, $obj)) {\n\t\treturn;\n\t}\n\tvar tclass = (is_firm ? \"firms_full\" : \"attorneys_full\");\n\tvar buckets = agg.buckets;\n\t// Figure out the party roles from the data if we weren't given one.\n\tvar set_roles = agg_info.set_roles;\n\tif(!set_roles || !set_roles.length) {\n\t // Generate the roles from the buckets.\n var set_roles_dict = {};\n buckets.forEach(function (b) {\n (b.Firm_Roles && b.Firm_Roles.buckets || []).forEach(function (r){\n set_roles_dict[r.key] = true;\n });\n });\n set_roles = [];\n for(var r_k in set_roles_dict) {\n set_roles.push(r_k);\n }\n }\n\t// Determine whether we're showing clients or firms.\n var viewargs = get_viewargs_obj();\n\tvar identifier_viewargs = _get_viewargs_identifiers();\n var has = {\n top_clients: (buckets || []).some(function (b) {\n return b.Parties && b.Parties.buckets && b.Parties.buckets.length;\n }),\n top_firms: (buckets || []).some(function (b) {\n return b.Firms && b.Firms.buckets && b.Firms.buckets.length;\n }),\n gender: (buckets || []).some(function (b) {\n return b.male || b.female || b.unknown;\n }),\n // Figure out if we have the party roles\n // If the exact party type is specified, then don't display it.\n proles: !viewargs.party_type_exact &&\n buckets.some(function (b) {\n return b.Firm_Roles;\n }),\n histogram : (buckets || []).some(function (b) {\n return b.Cases && b.Cases.Date_Histogram &&\n b.Cases.Date_Histogram.buckets &&\n b.Cases.Date_Histogram.buckets.length;\n }),\n identifier: identifier_viewargs && identifier_viewargs.identifiers &&\n identifier_viewargs.identifiers.length > 0,\n unknown_outcomes : viewargs.unknown_outcomes == undefined,\n }\n\tvar case_str = get_default_case_str(agg_info, has);\n\n\t// A top row of checkboxes.\n\tvar check_options = [[\"Show Clients\", has.top_clients, \"max_clients\", 3]];\n\tcheck_options.push(is_firm ?\n\t\t\t[\"Show Gender\", has.gender, \"gender\", \"true\", law_firm_gender_tip()]:\n\t\t\t[\"Show Firms\", has.top_firms, \"max_firms\", 3]);\n\tif(has.identifier) {\n\t check_options.push([\"Show Unknown Outcomes\", has.unknown_outcomes,\n \"unknown_outcomes\", null, unknown_outcome_tip()]);\n }\n\n\tvar explain_text = agg_info.explain ? wrap_html(agg_info.explain, \"div\", \"explain\") : null;\n\n\t// Render two tables of top parties\n\tvar $table = $obj\n\t\t.find(\".graph_title\")\n .append(explain_text)\n\t\t\t.append(get_checkbox_viewargs_row(check_options, obj_id))\n\t\t\t.append(suggest_bar_html(\"Search for \" +\n\t\t\t\t(is_firm ? \"a Law Firm\" : \"an Attorney\")))\n\t\t\t.append(\"
    Export
    \")\n\t\t.end()\n\t\t.append(\"
    \")\n\t\t.find(\".\" + tclass + \" .table\");\n\tsuggest_bar_setup($obj, is_firm ? \"firm\" : \"attorney\");\n\n\t// Handle clicking on top parties or top firms.\n\tvar case_str_plural = plural(2, case_str);\n\n\t// Add the law firm role column.\n\tmid_columns = (has.proles ? [{\n\t\theader:\"Party Type\",\n\t\trange:[0, 100],\n\t\tget_row : function (b) {\n\t\t\treturn get_party_percental_column(b.Firm_Roles, set_roles,\n\t\t\t\t\"Representing parties in \", true);\n\t\t},\n\t\tget_key : function (b) {\n\t\t\treturn get_party_percental_column(b.Firm_Roles, set_roles,\n\t\t\t\t\"Representing parties in \", true).perc;\n\t\t}\n\t}] : []).concat(mid_columns);\n\n\t// Top clients take a while to calculate and are not always available.\n\tif(has.top_clients) {\n\t\t// Implment the top clients as a mid column. Concat so we don't mutate.\n\t\tmid_columns = mid_columns.concat([{\n\t\t\theader : \"Top Clients\",\n\t\t\tget_row : function(b) {\n\t\t\t\t// Get the top clients.\n\t\t\t\tvar parties = b.Parties && b.Parties.buckets ?\n\t\t\t\t\tb.Parties.buckets.slice(0, 3) : [];\n\t\t\t\t// Sort by the number of cases, not # of representations.\n\t\t\t\tsortByKey(parties, function (p) { return p.doc_count}, true);\n\t\t\t\treturn {\n\t\t\t\t\tlist : parties,\n\t\t\t\t\t'class':'list',\n\t\t\t\t\tpowertip: top_entities_powertip(\"Clients\", parties, case_str)\n\t\t\t\t};\n\t\t\t},\n\t\t\tget_key : function (b) {\n\t\t\t\tvar party = b.Parties && b.Parties.buckets ?\n\t\t\t\t\tb.Parties.buckets[0] : null;\n\t\t\t\treturn party ? party.key : '';\n\t\t\t}\n\n\t\t}]);\n\t}\n\tif(has.top_firms) {\n\t\t// Implment the top clients as a mid column. Concat so we don't mutate.\n\t\tmid_columns = mid_columns.concat([{\n\t\t\theader : \"Top Firms\",\n\t\t\tget_row : function(b) {\n\t\t\t\t// Get the top clients.\n\t\t\t\tvar firms = b.Firms && b.Firms.buckets ?\n\t\t\t\t\tcorrect_edit_distance_subbuckets(\n\t\t\t\t\t\tb.Firms.buckets).slice(0, 3) : [];\n\t\t\t\t// Sort by the number of cases, not # of representations.\n\t\t\t\tsortByKey(firms, function (p) { return p.doc_count}, true);\n\t\t\t\treturn {\n\t\t\t\t\tlist : firms,\n\t\t\t\t\t'class':'list',\n\t\t\t\t\tpowertip: top_entities_powertip(\"Firms\", firms, case_str)\n\t\t\t\t};\n\t\t\t},\n\t\t\tget_key : function (b) {\n\t\t\t\tvar party = b.Firms && b.Firms.buckets ?\n\t\t\t\t\tb.Firms.buckets[0] : null;\n\t\t\t\treturn party ? party.key : '';\n\t\t\t}\n\t\t}]);\n\t}\n\tif(has.histogram) {\n\t\tmid_columns = mid_columns.concat([{\n\t\t\theader : \"Timeline\",\n\t\t\tget_row : function(b) {\n\t\t\t\t// Get the top clients.\n\t\t\t\tvar times = b.Cases.Date_Histogram.buckets;\n\t\t\t\treturn {\n\t\t\t\t\ttimeline : times,\n\t\t\t\t\t'class':'timeline',\n\t\t\t\t\tpowertip: wrap_html(\"Timeline\", \"xval\") +\n\t\t\t\t\t\twrap_html(times.map(function (l, i) {\n\t\t\t\t\t\tif(!l.doc_count) {\n\t\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar year = (new Date(l.key)).getUTCFullYear();\n\t\t\t\t\t\treturn \"
  • \" + year + \": \" +\n\t\t\t\t\t\t\tplural_n(l.doc_count, \"case\") + \"
  • \";\n\t\t\t\t\t\t}).join(\"\"), \"ul\", \"yval\")\n\t\t\t\t};\n\t\t\t},\n\t\t\tget_key : function (b) {\n\t\t\t\tvar party = b.Firms && b.Firms.buckets ?\n\t\t\t\t\tb.Firms.buckets[0] : null;\n\t\t\t\treturn party ? party.key : '';\n\t\t\t}\n\t\t}]);\n\t}\n\t// Remove events which do not exist in the data itself.\n\tevents = events.filter(function (e) {\n\t\treturn buckets && buckets.some(function(b) { return b.Cases[e.key] });\n\t});\n\tif(has.identifier && identifier_viewargs.identifier_list) {\n // Get all of the information on the active identifiers\n\t var active_identifier_info = identifier_viewargs.identifier_list.filter(function f_id(info) {\n return identifier_viewargs.identifiers.indexOf(info.identifier) != -1;\n });\n\t events = events.concat(_identifier_list_to_event_list(active_identifier_info, identifier_viewargs.types));\n }\n\tfunction bucket_to_url(b) {\n\t\tvar k = is_firm ? \"firm_exact\" : \"attorney_exact\";\n\t\tvar profile_name = is_firm ? \"firm_profile\" : \"attorney_profile\";\n\t\treturn \"#\" + get_filtered_view_url(k,\n\t\t\t\tb.key, profile_name, [k + \"-\" + b.key, \"max_entities-20\"]);\n\t}\n\n\tvar options = default_bar_table_options($obj, case_str, buckets,\n\t\tmid_columns, events, bucket_to_url);\n\toptions.sort = function (name) {\n\t\tvar sorter = get_sort_func(name, case_str_plural, mid_columns,\n\t\t\t\tevents, true);\n\t\tif(name == 'Top Client Ascending' || name == 'Top Client Descending') {\n\t\t\t\tsorter.get_key = function (o) {\n\t\t\t\t\treturn o.Parties && o.Parties.buckets &&\n\t\t\t\t\t\to.Parties.buckets.length ? o.Parties.buckets[0].key : \"\";\n\t\t\t\t};\n\t\t\t\tsorter.reverse = name.endsWith('Descending');\n\t\t}\n\t\tsortByKey(buckets, sorter.get_key, sorter.reverse);\n\t};\n\t// This agg is sorted by number of representations, so sort to no. of cases.\n\toptions.sort('No. ' + case_str_plural + ' Descending');\n\n\toptions.clicked = function (row, key, event) {\n\t\tvar hash_url = bucket_to_url(buckets[row]);\n\t\tif(window.location.hash == hash_url) {\n\t\t\tshow_error_usermsg(\"Already viewing report for \" + buckets[row].key);\n\t\t} else {\n\t\t\topen_url(hash_url, true);\n\t\t}\n\t};\n\tif (non_represent) {\n\t options.clicked = null;\n }\n\tsetup_bar_table(options);\n}\n\nvar render_top_attorneys = render_top_firms;\n\n/**\n * Render a party profile aggregation page. Agg_info options include.\n * party_roles:\n * filing_str:\n * party_events:\n *\tname:\tThe event name.\n * rate_name: A human readable explanation of the rate an event is granted.\n *\t\tFor a motion, it should be \"Grant\", which will turn into \"Grant Rate\".\n * resulted_in: A longer narrative explaining the rate. For motions,\n *\t\tit could be \"the motion being granted.\"\n *\tpartial_granted_counts: If true, a partially granted event counts as a\n *\t\tgranted one.\n */\nfunction render_party_profile(obj_id, agg_info, agg_name, agg) {\n\tvar proles = agg_info.party_roles || [\"Plaintiff\", \"Defendant\"];\n\tvar filing_str = agg_info.filing_str;\n\tvar party_events = agg_info.party_events || [];\n\n\tvar date_filed_id = obj_id + \"_Date_Proceeding_Filed\";\n\tvar $obj = $(\"#\" + obj_id)\n\t\t.addClass(\"party_profile\").addClass(\"entity_profile\")\n\t\t.append(\"
    \");\n\n\tif (_render_no_cases(agg.Date_Proceeding_Filed, $obj)) {\n\t\treturn;\n\t}\n\t// Firm and attorney profiles needs to be unnested.\n\tvar is_firm_profile = agg_name.startsWith(\"Firm_\");\n var is_nested_profile = is_firm_profile && agg_name.startsWith(\"Attorney_\");\n var has_gender = is_firm_profile && (agg.male || agg.female || agg.unknown_gender);\n\n var check_options = [];\n if(is_firm_profile) {\n check_options = [[\"Show Law Firm Gender\", has_gender, \"gender\", \"true\", law_firm_gender_tip()]];\n $obj.find(\".graph_title\").addClass(\"no_suggest\");\n }\n $obj.find(\".graph_title\").addClass(\"no_export\").append(get_checkbox_viewargs_row(check_options, obj_id))\n\n\t// Get info on the party's role.\n\tvar role_info = get_party_percental_column(agg.Party_Roles, proles,\n\t\tis_nested_profile ? \"Representing parties in \" : null, is_nested_profile);\n\n\t// Function to get their institution / FWD rates.\n\tfunction get_rate(b, type, partial_granted_counts) {\n\t\tif(!b[type] || !b[type].doc_count) {\n\t\t\treturn {count:0, granted:0};\n\t\t}\n\t\tvar granted = get_granted_total(b[type].buckets, partial_granted_counts);\n\t\treturn {\n\t\t\tperc : granted / b[type].doc_count,\n\t\t\tcount : b[type].doc_count,\n\t\t\tgranted : granted\n\t\t}\n\t}\n\tfunction get_rate_html(b) {\n\t\t// The values may be stored in this sub-agg, which is unnested.\n\t\tvar bcount = b.Cases ? b.Cases : b;\n\t\tvar rates = party_events.map(function(pa) {\n\t\t\treturn get_rate(bcount, pa.key || pa.name.replaceAll(\" \", \"_\"),\n\t\t\t\tpa.partial_granted_counts);\n\t\t});\n\t\tvar stats = party_events.map(function(pa, i) {\n\t\t\tif(rates[i].perc == null)\n\t\t\t\treturn '';\n\t\t\treturn \"
    \" +\n (pa.rate_name||'') + \" Rate
    \" +\n widget_gauge(rates[i].perc) + \"
    \";\n\t\t}).join(\"\").strip();\n\t\tvar narrative = party_events.map(function(pa, i) {\n\t\t\tvar total = bcount[pa.key || pa.name.replaceAll(\" \", \"_\")];\n\t\t\ttotal = (total || {}).doc_count;\n\t\t\treturn total ? \"Out of \" + plural_n(total, pa.name) + \" as \" +\n\t\t\t\tb.key + \", \" + plural_have(rates[i].granted) +\n\t\t\t\t\" resulted in \" + pa.resulted_in + \". \":\n\t\t\t\t// Don't display any text if there is no data.\n\t\t\t\t\"\" /* \"No \" + plural(0, pa.name) + \" as \" + b.key + \".\" */ ;\n\t\t}).join(\" \").strip();\n\t\t// If there's no narrative or stats, don't display anything.\n\t\tif(!narrative.length && !stats.length) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn \"
    \" + b.key + \"
    \" +\n\t\t\tstats + \"
    \" + narrative + \"
    \";\n\t}\n\tif(agg.Party_Roles) {\n\t\tvar prof_sec = \"\";\n\t\tif(proles.length > 1) {\n\t\t\tprof_sec += \"
    \" +\n\t\t\t\t\"Party Preference
    \" +\n\t\t\t\t\twidget_percentage(role_info.text, role_info.perc) +\n\t\t\t\t\"
    \";\n\t\t}\n\t\tprof_sec += (agg.Party_Roles.buckets || []).map(get_rate_html).join(\"\");\n\t\t$obj.find(\".info\").append(prof_sec)\n\t\t\t.find(\".prof_sec .narrative.role_narrative\")\n\t\t\t\t.html(role_info.powertip).end();\n\t}\n\n\t// The extra aggregations.\n\tfor(const k in agg) {\n\t\tif(k == \"doc_count\" || k == \"sum_other_doc_count\" ||\n\t\t\tk == \"doc_count_error_upper_bound\" || k == \"Party_Roles\" ||\n\t\t\tk == \"Date_Proceeding_Filed\") {\n\t\t\tcontinue;\n\t\t}\n\t\tvar kagg = agg[k] ? agg[k].Cases || agg[k] : null;\n\t\tif(!kagg || !kagg.doc_count || !kagg.buckets.length) {\n\t\t\tcontinue;\n\t\t}\n\t\tvar sec_id = obj_id + \"_\" + k.replaceAll(' ', '_');\n\t\tvar sec_tit = capitalize(k.replaceAll(\"_\", \" \"));\n\t\t$obj.find(\".info\")\n\t\t\t.append(\"
    \" +\n\t\t\t\t\"
    \" + sec_tit + \" Preference
    \");\n\n\t\tfunction quote(q) {\n\t\t\treturn q.search(\" \") >= 0 ? '\"' + q + '\"' : q;\n\t\t}\n\t\tif(kagg.doc_count > 0 && kagg.buckets.length == 1) {\n\t\t\t// Don't bother with a pie chart if there's only one choice.\n\t\t\t$obj.find(\".info #\" + sec_id).append(\"
    Of \" +\n\t\t\t\t kagg.doc_count + \" \" + plural(2, case_str).toLowerCase() +\n\t\t\t\t \", all have \" + sec_tit + \" \" + kagg.buckets[0].key +\n\t\t\t\t \".
    \");\n\t\t\tcontinue;\n\t\t}\n\t\tsetup_pie_chart(2, k, kagg, \"#\" + sec_id, null,\n\t\tfunction _onClick(d, i, el) {\n\t\t\tif (!d || !d.data || !d.data.k || d.data.k == \"Other\") {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar cur = deparam_url();\n\t\t\tif(!cur.f) {\n\t\t\t\tcur.f = [];\n\t\t\t} else if (typeof cur.f == \"string\") {\n\t\t\t\tcur.f = [cur.f];\n\t\t\t}\n\t\t\t// A bit of a hack, but whatever.\n\t\t\tvar q = (k == 'tech_center') ?\n\t\t\t\tk + ':' + quote(d.data.k):\n\t\t\t\t'fact_obj:(type:(\"Case Type\") value:(' + quote(d.data.k) + '))';\n\t\t\tcur.f.push('q_' + k + '-' + q);\n\t\t\tcur['fname_' + 'q_' + k] = sec_tit + \" - \" + d.data.k;\n\t\t\treturn DOCKET_SEARCH_URL(cur);\n\t\t});\n\t\t// Provide the most common.\n\t\t$obj.find(\".info #\" + sec_id).append(\"
    Of \" +\n\t\t\t kagg.doc_count + \" \" + plural(2, case_str).toLowerCase() + \", \" +\n\t\t\t kagg.buckets[0].doc_count + \" have \" + sec_tit + \" \" +\n\t\t\t kagg.buckets[0].key + \".
    \");\n\t}\n\n\t// Add the law firm gender last, it's a bit touchy to many firms.\n if(has_gender) {\n\t var gagg = {buckets : []};\n\t var total = 0;\n\t for(var g in {male:1, female:1, unknown_gender:1}) {\n\t var val = agg && agg[g] && agg[g].value ? agg[g].value : 0;\n\t total += val;\n\t gagg.buckets.push({\n key : capitalize(g.replaceAll(\"_\", \" \")),\n doc_count : val,\n short_name : capitalize(g.split(\"_\")[0]),\n })\n }\n\t gagg.doc_count = total;\n\t if(total) {\n $obj.find(\".info\").append(\"
    \" +\n\t\t\t\t\"
    Law Firm Gender
    \" +\n \"
    Attorney gender of each notice of appearance.
    \" +\n \"
    \")\n .find('.stitle, .narrative').data(\"powertip\", law_firm_gender_tip(agg))\n .powerTip({\n smartPlacement : true,\n popupClass : 'standard_tip'\n });\n setup_pie_chart(2, \"Law Firm Gender\", gagg, \"#chart_firm_gender\", null);\n }\n }\n\n\tagg_info.filing_str = filing_str;\n // The render_new_filings function takes an optional total count and recent\n // aggregation as well as the date proceedings filed aggregation.\n var cumulative = agg.Count_Total && agg.Count_Recent ? {\n\t total : agg.Count_Total.value,\n\t totalbefore : agg.Count_Recent.value,\n\t monthsbefore : get_months_prev(3, false)\n }: null;\n\t// Render large party profile graph showing the timeline of cases.\n\trender_new_filings(date_filed_id, agg_info, agg_name,\n\t\tagg.Date_Proceeding_Filed, null, null, cumulative);\n}\n\n/**\n * Returns a function that renders a filtered aggregation using the same\n * function that renders the non-filtered agg. Basically just swaps some args.\n */\nfunction render_filtered_based_as_basic(render_basic) {\n\treturn function (obj_id, agg_info, agg_name, agg,\n\t\t\tfiltered_name, filtered_agg) {\n\t\treturn render_basic(obj_id, agg_info, agg_name, filtered_agg);\n\t}\n}\n\n// Helper functions that are used in the agg_info\nfunction keyToClass(it) {\n\treturn it.key.toString().replaceAll(\" \", \"_\");\n}\nfunction sort_grant(a,b) {\n\tvar order = {\n\t\t'granted' \t: 0,\n\t\t'granted and denied' : 1,\n\t\t'denied and granted' : 1,\n\t\t'denied'\t: 2,\n\t\t// Other types of orders\n\t\t'affirmed' : 3,\n\t\t'reversed' : 4,\n\t\t'sustained' : 5,\n\t\t'dismissed' : 6,\n\t};\n\treturn order[a.key] - order[b.key];\n}\n\n///////////////////////\n// Layout and Display Data\n// Static information that determines much of the layout and functionality of\n// each rendered aggregation.\n\nvar agg_infos = {\n\tDate_Proceeding_Filed : {\n\t\tname : \"How Busy is the Court\",\n\t\trender : render_new_filings,\n\t\trender_filtered : render_new_filings,\n\t\trender_filtered_alone : false\n\t},\n\tLaw_Firms_Representing_Top_Parties : {\n\t\tname \t: 'Top Players',\n\t\trender\t: render_filtered_top_players,\n\t\trender_filtered_alone : true\n\t},\n\tTop_Judges : {\n\t\tname \t: 'Top Judges',\n\t\trender \t: render_top_judges,\n\t\trender_filtered_alone : true\n\t},\n\tTop_Courts : {\n\t\tname \t: 'Top Courts',\n\t\trender \t: render_top_courts,\n\t\trender_filtered_alone : true\n\t},\n\tTop_Case_Types : {\n\t\tname \t: 'Top Case Types',\n\t\trender \t: render_top_case_types,\n\t\trender_filtered_alone : true\n\t},\n\tTop_Tags : {\n\t\tname \t: 'Top Case Tags',\n\t\trender \t: render_top_tags,\n\t\trender_filtered_alone : true\n\t},\n\tTop_Classes : {\n\t\tname \t: 'Top Classes',\n\t\trender \t: render_top_classes,\n\t\trender_filtered_alone : true\n\t},\n\tTop_Patents : {\n\t\tname \t: 'Top Patents',\n\t\trender \t: render_top_patents,\n\t\trender_filtered_alone : true\n\t},\n\tTop_Parties : {\n\t\tname : 'Top Parties',\n\t\trender \t: render_top_parties,\n\t\trender_filtered_alone : true\n\t},\n\tTop_Law_Firms : {\n\t\tname : 'Top Law Firms',\n\t\trender \t: render_top_firms,\n\t\trender_filtered_alone : true\n\t},\n Top_Law_Firms_Nonrepresent : {\n\t\tname : 'Top Non-Representing Law Firms',\n\t\trender \t: render_top_firms,\n\t\trender_filtered_alone : true,\n explain : 'Law firms that did not represent the ' +\n 'party. Generally, the opposing law firms.'\n\t},\n\tTop_Law_Firms_For_Entity : {\n\t\tname : 'Law Firms', // We need to use a different name.\n\t\trender \t: render_top_firms,\n\t\trender_filtered_alone : true\n\t},\n\tTop_Law_Firms_Histogram : {\n\t\tname : 'Law Firm Histogram',\n\t\trender \t: render_top_entity_histogram,\n\t\trender_filtered_alone : true\n\t},\n Top_Law_Firms_Histogram_Nonrepresent : {\n\t\tname : 'Non-Representing Law Firm Histogram',\n\t\trender \t: render_top_entity_histogram,\n\t\trender_filtered_alone : true\n\t},\n\tCase_Length_Histogram : {\n\t\tname \t: 'Case Length',\n\t\trender\t: render_case_length,\n\t\trender_filtered : render_case_length,\n\t\trender_filtered_alone : false\n\t},\n\tTop_Attorneys : {\n\t\tname : 'Top Attorneys',\n\t\trender \t: render_top_attorneys,\n\t\trender_filtered_alone : true\n\t},\n Top_Roles : {\n\t\tname : 'Top Roles',\n\t\trender \t: render_top_roles,\n\t\trender_filtered_alone : true\n\t},\n\tParty_Profile : {\n\t\tname : 'Summary',\n\t\trender \t: render_party_profile,\n\t\trender_filtered_alone : true,\n\t},\n\tFirm_Profile : {\n\t\tname : 'Summary',\n\t\trender \t: render_party_profile,\n\t\trender_filtered_alone : true,\n\t},\n\tAttorney_Profile : {\n\t\tname : 'Summary',\n\t\trender \t: render_party_profile,\n\t\trender_filtered_alone : true,\n\t},\n\t// This one is old, will be removed.\n Event_Info : { // Deprecated\n\t name : 'Event',\n\t render : render_with_identifier_dict(render_event_success_viewargs),\n // For now, no comparisons.\n render_filtered_alone : true,\n },\n\t// These are the newer ones.\n\tEvent_Info_Counts : {\n\t\tname : 'Event Counts',\n\t\trender : render_with_identifier_dict(render_event_counts_viewargs),\n // For now, no comparisons.\n render_filtered_alone : true,\n\t},\n\tEvent_Histogram : {\n\t\tname : 'Event Histogram',\n\t\trender : render_with_identifier_dict(render_date_event_histogram),\n // For now, no comparisons.\n render_filtered_alone : true,\n\t},\n\tEvent_Length_Histogram : {\n\t\tname : 'Event Histogram',\n\t\trender : render_with_identifier_dict(render_length_event_histogram),\n // For now, no comparisons.\n render_filtered_alone : true,\n\t}\n};\n\nfunction build_default_aggregations(opts) {\n\tvar events = opts.events || [];\n\tvar set_roles = opts.party_roles || stats_views_globals.party_roles || [];\n\n\t// Add the parser objects to the events array, but mark it as such.\n\tevents = events.concat((opts.parser || []).map(function(p) {\n p.is_parser = true;\n return p;\n }));\n var viewargs = get_viewargs_obj();\n\n\t// Special options just for the top entity pages and rankings.\n\tfunction _entity_opts(requires_unnest) { return {\n\t\tevents : events.map(function (e) { return {\n\t\t // Full name of the event\n\t\t\tfull: e.name,\n // Abreviated name of the event.\n\t\t\tabrev: e.abrev,\n // Show the rate that this event occurs or grants/losses (default true).\n show_rate : e.show_rate,\n show_count : e.show_count || false,\n // Show timing information about this event (default false).\n custom_columns : e.custom_columns || false,\n // Aggregation key. The fallback method seems to work.\n\t\t\tkey: e.key || e.name.replace(/\\s/ig, '_'),\n\t\t\tpartial_counts: e.partial_granted_counts,\n\t\t\tresulted_in : e.resulted_in,\n\t\t\tpowertip : e.powertip,\n\t\t}}),\n\t\tset_roles : set_roles,\n\t\tmid_columns : opts.get_mid_columns ?\n\t\t\topts.get_mid_columns(requires_unnest) : []\n\t}; }\n\n\tvar profile_options = {\n\t\tparty_events : events.map(function (e) { return {\n\t\t\tname : e.name,\n\t\t\tkey : e.key || e.name.replace(/\\s/ig, '_'),\n\t\t\trate_name : e.rate_name,\n\t\t\tresulted_in : e.resulted_in,\n\t\t\tpartial_granted_counts : e.partial_granted_counts,\n\t\t}}),\n\t};\n\n\tvar opts_no_unnest = _entity_opts(false);\n\tvar opts_unnest = _entity_opts(true);\n\tupdate_dict(agg_infos, {\n\t\t// Customize the top lists by inserting our own options.\n\t\tTop_Judges : update_dict(agg_infos.Top_Judges, opts_no_unnest),\n\t\tTop_Courts : update_dict(agg_infos.Top_Courts, opts_no_unnest),\n\t\tTop_Case_Types : update_dict(agg_infos.Top_Case_Types, opts_no_unnest),\n\t\tTop_Tags : update_dict(agg_infos.Top_Tags, opts_no_unnest),\n Top_Patents : update_dict(agg_infos.Top_Patents, opts_no_unnest),\n\t\tTop_Parties : update_dict(agg_infos.Top_Parties, opts_no_unnest),\n\t\tTop_Law_Firms : update_dict(agg_infos.Top_Law_Firms, opts_unnest),\n\t\tTop_Law_Firms_For_Entity :\n\t\t\tupdate_dict(agg_infos.Top_Law_Firms_For_Entity, opts_unnest),\n\t\tTop_Law_Firms_Histogram :\n update_dict(agg_infos.Top_Law_Firms_Histogram, opts_unnest),\n Top_Attorneys : update_dict(agg_infos.Top_Attorneys, opts_unnest),\n\n\t\t// Customize the Party profile aggregation.\n\t\tParty_Profile : update_dict(agg_infos.Party_Profile, profile_options),\n\t\tFirm_Profile : update_dict(agg_infos.Firm_Profile, profile_options),\n\t\tAttorney_Profile : update_dict(agg_infos.Attorney_Profile, profile_options),\n // Event_Info : update_dict(agg_infos.Event_Info, profile_options),\n\t});\n function _get_event_agg_info(e) {\n var outcome_stat_regex = e.outcome_stat_regex || /./;\n return {\n\t\t\tname : e.name,\n is_parser : e.is_parser,\n\t\t\tmap_name : e.map_outcome ? function (it) {\n\t\t\t\treturn e.map_outcome[it.key] || it.key;\n\t\t\t} : function(it) {\n\t\t\t return it.key;\n },\n\t\t\tmap_short_name : e.map_outcome_short ?\n function _mapped_get_short_name(it) {\n\t\t\t\t return e.map_outcome_short[it.key] || it.key;\n\t\t\t }: function _default_get_short_name(it) {\n\t\t\t return it.key;\n },\n\t\t\tsort_series \t: e.sort_series || sort_grant,\n\t\t\trender\t\t\t: render_event_success,\n\t\t\trender_filtered\t: render_filtered_event_success,\n\t\t\tclick_searches_dockets : true,\n\t\t\tclick_type\t\t: e.query_type,\n\t\t\t// Specific to render_event_success\n\t\t\tdays_from_name : e.days_from_name || case_str,\n\t\t\tdays_to_name : e.days_to_name || e.name,\n\t\t\t// Specific to patent claim analysis (so far only PTAB uses it)\n\t\t\tclaims_grant_name : e.claims_grant_name,\n\t\t\t// Special function specific to render_event_success\n\t\t\tget_stat : function (agg) {\n\t\t\t\treturn {\n\t\t\t\t\tstat : (100*this.get_stat_filtered(agg).stat\n\t\t\t\t\t\t).toFixed(0).toString() + \"%\",\n\t\t\t\t\tp : e.percent_success\n\t\t\t\t}\n\t\t\t},\n\t\t\t// Generates a percentage statistic for filtered data.\n\t\t\tget_stat_filtered : function(agg) {\n\t\t\t\tvar total = 0, total_stat = 0;\n\t\t\t\tfor(var i in agg.buckets) {\n\t\t\t\t\tvar k = agg.buckets[i].className;\n\t\t\t\t\t// Set the statistics that we are gathering.\n\t\t\t\t\tif(outcome_stat_regex.test(k))\n\t\t\t\t\t\ttotal_stat += agg.buckets[i].doc_count;\n\t\t\t\t\t// Set the total amount we're dividing it over.\n\t\t\t\t\ttotal += agg.buckets[i].doc_count;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstat \t: total ? total_stat / total : null,\n\t\t\t\t\tp \t\t: e.outcome_state_expl || \"\",\n\t\t\t\t};\n\t\t\t}\n\t\t}\n }\n\t// Now add \"event success\" aggregations for each event.\n\tevents.forEach(function (e) {\n\t\tvar key = e.key || e.name.replace(/\\s/ig, '_');\n\t\tagg_infos[key] = _get_event_agg_info(e);\n\t});\n}\n\n/**\n * Build the default aggregations, add filters, and return a view builder for the given events.\n * @param agg_events\n * @returns {function(): *}\n */\nfunction build_views_from_events(agg_events) {\n // Build the default aggreagtions\n build_default_aggregations({\n events : agg_events.map(function (ev) {\n return {\n name : ev.name,\n abrev : get_abbreviation(ev.name),\n // Events where we're only interested in the count, timing, not grant/deny.\n existence : ev.existence || false,\n map_outcome : {},\n map_outcome_short : {},\n query_type : ev.name,\n rate_name : '',\n resulted_in : ev.name,\n // abrev:'Opp.',\n // partial_granted_counts : true,\n\n days_from_name : ev.measure_from || (case_str + \" Start\"),\n days_to_name : ev.name,\n outcome_stat_regex : /granted|sustained|affirmed/,\n };\n })\n });\n // Add filters for the events.\n agg_events.forEach(function _save_event_filter_global(ev) {\n\t\t// Add a filter for the event into the global filter customizations.\n typical_analytics_filters[ev.key] = {\n title : ev.name,\n f : 'q_' + ev.key,\n choices : [\n {key:'All Cases', isdefault:true},\n {key:'With ' + ev.name, v:'event:(type:(' + ev.name + '))'},\n {key:'Without ' + ev.name, v:'not event:(type:(' + ev.name + '))'},\n ]\n };\n })\n // Return a function that builds the view infos.\n return function _build_view_infos() {\n return build_default_view_infos({\n events : agg_events.map(function (e) { return e.name; }),\n extra_filter_keys : agg_events.map(function (e) { return e.key; }),\n });\n }\n}\n\n/////\n// Static data structure that defines filters used in the sidebar.\n\n// This global variable stores all filters customizations for the analytics\n// template. It also holds event based filters, which are also defined.\nvar typical_analytics_filters = {};\nfunction add_party_type_filters(party_types, filter_dict) {\n\tif(!party_types || party_types.length <= 1) {\n\t\tif(filter_dict.party_type) {\n\t\t\tdelete filter_dict.party_type;\n\t\t}\n\t\tif(filter_dict.party_type_for_party) {\n\t\t\tdelete filter_dict.party_type_for_party;\n\t\t}\n\t\tif(filter_dict.representing_party_type) {\n\t\t\tdelete filter_dict.representing_party_type;\n\t\t}\n\t\treturn;\n\t}\n\tfilter_dict.party_type = {\n\t\ttitle : 'Filter by Party Type',\n\t\tviewargs : 'party_type_exact',\n\t\tchoices: [\n\t\t\t{key:'All Parties', isdefault:true}\n\t\t].concat(party_types.map(function (p) {\n\t\t\treturn {key:'Only ' + plural(2, p), v: p};\n\t\t}))\n\t};\n\n\tfilter_dict.party_type_for_party = {\n\t\ttitle : 'Filter Party by Type',\n\t\tviewargs: 'party_type_exact',\n\t\tchoices: [\n\t\t\t{key:'As Any Party', isdefault:true},\n\t\t].concat(party_types.map(function (p) {\n\t\t\treturn {key:'Only as ' + p, v: p};\n\t\t}))\n\t};\n\n\tfilter_dict.representing_party_type = {\n\t\ttitle : 'Filter by Representation',\n\t\tviewargs:'party_type_exact',\n\t\tchoices: [\n\t\t\t{key:'All Cases', isdefault:true},\n\t\t].concat(party_types.map(function(p) {\n\t\t\treturn { key: 'Representing ' + plural(2, p), v: p };\n\t\t}))\n\t};\n}\n// Add the default party type filters. This can be overriden, and called again\n// once we get the true Party types from the ajax call.\nadd_party_type_filters([\"Plaintiff\", \"Defendant\"], typical_analytics_filters);\n\n/**\n * Add a filter that filters a top level aggregation based on its doc_count.\n * This is a \"live\" filter, meaning it just redraws what's on the screen.\n */\nfunction add_total_cases_filter(agg_name, need_cases, case_str, filter_dict) {\n\t// Keep track of the aggregation we're filtering.\n\tvar orig_agg = null, orig_buckets = null, min, max;\n\tvar key = agg_name.replaceAll(' ', '_');\n\tvar get_count = need_cases ?\n\t\tfunction _cases(b) { return b.Cases.doc_count; }:\n\t\tfunction _no_cases(b) { return b.doc_count; };\n\n\tfunction get_agg() {\n\t\t// For this agg to work, it needs to be rendered already.\n\t\treturn get_last_render_by_agg_key(key);\n\t}\n\n\tfunction get_ranges() {\n\t\tvar agg = get_agg();\n\t\t// If the agg doesn't exist, or it hasn't changed from last time, return.\n\t\tif(!agg || !agg.buckets || orig_agg === agg) {\n\t\t\treturn;\n\t\t}\n\t\t// Save this agg, and get it's max and min values.\n\t\torig_agg = agg;\n\t\tmin = null;\n\t\tmax = null;\n\t\tfor (var i = 0; i < agg.buckets.length; i++) {\n\t\t\tvar count = get_count(agg.buckets[i]);\n\t\t\tif(min === null || count < min) { min = count; }\n\t\t\tif(max === null || count > max) { max = count; }\n\t\t}\n\t\t// Create a shallow copy of all buckets, we'll be filtering it.\n\t\torig_buckets = agg.buckets.slice();\n\t}\n\n\t// Create the new filter.\n\tfilter_dict[key + '_total_cases'] = {\n\t\ttitle : 'Filter By Total ' + plural(2, case_str),\n\t\tunit : plural(2, case_str),\n\t\trange : true,\n\t\tget_val : function (perc) {\n\t\t\tget_ranges();\n\t\t\treturn roundNumber((max - min) * perc / 100.0) + min;\n\t\t},\n\t\tfilter : function (new_min, new_max) {\n\t\t\tvar agg = get_agg();\n\t\t\t// Start with the original buckets and filter.\n\t\t\tagg.buckets = orig_buckets.filter(function (b) {\n\t\t\t\tvar count = get_count(b);\n\t\t\t\treturn new_min <= count && count <= new_max;\n\t\t\t});\n\t\t\t// Probably overkill\n\t\t\tclear_and_rerender_all();\n\t\t}\n\t};\n}\n\n/**\n * Add a filter that controls the time of an event.\n * @param agg_name\n * @param case_str\n * @param filter_dict\n */\nfunction add_time_to_event_filter(agg_name, case_str, filter_dict) {\n\t// Keep track of the aggregation we're filtering.\n\tvar orig_agg = null, min, max, ufmin, ufmax;\n\tvar key = agg_name.replaceAll(' ', '_');\n\tvar HISTOGRAM_INTERVAL_TIMING = 10; // Number of days in each bucket.\n\n\tfunction get_ranges() {\n\t\t// Get the main agg, For this agg to work, it needs to be rendered already.\n\t\tvar agg = get_last_render_by_agg_key(key);\n\n\t\t// If the agg doesn't exist, or it hasn't changed from last time, return.\n\t\tif(!agg || !agg.Days_from_Filing || orig_agg === agg) {\n\t\t\treturn;\n\t\t}\n\t\tvar i, count;\n\t\t// Save this agg, and get it's max and min values.\n\t\torig_agg = agg;\n\t\tmin = null;\n\t\tmax = null;\n\t\tfor (i = 0; i < agg.Days_from_Filing.buckets.length; i++) {\n\t\t\tcount = agg.Days_from_Filing.buckets[i].key;\n\t\t\tif(min === null || count < min) { min = count; }\n\t\t\tif(max === null || count > max) { max = count; }\n\t\t}\n\n\t\t// Get the unfiltered min, max if it exists.\n\t\tufmin = min;\n\t\tufmax = max;\n\t\tagg = get_last_render_by_agg_key(key, true);\n\t\tif(agg) {\n\t\t\tfor (i = 0; i < agg.Days_from_Filing.buckets.length; i++) {\n\t\t\t\tcount = agg.Days_from_Filing.buckets[i].key;\n\t\t\t\tif(count < ufmin) { ufmin = count; }\n\t\t\t\tif(count > ufmax) { ufmax = count; }\n\t\t\t}\n\t\t}\n\t\tufmax += HISTOGRAM_INTERVAL_TIMING - 1;\n\t\tmax += HISTOGRAM_INTERVAL_TIMING - 1;\n\t}\n\n\t// Create the new filter.\n\tfilter_dict[key + '_total_time'] = {\n\t\ttitle : 'Time to ' + agg_name,\n\t\tunit : 'Days',\n\t\trange : true,\n\t\tget_val : function (perc) {\n\t\t\tget_ranges();\n\t\t\treturn roundNumber((ufmax - ufmin) * perc / 100.0) + ufmin;\n\t\t},\n\t\tstart_perc : function () {\n\t\t\tget_ranges();\n\t\t\tif(ufmax === undefined) {\n\t\t\t\treturn [0, 100];\n\t\t\t}\n\t\t\tvar total = ufmax - ufmin;\n\t\t\treturn [100*(min-ufmin)/total, 100*(max-ufmin)/total];\n\t\t},\n\t\tfilter : function (new_min, new_max) {\n\t\t\tvar q = \"event:(type:(\" + agg_name + \") AND \" +\n\t\t\t\t\"days:[\" + new_min + \",\" + new_max + \"])\";\n\t\t\tvar qkey = \"q_Days_to_\" + agg_name;\n\t\t\tvar fname = new_min + \" to \" + new_max + ' Days to ' + agg_name;\n\n\t\t\tvar cur = deparam_url();\n\t\t\tcur.f = Array.isArray(cur.f) ? cur.f : (cur.f ? [cur.f]: []);\n\t\t\tcur.f = cur.f.filter(function (v, i) {\n\t\t\t\treturn !v.startsWith(qkey);\n\t\t\t});\n\t\t\tcur['fname_' + qkey] = fname;\n\t\t\tcur.f.push(qkey + '-' + q);\n\t\t\twindow.location.hash = \"#\" + param_query(cur);\n\t\t}\n\t};\n}\n\n/////\n// The Views Info Structure\n// Defines what aggregations we see in each view.\n\n/**\n * Builds a default gbl_view_infos structure based on the given options:\n * court_short: A short name for a court (e.g., SCOTUS)\n * \tcase_str: What to call a \"case\"\n * \tparty_roles: What parties to account for in the stats.\n *\tevents: A list of events that will be captured and displayed.\n *\textra_filter_keys: Keys to the typical_analytics_filters that should be\n *\t\tapplied to the list and profile views.\n **/\nfunction build_default_view_infos(opts) {\n\topts = opts || {};\n\tif(typeof case_str == \"undefined\") {\n\t\tcase_str = \"Case\";\n\t}\n\tvar court = \" \" + (opts.court_short || \"court\");\n\tvar default_case_str = opts.case_str || case_str;\n\tvar default_party_roles = opts.party_roles || stats_views_globals.party_roles;\n\tvar events = opts.events || [];\n\tvar extra_filter_keys = opts.extra_filter_keys || [];\n\t// Use the global filters that we will be displaying.\n\tvar analytics_filters = typical_analytics_filters;\n\n\t// If events are specified, extract their key.\n\tvar event_keys = events.map(function (e) { return e.replaceAll(\" \", \"_\"); });\n\t// The extra filters are the\n\tvar extra_filters = extra_filter_keys.map(function (k) {\n\t\tif(!analytics_filters[k]) {\n\t\t\tconsole.warn(\"No analytics filter: \" + k);\n\t\t}\n\t\treturn analytics_filters[k];\n\t}).filter(function (it) { return it; });\n\t// Add the template filters, and all the filters specified for the view.\n\tvar all_filters = template_global_filters().concat(extra_filters);\n\n\tfunction del_by_val(ar, x) {\n\t\tvar idx = ar.indexOf(x);\n\t\tif(idx != -1) ar.splice(idx, 1);\n\t}\n\n\tadd_party_type_filters(default_party_roles, analytics_filters);\n\tadd_total_cases_filter(\"Top Parties\", false, default_case_str, analytics_filters);\n\tadd_total_cases_filter(\"Top Law Firms\", true, default_case_str, analytics_filters);\n\tadd_total_cases_filter(\"Top Attorneys\", true, default_case_str, analytics_filters);\n\tadd_total_cases_filter(\"Top Judges\", false, default_case_str, analytics_filters);\n\n\tfor(var i=0; i < events.length; i++) {\n\t\tadd_time_to_event_filter(events[i], default_case_str, analytics_filters);\n\t}\n\tfunction post_process(views) {\n\t\t// When there are identifiers, remove certain views.\n\t\treturn views;\n\t}\n\t// Additional view options that can be added manually by subclasses:\n\t// \ttitle_facets: an array which signify which facets should be part of\n\t//\t\t\t\t the title of the view.\n\tvar case_str_plural = plural(2, case_str.toLowerCase());\n\tvar default_top_list_viewargs = ['max_entities-50'];\n\treturn post_process({\n\t\toverview : {\n\t\t\ttitle : \"What is happening at the \" + court + \"?\",\n\t\t\tquestion : 1,\n\t\t\tselected_tab : \"li.overview\",\n\t\t\t// The views to display\n\t\t\tviews : event_keys.length ?\n\t\t\t\t// If we have events, display them.\n\t\t\t\t['Date_Proceeding_Filed', 'Top_Case_Types'].concat(event_keys):\n\t\t\t\t// If not, settle for displaying general court info.\n\t\t\t\t['Date_Proceeding_Filed', 'Case_Length_Histogram',\n\t\t\t\t\t'Top_Courts', 'Top_Tags'],\n\t\t\tallow_identifier_views : 2,\n\t\t\tdescription : [\n\t\t\t\t'Get an overview of all activity and spot trends as they occur.'],\n\t\t\tother_filters : all_filters\n\t\t},\n\t\tchances : {\n\t\t\ttitle : \"What are my chances of winning?\",\n\t\t\tquestion : 2,\n\t\t\tviews : event_keys.concat([\n\t\t\t\t// 'Law_Firms_Representing_Top_Parties',\n\t\t\t\t'Top_Judges'\n\t\t\t]),\n\t\t\tallow_identifier_views : true,\n\t\t\tselected_tab : \"li.overview\",\n\t\t\tdescription : ['Select your judge and we’ll tell you outcomes ' +\n\t\t\t\t'based on historical trends.'],\n\t\t\tother_filters : all_filters\n\t\t},\n\t\tplayers : {\n\t\t\ttitle \t : \"Who are the major players?\",\n\t\t\tquestion : 3,\n\t\t\tviews : [\n\t\t\t\t'Law_Firms_Representing_Top_Parties',\n\t\t\t\t'Top_Attorneys',\n\t\t\t\t'Top_Judges'\n\t\t\t],\n\t\t\tselected_tab : \"li.overview\",\n\t\t\tdescription : ['View top ' + court + ' judges, parties, and law firms.'],\n\t\t\tother_filters : all_filters\n\t\t},\n\t\tend : {\n\t\t\ttitle \t: \"How do \"+ court + \" \" + case_str_plural + \" end?\",\n\t\t\tquestion : 4,\n\t\t\tviews : [\n\t\t\t\t'How_Proceedings_Terminate',\n\t\t\t],\n\t\t\tselected_tab : \"li.overview\",\n\t\t\tdescription : ['See how often ' + case_str_plural + ' settle'],\n\t\t\textra : [\n\t\t\t\t\"#party_judge_filters\",\n\t\t\t],\n\t\t\tother_filters : all_filters\n\t\t},\n\t\tstatus : {\n\t\t\ttitle \t: \"What is the status of \" + court + \" \" +\n\t\t\t\tcase_str_plural + \"?\",\n\t\t\tquestion : 5,\n\t\t\tviews : [\n\t\t\t\t'How_Proceedings_Terminate',\n\t\t\t],\n\t\t\tselected_tab : \"li.overview\",\n\t\t\tdescription : ['See how often a party or law firm wins or settles.'],\n\t\t\textra : [\n\t\t\t\t\"#party_judge_filters\",\n\t\t\t],\n\t\t\tother_filters : all_filters\n\t\t},\n\n\t\t///////////\n\t\t// Newer more generalized views.\n\t\tparties : {\n\t\t\ttitle : \"Top Parties\",\n\t\t\tviews : [\n\t\t\t\t'Top_Parties',\n\t\t\t],\n default_viewargs : default_top_list_viewargs,\n\t\t\tselected_tab : \"li:has([href='#v=parties&q='])\",\n\t\t\tother_filters : [analytics_filters.party_type]\n\t\t\t\t.concat(all_filters)\n\t\t\t\t.concat([analytics_filters.Top_Parties_total_cases])\n\t\t},\n\t\tfirms : {\n\t\t\ttitle : 'Top Law Firms',\n\t\t\tviews : [\n\t\t\t\t'Top_Law_Firms',\n\t\t\t],\n default_viewargs : default_top_list_viewargs,\n\t\t\tselected_tab : \"li:has([href='#v=firms&q='])\",\n\t\t\tother_filters : [analytics_filters.representing_party_type]\n\t\t\t\t.concat(all_filters)\n\t\t\t\t.concat([analytics_filters.Top_Law_Firms_total_cases]),\n\t\t},\n\t\tattorneys : {\n\t\t\ttitle : 'Top Attorneys',\n\t\t\tviews : [\n\t\t\t\t'Top_Attorneys',\n\t\t\t],\n default_viewargs : default_top_list_viewargs,\n\t\t\tselected_tab : \"li:has([href='#v=attorneys&q='])\",\n\t\t\tother_filters : [analytics_filters.representing_party_type]\n\t\t\t\t.concat(all_filters)\n\t\t\t\t.concat([analytics_filters.Top_Attorneys_total_cases])\n\t\t},\n\t\tjudges : {\n\t\t\ttitle : \"Top Judges\",\n\t\t\tviews : [\n\t\t\t\t'Top_Judges',\n\t\t\t],\n default_viewargs : default_top_list_viewargs,\n\t\t\tselected_tab : \"li:has([href='#v=judges&q='])\",\n\t\t\tother_filters : all_filters\n\t\t\t\t.concat([analytics_filters.Top_Judges_total_cases])\n\t\t},\n courts : {\n\t\t\ttitle : \"Top Courts\",\n\t\t\tviews : [\n\t\t\t\t'Top_Courts',\n\t\t\t],\n default_viewargs : default_top_list_viewargs,\n\t\t\tselected_tab : \"li:has([href='#v=courts&q='])\",\n\t\t\tother_filters : all_filters\n\t\t\t\t.concat([analytics_filters.Top_Courts_total_cases])\n\t\t},\n case_types : {\n\t\t\ttitle : \"Top Case Types\",\n\t\t\tviews : [\n\t\t\t\t'Top_Case_Types',\n\t\t\t],\n default_viewargs : default_top_list_viewargs,\n\t\t\tselected_tab : \"li:has([href='#v=case_types&q='])\",\n\t\t\tother_filters : all_filters\n\t\t},\n\t\tclasses : {\n\t\t\ttitle : \"Top Classes\",\n\t\t\tviews : [\n\t\t\t\t'Top_Classes',\n\t\t\t],\n default_viewargs : default_top_list_viewargs,\n\t\t\tselected_tab : \"li:has([href='#v=class&q='])\",\n\t\t\tother_filters : all_filters\n\t\t},\n\t\ttags : {\n\t\t\ttitle : \"Top Case Tags\",\n\t\t\tviews : [\n\t\t\t\t'Top_Tags',\n\t\t\t],\n default_viewargs : default_top_list_viewargs,\n\t\t\tselected_tab : \"li:has([href='#v=tags&q='])\",\n\t\t\tother_filters : all_filters\n\t\t},\n patents : {\n\t\t\ttitle : \"Top Patents\",\n\t\t\tviews : [\n\t\t\t\t'Top_Patents',\n\t\t\t],\n default_viewargs : default_top_list_viewargs,\n\t\t\tselected_tab : \"li:has([href='#v=patents&q='])\",\n\t\t\tother_filters : all_filters\n\t\t},\n event_profile : {\n\t\t views : [\n\t\t 'Event_Info_Counts',\n\t\t\t 'Event_Histogram',\n\t\t\t 'Event_Length_Histogram',\n\t\t \t // 'Event_Info', // Depreceated\n 'Top_Courts',\n 'Top_Judges',\n 'Top_Case_Types',\n 'Top_Parties',\n 'Top_Law_Firms'\n ],\n // Reduce default, there are many reports in here.\n default_viewargs : ['max_entities-10'],\n other_filters : all_filters\n },\n\t\t// Profiles of Specific Entities.\n\t\tparty_profile : {\n\t\t\ttitle : 'Party Profile',\n\t\t\tviews : [\n\t\t\t\t'Party_Profile',\n\t\t\t\t'How_Proceedings_Terminate']\n\t\t\t\t.concat(event_keys)\n\t\t\t\t.concat([\n\t\t\t\t'Top_Law_Firms_Histogram',\n\t\t\t\t'Top_Law_Firms',\n\t\t\t\t'Top_Attorneys',\n\t\t\t\t'Top_Courts',\n 'Top_Case_Types',\n\t\t\t\t'Top_Judges',\n\t\t\t\t'Top_Law_Firms_Histogram_Nonrepresent',\n\t\t\t\t'Top_Law_Firms_Nonrepresent',\n\t\t\t]),\n\t\t\tallow_identifier_views : 2,\n\t\t\tparent_view : 'parties',\n\t\t\tselected_tab : \"li:has([href='#v=parties&q='])\",\n\t\t\tother_filters : (analytics_filters.party_type_for_party ?\n [analytics_filters.party_type_for_party] : []\n ).concat(all_filters),\n\t\t\ttitle_facets : ['Party']\n\t\t},\n\t\tfirm_profile : {\n\t\t\ttitle : 'Law Firm Profile',\n\t\t\tviews : [\n\t\t\t\t'Firm_Profile',\n\t\t\t\t'Top_Parties',\n\t\t\t\t// 'Top_Roles', Not yet working perfectly.\n\t\t\t\t'Top_Attorneys',\n\t\t\t\t'How_Proceedings_Terminate'].concat(event_keys).concat([\n\t\t\t\t'Top_Courts',\n 'Top_Judges',\n 'Top_Case_Types'\n\t\t\t]),\n\t\t\tallow_identifier_views : 0,\n\t\t\tparent_view : 'firms',\n\t\t\tselected_tab : \"li:has([href='#v=firms&q='])\",\n\t\t\tother_filters : (\n\t\t\t analytics_filters.representing_party_type ?\n [analytics_filters.representing_party_type] : []\n ).concat(all_filters),\n\t\t},\n\t\tattorney_profile : {\n\t\t\ttitle : 'Attorney Profile',\n\t\t\tviews : [\n\t\t\t\t'Attorney_Profile',\n\t\t\t\t'Top_Law_Firms_For_Entity',\n\t\t\t\t'Top_Parties',\n\t\t\t\t'How_Proceedings_Terminate',\n 'Top_Case_Types',\n ].concat(event_keys).concat([\n 'Top_Courts',\n\t\t\t\t'Top_Judges'\n\t\t\t]),\n\t\t\tallow_identifier_views : 0,\n\t\t\tparent_view : 'attorneys',\n\t\t\tselected_tab : \"li:has([href='#v=attorneys&q='])\",\n\t\t\tother_filters : (\n\t\t\t analytics_filters.representing_party_type ?\n [analytics_filters.representing_party_type] : []\n ).concat(all_filters),\n\t\t},\n\t\tjudge_profile : {\n\t\t\ttitle : 'Judicial Profile',\n\t\t\tviews : ['Date_Proceeding_Filed'].concat(event_keys).concat([\n\t\t\t\t'Top_Parties',\n\t\t\t\t'How_Proceedings_Terminate',\n 'Top_Case_Types',\n 'Top_Law_Firms',\n\t\t\t\t'Top_Courts',\n\t\t\t\t'Top_Judges'\n\t\t\t]),\n\t\t\tallow_identifier_views : 1,\n\t\t\tparent_view : 'judges',\n\t\t\tselected_tab : \"li:has([href='#v=judges&q='])\",\n\t\t\tother_filters : all_filters\n\t\t\t\t.concat(event_keys.map(function(k) {\n\t\t\t\t\treturn analytics_filters[k + '_total_time'];\n\t\t\t\t}))\n\t\t},\n case_type_profile : {\n\t\t\ttitle : 'Case Type Summary',\n\t\t\tviews : ['Date_Proceeding_Filed'].concat(event_keys).concat([\n\t\t\t\t'Top_Parties',\n\t\t\t\t'How_Proceedings_Terminate',\n\t\t\t\t'Top_Law_Firms',\n\t\t\t\t'Top_Judges'\n\t\t\t]),\n\t\t\tallow_identifier_views : 1,\n\t\t\tparent_view : 'case_types',\n\t\t\tselected_tab : \"li:has([href='#v=case_type&q='])\",\n\t\t\tother_filters : all_filters\n\t\t\t\t.concat(event_keys.map(function(k) {\n\t\t\t\t\treturn analytics_filters[k + '_total_time'];\n\t\t\t\t}))\n\t\t},\n\t\tcourt_profile : {\n\t\t\ttitle : 'Court Profile',\n\t\t\tviews : ['Date_Proceeding_Filed'].concat(event_keys).concat([\n\t\t\t\t'Top_Case_Types',\n\t\t\t\t'Top_Parties',\n\t\t\t\t'Top_Law_Firms',\n\t\t\t\t'Top_Judges'\n\t\t\t]),\n\t\t\tallow_identifier_views : 1,\n\t\t\tparent_view : 'judges',\n\t\t\tselected_tab : \"li:has([href='#v=judges&q='])\",\n\t\t\tother_filters : all_filters\n\t\t\t\t.concat(event_keys.map(function(k) {\n\t\t\t\t\treturn analytics_filters[k + '_total_time'];\n\t\t\t\t}))\n\t\t},\n\t\ttags_profile : {\n\t\t title : 'Tags Profile',\n\t\t\tviews : ['Date_Proceeding_Filed'].concat(event_keys).concat([\n\t\t\t\t'Top_Parties',\n\t\t\t\t'How_Proceedings_Terminate',\n\t\t\t\t'Top_Law_Firms',\n\t\t\t\t'Top_Judges',\n 'Top_Tags'\n\t\t\t]),\n\t\t\tallow_identifier_views : 1,\n\t\t\tparent_view : 'tags',\n\t\t\tselected_tab : \"li:has([href='#v=tags&q='])\",\n\t\t\tother_filters : all_filters\n\t\t\t\t.concat(event_keys.map(function(k) {\n\t\t\t\t\treturn analytics_filters[k + '_total_time'];\n\t\t\t\t}))\n },\n patent_profile : {\n\t\t title : 'Patent Profile',\n\t\t\tviews : ['Date_Proceeding_Filed'].concat(event_keys).concat([\n\t\t\t\t'Top_Parties',\n\t\t\t\t'How_Proceedings_Terminate',\n\t\t\t\t'Top_Law_Firms',\n\t\t\t\t'Top_Judges',\n 'Top_Tags'\n\t\t\t]),\n\t\t\tallow_identifier_views : 1,\n\t\t\tparent_view : 'patents',\n\t\t\tselected_tab : \"li:has([href='#v=patents&q='])\",\n\t\t\tother_filters : all_filters\n\t\t\t\t.concat(event_keys.map(function(k) {\n\t\t\t\t\treturn analytics_filters[k + '_total_time'];\n\t\t\t\t}))\n }\n\t});\n}\n\n/**\n * Returns the global filters for the current template. Relies on a global variable.\n * @returns {*[]}\n */\nfunction template_global_filters() {\n\t// Determine which filters we are using.\n\tvar allowed_filters = stats_views_globals.template_filters;\n\tif (!allowed_filters) {\n\t\tconsole.warn(\"No global filters defined.\");\n\t\treturn [];\n\t}\n\t// Get the library of filters.\n\tconst all_filters = get_filter_library_dict();\n\t// Filter the list of filters.\n\tvar filters = [];\n\tfor (const [key, filter_func] of Object.entries(all_filters)) {\n\t\tif(allowed_filters[key]) {\n\t\t\tfilters.push(filter_func);\n\t\t}\n\t}\n\treturn filters;\n}\n\n/**\n * Return a dictionary of filter objects.\n * @returns {{}}\n */\nfunction get_filter_library_dict() {\n\tconst filters_dict = {};\n\tfilters_dict.judge = {\n\t\ttitle : 'Judge',\n\t\tf : 'q_judge',\n\t\ttext : 'Judge name / query',\n\t\tentity : 'judge',\n\t\tget_query : function _get_judge_query(v) {\n\t\t\treturn \"judge:(\" + v + \")\";\n\t\t},\n\t\tget_value : function _get_judge_value(filter){\n\t\t\tvar match = /^judge:\\((.*)\\)$/.exec(filter)\n\t\t\treturn match && match.length > 1 ? match[1] : \"\";\n\t\t}\n\t};\n\tfilters_dict.party = {\n\t\ttitle : 'Party',\n\t\tf : 'q_party',\n\t\ttext : 'Party name ...',\n\t\tentity : 'party',\n\t\tget_query : function _get_party_query(v) {\n\t\t\treturn \"party:(\" + v + \")\";\n\t\t},\n\t\tget_value : function _get_judge_value(filter){\n\t\t\tvar match = /^party:\\((.*)\\)$/.exec(filter)\n\t\t\treturn match && match.length > 1 ? match[1] : \"\";\n\t\t}\n\t};\n\tfilters_dict.firm = {\n\t\ttitle : 'Firm',\n\t\tf : 'q_firm',\n\t\ttext : 'Firm name ...',\n\t\tentity : 'firm',\n\t\tget_query : function _get_firm_query(v) {\n\t\t\treturn \"firm:(\" + v + \")\";\n\t\t},\n\t\tget_value : function _get_firm_value(filter) {\n\t\t\tvar match = /^firm:\\((.*)\\)$/.exec(filter)\n\t\t\treturn match && match.length > 1 ? match[1] : \"\";\n\t\t},\n\t\ttip :\n\t\t\twrap_html(\"Law Firm\", \"h4\") +\n\t\t\twrap_html(\"Filter motions by law firm involved in the case.\", \"p\")\n\t};\n\t// State filter still relies on the global to exist to be loaded.\n\tif(stats_views_globals.template_filters.states) {\n\t\tif(!stats_views_globals.state_names) {\n\t\t\tconsole.warn(\"No state names defined.\");\n\t\t}\n\t\tfilters_dict.states = {\n\t\t\ttitle : 'State',\n\t\t\tf : 'q_state',\n\t\t\tmultiple : true,\n\t\t\tchoices: [\n\t\t\t\t{key:'All States', isdefault:true}\n\t\t\t].concat((stats_views_globals.state_names || []).map(function _transform_state(s) {\n\t\t\t\tvar s2 = s.replaceAll('\"', \"\");\n\t\t\t\treturn { key : s2, fname : s2, v : 'court:(' + s + ')' };\n\t\t\t}))\n\t\t}\n\t}\n filters_dict.case_type = {\n\t\ttitle : 'Case Type',\n\t\tf : 'q_case_type',\n\t\t// Placeholder text.\n\t\ttext: \"Filter by case type\",\n\t\t// Convert a value into a query.\n\t\tget_query : function (v) {\n\t\t\treturn 'fact_obj:(type_exact:\"Case Type\" value:(' + v + '))';\n\t\t},\n\t\t// Convert query into the val\n\t\tget_value : function (query) {\n\t\t\treturn (query || '')\n\t\t\t\t.replace('fact_obj:(type_exact:\"Case Type\" value:(', '')\n\t\t\t\t.slice(0, -2);\n\t\t}\n\t};\n\tfilters_dict.case_tag = {\n\t\ttitle: 'Case Tag',\n\t\tf: 'q_case_tag',\n\t\t// Placeholder text.\n\t\ttext: \"Filter by case tag\",\n\t\t// Convert a value into a query.\n\t\tget_query: function (v) {\n\t\t\treturn 'fact_obj:(type_exact:Tag value:(' + v + '))';\n\t\t},\n\t\t// Convert query into the val\n\t\tget_value: function (query) {\n\t\t\treturn (query || '')\n\t\t\t\t.replace('fact_obj:(type_exact:Tag value:(', '')\n\t\t\t\t.slice(0, -2);\n\t\t}\n\t};\n filters_dict.case_status = {\n\t\ttitle: 'Case Status',\n\t\tf: 'q_case_status',\n\t\t// Placeholder text.\n\t\ttext: \"Filter by case status\",\n\t\t// Convert a value into a query.\n\t\tget_query: function (v) {\n\t\t\treturn 'status:(' + v + ')';\n\t\t},\n\t\t// Convert query into the val\n\t\tget_value: function (query) {\n\t\t\treturn (query || '').replace('status:(', '').slice(0, -2);\n\t\t}\n\t};\n filters_dict.case_patent = {\n\t\ttitle: 'Patent',\n\t\tf: 'q_patent',\n\t\t// Placeholder text.\n\t\ttext: \"Filter by patent no.\",\n\t\t// Convert a value into a query.\n\t\tget_query: function (v) {\n\t\t\treturn 'patent:(' + v + ')';\n\t\t},\n\t\t// Convert query into the val\n\t\tget_value: function (query) {\n\t\t\treturn (query || '').replace('patent:(', '').slice(0, -2);\n\t\t}\n\t};\n\tfilters_dict.free_form = {\n\t\ttitle: 'Docket Query',\n\t\tf: 'q_query_filter',\n\t\t// Placeholder text.\n\t\ttext: \"Filter by keyword or query on docket\",\n\t\t// Convert a value into a query.\n\t\tget_query: function (v) {\n\t\t\treturn v;\n\t\t},\n\t\t// Convert query into the val\n\t\tget_value: function (query) {\n\t\t\treturn query;\n\t\t}\n\t};\n\tfilters_dict.free_form_document = {\n\t\ttitle: 'Document Query',\n\t\tf: 'q_document_filter',\n\t\t// Placeholder text.\n\t\ttext: \"Query dockets by document text\",\n\t\t// Convert a value into a query.\n\t\tget_query: function (v) {\n\t\t\treturn 'documenttext:(' + v + ')';\n\t\t},\n\t\t// Convert query into the val\n\t\tget_value: function (query) {\n\t\t\treturn (query || '').replace('documenttext:(', '').slice(0, -2);\n\t\t}\n\t}\n return filters_dict\t;\n}\n\nfunction template_link_filter(params) {\n var link_filter = stats_views_globals.template_filters &&\n\t\tstats_views_globals.template_filters.link;\n if (link_filter) {\n params.f.push(\"q_analytics_court-\" + link_filter.filter);\n // Add a pretty-printed name for it.\n params.fname_q_analytics_court = link_filter.description;\n return \"/search/dockets/?\" + param_query(params);\n }\n // Use our current URL to get the search url.\n var search_url = location.pathname.replace(\n // Hardcode these special values. We can do better than this.\n /\\/(stats|analytics)\\/(Profile\\/)?/,\n // Replace with generic search path\n \"/search/\");\n if(location.pathname.search(\"/workbench/\") != -1) {\n return search_url + \"/?\" + param_query(params);\n }\n // We need to add the dockets so we don't search documents.\n return search_url + \"dockets/?\" + param_query(params);\n}\n\nfunction view_info_subtitle(view) {\n if(typeof view.subtitle != \"undefined\") {\n return view.subtitle || \"\";\n }\n return \"Question #\" + view.question;\n}\n\nfunction render_toptabs(){\n var cache_key = window.location.pathname + \"?toptabs\";\n function set_toptabs_enable(data) {\n var has_entity = {};\n var $toptabs = $(\".toptabs\");\n for(var k in data.aggs) {\n if(!k.startsWith(\"Has_\")) {\n continue;\n }\n // Get the class name from the aggregation type, this has to be\n // matched manually.\n var e_k = k.slice(4).toLowerCase();\n var disable_entity = (data.aggs[k].doc_count || 0) <= 1;\n $toptabs.find(\".\" + e_k)\n .toggleClass(\"disabled\", disable_entity)\n .data(\"powertip\", disable_entity ? \"The \" + capitalize(e_k) +\n \" tab is not available for these analytics.\": \"\")\n .powerTip({\n smartPlacement : true,\n popupClass : 'standard_tip'\n });\n\n }\n }\n\n // Get the data from the cache.\n var toptabs_data = sessionGet(cache_key);\n // If we can get it from the cache, then just process it now.\n if(toptabs_data) {\n set_toptabs_enable(toptabs_data);\n return;\n }\n var query = get_query_str();\n // We need to make a call to get it.\n get_json_results({\n\t\trequests : [{ views: [\"Has_Entities\"] , q:query}],\n\t\ton_success : function (resp) {\n\t\t // There is only one response.\n sessionSet(cache_key, resp[0], 60*5, true);\n set_toptabs_enable(resp[0]);\n }\n });\n}\n\nvar _last_render = null;\n/**\n * Set a global cache of the last_render\n * @param aggs\n * @param filtered_aggs\n * @param view\n */\nfunction set_last_render(aggs, filtered_aggs, view) {\n\t_last_render = {\n\t\taggs : aggs,\n\t\tfiltered_aggs : filtered_aggs,\n\t\tview : view\n\t};\n}\n/**\n * Return the last aggregation by key.\n * @param key The aggregation key\n * @param unfiltered If False, return the current filtered aggregation.\n * \tIf True, return the unfiltered aggregation (for overall date aggs).\n * @returns {null|*}\n */\nfunction get_last_render_by_agg_key(key, unfiltered) {\n\treturn !_last_render ? null:\n\t\tunfiltered ?\n\t\t\t// Use the unfiltered aggregation, but require a filtered.\n\t\t\t_last_render.filtered_aggs && _last_render.filtered_aggs[key] &&\n\t\t\t_last_render.aggs && _last_render.aggs[key]:\n\t\t\t// Use the last filtered agg, fallback on the unfiltered.\n\t\t\t(_last_render.filtered_aggs && _last_render.filtered_aggs[key]) ||\n\t\t\t(_last_render.aggs && _last_render.aggs[key]);\n}\n\nfunction clear_and_rerender_all() {\n\t// Clear the previous renders\n\t$(\"#charts\").empty();\n\t// Start fresh\n\tif(_last_render) {\n\t\trender_allaggs(_last_render.aggs, _last_render.filtered_aggs, _last_render.view);\n\t}\n}\n\n/**\n * Render the title name of an aggregation.\n * @param view The view info dictionary.\n * @returns {string} HTML String.\n * @private\n */\nfunction _render_agg_title_html(view) {\n\tvar title_html = '';\n\n\t// If the view has a \"question\"\n\tif(view && view.question) {\n\t\tvar url = window.location.pathname;\n\t\tvar urls_params = url_params_to_object();\n\t\tif(urls_params.code) {\n\t\t\turl += \"?code=\" + encodeURIComponent(urls_params.code);\n\t\t}\n\t\ttitle_html += \"
    All Questions → \" + \"

    \" + view_info_subtitle(view) +\n\t\t\t\"

    \";\n\t}\n\tvar q_list = query_to_list();\n\tvar title_extra = q_list.title ? \" for \" + wrap_html(q_list.title.name, \"span\",\n\t\t\"title_extra\" + (q_list.title.is_entity ? \" title_entity\" : \"\")) : \"\";\n\tif(view && view.title &&\n\t\t// Don't show the view title if there's one agg and it has the same title.\n\t\t!(view.views && view.views.length == 1 && agg_infos[view.views[0]] &&\n\t\tagg_infos[view.views[0]].name == view.title)) {\n\t\t// Check if there's punctuation at the end.\n\t\tif(\".?;:\".indexOf(view.title[view.title.length - 1]) != -1) {\n\t\t\t// Move punctuation to the end.\n\t\t\ttitle_html += \"

    \" + view.title.slice(0, -1) + title_extra +\n\t\t\t\tview.title[view.title.length - 1] + \"

    \";\n\t\t} else {\n\t\t\ttitle_html += \"

    \" + view.title + title_extra + \"

    \";\n\t\t}\n\t}\n\n\t// Show parent breadcrumbs.\n\tif(view && view.parent_view && gbl_view_infos[view.parent_view]) {\n\t\tvar parent_title = gbl_view_infos[view.parent_view].title || \"←\";\n\t\ttitle_html += \"

    \" +\n\t\t\tparent_title + \"

    \";\n\t}\n\treturn {\n\t\thtml : title_html,\n\t\textra : title_extra\n\t};\n}\n\n// Build a default gbl_view_infos structure.\nvar gbl_view_infos = null;\nfunction get_view_infos() {\n\tif(gbl_view_infos === null) {\n\t\tgbl_view_infos = build_view_infos();\n\t}\n\treturn gbl_view_infos;\n}\n\n/**\n * Return a list of visible views based on the current hash parameters.\n * In particular, the \"v\" parameter, which specifies a collection of views.\n * @param view\n * @param frag_obj\n * @returns {view: [view object], views: [sub views to be displayed]}\n */\nfunction view_info_get_views(view, frag_obj) {\n\tif(!view && frag_obj) {\n\t\tview = frag_obj.v ? (get_view_infos()[frag_obj.v] || []) : {};\n\t}\n\t// Default to the views in the view info object.\n\tvar views = view.views ||\n\t\t// Manually specified views\n\t\t(frag_obj && frag_obj.views) ||\n\t\t// Display all aggregations.\n\t\tObject.keys(agg_infos);\n\tif(typeof views === \"string\") {\n\t\tviews = [views];\n\t}\n\n\tif(views.length && view.views && view.views.length) {\n\t\tvar identifier_info = _get_viewargs_identifiers();\n\t\tif(identifier_info && identifier_info.identifiers) {\n\t\t\tfunction del_by_val(ar, x) {\n\t\t\t\tvar idx = ar.indexOf(x);\n\t\t\t\tif(idx != -1) ar.splice(idx, 1);\n\t\t\t}\n\t\t\t// Create a copy.\n\t\t\tviews = views.map(function(x) { return x; });\n\t\t\t// The date proceeding filed view can be confusing because it shows proceedings instead of motions.\n\t\t\tdel_by_val(views, 'Date_Proceeding_Filed');\n\t\t\t// Firm profiles can be confusing because they aren't necessarily the filer.\n\t\t\tdel_by_val(views, 'Firm_Profile');\n\n\t\t\tif (view.allow_identifier_views !== undefined) {\n\t\t\t\tvar position = typeof view.allow_identifier_views === \"number\"?\n\t\t\t\t\tview.allow_identifier_views: 0;\n\t\t\t\tfunction add_if_unique(x) {\n\t\t\t\t\tif(views.indexOf(x) == -1) {\n\t\t\t\t\t\t// Insert into position.\n\t\t\t\t\t\tviews.splice(position, 0, x);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tadd_if_unique('Event_Info_Counts');\n\t\t\t\tadd_if_unique('Event_Histogram');\n\t\t\t\tadd_if_unique('Event_Length_Histogram');\n\t\t\t\t// add_if_unique('Event_Info');\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {view : view, views:views};\n}\n\n/**\n * Render all of the aggregation data that we have.\n * @param aggs The incoming aggregation data.\n * @param filtered_aggs\n * @param view The view info object, specifies which aggregations to run.\n */\nfunction render_allaggs(aggs, filtered_aggs, view) {\n\tif(!aggs && !filtered_aggs) {\n\t\treturn;\n\t}\n\tif(!gbl_view_infos) {\n\t\tgbl_view_infos = build_view_infos();\n\t}\n\tif(!aggs) { aggs = {}; }\n\n\t////////\n\t// Handle the view title.\n\tvar Title = _render_agg_title_html(view);\n\tvar print_pdf = \"\";\n\tvar embed_code = \"\";\n\n\tvar $charts = $(\"#charts\");\n\n\tvar embed_tip_html = wrap_html(\"Embedded Link\", \"h4\") +\n\twrap_html(\"Generate a link to this page, sharable with users without an account.\", \"p\") +\n\twrap_html(\"You can also track page views in your user history.\", \"p\");\n\n\t$charts\n .append(\"
    \" + Title.html + embed_code + print_pdf + \"
    \")\n // Allow for special css styling when there's no view title.\n .find(\".view_title\").toggleClass(\"no_title\", Title.html.length==0).end()\n .find(\".embed_code\").click(function () {\n show_embed_page_popup($charts);\n }).data('powertip', embed_tip_html).powerTip({\n popupClass : 'small_powertip',\n placement: 'sw',\n }).end()\n\t .find(\".print_pdf\").click(function () {\n window.print();\n return false;\n }).data('powertip', 'Print this report to PDF').powerTip({\n popupClass : 'small_powertip',\n placement: 'nw',\n });\n\n\t// Change the title of the page itself.\n\tif(view && view.title) {\n\t var page_title = view.title + Title.extra;\n\t if(analytics_title.length) {\n\t page_title += \" | \" + analytics_title;\n }\n\t\t$(\"title\").text($(wrap_html(page_title)).text());\n\t}\n\n\t////////\n\t// Render the aggregations\n\tvar views_to_render = view_info_get_views(view).views;\n\n\tvar num_rendered = 0;\n\tviews_to_render.forEach(function(view_name, index) {\n\t\t// Make sure there's a definition for the view.\n\t\tif(!aggs[view_name] && (!filtered_aggs || !filtered_aggs[view_name])) {\n\t\t\treturn;\n\t\t}\n\t\t// Find the aggregation info specific to this agg\n\t\tvar info = agg_infos[view_name];\n\t\tif(!info) {\n\t\t\tconsole.log(\"Unknown analytics view: \" + view_name);\n\t\t\treturn;\n\t\t}\n\t\t// If filtered, submit an empty dictionary, otherwise null.\n\t\tvar fagg = filtered_aggs ? filtered_aggs[view_name] || {} : null;\n\t\t// Render the aggregation.\n\t\trender_agg(\"#charts\", 0, null, view_name, aggs[view_name], aggs[view_name] && aggs[view_name].doc_count,\n\t\t\tinfo, fagg);\n\t\tnum_rendered += 1;\n\t});\n\n\t///////\n\t// Add a class to allow for CSS styling based on the number of aggregations.\n $charts\n .removeClass(\"no_views_rendered\")\n .removeClass(\"one_view_rendered\")\n .removeClass(\"multiple_views_rendered\")\n .addClass(\n num_rendered == 0 ? \"no_views_rendered\":\n num_rendered == 1 ? \"one_view_rendered\":\n \"multiple_views_rendered\");\n\n\t////////\n\t// Show any other items by selector.\n\tfor(var i in (view && view.extra || [])) {\n\t\t$(view.extra[i]).show();\n\t}\n\n\t////////\n\t// Analytics Tabs\n\t$(\".toptabs\")\n\t\t.find(\".selected\").removeClass(\"selected\").end()\n\t\t.find((view && view.selected_tab) || \"\").addClass(\"selected\").end();\n\n\t////////\n\t// Save the last render so we can redo it if necessary\n\tset_last_render(aggs, filtered_aggs, view);\n}\n\n/**\n * A list of filters, generated from the query_to_list().filters function.\n * @param filters\n * @returns {string}\n */\nfunction render_filter_list(filters) {\n\t// Improve the agg title by adding the filters.\n\tvar filter_ar = filters.map(function (f) {\n\t\treturn f.remove_link ?\n\t\t\twrap_html(f.name, \"a\", \"filter remove_link\", {}, {href:\"#\"+f.remove_link}):\n\t\t\twrap_html(f.name, \"span\", \"filter\");\n\t});\n\treturn wrap_html(filter_ar.join(\" \"), \"div\", \"filter_list\");\n}\n\n/**\n * The main function that renders an individual agg.\n * There is a default rendering that is not very intelligent, but a\n * custom rendering function can be specified in agg_info.\n *\n * $appendto:\tAppend the current rending on to another DOM block.\n * cur_depth:\tThis function is recursive for default renderings. One\n *\t\t\t\tcan therefore specify which level to render this in. It is\n *\t\t\t\tgenerally used to properly size various charts.\n * parent_agg_name Used to give unique IDs when there are subaggs rendered.\n * agg_name\t\tThis agg's name.\n * agg\t\t\tThe actual data.\n * avg_doc_count eh... see below.\n * agg_info\t\tUsed to pass all of the aggregations options.\n * filtered_agg A filtered version of this aggregation.\n */\nfunction render_agg($appendto, cur_depth, parent_agg_name, agg_name, agg,\n\t\t\t\t\t\tavg_doc_count, agg_info, filtered_agg) {\n\n\tvar new_id = ((parent_agg_name ? (parent_agg_name + \"_\") : \"\") + agg_name)\n\t\t\t.replace(/[^\\w\\s\\d]/g, \"\")\n\t\t\t.replace(/\\s+/g, \"_\");\n\n\t// Convert the name to something human readable\n\tvar agg_name_title = agg_name;\n\tif(parent_agg_name) {\n\t\tagg_name_title += \" for \" + wrap_html(parent_agg_name, \"span\", \"parent_agg_name\");\n\t}\n\tagg_name_title = agg_name_title.replaceAll(\"_\", \" \");\n\n\tif(agg_info && agg_info.name) {\n\t\t// Allow the aggregation to specify the name by string or function.\n\t\tagg_name_title = typeof agg_info.name == 'function' ?\n\t\t\tagg_info.name() : agg_info.name;\n\t\t// Wrap the name in a tag in case the analytics want to change it later.\n agg_name_title = wrap_html(agg_name_title, \"span\", \"name\");\n\t}\n\n\tvar filter_name = null;\n\t// An html list of filters applied to these analytics.\n\tvar filter_list_html = '';\n var q_list = query_to_list();\n var has_remove_link = q_list.filters.filter(function (f) { return f.remove_link; }).length > 0;\n\tif(filtered_agg || (agg_info.render_filtered_alone && (q_list.title || has_remove_link))) {\n\t\t// Add the filter title to the agg title.\n if(q_list.title) {\n\t\t\tvar f_cls = \"filtered_title\" + (q_list.title.is_entity ? \" filter_entity\": \"\");\n\t\t\t// Replace ending punctuation.\n\t\t\tagg_name_title = agg_name_title.replace(/([\\?!\\.])?\\s*$/,\n ' for ' + wrap_html(q_list.title.name,\"span\", f_cls) + \"$1\");\n }\n\t\t// Improve the agg title by adding the filters.\n filter_list_html = render_filter_list(q_list.filters);\n\n\t\t// Create a detailed explanation of the filter. Treat title like a filter.\n\t\tif(q_list.title) {\n\t\t\tq_list.filters.unshift(q_list.title.name);\n\t\t}\n\t\tfilter_name = human_list(q_list.filters.map(function (f) {\n\t\t return escape_html(typeof f == \"string\" ? f : f.name);\n }), \"and\");\n\t}\n\n\t// Link to A Single View\n // Append icon and text to the \".graph_title\"\n if(agg_name && agg_name.length) {\n agg_name_title += render_link_to_view(agg_name);\n }\n\n // Filter list goes after the link to single view on a new line.\n\tagg_name_title += filter_list_html;\n\n\t// Create the new object\n\t$(\"
    \").appendTo($appendto);\n\n\t// Add the title\n\tvar htag = \"h\" + (cur_depth+2);\n\thtag = \"<\" + htag + \" class='graph_title'>\" + agg_name_title + \"\";\n\t// Only add it if there are multiple sub-aggs or we are the leaf agg\n\tif(cur_depth == 0 || (agg.buckets && agg.buckets.length))\n\t\t$(\"#\" + new_id).append(htag);\n\n\t// Transform the aggregation according to the agg_info object.\n\tif(agg_info) {\n\t\t// Set some defaults.\n\t\tif(!agg_info.map_className) {\n\t\t\tagg_info.map_className = keyToClass;\n\t\t}\n\t\tif(!agg_info.filing_str) {\n\t\t\tagg_info.filing_str = typeof(filing_str) !== \"undefined\" &&\n\t\t\t\tfiling_str ? filing_str : \"filing\";\n\t\t}\n\t\tif(!agg_info.case_str) {\n\t\t\tagg_info.case_str = typeof(case_str) !== \"undefined\" &&\n\t\t\t\tcase_str ? case_str : \"case\";\n\t\t}\n\t\tif(!agg_info.party_roles) {\n\t\t\tagg_info.party_roles = typeof(party_roles) !== \"undefined\" &&\n\t\t\t\tparty_roles ? party_roles : ['Plaintiff', 'Defendant'];\n\t\t}\n\t\t// Transform the aggregation.\n\t\ttransform_agg(agg, agg_info.filter, agg_info.map, agg_info.map_name,\n\t\t\tagg_info.map_className, agg_info.sort_series);\n\n\t\tif(filtered_agg) {\n\t\t\ttransform_agg(filtered_agg, agg_info.filter, agg_info.map,\n\t\t\t\tagg_info.map_name, agg_info.map_className, agg_info.sort_series);\n\t\t}\n\t}\n\n\t// If there's no filter func, but we're supposed to render alone, then do so.\n\tif(filtered_agg && agg_info.render_filtered_alone &&\n\t\t!agg_info.render_filtered && agg_info.render) {\n\t\tagg_info.render_filtered = render_filtered_based_as_basic(agg_info.render);\n\t}\n\n\t// If we have a custom renderer for the filtered data, then use it.\n\tif(filtered_agg && agg_info.render_filtered) {\n\t\tagg_info.render_filtered(new_id, agg_info, agg_name, agg,\n\t\t\tfilter_name, filtered_agg);\n\t\treturn;\n\t}\n\n\t// The default is to show the filtered information rather than cumulative.\n\tif(filtered_agg) {\n\t\tagg = filtered_agg;\n\t\tif(!agg.buckets || !agg.buckets.length)\n\t\t\treturn;\n\t}\n\n\t// Check if there is a custom function for rendering.\n\tif(agg_info && agg_info.render) {\n\t\tagg_info.render(new_id, agg_info, agg_name, agg);\n\t\treturn;\n\t}\n\n\t////////////////////\n\t// This is the default renderer\n\tif(agg_name.startsWith(\"Date\") && agg.depth == 1 &&\n\t\t\tagg.buckets.length > 1 && agg.buckets.length < 4) {\n\t\tvar do_stacked = false;\n\t\tvar subaggs = agg.buckets.map(_get_sub_agg_from_bucket)\n\t\tfor(var i in subaggs) {\n\t\t\tif(!subaggs[i]) {\n\t\t\t\tdo_stacked = false;\n\t\t\t\tbreak;\n\t\t\t} else if(subaggs[i].buckets.length > 1) {\n\t\t\t\tdo_stacked = true;\n\t\t\t}\n\t\t}\n\t\t// Display stacked bar chart.\n\t\tconsole.log(\" Prining stacked bar\");\n\t\tif(do_stacked) {\n\t\t\tvar xAxis = render_stacked_date_histogram(\n\t\t\t\t\t\t\tcur_depth, agg_name, agg, new_id);\n\t\t\t// Don't render the subaggs when doing a stacked chart.\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (agg.depth > 0) {\n\t\t// We make a recursive call to build this out.\n\t\tvar this_avg_doc_count = agg.doc_count / agg.buckets.length;\n\t\tfor(var i in agg.buckets) {\n\t\t\tvar bucket = agg.buckets[i];\n\t\t\tvar subaggs = [];\n\t\t\tvar key = null;\n\t\t\tvar doc_count = null;\n\t\t\tfor(var k in agg.buckets[i]) {\n\t\t\t\tif(k == 'key') {\n\t\t\t\t\tkey = agg.buckets[i][k];\n\t\t\t\t} else if (k == 'doc_count') {\n\t\t\t\t\tdoc_count = bucket[k];\n\t\t\t\t} else if (k == 'name' || k == 'className') {\n\t\t\t\t\t;\n\t\t\t\t} else {\n\t\t\t\t\tsubaggs.push(k);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor(k in subaggs) {\n\t\t\t\tvar full_sub_name = key;\n\t\t\t\tif(parent_agg_name)\n\t\t\t\t\tfull_sub_name += \" for \" + wrap_html(parent_agg_name, \"span\", \"parent_agg_name\");\n\t\t\t\tfull_sub_name = full_sub_name.toString().replaceAll(\"_\", \" \");\n\n\t\t\t\trender_agg(\"#\" + new_id, cur_depth+1, full_sub_name,\n\t\t\t\t\t\t\tsubaggs[k], bucket[subaggs[k]], this_avg_doc_count);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\tconsole.log(\"Rendering \" + agg_name_title);\n\t// Render the chart\n\tif(agg_name.startsWith(\"Date\")) {\n\t\t// Date Histogram\n\t\trender_date_histogram(cur_depth, agg_name, agg, new_id);\n\t} else if(are_agg_keys_nums(agg)) {\n\t\trender_histogram(cur_depth, agg_name, [agg], new_id);\n\t} else {\n\t\tsetup_pie_chart(cur_depth, agg_name, agg, \"#\" + new_id, avg_doc_count);\n\t}\n}\n\n/**\n * General function to change aggregation data.\n * @param agg The aggregation you want to change.\n * @param filter Filter out buckets.\n * @param map Map buckets.\n * @param map_name Set the bucket's \"name\"\n * @param map_className Set the bucket's className\n * @param sort\n */\nfunction transform_agg(agg, filter, map, map_name, map_className, sort) {\n\tif(!agg || !agg.buckets || !agg.buckets.length)\n\t\treturn;\n\n\t// Filter out all buckets that are not supposed to be here\n\tif(filter) {\n\t\tagg.buckets = agg.buckets.filter(filter);\n\n\t\t// Check out if we have anything left to render\n\t\tif(!agg.buckets || !agg.buckets.length)\n\t\t\treturn;\n\t}\n\n\t// Map the buckets, if requested.\n\tif(map) {\n\t\tagg.buckets = agg.buckets.map(map);\n\t\t// The depth of the buckets may have changed.\n\t\t// TODO: Recursively fix all of the sub agg's depths.\n\t\tvar depths = agg.buckets.map(function(it) {\n\t\t\tvar subagg = _get_sub_agg_from_bucket(it);\n\t\t\treturn subagg ? subagg.depth : 0;\n\t\t});\n\t\tagg.depth = Math.max.apply(null, depths) + 1;\n\t}\n\n\t// Add a name to the aggregation if one is defined.\n\tif(map_name) {\n\t\tfor(var a in agg.buckets) {\n\t\t\tagg.buckets[a].name = map_name(agg.buckets[a]);\n\t\t}\n\t}\n\t// Add a class name to the aggregation\n\tif(map_className) {\n\t\tfor(var a in agg.buckets) {\n\t\t\tagg.buckets[a].className = map_className(agg.buckets[a]);\n\t\t}\n\t}\n\t// Sort the series if requested\n\tif(sort) {\n\t\tagg.buckets.sort(sort);\n\t}\n}\n\n////////////////////////////\n// The Sidebar\nfunction setup_sidebar() {\n\tvar $sidebar = $(\".sidebar\");\n\tif(!$sidebar.length){\n\t\treturn;\n\t}\n\t// Initial setup of sidebar, should not be called more than once.\n\tsetup_common_sidebar($sidebar[0], $(\"#footer\")[0]);\n\n\t// Toggling the sidebar's visibility.\n\t$(\".sidebartoggle a\").click(function () {\n\t\t$(\".sidebar\").toggleClass(\"visible\");\n\t\treturn false;\n\t});\n}\n\nfunction render_sidebar_date_histogram(agg) {\n\tif(!agg) {\n\t\t$(\"#sidebar_date_histogram\").empty();\n\t\treturn;\n\t}\n\tfunction get_hash(val_min, val_max) {\n\t\tvar frag_obj = url_params_to_object(get_url_hash());\n\t\tif(!val_min && !val_max) {\n\t\t\tdelete frag_obj.date_filed_start;\n\t\t\tdelete frag_obj.date_filed_end;\n\t\t} else {\n\t\t\tfrag_obj.date_filed_start = (val_min / 1000).toFixed(0);\n\t\t\tfrag_obj.date_filed_end = (val_max / 1000).toFixed(0);\n\t\t}\n\t\treturn \"#\" + param_query(frag_obj);\n\t}\n\tfunction onClick(d) {\n\t\treturn get_hash(new Date(d.x), new Date(d.x + 31*24*3600*1000));\n\t}\n\tfunction on_slider_changed(val_min, val_max) {\n\t\tvar new_hash = get_hash(val_min, val_max);\n\t\tif(window.location.hash != new_hash) {\n\t\t\twindow.location.hash = new_hash;\n\t\t}\n\t\treturn false;\n\t}\n\t$(\"#sidebar_date_histogram\")\n\t\t.html(\"\");\n\tvar obj_id = 'sidebar_date_graph';\n\n\t// Use the standard date histogram\n\tvar xAxis = render_date_histogram(0, \"Date Histogram\", agg, obj_id, onClick,\n\t\t\"month\");\n\n\t// Add the slider underneath the graph.\n\tvar frag_obj = url_params_to_object(get_url_hash());\n\tadd_jqueryui_slider_to_graph(obj_id, xAxis,\n\t\tfrag_obj.date_filed_start ? frag_obj.date_filed_start * 1000 : null,\n\t\tfrag_obj.date_filed_end ? frag_obj.date_filed_end * 1000 : null,\n\t\ton_slider_changed);\n\n\t// Round the start and end times to nearest 100 secs to match current time.\n\tvar r_start = frag_obj.date_filed_start ?\n\t\troundNumber(frag_obj.date_filed_start / 100)*100 : null;\n\tvar r_end = frag_obj.date_filed_end ?\n\t\troundNumber(frag_obj.date_filed_end / 100)*100 : null;\n\n\tvar total_time = agg.buckets && agg.buckets.length ?\n\t\tagg.buckets[agg.buckets.length - 1].key - agg.buckets[0].key : 0;\n\n\t// Insert some more date options after.\n\t$(\"#sidebar_date_histogram .datehistogram .clear_date\")\n\t\t// The clear date filter is only shown if there a custom date is selected.\n\t\t.text(\"Custom Date Filter\").addClass(\"selected\").addClass(\"clearable\")\n\t\t.after(\"Year-To-Date\" +\n\t\t\t\t\"Last Year\" +\n\t\t\t\t\"Trailing 12 Mos.\" +\n\t\t\t\t(total_time > 5*365*24*3600*1000 ?\n\t\t\t\t\t\"Trailing 5 Years\" : \"\") +\n\t\t\t\t\"\" // \"Trailing 6 Mos.\"\n\t\t\t\t)\n\t\t.parent().find(\"> a\").each(function () {\n\t\t\tvar $this = $(this);\n\t\t\tif($this.hasClass('clear_date')) {\n\t\t\t\t// Clearing the date filters.\n\t\t\t\t$this.click(function () {\n\t\t\t\t\ton_slider_changed();\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Start off with max_val to now, and min_val to one year ago.\n\t\t\tvar max_val = new Date();\n\t\t\tvar min_val = new Date();\n\t\t\tmin_val.setUTCFullYear(min_val.getUTCFullYear() - 1);\n\t\t\tif($this.hasClass('ytd')) {\n\t\t\t\t// max_val is now, min_val is Jan 1\n\t\t\t\tmin_val.setUTCFullYear(max_val.getUTCFullYear());\n\t\t\t\tmin_val.setUTCMonth(0);\n\t\t\t\tmin_val.setUTCDate(1);\n\t\t\t} else if($this.hasClass('lastyear')) {\n\t\t\t\t// max_val is Jan 1, min_val is Jan 1 of the previous year.\n\t\t\t\tmax_val.setUTCMonth(0);\n\t\t\t\tmax_val.setUTCDate(1);\n\t\t\t\tmax_val.setUTCHours(0);\n\t\t\t\tmax_val.setUTCMinutes(0);\n\t\t\t\tmax_val.setUTCSeconds(0);\n\t\t\t\tmax_val.setUTCMilliseconds(0);\n\t\t\t\tmin_val.setUTCMonth(0);\n\t\t\t\tmin_val.setUTCDate(1);\n\t\t\t} else if($this.hasClass('trail12')) {\n\t\t\t\t; // Defaults will do.\n\t\t\t} else if($this.hasClass('trail5years')) {\n\t\t\t\t// Subtract 4 more years.\n\t\t\t\tmin_val.setUTCFullYear(min_val.getUTCFullYear() - 4);\n\t\t\t} else if($this.hasClass('trail6')) {\n\t\t\t\tmin_val.setUTCMonth(min_val.getUTCMonth() + 6)\n\t\t\t} else {\n\t\t\t\tconsole.log(\"unknown link\");\n\t\t\t}\n\t\t\tif(min_val) {\n\t\t\t\tmin_val.setUTCHours(0);\n\t\t\t\tmin_val.setUTCMinutes(0);\n\t\t\t\tmin_val.setUTCSeconds(0);\n\t\t\t\tmin_val.setUTCMilliseconds(0);\n\t\t\t}\n\t\t\tif((min_val && roundNumber(min_val.getTime()/100000)*100) == r_start &&\n\t\t\t\t(max_val && roundNumber(max_val.getTime()/100000)*100) == r_end) {\n\t\t\t\t$this.addClass(\"selected\").addClass(\"clearable\");\n\t\t\t\t// Because this one is clearable, we can remove the clear date link.\n\t\t\t\t$this.parent().find(\".clear_date\").hide();\n\t\t\t}\n\t\t\t$this.click(function () {\n\t\t\t\t$this.hasClass(\"clearable\") ?\n\t\t\t\t\ton_slider_changed():\n\t\t\t\t\ton_slider_changed(min_val, max_val);\n\t\t\t\treturn false;\n\t\t\t});\n\t});\n}\n\n/**\n * Sub-analytics can customize the filters they display on the side-bar by\n * inserting structures into the \"typical_analytics_filters\" structure.\n *\n * Each filter is in the form: {\n *\ttitle: \t The title of the filter.\n *\tf:\t\t The filter name used by the server. For generic query filters,\n * \t\t\t use q_.\n *\tchoices:[ A list of \"choices\" to choose from in the filter.\n *\t{\n *\t\tv: \t\tThe filter value\n *\t\tfname:\tThe filter value to be displayed in search results. This may\n *\t\t\t\tbe omitted if using a standard filter (i.e., not a q_ filter).\n *\t\tkey:\tThe value displayed in the side-bar. If not specified, then\n *\t\t\t\tfname will be used.\n * }, ...]\n * }\n **/\nfunction render_sidebar_other_filters(other_filters, $content_div) {\n\tif(!other_filters || !other_filters.length) {\n\t\t$(\".other_filters\").hide();\n\t\treturn;\n\t}\n\tvar url_hash = get_url_hash();\n\tvar $content = $content_div || $(\".other_filters\").show().empty();\n\tvar num_other_filters = other_filters.length;\n\tother_filters.forEach(function (of) {\n\t\tif(!of || typeof of != \"object\") {\n\t\t\tconsole.warn(\"Bad other filter: \" + of);\n\t\t\treturn;\n\t\t}\n\t\tif(of.title) {\n\t\t\t$content.append('

    ' + of.title + '

    ');\n\t\t}\n\n\t\t// Go through the \"choices\" specified in this view\n\t\tvar choice_info = (of.choices || []).map(function (choice) {\n\t\t\t// Each choice can viewargs, which narrow the specific view.\n\t\t\tvar cur_args_obj, choice_obj;\n\t\t\tif(of.viewargs) {\n\t\t\t\tcur_args_obj = get_viewargs_obj();\n\t\t\t\tchoice_obj = viewarg_to_obj(of.viewargs + \"-\" + (choice.v||''));\n\t\t\t} else if(of.f) {\n\t\t\t\tcur_args_obj = get_filter_obj(url_hash);\n\t\t\t\tchoice_obj = viewarg_to_obj(of.f + \"-\" + (choice.v||''));\n\t\t\t} else {\n\t\t\t\tconsole.log(\"Did not specify a choice\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar selected = cur_args_obj[choice_obj.k] == choice_obj.v;\n\n\t\t\t// Now setup the new hash\n\t\t\tvar cur = deparam_url(url_hash);\n\t\t\tif(!selected) {\n\t\t\t\tif(choice_obj.v && choice_obj.v.length) {\n\t\t\t\t\tcur_args_obj[choice_obj.k] = choice_obj.v;\n\t\t\t\t} else if (cur_args_obj[choice_obj.k]) {\n\t\t\t\t\tdelete cur_args_obj[choice_obj.k];\n\t\t\t\t}\n\t\t\t\tif(of.viewargs) {\n\t\t\t\t\tcur.viewargs = args_obj_to_args_ar(cur_args_obj);\n\t\t\t\t} else if(of.f) {\n\t\t\t\t\tcur.f = args_obj_to_args_ar(cur_args_obj);\n\t\t\t\t}\n\t\t\t\t// The choice can provide a name for the filter\n\t\t\t\tif(choice.fname && (of.viewargs || of.f)) {\n\t\t\t\t\tcur['fname_' + (of.viewargs || of.f)] = choice.fname;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tchoice : choice,\n\t\t\t\tselected : selected,\n\t\t\t\tlink : '#' + param_query(cur),\n\t\t\t\t// If a key is not specified, fall back on the fname\n\t\t\t\tkey : choice.key || choice.fname\n\t\t\t}\n\t\t});\n\n\t\t// Remove the empties.\n\t\tchoice_info = choice_info.filter(function (f) { return f; });\n\n var MAX_CHOICES = 7;\n\t\tvar MAX_CHOICES_FEW_FILTERS = 12;\n\n\t\t// We have a few ways of rendering.\n\t\tif(of.range) {\n // Range Sliders\n var start_perc = of.start_perc ? of.start_perc() : [0, 100];\n // A continuous range, not a set of discrete choices, use a slider.\n var $slide = $(\"
    \" +\n \"
    \" +\n (of.get_val(start_perc[0]) || '-') +\n \" to \" + (of.get_val(start_perc[1]) || '-') +\n \" \" + (of.unit || \"\") + \"
    \");\n $content.append($slide);\n\n function on_slide($slider) {\n // Set the text under the slider\n var vals = $slider.slider(\"values\").map(of.get_val);\n $slider.parent()\n .find(\".min\").text(vals[0]).end()\n .find(\".max\").text(vals[1]);\n }\n\n // The slider goes from 0% to 100%, of.get_val converts percent to value.\n $slide.find(\".slider\").slider({\n range: true,\n min: 0,\n max: 100,\n values: [start_perc[0], start_perc[1]],\n slide: function () {\n on_slide($(this));\n },\n change: function () {\n on_slide($(this));\n // Get the slider's values and issue the callback.\n var vals = $(this).slider(\"values\").map(of.get_val);\n // Do the filtering.\n of.filter(vals[0], vals[1]);\n }\n });\n } else if (of.text && (!of.get_query || ! of.get_value)) {\n console.error(\"Must set get_query and get_value\");\n\t\t} else if(of.text) {\n\t\t\tvar placeholder = of.text !== true ?\n\t\t\t\t' placeholder=\"' + of.text + '\"':'';\n\t\t\tvar cur_args_obj = get_filter_obj(url_hash);\n\t\t\tvar $input = $(\"\").change(function () {\n\t\t\t\tvar val = $(this).val();\n\t\t\t\tvar cur = deparam_url(url_hash);\n\t\t\t\tif(val) {\n\t\t\t\t\tcur_args_obj[of.f] = of.get_query(val);\n\t\t\t\t\t// Give this filter a proper title.\n\t\t\t\t\tcur['fname_' + of.f] = of.title + \": \" + val;\n\t\t\t\t} else {\n\t\t\t\t\tif(cur_args_obj[of.f]) {\n\t\t\t\t\t\tdelete cur_args_obj[of.f];\n\t\t\t\t\t}\n\t\t\t\t\tif(cur['fname_' + of.f]) {\n\t\t\t\t\t\tdelete cur['fname_' + of.f];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcur.f = args_obj_to_args_ar(cur_args_obj);\n\t\t\t\tdocument.location.hash = '#' + param_query(cur);\n\t\t\t}).val(of.get_value(cur_args_obj[of.f] || ''));\n\t\t\t$content.append($input);\n\t\t} else if(choice_info.length <= MAX_CHOICES ||\n\t\t\t\t(num_other_filters <= 4 && choice_info.length <= MAX_CHOICES_FEW_FILTERS)) {\n\t\t\t// Short List\n\t\t\t// Not too many choices, just show them.\n\t\t\t$content.append(\"\");\n\t\t} else {\n\t\t\t// Long List\n\t\t\tvar default_value = null;\n\t\t\tvar choice_options = choice_info.map(function (ci) {\n\t\t\t\tif(ci.choice.isdefault) {\n\t\t\t\t\t// Don't show the default choice.\n\t\t\t\t\tdefault_value = ci.link;\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\treturn \"\";\n\t\t\t}).join(\" \");\n\t\t\t$content\n\t\t\t\t.append(\"\")\n\t\t\t\t.find('select.tokens').tokenize({\n\t\t\t\t\tdisplayDropdownOnFocus: true,\n\t\t\t\t\tmaxElements: 1,\n\t\t\t\t\tnewElements: false,\n\t\t\t\t\tnbDropdownElements: 50,\n\t\t\t\t\tonAddToken : function (value, text, e) {\n\t\t\t\t\t\tdocument.location.hash = value;\n\t\t\t\t\t},\n\t\t\t\t\tonRemoveToken : function (value, e) {\n\t\t\t\t\t\t// Go to the default page.\n\t\t\t\t\t\tdocument.location.hash = e.select.data(\"default\");\n\t\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}\n\nvar sidebar_generation = 0;\nfunction render_sidebar_jump_to() {\n\tvar $jump_to = $(\".sidebar .jump_to\").hide();\n\tvar $charts = $(\"#charts > .chart\");\n\tvar $offsets = $charts.find(\"> .graph_title, .section\");\n\tif(!$jump_to.length || $offsets.length < 2) {\n\t\t// Don't display if there's no jump to or only one section.\n\t\treturn;\n\t}\n\n\t// We will be inserting a number of list items.\n\tvar $ul = $jump_to.show().filter(\".content\").find(\"ul\");\n\tif(!$ul.length) {\n\t\t$ul = $jump_to.show().filter(\".content\").append(\"\").find(\"ul\");\n\t}\n\t// Start fresh\n\t$ul.empty();\n\n\t// If the sidebar gets redrawn, we start a new generation.\n\tsidebar_generation += 1;\n\tvar this_sidebar_generation = sidebar_generation;\n\n\t// Go through each of the graph titles.\n\tvar offsets = $offsets.map(function () {\n\t\tvar $title = $(this);\n\t\tvar offset;\n\t\t// If the section isn't visible, but its parent is, then use the parent.\n\t\tif($title.is(\":visible\")) {\n\t\t offset = $(this).offset().top;\n\t\t} else if(!$title.is(\":visible\") && $title.parent().is(\":visible\")) {\n\t\t\toffset = $title.parent().offset().top;\n\t\t\tif(!offset) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(\"Offset section hidden\");\n\t\t\toffset = 0;\n\t\t}\n\t\t// Get the text of the title, but removing any list items within it.\n\t\tvar title_text = $title.clone()\n\t\t\t// Remove everything matching this list:\n\t\t\t.find(\".filter_list, .export, .options, .explain, .link-view, \" +\n\t\t\t\t\".suggest_search, .identifier_tip, .filtered_title, \" +\n\t\t\t\t\".view_all_stats, .motion_chooser_btn\")\n\t\t\t.remove().end().text();\n\t\t// Remove any trailing and \"for\" text.\n\t\ttitle_text = title_text.replace(/\\s+for\\s+$/ig, \"\");\n\n\t\t// Create the list item, and give it a click handler.\n\t\tvar $li = $(\"
  • \" + title_text + \"
  • \")\n\t\t\t.toggleClass(\"subsection\", $title.hasClass(\"section\"))\n\t\t\t.click(function _on_scroll_click() {\n\t\t\t\t// Scroll to the correct offset, taking into account the menu.\n\t\t\t\t$('html,body').animate({\n\t\t\t\t\tscrollTop: offset - $(\"#search_login_menu\").height()\n\t\t\t\t},'slow');\n\t\t \t\treturn false;\n\t\t\t});\n\t\t// Add the item to the list.\n\t\t$ul.append($li);\n\t\t// Return the current location of this item.\n\t\treturn { offset : offset, text : title_text, $li: $li};\n\t}).filter(function (x) { return x != null; });\n\n\t// Make sure the offsets are sorted by offset\n\tsortByKey(offsets, function (o) { return o.offset; });\n\n\t// The function that changes the side-bar jump section.\n\tfunction set_selection() {\n\t\tif (this_sidebar_generation != sidebar_generation) {\n\t\t\t// This should be un-bound, but for now just ignore.\n\t\t\treturn;\n\t\t}\n\t\t// We switch offsets when the section passes the jump-to selector.\n\t\tvar selector_offset = $jump_to.find(\"ul\").offset().top;\n\t\t// Find the first offset that's above the selector.\n\t\tfor(var i=0; i < offsets.length; i++) {\n\t\t\tif(offsets[i].offset > selector_offset) {\n\t\t\t\t// i is the first one below it, so we need to back up one.\n\t\t\t\tvar item = offsets[i ? i - 1 : 0];\n\t\t\t\t$jump_to.find(\"li.selected\").removeClass(\"selected\");\n\t\t\t\titem.$li.addClass(\"selected\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\t// Select the first item.\n\t$($ul.find(\"li\")[0]).addClass(\"selected\");\n\t$(window).scroll(debouncer(set_selection, 50));\n\tset_selection();\n}\n\n////////////////////////////\n// Ajax data loading\nfunction bind_window_events() {\n\t// Bind the window size change handler to re-rendering.\n\t$(window).bind('resize', debouncer(function () {\n\t\tif(!_last_render) {\n\t\t\treturn;\n\t\t}\n\t\t// Save the scroll height so we can set it after recreating charts.\n\t\tvar scrollX = window.scrollX;\n\t\tvar scrollY = window.scrollY;\n\t\tclear_and_rerender_all();\n\t\twindow.scrollTo(scrollX, scrollY);\n\t}, 300));\n\n\tadd_print_listener(function () {\n\t console.log(\"Printing \" + isMediaPrint().toString());\n\t clear_and_rerender_all();\n });\n\n\t// Build the global views_infos variable\n\tgbl_view_infos = build_view_infos();\n\twindow.addEventListener('hashchange', function( event ) {\n\t\thandle_hashchange(url_to_fragment(event.newURL));\n\t});\n}\n\n$(document).ready(function _stats_views_loader() {\n\tbind_window_events();\n\tsetup_sidebar();\n});\n\n\n/**\n * If there is an error retrieving results for whatever reason, show an error message.\n * @param message\n * @param error_type\n */\nfunction handle_error(message, error_type) {\n if(stats_views_globals.user_logged_in && error_type !== 'billing') {\n $(\".message.error\").show()\n .find(\"h1\").hide().end()\n .find(\"p.main\").text(message);\n } else {\n // If the user isn't logged in, present them with the login pane.\n var $loginPane = $(\"#LoginOverlay .createlogin\").clone()\n .find(\".close_overlay\").hide().end();\n setup_signup_dialogs($(\".message.error\").show()\n .find(\"h1\").text(message).end()\n .find(\"p.main\").empty().append($loginPane).end());\n }\n}\n\nvar hash_change_generation = 0;\nfunction handle_hashchange(fragment, numtries) {\n\tif(CURRENTLY_UPGRADING) {\n\t\t$(\"body\").find(\".message\").hide().end()\n\t\t\t.find(\".message.newversion\").show();\n\t\treturn;\n\t}\n\n\tvar urls_params = url_params_to_object();\n\tif(urls_params.q !== undefined) {\n\t\t// Do not use the hash string mechanism when we have a query.\n\t\treturn;\n\t}\n\t// Clear the chart area\n\t$(\"#charts\").empty();\n\t// Scroll to the top\n\twindow.scrollTo(0, 0);\n\t// Setup the filtering\n\t$(\".getstats\").click(function () {\n\t\t// This is a more customized query.\n\t\t// First get the values to submit.\n\t\tvar values = {};\n\t\t// A human readable explanation of the key (optional)\n\t\tvar key_qname = {};\n\t\t$(this).parent().find(\"input[type=text], select\").each(function (i, el) {\n\t\t\tvar $sel = $(el);\n\t\t\tvar v = $sel.val();\n\t\t\tif(!v || !v.length)\n\t\t\t\treturn;\n\t\t\tvar n = $sel.attr('name');\n\t\t\tif(!values[n]) {\n\t\t\t\tvalues[n] = [];\n\t\t\t}\n\t\t\tvalues[n].push(v);\n\t\t\tkey_qname[n] = $sel.data('qname');\n\t\t});\n\n\t\tvar query = []; // Build the Query\n\t\tvar qname = []; // Build the Query in English\n\t\tfor(var k in values) {\n\t\t\t// Put quotes around each value if necessary\n\t\t\tvar paren = values[k].map(function(v) {\n\t\t\t\treturn v.search(\" \") == -1 ? v : \"\\\"\" + v + \"\\\"\";\n\t\t\t});\n\t\t\t// Build the Query\n\t\t\tquery.push(k + \":(\" + paren.join(\" OR \") + \")\");\n\t\t\t// Build the English translation of the query\n\t\t\tvar human_key = key_qname[k] || capitalize(k.replaceAll(\"_\", \" \"));\n\t\t\tqname.push(human_key + \" \" + human_list(values[k], \"or\"));\n\t\t}\n\t\tif(!query.length) {\n\t\t\tshow_error_usermsg(\"Please select an option.\");\n\t\t\treturn false;\n\t\t}\n\t\tquery = query.join(\" AND \");\n\t\tqname = human_list(qname, \"and\");\n\t\t// Now construct the parameter list.\n\t\tvar params = {\n\t\t\t'q' \t: query,\n\t\t\t'qname' : qname,\n\t\t};\n\t\tvar $parent = get_parent_with_class($(this), \"query\");\n\t\t// Check if there is a custom view specified.\n\t\tif($parent.attr(\"data-view\"))\n\t\t\tparams['v'] = $parent.attr(\"data-view\");\n\n\t\t// Now go\n\t\tjQuery.bbq.pushState(params);\n\n\t\treturn false;\n\t});\n\tvar $body = $(\"body\");\n\tif(!fragment || !fragment.length) {\n\t\t// No hash, show a static starter page.\n\t\t$body.addClass(\"nosidebar\");\n $(\".toptabs\")\n\t\t\t\t.find(\".selected\").removeClass(\"selected\").end()\n\t\t\t\t.find(\"li.overview\").addClass(\"selected\").end();\n\t\t// Show the start message\n\t\tvar $queries = $(\".message.start\").show()\n\t\t.find(\".queries\")\n\t\t\t.find(\".query\").each(function (i) {\n\t\t\t\t// If the question has a front and back, append to the front.\n\t\t\t\tvar appendTo = $(this).find(\".front\").length ?\n\t\t\t\t\t\t\t\t$(this).find(\".front\") : this;\n\t\t\t\tvar found_k = null;\n\t\t\t\tfor(var k in gbl_view_infos) {\n if (gbl_view_infos[k].question == (i + 1)) {\n found_k = k;\n break\n }\n }\n if(!found_k) {\n\t\t\t\t $(this).remove();\n\t\t\t\t return;\n }\n // Add the query title\n var view = gbl_view_infos[found_k];\n if(view.title && !$(this).find(\"h2\").length) {\n $(\"

    \" + view.title + \"

    \").prependTo(appendTo);\n }\n // Add the query description.\n if(view.description && !$(appendTo).find(\"p\").length) {\n $(view.description.map(function (d) {\n return \"

    \" + d + \"

    \";\n }).join(\"\")).appendTo(appendTo);\n }\n // Set the links.\n if(this.tagName == \"A\" && !$(this).attr('href')) {\n $(this).attr('href', \"#q=&v=\" + k)\n }\n\t\t\t\t// Add the question label\n\t\t\t\tif(!$(this).find(\"h3\").length) {\n\t\t\t\t\t$(\"

    \" + view_info_subtitle(view) + \"

    \")\n .prependTo(this);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter(\"div\").click(function () {\n\t\t\t\tvar $obj = $(this);\n\t\t\t\t$obj\n\t\t\t\t\t.find(\".front\").hide().end()\n\t\t\t\t\t.find(\".back\").show(100);\n\t\t\t\tupdate_label_widths($obj);\n\t\t\t}).end().end();\n\t\t// If there are queries and we have masonry, use it to organize the questions nicely.\n\t\tif($queries.length) {\n\t\t\tmasonry_load(function _loaded(Masonry) {\n\t\t\t\t// Use masonry to allow queries to shift as blocks.\n\t\t\t\tnew Masonry($queries[0], {\n\t\t\t\t\titemSelector: '.query',\n\t\t\t\t\tgutter: 20,\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\tcolumnWidth: $queries.find(\".query:not(.big):not(.medium)\")[0]\n\t\t\t\t\t//isFitWidth: true\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\treturn;\n\t}\n\t// Parse the parameters.\n\tvar frag_obj = $.deparam(fragment);\n\t$body.removeClass(\"nosidebar\")\n\t\t.find(\".message.start\").hide().end()\n\t\t.find(\".message.loading\")\n\t\t\t.removeClass(\"gettingfiltered\")\n\t\t\t.show().end();\n\t// When we embed, hide the sidebar.\n\tif(frag_obj.embed !== undefined) {\n\t\t$body\n // Remove the sidebar\n .addClass(\"nosidebar\")\n\t\t\t// Remove the top tabs and the footer when embedding.\n\t\t\t.addClass(\"embed\")\n\t\t\t// Remove any minimum height requirements on the body.\n\t\t\t.find(\"#bd\").css(\"min-height\", \"auto\");\n\t\t// Turn off our salesforce chat when in embedded mode.\n\t\tenable_support_chat = false;\n\t}\n\n\tif(!numtries) {\n\t\t// Start cycling through the help after a few seconds.\n\t\tsetTimeout(function () { cycle_help(); }, 7000);\n\t\tstart_progress_bar(\".message.loading .progressbar\",\n\t\t\t\t50, \"statsbar\");\n\t}\n\n\tvar vinfo = view_info_get_views(null, frag_obj);\n\t// Determine if any of the filtered aggs need an unfiltered one.\n\tvar filter_needs_unfilter = vinfo.views.some(function (v) {\n\t\treturn agg_infos[v] && !agg_infos[v].render_filtered_alone;\n\t});\n\t// When analytics are \"filtered\" (i.e., a date filter or a \"&f=...\" filter,\n // we display analytics on both the original, and the filtered value.\n\tvar has_filter = (frag_obj.f && frag_obj.f.length) ||\n\t\tfrag_obj.date_filed_start || frag_obj.date_filed_end;\n // The analytics query. This gets applied regardless of other filters.\n\tvar query = frag_obj.q || \"\";\n\tvar viewargs_no_filter = [];\n\tif(!has_filter) {\n if(Array.isArray(frag_obj.viewargs)) {\n viewargs_no_filter = frag_obj.viewargs;\n } else if(frag_obj.viewargs) {\n viewargs_no_filter = [frag_obj.viewargs];\n }\n // Add any view specified default viewargs.\n\t if(vinfo.view && vinfo.view.default_viewargs){\n\t var frag_viewargs_obj = _hash_to_obj(viewargs_no_filter);\n\t // Add defaults, but do not overwrite existing.\n\t vinfo.view.default_viewargs.forEach(function (varg) {\n\t var varg_obj = viewarg_to_obj(varg);\n\t if(!frag_viewargs_obj[varg_obj.k]) {\n\t viewargs_no_filter.push(varg);\n }\n });\n }\n\n }\n\tvar has_unfiltered = !has_filter || !vinfo.view || filter_needs_unfilter;\n\n\t// The requests\n\tvar requests = []; // What we send to the server\n\tvar request_info = []; // Used to keep track of what we sent.\n\n\t// Get unfiltered results\n\tif(has_unfiltered) {\n\t\t// We will send each view request separately.\n\t\tvinfo.views.forEach(function (v, i) {\n\t\t\t// Filtered views may not need to request the unfiltered version.\n\t\t\tif (has_filter) {\n\t\t\t\t// Get filtered results.\n\t\t\t\trequests.push({views : [v], filter: frag_obj});\n\t\t\t\trequest_info.push({filtered:true, viewi : i});\n\n\t\t\t\t// Find the agg info structure for this view.\n\t\t\t\tvar a = agg_infos[v];\n\t\t\t\tif(a && a.render_filtered_alone) {\n\t\t\t\t\t// No need to get the unfiltered view here.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// We still add the query, even when unfiltered.\n\t\t\trequests.push({ views : [v], viewargs:viewargs_no_filter, q : query });\n\t\t\trequest_info.push({filtered:false, viewi : i});\n\t\t});\n\t} else if (has_filter) {\n\t\tvinfo.views.forEach(function (v, i) {\n\t\t\t// Get filtered results.\n\t\t\trequests.push({views : [v], filter: frag_obj});\n\t\t\trequest_info.push({filtered:true, viewi : i});\n\t\t});\n\t}\n\n var render_analytics = stats_views_globals.render_analytics;\n\n // Treat the date histogram differently.\n\tvar has_date_hist = render_analytics && vinfo.view && !vinfo.view.omit_date_histogram;\n\tif(has_date_hist) {\n\t\t// Remove the date filters for the histogram.\n if (has_filter) {\n var frag_obj_wo_date = $.deparam(fragment);\n delete frag_obj_wo_date.date_filed_start;\n delete frag_obj_wo_date.date_filed_end;\n requests.push({views: ['Date_Proceeding_Filed'],\n filter: frag_obj_wo_date });\n } else {\n requests.push({views: ['Date_Proceeding_Filed'], q : query});\n }\n\t\trequest_info.push({filtered:false, date_hist:true});\n\t}\n\n\t// We can generated the list of party types/roles.\n\tvar gen_proles = render_analytics && (!stats_views_globals.party_roles || !stats_views_globals.party_roles.length);\n\t// No reason to get the top party roles when in embedded mode.\n\tif(gen_proles && frag_obj.embed !== undefined) {\n\t gen_proles = false;\n }\n\tif(gen_proles) {\n\t var de_frag = $.deparam(fragment);\n\t if(de_frag.views) {\n\t delete de_frag.views;\n }\n\t if(de_frag.q) {\n\t delete de_frag.q;\n }\n\t\trequests.push({views : ['Top_Roles'], filter: de_frag, q : query});\n\t\trequest_info.push({roles:true});\n }\n\n\tfunction merge_aggs(orig, newresp) {\n\t\tif(!orig || !orig.aggs) {\n\t\t\treturn newresp;\n\t\t}\n\t\tfor(var a in newresp.aggs) {\n\t\t\tif(orig.aggs[a]) {\n\t\t\t\tconsole.log(\"Overwriting agg \" + a);\n\t\t\t}\n\t\t\torig.aggs[a] = newresp.aggs[a];\n\t\t}\n\t\treturn orig;\n\t}\n\n\tvar need_parser_info = false;\n\tvar viewargs = get_viewargs_obj();\n\tvar identifier_info = _get_viewargs_identifiers();\n\tfunction do_partial_render(i, request_info, requests) {\n\t\tif(requests.length <= 1){\n\t\t\t// No point partial rendering only 1 view. Wait for full render.\n\t\t\treturn;\n\t\t}\n\t\tvar info = request_info[i];\n\t\tif(info.viewi !== 0 || !vinfo.views.length) {\n\t\t\t// Only render when the first view is completed.\n\t\t\treturn;\n\t\t}\n\t\t// Only display it when this view is entirely done.\n\t\tif(!request_info.some(function(r) { return !r.done && r.viewi == 0;}) ) {\n\t\t\tvar view_copy = $.extend({}, vinfo.view);\n\t\t\t// Only render the first view.\n\t\t\tview_copy.views = [vinfo.views[0]];\n\t\t\trender_allaggs(result ? result.aggs : null,\n\t\t\t\tfiltered_result ? filtered_result.aggs : null, view_copy);\n\t\t}\n\t}\n\n\t// Use this global to make sure the responses we receive are still current.\n\thash_change_generation++;\n\tvar cur_hash_change_generation = hash_change_generation;\n\n\tvar result = null, filtered_result = null;\n\t$(\".message.error\").hide();\n\tget_json_results({\n\t\trequests : requests,\n\t\ton_finished_request : function (i, resp, num_finished) {\n\t\t // Called when each AJAX call completes.\n\t\t\tif(cur_hash_change_generation != hash_change_generation) {\n\t\t\t\t// This request is stale, ignore it.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(resp.error) {\n\t\t\t handle_error(resp.error, resp.error_type);\n\t\t\t\treturn\n }\n\t\t\tif(request_info[i].date_hist) {\n\t\t\t\t// Render the date histogram immediately.\n\t\t\t\trender_sidebar_date_histogram(resp.aggs &&\n\t\t\t\t\tresp.aggs.Date_Proceeding_Filed);\n\t\t\t\t// Render the other_filters with the histogram complete.\n\t\t\t\trender_sidebar_other_filters(vinfo.view.other_filters);\n\t\t\t} else if(request_info[i].roles) {\n\t\t\t // Set the global variable for party roles.\n stats_views_globals.party_roles = resp.aggs && resp.aggs.Top_Roles.buckets ?\n resp.aggs.Top_Roles.buckets.map(function (b) {\n return b.key;\n }) : [];\n\t\t\t\t// Just got party role information. Update the global party type info.\n\t\t\t add_party_type_filters(stats_views_globals.party_roles, typical_analytics_filters);\n\t\t\t // This will cause us to rebuild the filters.\n\t\t\t gbl_view_infos = null;\n\t\t\t} else if(request_info[i].filtered) {\n\t\t\t\tfiltered_result = merge_aggs(filtered_result, resp);\n\t\t\t} else {\n\t\t\t\tresult = merge_aggs(result, resp);\n\t\t\t}\n\t\t\t// Display the first view when once we get it to reduce apparent latency.\n\t\t\trequest_info[i].done = true;\n\t\t\t// Render the partial results.\n\t\t\tdo_partial_render(i, request_info, requests);\n\t\t\t// We need to get the filtered results. Restart the progress bar\n\t\t\t// so the user knows they're getting results pretty soon.\n\t\t\tstart_progress_bar(\".message.loading .progressbar\",\n\t\t\t\t50, \"statsbar\");\n\t\t\tset_progress_bar_text(\"Generating \" + (num_finished+1) +\n\t\t\t\t\" of \" + requests.length + \" Reports\");\n\t\t\t$(\".message.loading\").addClass(\"gettingfiltered\")\n\t\t},\n\n\t\ton_success : function on_render(results) {\n\t\t // Called when ALL Ajax calls complete.\n\t\t\tif(cur_hash_change_generation != hash_change_generation) {\n\t\t\t\t// This request is stale, ignore it.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(identifier_info.identifiers &&\n identifier_info.identifiers.length &&\n !identifier_info.identifier_list) {\n console.warn(\"Identifier list not yet setup.\")\n }\n\n\t\t\t$(\"#charts\").empty();\n\t\t\tstop_progress_bar(\"statsbar\");\n\t\t\t$(\".message.loading\")\n\t\t\t\t.hide()\n\t\t\t\t.removeClass(\"gettingfiltered\");\n\t\t\trender_allaggs(result ? result.aggs : null,\n\t\t\t\tfiltered_result ? filtered_result.aggs : null,\n\t\t\t\tvinfo.view);\n\t\t\tif(gbl_view_infos == null) {\n console.log(\"view infos not defined (2), using all defaults.\");\n gbl_view_infos = build_view_infos();\n }\n\t\t\t// Rendering all aggs can update the gbl_view_infos. Pull it again.\n var cur_view = frag_obj.v ? (gbl_view_infos[frag_obj.v] || []) : {};\n\t\t\t// Render the jump to field after loading everything.\n\t\t\trender_sidebar_jump_to();\n\t\t\t// Update all of the other filters that we've completed.\n\t\t\trender_sidebar_other_filters(cur_view.other_filters);\n\t\t},\n\n\t\ton_fail : function () {\n\t\t\tif(cur_hash_change_generation != hash_change_generation) {\n\t\t\t\t// This request is stale, ignore it.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// We often fail the first time due to timeouts, try again.\n\t\t\tnumtries = numtries || 0;\n\t\t\tif(numtries < 7){\n\t\t\t\thandle_hashchange(fragment, numtries+1);\n\t\t\t} else {\n\t\t\t\t// This is a real error.\n\t\t\t\tstop_progress_bar(\"statsbar\");\n\t\t\t\t$(\".message.loading\").hide();\n\t\t\t\t$(\".message.error\").show();\n\t\t\t}\n\t\t}\n\t});\n}\n\n/////////\n// Ajax loading of analytics suggestions\n/**\n * For the best styling, put the suggest search bar within the title.\n */\nfunction suggest_bar_html(placeholder) {\n\treturn \"\";\n}\nfunction suggest_bar_setup($obj, entity) {\n\tfunction get_suggest_div($input) {\n\t\treturn get_parent_with_class($input, \"suggest_search\").find(\".dropdown\");\n\t}\n\tvar $input = $obj.find(\".suggest_search input[type=text]\")\n\t\t.keydown(debouncer(get_suggest_handler(\n\t\t\tentity, null, get_suggest_div, true), 200));\n\n\t// Make the input a bit nicer by expanding when in focus.\n\tvar $parent = $input.parent().parent();\n\t$input.focus(function () {\n\t\t// Calculate how much room we have to expand.\n\t\tvar new_width = $parent.find(\".filter_list\").length ?\n\t\t\t$parent.outerWidth() - $parent.find(\".filter_list > div\").width()\n\t\t\t\t- 30 : $parent.outerWidth() - 300;\n\t\tif(new_width > 600) {\n\t\t\tnew_width = 600;\n\t\t}\n\t\t// Do the expansion if it'll grow.\n\t\tif ($input.width() < new_width) {\n\t\t\t$input.animate({ width : new_width });\n\t\t}\n\t})\n\t// Undo the expansion.\n\t.focusout(function () {\n\t\tvar $this = $(this);\n\t\t// Delay shrinking just in case the user clicked on the dropdown.\n\t\tsetTimeout(function() {\n\t\t\t$this.width(\"auto\");\n\t\t}, 250);\n\t});\n}\n\nfunction cycle_help() {\n\tvar $didknow = $(\".didknow\");\n\t// Don't cycle through the help if we're not loading.\n\tif(!$(\".message.loading\").is(\":visible\")) {\n\t\t$didknow.hide();\n\t\treturn;\n\t}\n\tvar cur_active = null;\n\t$didknow.each(function (d, el) {\n\t// Go through all of them to determine which index is the visible one.\n\t\tif($(el).is(\":visible\")) {\n\t\t\tcur_active = d;\n\t\t\treturn false;\n\t\t}\n\t});\n\t// Hide all of them\n\t$didknow.hide();\n\t// Get the index of the one that we want to show.\n\tcur_active = cur_active==null ? 0 : (cur_active + 1) % $didknow.length;\n\t// activate the new one.\n\t$($didknow[cur_active]).fadeIn(1000);\n\t// Setup the next cycle in a few seconds.\n\tsetTimeout(function () { cycle_help(); }, 25000);\n}\n\nexport {\n\tbuild_default_aggregations,\n\tbuild_default_view_infos,\n\tbuild_views_from_events,\n\n\t// Global\n\ttypical_analytics_filters,\n\tget_filter_library_dict,\n\n\t// These functions are exported, but may be overriden.\n\trender_toptabs,\n\thandle_error,\n\n\tsuggest_bar_setup,\n\tsuggest_bar_html\n}", "// Docket Alarm \"common\" javascript library. Code that is generally used across all page.\n// Statistics Views Library, used by analytics pages.\n\n// Initialize Masonry when needed\nvar masonry_loaded = false;\nasync function masonry_load(done) {\n\tif(masonry_loaded) {\n\t\tdone(masonry_loaded);\n\t} else {\n\t\t// Lazy loading Masonry\n\t\tconst masonryModule = await import('masonry-layout');\n\t\tconst Masonry = masonryModule.default;\n\t\tmasonry_loaded = Masonry;\n\t\tdone(Masonry);\n\t}\n}\nwindow.masonry_load = masonry_load;\n\nimport * as stats_views_js from \"./stats_views.js\";\nwindow.stats_views_js = stats_views_js;\n"], "mappings": "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", "names": ["window", "window", "window", "console", "jQuery", "window", "window", "console", "jQuery", "Item", "window", "name", "viewargs", "filing_str", "recent_time", "agg", "agg_info", "b", "p_type", "outcome", "i", "k", "added_name", "added_compare_name", "n", "e", "a", "j", "count", "case_str", "total", "frag_obj", "cur_args_obj", "query", "request_info", "requests", "$input", "masonry_load"] }