{"version":3,"sources":["webpack:///./node_modules/blacklight-range-limit/app/assets/javascripts/blacklight_range_limit/blacklight_range_limit.esm.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/bootstrap-slider.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.canvaswrapper.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.flot.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.colorhelpers.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.event.drag.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.flot.browser.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.flot.drawSeries.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.flot.hover.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.flot.saturated.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.flot.selection.js","webpack:///./node_modules/blacklight-range-limit/vendor/assets/javascripts/flot/jquery.flot.uiConstants.js"],"names":["BlacklightRangeLimit","options","this","display_ratio","redrawnEvent","parseNum","str","String","replace","parseInt","form_selection","form","min","max","begin_val","$","find","val","isNaN","end_val","normalized_selection","checkForNeededFacetsToFetch","each","container","parent","load","attr","response","status","hasClass","turnIntoPlot","function_for_find_segment","pointer_lookup_arr","x_coord","i","length","hash","from","xaxis","domDependenciesMet","plot","modalObserverConfig","attributes","initSliderModalObserver","modalSelector","MutationObserver","mutations","forEach","mutation","attributeName","target","hasAttribute","buildSlider","observe","document","querySelector","initPlotModalObserver","wait_for_visible","width","height","areaChart","trigger","setTimeout","parseSegment","el","first","data","series_data","Array","pointer_lookup","x_ticks","segment","to","count","text","avg","push","html","config","closest","extend","yaxis","ticks","autoscaleMargin","tickDecimals","series","lines","fill","steps","grid","clickable","hoverable","autoHighlight","margin","left","right","selection","mode","err","alert","find_segment_for","last_segment","tooltip","show","hide","bind","event","pos","item","x","title","label","getSelection","setSelection","ranges","Math","floor","slider_placeholder","slider","on","ui","values","getValue","redrawPlot","resize","setupGrid","draw","initializeDistroFacets","filter","func","wait","immediate","timeout","window","context","args","arguments","callNow","clearTimeout","apply","initializeSlider","area","slider_el","css","min_max","range_element","current_limit","isInt","n","thisContext","boundaries","contents","wrapAll","begin_el","end_el","placeholder_input","appendTo","undefined","value","plot_el","change","val1","val2","initialize","Slider","element","picker","insertBefore","append","id","Modernizr","touch","touchCapable","tooltipInner","orientation","addClass","stylePos","mousePos","sizePos","style","outerWidth","top","outerHeight","step","range","selectionEl","selectionElStyle","handle1","handle1Stype","handle2","handle2Stype","handle","diff","percentage","offset","size","formater","layout","touchstart","proxy","mousedown","mouseenter","showTooltip","mouseleave","hideTooltip","prototype","constructor","over","inDrag","removeClass","abs","ev","type","originalEvent","getPercentage","diff1","diff2","dragged","touchmove","mousemove","touchend","mouseup","calculateValue","prop","off","round","touches","setValue","fn","option","$this","defaults","Constructor","Canvas","cls","getElementsByClassName","createElement","className","direction","position","appendChild","getContext","Error","pixelRatio","browser","getPixelRatio","SVGContainer","SVG","_textCache","updateTransforms","transforms","transform","baseVal","clear","t","appendItem","restore","save","scale","clearRect","render","cache","layerKey","hasOwnProperty","call","layer","getSVGLayer","layerCache","display","styleKey","styleCache","key","positions","active","rendered","splice","firstChild","removeChild","parentNode","measured","classes","svgElement","pointerEvents","createElementNS","setAttribute","bottom","getTextInfo","font","angle","textStyle","info","variant","weight","lineHeight","family","generateKey","indexOf","addTspanElements","textNode","createTextNode","maxWidth","setAttributeNS","elementRect","getBBox","addText","y","halign","valign","textContent","cloneNode","textAlign","tspan","split","childNodes","removeText","htmlYCoord","clearCache","Flot","jQuery","defaultTickGenerator","axis","prev","start","saturated","saturate","floorInBase","tickSize","v","Number","NaN","MAX_VALUE","multiplyAdd","defaultTickFormatter","precision","oldTickDecimals","expRepTickFormatter","factor","parseFloat","formatted","decimal","decimalPrecision","substr","expPosition","exponentValue","tenExponent","log","LN10","roundWith","updatedPrecision","recomputePrecision","toFixed","num","log10Value","LOG10E","newPrecision","Plot","placeholder","data_","options_","plugins","colors","color","tickColor","inverseTransform","autoScaleMargin","autoScale","windowSize","growOnly","tickFormatter","showTickLabels","labelWidth","labelHeight","reserveSpace","tickLength","showMinorTicks","showTicks","gridLines","alignTicksWithAxis","minTickSize","below","above","boxPosition","centerX","centerY","xaxes","yaxes","points","radius","lineWidth","fillColor","symbol","bars","horizontal","barWidth","align","zero","shadowSize","highlightColor","aboveData","backgroundColor","borderColor","labelMargin","axisMargin","borderWidth","minBorderMargin","markings","markingsColor","markingsLineWidth","mouseActiveRadius","interaction","redrawOverlayInterval","hooks","surface","overlay","eventHolder","ctx","octx","plotOffset","plotWidth","plotHeight","processOptions","processRawData","processDatapoints","processOffset","adjustSeriesDataRange","setRange","drawBackground","drawSeries","drawAxis","findNearbyItems","axisReserveSpace","bindEvents","drawOverlay","shutdown","eventManager","redrawTimeout","setData","getPlaceholder","getCanvas","getSurface","getEventHolder","getPlotOffset","o","getData","getAxes","res","concat","_","getXAxes","getYAxes","c2p","used","x1","y1","p2c","getOptions","triggerRedrawOverlay","pointOffset","point","axisNumber","destroy","removeData","empty","executeHooks","clearTextCache","autoScaleAxis","computeRangeForDataSeries","force","isValid","datapoints","ps","pointsize","format","topSentry","POSITIVE_INFINITY","bottomSentry","NEGATIVE_INFINITY","xmin","ymin","xmax","ymax","j","m","f","computeRange","Infinity","delta","useAbsoluteBarWidth","xValues","minDistance","isFinite","onlyUnique","index","self","sort","a","b","distance","computeBarWidth","findNearbyItem","mouseX","mouseY","seriesFilter","computeDistance","items","findNearbyInterpolationPoint","posX","posY","dist","dx","dy","smallestDistance","comparer","x2","p1x","p1y","p2x","p2y","datapoint","leftPoint","rightPoint","seriesIndex","computeValuePrecision","computeTickSize","addEventHandler","handler","priority","eventList","eventData","unbind","MINOR_TICKS_COUNT_CONSTANT","uiConstants","TICK_LENGTH_CONSTANT","hook","d","oldseries","s","parseData","neededColors","maxIndex","sc","c","colorPool","colorPoolSize","variation","definedColors","parse","colori","toString","getOrCreateAxis","fillInSeriesOptions","prevSeries","k","p","updateAxis","datamin","datamax","reusePoints","allAxes","number","required","defaultValue","stack","nullify","every","processData","obj","coord","axes","setTransformationHelpers","identity","it","tp","allocateAxisBoxFirstPhase","lw","lh","isXAxis","padding","innermost","outermost","found","box","alignAxisWithGrid","ceil","showGrid","axisOpts","opts","slice","setupTickFormatter","autoScaledMin","autoScaledMax","tmp","allocatedAxes","grep","noTicks","fixupNumberOfTicks","sqrt","getAxisTickSize","tickGenerator","otherAxis","niceTicks","extraDec","ts","test","setupTickGeneration","oticks","isFunction","newTick","setMajorTicks","anyDataInSeries","some","e","snapRangeToTicks","associatedSeries","notAllBarSeries","isValidEndpointTick","unshift","setEndpointTicks","showMajorTickLabels","showEndpointsTickLabels","legacyStyles","name","measureTickLabels","minMargin","margins","adjustLayoutForThingsStickingOut","allocateAxisBoxSecondPhase","newLabelBox","nullBox","labelBoxes","overlapping","x11","y11","x12","y12","x21","y21","x22","y22","overlapsOtherLabels","previousLabelBoxes","labelBox","drawAxisLabel","tick","widenedMinMax","minimum","maximum","widen","wmin","widenMinMax","dec","norm","magn","ticksOption","canvas1","canvas2","point1","point2","getEndpointPrecision","translate","fillStyle","getColorOrGradient","fillRect","drawGrid","extractRange","findEdges","alignPosition","drawTickBar","edges","xoff","yoff","strokeStyle","beginPath","moveTo","lineTo","stroke","drawTickMarks","minorTicks","minorTicksNr","xminor","yminor","v1","drawGridLines","bw","xrange","yrange","xequal","yequal","subPixel","drawMarkings","bc","strokeRect","drawBorder","drawSeriesLines","drawSymbol","drawSeriesBars","drawSeriesPoints","foundItems","foundPoint","findNearbyPoint","dataIndex","foundIndex","findNearbyBar","itemDistance","findItems","maxDistance","mx","my","maxx","maxy","barLeft","barRight","fillTowards","defaultBottom","CustomEvent","dispatchEvent","spec","defaultColor","gradient","createLinearGradient","l","co","brightness","opacity","addColorStop","init","initPlugins","children","remove","existing","setupCanvases","axisOptions","axisCount","fontSize","fontSizeDefault","fontDefaults","parseOptions","version","linearTickGenerator","make","r","g","add","charAt","normalize","join","clamp","clone","extract","elem","toLowerCase","nodeName","get","exec","trim","lookupColors","aqua","azure","beige","black","blue","brown","cyan","darkblue","darkcyan","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkviolet","fuchsia","gold","green","indigo","khaki","lightblue","lightcyan","lightgreen","lightgrey","lightpink","lightyellow","lime","magenta","maroon","navy","olive","orange","pink","purple","violet","red","silver","white","yellow","drag","fn1","fn2","fn3","$event","$special","special","not","which","drop","dragging","setup","squared","attachEvent","dontStart","teardown","selectable","detachEvent","returned","dragTarget","dragProxy","cursorOffsetX","pageX","cursorOffsetY","pageY","offsetX","offsetY","is","hijack","allowed","result","dispatch","pow","bool","ownerDocument","unselectable","MozUserSelect","dragstart","dragend","getPageXY","doc","documentElement","X","clientX","pageXOffset","scrollLeft","clientLeft","Y","clientY","pageYOffset","scrollTop","clientTop","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","isSafari","HTMLElement","safari","pushNotification","isMobileSafari","navigator","userAgent","match","isOpera","opr","addons","opera","isFirefox","InstallTrigger","isIE","documentMode","isEdge","StyleMedia","isChrome","chrome","webstore","isBlink","CSS","drawBar","fillStyleCallback","axisx","axisy","drawLeft","drawRight","drawTop","drawBottom","getFillStyle","filloptions","seriesColor","lineJoin","dashes","setLineDash","decimate","ypos","areaOpen","segmentStart","segmentEnd","y2","x1old","x2old","plotLineArea","xoffset","yoffset","prevx","prevy","plotLine","drawCircle","shadow","arc","PI","decimatePoints","drawSymbolFn","plotPoints","plotBars","eventType","lastMouseMoveEvent","highlights","generatePlothoverEvent","newEvent","detail","changedTouches","doTriggerClickHoverEvent","searchDistance","seriesFlag","triggerClickHoverEvent","onMouseMove","onMouseLeave","onClick","triggerCleanupEvent","unhighlight","eventname","page","canvasX","canvasY","h","auto","highlight","indexOfHighlight","hi","drawBarHighlight","drawPointHighlight","pointRadius","closePath","addEventListener","removeEventListener","multiply","bInt","base","second","currentMode","SNAPPING_CONSTANT","savedhandlers","onDrag","updateSelection","onDragStart","body","focus","onselectstart","ondrag","setSelectionPos","onDragEnd","selectionIsSane","triggerSelectedEvent","c1","c2","selectionDirection","p1","p2","updateMode","clearSelection","preventEvent","minSize","visualization","displaySelectionDecorations","scalingFactor","shape","oX","oY","w","fullEarWidth","earWidth","drawSelectionDecorations","PANHINT_LENGTH_CONSTANT","ZOOM_DISTANCE_MARGIN"],"mappings":"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","file":"js/npm.blacklight-range-limit-aacc809a0ac97a5672ea.chunk.js","sourcesContent":["/**\n * BlacklightRangeLimit module setup.\n */\n\nconst BlacklightRangeLimit = function (options) {\n this.options = options || {};\n};\nBlacklightRangeLimit.display_ratio = 1 / (1.618 * 2); // half a golden rectangle, why not\n/* A custom event \"plotDrawn.blacklight.rangeLimit\" will be sent when flot plot\n is (re-)drawn on screen possibly with a new size. target of event will be the DOM element\n containing the plot. Used to resize slider to match. */\nBlacklightRangeLimit.redrawnEvent = \"plotDrawn.blacklight.rangeLimit\";\n\n// takes a string and parses into an integer, but throws away commas first, to avoid truncation when there is a comma\n// use in place of javascript's native parseInt\nBlacklightRangeLimit.parseNum = function parseNum(str) {\n str = String(str).replace(/[^0-9-]/g, '');\n return parseInt(str, 10);\n};\nBlacklightRangeLimit.form_selection = function form_selection(form, min, max) {\n var begin_val = BlacklightRangeLimit.parseNum($(form).find(\"input.range_begin\").val());\n if (isNaN(begin_val) || begin_val < min) {\n begin_val = min;\n }\n var end_val = BlacklightRangeLimit.parseNum($(form).find(\"input.range_end\").val());\n if (isNaN(end_val) || end_val > max) {\n end_val = max;\n }\n return BlacklightRangeLimit.normalized_selection(begin_val, end_val);\n};\n\n// Add AJAX fetched range facets if needed, and add a chart to em\nBlacklightRangeLimit.checkForNeededFacetsToFetch = function checkForNeededFacetsToFetch() {\n $(\".range_limit .profile .distribution a.load_distribution\").each(function () {\n var container = $(this).parent('div.distribution');\n $(container).load($(this).attr('href'), function (response, status) {\n if ($(container).hasClass(\"chart_js\") && status == \"success\") {\n BlacklightRangeLimit.turnIntoPlot(container);\n }\n });\n });\n};\nBlacklightRangeLimit.function_for_find_segment = function function_for_find_segment(pointer_lookup_arr) {\n return function (x_coord) {\n for (var i = pointer_lookup_arr.length - 1; i >= 0; i--) {\n var hash = pointer_lookup_arr[i];\n if (x_coord >= hash.from) return hash;\n }\n return pointer_lookup_arr[0];\n };\n};\n\n// Send endpoint to endpoint+0.99999 to have display\n// more closely approximate limiting behavior esp\n// at small resolutions. (Since we search on whole numbers,\n// inclusive, but flot chart is decimal.)\nBlacklightRangeLimit.normalized_selection = function normalized_selection(min, max) {\n max += 0.99999;\n return {\n xaxis: {\n 'from': min,\n 'to': max\n }\n };\n};\n\n// Check if Flot is loaded\nBlacklightRangeLimit.domDependenciesMet = function domDependenciesMet() {\n return typeof $.plot != \"undefined\";\n};\nBlacklightRangeLimit.modalObserverConfig = {\n attributes: true\n};\nBlacklightRangeLimit.initSliderModalObserver = function (modalSelector) {\n // Use a mutation observer to detect when the modal dialog is open\n const modalObserver = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n if (mutation.attributeName !== 'open') {\n return;\n }\n if (mutation.target.hasAttribute('open')) {\n $(modalSelector).find(\".range_limit .profile .range.slider_js\").each(function () {\n BlacklightRangeLimit.buildSlider(this);\n });\n }\n });\n });\n modalObserver.observe(document.querySelector(modalSelector), BlacklightRangeLimit.modalObserverConfig);\n};\nBlacklightRangeLimit.initPlotModalObserver = function (modalSelector) {\n // Use a mutation observer to detect when the modal dialog is open\n const modalObserver = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n if (mutation.attributeName !== 'open') {\n return;\n }\n if (mutation.target.hasAttribute('open')) {\n $(modalSelector).find(\".range_limit .profile .distribution.chart_js ul\").each(function () {\n BlacklightRangeLimit.turnIntoPlot($(this).parent());\n });\n\n // Case when there is no currently selected range\n BlacklightRangeLimit.checkForNeededFacetsToFetch();\n }\n });\n });\n modalObserver.observe(document.querySelector(modalSelector), BlacklightRangeLimit.modalObserverConfig);\n};\n\n// second arg, if provided, is a number of ms we're willing to\n\nBlacklightRangeLimit.turnIntoPlot = function turnIntoPlot(container, wait_for_visible) {\n // flot can only render in a a div with a defined width.\n // for instance, a hidden div can't generally be rendered in (although if you set\n // an explicit width on it, it might work)\n //\n // We'll count on later code that catch bootstrap collapse open to render\n // on show, for currently hidden divs.\n\n // for some reason width sometimes return negative, not sure\n // why but it's some kind of hidden.\n if (container.width() > 0) {\n var height = container.width() * BlacklightRangeLimit.display_ratio;\n\n // Need an explicit height to make flot happy.\n container.height(height);\n BlacklightRangeLimit.areaChart($(container));\n $(container).trigger(BlacklightRangeLimit.redrawnEvent);\n } else if (wait_for_visible > 0) {\n setTimeout(function () {\n BlacklightRangeLimit.turnIntoPlot(container, wait_for_visible - 50);\n }, 50);\n }\n};\nBlacklightRangeLimit.parseSegment = function parseSegment(el) {\n if ($(el).find(\"span.single\").first().data('blrlSingle')) {\n var val = BlacklightRangeLimit.parseNum($(el).find(\"span.single\").first().data('blrlSingle'));\n return [val, val];\n } else {\n var from = BlacklightRangeLimit.parseNum($(el).find(\"span.from\").first().data('blrlBegin'));\n var to = BlacklightRangeLimit.parseNum($(el).find(\"span.to\").first().data('blrlEnd'));\n return [from, to];\n }\n};\n\n// Takes a div holding a ul of distribution segments produced by\n// blacklight_range_limit/_range_facets and makes it into\n// a flot area chart.\nBlacklightRangeLimit.areaChart = function areaChart(container) {\n //flot loaded? And canvas element supported.\n if (BlacklightRangeLimit.domDependenciesMet()) {\n // Grab the data from the ul div\n var series_data = new Array();\n var pointer_lookup = new Array();\n var x_ticks = new Array();\n var min = BlacklightRangeLimit.parseSegment($(container).find(\"ul li:first-child\").first())[0];\n var max = BlacklightRangeLimit.parseSegment($(container).find(\"ul li:last-child\").first())[1];\n $(container).find(\"ul li\").each(function () {\n var segment = BlacklightRangeLimit.parseSegment(this);\n var from = segment[0];\n var to = segment[1];\n var count = BlacklightRangeLimit.parseNum($(this).find(\"span.facet-count,span.count\").text());\n var avg = count / (to - from + 1);\n\n //We use the avg as the y-coord, to make the area of each\n //segment proportional to how many documents it holds.\n series_data.push([from, avg]);\n series_data.push([to + 1, avg]);\n x_ticks.push(from);\n pointer_lookup.push({\n 'from': from,\n 'to': to,\n 'count': count,\n 'label': $(this).find(\".facet-select,.facet_select\").html()\n });\n });\n x_ticks.push(max + 1);\n var plot;\n var config = $(container).closest('.blrl-plot-config').data('plot-config') || $(container).closest('.facet-limit').data('plot-config') || {};\n try {\n plot = $.plot($(container), [series_data], $.extend(true, config, {\n yaxis: {\n ticks: [],\n min: 0,\n autoscaleMargin: 0.1\n },\n //xaxis: { ticks: x_ticks },\n xaxis: {\n tickDecimals: 0\n },\n // force integer ticks\n series: {\n lines: {\n fill: true,\n steps: true\n }\n },\n grid: {\n clickable: true,\n hoverable: true,\n autoHighlight: false,\n margin: {\n left: 0,\n right: 0\n }\n },\n selection: {\n mode: \"x\"\n }\n }));\n } catch (err) {\n alert(err);\n }\n var find_segment_for = BlacklightRangeLimit.function_for_find_segment(pointer_lookup);\n var last_segment = null;\n $(container).tooltip({\n 'html': true,\n 'placement': 'bottom',\n 'trigger': 'manual',\n 'delay': {\n show: 0,\n hide: 100\n }\n });\n $(container).bind(\"plothover\", function (event, pos, item) {\n var segment = find_segment_for(pos.x);\n if (segment != last_segment) {\n var title = find_segment_for(pos.x).label + ' (' + BlacklightRangeLimit.parseNum(segment.count) + ')';\n $(container).attr(\"title\", title).tooltip(\"_fixTitle\").tooltip(\"show\");\n last_segment = segment;\n }\n });\n $(container).bind(\"mouseout\", function () {\n last_segment = null;\n $(container).tooltip('hide');\n });\n $(container).bind(\"plotclick\", function (event, pos, item) {\n if (plot.getSelection() == null) {\n segment = find_segment_for(pos.x);\n plot.setSelection(BlacklightRangeLimit.normalized_selection(segment.from, segment.to));\n }\n });\n $(container).bind(\"plotselected plotselecting\", function (event, ranges) {\n if (ranges != null) {\n var from = Math.floor(ranges.xaxis.from);\n var to = Math.floor(ranges.xaxis.to);\n var form = $(container).closest(\".limit_content\").find(\"form.range_limit\");\n form.find(\"input.range_begin\").val(from);\n form.find(\"input.range_end\").val(to);\n var slider_placeholder = $(container).closest(\".limit_content\").find(\"[data-slider-placeholder]\");\n if (slider_placeholder) {\n slider_placeholder.slider(\"setValue\", [from, to]);\n }\n }\n });\n var form = $(container).closest(\".limit_content\").find(\"form.range_limit\");\n form.find(\"input.range_begin, input.range_end\").on('input', function () {\n plot.setSelection(BlacklightRangeLimit.form_selection(form, min, max), true);\n });\n $(container).closest(\".limit_content\").find(\".profile .range\").on(\"slide\", function (event, ui) {\n var values = $(event.target).data(\"slider\").getValue();\n form.find(\"input.range_begin\").val(values[0]);\n form.find(\"input.range_end\").val(values[1]);\n plot.setSelection(BlacklightRangeLimit.normalized_selection(values[0], Math.max(values[0], values[1])), true);\n });\n\n // initially entirely selected, to match slider\n plot.setSelection(BlacklightRangeLimit.normalized_selection(min, max));\n }\n};\n\n// after a collapsible facet contents is fully shown,\n// resize the flot chart to current conditions. This way, if you change\n// browser window size, you can get chart resized to fit by closing and opening\n// again, if needed.\nBlacklightRangeLimit.redrawPlot = function redrawPlot(container) {\n if (container && container.width() > 0) {\n // resize the container's height, since width may have changed.\n container.height(container.width() * BlacklightRangeLimit.display_ratio);\n\n // redraw the chart.\n var plot = container.data(\"plot\");\n if (plot) {\n // how to redraw after possible resize?\n // Cribbed from https://github.com/flot/flot/blob/master/jquery.flot.resize.js\n plot.resize();\n plot.setupGrid();\n plot.draw();\n // plus trigger redraw of the selection, which otherwise ain't always right\n // we'll trigger a fake event on one of the boxes\n var form = $(container).closest(\".limit_content\").find(\"form.range_limit\");\n form.find(\"input.range_begin\").trigger(\"change\");\n\n // send our custom event to trigger redraw of slider\n $(container).trigger(BlacklightRangeLimit.redrawnEvent);\n }\n }\n};\n\n/**\n * Closure functions in this file are mainly concerned with initializing, resizing, and updating\n * range limit functionality based off of page load, facet opening, page resizing, and otherwise\n * events.\n */\n\nBlacklightRangeLimit.initializeDistroFacets = function (modalSelector) {\n // Facets already on the page? Turn em into a chart.\n $(\".range_limit .profile .distribution.chart_js ul\").each(function () {\n BlacklightRangeLimit.turnIntoPlot($(this).parent());\n });\n BlacklightRangeLimit.checkForNeededFacetsToFetch();\n\n // Listen for twitter bootstrap collapsible open events, to render flot\n // in previously hidden divs on open, if needed.\n $(\"body\").on(\"show.bs.collapse\", function (event) {\n // Was the target a .facet-content including a .chart-js?\n var container = $(event.target).filter(\".facet-content\").find(\".chart_js\");\n\n // only if it doesn't already have a canvas, it isn't already drawn\n if (container && container.find(\"canvas\").length == 0) {\n // be willing to wait up to 1100ms for container to\n // have width -- right away on show.bs is too soon, but\n // shown.bs is later than we want, we want to start rendering\n // while animation is still in progress.\n BlacklightRangeLimit.turnIntoPlot(container, 1100);\n }\n });\n\n // For Blacklight version < 8, when loaded in a modal\n $(modalSelector).on('shown.bs.modal', function () {\n $(this).find(\".range_limit .profile .distribution.chart_js ul\").each(function () {\n BlacklightRangeLimit.turnIntoPlot($(this).parent());\n });\n\n // Case when there is no currently selected range\n BlacklightRangeLimit.checkForNeededFacetsToFetch();\n });\n\n // Use a mutation observer to detect when the HTML dialog is open\n BlacklightRangeLimit.initPlotModalObserver(modalSelector);\n $(\"body\").on(\"shown.bs.collapse\", function (event) {\n var container = $(event.target).filter(\".facet-content\").find(\".chart_js\");\n BlacklightRangeLimit.redrawPlot(container);\n });\n\n // debouce borrowed from underscore\n // Returns a function, that, as long as it continues to be invoked, will not\n // be triggered. The function will be called after it stops being called for\n // N milliseconds. If `immediate` is passed, trigger the function on the\n // leading edge, instead of the trailing.\n const debounce = function (func, wait, immediate) {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n };\n $(window).on(\"resize\", debounce(function () {\n $(\".chart_js\").each(function (i, container) {\n BlacklightRangeLimit.redrawPlot($(container));\n });\n }, 350));\n};\n\n// for Blacklight.onLoad:\n\nBlacklightRangeLimit.initializeSlider = function (modalSelector) {\n $(\".range_limit .profile .range.slider_js\").each(function () {\n BlacklightRangeLimit.buildSlider(this);\n });\n\n // For Blacklight < 8, when loaded in a modal\n $(modalSelector).on('shown.bs.modal', function () {\n $(this).find(\".range_limit .profile .range.slider_js\").each(function () {\n BlacklightRangeLimit.buildSlider(this);\n });\n });\n\n // For Blacklight 8, use a mutation observer to detect when the HTML dialog is open\n BlacklightRangeLimit.initSliderModalObserver(modalSelector);\n\n // catch event for redrawing chart, to redraw slider to match width\n $(\"body\").on(\"plotDrawn.blacklight.rangeLimit\", function (event) {\n var area = $(event.target).closest(\".limit_content.range_limit\");\n var plot = area.find(\".chart_js\").data(\"plot\");\n var slider_el = area.find(\".slider\");\n if (plot && slider_el) {\n slider_el.width(plot.width());\n slider_el.css(\"display\", \"block\");\n }\n });\n};\n\n// returns two element array min/max as numbers. If there is a limit applied,\n// it's boundaries are are limits. Otherwise, min/max in current result\n// set as sniffed from HTML. Pass in a DOM element for a div.range\n// Will return NaN as min or max in case of error or other weirdness.\nBlacklightRangeLimit.min_max = function min_max(range_element) {\n var current_limit = $(range_element).closest(\".limit_content.range_limit\").find(\".current\");\n let min, max;\n min = max = BlacklightRangeLimit.parseNum(current_limit.find(\".single\").data('blrlSingle'));\n if (isNaN(min)) {\n min = BlacklightRangeLimit.parseNum(current_limit.find(\".from\").first().data('blrlBegin'));\n max = BlacklightRangeLimit.parseNum(current_limit.find(\".to\").first().data('blrlEnd'));\n }\n if (isNaN(min) || isNaN(max)) {\n //no current limit, take from results min max included in spans\n min = BlacklightRangeLimit.parseNum($(range_element).find(\".min\").first().text());\n max = BlacklightRangeLimit.parseNum($(range_element).find(\".max\").first().text());\n }\n return [min, max];\n};\n\n// Check to see if a value is an Integer\n// see: http://stackoverflow.com/questions/3885817/how-to-check-if-a-number-is-float-or-integer\nBlacklightRangeLimit.isInt = function isInt(n) {\n return n % 1 === 0;\n};\nBlacklightRangeLimit.buildSlider = function buildSlider(thisContext) {\n var range_element = $(thisContext);\n var boundaries = BlacklightRangeLimit.min_max(thisContext);\n var min = boundaries[0];\n var max = boundaries[1];\n if (BlacklightRangeLimit.isInt(min) && BlacklightRangeLimit.isInt(max)) {\n $(thisContext).contents().wrapAll('
');\n var range_element = $(thisContext);\n var form = $(range_element).closest(\".range_limit\").find(\"form.range_limit\");\n var begin_el = form.find(\"input.range_begin\");\n var end_el = form.find(\"input.range_end\");\n var placeholder_input = $('').appendTo(range_element);\n\n // make sure slider is loaded\n if (placeholder_input.slider !== undefined) {\n placeholder_input.slider({\n min: min,\n max: max,\n value: [min, max],\n tooltip: \"hide\"\n });\n\n // try to make slider width/orientation match chart's\n var container = range_element.closest(\".range_limit\");\n var plot_el = container.find(\".chart_js\");\n var plot = plot_el.data(\"plot\");\n var slider_el = container.find(\".slider\");\n if (plot_el) {\n plot_el.attr('aria-hidden', 'true');\n }\n if (slider_el) {\n slider_el.attr('aria-hidden', 'true');\n }\n if (plot && slider_el) {\n slider_el.width(plot.width());\n slider_el.css(\"display\", \"block\");\n } else if (slider_el) {\n slider_el.css(\"width\", \"100%\");\n }\n }\n\n // Slider change should update text input values.\n var parent = $(thisContext).parent();\n var form = $(parent).closest(\".limit_content\").find(\"form.range_limit\");\n $(parent).closest(\".limit_content\").find(\".profile .range\").on(\"slide\", function (event, ui) {\n var values = $(event.target).data(\"slider\").getValue();\n form.find(\"input.range_begin\").val(values[0]);\n form.find(\"input.range_end\").val(values[1]);\n });\n }\n begin_el.val(min);\n end_el.val(max);\n begin_el.on('input', function () {\n var val = BlacklightRangeLimit.parseNum(this.value);\n if (isNaN(val) || val < min) {\n //for weird data, set slider at min\n val = min;\n }\n var values = placeholder_input.data(\"slider\").getValue();\n values[0] = val;\n placeholder_input.slider(\"setValue\", values);\n });\n end_el.on('input', function () {\n var val = BlacklightRangeLimit.parseNum(this.value);\n if (isNaN(val) || val > max) {\n //weird entry, set slider to max\n val = max;\n }\n var values = placeholder_input.data(\"slider\").getValue();\n values[1] = val;\n placeholder_input.slider(\"setValue\", values);\n });\n begin_el.change(function () {\n var val1 = BlacklightRangeLimit.parseNum(begin_el.val());\n var val2 = BlacklightRangeLimit.parseNum(end_el.val());\n if (val2 < val1) {\n begin_el.val(val2);\n end_el.val(val1);\n }\n });\n end_el.change(function () {\n var val1 = BlacklightRangeLimit.parseNum(begin_el.val());\n var val2 = BlacklightRangeLimit.parseNum(end_el.val());\n if (val2 < val1) {\n begin_el.val(val2);\n end_el.val(val1);\n }\n });\n};\nBlacklightRangeLimit.initialize = function (modalSelector) {\n BlacklightRangeLimit.initializeDistroFacets(modalSelector);\n BlacklightRangeLimit.initializeSlider(modalSelector);\n};\nexport { BlacklightRangeLimit as default };","/* =========================================================\n * bootstrap-slider.js v2.0.0\n * http://www.eyecon.ro/bootstrap-slider\n * =========================================================\n * Copyright 2012 Stefan Petre\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n!function ($) {\n var Slider = function (element, options) {\n this.element = $(element);\n this.picker = $('
' + '
' + '
' + '
' + '
' + '
' + '
' + '
').insertBefore(this.element).append(this.element);\n this.id = this.element.data('slider-id') || options.id;\n if (this.id) {\n this.picker[0].id = this.id;\n }\n if (typeof Modernizr !== 'undefined' && Modernizr.touch) {\n this.touchCapable = true;\n }\n var tooltip = this.element.data('slider-tooltip') || options.tooltip;\n this.tooltip = this.picker.find('.tooltip');\n this.tooltipInner = this.tooltip.find('div.tooltip-inner');\n this.orientation = this.element.data('slider-orientation') || options.orientation;\n switch (this.orientation) {\n case 'vertical':\n this.picker.addClass('slider-vertical');\n this.stylePos = 'top';\n this.mousePos = 'pageY';\n this.sizePos = 'offsetHeight';\n this.tooltip.addClass('right')[0].style.left = '100%';\n break;\n default:\n this.picker.addClass('slider-horizontal').css('width', this.element.outerWidth());\n this.orientation = 'horizontal';\n this.stylePos = 'left';\n this.mousePos = 'pageX';\n this.sizePos = 'offsetWidth';\n this.tooltip.addClass('top')[0].style.top = -this.tooltip.outerHeight() - 14 + 'px';\n break;\n }\n this.min = this.element.data('slider-min') || options.min;\n this.max = this.element.data('slider-max') || options.max;\n this.step = this.element.data('slider-step') || options.step;\n this.value = this.element.data('slider-value') || options.value;\n if (this.value[1]) {\n this.range = true;\n }\n this.selection = this.element.data('slider-selection') || options.selection;\n this.selectionEl = this.picker.find('.slider-selection');\n if (this.selection === 'none') {\n this.selectionEl.addClass('hide');\n }\n this.selectionElStyle = this.selectionEl[0].style;\n this.handle1 = this.picker.find('.slider-handle:first');\n this.handle1Stype = this.handle1[0].style;\n this.handle2 = this.picker.find('.slider-handle:last');\n this.handle2Stype = this.handle2[0].style;\n var handle = this.element.data('slider-handle') || options.handle;\n switch (handle) {\n case 'round':\n this.handle1.addClass('round');\n this.handle2.addClass('round');\n break;\n case 'triangle':\n this.handle1.addClass('triangle');\n this.handle2.addClass('triangle');\n break;\n }\n if (this.range) {\n this.value[0] = Math.max(this.min, Math.min(this.max, this.value[0]));\n this.value[1] = Math.max(this.min, Math.min(this.max, this.value[1]));\n } else {\n this.value = [Math.max(this.min, Math.min(this.max, this.value))];\n this.handle2.addClass('hide');\n if (this.selection == 'after') {\n this.value[1] = this.max;\n } else {\n this.value[1] = this.min;\n }\n }\n this.diff = this.max - this.min;\n this.percentage = [(this.value[0] - this.min) * 100 / this.diff, (this.value[1] - this.min) * 100 / this.diff, this.step * 100 / this.diff];\n this.offset = this.picker.offset();\n this.size = this.picker[0][this.sizePos];\n this.formater = options.formater;\n this.layout();\n if (this.touchCapable) {\n // Touch: Bind touch events:\n this.picker.on({\n touchstart: $.proxy(this.mousedown, this)\n });\n } else {\n this.picker.on({\n mousedown: $.proxy(this.mousedown, this)\n });\n }\n if (tooltip === 'show') {\n this.picker.on({\n mouseenter: $.proxy(this.showTooltip, this),\n mouseleave: $.proxy(this.hideTooltip, this)\n });\n } else {\n this.tooltip.addClass('hide');\n }\n };\n Slider.prototype = {\n constructor: Slider,\n over: false,\n inDrag: false,\n showTooltip: function () {\n this.tooltip.addClass('in');\n //var left = Math.round(this.percent*this.width);\n //this.tooltip.css('left', left - this.tooltip.outerWidth()/2);\n this.over = true;\n },\n hideTooltip: function () {\n if (this.inDrag === false) {\n this.tooltip.removeClass('in');\n }\n this.over = false;\n },\n layout: function () {\n this.handle1Stype[this.stylePos] = this.percentage[0] + '%';\n this.handle2Stype[this.stylePos] = this.percentage[1] + '%';\n if (this.orientation == 'vertical') {\n this.selectionElStyle.top = Math.min(this.percentage[0], this.percentage[1]) + '%';\n this.selectionElStyle.height = Math.abs(this.percentage[0] - this.percentage[1]) + '%';\n } else {\n this.selectionElStyle.left = Math.min(this.percentage[0], this.percentage[1]) + '%';\n this.selectionElStyle.width = Math.abs(this.percentage[0] - this.percentage[1]) + '%';\n }\n if (this.range) {\n this.tooltipInner.text(this.formater(this.value[0]) + ' : ' + this.formater(this.value[1]));\n this.tooltip[0].style[this.stylePos] = this.size * (this.percentage[0] + (this.percentage[1] - this.percentage[0]) / 2) / 100 - (this.orientation === 'vertical' ? this.tooltip.outerHeight() / 2 : this.tooltip.outerWidth() / 2) + 'px';\n } else {\n this.tooltipInner.text(this.formater(this.value[0]));\n this.tooltip[0].style[this.stylePos] = this.size * this.percentage[0] / 100 - (this.orientation === 'vertical' ? this.tooltip.outerHeight() / 2 : this.tooltip.outerWidth() / 2) + 'px';\n }\n },\n mousedown: function (ev) {\n // Touch: Get the original event:\n if (this.touchCapable && ev.type === 'touchstart') {\n ev = ev.originalEvent;\n }\n this.offset = this.picker.offset();\n this.size = this.picker[0][this.sizePos];\n var percentage = this.getPercentage(ev);\n if (this.range) {\n var diff1 = Math.abs(this.percentage[0] - percentage);\n var diff2 = Math.abs(this.percentage[1] - percentage);\n this.dragged = diff1 < diff2 ? 0 : 1;\n } else {\n this.dragged = 0;\n }\n this.percentage[this.dragged] = percentage;\n this.layout();\n if (this.touchCapable) {\n // Touch: Bind touch events:\n $(document).on({\n touchmove: $.proxy(this.mousemove, this),\n touchend: $.proxy(this.mouseup, this)\n });\n } else {\n $(document).on({\n mousemove: $.proxy(this.mousemove, this),\n mouseup: $.proxy(this.mouseup, this)\n });\n }\n this.inDrag = true;\n var val = this.calculateValue();\n this.element.trigger({\n type: 'slideStart',\n value: val\n }).trigger({\n type: 'slide',\n value: val\n });\n return false;\n },\n mousemove: function (ev) {\n // Touch: Get the original event:\n if (this.touchCapable && ev.type === 'touchmove') {\n ev = ev.originalEvent;\n }\n var percentage = this.getPercentage(ev);\n if (this.range) {\n if (this.dragged === 0 && this.percentage[1] < percentage) {\n this.percentage[0] = this.percentage[1];\n this.dragged = 1;\n } else if (this.dragged === 1 && this.percentage[0] > percentage) {\n this.percentage[1] = this.percentage[0];\n this.dragged = 0;\n }\n }\n this.percentage[this.dragged] = percentage;\n this.layout();\n var val = this.calculateValue();\n this.element.trigger({\n type: 'slide',\n value: val\n }).data('value', val).prop('value', val);\n return false;\n },\n mouseup: function (ev) {\n if (this.touchCapable) {\n // Touch: Bind touch events:\n $(document).off({\n touchmove: this.mousemove,\n touchend: this.mouseup\n });\n } else {\n $(document).off({\n mousemove: this.mousemove,\n mouseup: this.mouseup\n });\n }\n this.inDrag = false;\n if (this.over == false) {\n this.hideTooltip();\n }\n this.element;\n var val = this.calculateValue();\n this.element.trigger({\n type: 'slideStop',\n value: val\n }).data('value', val).prop('value', val);\n return false;\n },\n calculateValue: function () {\n var val;\n if (this.range) {\n val = [this.min + Math.round(this.diff * this.percentage[0] / 100 / this.step) * this.step, this.min + Math.round(this.diff * this.percentage[1] / 100 / this.step) * this.step];\n this.value = val;\n } else {\n val = this.min + Math.round(this.diff * this.percentage[0] / 100 / this.step) * this.step;\n this.value = [val, this.value[1]];\n }\n return val;\n },\n getPercentage: function (ev) {\n if (this.touchCapable) {\n ev = ev.touches[0];\n }\n var percentage = (ev[this.mousePos] - this.offset[this.stylePos]) * 100 / this.size;\n percentage = Math.round(percentage / this.percentage[2]) * this.percentage[2];\n return Math.max(0, Math.min(100, percentage));\n },\n getValue: function () {\n if (this.range) {\n return this.value;\n }\n return this.value[0];\n },\n setValue: function (val) {\n this.value = val;\n if (this.range) {\n this.value[0] = Math.max(this.min, Math.min(this.max, this.value[0]));\n this.value[1] = Math.max(this.min, Math.min(this.max, this.value[1]));\n } else {\n this.value = [Math.max(this.min, Math.min(this.max, this.value))];\n this.handle2.addClass('hide');\n if (this.selection == 'after') {\n this.value[1] = this.max;\n } else {\n this.value[1] = this.min;\n }\n }\n this.diff = this.max - this.min;\n this.percentage = [(this.value[0] - this.min) * 100 / this.diff, (this.value[1] - this.min) * 100 / this.diff, this.step * 100 / this.diff];\n this.layout();\n }\n };\n $.fn.slider = function (option, val) {\n return this.each(function () {\n var $this = $(this),\n data = $this.data('slider'),\n options = typeof option === 'object' && option;\n if (!data) {\n $this.data('slider', data = new Slider(this, $.extend({}, $.fn.slider.defaults, options)));\n }\n if (typeof option == 'string') {\n data[option](val);\n }\n });\n };\n $.fn.slider.defaults = {\n min: 0,\n max: 10,\n step: 1,\n orientation: 'horizontal',\n value: 5,\n selection: 'before',\n tooltip: 'show',\n handle: 'round',\n formater: function (value) {\n return value;\n }\n };\n $.fn.slider.Constructor = Slider;\n}(window.jQuery);","/** ## jquery.flot.canvaswrapper\n\nThis plugin contains the function for creating and manipulating both the canvas\nlayers and svg layers.\n\nThe Canvas object is a wrapper around an HTML5 canvas tag.\nThe constructor Canvas(cls, container) takes as parameters cls,\nthe list of classes to apply to the canvas adnd the containter,\nelement onto which to append the canvas. The canvas operations\ndon't work unless the canvas is attached to the DOM.\n\n### jquery.canvaswrapper.js API functions\n*/\n\n(function ($) {\n var Canvas = function (cls, container) {\n var element = container.getElementsByClassName(cls)[0];\n if (!element) {\n element = document.createElement('canvas');\n element.className = cls;\n element.style.direction = 'ltr';\n element.style.position = 'absolute';\n element.style.left = '0px';\n element.style.top = '0px';\n container.appendChild(element);\n\n // If HTML5 Canvas isn't available, throw\n\n if (!element.getContext) {\n throw new Error('Canvas is not available.');\n }\n }\n this.element = element;\n var context = this.context = element.getContext('2d');\n this.pixelRatio = $.plot.browser.getPixelRatio(context);\n\n // Size the canvas to match the internal dimensions of its container\n var width = $(container).width();\n var height = $(container).height();\n this.resize(width, height);\n\n // Collection of HTML div layers for text overlaid onto the canvas\n\n this.SVGContainer = null;\n this.SVG = {};\n\n // Cache of text fragments and metrics, so we can avoid expensively\n // re-calculating them when the plot is re-rendered in a loop.\n\n this._textCache = {};\n };\n\n /**\n - resize(width, height)\n Resizes the canvas to the given dimensions.\n The width represents the new width of the canvas, meanwhile the height\n is the new height of the canvas, both of them in pixels.\n */\n\n Canvas.prototype.resize = function (width, height) {\n var minSize = 10;\n width = width < minSize ? minSize : width;\n height = height < minSize ? minSize : height;\n var element = this.element,\n context = this.context,\n pixelRatio = this.pixelRatio;\n\n // Resize the canvas, increasing its density based on the display's\n // pixel ratio; basically giving it more pixels without increasing the\n // size of its element, to take advantage of the fact that retina\n // displays have that many more pixels in the same advertised space.\n\n // Resizing should reset the state (excanvas seems to be buggy though)\n\n if (this.width !== width) {\n element.width = width * pixelRatio;\n element.style.width = width + 'px';\n this.width = width;\n }\n if (this.height !== height) {\n element.height = height * pixelRatio;\n element.style.height = height + 'px';\n this.height = height;\n }\n\n // Save the context, so we can reset in case we get replotted. The\n // restore ensure that we're really back at the initial state, and\n // should be safe even if we haven't saved the initial state yet.\n\n context.restore();\n context.save();\n\n // Scale the coordinate space to match the display density; so even though we\n // may have twice as many pixels, we still want lines and other drawing to\n // appear at the same size; the extra pixels will just make them crisper.\n\n context.scale(pixelRatio, pixelRatio);\n };\n\n /**\n - clear()\n Clears the entire canvas area, not including any overlaid HTML text\n */\n Canvas.prototype.clear = function () {\n this.context.clearRect(0, 0, this.width, this.height);\n };\n\n /**\n - render()\n Finishes rendering the canvas, including managing the text overlay.\n */\n Canvas.prototype.render = function () {\n var cache = this._textCache;\n\n // For each text layer, add elements marked as active that haven't\n // already been rendered, and remove those that are no longer active.\n\n for (var layerKey in cache) {\n if (hasOwnProperty.call(cache, layerKey)) {\n var layer = this.getSVGLayer(layerKey),\n layerCache = cache[layerKey];\n var display = layer.style.display;\n layer.style.display = 'none';\n for (var styleKey in layerCache) {\n if (hasOwnProperty.call(layerCache, styleKey)) {\n var styleCache = layerCache[styleKey];\n for (var key in styleCache) {\n if (hasOwnProperty.call(styleCache, key)) {\n var val = styleCache[key],\n positions = val.positions;\n for (var i = 0, position; positions[i]; i++) {\n position = positions[i];\n if (position.active) {\n if (!position.rendered) {\n layer.appendChild(position.element);\n position.rendered = true;\n }\n } else {\n positions.splice(i--, 1);\n if (position.rendered) {\n while (position.element.firstChild) {\n position.element.removeChild(position.element.firstChild);\n }\n position.element.parentNode.removeChild(position.element);\n }\n }\n }\n if (positions.length === 0) {\n if (val.measured) {\n val.measured = false;\n } else {\n delete styleCache[key];\n }\n }\n }\n }\n }\n }\n layer.style.display = display;\n }\n }\n };\n\n /**\n - getSVGLayer(classes)\n Creates (if necessary) and returns the SVG overlay container.\n The classes string represents the string of space-separated CSS classes\n used to uniquely identify the text layer. It return the svg-layer div.\n */\n Canvas.prototype.getSVGLayer = function (classes) {\n var layer = this.SVG[classes];\n\n // Create the SVG layer if it doesn't exist\n\n if (!layer) {\n // Create the svg layer container, if it doesn't exist\n\n var svgElement;\n if (!this.SVGContainer) {\n this.SVGContainer = document.createElement('div');\n this.SVGContainer.className = 'flot-svg';\n this.SVGContainer.style.position = 'absolute';\n this.SVGContainer.style.top = '0px';\n this.SVGContainer.style.left = '0px';\n this.SVGContainer.style.height = '100%';\n this.SVGContainer.style.width = '100%';\n this.SVGContainer.style.pointerEvents = 'none';\n this.element.parentNode.appendChild(this.SVGContainer);\n svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svgElement.style.width = '100%';\n svgElement.style.height = '100%';\n this.SVGContainer.appendChild(svgElement);\n } else {\n svgElement = this.SVGContainer.firstChild;\n }\n layer = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n layer.setAttribute('class', classes);\n layer.style.position = 'absolute';\n layer.style.top = '0px';\n layer.style.left = '0px';\n layer.style.bottom = '0px';\n layer.style.right = '0px';\n svgElement.appendChild(layer);\n this.SVG[classes] = layer;\n }\n return layer;\n };\n\n /**\n - getTextInfo(layer, text, font, angle, width)\n Creates (if necessary) and returns a text info object.\n The object looks like this:\n ```js\n {\n width //Width of the text's wrapper div.\n height //Height of the text's wrapper div.\n element //The HTML div containing the text.\n positions //Array of positions at which this text is drawn.\n }\n ```\n The positions array contains objects that look like this:\n ```js\n {\n active //Flag indicating whether the text should be visible.\n rendered //Flag indicating whether the text is currently visible.\n element //The HTML div containing the text.\n text //The actual text and is identical with element[0].textContent.\n x //X coordinate at which to draw the text.\n y //Y coordinate at which to draw the text.\n }\n ```\n Each position after the first receives a clone of the original element.\n The idea is that that the width, height, and general 'identity' of the\n text is constant no matter where it is placed; the placements are a\n secondary property.\n Canvas maintains a cache of recently-used text info objects; getTextInfo\n either returns the cached element or creates a new entry.\n The layer parameter is string of space-separated CSS classes uniquely\n identifying the layer containing this text.\n Text is the text string to retrieve info for.\n Font is either a string of space-separated CSS classes or a font-spec object,\n defining the text's font and style.\n Angle is the angle at which to rotate the text, in degrees. Angle is currently unused,\n it will be implemented in the future.\n The last parameter is the Maximum width of the text before it wraps.\n The method returns a text info object.\n */\n Canvas.prototype.getTextInfo = function (layer, text, font, angle, width) {\n var textStyle, layerCache, styleCache, info;\n\n // Cast the value to a string, in case we were given a number or such\n\n text = '' + text;\n\n // If the font is a font-spec object, generate a CSS font definition\n\n if (typeof font === 'object') {\n textStyle = font.style + ' ' + font.variant + ' ' + font.weight + ' ' + font.size + 'px/' + font.lineHeight + 'px ' + font.family;\n } else {\n textStyle = font;\n }\n\n // Retrieve (or create) the cache for the text's layer and styles\n\n layerCache = this._textCache[layer];\n if (layerCache == null) {\n layerCache = this._textCache[layer] = {};\n }\n styleCache = layerCache[textStyle];\n if (styleCache == null) {\n styleCache = layerCache[textStyle] = {};\n }\n var key = generateKey(text);\n info = styleCache[key];\n\n // If we can't find a matching element in our cache, create a new one\n\n if (!info) {\n var element = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n if (text.indexOf('
') !== -1) {\n addTspanElements(text, element, -9999);\n } else {\n var textNode = document.createTextNode(text);\n element.appendChild(textNode);\n }\n element.style.position = 'absolute';\n element.style.maxWidth = width;\n element.setAttributeNS(null, 'x', -9999);\n element.setAttributeNS(null, 'y', -9999);\n if (typeof font === 'object') {\n element.style.font = textStyle;\n element.style.fill = font.fill;\n } else if (typeof font === 'string') {\n element.setAttribute('class', font);\n }\n this.getSVGLayer(layer).appendChild(element);\n var elementRect = element.getBBox();\n info = styleCache[key] = {\n width: elementRect.width,\n height: elementRect.height,\n measured: true,\n element: element,\n positions: []\n };\n\n //remove elements from dom\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n element.parentNode.removeChild(element);\n }\n info.measured = true;\n return info;\n };\n function updateTransforms(element, transforms) {\n element.transform.baseVal.clear();\n if (transforms) {\n transforms.forEach(function (t) {\n element.transform.baseVal.appendItem(t);\n });\n }\n }\n\n /**\n - addText (layer, x, y, text, font, angle, width, halign, valign, transforms)\n Adds a text string to the canvas text overlay.\n The text isn't drawn immediately; it is marked as rendering, which will\n result in its addition to the canvas on the next render pass.\n The layer is string of space-separated CSS classes uniquely\n identifying the layer containing this text.\n X and Y represents the X and Y coordinate at which to draw the text.\n and text is the string to draw\n */\n Canvas.prototype.addText = function (layer, x, y, text, font, angle, width, halign, valign, transforms) {\n var info = this.getTextInfo(layer, text, font, angle, width),\n positions = info.positions;\n\n // Tweak the div's position to match the text's alignment\n\n if (halign === 'center') {\n x -= info.width / 2;\n } else if (halign === 'right') {\n x -= info.width;\n }\n if (valign === 'middle') {\n y -= info.height / 2;\n } else if (valign === 'bottom') {\n y -= info.height;\n }\n y += 0.75 * info.height;\n\n // Determine whether this text already exists at this position.\n // If so, mark it for inclusion in the next render pass.\n\n for (var i = 0, position; positions[i]; i++) {\n position = positions[i];\n if (position.x === x && position.y === y && position.text === text) {\n position.active = true;\n // update the transforms\n updateTransforms(position.element, transforms);\n return;\n } else if (position.active === false) {\n position.active = true;\n position.text = text;\n if (text.indexOf('
') !== -1) {\n y -= 0.25 * info.height;\n addTspanElements(text, position.element, x);\n } else {\n position.element.textContent = text;\n }\n position.element.setAttributeNS(null, 'x', x);\n position.element.setAttributeNS(null, 'y', y);\n position.x = x;\n position.y = y;\n // update the transforms\n updateTransforms(position.element, transforms);\n return;\n }\n }\n\n // If the text doesn't exist at this position, create a new entry\n\n // For the very first position we'll re-use the original element,\n // while for subsequent ones we'll clone it.\n\n position = {\n active: true,\n rendered: false,\n element: positions.length ? info.element.cloneNode() : info.element,\n text: text,\n x: x,\n y: y\n };\n positions.push(position);\n if (text.indexOf('
') !== -1) {\n y -= 0.25 * info.height;\n addTspanElements(text, position.element, x);\n } else {\n position.element.textContent = text;\n }\n\n // Move the element to its final position within the container\n position.element.setAttributeNS(null, 'x', x);\n position.element.setAttributeNS(null, 'y', y);\n position.element.style.textAlign = halign;\n // update the transforms\n updateTransforms(position.element, transforms);\n };\n var addTspanElements = function (text, element, x) {\n var lines = text.split('
'),\n tspan,\n i,\n offset;\n for (i = 0; i < lines.length; i++) {\n if (!element.childNodes[i]) {\n tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n element.appendChild(tspan);\n } else {\n tspan = element.childNodes[i];\n }\n tspan.textContent = lines[i];\n offset = (i === 0 ? 0 : 1) + 'em';\n tspan.setAttributeNS(null, 'dy', offset);\n tspan.setAttributeNS(null, 'x', x);\n }\n };\n\n /**\n - removeText (layer, x, y, text, font, angle)\n The function removes one or more text strings from the canvas text overlay.\n If no parameters are given, all text within the layer is removed.\n Note that the text is not immediately removed; it is simply marked as\n inactive, which will result in its removal on the next render pass.\n This avoids the performance penalty for 'clear and redraw' behavior,\n where we potentially get rid of all text on a layer, but will likely\n add back most or all of it later, as when redrawing axes, for example.\n The layer is a string of space-separated CSS classes uniquely\n identifying the layer containing this text. The following parameter are\n X and Y coordinate of the text.\n Text is the string to remove, while the font is either a string of space-separated CSS\n classes or a font-spec object, defining the text's font and style.\n */\n Canvas.prototype.removeText = function (layer, x, y, text, font, angle) {\n var info, htmlYCoord;\n if (text == null) {\n var layerCache = this._textCache[layer];\n if (layerCache != null) {\n for (var styleKey in layerCache) {\n if (hasOwnProperty.call(layerCache, styleKey)) {\n var styleCache = layerCache[styleKey];\n for (var key in styleCache) {\n if (hasOwnProperty.call(styleCache, key)) {\n var positions = styleCache[key].positions;\n positions.forEach(function (position) {\n position.active = false;\n });\n }\n }\n }\n }\n }\n } else {\n info = this.getTextInfo(layer, text, font, angle);\n positions = info.positions;\n positions.forEach(function (position) {\n htmlYCoord = y + 0.75 * info.height;\n if (position.x === x && position.y === htmlYCoord && position.text === text) {\n position.active = false;\n }\n });\n }\n };\n\n /**\n - clearCache()\n Clears the cache used to speed up the text size measurements.\n As an (unfortunate) side effect all text within the text Layer is removed.\n Use this function before plot.setupGrid() and plot.draw() if the plot just\n became visible or the styles changed.\n */\n Canvas.prototype.clearCache = function () {\n var cache = this._textCache;\n for (var layerKey in cache) {\n if (hasOwnProperty.call(cache, layerKey)) {\n var layer = this.getSVGLayer(layerKey);\n while (layer.firstChild) {\n layer.removeChild(layer.firstChild);\n }\n }\n }\n ;\n this._textCache = {};\n };\n function generateKey(text) {\n return text.replace(/0|1|2|3|4|5|6|7|8|9/g, '0');\n }\n if (!window.Flot) {\n window.Flot = {};\n }\n window.Flot.Canvas = Canvas;\n})(jQuery);","/* Javascript plotting library for jQuery, version 3.0.0.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\n*/\n\n// the actual Flot code\n(function ($) {\n \"use strict\";\n\n var Canvas = window.Flot.Canvas;\n function defaultTickGenerator(axis) {\n var ticks = [],\n start = $.plot.saturated.saturate($.plot.saturated.floorInBase(axis.min, axis.tickSize)),\n i = 0,\n v = Number.NaN,\n prev;\n if (start === -Number.MAX_VALUE) {\n ticks.push(start);\n start = $.plot.saturated.floorInBase(axis.min + axis.tickSize, axis.tickSize);\n }\n do {\n prev = v;\n //v = start + i * axis.tickSize;\n v = $.plot.saturated.multiplyAdd(axis.tickSize, i, start);\n ticks.push(v);\n ++i;\n } while (v < axis.max && v !== prev);\n return ticks;\n }\n function defaultTickFormatter(value, axis, precision) {\n var oldTickDecimals = axis.tickDecimals,\n expPosition = (\"\" + value).indexOf(\"e\");\n if (expPosition !== -1) {\n return expRepTickFormatter(value, axis, precision);\n }\n if (precision > 0) {\n axis.tickDecimals = precision;\n }\n var factor = axis.tickDecimals ? parseFloat('1e' + axis.tickDecimals) : 1,\n formatted = \"\" + Math.round(value * factor) / factor;\n\n // If tickDecimals was specified, ensure that we have exactly that\n // much precision; otherwise default to the value's own precision.\n if (axis.tickDecimals != null) {\n var decimal = formatted.indexOf(\".\"),\n decimalPrecision = decimal === -1 ? 0 : formatted.length - decimal - 1;\n if (decimalPrecision < axis.tickDecimals) {\n var decimals = (\"\" + factor).substr(1, axis.tickDecimals - decimalPrecision);\n formatted = (decimalPrecision ? formatted : formatted + \".\") + decimals;\n }\n }\n axis.tickDecimals = oldTickDecimals;\n return formatted;\n }\n ;\n function expRepTickFormatter(value, axis, precision) {\n var expPosition = (\"\" + value).indexOf(\"e\"),\n exponentValue = parseInt((\"\" + value).substr(expPosition + 1)),\n tenExponent = expPosition !== -1 ? exponentValue : value > 0 ? Math.floor(Math.log(value) / Math.LN10) : 0,\n roundWith = parseFloat('1e' + tenExponent),\n x = value / roundWith;\n if (precision) {\n var updatedPrecision = recomputePrecision(value, precision);\n return (value / roundWith).toFixed(updatedPrecision) + 'e' + tenExponent;\n }\n if (axis.tickDecimals > 0) {\n return x.toFixed(recomputePrecision(value, axis.tickDecimals)) + 'e' + tenExponent;\n }\n return x.toFixed() + 'e' + tenExponent;\n }\n function recomputePrecision(num, precision) {\n //for numbers close to zero, the precision from flot will be a big number\n //while for big numbers, the precision will be negative\n var log10Value = Math.log(Math.abs(num)) * Math.LOG10E,\n newPrecision = Math.abs(log10Value + precision);\n return newPrecision <= 20 ? Math.floor(newPrecision) : 20;\n }\n\n ///////////////////////////////////////////////////////////////////////////\n // The top-level container for the entire plot.\n function Plot(placeholder, data_, options_, plugins) {\n // data is on the form:\n // [ series1, series2 ... ]\n // where series is either just the data as [ [x1, y1], [x2, y2], ... ]\n // or { data: [ [x1, y1], [x2, y2], ... ], label: \"some label\", ... }\n\n var series = [],\n options = {\n // the color theme used for graphs\n colors: [\"#edc240\", \"#afd8f8\", \"#cb4b4b\", \"#4da74d\", \"#9440ed\"],\n xaxis: {\n show: null,\n // null = auto-detect, true = always, false = never\n position: \"bottom\",\n // or \"top\"\n mode: null,\n // null or \"time\"\n font: null,\n // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: \"italic\", weight: \"bold\", family: \"sans-serif\", variant: \"small-caps\" }\n color: null,\n // base color, labels, ticks\n tickColor: null,\n // possibly different color of ticks, e.g. \"rgba(0,0,0,0.15)\"\n transform: null,\n // null or f: number -> number to transform axis\n inverseTransform: null,\n // if transform is set, this should be the inverse function\n min: null,\n // min. value to show, null means set automatically\n max: null,\n // max. value to show, null means set automatically\n autoScaleMargin: null,\n // margin in % to add if autoScale option is on \"loose\" mode,\n autoScale: \"exact\",\n // Available modes: \"none\", \"loose\", \"exact\", \"sliding-window\"\n windowSize: null,\n // null or number. This is the size of sliding-window.\n growOnly: null,\n // grow only, useful for smoother auto-scale, the scales will grow to accomodate data but won't shrink back.\n ticks: null,\n // either [1, 3] or [[1, \"a\"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks\n tickFormatter: null,\n // fn: number -> string\n showTickLabels: \"major\",\n // \"none\", \"endpoints\", \"major\", \"all\"\n labelWidth: null,\n // size of tick labels in pixels\n labelHeight: null,\n reserveSpace: null,\n // whether to reserve space even if axis isn't shown\n tickLength: null,\n // size in pixels of major tick marks\n showMinorTicks: null,\n // true = show minor tick marks, false = hide minor tick marks\n showTicks: null,\n // true = show tick marks, false = hide all tick marks\n gridLines: null,\n // true = show grid lines, false = hide grid lines\n alignTicksWithAxis: null,\n // axis number or null for no sync\n tickDecimals: null,\n // no. of decimals, null means auto\n tickSize: null,\n // number or [number, \"unit\"]\n minTickSize: null,\n // number or [number, \"unit\"]\n offset: {\n below: 0,\n above: 0\n },\n // the plot drawing offset. this is calculated by the flot.navigate for each axis\n boxPosition: {\n centerX: 0,\n centerY: 0\n } //position of the axis on the corresponding axis box\n },\n yaxis: {\n autoScaleMargin: 0.02,\n // margin in % to add if autoScale option is on \"loose\" mode\n autoScale: \"loose\",\n // Available modes: \"none\", \"loose\", \"exact\"\n growOnly: null,\n // grow only, useful for smoother auto-scale, the scales will grow to accomodate data but won't shrink back.\n position: \"left\",\n // or \"right\"\n showTickLabels: \"major\",\n // \"none\", \"endpoints\", \"major\", \"all\"\n offset: {\n below: 0,\n above: 0\n },\n // the plot drawing offset. this is calculated by the flot.navigate for each axis\n boxPosition: {\n centerX: 0,\n centerY: 0\n } //position of the axis on the corresponding axis box\n },\n xaxes: [],\n yaxes: [],\n series: {\n points: {\n show: false,\n radius: 3,\n lineWidth: 2,\n // in pixels\n fill: true,\n fillColor: \"#ffffff\",\n symbol: 'circle' // or callback\n },\n lines: {\n // we don't put in show: false so we can see\n // whether lines were actively disabled\n lineWidth: 1,\n // in pixels\n fill: false,\n fillColor: null,\n steps: false\n // Omit 'zero', so we can later default its value to\n // match that of the 'fill' option.\n },\n bars: {\n show: false,\n lineWidth: 2,\n // in pixels\n // barWidth: number or [number, absolute]\n // when 'absolute' is false, 'number' is relative to the minimum distance between points for the series\n // when 'absolute' is true, 'number' is considered to be in units of the x-axis\n horizontal: false,\n barWidth: 0.8,\n fill: true,\n fillColor: null,\n align: \"left\",\n // \"left\", \"right\", or \"center\"\n zero: true\n },\n shadowSize: 3,\n highlightColor: null\n },\n grid: {\n show: true,\n aboveData: false,\n color: \"#545454\",\n // primary color used for outline and labels\n backgroundColor: null,\n // null for transparent, else color\n borderColor: null,\n // set if different from the grid color\n tickColor: null,\n // color for the ticks, e.g. \"rgba(0,0,0,0.15)\"\n margin: 0,\n // distance from the canvas edge to the grid\n labelMargin: 5,\n // in pixels\n axisMargin: 8,\n // in pixels\n borderWidth: 1,\n // in pixels\n minBorderMargin: null,\n // in pixels, null means taken from points radius\n markings: null,\n // array of ranges or fn: axes -> array of ranges\n markingsColor: \"#f4f4f4\",\n markingsLineWidth: 2,\n // interactive stuff\n clickable: false,\n hoverable: false,\n autoHighlight: true,\n // highlight in case mouse is near\n mouseActiveRadius: 15 // how far the mouse can be away to activate an item\n },\n interaction: {\n redrawOverlayInterval: 1000 / 60 // time between updates, -1 means in same flow\n },\n hooks: {}\n },\n surface = null,\n // the canvas for the plot itself\n overlay = null,\n // canvas for interactive stuff on top of plot\n eventHolder = null,\n // jQuery object that events should be bound to\n ctx = null,\n octx = null,\n xaxes = [],\n yaxes = [],\n plotOffset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n plotWidth = 0,\n plotHeight = 0,\n hooks = {\n processOptions: [],\n processRawData: [],\n processDatapoints: [],\n processOffset: [],\n setupGrid: [],\n adjustSeriesDataRange: [],\n setRange: [],\n drawBackground: [],\n drawSeries: [],\n drawAxis: [],\n draw: [],\n findNearbyItems: [],\n axisReserveSpace: [],\n bindEvents: [],\n drawOverlay: [],\n resize: [],\n shutdown: []\n },\n plot = this;\n var eventManager = {};\n\n // interactive features\n\n var redrawTimeout = null;\n\n // public functions\n plot.setData = setData;\n plot.setupGrid = setupGrid;\n plot.draw = draw;\n plot.getPlaceholder = function () {\n return placeholder;\n };\n plot.getCanvas = function () {\n return surface.element;\n };\n plot.getSurface = function () {\n return surface;\n };\n plot.getEventHolder = function () {\n return eventHolder[0];\n };\n plot.getPlotOffset = function () {\n return plotOffset;\n };\n plot.width = function () {\n return plotWidth;\n };\n plot.height = function () {\n return plotHeight;\n };\n plot.offset = function () {\n var o = eventHolder.offset();\n o.left += plotOffset.left;\n o.top += plotOffset.top;\n return o;\n };\n plot.getData = function () {\n return series;\n };\n plot.getAxes = function () {\n var res = {};\n $.each(xaxes.concat(yaxes), function (_, axis) {\n if (axis) {\n res[axis.direction + (axis.n !== 1 ? axis.n : \"\") + \"axis\"] = axis;\n }\n });\n return res;\n };\n plot.getXAxes = function () {\n return xaxes;\n };\n plot.getYAxes = function () {\n return yaxes;\n };\n plot.c2p = canvasToCartesianAxisCoords;\n plot.p2c = cartesianAxisToCanvasCoords;\n plot.getOptions = function () {\n return options;\n };\n plot.triggerRedrawOverlay = triggerRedrawOverlay;\n plot.pointOffset = function (point) {\n return {\n left: parseInt(xaxes[axisNumber(point, \"x\") - 1].p2c(+point.x) + plotOffset.left, 10),\n top: parseInt(yaxes[axisNumber(point, \"y\") - 1].p2c(+point.y) + plotOffset.top, 10)\n };\n };\n plot.shutdown = shutdown;\n plot.destroy = function () {\n shutdown();\n placeholder.removeData(\"plot\").empty();\n series = [];\n options = null;\n surface = null;\n overlay = null;\n eventHolder = null;\n ctx = null;\n octx = null;\n xaxes = [];\n yaxes = [];\n hooks = null;\n plot = null;\n };\n plot.resize = function () {\n var width = placeholder.width(),\n height = placeholder.height();\n surface.resize(width, height);\n overlay.resize(width, height);\n executeHooks(hooks.resize, [width, height]);\n };\n plot.clearTextCache = function () {\n surface.clearCache();\n overlay.clearCache();\n };\n plot.autoScaleAxis = autoScaleAxis;\n plot.computeRangeForDataSeries = computeRangeForDataSeries;\n plot.adjustSeriesDataRange = adjustSeriesDataRange;\n plot.findNearbyItem = findNearbyItem;\n plot.findNearbyItems = findNearbyItems;\n plot.findNearbyInterpolationPoint = findNearbyInterpolationPoint;\n plot.computeValuePrecision = computeValuePrecision;\n plot.computeTickSize = computeTickSize;\n plot.addEventHandler = addEventHandler;\n\n // public attributes\n plot.hooks = hooks;\n\n // initialize\n var MINOR_TICKS_COUNT_CONSTANT = $.plot.uiConstants.MINOR_TICKS_COUNT_CONSTANT;\n var TICK_LENGTH_CONSTANT = $.plot.uiConstants.TICK_LENGTH_CONSTANT;\n initPlugins(plot);\n setupCanvases();\n parseOptions(options_);\n setData(data_);\n setupGrid(true);\n draw();\n bindEvents();\n function executeHooks(hook, args) {\n args = [plot].concat(args);\n for (var i = 0; i < hook.length; ++i) {\n hook[i].apply(this, args);\n }\n }\n function initPlugins() {\n // References to key classes, allowing plugins to modify them\n\n var classes = {\n Canvas: Canvas\n };\n for (var i = 0; i < plugins.length; ++i) {\n var p = plugins[i];\n p.init(plot, classes);\n if (p.options) {\n $.extend(true, options, p.options);\n }\n }\n }\n function parseOptions(opts) {\n $.extend(true, options, opts);\n\n // $.extend merges arrays, rather than replacing them. When less\n // colors are provided than the size of the default palette, we\n // end up with those colors plus the remaining defaults, which is\n // not expected behavior; avoid it by replacing them here.\n\n if (opts && opts.colors) {\n options.colors = opts.colors;\n }\n if (options.xaxis.color == null) {\n options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n }\n if (options.yaxis.color == null) {\n options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n }\n if (options.xaxis.tickColor == null) {\n // grid.tickColor for back-compatibility\n options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;\n }\n if (options.yaxis.tickColor == null) {\n // grid.tickColor for back-compatibility\n options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;\n }\n if (options.grid.borderColor == null) {\n options.grid.borderColor = options.grid.color;\n }\n if (options.grid.tickColor == null) {\n options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n }\n\n // Fill in defaults for axis options, including any unspecified\n // font-spec fields, if a font-spec was provided.\n\n // If no x/y axis options were provided, create one of each anyway,\n // since the rest of the code assumes that they exist.\n\n var i,\n axisOptions,\n axisCount,\n fontSize = placeholder.css(\"font-size\"),\n fontSizeDefault = fontSize ? +fontSize.replace(\"px\", \"\") : 13,\n fontDefaults = {\n style: placeholder.css(\"font-style\"),\n size: Math.round(0.8 * fontSizeDefault),\n variant: placeholder.css(\"font-variant\"),\n weight: placeholder.css(\"font-weight\"),\n family: placeholder.css(\"font-family\")\n };\n axisCount = options.xaxes.length || 1;\n for (i = 0; i < axisCount; ++i) {\n axisOptions = options.xaxes[i];\n if (axisOptions && !axisOptions.tickColor) {\n axisOptions.tickColor = axisOptions.color;\n }\n axisOptions = $.extend(true, {}, options.xaxis, axisOptions);\n options.xaxes[i] = axisOptions;\n if (axisOptions.font) {\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\n if (!axisOptions.font.color) {\n axisOptions.font.color = axisOptions.color;\n }\n if (!axisOptions.font.lineHeight) {\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\n }\n }\n }\n axisCount = options.yaxes.length || 1;\n for (i = 0; i < axisCount; ++i) {\n axisOptions = options.yaxes[i];\n if (axisOptions && !axisOptions.tickColor) {\n axisOptions.tickColor = axisOptions.color;\n }\n axisOptions = $.extend(true, {}, options.yaxis, axisOptions);\n options.yaxes[i] = axisOptions;\n if (axisOptions.font) {\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\n if (!axisOptions.font.color) {\n axisOptions.font.color = axisOptions.color;\n }\n if (!axisOptions.font.lineHeight) {\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\n }\n }\n }\n\n // save options on axes for future reference\n for (i = 0; i < options.xaxes.length; ++i) {\n getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];\n }\n for (i = 0; i < options.yaxes.length; ++i) {\n getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];\n }\n\n //process boxPosition options used for axis.box size\n $.each(allAxes(), function (_, axis) {\n axis.boxPosition = axis.options.boxPosition || {\n centerX: 0,\n centerY: 0\n };\n });\n\n // add hooks from options\n for (var n in hooks) {\n if (options.hooks[n] && options.hooks[n].length) {\n hooks[n] = hooks[n].concat(options.hooks[n]);\n }\n }\n executeHooks(hooks.processOptions, [options]);\n }\n function setData(d) {\n var oldseries = series;\n series = parseData(d);\n fillInSeriesOptions();\n processData(oldseries);\n }\n function parseData(d) {\n var res = [];\n for (var i = 0; i < d.length; ++i) {\n var s = $.extend(true, {}, options.series);\n if (d[i].data != null) {\n s.data = d[i].data; // move the data instead of deep-copy\n delete d[i].data;\n $.extend(true, s, d[i]);\n d[i].data = s.data;\n } else {\n s.data = d[i];\n }\n res.push(s);\n }\n return res;\n }\n function axisNumber(obj, coord) {\n var a = obj[coord + \"axis\"];\n if (typeof a === \"object\") {\n // if we got a real axis, extract number\n a = a.n;\n }\n if (typeof a !== \"number\") {\n a = 1; // default to first axis\n }\n return a;\n }\n function allAxes() {\n // return flat array without annoying null entries\n return xaxes.concat(yaxes).filter(function (a) {\n return a;\n });\n }\n\n // canvas to axis for cartesian axes\n function canvasToCartesianAxisCoords(pos) {\n // return an object with x/y corresponding to all used axes\n var res = {},\n i,\n axis;\n for (i = 0; i < xaxes.length; ++i) {\n axis = xaxes[i];\n if (axis && axis.used) {\n res[\"x\" + axis.n] = axis.c2p(pos.left);\n }\n }\n for (i = 0; i < yaxes.length; ++i) {\n axis = yaxes[i];\n if (axis && axis.used) {\n res[\"y\" + axis.n] = axis.c2p(pos.top);\n }\n }\n if (res.x1 !== undefined) {\n res.x = res.x1;\n }\n if (res.y1 !== undefined) {\n res.y = res.y1;\n }\n return res;\n }\n\n // axis to canvas for cartesian axes\n function cartesianAxisToCanvasCoords(pos) {\n // get canvas coords from the first pair of x/y found in pos\n var res = {},\n i,\n axis,\n key;\n for (i = 0; i < xaxes.length; ++i) {\n axis = xaxes[i];\n if (axis && axis.used) {\n key = \"x\" + axis.n;\n if (pos[key] == null && axis.n === 1) {\n key = \"x\";\n }\n if (pos[key] != null) {\n res.left = axis.p2c(pos[key]);\n break;\n }\n }\n }\n for (i = 0; i < yaxes.length; ++i) {\n axis = yaxes[i];\n if (axis && axis.used) {\n key = \"y\" + axis.n;\n if (pos[key] == null && axis.n === 1) {\n key = \"y\";\n }\n if (pos[key] != null) {\n res.top = axis.p2c(pos[key]);\n break;\n }\n }\n }\n return res;\n }\n function getOrCreateAxis(axes, number) {\n if (!axes[number - 1]) {\n axes[number - 1] = {\n n: number,\n // save the number for future reference\n direction: axes === xaxes ? \"x\" : \"y\",\n options: $.extend(true, {}, axes === xaxes ? options.xaxis : options.yaxis)\n };\n }\n return axes[number - 1];\n }\n function fillInSeriesOptions() {\n var neededColors = series.length,\n maxIndex = -1,\n i;\n\n // Subtract the number of series that already have fixed colors or\n // color indexes from the number that we still need to generate.\n\n for (i = 0; i < series.length; ++i) {\n var sc = series[i].color;\n if (sc != null) {\n neededColors--;\n if (typeof sc === \"number\" && sc > maxIndex) {\n maxIndex = sc;\n }\n }\n }\n\n // If any of the series have fixed color indexes, then we need to\n // generate at least as many colors as the highest index.\n\n if (neededColors <= maxIndex) {\n neededColors = maxIndex + 1;\n }\n\n // Generate all the colors, using first the option colors and then\n // variations on those colors once they're exhausted.\n\n var c,\n colors = [],\n colorPool = options.colors,\n colorPoolSize = colorPool.length,\n variation = 0,\n definedColors = Math.max(0, series.length - neededColors);\n for (i = 0; i < neededColors; i++) {\n c = $.color.parse(colorPool[(definedColors + i) % colorPoolSize] || \"#666\");\n\n // Each time we exhaust the colors in the pool we adjust\n // a scaling factor used to produce more variations on\n // those colors. The factor alternates negative/positive\n // to produce lighter/darker colors.\n\n // Reset the variation after every few cycles, or else\n // it will end up producing only white or black colors.\n\n if (i % colorPoolSize === 0 && i) {\n if (variation >= 0) {\n if (variation < 0.5) {\n variation = -variation - 0.2;\n } else variation = 0;\n } else variation = -variation;\n }\n colors[i] = c.scale('rgb', 1 + variation);\n }\n\n // Finalize the series options, filling in their colors\n\n var colori = 0,\n s;\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n\n // assign colors\n if (s.color == null) {\n s.color = colors[colori].toString();\n ++colori;\n } else if (typeof s.color === \"number\") {\n s.color = colors[s.color].toString();\n }\n\n // turn on lines automatically in case nothing is set\n if (s.lines.show == null) {\n var v,\n show = true;\n for (v in s) {\n if (s[v] && s[v].show) {\n show = false;\n break;\n }\n }\n if (show) {\n s.lines.show = true;\n }\n }\n\n // If nothing was provided for lines.zero, default it to match\n // lines.fill, since areas by default should extend to zero.\n\n if (s.lines.zero == null) {\n s.lines.zero = !!s.lines.fill;\n }\n\n // setup axes\n s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, \"x\"));\n s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, \"y\"));\n }\n }\n function processData(prevSeries) {\n var topSentry = Number.POSITIVE_INFINITY,\n bottomSentry = Number.NEGATIVE_INFINITY,\n i,\n j,\n k,\n m,\n s,\n points,\n ps,\n val,\n f,\n p,\n data,\n format;\n function updateAxis(axis, min, max) {\n if (min < axis.datamin && min !== -Infinity) {\n axis.datamin = min;\n }\n if (max > axis.datamax && max !== Infinity) {\n axis.datamax = max;\n }\n }\n function reusePoints(prevSeries, i) {\n if (prevSeries && prevSeries[i] && prevSeries[i].datapoints && prevSeries[i].datapoints.points) {\n return prevSeries[i].datapoints.points;\n }\n return [];\n }\n $.each(allAxes(), function (_, axis) {\n // init axis\n if (axis.options.growOnly !== true) {\n axis.datamin = topSentry;\n axis.datamax = bottomSentry;\n } else {\n if (axis.datamin === undefined) {\n axis.datamin = topSentry;\n }\n if (axis.datamax === undefined) {\n axis.datamax = bottomSentry;\n }\n }\n axis.used = false;\n });\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n s.datapoints = {\n points: []\n };\n if (s.datapoints.points.length === 0) {\n s.datapoints.points = reusePoints(prevSeries, i);\n }\n executeHooks(hooks.processRawData, [s, s.data, s.datapoints]);\n }\n\n // first pass: clean and copy data\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n data = s.data;\n format = s.datapoints.format;\n if (!format) {\n format = [];\n // find out how to copy\n format.push({\n x: true,\n y: false,\n number: true,\n required: true,\n computeRange: s.xaxis.options.autoScale !== 'none',\n defaultValue: null\n });\n format.push({\n x: false,\n y: true,\n number: true,\n required: true,\n computeRange: s.yaxis.options.autoScale !== 'none',\n defaultValue: null\n });\n if (s.stack || s.bars.show || s.lines.show && s.lines.fill) {\n var expectedPs = s.datapoints.pointsize != null ? s.datapoints.pointsize : s.data && s.data[0] && s.data[0].length ? s.data[0].length : 3;\n if (expectedPs > 2) {\n format.push({\n x: s.bars.horizontal,\n y: !s.bars.horizontal,\n number: true,\n required: false,\n computeRange: s.yaxis.options.autoScale !== 'none',\n defaultValue: 0\n });\n }\n }\n s.datapoints.format = format;\n }\n s.xaxis.used = s.yaxis.used = true;\n if (s.datapoints.pointsize != null) continue; // already filled in\n\n s.datapoints.pointsize = format.length;\n ps = s.datapoints.pointsize;\n points = s.datapoints.points;\n for (j = k = 0; j < data.length; ++j, k += ps) {\n p = data[j];\n var nullify = p == null;\n if (!nullify) {\n for (m = 0; m < ps; ++m) {\n val = p[m];\n f = format[m];\n if (f) {\n if (f.number && val != null) {\n val = +val; // convert to number\n if (isNaN(val)) {\n val = null;\n }\n }\n if (val == null) {\n if (f.required) nullify = true;\n if (f.defaultValue != null) val = f.defaultValue;\n }\n }\n points[k + m] = val;\n }\n }\n if (nullify) {\n for (m = 0; m < ps; ++m) {\n val = points[k + m];\n if (val != null) {\n f = format[m];\n // extract min/max info\n if (f.computeRange) {\n if (f.x) {\n updateAxis(s.xaxis, val, val);\n }\n if (f.y) {\n updateAxis(s.yaxis, val, val);\n }\n }\n }\n points[k + m] = null;\n }\n }\n }\n points.length = k; //trims the internal buffer to the correct length\n }\n\n // give the hooks a chance to run\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n executeHooks(hooks.processDatapoints, [s, s.datapoints]);\n }\n\n // second pass: find datamax/datamin for auto-scaling\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n format = s.datapoints.format;\n if (format.every(function (f) {\n return !f.computeRange;\n })) {\n continue;\n }\n var range = plot.adjustSeriesDataRange(s, plot.computeRangeForDataSeries(s));\n executeHooks(hooks.adjustSeriesDataRange, [s, range]);\n updateAxis(s.xaxis, range.xmin, range.xmax);\n updateAxis(s.yaxis, range.ymin, range.ymax);\n }\n $.each(allAxes(), function (_, axis) {\n if (axis.datamin === topSentry) {\n axis.datamin = null;\n }\n if (axis.datamax === bottomSentry) {\n axis.datamax = null;\n }\n });\n }\n function setupCanvases() {\n // Make sure the placeholder is clear of everything except canvases\n // from a previous plot in this container that we'll try to re-use.\n\n placeholder.css(\"padding\", 0) // padding messes up the positioning\n .children().filter(function () {\n return !$(this).hasClass(\"flot-overlay\") && !$(this).hasClass('flot-base');\n }).remove();\n if (placeholder.css(\"position\") === 'static') {\n placeholder.css(\"position\", \"relative\"); // for positioning labels and overlay\n }\n surface = new Canvas(\"flot-base\", placeholder[0]);\n overlay = new Canvas(\"flot-overlay\", placeholder[0]); // overlay canvas for interactive features\n\n ctx = surface.context;\n octx = overlay.context;\n\n // define which element we're listening for events on\n eventHolder = $(overlay.element).unbind();\n\n // If we're re-using a plot object, shut down the old one\n\n var existing = placeholder.data(\"plot\");\n if (existing) {\n existing.shutdown();\n overlay.clear();\n }\n\n // save in case we get replotted\n placeholder.data(\"plot\", plot);\n }\n function bindEvents() {\n executeHooks(hooks.bindEvents, [eventHolder]);\n }\n function addEventHandler(event, handler, eventHolder, priority) {\n var key = eventHolder + event;\n var eventList = eventManager[key] || [];\n eventList.push({\n \"event\": event,\n \"handler\": handler,\n \"eventHolder\": eventHolder,\n \"priority\": priority\n });\n eventList.sort((a, b) => b.priority - a.priority);\n eventList.forEach(eventData => {\n eventData.eventHolder.unbind(eventData.event, eventData.handler);\n eventData.eventHolder.bind(eventData.event, eventData.handler);\n });\n eventManager[key] = eventList;\n }\n function shutdown() {\n if (redrawTimeout) {\n clearTimeout(redrawTimeout);\n }\n executeHooks(hooks.shutdown, [eventHolder]);\n }\n function setTransformationHelpers(axis) {\n // set helper functions on the axis, assumes plot area\n // has been computed already\n\n function identity(x) {\n return x;\n }\n var s,\n m,\n t = axis.options.transform || identity,\n it = axis.options.inverseTransform;\n\n // precompute how much the axis is scaling a point\n // in canvas space\n if (axis.direction === \"x\") {\n if (isFinite(t(axis.max) - t(axis.min))) {\n s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));\n } else {\n s = axis.scale = 1 / Math.abs($.plot.saturated.delta(t(axis.min), t(axis.max), plotWidth));\n }\n m = Math.min(t(axis.max), t(axis.min));\n } else {\n if (isFinite(t(axis.max) - t(axis.min))) {\n s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));\n } else {\n s = axis.scale = 1 / Math.abs($.plot.saturated.delta(t(axis.min), t(axis.max), plotHeight));\n }\n s = -s;\n m = Math.max(t(axis.max), t(axis.min));\n }\n\n // data point to canvas coordinate\n if (t === identity) {\n // slight optimization\n axis.p2c = function (p) {\n if (isFinite(p - m)) {\n return (p - m) * s;\n } else {\n return (p / 4 - m / 4) * s * 4;\n }\n };\n } else {\n axis.p2c = function (p) {\n var tp = t(p);\n if (isFinite(tp - m)) {\n return (tp - m) * s;\n } else {\n return (tp / 4 - m / 4) * s * 4;\n }\n };\n }\n\n // canvas coordinate to data point\n if (!it) {\n axis.c2p = function (c) {\n return m + c / s;\n };\n } else {\n axis.c2p = function (c) {\n return it(m + c / s);\n };\n }\n }\n function measureTickLabels(axis) {\n var opts = axis.options,\n ticks = opts.showTickLabels !== 'none' && axis.ticks ? axis.ticks : [],\n showMajorTickLabels = opts.showTickLabels === 'major' || opts.showTickLabels === 'all',\n showEndpointsTickLabels = opts.showTickLabels === 'endpoints' || opts.showTickLabels === 'all',\n labelWidth = opts.labelWidth || 0,\n labelHeight = opts.labelHeight || 0,\n legacyStyles = axis.direction + \"Axis \" + axis.direction + axis.n + \"Axis\",\n layer = \"flot-\" + axis.direction + \"-axis flot-\" + axis.direction + axis.n + \"-axis \" + legacyStyles,\n font = opts.font || \"flot-tick-label tickLabel\";\n for (var i = 0; i < ticks.length; ++i) {\n var t = ticks[i];\n var label = t.label;\n if (!t.label || showMajorTickLabels === false && i > 0 && i < ticks.length - 1 || showEndpointsTickLabels === false && (i === 0 || i === ticks.length - 1)) {\n continue;\n }\n if (typeof t.label === 'object') {\n label = t.label.name;\n }\n var info = surface.getTextInfo(layer, label, font);\n labelWidth = Math.max(labelWidth, info.width);\n labelHeight = Math.max(labelHeight, info.height);\n }\n axis.labelWidth = opts.labelWidth || labelWidth;\n axis.labelHeight = opts.labelHeight || labelHeight;\n }\n function allocateAxisBoxFirstPhase(axis) {\n // find the bounding box of the axis by looking at label\n // widths/heights and ticks, make room by diminishing the\n // plotOffset; this first phase only looks at one\n // dimension per axis, the other dimension depends on the\n // other axes so will have to wait\n\n // here reserve additional space\n executeHooks(hooks.axisReserveSpace, [axis]);\n var lw = axis.labelWidth,\n lh = axis.labelHeight,\n pos = axis.options.position,\n isXAxis = axis.direction === \"x\",\n tickLength = axis.options.tickLength,\n showTicks = axis.options.showTicks,\n showMinorTicks = axis.options.showMinorTicks,\n gridLines = axis.options.gridLines,\n axisMargin = options.grid.axisMargin,\n padding = options.grid.labelMargin,\n innermost = true,\n outermost = true,\n found = false;\n\n // Determine the axis's position in its direction and on its side\n\n $.each(isXAxis ? xaxes : yaxes, function (i, a) {\n if (a && (a.show || a.reserveSpace)) {\n if (a === axis) {\n found = true;\n } else if (a.options.position === pos) {\n if (found) {\n outermost = false;\n } else {\n innermost = false;\n }\n }\n }\n });\n\n // The outermost axis on each side has no margin\n if (outermost) {\n axisMargin = 0;\n }\n\n // Set the default tickLength if necessary\n if (tickLength == null) {\n tickLength = TICK_LENGTH_CONSTANT;\n }\n\n // By default, major tick marks are visible\n if (showTicks == null) {\n showTicks = true;\n }\n\n // By default, minor tick marks are visible\n if (showMinorTicks == null) {\n showMinorTicks = true;\n }\n\n // By default, grid lines are visible\n if (gridLines == null) {\n if (innermost) {\n gridLines = true;\n } else {\n gridLines = false;\n }\n }\n if (!isNaN(+tickLength)) {\n padding += showTicks ? +tickLength : 0;\n }\n if (isXAxis) {\n lh += padding;\n if (pos === \"bottom\") {\n plotOffset.bottom += lh + axisMargin;\n axis.box = {\n top: surface.height - plotOffset.bottom,\n height: lh\n };\n } else {\n axis.box = {\n top: plotOffset.top + axisMargin,\n height: lh\n };\n plotOffset.top += lh + axisMargin;\n }\n } else {\n lw += padding;\n if (pos === \"left\") {\n axis.box = {\n left: plotOffset.left + axisMargin,\n width: lw\n };\n plotOffset.left += lw + axisMargin;\n } else {\n plotOffset.right += lw + axisMargin;\n axis.box = {\n left: surface.width - plotOffset.right,\n width: lw\n };\n }\n }\n\n // save for future reference\n axis.position = pos;\n axis.tickLength = tickLength;\n axis.showMinorTicks = showMinorTicks;\n axis.showTicks = showTicks;\n axis.gridLines = gridLines;\n axis.box.padding = padding;\n axis.innermost = innermost;\n }\n function allocateAxisBoxSecondPhase(axis) {\n // now that all axis boxes have been placed in one\n // dimension, we can set the remaining dimension coordinates\n if (axis.direction === \"x\") {\n axis.box.left = plotOffset.left - axis.labelWidth / 2;\n axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;\n } else {\n axis.box.top = plotOffset.top - axis.labelHeight / 2;\n axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;\n }\n }\n function adjustLayoutForThingsStickingOut() {\n // possibly adjust plot offset to ensure everything stays\n // inside the canvas and isn't clipped off\n\n var minMargin = options.grid.minBorderMargin,\n i;\n\n // check stuff from the plot (FIXME: this should just read\n // a value from the series, otherwise it's impossible to\n // customize)\n if (minMargin == null) {\n minMargin = 0;\n for (i = 0; i < series.length; ++i) {\n minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth / 2));\n }\n }\n var a,\n offset = {},\n margins = {\n left: minMargin,\n right: minMargin,\n top: minMargin,\n bottom: minMargin\n };\n\n // check axis labels, note we don't check the actual\n // labels but instead use the overall width/height to not\n // jump as much around with replots\n $.each(allAxes(), function (_, axis) {\n if (axis.reserveSpace && axis.ticks && axis.ticks.length) {\n if (axis.direction === \"x\") {\n margins.left = Math.max(margins.left, axis.labelWidth / 2);\n margins.right = Math.max(margins.right, axis.labelWidth / 2);\n } else {\n margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);\n margins.top = Math.max(margins.top, axis.labelHeight / 2);\n }\n }\n });\n for (a in margins) {\n offset[a] = margins[a] - plotOffset[a];\n }\n $.each(xaxes.concat(yaxes), function (_, axis) {\n alignAxisWithGrid(axis, offset, function (offset) {\n return offset > 0;\n });\n });\n plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));\n plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));\n plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));\n plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));\n }\n function alignAxisWithGrid(axis, offset, isValid) {\n if (axis.direction === \"x\") {\n if (axis.position === \"bottom\" && isValid(offset.bottom)) {\n axis.box.top -= Math.ceil(offset.bottom);\n }\n if (axis.position === \"top\" && isValid(offset.top)) {\n axis.box.top += Math.ceil(offset.top);\n }\n } else {\n if (axis.position === \"left\" && isValid(offset.left)) {\n axis.box.left += Math.ceil(offset.left);\n }\n if (axis.position === \"right\" && isValid(offset.right)) {\n axis.box.left -= Math.ceil(offset.right);\n }\n }\n }\n function setupGrid(autoScale) {\n var i,\n a,\n axes = allAxes(),\n showGrid = options.grid.show;\n\n // Initialize the plot's offset from the edge of the canvas\n\n for (a in plotOffset) {\n plotOffset[a] = 0;\n }\n executeHooks(hooks.processOffset, [plotOffset]);\n\n // If the grid is visible, add its border width to the offset\n for (a in plotOffset) {\n if (typeof options.grid.borderWidth === \"object\") {\n plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;\n } else {\n plotOffset[a] += showGrid ? options.grid.borderWidth : 0;\n }\n }\n $.each(axes, function (_, axis) {\n var axisOpts = axis.options;\n axis.show = axisOpts.show == null ? axis.used : axisOpts.show;\n axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;\n setupTickFormatter(axis);\n executeHooks(hooks.setRange, [axis, autoScale]);\n setRange(axis, autoScale);\n });\n if (showGrid) {\n plotWidth = surface.width - plotOffset.left - plotOffset.right;\n plotHeight = surface.height - plotOffset.bottom - plotOffset.top;\n var allocatedAxes = $.grep(axes, function (axis) {\n return axis.show || axis.reserveSpace;\n });\n $.each(allocatedAxes, function (_, axis) {\n // make the ticks\n setupTickGeneration(axis);\n setMajorTicks(axis);\n snapRangeToTicks(axis, axis.ticks, series);\n\n //for computing the endpoints precision, transformationHelpers are needed\n setTransformationHelpers(axis);\n setEndpointTicks(axis, series);\n\n // find labelWidth/Height for axis\n measureTickLabels(axis);\n });\n\n // with all dimensions calculated, we can compute the\n // axis bounding boxes, start from the outside\n // (reverse order)\n for (i = allocatedAxes.length - 1; i >= 0; --i) {\n allocateAxisBoxFirstPhase(allocatedAxes[i]);\n }\n\n // make sure we've got enough space for things that\n // might stick out\n adjustLayoutForThingsStickingOut();\n $.each(allocatedAxes, function (_, axis) {\n allocateAxisBoxSecondPhase(axis);\n });\n }\n\n //adjust axis and plotOffset according to grid.margins\n if (options.grid.margin) {\n for (a in plotOffset) {\n var margin = options.grid.margin || 0;\n plotOffset[a] += typeof margin === \"number\" ? margin : margin[a] || 0;\n }\n $.each(xaxes.concat(yaxes), function (_, axis) {\n alignAxisWithGrid(axis, options.grid.margin, function (offset) {\n return offset !== undefined && offset !== null;\n });\n });\n }\n\n //after adjusting the axis, plot width and height will be modified\n plotWidth = surface.width - plotOffset.left - plotOffset.right;\n plotHeight = surface.height - plotOffset.bottom - plotOffset.top;\n\n // now we got the proper plot dimensions, we can compute the scaling\n $.each(axes, function (_, axis) {\n setTransformationHelpers(axis);\n });\n if (showGrid) {\n drawAxisLabels();\n }\n executeHooks(hooks.setupGrid, []);\n }\n function widenMinMax(minimum, maximum) {\n var min = minimum === undefined ? null : minimum;\n var max = maximum === undefined ? null : maximum;\n var delta = max - min;\n if (delta === 0.0) {\n // degenerate case\n var widen = max === 0 ? 1 : 0.01;\n var wmin = null;\n if (min == null) {\n wmin -= widen;\n }\n\n // always widen max if we couldn't widen min to ensure we\n // don't fall into min == max which doesn't work\n if (max == null || min != null) {\n max += widen;\n }\n if (wmin != null) {\n min = wmin;\n }\n }\n return {\n min: min,\n max: max\n };\n }\n function autoScaleAxis(axis) {\n var opts = axis.options,\n min = opts.min,\n max = opts.max,\n datamin = axis.datamin,\n datamax = axis.datamax,\n delta;\n switch (opts.autoScale) {\n case \"none\":\n min = +(opts.min != null ? opts.min : datamin);\n max = +(opts.max != null ? opts.max : datamax);\n break;\n case \"loose\":\n if (datamin != null && datamax != null) {\n min = datamin;\n max = datamax;\n delta = $.plot.saturated.saturate(max - min);\n var margin = typeof opts.autoScaleMargin === 'number' ? opts.autoScaleMargin : 0.02;\n min = $.plot.saturated.saturate(min - delta * margin);\n max = $.plot.saturated.saturate(max + delta * margin);\n\n // make sure we don't go below zero if all values are positive\n if (min < 0 && datamin >= 0) {\n min = 0;\n }\n } else {\n min = opts.min;\n max = opts.max;\n }\n break;\n case \"exact\":\n min = datamin != null ? datamin : opts.min;\n max = datamax != null ? datamax : opts.max;\n break;\n case \"sliding-window\":\n if (datamax > max) {\n // move the window to fit the new data,\n // keeping the axis range constant\n max = datamax;\n min = Math.max(datamax - (opts.windowSize || 100), min);\n }\n break;\n }\n var widenedMinMax = widenMinMax(min, max);\n min = widenedMinMax.min;\n max = widenedMinMax.max;\n\n // grow loose or grow exact supported\n if (opts.growOnly === true && opts.autoScale !== \"none\" && opts.autoScale !== \"sliding-window\") {\n min = min < datamin ? min : datamin !== null ? datamin : min;\n max = max > datamax ? max : datamax !== null ? datamax : max;\n }\n axis.autoScaledMin = min;\n axis.autoScaledMax = max;\n }\n function setRange(axis, autoScale) {\n var min = typeof axis.options.min === 'number' ? axis.options.min : axis.min,\n max = typeof axis.options.max === 'number' ? axis.options.max : axis.max,\n plotOffset = axis.options.offset;\n if (autoScale) {\n autoScaleAxis(axis);\n min = axis.autoScaledMin;\n max = axis.autoScaledMax;\n }\n min = (min != null ? min : -1) + (plotOffset.below || 0);\n max = (max != null ? max : 1) + (plotOffset.above || 0);\n if (min > max) {\n var tmp = min;\n min = max;\n max = tmp;\n axis.options.offset = {\n above: 0,\n below: 0\n };\n }\n axis.min = $.plot.saturated.saturate(min);\n axis.max = $.plot.saturated.saturate(max);\n }\n function computeValuePrecision(min, max, direction, ticks, tickDecimals) {\n var noTicks = fixupNumberOfTicks(direction, surface, ticks);\n var delta = $.plot.saturated.delta(min, max, noTicks),\n dec = -Math.floor(Math.log(delta) / Math.LN10);\n\n //if it is called with tickDecimals, then the precision should not be greather then that\n if (tickDecimals && dec > tickDecimals) {\n dec = tickDecimals;\n }\n var magn = parseFloat('1e' + -dec),\n norm = delta / magn;\n if (norm > 2.25 && norm < 3 && dec + 1 <= tickDecimals) {\n //we need an extra decimals when tickSize is 2.5\n ++dec;\n }\n return isFinite(dec) ? dec : 0;\n }\n ;\n function computeTickSize(min, max, noTicks, tickDecimals) {\n var delta = $.plot.saturated.delta(min, max, noTicks),\n dec = -Math.floor(Math.log(delta) / Math.LN10);\n\n //if it is called with tickDecimals, then the precision should not be greather then that\n if (tickDecimals && dec > tickDecimals) {\n dec = tickDecimals;\n }\n var magn = parseFloat('1e' + -dec),\n norm = delta / magn,\n // norm is between 1.0 and 10.0\n size;\n if (norm < 1.5) {\n size = 1;\n } else if (norm < 3) {\n size = 2;\n if (norm > 2.25 && (tickDecimals == null || dec + 1 <= tickDecimals)) {\n size = 2.5;\n }\n } else if (norm < 7.5) {\n size = 5;\n } else {\n size = 10;\n }\n size *= magn;\n return size;\n }\n function getAxisTickSize(min, max, direction, options, tickDecimals) {\n var noTicks;\n if (typeof options.ticks === \"number\" && options.ticks > 0) {\n noTicks = options.ticks;\n } else {\n // heuristic based on the model a*sqrt(x) fitted to\n // some data points that seemed reasonable\n noTicks = 0.3 * Math.sqrt(direction === \"x\" ? surface.width : surface.height);\n }\n var size = computeTickSize(min, max, noTicks, tickDecimals);\n if (options.minTickSize != null && size < options.minTickSize) {\n size = options.minTickSize;\n }\n return options.tickSize || size;\n }\n ;\n function fixupNumberOfTicks(direction, surface, ticksOption) {\n var noTicks;\n if (typeof ticksOption === \"number\" && ticksOption > 0) {\n noTicks = ticksOption;\n } else {\n noTicks = 0.3 * Math.sqrt(direction === \"x\" ? surface.width : surface.height);\n }\n return noTicks;\n }\n function setupTickFormatter(axis) {\n var opts = axis.options;\n if (!axis.tickFormatter) {\n if (typeof opts.tickFormatter === 'function') {\n axis.tickFormatter = function () {\n var args = Array.prototype.slice.call(arguments);\n return \"\" + opts.tickFormatter.apply(null, args);\n };\n } else {\n axis.tickFormatter = defaultTickFormatter;\n }\n }\n }\n function setupTickGeneration(axis) {\n var opts = axis.options;\n var noTicks;\n noTicks = fixupNumberOfTicks(axis.direction, surface, opts.ticks);\n axis.delta = $.plot.saturated.delta(axis.min, axis.max, noTicks);\n var precision = plot.computeValuePrecision(axis.min, axis.max, axis.direction, noTicks, opts.tickDecimals);\n axis.tickDecimals = Math.max(0, opts.tickDecimals != null ? opts.tickDecimals : precision);\n axis.tickSize = getAxisTickSize(axis.min, axis.max, axis.direction, opts, opts.tickDecimals);\n\n // Flot supports base-10 axes; any other mode else is handled by a plug-in,\n // like flot.time.js.\n\n if (!axis.tickGenerator) {\n if (typeof opts.tickGenerator === 'function') {\n axis.tickGenerator = opts.tickGenerator;\n } else {\n axis.tickGenerator = defaultTickGenerator;\n }\n }\n if (opts.alignTicksWithAxis != null) {\n var otherAxis = (axis.direction === \"x\" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];\n if (otherAxis && otherAxis.used && otherAxis !== axis) {\n // consider snapping min/max to outermost nice ticks\n var niceTicks = axis.tickGenerator(axis, plot);\n if (niceTicks.length > 0) {\n if (opts.min == null) {\n axis.min = Math.min(axis.min, niceTicks[0]);\n }\n if (opts.max == null && niceTicks.length > 1) {\n axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);\n }\n }\n axis.tickGenerator = function (axis) {\n // copy ticks, scaled to this axis\n var ticks = [],\n v,\n i;\n for (i = 0; i < otherAxis.ticks.length; ++i) {\n v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);\n v = axis.min + v * (axis.max - axis.min);\n ticks.push(v);\n }\n return ticks;\n };\n\n // we might need an extra decimal since forced\n // ticks don't necessarily fit naturally\n if (!axis.mode && opts.tickDecimals == null) {\n var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),\n ts = axis.tickGenerator(axis, plot);\n\n // only proceed if the tick interval rounded\n // with an extra decimal doesn't give us a\n // zero at end\n if (!(ts.length > 1 && /\\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) {\n axis.tickDecimals = extraDec;\n }\n }\n }\n }\n }\n function setMajorTicks(axis) {\n var oticks = axis.options.ticks,\n ticks = [];\n if (oticks == null || typeof oticks === \"number\" && oticks > 0) {\n ticks = axis.tickGenerator(axis, plot);\n } else if (oticks) {\n if ($.isFunction(oticks)) {\n // generate the ticks\n ticks = oticks(axis);\n } else {\n ticks = oticks;\n }\n }\n\n // clean up/labelify the supplied ticks, copy them over\n var i, v;\n axis.ticks = [];\n for (i = 0; i < ticks.length; ++i) {\n var label = null;\n var t = ticks[i];\n if (typeof t === \"object\") {\n v = +t[0];\n if (t.length > 1) {\n label = t[1];\n }\n } else {\n v = +t;\n }\n if (!isNaN(v)) {\n axis.ticks.push(newTick(v, label, axis, 'major'));\n }\n }\n }\n function newTick(v, label, axis, type) {\n if (label === null) {\n switch (type) {\n case 'min':\n case 'max':\n //improving the precision of endpoints\n var precision = getEndpointPrecision(v, axis);\n label = isFinite(precision) ? axis.tickFormatter(v, axis, precision, plot) : axis.tickFormatter(v, axis, precision, plot);\n break;\n case 'major':\n label = axis.tickFormatter(v, axis, undefined, plot);\n }\n }\n return {\n v: v,\n label: label\n };\n }\n function snapRangeToTicks(axis, ticks, series) {\n var anyDataInSeries = function (series) {\n return series.some(e => e.datapoints.points.length > 0);\n };\n if (axis.options.autoScale === \"loose\" && ticks.length > 0 && anyDataInSeries(series)) {\n // snap to ticks\n axis.min = Math.min(axis.min, ticks[0].v);\n axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);\n }\n }\n function getEndpointPrecision(value, axis) {\n var canvas1 = Math.floor(axis.p2c(value)),\n canvas2 = axis.direction === \"x\" ? canvas1 + 1 : canvas1 - 1,\n point1 = axis.c2p(canvas1),\n point2 = axis.c2p(canvas2),\n precision = computeValuePrecision(point1, point2, axis.direction, 1);\n return precision;\n }\n function setEndpointTicks(axis, series) {\n if (isValidEndpointTick(axis, series)) {\n axis.ticks.unshift(newTick(axis.min, null, axis, 'min'));\n axis.ticks.push(newTick(axis.max, null, axis, 'max'));\n }\n }\n function isValidEndpointTick(axis, series) {\n if (axis.options.showTickLabels === 'endpoints') {\n return true;\n }\n if (axis.options.showTickLabels === 'all') {\n var associatedSeries = series.filter(function (s) {\n return s.bars.horizontal ? s.yaxis === axis : s.xaxis === axis;\n }),\n notAllBarSeries = associatedSeries.some(function (s) {\n return !s.bars.show;\n });\n return associatedSeries.length === 0 || notAllBarSeries;\n }\n if (axis.options.showTickLabels === 'major' || axis.options.showTickLabels === 'none') {\n return false;\n }\n }\n function draw() {\n surface.clear();\n executeHooks(hooks.drawBackground, [ctx]);\n var grid = options.grid;\n\n // draw background, if any\n if (grid.show && grid.backgroundColor) {\n drawBackground();\n }\n if (grid.show && !grid.aboveData) {\n drawGrid();\n }\n for (var i = 0; i < series.length; ++i) {\n executeHooks(hooks.drawSeries, [ctx, series[i], i, getColorOrGradient]);\n drawSeries(series[i]);\n }\n executeHooks(hooks.draw, [ctx]);\n if (grid.show && grid.aboveData) {\n drawGrid();\n }\n surface.render();\n\n // A draw implies that either the axes or data have changed, so we\n // should probably update the overlay highlights as well.\n triggerRedrawOverlay();\n }\n function extractRange(ranges, coord) {\n var axis,\n from,\n to,\n key,\n axes = allAxes();\n for (var i = 0; i < axes.length; ++i) {\n axis = axes[i];\n if (axis.direction === coord) {\n key = coord + axis.n + \"axis\";\n if (!ranges[key] && axis.n === 1) {\n // support x1axis as xaxis\n key = coord + \"axis\";\n }\n if (ranges[key]) {\n from = ranges[key].from;\n to = ranges[key].to;\n break;\n }\n }\n }\n\n // backwards-compat stuff - to be removed in future\n if (!ranges[key]) {\n axis = coord === \"x\" ? xaxes[0] : yaxes[0];\n from = ranges[coord + \"1\"];\n to = ranges[coord + \"2\"];\n }\n\n // auto-reverse as an added bonus\n if (from != null && to != null && from > to) {\n var tmp = from;\n from = to;\n to = tmp;\n }\n return {\n from: from,\n to: to,\n axis: axis\n };\n }\n function drawBackground() {\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, \"rgba(255, 255, 255, 0)\");\n ctx.fillRect(0, 0, plotWidth, plotHeight);\n ctx.restore();\n }\n function drawMarkings() {\n // draw markings\n var markings = options.grid.markings,\n axes;\n if (markings) {\n if ($.isFunction(markings)) {\n axes = plot.getAxes();\n // xmin etc. is backwards compatibility, to be\n // removed in the future\n axes.xmin = axes.xaxis.min;\n axes.xmax = axes.xaxis.max;\n axes.ymin = axes.yaxis.min;\n axes.ymax = axes.yaxis.max;\n markings = markings(axes);\n }\n var i;\n for (i = 0; i < markings.length; ++i) {\n var m = markings[i],\n xrange = extractRange(m, \"x\"),\n yrange = extractRange(m, \"y\");\n\n // fill in missing\n if (xrange.from == null) {\n xrange.from = xrange.axis.min;\n }\n if (xrange.to == null) {\n xrange.to = xrange.axis.max;\n }\n if (yrange.from == null) {\n yrange.from = yrange.axis.min;\n }\n if (yrange.to == null) {\n yrange.to = yrange.axis.max;\n }\n\n // clip\n if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) {\n continue;\n }\n xrange.from = Math.max(xrange.from, xrange.axis.min);\n xrange.to = Math.min(xrange.to, xrange.axis.max);\n yrange.from = Math.max(yrange.from, yrange.axis.min);\n yrange.to = Math.min(yrange.to, yrange.axis.max);\n var xequal = xrange.from === xrange.to,\n yequal = yrange.from === yrange.to;\n if (xequal && yequal) {\n continue;\n }\n\n // then draw\n xrange.from = Math.floor(xrange.axis.p2c(xrange.from));\n xrange.to = Math.floor(xrange.axis.p2c(xrange.to));\n yrange.from = Math.floor(yrange.axis.p2c(yrange.from));\n yrange.to = Math.floor(yrange.axis.p2c(yrange.to));\n if (xequal || yequal) {\n var lineWidth = m.lineWidth || options.grid.markingsLineWidth,\n subPixel = lineWidth % 2 ? 0.5 : 0;\n ctx.beginPath();\n ctx.strokeStyle = m.color || options.grid.markingsColor;\n ctx.lineWidth = lineWidth;\n if (xequal) {\n ctx.moveTo(xrange.to + subPixel, yrange.from);\n ctx.lineTo(xrange.to + subPixel, yrange.to);\n } else {\n ctx.moveTo(xrange.from, yrange.to + subPixel);\n ctx.lineTo(xrange.to, yrange.to + subPixel);\n }\n ctx.stroke();\n } else {\n ctx.fillStyle = m.color || options.grid.markingsColor;\n ctx.fillRect(xrange.from, yrange.to, xrange.to - xrange.from, yrange.from - yrange.to);\n }\n }\n }\n }\n function findEdges(axis) {\n var box = axis.box,\n x = 0,\n y = 0;\n\n // find the edges\n if (axis.direction === \"x\") {\n x = 0;\n y = box.top - plotOffset.top + (axis.position === \"top\" ? box.height : 0);\n } else {\n y = 0;\n x = box.left - plotOffset.left + (axis.position === \"left\" ? box.width : 0) + axis.boxPosition.centerX;\n }\n return {\n x: x,\n y: y\n };\n }\n ;\n function alignPosition(lineWidth, pos) {\n return lineWidth % 2 !== 0 ? Math.floor(pos) + 0.5 : pos;\n }\n ;\n function drawTickBar(axis) {\n ctx.lineWidth = 1;\n var edges = findEdges(axis),\n x = edges.x,\n y = edges.y;\n\n // draw tick bar\n if (axis.show) {\n var xoff = 0,\n yoff = 0;\n ctx.strokeStyle = axis.options.color;\n ctx.beginPath();\n if (axis.direction === \"x\") {\n xoff = plotWidth + 1;\n } else {\n yoff = plotHeight + 1;\n }\n if (axis.direction === \"x\") {\n y = alignPosition(ctx.lineWidth, y);\n } else {\n x = alignPosition(ctx.lineWidth, x);\n }\n ctx.moveTo(x, y);\n ctx.lineTo(x + xoff, y + yoff);\n ctx.stroke();\n }\n }\n ;\n function drawTickMarks(axis) {\n var t = axis.tickLength,\n minorTicks = axis.showMinorTicks,\n minorTicksNr = MINOR_TICKS_COUNT_CONSTANT,\n edges = findEdges(axis),\n x = edges.x,\n y = edges.y,\n i = 0;\n\n // draw major tick marks\n ctx.strokeStyle = axis.options.color;\n ctx.beginPath();\n for (i = 0; i < axis.ticks.length; ++i) {\n var v = axis.ticks[i].v,\n xoff = 0,\n yoff = 0,\n xminor = 0,\n yminor = 0,\n j;\n if (!isNaN(v) && v >= axis.min && v <= axis.max) {\n if (axis.direction === \"x\") {\n x = axis.p2c(v);\n yoff = t;\n if (axis.position === \"top\") {\n yoff = -yoff;\n }\n } else {\n y = axis.p2c(v);\n xoff = t;\n if (axis.position === \"left\") {\n xoff = -xoff;\n }\n }\n if (axis.direction === \"x\") {\n x = alignPosition(ctx.lineWidth, x);\n } else {\n y = alignPosition(ctx.lineWidth, y);\n }\n ctx.moveTo(x, y);\n ctx.lineTo(x + xoff, y + yoff);\n }\n\n //draw minor tick marks\n if (minorTicks === true && i < axis.ticks.length - 1) {\n var v1 = axis.ticks[i].v,\n v2 = axis.ticks[i + 1].v,\n step = (v2 - v1) / (minorTicksNr + 1);\n for (j = 1; j <= minorTicksNr; j++) {\n // compute minor tick position\n if (axis.direction === \"x\") {\n yminor = t / 2; // minor ticks are half length\n x = alignPosition(ctx.lineWidth, axis.p2c(v1 + j * step));\n if (axis.position === \"top\") {\n yminor = -yminor;\n }\n\n // don't go over the plot borders\n if (x < 0 || x > plotWidth) {\n continue;\n }\n } else {\n xminor = t / 2; // minor ticks are half length\n y = alignPosition(ctx.lineWidth, axis.p2c(v1 + j * step));\n if (axis.position === \"left\") {\n xminor = -xminor;\n }\n\n // don't go over the plot borders\n if (y < 0 || y > plotHeight) {\n continue;\n }\n }\n ctx.moveTo(x, y);\n ctx.lineTo(x + xminor, y + yminor);\n }\n }\n }\n ctx.stroke();\n }\n ;\n function drawGridLines(axis) {\n // check if the line will be overlapped with a border\n var overlappedWithBorder = function (value) {\n var bw = options.grid.borderWidth;\n return (typeof bw === \"object\" && bw[axis.position] > 0 || bw > 0) && (value === axis.min || value === axis.max);\n };\n ctx.strokeStyle = options.grid.tickColor;\n ctx.beginPath();\n var i;\n for (i = 0; i < axis.ticks.length; ++i) {\n var v = axis.ticks[i].v,\n xoff = 0,\n yoff = 0,\n x = 0,\n y = 0;\n if (isNaN(v) || v < axis.min || v > axis.max) continue;\n\n // skip those lying on the axes if we got a border\n if (overlappedWithBorder(v)) continue;\n if (axis.direction === \"x\") {\n x = axis.p2c(v);\n y = plotHeight;\n yoff = -plotHeight;\n } else {\n x = 0;\n y = axis.p2c(v);\n xoff = plotWidth;\n }\n if (axis.direction === \"x\") {\n x = alignPosition(ctx.lineWidth, x);\n } else {\n y = alignPosition(ctx.lineWidth, y);\n }\n ctx.moveTo(x, y);\n ctx.lineTo(x + xoff, y + yoff);\n }\n ctx.stroke();\n }\n ;\n function drawBorder() {\n // If either borderWidth or borderColor is an object, then draw the border\n // line by line instead of as one rectangle\n var bw = options.grid.borderWidth,\n bc = options.grid.borderColor;\n if (typeof bw === \"object\" || typeof bc === \"object\") {\n if (typeof bw !== \"object\") {\n bw = {\n top: bw,\n right: bw,\n bottom: bw,\n left: bw\n };\n }\n if (typeof bc !== \"object\") {\n bc = {\n top: bc,\n right: bc,\n bottom: bc,\n left: bc\n };\n }\n if (bw.top > 0) {\n ctx.strokeStyle = bc.top;\n ctx.lineWidth = bw.top;\n ctx.beginPath();\n ctx.moveTo(0 - bw.left, 0 - bw.top / 2);\n ctx.lineTo(plotWidth, 0 - bw.top / 2);\n ctx.stroke();\n }\n if (bw.right > 0) {\n ctx.strokeStyle = bc.right;\n ctx.lineWidth = bw.right;\n ctx.beginPath();\n ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);\n ctx.lineTo(plotWidth + bw.right / 2, plotHeight);\n ctx.stroke();\n }\n if (bw.bottom > 0) {\n ctx.strokeStyle = bc.bottom;\n ctx.lineWidth = bw.bottom;\n ctx.beginPath();\n ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);\n ctx.lineTo(0, plotHeight + bw.bottom / 2);\n ctx.stroke();\n }\n if (bw.left > 0) {\n ctx.strokeStyle = bc.left;\n ctx.lineWidth = bw.left;\n ctx.beginPath();\n ctx.moveTo(0 - bw.left / 2, plotHeight + bw.bottom);\n ctx.lineTo(0 - bw.left / 2, 0);\n ctx.stroke();\n }\n } else {\n ctx.lineWidth = bw;\n ctx.strokeStyle = options.grid.borderColor;\n ctx.strokeRect(-bw / 2, -bw / 2, plotWidth + bw, plotHeight + bw);\n }\n }\n ;\n function drawGrid() {\n var axes, bw;\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n drawMarkings();\n axes = allAxes();\n bw = options.grid.borderWidth;\n for (var j = 0; j < axes.length; ++j) {\n var axis = axes[j];\n if (!axis.show) {\n continue;\n }\n drawTickBar(axis);\n if (axis.showTicks === true) {\n drawTickMarks(axis);\n }\n if (axis.gridLines === true) {\n drawGridLines(axis, bw);\n }\n }\n\n // draw border\n if (bw) {\n drawBorder();\n }\n ctx.restore();\n }\n function drawAxisLabels() {\n $.each(allAxes(), function (_, axis) {\n var box = axis.box,\n legacyStyles = axis.direction + \"Axis \" + axis.direction + axis.n + \"Axis\",\n layer = \"flot-\" + axis.direction + \"-axis flot-\" + axis.direction + axis.n + \"-axis \" + legacyStyles,\n font = axis.options.font || \"flot-tick-label tickLabel\",\n i,\n x,\n y,\n halign,\n valign,\n info,\n margin = 3,\n nullBox = {\n x: NaN,\n y: NaN,\n width: NaN,\n height: NaN\n },\n newLabelBox,\n labelBoxes = [],\n overlapping = function (x11, y11, x12, y12, x21, y21, x22, y22) {\n return (x11 <= x21 && x21 <= x12 || x21 <= x11 && x11 <= x22) && (y11 <= y21 && y21 <= y12 || y21 <= y11 && y11 <= y22);\n },\n overlapsOtherLabels = function (newLabelBox, previousLabelBoxes) {\n return previousLabelBoxes.some(function (labelBox) {\n return overlapping(newLabelBox.x, newLabelBox.y, newLabelBox.x + newLabelBox.width, newLabelBox.y + newLabelBox.height, labelBox.x, labelBox.y, labelBox.x + labelBox.width, labelBox.y + labelBox.height);\n });\n },\n drawAxisLabel = function (tick, labelBoxes) {\n if (!tick || !tick.label || tick.v < axis.min || tick.v > axis.max) {\n return nullBox;\n }\n info = surface.getTextInfo(layer, tick.label, font);\n if (axis.direction === \"x\") {\n halign = \"center\";\n x = plotOffset.left + axis.p2c(tick.v);\n if (axis.position === \"bottom\") {\n y = box.top + box.padding - axis.boxPosition.centerY;\n } else {\n y = box.top + box.height - box.padding + axis.boxPosition.centerY;\n valign = \"bottom\";\n }\n newLabelBox = {\n x: x - info.width / 2 - margin,\n y: y - margin,\n width: info.width + 2 * margin,\n height: info.height + 2 * margin\n };\n } else {\n valign = \"middle\";\n y = plotOffset.top + axis.p2c(tick.v);\n if (axis.position === \"left\") {\n x = box.left + box.width - box.padding - axis.boxPosition.centerX;\n halign = \"right\";\n } else {\n x = box.left + box.padding + axis.boxPosition.centerX;\n }\n newLabelBox = {\n x: x - info.width / 2 - margin,\n y: y - margin,\n width: info.width + 2 * margin,\n height: info.height + 2 * margin\n };\n }\n if (overlapsOtherLabels(newLabelBox, labelBoxes)) {\n return nullBox;\n }\n surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);\n return newLabelBox;\n };\n\n // Remove text before checking for axis.show and ticks.length;\n // otherwise plugins, like flot-tickrotor, that draw their own\n // tick labels will end up with both theirs and the defaults.\n\n surface.removeText(layer);\n executeHooks(hooks.drawAxis, [axis, surface]);\n if (!axis.show) {\n return;\n }\n switch (axis.options.showTickLabels) {\n case 'none':\n break;\n case 'endpoints':\n labelBoxes.push(drawAxisLabel(axis.ticks[0], labelBoxes));\n labelBoxes.push(drawAxisLabel(axis.ticks[axis.ticks.length - 1], labelBoxes));\n break;\n case 'major':\n labelBoxes.push(drawAxisLabel(axis.ticks[0], labelBoxes));\n labelBoxes.push(drawAxisLabel(axis.ticks[axis.ticks.length - 1], labelBoxes));\n for (i = 1; i < axis.ticks.length - 1; ++i) {\n labelBoxes.push(drawAxisLabel(axis.ticks[i], labelBoxes));\n }\n break;\n case 'all':\n labelBoxes.push(drawAxisLabel(axis.ticks[0], []));\n labelBoxes.push(drawAxisLabel(axis.ticks[axis.ticks.length - 1], labelBoxes));\n for (i = 1; i < axis.ticks.length - 1; ++i) {\n labelBoxes.push(drawAxisLabel(axis.ticks[i], labelBoxes));\n }\n break;\n }\n });\n }\n function drawSeries(series) {\n if (series.lines.show) {\n $.plot.drawSeries.drawSeriesLines(series, ctx, plotOffset, plotWidth, plotHeight, plot.drawSymbol, getColorOrGradient);\n }\n if (series.bars.show) {\n $.plot.drawSeries.drawSeriesBars(series, ctx, plotOffset, plotWidth, plotHeight, plot.drawSymbol, getColorOrGradient);\n }\n if (series.points.show) {\n $.plot.drawSeries.drawSeriesPoints(series, ctx, plotOffset, plotWidth, plotHeight, plot.drawSymbol, getColorOrGradient);\n }\n }\n function computeRangeForDataSeries(series, force, isValid) {\n var points = series.datapoints.points,\n ps = series.datapoints.pointsize,\n format = series.datapoints.format,\n topSentry = Number.POSITIVE_INFINITY,\n bottomSentry = Number.NEGATIVE_INFINITY,\n range = {\n xmin: topSentry,\n ymin: topSentry,\n xmax: bottomSentry,\n ymax: bottomSentry\n };\n for (var j = 0; j < points.length; j += ps) {\n if (points[j] === null) {\n continue;\n }\n if (typeof isValid === 'function' && !isValid(points[j])) {\n continue;\n }\n for (var m = 0; m < ps; ++m) {\n var val = points[j + m],\n f = format[m];\n if (f === null || f === undefined) {\n continue;\n }\n if (typeof isValid === 'function' && !isValid(val)) {\n continue;\n }\n if (!force && !f.computeRange || val === Infinity || val === -Infinity) {\n continue;\n }\n if (f.x === true) {\n if (val < range.xmin) {\n range.xmin = val;\n }\n if (val > range.xmax) {\n range.xmax = val;\n }\n }\n if (f.y === true) {\n if (val < range.ymin) {\n range.ymin = val;\n }\n if (val > range.ymax) {\n range.ymax = val;\n }\n }\n }\n }\n return range;\n }\n ;\n function adjustSeriesDataRange(series, range) {\n if (series.bars.show) {\n // make sure we got room for the bar on the dancing floor\n var delta;\n\n // update bar width if needed\n var useAbsoluteBarWidth = series.bars.barWidth[1];\n if (series.datapoints && series.datapoints.points && !useAbsoluteBarWidth) {\n computeBarWidth(series);\n }\n var barWidth = series.bars.barWidth[0] || series.bars.barWidth;\n switch (series.bars.align) {\n case \"left\":\n delta = 0;\n break;\n case \"right\":\n delta = -barWidth;\n break;\n default:\n delta = -barWidth / 2;\n }\n if (series.bars.horizontal) {\n range.ymin += delta;\n range.ymax += delta + barWidth;\n } else {\n range.xmin += delta;\n range.xmax += delta + barWidth;\n }\n }\n if (series.bars.show && series.bars.zero || series.lines.show && series.lines.zero) {\n var ps = series.datapoints.pointsize;\n\n // make sure the 0 point is included in the computed y range when requested\n if (ps <= 2) {\n /*if ps > 0 the points were already taken into account for autoScale */\n range.ymin = Math.min(0, range.ymin);\n range.ymax = Math.max(0, range.ymax);\n }\n }\n return range;\n }\n ;\n function computeBarWidth(series) {\n var xValues = [];\n var pointsize = series.datapoints.pointsize,\n minDistance = Number.MAX_VALUE;\n if (series.datapoints.points.length <= pointsize) {\n minDistance = 1;\n }\n var start = series.bars.horizontal ? 1 : 0;\n for (let j = start; j < series.datapoints.points.length; j += pointsize) {\n if (isFinite(series.datapoints.points[j]) && series.datapoints.points[j] !== null) {\n xValues.push(series.datapoints.points[j]);\n }\n }\n function onlyUnique(value, index, self) {\n return self.indexOf(value) === index;\n }\n xValues = xValues.filter(onlyUnique);\n xValues.sort(function (a, b) {\n return a - b;\n });\n for (let j = 1; j < xValues.length; j++) {\n var distance = Math.abs(xValues[j] - xValues[j - 1]);\n if (distance < minDistance && isFinite(distance)) {\n minDistance = distance;\n }\n }\n if (typeof series.bars.barWidth === \"number\") {\n series.bars.barWidth = series.bars.barWidth * minDistance;\n } else {\n series.bars.barWidth[0] = series.bars.barWidth[0] * minDistance;\n }\n }\n function findNearbyItems(mouseX, mouseY, seriesFilter, radius, computeDistance) {\n var items = findItems(mouseX, mouseY, seriesFilter, radius, computeDistance);\n for (var i = 0; i < series.length; ++i) {\n if (seriesFilter(i)) {\n executeHooks(hooks.findNearbyItems, [mouseX, mouseY, series, i, radius, computeDistance, items]);\n }\n }\n return items.sort((a, b) => {\n if (b.distance === undefined) {\n return -1;\n } else if (a.distance === undefined && b.distance !== undefined) {\n return 1;\n }\n return a.distance - b.distance;\n });\n }\n function findNearbyItem(mouseX, mouseY, seriesFilter, radius, computeDistance) {\n var items = findNearbyItems(mouseX, mouseY, seriesFilter, radius, computeDistance);\n return items[0] !== undefined ? items[0] : null;\n }\n\n // returns the data item the mouse is over/ the cursor is closest to, or null if none is found\n function findItems(mouseX, mouseY, seriesFilter, radius, computeDistance) {\n var i,\n foundItems = [],\n items = [],\n smallestDistance = radius * radius + 1;\n for (i = series.length - 1; i >= 0; --i) {\n if (!seriesFilter(i)) continue;\n var s = series[i];\n if (!s.datapoints) return;\n var foundPoint = false;\n if (s.lines.show || s.points.show) {\n var found = findNearbyPoint(s, mouseX, mouseY, radius, computeDistance);\n if (found) {\n items.push({\n seriesIndex: i,\n dataIndex: found.dataIndex,\n distance: found.distance\n });\n foundPoint = true;\n }\n }\n if (s.bars.show && !foundPoint) {\n // no other point can be nearby\n var foundIndex = findNearbyBar(s, mouseX, mouseY);\n if (foundIndex >= 0) {\n items.push({\n seriesIndex: i,\n dataIndex: foundIndex,\n distance: smallestDistance\n });\n }\n }\n }\n for (i = 0; i < items.length; i++) {\n var seriesIndex = items[i].seriesIndex;\n var dataIndex = items[i].dataIndex;\n var itemDistance = items[i].distance;\n var ps = series[seriesIndex].datapoints.pointsize;\n foundItems.push({\n datapoint: series[seriesIndex].datapoints.points.slice(dataIndex * ps, (dataIndex + 1) * ps),\n dataIndex: dataIndex,\n series: series[seriesIndex],\n seriesIndex: seriesIndex,\n distance: Math.sqrt(itemDistance)\n });\n }\n return foundItems;\n }\n function findNearbyPoint(series, mouseX, mouseY, maxDistance, computeDistance) {\n var mx = series.xaxis.c2p(mouseX),\n my = series.yaxis.c2p(mouseY),\n maxx = maxDistance / series.xaxis.scale,\n maxy = maxDistance / series.yaxis.scale,\n points = series.datapoints.points,\n ps = series.datapoints.pointsize,\n smallestDistance = Number.POSITIVE_INFINITY;\n\n // with inverse transforms, we can't use the maxx/maxy\n // optimization, sadly\n if (series.xaxis.options.inverseTransform) {\n maxx = Number.MAX_VALUE;\n }\n if (series.yaxis.options.inverseTransform) {\n maxy = Number.MAX_VALUE;\n }\n var found = null;\n for (var j = 0; j < points.length; j += ps) {\n var x = points[j];\n var y = points[j + 1];\n if (x == null) {\n continue;\n }\n if (x - mx > maxx || x - mx < -maxx || y - my > maxy || y - my < -maxy) {\n continue;\n }\n\n // We have to calculate distances in pixels, not in\n // data units, because the scales of the axes may be different\n var dx = Math.abs(series.xaxis.p2c(x) - mouseX);\n var dy = Math.abs(series.yaxis.p2c(y) - mouseY);\n var dist = computeDistance ? computeDistance(dx, dy) : dx * dx + dy * dy;\n\n // use <= to ensure last point takes precedence\n // (last generally means on top of)\n if (dist < smallestDistance) {\n smallestDistance = dist;\n found = {\n dataIndex: j / ps,\n distance: dist\n };\n }\n }\n return found;\n }\n function findNearbyBar(series, mouseX, mouseY) {\n var barLeft,\n barRight,\n barWidth = series.bars.barWidth[0] || series.bars.barWidth,\n mx = series.xaxis.c2p(mouseX),\n my = series.yaxis.c2p(mouseY),\n points = series.datapoints.points,\n ps = series.datapoints.pointsize;\n switch (series.bars.align) {\n case \"left\":\n barLeft = 0;\n break;\n case \"right\":\n barLeft = -barWidth;\n break;\n default:\n barLeft = -barWidth / 2;\n }\n barRight = barLeft + barWidth;\n var fillTowards = series.bars.fillTowards || 0;\n var defaultBottom = fillTowards > series.yaxis.min ? Math.min(series.yaxis.max, fillTowards) : series.yaxis.min;\n var foundIndex = -1;\n for (var j = 0; j < points.length; j += ps) {\n var x = points[j],\n y = points[j + 1];\n if (x == null) {\n continue;\n }\n var bottom = ps === 3 ? points[j + 2] : defaultBottom;\n // for a bar graph, the cursor must be inside the bar\n if (series.bars.horizontal ? mx <= Math.max(bottom, x) && mx >= Math.min(bottom, x) && my >= y + barLeft && my <= y + barRight : mx >= x + barLeft && mx <= x + barRight && my >= Math.min(bottom, y) && my <= Math.max(bottom, y)) {\n foundIndex = j / ps;\n }\n }\n return foundIndex;\n }\n function findNearbyInterpolationPoint(posX, posY, seriesFilter) {\n var i,\n j,\n dist,\n dx,\n dy,\n ps,\n item,\n smallestDistance = Number.MAX_VALUE;\n for (i = 0; i < series.length; ++i) {\n if (!seriesFilter(i)) {\n continue;\n }\n var points = series[i].datapoints.points;\n ps = series[i].datapoints.pointsize;\n\n // if the data is coming from positive -> negative, reverse the comparison\n const comparer = points[points.length - ps] < points[0] ? function (x1, x2) {\n return x1 > x2;\n } : function (x1, x2) {\n return x2 > x1;\n };\n\n // do not interpolate outside the bounds of the data.\n if (comparer(posX, points[0])) {\n continue;\n }\n\n // Find the nearest points, x-wise\n for (j = ps; j < points.length; j += ps) {\n if (comparer(posX, points[j])) {\n break;\n }\n }\n\n // Now Interpolate\n var y,\n p1x = points[j - ps],\n p1y = points[j - ps + 1],\n p2x = points[j],\n p2y = points[j + 1];\n if (p1x === undefined || p2x === undefined || p1y === undefined || p2y === undefined) {\n continue;\n }\n if (p1x === p2x) {\n y = p2y;\n } else {\n y = p1y + (p2y - p1y) * (posX - p1x) / (p2x - p1x);\n }\n posY = y;\n dx = Math.abs(series[i].xaxis.p2c(p2x) - posX);\n dy = Math.abs(series[i].yaxis.p2c(p2y) - posY);\n dist = dx * dx + dy * dy;\n if (dist < smallestDistance) {\n smallestDistance = dist;\n item = [posX, posY, i, j];\n }\n }\n if (item) {\n i = item[2];\n j = item[3];\n ps = series[i].datapoints.pointsize;\n points = series[i].datapoints.points;\n p1x = points[j - ps];\n p1y = points[j - ps + 1];\n p2x = points[j];\n p2y = points[j + 1];\n return {\n datapoint: [item[0], item[1]],\n leftPoint: [p1x, p1y],\n rightPoint: [p2x, p2y],\n seriesIndex: i\n };\n }\n return null;\n }\n function triggerRedrawOverlay() {\n var t = options.interaction.redrawOverlayInterval;\n if (t === -1) {\n // skip event queue\n drawOverlay();\n return;\n }\n if (!redrawTimeout) {\n redrawTimeout = setTimeout(function () {\n drawOverlay(plot);\n }, t);\n }\n }\n function drawOverlay(plot) {\n redrawTimeout = null;\n if (!octx) {\n return;\n }\n overlay.clear();\n executeHooks(hooks.drawOverlay, [octx, overlay]);\n var event = new CustomEvent('onDrawingDone');\n plot.getEventHolder().dispatchEvent(event);\n plot.getPlaceholder().trigger('drawingdone');\n }\n function getColorOrGradient(spec, bottom, top, defaultColor) {\n if (typeof spec === \"string\") {\n return spec;\n } else {\n // assume this is a gradient spec; IE currently only\n // supports a simple vertical gradient properly, so that's\n // what we support too\n var gradient = ctx.createLinearGradient(0, top, 0, bottom);\n for (var i = 0, l = spec.colors.length; i < l; ++i) {\n var c = spec.colors[i];\n if (typeof c !== \"string\") {\n var co = $.color.parse(defaultColor);\n if (c.brightness != null) {\n co = co.scale('rgb', c.brightness);\n }\n if (c.opacity != null) {\n co.a *= c.opacity;\n }\n c = co.toString();\n }\n gradient.addColorStop(i / (l - 1), c);\n }\n return gradient;\n }\n }\n }\n\n // Add the plot function to the top level of the jQuery object\n\n $.plot = function (placeholder, data, options) {\n var plot = new Plot($(placeholder), data, options, $.plot.plugins);\n return plot;\n };\n $.plot.version = \"3.0.0\";\n $.plot.plugins = [];\n\n // Also add the plot function as a chainable property\n $.fn.plot = function (data, options) {\n return this.each(function () {\n $.plot(this, data, options);\n });\n };\n $.plot.linearTickGenerator = defaultTickGenerator;\n $.plot.defaultTickFormatter = defaultTickFormatter;\n $.plot.expRepTickFormatter = expRepTickFormatter;\n})(jQuery);","/* Plugin for jQuery for working with colors.\n *\n * Version 1.1.\n *\n * Inspiration from jQuery color animation plugin by John Resig.\n *\n * Released under the MIT license by Ole Laursen, October 2009.\n *\n * Examples:\n *\n * $.color.parse(\"#fff\").scale('rgb', 0.25).add('a', -0.5).toString()\n * var c = $.color.extract($(\"#mydiv\"), 'background-color');\n * console.log(c.r, c.g, c.b, c.a);\n * $.color.make(100, 50, 25, 0.4).toString() // returns \"rgba(100,50,25,0.4)\"\n *\n * Note that .scale() and .add() return the same modified object\n * instead of making a new one.\n *\n * V. 1.1: Fix error handling so e.g. parsing an empty string does\n * produce a color rather than just crashing.\n */\n\n(function ($) {\n $.color = {};\n\n // construct color object with some convenient chainable helpers\n $.color.make = function (r, g, b, a) {\n var o = {};\n o.r = r || 0;\n o.g = g || 0;\n o.b = b || 0;\n o.a = a != null ? a : 1;\n o.add = function (c, d) {\n for (var i = 0; i < c.length; ++i) {\n o[c.charAt(i)] += d;\n }\n return o.normalize();\n };\n o.scale = function (c, f) {\n for (var i = 0; i < c.length; ++i) {\n o[c.charAt(i)] *= f;\n }\n return o.normalize();\n };\n o.toString = function () {\n if (o.a >= 1.0) {\n return \"rgb(\" + [o.r, o.g, o.b].join(\",\") + \")\";\n } else {\n return \"rgba(\" + [o.r, o.g, o.b, o.a].join(\",\") + \")\";\n }\n };\n o.normalize = function () {\n function clamp(min, value, max) {\n return value < min ? min : value > max ? max : value;\n }\n o.r = clamp(0, parseInt(o.r), 255);\n o.g = clamp(0, parseInt(o.g), 255);\n o.b = clamp(0, parseInt(o.b), 255);\n o.a = clamp(0, o.a, 1);\n return o;\n };\n o.clone = function () {\n return $.color.make(o.r, o.b, o.g, o.a);\n };\n return o.normalize();\n };\n\n // extract CSS color property from element, going up in the DOM\n // if it's \"transparent\"\n $.color.extract = function (elem, css) {\n var c;\n do {\n c = elem.css(css).toLowerCase();\n // keep going until we find an element that has color, or\n // we hit the body or root (have no parent)\n if (c !== '' && c !== 'transparent') {\n break;\n }\n elem = elem.parent();\n } while (elem.length && !$.nodeName(elem.get(0), \"body\"));\n\n // catch Safari's way of signalling transparent\n if (c === \"rgba(0, 0, 0, 0)\") {\n c = \"transparent\";\n }\n return $.color.parse(c);\n };\n\n // parse CSS color string (like \"rgb(10, 32, 43)\" or \"#fff\"),\n // returns color object, if parsing failed, you get black (0, 0,\n // 0) out\n $.color.parse = function (str) {\n var res,\n m = $.color.make;\n\n // Look for rgb(num,num,num)\n res = /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(str);\n if (res) {\n return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10));\n }\n\n // Look for rgba(num,num,num,num)\n res = /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(str);\n if (res) {\n return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4]));\n }\n\n // Look for rgb(num%,num%,num%)\n res = /rgb\\(\\s*([0-9]+(?:\\.[0-9]+)?)%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)%\\s*\\)/.exec(str);\n if (res) {\n return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55);\n }\n\n // Look for rgba(num%,num%,num%,num)\n res = /rgba\\(\\s*([0-9]+(?:\\.[0-9]+)?)%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(str);\n if (res) {\n return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55, parseFloat(res[4]));\n }\n\n // Look for #a0b1c2\n res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str);\n if (res) {\n return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16));\n }\n\n // Look for #fff\n res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str);\n if (res) {\n return m(parseInt(res[1] + res[1], 16), parseInt(res[2] + res[2], 16), parseInt(res[3] + res[3], 16));\n }\n\n // Otherwise, we're most likely dealing with a named color\n var name = $.trim(str).toLowerCase();\n if (name === \"transparent\") {\n return m(255, 255, 255, 0);\n } else {\n // default to black\n res = lookupColors[name] || [0, 0, 0];\n return m(res[0], res[1], res[2]);\n }\n };\n var lookupColors = {\n aqua: [0, 255, 255],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n black: [0, 0, 0],\n blue: [0, 0, 255],\n brown: [165, 42, 42],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgrey: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkviolet: [148, 0, 211],\n fuchsia: [255, 0, 255],\n gold: [255, 215, 0],\n green: [0, 128, 0],\n indigo: [75, 0, 130],\n khaki: [240, 230, 140],\n lightblue: [173, 216, 230],\n lightcyan: [224, 255, 255],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n navy: [0, 0, 128],\n olive: [128, 128, 0],\n orange: [255, 165, 0],\n pink: [255, 192, 203],\n purple: [128, 0, 128],\n violet: [128, 0, 128],\n red: [255, 0, 0],\n silver: [192, 192, 192],\n white: [255, 255, 255],\n yellow: [255, 255, 0]\n };\n})(jQuery);","// Source: https://github.com/devongovett/jquery.event.drag/blob/451d90e1a737f49f613d0966082ce67582b0afd1/drag/jquery.event.drag.js\n//\n//\tWarning! Make sure the hijack() is patch to work with any jquery version:\n//\n// ($.event.dispatch || $.event.handle).call( elem, event );\n//\n\n/*!\njquery.event.drag.js ~ v1.6 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)\nLiscensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt\n*/\n;\n(function ($) {\n // secure $ jQuery alias\n /*******************************************************************************************/\n // Created: 2008-06-04 | Updated: 2009-04-21\n /*******************************************************************************************/\n // Events: drag, dragstart, dragend\n /*******************************************************************************************/\n\n // jquery method\n $.fn.drag = function (fn1, fn2, fn3) {\n if (fn2) this.bind('dragstart', fn1); // 2+ args\n if (fn3) this.bind('dragend', fn3); // 3 args\n return !fn1 ? this.trigger('drag') // 0 args\n : this.bind('drag', fn2 ? fn2 : fn1); // 1+ args\n };\n\n // local refs\n var $event = $.event,\n $special = $event.special,\n // special event configuration\n drag = $special.drag = {\n not: ':input',\n // don't begin to drag on event.targets that match this selector\n distance: 0,\n // distance dragged before dragstart\n which: 1,\n // mouse button pressed to start drag sequence\n drop: false,\n // false to suppress drop events\n dragging: false,\n // hold the active target element\n setup: function (data) {\n data = $.extend({\n distance: drag.distance,\n which: drag.which,\n not: drag.not,\n drop: drag.drop\n }, data || {});\n data.distance = squared(data.distance); // x² + y² = distance²\n $event.add(this, \"mousedown\", handler, data);\n if (this.attachEvent) this.attachEvent(\"ondragstart\", dontStart); // prevent image dragging in IE...\n },\n teardown: function () {\n $event.remove(this, \"mousedown\", handler);\n if (this === drag.dragging) drag.dragging = drag.proxy = false; // deactivate element\n selectable(this, true); // enable text selection\n if (this.detachEvent) this.detachEvent(\"ondragstart\", dontStart); // prevent image dragging in IE...\n }\n };\n\n // prevent normal event binding...\n $special.dragstart = $special.dragend = {\n setup: function () {},\n teardown: function () {}\n };\n\n // handle drag-releatd DOM events\n function handler(event) {\n var elem = this,\n returned,\n data = event.data || {};\n // mousemove or mouseup\n if (data.elem) {\n // update event properties...\n elem = event.dragTarget = data.elem; // drag source element\n event.dragProxy = drag.proxy || elem; // proxy element or source\n event.cursorOffsetX = data.pageX - data.left; // mousedown offset\n event.cursorOffsetY = data.pageY - data.top; // mousedown offset\n event.offsetX = event.pageX - event.cursorOffsetX; // element offset\n event.offsetY = event.pageY - event.cursorOffsetY; // element offset\n }\n // mousedown, check some initial props to avoid the switch statement\n else if (drag.dragging || data.which > 0 && event.which != data.which || $(event.target).is(data.not)) return;\n // handle various events\n switch (event.type) {\n // mousedown, left click, event.target is not restricted, init dragging\n case 'mousedown':\n $.extend(data, $(elem).offset(), {\n elem: elem,\n target: event.target,\n pageX: event.pageX,\n pageY: event.pageY\n }); // store some initial attributes\n $event.add(document, \"mousemove mouseup\", handler, data);\n selectable(elem, false); // disable text selection\n drag.dragging = null; // pending state\n break;\n // prevents text selection in safari\n // mousemove, check distance, start dragging\n case !drag.dragging && 'mousemove':\n if (squared(event.pageX - data.pageX) + squared(event.pageY - data.pageY) // x² + y² = distance²\n < data.distance) break; // distance tolerance not reached\n event.target = data.target; // force target from \"mousedown\" event (fix distance issue)\n returned = hijack(event, \"dragstart\", elem); // trigger \"dragstart\", return proxy element\n if (returned !== false) {\n // \"dragstart\" not rejected\n drag.dragging = elem; // activate element\n drag.proxy = event.dragProxy = $(returned || elem)[0]; // set proxy\n }\n // mousemove, dragging\n case 'mousemove':\n if (drag.dragging) {\n returned = hijack(event, \"drag\", elem); // trigger \"drag\"\n if (data.drop && $special.drop) {\n // manage drop events\n $special.drop.allowed = returned !== false; // prevent drop\n $special.drop.handler(event); // \"dropstart\", \"dropend\"\n }\n if (returned !== false) break; // \"drag\" not rejected, stop\n event.type = \"mouseup\"; // helps \"drop\" handler behave\n }\n // mouseup, stop dragging\n case 'mouseup':\n $event.remove(document, \"mousemove mouseup\", handler); // remove page events\n if (drag.dragging) {\n if (data.drop && $special.drop) $special.drop.handler(event); // \"drop\"\n hijack(event, \"dragend\", elem); // trigger \"dragend\"\n }\n selectable(elem, true); // enable text selection\n drag.dragging = drag.proxy = data.elem = false; // deactivate element\n break;\n }\n }\n ;\n\n // set event type to custom value, and handle it\n function hijack(event, type, elem) {\n event.type = type; // force the event type\n var result = ($.event.dispatch || $.event.handle).call(elem, event);\n return result === false ? false : result || event.result;\n }\n ;\n\n // return the value squared\n function squared(value) {\n return Math.pow(value, 2);\n }\n ;\n\n // suppress default dragstart IE events...\n function dontStart() {\n return drag.dragging === false;\n }\n ;\n\n // toggles text selection attributes\n function selectable(elem, bool) {\n if (!elem) return; // maybe element was removed ?\n elem = elem.ownerDocument ? elem.ownerDocument : elem;\n elem.unselectable = bool ? \"off\" : \"on\"; // IE\n if (elem.style) elem.style.MozUserSelect = bool ? \"\" : \"none\"; // FF\n $.event[bool ? \"remove\" : \"add\"](elem, \"selectstart mousedown\", dontStart); // IE/Opera\n }\n ;\n\n /*******************************************************************************************/\n})(jQuery); // confine scope","/** ## jquery.flot.browser.js\n\nThis plugin is used to make available some browser-related utility functions.\n\n### Methods\n*/\n\n(function ($) {\n 'use strict';\n\n var browser = {\n /**\n - getPageXY(e)\n Calculates the pageX and pageY using the screenX, screenY properties of the event\n and the scrolling of the page. This is needed because the pageX and pageY\n properties of the event are not correct while running tests in Edge. */\n getPageXY: function (e) {\n // This code is inspired from https://stackoverflow.com/a/3464890\n var doc = document.documentElement,\n pageX = e.clientX + (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0),\n pageY = e.clientY + (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n return {\n X: pageX,\n Y: pageY\n };\n },\n /**\n - getPixelRatio(context)\n This function returns the current pixel ratio defined by the product of desktop\n zoom and page zoom.\n Additional info: https://www.html5rocks.com/en/tutorials/canvas/hidpi/\n */\n getPixelRatio: function (context) {\n var devicePixelRatio = window.devicePixelRatio || 1,\n backingStoreRatio = context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1;\n return devicePixelRatio / backingStoreRatio;\n },\n /**\n - isSafari, isMobileSafari, isOpera, isFirefox, isIE, isEdge, isChrome, isBlink\n This is a collection of functions, used to check if the code is running in a\n particular browser or Javascript engine.\n */\n isSafari: function () {\n // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\n // Safari 3.0+ \"[object HTMLElementConstructor]\"\n return /constructor/i.test(window.top.HTMLElement) || function (p) {\n return p.toString() === \"[object SafariRemoteNotification]\";\n }(!window.top['safari'] || typeof window.top.safari !== 'undefined' && window.top.safari.pushNotification);\n },\n isMobileSafari: function () {\n //isMobileSafari adapted from https://stackoverflow.com/questions/3007480/determine-if-user-navigated-from-mobile-safari\n return navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/);\n },\n isOpera: function () {\n // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\n //Opera 8.0+\n return !!window.opr && !!opr.addons || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;\n },\n isFirefox: function () {\n // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\n // Firefox 1.0+\n return typeof InstallTrigger !== 'undefined';\n },\n isIE: function () {\n // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\n // Internet Explorer 6-11\n return /*@cc_on!@*/false || !!document.documentMode;\n },\n isEdge: function () {\n // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\n // Edge 20+\n return !browser.isIE() && !!window.StyleMedia;\n },\n isChrome: function () {\n // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\n // Chrome 1+\n return !!window.chrome && !!window.chrome.webstore;\n },\n isBlink: function () {\n // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\n return (browser.isChrome() || browser.isOpera()) && !!window.CSS;\n }\n };\n $.plot.browser = browser;\n})(jQuery);","/**\n## jquery.flot.drawSeries.js\n\nThis plugin is used by flot for drawing lines, plots, bars or area.\n\n### Public methods\n*/\n\n(function ($) {\n \"use strict\";\n\n function DrawSeries() {\n function plotLine(datapoints, xoffset, yoffset, axisx, axisy, ctx, steps) {\n var points = datapoints.points,\n ps = datapoints.pointsize,\n prevx = null,\n prevy = null;\n var x1 = 0.0,\n y1 = 0.0,\n x2 = 0.0,\n y2 = 0.0,\n mx = null,\n my = null,\n i = 0;\n ctx.beginPath();\n for (i = ps; i < points.length; i += ps) {\n x1 = points[i - ps];\n y1 = points[i - ps + 1];\n x2 = points[i];\n y2 = points[i + 1];\n if (x1 === null || x2 === null) {\n mx = null;\n my = null;\n continue;\n }\n if (isNaN(x1) || isNaN(x2) || isNaN(y1) || isNaN(y2)) {\n prevx = null;\n prevy = null;\n continue;\n }\n if (steps) {\n if (mx !== null && my !== null) {\n // if middle point exists, transfer p2 -> p1 and p1 -> mp\n x2 = x1;\n y2 = y1;\n x1 = mx;\n y1 = my;\n\n // 'remove' middle point\n mx = null;\n my = null;\n\n // subtract pointsize from i to have current point p1 handled again\n i -= ps;\n } else if (y1 !== y2 && x1 !== x2) {\n // create a middle point\n y2 = y1;\n mx = x2;\n my = y1;\n }\n }\n\n // clip with ymin\n if (y1 <= y2 && y1 < axisy.min) {\n if (y2 < axisy.min) {\n // line segment is outside\n continue;\n }\n // compute new intersection point\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.min;\n } else if (y2 <= y1 && y2 < axisy.min) {\n if (y1 < axisy.min) {\n continue;\n }\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.min;\n }\n\n // clip with ymax\n if (y1 >= y2 && y1 > axisy.max) {\n if (y2 > axisy.max) {\n continue;\n }\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.max;\n } else if (y2 >= y1 && y2 > axisy.max) {\n if (y1 > axisy.max) {\n continue;\n }\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.max;\n }\n\n // clip with xmin\n if (x1 <= x2 && x1 < axisx.min) {\n if (x2 < axisx.min) {\n continue;\n }\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.min;\n } else if (x2 <= x1 && x2 < axisx.min) {\n if (x1 < axisx.min) {\n continue;\n }\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.min;\n }\n\n // clip with xmax\n if (x1 >= x2 && x1 > axisx.max) {\n if (x2 > axisx.max) {\n continue;\n }\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.max;\n } else if (x2 >= x1 && x2 > axisx.max) {\n if (x1 > axisx.max) {\n continue;\n }\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.max;\n }\n if (x1 !== prevx || y1 !== prevy) {\n ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\n }\n prevx = x2;\n prevy = y2;\n ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);\n }\n ctx.stroke();\n }\n function plotLineArea(datapoints, axisx, axisy, fillTowards, ctx, steps) {\n var points = datapoints.points,\n ps = datapoints.pointsize,\n bottom = fillTowards > axisy.min ? Math.min(axisy.max, fillTowards) : axisy.min,\n i = 0,\n ypos = 1,\n areaOpen = false,\n segmentStart = 0,\n segmentEnd = 0,\n mx = null,\n my = null;\n\n // we process each segment in two turns, first forward\n // direction to sketch out top, then once we hit the\n // end we go backwards to sketch the bottom\n while (true) {\n if (ps > 0 && i > points.length + ps) {\n break;\n }\n i += ps; // ps is negative if going backwards\n\n var x1 = points[i - ps],\n y1 = points[i - ps + ypos],\n x2 = points[i],\n y2 = points[i + ypos];\n if (ps === -2) {\n /* going backwards and no value for the bottom provided in the series*/\n y1 = y2 = bottom;\n }\n if (areaOpen) {\n if (ps > 0 && x1 != null && x2 == null) {\n // at turning point\n segmentEnd = i;\n ps = -ps;\n ypos = 2;\n continue;\n }\n if (ps < 0 && i === segmentStart + ps) {\n // done with the reverse sweep\n ctx.fill();\n areaOpen = false;\n ps = -ps;\n ypos = 1;\n i = segmentStart = segmentEnd + ps;\n continue;\n }\n }\n if (x1 == null || x2 == null) {\n mx = null;\n my = null;\n continue;\n }\n if (steps) {\n if (mx !== null && my !== null) {\n // if middle point exists, transfer p2 -> p1 and p1 -> mp\n x2 = x1;\n y2 = y1;\n x1 = mx;\n y1 = my;\n\n // 'remove' middle point\n mx = null;\n my = null;\n\n // subtract pointsize from i to have current point p1 handled again\n i -= ps;\n } else if (y1 !== y2 && x1 !== x2) {\n // create a middle point\n y2 = y1;\n mx = x2;\n my = y1;\n }\n }\n\n // clip x values\n\n // clip with xmin\n if (x1 <= x2 && x1 < axisx.min) {\n if (x2 < axisx.min) {\n continue;\n }\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.min;\n } else if (x2 <= x1 && x2 < axisx.min) {\n if (x1 < axisx.min) {\n continue;\n }\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.min;\n }\n\n // clip with xmax\n if (x1 >= x2 && x1 > axisx.max) {\n if (x2 > axisx.max) {\n continue;\n }\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.max;\n } else if (x2 >= x1 && x2 > axisx.max) {\n if (x1 > axisx.max) {\n continue;\n }\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.max;\n }\n if (!areaOpen) {\n // open area\n ctx.beginPath();\n ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));\n areaOpen = true;\n }\n\n // now first check the case where both is outside\n if (y1 >= axisy.max && y2 >= axisy.max) {\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));\n continue;\n } else if (y1 <= axisy.min && y2 <= axisy.min) {\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));\n continue;\n }\n\n // else it's a bit more complicated, there might\n // be a flat maxed out rectangle first, then a\n // triangular cutout or reverse; to find these\n // keep track of the current x values\n var x1old = x1,\n x2old = x2;\n\n // clip the y values, without shortcutting, we\n // go through all cases in turn\n\n // clip with ymin\n if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.min;\n } else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.min;\n }\n\n // clip with ymax\n if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.max;\n } else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.max;\n }\n\n // if the x value was changed we got a rectangle\n // to fill\n if (x1 !== x1old) {\n ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));\n // it goes to (x1, y1), but we fill that below\n }\n\n // fill triangular section, this sometimes result\n // in redundant points if (x1, y1) hasn't changed\n // from previous line to, but we just ignore that\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n\n // fill the other rectangle if it's there\n if (x2 !== x2old) {\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));\n }\n }\n }\n\n /**\n - drawSeriesLines(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient)\n This function is used for drawing lines or area fill. In case the series has line decimation function\n attached, before starting to draw, as an optimization the points will first be decimated.\n The series parameter contains the series to be drawn on ctx context. The plotOffset, plotWidth and\n plotHeight are the corresponding parameters of flot used to determine the drawing surface.\n The function getColorOrGradient is used to compute the fill style of lines and area.\n */\n function drawSeriesLines(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient) {\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n ctx.lineJoin = \"round\";\n if (series.lines.dashes && ctx.setLineDash) {\n ctx.setLineDash(series.lines.dashes);\n }\n var datapoints = {\n format: series.datapoints.format,\n points: series.datapoints.points,\n pointsize: series.datapoints.pointsize\n };\n if (series.decimate) {\n datapoints.points = series.decimate(series, series.xaxis.min, series.xaxis.max, plotWidth, series.yaxis.min, series.yaxis.max, plotHeight);\n }\n var lw = series.lines.lineWidth;\n ctx.lineWidth = lw;\n ctx.strokeStyle = series.color;\n var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight, getColorOrGradient);\n if (fillStyle) {\n ctx.fillStyle = fillStyle;\n plotLineArea(datapoints, series.xaxis, series.yaxis, series.lines.fillTowards || 0, ctx, series.lines.steps);\n }\n if (lw > 0) {\n plotLine(datapoints, 0, 0, series.xaxis, series.yaxis, ctx, series.lines.steps);\n }\n ctx.restore();\n }\n\n /**\n - drawSeriesPoints(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient)\n This function is used for drawing points using a given symbol. In case the series has points decimation\n function attached, before starting to draw, as an optimization the points will first be decimated.\n The series parameter contains the series to be drawn on ctx context. The plotOffset, plotWidth and\n plotHeight are the corresponding parameters of flot used to determine the drawing surface.\n The function drawSymbol is used to compute and draw the symbol chosen for the points.\n */\n function drawSeriesPoints(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient) {\n function drawCircle(ctx, x, y, radius, shadow, fill) {\n ctx.moveTo(x + radius, y);\n ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);\n }\n drawCircle.fill = true;\n function plotPoints(datapoints, radius, fill, offset, shadow, axisx, axisy, drawSymbolFn) {\n var points = datapoints.points,\n ps = datapoints.pointsize;\n ctx.beginPath();\n for (var i = 0; i < points.length; i += ps) {\n var x = points[i],\n y = points[i + 1];\n if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) {\n continue;\n }\n x = axisx.p2c(x);\n y = axisy.p2c(y) + offset;\n drawSymbolFn(ctx, x, y, radius, shadow, fill);\n }\n if (drawSymbolFn.fill && !shadow) {\n ctx.fill();\n }\n ctx.stroke();\n }\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n var datapoints = {\n format: series.datapoints.format,\n points: series.datapoints.points,\n pointsize: series.datapoints.pointsize\n };\n if (series.decimatePoints) {\n datapoints.points = series.decimatePoints(series, series.xaxis.min, series.xaxis.max, plotWidth, series.yaxis.min, series.yaxis.max, plotHeight);\n }\n var lw = series.points.lineWidth,\n radius = series.points.radius,\n symbol = series.points.symbol,\n drawSymbolFn;\n if (symbol === 'circle') {\n drawSymbolFn = drawCircle;\n } else if (typeof symbol === 'string' && drawSymbol && drawSymbol[symbol]) {\n drawSymbolFn = drawSymbol[symbol];\n } else if (typeof drawSymbol === 'function') {\n drawSymbolFn = drawSymbol;\n }\n\n // If the user sets the line width to 0, we change it to a very\n // small value. A line width of 0 seems to force the default of 1.\n\n if (lw === 0) {\n lw = 0.0001;\n }\n ctx.lineWidth = lw;\n ctx.fillStyle = getFillStyle(series.points, series.color, null, null, getColorOrGradient);\n ctx.strokeStyle = series.color;\n plotPoints(datapoints, radius, true, 0, false, series.xaxis, series.yaxis, drawSymbolFn);\n ctx.restore();\n }\n function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {\n var left = x + barLeft,\n right = x + barRight,\n bottom = b,\n top = y,\n drawLeft,\n drawRight,\n drawTop,\n drawBottom = false,\n tmp;\n drawLeft = drawRight = drawTop = true;\n\n // in horizontal mode, we start the bar from the left\n // instead of from the bottom so it appears to be\n // horizontal rather than vertical\n if (horizontal) {\n drawBottom = drawRight = drawTop = true;\n drawLeft = false;\n left = b;\n right = x;\n top = y + barLeft;\n bottom = y + barRight;\n\n // account for negative bars\n if (right < left) {\n tmp = right;\n right = left;\n left = tmp;\n drawLeft = true;\n drawRight = false;\n }\n } else {\n drawLeft = drawRight = drawTop = true;\n drawBottom = false;\n left = x + barLeft;\n right = x + barRight;\n bottom = b;\n top = y;\n\n // account for negative bars\n if (top < bottom) {\n tmp = top;\n top = bottom;\n bottom = tmp;\n drawBottom = true;\n drawTop = false;\n }\n }\n\n // clip\n if (right < axisx.min || left > axisx.max || top < axisy.min || bottom > axisy.max) {\n return;\n }\n if (left < axisx.min) {\n left = axisx.min;\n drawLeft = false;\n }\n if (right > axisx.max) {\n right = axisx.max;\n drawRight = false;\n }\n if (bottom < axisy.min) {\n bottom = axisy.min;\n drawBottom = false;\n }\n if (top > axisy.max) {\n top = axisy.max;\n drawTop = false;\n }\n left = axisx.p2c(left);\n bottom = axisy.p2c(bottom);\n right = axisx.p2c(right);\n top = axisy.p2c(top);\n\n // fill the bar\n if (fillStyleCallback) {\n c.fillStyle = fillStyleCallback(bottom, top);\n c.fillRect(left, top, right - left, bottom - top);\n }\n\n // draw outline\n if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {\n c.beginPath();\n\n // FIXME: inline moveTo is buggy with excanvas\n c.moveTo(left, bottom);\n if (drawLeft) {\n c.lineTo(left, top);\n } else {\n c.moveTo(left, top);\n }\n if (drawTop) {\n c.lineTo(right, top);\n } else {\n c.moveTo(right, top);\n }\n if (drawRight) {\n c.lineTo(right, bottom);\n } else {\n c.moveTo(right, bottom);\n }\n if (drawBottom) {\n c.lineTo(left, bottom);\n } else {\n c.moveTo(left, bottom);\n }\n c.stroke();\n }\n }\n\n /**\n - drawSeriesBars(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient)\n This function is used for drawing series represented as bars. In case the series has decimation\n function attached, before starting to draw, as an optimization the points will first be decimated.\n The series parameter contains the series to be drawn on ctx context. The plotOffset, plotWidth and\n plotHeight are the corresponding parameters of flot used to determine the drawing surface.\n The function getColorOrGradient is used to compute the fill style of bars.\n */\n function drawSeriesBars(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient) {\n function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {\n var points = datapoints.points,\n ps = datapoints.pointsize,\n fillTowards = series.bars.fillTowards || 0,\n defaultBottom = fillTowards > axisy.min ? Math.min(axisy.max, fillTowards) : axisy.min;\n for (var i = 0; i < points.length; i += ps) {\n if (points[i] == null) {\n continue;\n }\n\n // Use third point as bottom if pointsize is 3\n var bottom = ps === 3 ? points[i + 2] : defaultBottom;\n drawBar(points[i], points[i + 1], bottom, barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);\n }\n }\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n var datapoints = {\n format: series.datapoints.format,\n points: series.datapoints.points,\n pointsize: series.datapoints.pointsize\n };\n if (series.decimate) {\n datapoints.points = series.decimate(series, series.xaxis.min, series.xaxis.max, plotWidth);\n }\n ctx.lineWidth = series.bars.lineWidth;\n ctx.strokeStyle = series.color;\n var barLeft;\n var barWidth = series.bars.barWidth[0] || series.bars.barWidth;\n switch (series.bars.align) {\n case \"left\":\n barLeft = 0;\n break;\n case \"right\":\n barLeft = -barWidth;\n break;\n default:\n barLeft = -barWidth / 2;\n }\n var fillStyleCallback = series.bars.fill ? function (bottom, top) {\n return getFillStyle(series.bars, series.color, bottom, top, getColorOrGradient);\n } : null;\n plotBars(datapoints, barLeft, barLeft + barWidth, fillStyleCallback, series.xaxis, series.yaxis);\n ctx.restore();\n }\n function getFillStyle(filloptions, seriesColor, bottom, top, getColorOrGradient) {\n var fill = filloptions.fill;\n if (!fill) {\n return null;\n }\n if (filloptions.fillColor) {\n return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);\n }\n var c = $.color.parse(seriesColor);\n c.a = typeof fill === \"number\" ? fill : 0.4;\n c.normalize();\n return c.toString();\n }\n this.drawSeriesLines = drawSeriesLines;\n this.drawSeriesPoints = drawSeriesPoints;\n this.drawSeriesBars = drawSeriesBars;\n this.drawBar = drawBar;\n }\n ;\n $.plot.drawSeries = new DrawSeries();\n})(jQuery);","/* global jQuery */\n\n/**\n## jquery.flot.hover.js\n\nThis plugin is used for mouse hover and tap on a point of plot series.\nIt supports the following options:\n```js\ngrid: {\n hoverable: false, //to trigger plothover event on mouse hover or tap on a point\n clickable: false //to trigger plotclick event on mouse hover\n}\n```\n\nIt listens to native mouse move event or click, as well as artificial generated\ntap and touchevent.\n\nWhen the mouse is over a point or a tap on a point is performed, that point or\nthe correscponding bar will be highlighted and a \"plothover\" event will be generated.\n\nCustom \"touchevent\" is triggered when any touch interaction is made. Hover plugin\nhandles this events by unhighlighting all of the previously highlighted points and generates\n\"plothovercleanup\" event to notify any part that is handling plothover (for exemple to cleanup\nthe tooltip from webcharts).\n*/\n\n(function ($) {\n 'use strict';\n\n var options = {\n grid: {\n hoverable: false,\n clickable: false\n }\n };\n var browser = $.plot.browser;\n var eventType = {\n click: 'click',\n hover: 'hover'\n };\n function init(plot) {\n var lastMouseMoveEvent;\n var highlights = [];\n function bindEvents(plot, eventHolder) {\n var o = plot.getOptions();\n if (o.grid.hoverable || o.grid.clickable) {\n eventHolder[0].addEventListener('touchevent', triggerCleanupEvent, false);\n eventHolder[0].addEventListener('tap', generatePlothoverEvent, false);\n }\n if (o.grid.clickable) {\n eventHolder.bind(\"click\", onClick);\n }\n if (o.grid.hoverable) {\n eventHolder.bind(\"mousemove\", onMouseMove);\n\n // Use bind, rather than .mouseleave, because we officially\n // still support jQuery 1.2.6, which doesn't define a shortcut\n // for mouseenter or mouseleave. This was a bug/oversight that\n // was fixed somewhere around 1.3.x. We can return to using\n // .mouseleave when we drop support for 1.2.6.\n\n eventHolder.bind(\"mouseleave\", onMouseLeave);\n }\n }\n function shutdown(plot, eventHolder) {\n eventHolder[0].removeEventListener('tap', generatePlothoverEvent);\n eventHolder[0].removeEventListener('touchevent', triggerCleanupEvent);\n eventHolder.unbind(\"mousemove\", onMouseMove);\n eventHolder.unbind(\"mouseleave\", onMouseLeave);\n eventHolder.unbind(\"click\", onClick);\n highlights = [];\n }\n function generatePlothoverEvent(e) {\n var o = plot.getOptions(),\n newEvent = new CustomEvent('mouseevent');\n\n //transform from touch event to mouse event format\n newEvent.pageX = e.detail.changedTouches[0].pageX;\n newEvent.pageY = e.detail.changedTouches[0].pageY;\n newEvent.clientX = e.detail.changedTouches[0].clientX;\n newEvent.clientY = e.detail.changedTouches[0].clientY;\n if (o.grid.hoverable) {\n doTriggerClickHoverEvent(newEvent, eventType.hover, 30);\n }\n return false;\n }\n function doTriggerClickHoverEvent(event, eventType, searchDistance) {\n var series = plot.getData();\n if (event !== undefined && series.length > 0 && series[0].xaxis.c2p !== undefined && series[0].yaxis.c2p !== undefined) {\n var eventToTrigger = \"plot\" + eventType;\n var seriesFlag = eventType + \"able\";\n triggerClickHoverEvent(eventToTrigger, event, function (i) {\n return series[i][seriesFlag] !== false;\n }, searchDistance);\n }\n }\n function onMouseMove(e) {\n lastMouseMoveEvent = e;\n plot.getPlaceholder()[0].lastMouseMoveEvent = e;\n doTriggerClickHoverEvent(e, eventType.hover);\n }\n function onMouseLeave(e) {\n lastMouseMoveEvent = undefined;\n plot.getPlaceholder()[0].lastMouseMoveEvent = undefined;\n triggerClickHoverEvent(\"plothover\", e, function (i) {\n return false;\n });\n }\n function onClick(e) {\n doTriggerClickHoverEvent(e, eventType.click);\n }\n function triggerCleanupEvent() {\n plot.unhighlight();\n plot.getPlaceholder().trigger('plothovercleanup');\n }\n\n // trigger click or hover event (they send the same parameters\n // so we share their code)\n function triggerClickHoverEvent(eventname, event, seriesFilter, searchDistance) {\n var options = plot.getOptions(),\n offset = plot.offset(),\n page = browser.getPageXY(event),\n canvasX = page.X - offset.left,\n canvasY = page.Y - offset.top,\n pos = plot.c2p({\n left: canvasX,\n top: canvasY\n }),\n distance = searchDistance !== undefined ? searchDistance : options.grid.mouseActiveRadius;\n pos.pageX = page.X;\n pos.pageY = page.Y;\n var items = plot.findNearbyItems(canvasX, canvasY, seriesFilter, distance);\n var item = items[0];\n for (let i = 1; i < items.length; ++i) {\n if (item.distance === undefined || items[i].distance < item.distance) {\n item = items[i];\n }\n }\n if (item) {\n // fill in mouse pos for any listeners out there\n item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left, 10);\n item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top, 10);\n } else {\n item = null;\n }\n if (options.grid.autoHighlight) {\n // clear auto-highlights\n for (let i = 0; i < highlights.length; ++i) {\n var h = highlights[i];\n if (h.auto === eventname && !(item && h.series === item.series && h.point[0] === item.datapoint[0] && h.point[1] === item.datapoint[1]) || !item) {\n unhighlight(h.series, h.point);\n }\n }\n if (item) {\n highlight(item.series, item.datapoint, eventname);\n }\n }\n plot.getPlaceholder().trigger(eventname, [pos, item, items]);\n }\n function highlight(s, point, auto) {\n if (typeof s === \"number\") {\n s = plot.getData()[s];\n }\n if (typeof point === \"number\") {\n var ps = s.datapoints.pointsize;\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\n }\n var i = indexOfHighlight(s, point);\n if (i === -1) {\n highlights.push({\n series: s,\n point: point,\n auto: auto\n });\n plot.triggerRedrawOverlay();\n } else if (!auto) {\n highlights[i].auto = false;\n }\n }\n function unhighlight(s, point) {\n if (s == null && point == null) {\n highlights = [];\n plot.triggerRedrawOverlay();\n return;\n }\n if (typeof s === \"number\") {\n s = plot.getData()[s];\n }\n if (typeof point === \"number\") {\n var ps = s.datapoints.pointsize;\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\n }\n var i = indexOfHighlight(s, point);\n if (i !== -1) {\n highlights.splice(i, 1);\n plot.triggerRedrawOverlay();\n }\n }\n function indexOfHighlight(s, p) {\n for (var i = 0; i < highlights.length; ++i) {\n var h = highlights[i];\n if (h.series === s && h.point[0] === p[0] && h.point[1] === p[1]) {\n return i;\n }\n }\n return -1;\n }\n function processDatapoints() {\n triggerCleanupEvent();\n doTriggerClickHoverEvent(lastMouseMoveEvent, eventType.hover);\n }\n function setupGrid() {\n doTriggerClickHoverEvent(lastMouseMoveEvent, eventType.hover);\n }\n function drawOverlay(plot, octx, overlay) {\n var plotOffset = plot.getPlotOffset(),\n i,\n hi;\n octx.save();\n octx.translate(plotOffset.left, plotOffset.top);\n for (i = 0; i < highlights.length; ++i) {\n hi = highlights[i];\n if (hi.series.bars.show) drawBarHighlight(hi.series, hi.point, octx);else drawPointHighlight(hi.series, hi.point, octx, plot);\n }\n octx.restore();\n }\n function drawPointHighlight(series, point, octx, plot) {\n var x = point[0],\n y = point[1],\n axisx = series.xaxis,\n axisy = series.yaxis,\n highlightColor = typeof series.highlightColor === \"string\" ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();\n if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) {\n return;\n }\n var pointRadius = series.points.radius + series.points.lineWidth / 2;\n octx.lineWidth = pointRadius;\n octx.strokeStyle = highlightColor;\n var radius = 1.5 * pointRadius;\n x = axisx.p2c(x);\n y = axisy.p2c(y);\n octx.beginPath();\n var symbol = series.points.symbol;\n if (symbol === 'circle') {\n octx.arc(x, y, radius, 0, 2 * Math.PI, false);\n } else if (typeof symbol === 'string' && plot.drawSymbol && plot.drawSymbol[symbol]) {\n plot.drawSymbol[symbol](octx, x, y, radius, false);\n }\n octx.closePath();\n octx.stroke();\n }\n function drawBarHighlight(series, point, octx) {\n var highlightColor = typeof series.highlightColor === \"string\" ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),\n fillStyle = highlightColor,\n barLeft;\n var barWidth = series.bars.barWidth[0] || series.bars.barWidth;\n switch (series.bars.align) {\n case \"left\":\n barLeft = 0;\n break;\n case \"right\":\n barLeft = -barWidth;\n break;\n default:\n barLeft = -barWidth / 2;\n }\n octx.lineWidth = series.bars.lineWidth;\n octx.strokeStyle = highlightColor;\n var fillTowards = series.bars.fillTowards || 0,\n bottom = fillTowards > series.yaxis.min ? Math.min(series.yaxis.max, fillTowards) : series.yaxis.min;\n $.plot.drawSeries.drawBar(point[0], point[1], point[2] || bottom, barLeft, barLeft + barWidth, function () {\n return fillStyle;\n }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);\n }\n function initHover(plot, options) {\n plot.highlight = highlight;\n plot.unhighlight = unhighlight;\n if (options.grid.hoverable || options.grid.clickable) {\n plot.hooks.drawOverlay.push(drawOverlay);\n plot.hooks.processDatapoints.push(processDatapoints);\n plot.hooks.setupGrid.push(setupGrid);\n }\n lastMouseMoveEvent = plot.getPlaceholder()[0].lastMouseMoveEvent;\n }\n plot.hooks.bindEvents.push(bindEvents);\n plot.hooks.shutdown.push(shutdown);\n plot.hooks.processOptions.push(initHover);\n }\n $.plot.plugins.push({\n init: init,\n options: options,\n name: 'hover',\n version: '0.1'\n });\n})(jQuery);","(function ($) {\n 'use strict';\n\n var saturated = {\n saturate: function (a) {\n if (a === Infinity) {\n return Number.MAX_VALUE;\n }\n if (a === -Infinity) {\n return -Number.MAX_VALUE;\n }\n return a;\n },\n delta: function (min, max, noTicks) {\n return (max - min) / noTicks === Infinity ? max / noTicks - min / noTicks : (max - min) / noTicks;\n },\n multiply: function (a, b) {\n return saturated.saturate(a * b);\n },\n // returns c * bInt * a. Beahves properly in the case where c is negative\n // and bInt * a is bigger that Number.MAX_VALUE (Infinity)\n multiplyAdd: function (a, bInt, c) {\n if (isFinite(a * bInt)) {\n return saturated.saturate(a * bInt + c);\n } else {\n var result = c;\n for (var i = 0; i < bInt; i++) {\n result += a;\n }\n return saturated.saturate(result);\n }\n },\n // round to nearby lower multiple of base\n floorInBase: function (n, base) {\n return base * Math.floor(n / base);\n }\n };\n $.plot.saturated = saturated;\n})(jQuery);","/* Flot plugin for selecting regions of a plot.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin supports these options:\n\nselection: {\n mode: null or \"x\" or \"y\" or \"xy\" or \"smart\",\n color: color,\n shape: \"round\" or \"miter\" or \"bevel\",\n visualization: \"fill\" or \"focus\",\n displaySelectionDecorations: true or false,\n minSize: number of pixels\n}\n\nSelection support is enabled by setting the mode to one of \"x\", \"y\" or \"xy\".\nIn \"x\" mode, the user will only be able to specify the x range, similarly for\n\"y\" mode. For \"xy\", the selection becomes a rectangle where both ranges can be\nspecified. \"color\" is color of the selection (if you need to change the color\nlater on, you can get to it with plot.getOptions().selection.color). \"shape\"\nis the shape of the corners of the selection.\n\nThe way how the selection is visualized, can be changed by using the option\n\"visualization\". Flot currently supports two modes: \"focus\" and \"fill\". The\noption \"focus\" draws a colored bezel around the selected area while keeping\nthe selected area clear. The option \"fill\" highlights (i.e., fills) the\nselected area with a colored highlight.\n\nThere are optional selection decorations (handles) that are rendered with the\n\"focus\" visualization option. The selection decoration is rendered by default\nbut can be turned off by setting displaySelectionDecorations to false.\n\n\"minSize\" is the minimum size a selection can be in pixels. This value can\nbe customized to determine the smallest size a selection can be and still\nhave the selection rectangle be displayed. When customizing this value, the\nfact that it refers to pixels, not axis units must be taken into account.\nThus, for example, if there is a bar graph in time mode with BarWidth set to 1\nminute, setting \"minSize\" to 1 will not make the minimum selection size 1\nminute, but rather 1 pixel. Note also that setting \"minSize\" to 0 will prevent\n\"plotunselected\" events from being fired when the user clicks the mouse without\ndragging.\n\nWhen selection support is enabled, a \"plotselected\" event will be emitted on\nthe DOM element you passed into the plot function. The event handler gets a\nparameter with the ranges selected on the axes, like this:\n\n placeholder.bind( \"plotselected\", function( event, ranges ) {\n alert(\"You selected \" + ranges.xaxis.from + \" to \" + ranges.xaxis.to)\n // similar for yaxis - with multiple axes, the extra ones are in\n // x2axis, x3axis, ...\n });\n\nThe \"plotselected\" event is only fired when the user has finished making the\nselection. A \"plotselecting\" event is fired during the process with the same\nparameters as the \"plotselected\" event, in case you want to know what's\nhappening while it's happening,\n\nA \"plotunselected\" event with no arguments is emitted when the user clicks the\nmouse to remove the selection. As stated above, setting \"minSize\" to 0 will\ndestroy this behavior.\n\nThe plugin allso adds the following methods to the plot object:\n\n- setSelection( ranges, preventEvent )\n\n Set the selection rectangle. The passed in ranges is on the same form as\n returned in the \"plotselected\" event. If the selection mode is \"x\", you\n should put in either an xaxis range, if the mode is \"y\" you need to put in\n an yaxis range and both xaxis and yaxis if the selection mode is \"xy\", like\n this:\n\n setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } });\n\n setSelection will trigger the \"plotselected\" event when called. If you don't\n want that to happen, e.g. if you're inside a \"plotselected\" handler, pass\n true as the second parameter. If you are using multiple axes, you can\n specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of\n xaxis, the plugin picks the first one it sees.\n\n- clearSelection( preventEvent )\n\n Clear the selection rectangle. Pass in true to avoid getting a\n \"plotunselected\" event.\n\n- getSelection()\n\n Returns the current selection in the same format as the \"plotselected\"\n event. If there's currently no selection, the function returns null.\n\n*/\n\n(function ($) {\n function init(plot) {\n var selection = {\n first: {\n x: -1,\n y: -1\n },\n second: {\n x: -1,\n y: -1\n },\n show: false,\n currentMode: 'xy',\n active: false\n };\n var SNAPPING_CONSTANT = $.plot.uiConstants.SNAPPING_CONSTANT;\n\n // FIXME: The drag handling implemented here should be\n // abstracted out, there's some similar code from a library in\n // the navigation plugin, this should be massaged a bit to fit\n // the Flot cases here better and reused. Doing this would\n // make this plugin much slimmer.\n var savedhandlers = {};\n function onDrag(e) {\n if (selection.active) {\n updateSelection(e);\n plot.getPlaceholder().trigger(\"plotselecting\", [getSelection()]);\n }\n }\n function onDragStart(e) {\n var o = plot.getOptions();\n // only accept left-click\n if (e.which !== 1 || o.selection.mode === null) return;\n\n // reinitialize currentMode\n selection.currentMode = 'xy';\n\n // cancel out any text selections\n document.body.focus();\n\n // prevent text selection and drag in old-school browsers\n if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) {\n savedhandlers.onselectstart = document.onselectstart;\n document.onselectstart = function () {\n return false;\n };\n }\n if (document.ondrag !== undefined && savedhandlers.ondrag == null) {\n savedhandlers.ondrag = document.ondrag;\n document.ondrag = function () {\n return false;\n };\n }\n setSelectionPos(selection.first, e);\n selection.active = true;\n }\n function onDragEnd(e) {\n // revert drag stuff for old-school browsers\n if (document.onselectstart !== undefined) {\n document.onselectstart = savedhandlers.onselectstart;\n }\n if (document.ondrag !== undefined) {\n document.ondrag = savedhandlers.ondrag;\n }\n\n // no more dragging\n selection.active = false;\n updateSelection(e);\n if (selectionIsSane()) {\n triggerSelectedEvent();\n } else {\n // this counts as a clear\n plot.getPlaceholder().trigger(\"plotunselected\", []);\n plot.getPlaceholder().trigger(\"plotselecting\", [null]);\n }\n return false;\n }\n function getSelection() {\n if (!selectionIsSane()) return null;\n if (!selection.show) return null;\n var r = {},\n c1 = {\n x: selection.first.x,\n y: selection.first.y\n },\n c2 = {\n x: selection.second.x,\n y: selection.second.y\n };\n if (selectionDirection(plot) === 'x') {\n c1.y = 0;\n c2.y = plot.height();\n }\n if (selectionDirection(plot) === 'y') {\n c1.x = 0;\n c2.x = plot.width();\n }\n $.each(plot.getAxes(), function (name, axis) {\n if (axis.used) {\n var p1 = axis.c2p(c1[axis.direction]),\n p2 = axis.c2p(c2[axis.direction]);\n r[name] = {\n from: Math.min(p1, p2),\n to: Math.max(p1, p2)\n };\n }\n });\n return r;\n }\n function triggerSelectedEvent() {\n var r = getSelection();\n plot.getPlaceholder().trigger(\"plotselected\", [r]);\n\n // backwards-compat stuff, to be removed in future\n if (r.xaxis && r.yaxis) {\n plot.getPlaceholder().trigger(\"selected\", [{\n x1: r.xaxis.from,\n y1: r.yaxis.from,\n x2: r.xaxis.to,\n y2: r.yaxis.to\n }]);\n }\n }\n function clamp(min, value, max) {\n return value < min ? min : value > max ? max : value;\n }\n function selectionDirection(plot) {\n var o = plot.getOptions();\n if (o.selection.mode === 'smart') {\n return selection.currentMode;\n } else {\n return o.selection.mode;\n }\n }\n function updateMode(pos) {\n if (selection.first) {\n var delta = {\n x: pos.x - selection.first.x,\n y: pos.y - selection.first.y\n };\n if (Math.abs(delta.x) < SNAPPING_CONSTANT) {\n selection.currentMode = 'y';\n } else if (Math.abs(delta.y) < SNAPPING_CONSTANT) {\n selection.currentMode = 'x';\n } else {\n selection.currentMode = 'xy';\n }\n }\n }\n function setSelectionPos(pos, e) {\n var offset = plot.getPlaceholder().offset();\n var plotOffset = plot.getPlotOffset();\n pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width());\n pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height());\n if (pos !== selection.first) updateMode(pos);\n if (selectionDirection(plot) === \"y\") {\n pos.x = pos === selection.first ? 0 : plot.width();\n }\n if (selectionDirection(plot) === \"x\") {\n pos.y = pos === selection.first ? 0 : plot.height();\n }\n }\n function updateSelection(pos) {\n if (pos.pageX == null) return;\n setSelectionPos(selection.second, pos);\n if (selectionIsSane()) {\n selection.show = true;\n plot.triggerRedrawOverlay();\n } else clearSelection(true);\n }\n function clearSelection(preventEvent) {\n if (selection.show) {\n selection.show = false;\n selection.currentMode = '';\n plot.triggerRedrawOverlay();\n if (!preventEvent) {\n plot.getPlaceholder().trigger(\"plotunselected\", []);\n }\n }\n }\n\n // function taken from markings support in Flot\n function extractRange(ranges, coord) {\n var axis,\n from,\n to,\n key,\n axes = plot.getAxes();\n for (var k in axes) {\n axis = axes[k];\n if (axis.direction === coord) {\n key = coord + axis.n + \"axis\";\n if (!ranges[key] && axis.n === 1) {\n // support x1axis as xaxis\n key = coord + \"axis\";\n }\n if (ranges[key]) {\n from = ranges[key].from;\n to = ranges[key].to;\n break;\n }\n }\n }\n\n // backwards-compat stuff - to be removed in future\n if (!ranges[key]) {\n axis = coord === \"x\" ? plot.getXAxes()[0] : plot.getYAxes()[0];\n from = ranges[coord + \"1\"];\n to = ranges[coord + \"2\"];\n }\n\n // auto-reverse as an added bonus\n if (from != null && to != null && from > to) {\n var tmp = from;\n from = to;\n to = tmp;\n }\n return {\n from: from,\n to: to,\n axis: axis\n };\n }\n function setSelection(ranges, preventEvent) {\n var range;\n if (selectionDirection(plot) === \"y\") {\n selection.first.x = 0;\n selection.second.x = plot.width();\n } else {\n range = extractRange(ranges, \"x\");\n selection.first.x = range.axis.p2c(range.from);\n selection.second.x = range.axis.p2c(range.to);\n }\n if (selectionDirection(plot) === \"x\") {\n selection.first.y = 0;\n selection.second.y = plot.height();\n } else {\n range = extractRange(ranges, \"y\");\n selection.first.y = range.axis.p2c(range.from);\n selection.second.y = range.axis.p2c(range.to);\n }\n selection.show = true;\n plot.triggerRedrawOverlay();\n if (!preventEvent && selectionIsSane()) {\n triggerSelectedEvent();\n }\n }\n function selectionIsSane() {\n var minSize = plot.getOptions().selection.minSize;\n return Math.abs(selection.second.x - selection.first.x) >= minSize && Math.abs(selection.second.y - selection.first.y) >= minSize;\n }\n plot.clearSelection = clearSelection;\n plot.setSelection = setSelection;\n plot.getSelection = getSelection;\n plot.hooks.bindEvents.push(function (plot, eventHolder) {\n var o = plot.getOptions();\n if (o.selection.mode != null) {\n plot.addEventHandler(\"dragstart\", onDragStart, eventHolder, 0);\n plot.addEventHandler(\"drag\", onDrag, eventHolder, 0);\n plot.addEventHandler(\"dragend\", onDragEnd, eventHolder, 0);\n }\n });\n function drawSelectionDecorations(ctx, x, y, w, h, oX, oY, mode) {\n var spacing = 3;\n var fullEarWidth = 15;\n var earWidth = Math.max(0, Math.min(fullEarWidth, w / 2 - 2, h / 2 - 2));\n ctx.fillStyle = '#ffffff';\n if (mode === 'xy') {\n ctx.beginPath();\n ctx.moveTo(x, y + earWidth);\n ctx.lineTo(x - 3, y + earWidth);\n ctx.lineTo(x - 3, y - 3);\n ctx.lineTo(x + earWidth, y - 3);\n ctx.lineTo(x + earWidth, y);\n ctx.lineTo(x, y);\n ctx.closePath();\n ctx.moveTo(x, y + h - earWidth);\n ctx.lineTo(x - 3, y + h - earWidth);\n ctx.lineTo(x - 3, y + h + 3);\n ctx.lineTo(x + earWidth, y + h + 3);\n ctx.lineTo(x + earWidth, y + h);\n ctx.lineTo(x, y + h);\n ctx.closePath();\n ctx.moveTo(x + w, y + earWidth);\n ctx.lineTo(x + w + 3, y + earWidth);\n ctx.lineTo(x + w + 3, y - 3);\n ctx.lineTo(x + w - earWidth, y - 3);\n ctx.lineTo(x + w - earWidth, y);\n ctx.lineTo(x + w, y);\n ctx.closePath();\n ctx.moveTo(x + w, y + h - earWidth);\n ctx.lineTo(x + w + 3, y + h - earWidth);\n ctx.lineTo(x + w + 3, y + h + 3);\n ctx.lineTo(x + w - earWidth, y + h + 3);\n ctx.lineTo(x + w - earWidth, y + h);\n ctx.lineTo(x + w, y + h);\n ctx.closePath();\n ctx.stroke();\n ctx.fill();\n }\n x = oX;\n y = oY;\n if (mode === 'x') {\n ctx.beginPath();\n ctx.moveTo(x, y + fullEarWidth);\n ctx.lineTo(x, y - fullEarWidth);\n ctx.lineTo(x - spacing, y - fullEarWidth);\n ctx.lineTo(x - spacing, y + fullEarWidth);\n ctx.closePath();\n ctx.moveTo(x + w, y + fullEarWidth);\n ctx.lineTo(x + w, y - fullEarWidth);\n ctx.lineTo(x + w + spacing, y - fullEarWidth);\n ctx.lineTo(x + w + spacing, y + fullEarWidth);\n ctx.closePath();\n ctx.stroke();\n ctx.fill();\n }\n if (mode === 'y') {\n ctx.beginPath();\n ctx.moveTo(x - fullEarWidth, y);\n ctx.lineTo(x + fullEarWidth, y);\n ctx.lineTo(x + fullEarWidth, y - spacing);\n ctx.lineTo(x - fullEarWidth, y - spacing);\n ctx.closePath();\n ctx.moveTo(x - fullEarWidth, y + h);\n ctx.lineTo(x + fullEarWidth, y + h);\n ctx.lineTo(x + fullEarWidth, y + h + spacing);\n ctx.lineTo(x - fullEarWidth, y + h + spacing);\n ctx.closePath();\n ctx.stroke();\n ctx.fill();\n }\n }\n plot.hooks.drawOverlay.push(function (plot, ctx) {\n // draw selection\n if (selection.show && selectionIsSane()) {\n var plotOffset = plot.getPlotOffset();\n var o = plot.getOptions();\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n var c = $.color.parse(o.selection.color);\n var visualization = o.selection.visualization;\n var displaySelectionDecorations = o.selection.displaySelectionDecorations;\n var scalingFactor = 1;\n\n // use a dimmer scaling factor if visualization is \"fill\"\n if (visualization === \"fill\") {\n scalingFactor = 0.8;\n }\n ctx.strokeStyle = c.scale('a', scalingFactor).toString();\n ctx.lineWidth = 1;\n ctx.lineJoin = o.selection.shape;\n ctx.fillStyle = c.scale('a', 0.4).toString();\n var x = Math.min(selection.first.x, selection.second.x) + 0.5,\n oX = x,\n y = Math.min(selection.first.y, selection.second.y) + 0.5,\n oY = y,\n w = Math.abs(selection.second.x - selection.first.x) - 1,\n h = Math.abs(selection.second.y - selection.first.y) - 1;\n if (selectionDirection(plot) === 'x') {\n h += y;\n y = 0;\n }\n if (selectionDirection(plot) === 'y') {\n w += x;\n x = 0;\n }\n if (visualization === \"fill\") {\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n } else {\n ctx.fillRect(0, 0, plot.width(), plot.height());\n ctx.clearRect(x, y, w, h);\n if (displaySelectionDecorations) {\n drawSelectionDecorations(ctx, x, y, w, h, oX, oY, selectionDirection(plot));\n }\n }\n ctx.restore();\n }\n });\n plot.hooks.shutdown.push(function (plot, eventHolder) {\n eventHolder.unbind(\"dragstart\", onDragStart);\n eventHolder.unbind(\"drag\", onDrag);\n eventHolder.unbind(\"dragend\", onDragEnd);\n });\n }\n $.plot.plugins.push({\n init: init,\n options: {\n selection: {\n mode: null,\n // one of null, \"x\", \"y\" or \"xy\"\n visualization: \"focus\",\n // \"focus\" or \"fill\"\n displaySelectionDecorations: true,\n // true or false (currently only relevant for the focus visualization)\n color: \"#888888\",\n shape: \"round\",\n // one of \"round\", \"miter\", or \"bevel\"\n minSize: 5 // minimum number of pixels\n }\n },\n name: 'selection',\n version: '1.1'\n });\n})(jQuery);","(function ($) {\n 'use strict';\n\n $.plot.uiConstants = {\n SNAPPING_CONSTANT: 20,\n PANHINT_LENGTH_CONSTANT: 10,\n MINOR_TICKS_COUNT_CONSTANT: 4,\n TICK_LENGTH_CONSTANT: 10,\n ZOOM_DISTANCE_MARGIN: 25\n };\n})(jQuery);"],"sourceRoot":""}