0&&o');if(this.name=="xaxis"||this.name=="x2axis"){this._elem.width(this._plotDimensions.width)}else{this._elem.height(this._plotDimensions.height)}this.labelOptions.axis=this.name;this._label=new this.labelRenderer(this.labelOptions);if(this._label.show){var g=this._label.draw(b,j);g.appendTo(this._elem)}var f=this._ticks;for(var e=0;e');g.html(this.groupLabels[e]);this._groupLabels.push(g);g.appendTo(this._elem)}}return this._elem};a.jqplot.CategoryAxisRenderer.prototype.set=function(){var e=0;var m;var k=0;var f=0;var d=(this._label==null)?false:this._label.show;if(this.show){var n=this._ticks;for(var c=0;ce){e=m}}}var j=0;for(var c=0;cj){j=m}}if(d){k=this._label._elem.outerWidth(true);f=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){e+=j+f;this._elem.css({height:e+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){e+=j+f;this._elem.css({height:e+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){e+=j+k;this._elem.css({width:e+"px",left:"0px",top:"0px"});if(d&&this._label.constructor==a.jqplot.AxisLabelRenderer){this._label._elem.css("width",k+"px")}}else{e+=j+k;this._elem.css({width:e+"px",right:"0px",top:"0px"});if(d&&this._label.constructor==a.jqplot.AxisLabelRenderer){this._label._elem.css("width",k+"px")}}}}}};a.jqplot.CategoryAxisRenderer.prototype.pack=function(e,c){var C=this._ticks;var v=this.max;var s=this.min;var n=c.max;var l=c.min;var q=(this._label==null)?false:this._label.show;var x;for(var r in e){this._elem.css(r,e[r])}this._offsets=c;var g=n-l;var k=v-s;this.p2u=function(h){return(h-l)*k/g+s};this.u2p=function(h){return(h-s)*g/k+l};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(h){return(h-s)*g/k};this.series_p2u=function(h){return h*k/g+s}}else{this.series_u2p=function(h){return(h-v)*g/k};this.series_p2u=function(h){return h*k/g+v}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(x=0;x0){b=-o._textRenderer.height*Math.cos(-o._textRenderer.angle)/2}else{b=-o.getHeight()+o._textRenderer.height*Math.cos(o._textRenderer.angle)/2}break;case"middle":b=-o.getHeight()/2;break;default:b=-o.getHeight()/2;break}}else{b=-o.getHeight()/2}var D=this.u2p(o.value)+b+"px";o._elem.css("top",D);o.pack()}}var z=["left",0];if(q){var y=this._label._elem.outerHeight(true);this._label._elem.css("top",n-g/2-y/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px");z=["left",this._label._elem.outerWidth(true)]}else{this._label._elem.css("right","0px");z=["right",this._label._elem.outerWidth(true)]}this._label.pack()}var d=parseInt(this._ticks.length/this.groups,10);for(x=0;x plot = $.jqplot('mychart', [data], { dataRenderer: $.jqplot.ciParser, ... });
- *
- * Where data is an object in JSON format or a JSON encoded string conforming to the
- * City Index API spec.
- *
- * Note that calling the renderer function is handled internally by jqPlot. The
- * user does not have to call the function. The parameters described below will
- * automatically be passed to the ciParser function.
- *
- * Parameters:
- * data - JSON encoded string or object.
- * plot - reference to jqPlot Plot object.
- *
- * Returns:
- * data array in jqPlot format.
- *
- */
- $.jqplot.ciParser = function (data, plot) {
- var ret = [],
- line,
- temp,
- i, j, k, kk;
-
- if (typeof(data) == "string") {
- data = $.jqplot.JSON.parse(data, handleStrings);
- }
-
- else if (typeof(data) == "object") {
- for (k in data) {
- for (i=0; i= 0) {
- //here we will try to extract the ticks from the Date string in the "value" fields of JSON returned data
- a = /^\/Date\((-?[0-9]+)\)\/$/.exec(value);
- if (a) {
- return parseInt(a[1], 10);
- }
- }
- return value;
- }
- }
-
- for (var prop in data) {
- line = [];
- temp = data[prop];
- switch (prop) {
- case "PriceTicks":
- for (i=0; i=0){i=/^\/Date\((-?[0-9]+)\)\/$/.exec(k);if(i){return parseInt(i[1],10)}}return k}}for(var b in g){o=[];n=g[b];switch(b){case"PriceTicks":for(h=0;h= 1 or will often miss point intersections.
- this.intersectionThreshold = 2;
- // prop: showCursorLegend
- // Replace the plot legend with an enhanced legend displaying intersection information.
- this.showCursorLegend = false;
- // prop: cursorLegendFormatString
- // Format string used in the cursor legend. If showTooltipDataPosition is true,
- // this will also be the default format string used by tooltipFormatString.
- this.cursorLegendFormatString = $.jqplot.Cursor.cursorLegendFormatString;
- // whether the cursor is over the grid or not.
- this._oldHandlers = {onselectstart: null, ondrag: null, onmousedown: null};
- // prop: constrainOutsideZoom
- // True to limit actual zoom area to edges of grid, even when zooming
- // outside of plot area. That is, can't zoom out by mousing outside plot.
- this.constrainOutsideZoom = true;
- // prop: showTooltipOutsideZoom
- // True will keep updating the tooltip when zooming of the grid.
- this.showTooltipOutsideZoom = false;
- // true if mouse is over grid, false if not.
- this.onGrid = false;
- $.extend(true, this, options);
- };
-
- $.jqplot.Cursor.cursorLegendFormatString = '%s x:%s, y:%s';
-
- // called with scope of plot
- $.jqplot.Cursor.init = function (target, data, opts){
- // add a cursor attribute to the plot
- var options = opts || {};
- this.plugins.cursor = new $.jqplot.Cursor(options.cursor);
- var c = this.plugins.cursor;
-
- if (c.show) {
- $.jqplot.eventListenerHooks.push(['jqplotMouseEnter', handleMouseEnter]);
- $.jqplot.eventListenerHooks.push(['jqplotMouseLeave', handleMouseLeave]);
- $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMouseMove]);
-
- if (c.showCursorLegend) {
- opts.legend = opts.legend || {};
- opts.legend.renderer = $.jqplot.CursorLegendRenderer;
- opts.legend.formatString = this.plugins.cursor.cursorLegendFormatString;
- opts.legend.show = true;
- }
-
- if (c.zoom) {
- $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleMouseDown]);
-
- if (c.clickReset) {
- $.jqplot.eventListenerHooks.push(['jqplotClick', handleClick]);
- }
-
- if (c.dblClickReset) {
- $.jqplot.eventListenerHooks.push(['jqplotDblClick', handleDblClick]);
- }
- }
-
- this.resetZoom = function() {
- var axes = this.axes;
- if (!c.zoomProxy) {
- for (var ax in axes) {
- axes[ax].reset();
- axes[ax]._ticks = [];
- // fake out tick creation algorithm to make sure original auto
- // computed format string is used if _overrideFormatString is true
- axes[ax]._autoFormatString = c._zoom.axes[ax].tickFormatString;
- }
- this.redraw();
- }
- else {
- var ctx = this.plugins.cursor.zoomCanvas._ctx;
- ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
- ctx = null;
- }
- this.plugins.cursor._zoom.isZoomed = false;
- this.target.trigger('jqplotResetZoom', [this, this.plugins.cursor]);
- };
-
-
- if (c.showTooltipDataPosition) {
- c.showTooltipUnitPosition = false;
- c.showTooltipGridPosition = false;
- if (options.cursor.tooltipFormatString == undefined) {
- c.tooltipFormatString = $.jqplot.Cursor.cursorLegendFormatString;
- }
- }
- }
- };
-
- // called with context of plot
- $.jqplot.Cursor.postDraw = function() {
- var c = this.plugins.cursor;
-
- // Memory Leaks patch
- if (c.zoomCanvas) {
- c.zoomCanvas.resetCanvas();
- c.zoomCanvas = null;
- }
-
- if (c.cursorCanvas) {
- c.cursorCanvas.resetCanvas();
- c.cursorCanvas = null;
- }
-
- if (c._tooltipElem) {
- c._tooltipElem.emptyForce();
- c._tooltipElem = null;
- }
-
-
- if (c.zoom) {
- c.zoomCanvas = new $.jqplot.GenericCanvas();
- this.eventCanvas._elem.before(c.zoomCanvas.createElement(this._gridPadding, 'jqplot-zoom-canvas', this._plotDimensions, this));
- c.zoomCanvas.setContext();
- }
-
- var elem = document.createElement('div');
- c._tooltipElem = $(elem);
- elem = null;
- c._tooltipElem.addClass('jqplot-cursor-tooltip');
- c._tooltipElem.css({position:'absolute', display:'none'});
-
-
- if (c.zoomCanvas) {
- c.zoomCanvas._elem.before(c._tooltipElem);
- }
-
- else {
- this.eventCanvas._elem.before(c._tooltipElem);
- }
-
- if (c.showVerticalLine || c.showHorizontalLine) {
- c.cursorCanvas = new $.jqplot.GenericCanvas();
- this.eventCanvas._elem.before(c.cursorCanvas.createElement(this._gridPadding, 'jqplot-cursor-canvas', this._plotDimensions, this));
- c.cursorCanvas.setContext();
- }
-
- // if we are showing the positions in unit coordinates, and no axes groups
- // were specified, create a default set.
- if (c.showTooltipUnitPosition){
- if (c.tooltipAxisGroups.length === 0) {
- var series = this.series;
- var s;
- var temp = [];
- for (var i=0; i 6 && Math.abs(gridpos.y - c._zoom.start[1]) > 6) || (c.constrainZoomTo == 'x' && Math.abs(gridpos.x - c._zoom.start[0]) > 6) || (c.constrainZoomTo == 'y' && Math.abs(gridpos.y - c._zoom.start[1]) > 6)) {
- if (!plot.plugins.cursor.zoomProxy) {
- for (var ax in datapos) {
- // make a copy of the original axes to revert back.
- if (c._zoom.axes[ax] == undefined) {
- c._zoom.axes[ax] = {};
- c._zoom.axes[ax].numberTicks = axes[ax].numberTicks;
- c._zoom.axes[ax].tickInterval = axes[ax].tickInterval;
- // for date axes...
- c._zoom.axes[ax].daTickInterval = axes[ax].daTickInterval;
- c._zoom.axes[ax].min = axes[ax].min;
- c._zoom.axes[ax].max = axes[ax].max;
- c._zoom.axes[ax].tickFormatString = (axes[ax].tickOptions != null) ? axes[ax].tickOptions.formatString : '';
- }
-
-
- if ((c.constrainZoomTo == 'none') || (c.constrainZoomTo == 'x' && ax.charAt(0) == 'x') || (c.constrainZoomTo == 'y' && ax.charAt(0) == 'y')) {
- dp = datapos[ax];
- if (dp != null) {
- var newmin, newmax;
- if (dp > start[ax]) {
- newmin = start[ax];
- newmax = dp;
- }
- else {
- span = start[ax] - dp;
- newmin = dp;
- newmax = start[ax];
- }
-
- if (this.looseZoom && (axes[ax].renderer.constructor === $.jqplot.LinearAxisRenderer || axes[ax].renderer.constructor === $.jqplot.DateAxisRenderer)) {
- var ret = $.jqplot.LinearTickGenerator(newmin, newmax);
- axes[ax].min = ret[0];
- axes[ax].max = ret[1];
- axes[ax]._autoFormatString = ret[3];
- axes[ax].numberTicks = ret[2];
- axes[ax].tickInterval = ret[4];
- // for date axes...
- axes[ax].daTickInterval = [ret[4]/1000, 'seconds'];
- }
- else {
- axes[ax].min = newmin;
- axes[ax].max = newmax;
- axes[ax].tickInterval = null;
- // for date axes...
- axes[ax].daTickInterval = null;
- }
-
- axes[ax]._ticks = [];
- }
- }
-
- // if ((c.constrainZoomTo == 'x' && ax.charAt(0) == 'y' && c.autoscaleConstraint) || (c.constrainZoomTo == 'y' && ax.charAt(0) == 'x' && c.autoscaleConstraint)) {
- // dp = datapos[ax];
- // if (dp != null) {
- // axes[ax].max == null;
- // axes[ax].min = null;
- // }
- // }
- }
- ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
- plot.redraw();
- c._zoom.isZoomed = true;
- ctx = null;
- }
- plot.target.trigger('jqplotZoom', [gridpos, datapos, plot, cursor]);
- }
- };
-
- $.jqplot.preInitHooks.push($.jqplot.Cursor.init);
- $.jqplot.postDrawHooks.push($.jqplot.Cursor.postDraw);
-
- function updateTooltip(gridpos, datapos, plot) {
- var c = plot.plugins.cursor;
- var s = '';
- var addbr = false;
- if (c.showTooltipGridPosition) {
- s = gridpos.x+', '+gridpos.y;
- addbr = true;
- }
- if (c.showTooltipUnitPosition) {
- var g;
- for (var i=0; i';
- }
- if (c.useAxesFormatters) {
- var xf = plot.axes[g[0]]._ticks[0].formatter;
- var yf = plot.axes[g[1]]._ticks[0].formatter;
- var xfstr = plot.axes[g[0]]._ticks[0].formatString;
- var yfstr = plot.axes[g[1]]._ticks[0].formatString;
- s += xf(xfstr, datapos[g[0]]) + ', '+ yf(yfstr, datapos[g[1]]);
- }
- else {
- s += $.jqplot.sprintf(c.tooltipFormatString, datapos[g[0]], datapos[g[1]]);
- }
- addbr = true;
- }
- }
-
- if (c.showTooltipDataPosition) {
- var series = plot.series;
- var ret = getIntersectingPoints(plot, gridpos.x, gridpos.y);
- var addbr = false;
-
- for (var i = 0; i< series.length; i++) {
- if (series[i].show) {
- var idx = series[i].index;
- var label = series[i].label.toString();
- var cellid = $.inArray(idx, ret.indices);
- var sx = undefined;
- var sy = undefined;
- if (cellid != -1) {
- var data = ret.data[cellid].data;
- if (c.useAxesFormatters) {
- var xf = series[i]._xaxis._ticks[0].formatter;
- var yf = series[i]._yaxis._ticks[0].formatter;
- var xfstr = series[i]._xaxis._ticks[0].formatString;
- var yfstr = series[i]._yaxis._ticks[0].formatString;
- sx = xf(xfstr, data[0]);
- sy = yf(yfstr, data[1]);
- }
- else {
- sx = data[0];
- sy = data[1];
- }
- if (addbr) {
- s += '
';
- }
- s += $.jqplot.sprintf(c.tooltipFormatString, label, sx, sy);
- addbr = true;
- }
- }
- }
-
- }
- c._tooltipElem.html(s);
- }
-
- function moveLine(gridpos, plot) {
- var c = plot.plugins.cursor;
- var ctx = c.cursorCanvas._ctx;
- ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
- if (c.showVerticalLine) {
- c.shapeRenderer.draw(ctx, [[gridpos.x, 0], [gridpos.x, ctx.canvas.height]]);
- }
- if (c.showHorizontalLine) {
- c.shapeRenderer.draw(ctx, [[0, gridpos.y], [ctx.canvas.width, gridpos.y]]);
- }
- var ret = getIntersectingPoints(plot, gridpos.x, gridpos.y);
- if (c.showCursorLegend) {
- var cells = $(plot.targetId + ' td.jqplot-cursor-legend-label');
- for (var i=0; i0; n--) {
- axis = an[n-1];
- if (ax[axis].show) {
- dataPos[axis] = ax[axis].series_p2u(gridPos[axis.charAt(0)]);
- }
- }
-
- return {offsets:go, gridPos:gridPos, dataPos:dataPos};
- }
-
- function handleZoomMove(ev) {
- var plot = ev.data.plot;
- var c = plot.plugins.cursor;
- // don't do anything if not on grid.
- if (c.show && c.zoom && c._zoom.started && !c.zoomTarget) {
- var ctx = c.zoomCanvas._ctx;
- var positions = getEventPosition(ev);
- var gridpos = positions.gridPos;
- var datapos = positions.dataPos;
- c._zoom.gridpos = gridpos;
- c._zoom.datapos = datapos;
- c._zoom.zooming = true;
- var xpos = gridpos.x;
- var ypos = gridpos.y;
- var height = ctx.canvas.height;
- var width = ctx.canvas.width;
- if (c.showTooltip && !c.onGrid && c.showTooltipOutsideZoom) {
- updateTooltip(gridpos, datapos, plot);
- if (c.followMouse) {
- moveTooltip(gridpos, plot);
- }
- }
- if (c.constrainZoomTo == 'x') {
- c._zoom.end = [xpos, height];
- }
- else if (c.constrainZoomTo == 'y') {
- c._zoom.end = [width, ypos];
- }
- else {
- c._zoom.end = [xpos, ypos];
- }
- var sel = window.getSelection;
- if (document.selection && document.selection.empty)
- {
- document.selection.empty();
- }
- else if (sel && !sel().isCollapsed) {
- sel().collapse();
- }
- drawZoomBox.call(c);
- ctx = null;
- }
- }
-
- function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {
- var c = plot.plugins.cursor;
- $(document).one('mouseup.jqplot_cursor', {plot:plot}, handleMouseUp);
- var axes = plot.axes;
- if (document.onselectstart != undefined) {
- c._oldHandlers.onselectstart = document.onselectstart;
- document.onselectstart = function () { return false; };
- }
- if (document.ondrag != undefined) {
- c._oldHandlers.ondrag = document.ondrag;
- document.ondrag = function () { return false; };
- }
- if (document.onmousedown != undefined) {
- c._oldHandlers.onmousedown = document.onmousedown;
- document.onmousedown = function () { return false; };
- }
- if (c.zoom) {
- if (!c.zoomProxy) {
- var ctx = c.zoomCanvas._ctx;
- ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
- ctx = null;
- }
- if (c.constrainZoomTo == 'x') {
- c._zoom.start = [gridpos.x, 0];
- }
- else if (c.constrainZoomTo == 'y') {
- c._zoom.start = [0, gridpos.y];
- }
- else {
- c._zoom.start = [gridpos.x, gridpos.y];
- }
- c._zoom.started = true;
- for (var ax in datapos) {
- // get zoom starting position.
- c._zoom.axes.start[ax] = datapos[ax];
- }
- $(document).bind('mousemove.jqplotCursor', {plot:plot}, handleZoomMove);
- }
- }
-
- function handleMouseUp(ev) {
- var plot = ev.data.plot;
- var c = plot.plugins.cursor;
- if (c.zoom && c._zoom.zooming && !c.zoomTarget) {
- var xpos = c._zoom.gridpos.x;
- var ypos = c._zoom.gridpos.y;
- var datapos = c._zoom.datapos;
- var height = c.zoomCanvas._ctx.canvas.height;
- var width = c.zoomCanvas._ctx.canvas.width;
- var axes = plot.axes;
-
- if (c.constrainOutsideZoom && !c.onGrid) {
- if (xpos < 0) { xpos = 0; }
- else if (xpos > width) { xpos = width; }
- if (ypos < 0) { ypos = 0; }
- else if (ypos > height) { ypos = height; }
-
- for (var axis in datapos) {
- if (datapos[axis]) {
- if (axis.charAt(0) == 'x') {
- datapos[axis] = axes[axis].series_p2u(xpos);
- }
- else {
- datapos[axis] = axes[axis].series_p2u(ypos);
- }
- }
- }
- }
-
- if (c.constrainZoomTo == 'x') {
- ypos = height;
- }
- else if (c.constrainZoomTo == 'y') {
- xpos = width;
- }
- c._zoom.end = [xpos, ypos];
- c._zoom.gridpos = {x:xpos, y:ypos};
-
- c.doZoom(c._zoom.gridpos, datapos, plot, c);
- }
- c._zoom.started = false;
- c._zoom.zooming = false;
-
- $(document).unbind('mousemove.jqplotCursor', handleZoomMove);
-
- if (document.onselectstart != undefined && c._oldHandlers.onselectstart != null){
- document.onselectstart = c._oldHandlers.onselectstart;
- c._oldHandlers.onselectstart = null;
- }
- if (document.ondrag != undefined && c._oldHandlers.ondrag != null){
- document.ondrag = c._oldHandlers.ondrag;
- c._oldHandlers.ondrag = null;
- }
- if (document.onmousedown != undefined && c._oldHandlers.onmousedown != null){
- document.onmousedown = c._oldHandlers.onmousedown;
- c._oldHandlers.onmousedown = null;
- }
-
- }
-
- function drawZoomBox() {
- var start = this._zoom.start;
- var end = this._zoom.end;
- var ctx = this.zoomCanvas._ctx;
- var l, t, h, w;
- if (end[0] > start[0]) {
- l = start[0];
- w = end[0] - start[0];
- }
- else {
- l = end[0];
- w = start[0] - end[0];
- }
- if (end[1] > start[1]) {
- t = start[1];
- h = end[1] - start[1];
- }
- else {
- t = end[1];
- h = start[1] - end[1];
- }
- ctx.fillStyle = 'rgba(0,0,0,0.2)';
- ctx.strokeStyle = '#999999';
- ctx.lineWidth = 1.0;
- ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
- ctx.fillRect(0,0,ctx.canvas.width, ctx.canvas.height);
- ctx.clearRect(l, t, w, h);
- // IE won't show transparent fill rect, so stroke a rect also.
- ctx.strokeRect(l,t,w,h);
- ctx = null;
- }
-
- $.jqplot.CursorLegendRenderer = function(options) {
- $.jqplot.TableLegendRenderer.call(this, options);
- this.formatString = '%s';
- };
-
- $.jqplot.CursorLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();
- $.jqplot.CursorLegendRenderer.prototype.constructor = $.jqplot.CursorLegendRenderer;
-
- // called in context of a Legend
- $.jqplot.CursorLegendRenderer.prototype.draw = function() {
- if (this._elem) {
- this._elem.emptyForce();
- this._elem = null;
- }
- if (this.show) {
- var series = this._series, s;
- // make a table. one line label per row.
- var elem = document.createElement('div');
- this._elem = $(elem);
- elem = null;
- this._elem.addClass('jqplot-legend jqplot-cursor-legend');
- this._elem.css('position', 'absolute');
-
- var pad = false;
- for (var i = 0; i< series.length; i++) {
- s = series[i];
- if (s.show && s.showLabel) {
- var lt = $.jqplot.sprintf(this.formatString, s.label.toString());
- if (lt) {
- var color = s.color;
- if (s._stack && !s.fill) {
- color = '';
- }
- addrow.call(this, lt, color, pad, i);
- pad = true;
- }
- // let plugins add more rows to legend. Used by trend line plugin.
- for (var j=0; j<$.jqplot.addLegendRowHooks.length; j++) {
- var item = $.jqplot.addLegendRowHooks[j].call(this, s);
- if (item) {
- addrow.call(this, item.label, item.color, pad);
- pad = true;
- }
- }
- }
- }
- series = s = null;
- delete series;
- delete s;
- }
-
- function addrow(label, color, pad, idx) {
- var rs = (pad) ? this.rowSpacing : '0';
- var tr = $('
').appendTo(this._elem);
- tr.data('seriesIndex', idx);
- $(''+
- ' | ').appendTo(tr);
- var td = $(' | ');
- td.appendTo(tr);
- td.data('seriesIndex', idx);
- if (this.escapeHtml) {
- td.text(label);
- }
- else {
- td.html(label);
- }
- tr = null;
- td = null;
- }
- return this._elem;
- };
-
-})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.cursor.min.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.cursor.min.js
deleted file mode 100644
index c79f72718e..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.cursor.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function(j){j.jqplot.Cursor=function(q){this.style="crosshair";this.previousCursor="auto";this.show=j.jqplot.config.enablePlugins;this.showTooltip=true;this.followMouse=false;this.tooltipLocation="se";this.tooltipOffset=6;this.showTooltipGridPosition=false;this.showTooltipUnitPosition=true;this.showTooltipDataPosition=false;this.tooltipFormatString="%.4P, %.4P";this.useAxesFormatters=true;this.tooltipAxisGroups=[];this.zoom=false;this.zoomProxy=false;this.zoomTarget=false;this.looseZoom=false;this.clickReset=false;this.dblClickReset=true;this.showVerticalLine=false;this.showHorizontalLine=false;this.constrainZoomTo="none";this.shapeRenderer=new j.jqplot.ShapeRenderer();this._zoom={start:[],end:[],started:false,zooming:false,isZoomed:false,axes:{start:{},end:{}},gridpos:{},datapos:{}};this._tooltipElem;this.zoomCanvas;this.cursorCanvas;this.intersectionThreshold=2;this.showCursorLegend=false;this.cursorLegendFormatString=j.jqplot.Cursor.cursorLegendFormatString;this._oldHandlers={onselectstart:null,ondrag:null,onmousedown:null};this.constrainOutsideZoom=true;this.showTooltipOutsideZoom=false;this.onGrid=false;j.extend(true,this,q)};j.jqplot.Cursor.cursorLegendFormatString="%s x:%s, y:%s";j.jqplot.Cursor.init=function(t,s,r){var q=r||{};this.plugins.cursor=new j.jqplot.Cursor(q.cursor);var u=this.plugins.cursor;if(u.show){j.jqplot.eventListenerHooks.push(["jqplotMouseEnter",b]);j.jqplot.eventListenerHooks.push(["jqplotMouseLeave",f]);j.jqplot.eventListenerHooks.push(["jqplotMouseMove",i]);if(u.showCursorLegend){r.legend=r.legend||{};r.legend.renderer=j.jqplot.CursorLegendRenderer;r.legend.formatString=this.plugins.cursor.cursorLegendFormatString;r.legend.show=true}if(u.zoom){j.jqplot.eventListenerHooks.push(["jqplotMouseDown",a]);if(u.clickReset){j.jqplot.eventListenerHooks.push(["jqplotClick",k])}if(u.dblClickReset){j.jqplot.eventListenerHooks.push(["jqplotDblClick",c])}}this.resetZoom=function(){var x=this.axes;if(!u.zoomProxy){for(var w in x){x[w].reset();x[w]._ticks=[];x[w]._autoFormatString=u._zoom.axes[w].tickFormatString}this.redraw()}else{var v=this.plugins.cursor.zoomCanvas._ctx;v.clearRect(0,0,v.canvas.width,v.canvas.height);v=null}this.plugins.cursor._zoom.isZoomed=false;this.target.trigger("jqplotResetZoom",[this,this.plugins.cursor])};if(u.showTooltipDataPosition){u.showTooltipUnitPosition=false;u.showTooltipGridPosition=false;if(q.cursor.tooltipFormatString==undefined){u.tooltipFormatString=j.jqplot.Cursor.cursorLegendFormatString}}}};j.jqplot.Cursor.postDraw=function(){var x=this.plugins.cursor;if(x.zoomCanvas){x.zoomCanvas.resetCanvas();x.zoomCanvas=null}if(x.cursorCanvas){x.cursorCanvas.resetCanvas();x.cursorCanvas=null}if(x._tooltipElem){x._tooltipElem.emptyForce();x._tooltipElem=null}if(x.zoom){x.zoomCanvas=new j.jqplot.GenericCanvas();this.eventCanvas._elem.before(x.zoomCanvas.createElement(this._gridPadding,"jqplot-zoom-canvas",this._plotDimensions,this));x.zoomCanvas.setContext()}var v=document.createElement("div");x._tooltipElem=j(v);v=null;x._tooltipElem.addClass("jqplot-cursor-tooltip");x._tooltipElem.css({position:"absolute",display:"none"});if(x.zoomCanvas){x.zoomCanvas._elem.before(x._tooltipElem)}else{this.eventCanvas._elem.before(x._tooltipElem)}if(x.showVerticalLine||x.showHorizontalLine){x.cursorCanvas=new j.jqplot.GenericCanvas();this.eventCanvas._elem.before(x.cursorCanvas.createElement(this._gridPadding,"jqplot-cursor-canvas",this._plotDimensions,this));x.cursorCanvas.setContext()}if(x.showTooltipUnitPosition){if(x.tooltipAxisGroups.length===0){var t=this.series;var u;var q=[];for(var r=0;r6&&Math.abs(F.y-G._zoom.start[1])>6)||(G.constrainZoomTo=="x"&&Math.abs(F.x-G._zoom.start[0])>6)||(G.constrainZoomTo=="y"&&Math.abs(F.y-G._zoom.start[1])>6)){if(!B.plugins.cursor.zoomProxy){for(var x in s){if(G._zoom.axes[x]==undefined){G._zoom.axes[x]={};G._zoom.axes[x].numberTicks=E[x].numberTicks;G._zoom.axes[x].tickInterval=E[x].tickInterval;G._zoom.axes[x].daTickInterval=E[x].daTickInterval;G._zoom.axes[x].min=E[x].min;G._zoom.axes[x].max=E[x].max;G._zoom.axes[x].tickFormatString=(E[x].tickOptions!=null)?E[x].tickOptions.formatString:""}if((G.constrainZoomTo=="none")||(G.constrainZoomTo=="x"&&x.charAt(0)=="x")||(G.constrainZoomTo=="y"&&x.charAt(0)=="y")){y=s[x];if(y!=null){var u,w;if(y>v[x]){u=v[x];w=y}else{C=v[x]-y;u=y;w=v[x]}if(this.looseZoom&&(E[x].renderer.constructor===j.jqplot.LinearAxisRenderer||E[x].renderer.constructor===j.jqplot.DateAxisRenderer)){var H=j.jqplot.LinearTickGenerator(u,w);E[x].min=H[0];E[x].max=H[1];E[x]._autoFormatString=H[3];E[x].numberTicks=H[2];E[x].tickInterval=H[4];E[x].daTickInterval=[H[4]/1000,"seconds"]}else{E[x].min=u;E[x].max=w;E[x].tickInterval=null;E[x].daTickInterval=null}E[x]._ticks=[]}}}z.clearRect(0,0,z.canvas.width,z.canvas.height);B.redraw();G._zoom.isZoomed=true;z=null}B.target.trigger("jqplotZoom",[F,s,B,t])}};j.jqplot.preInitHooks.push(j.jqplot.Cursor.init);j.jqplot.postDrawHooks.push(j.jqplot.Cursor.postDraw);function e(E,r,B){var G=B.plugins.cursor;var w="";var K=false;if(G.showTooltipGridPosition){w=E.x+", "+E.y;K=true}if(G.showTooltipUnitPosition){var D;for(var C=0;C"}if(G.useAxesFormatters){var A=B.axes[D[0]]._ticks[0].formatter;var q=B.axes[D[1]]._ticks[0].formatter;var H=B.axes[D[0]]._ticks[0].formatString;var v=B.axes[D[1]]._ticks[0].formatString;w+=A(H,r[D[0]])+", "+q(v,r[D[1]])}else{w+=j.jqplot.sprintf(G.tooltipFormatString,r[D[0]],r[D[1]])}K=true}}if(G.showTooltipDataPosition){var u=B.series;var J=d(B,E.x,E.y);var K=false;for(var C=0;C"}w+=j.jqplot.sprintf(G.tooltipFormatString,t,z,x);K=true}}}}G._tooltipElem.html(w)}function g(C,A){var E=A.plugins.cursor;var z=E.cursorCanvas._ctx;z.clearRect(0,0,z.canvas.width,z.canvas.height);if(E.showVerticalLine){E.shapeRenderer.draw(z,[[C.x,0],[C.x,z.canvas.height]])}if(E.showHorizontalLine){E.shapeRenderer.draw(z,[[0,C.y],[z.canvas.width,C.y]])}var G=d(A,C.x,C.y);if(E.showCursorLegend){var r=j(A.targetId+" td.jqplot-cursor-legend-label");for(var B=0;B0;r--){s=v[r-1];if(q[s].show){u[s]=q[s].series_p2u(w[s.charAt(0)])}}return{offsets:t,gridPos:w,dataPos:u}}function h(z){var x=z.data.plot;var y=x.plugins.cursor;if(y.show&&y.zoom&&y._zoom.started&&!y.zoomTarget){var B=y.zoomCanvas._ctx;var v=o(z);var w=v.gridPos;var t=v.dataPos;y._zoom.gridpos=w;y._zoom.datapos=t;y._zoom.zooming=true;var u=w.x;var s=w.y;var A=B.canvas.height;var q=B.canvas.width;if(y.showTooltip&&!y.onGrid&&y.showTooltipOutsideZoom){e(w,t,x);if(y.followMouse){n(w,x)}}if(y.constrainZoomTo=="x"){y._zoom.end=[u,A]}else{if(y.constrainZoomTo=="y"){y._zoom.end=[q,s]}else{y._zoom.end=[u,s]}}var r=window.getSelection;if(document.selection&&document.selection.empty){document.selection.empty()}else{if(r&&!r().isCollapsed){r().collapse()}}l.call(y);B=null}}function a(w,s,r,x,t){var v=t.plugins.cursor;j(document).one("mouseup.jqplot_cursor",{plot:t},p);var u=t.axes;if(document.onselectstart!=undefined){v._oldHandlers.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!=undefined){v._oldHandlers.ondrag=document.ondrag;document.ondrag=function(){return false}}if(document.onmousedown!=undefined){v._oldHandlers.onmousedown=document.onmousedown;document.onmousedown=function(){return false}}if(v.zoom){if(!v.zoomProxy){var y=v.zoomCanvas._ctx;y.clearRect(0,0,y.canvas.width,y.canvas.height);y=null}if(v.constrainZoomTo=="x"){v._zoom.start=[s.x,0]}else{if(v.constrainZoomTo=="y"){v._zoom.start=[0,s.y]}else{v._zoom.start=[s.x,s.y]}}v._zoom.started=true;for(var q in r){v._zoom.axes.start[q]=r[q]}j(document).bind("mousemove.jqplotCursor",{plot:t},h)}}function p(y){var v=y.data.plot;var x=v.plugins.cursor;if(x.zoom&&x._zoom.zooming&&!x.zoomTarget){var u=x._zoom.gridpos.x;var r=x._zoom.gridpos.y;var t=x._zoom.datapos;var z=x.zoomCanvas._ctx.canvas.height;var q=x.zoomCanvas._ctx.canvas.width;var w=v.axes;if(x.constrainOutsideZoom&&!x.onGrid){if(u<0){u=0}else{if(u>q){u=q}}if(r<0){r=0}else{if(r>z){r=z}}for(var s in t){if(t[s]){if(s.charAt(0)=="x"){t[s]=w[s].series_p2u(u)}else{t[s]=w[s].series_p2u(r)}}}}if(x.constrainZoomTo=="x"){r=z}else{if(x.constrainZoomTo=="y"){u=q}}x._zoom.end=[u,r];x._zoom.gridpos={x:u,y:r};x.doZoom(x._zoom.gridpos,t,v,x)}x._zoom.started=false;x._zoom.zooming=false;j(document).unbind("mousemove.jqplotCursor",h);if(document.onselectstart!=undefined&&x._oldHandlers.onselectstart!=null){document.onselectstart=x._oldHandlers.onselectstart;x._oldHandlers.onselectstart=null}if(document.ondrag!=undefined&&x._oldHandlers.ondrag!=null){document.ondrag=x._oldHandlers.ondrag;x._oldHandlers.ondrag=null}if(document.onmousedown!=undefined&&x._oldHandlers.onmousedown!=null){document.onmousedown=x._oldHandlers.onmousedown;x._oldHandlers.onmousedown=null}}function l(){var y=this._zoom.start;var u=this._zoom.end;var s=this.zoomCanvas._ctx;var r,v,x,q;if(u[0]>y[0]){r=y[0];q=u[0]-y[0]}else{r=u[0];q=y[0]-u[0]}if(u[1]>y[1]){v=y[1];x=u[1]-y[1]}else{v=u[1];x=y[1]-u[1]}s.fillStyle="rgba(0,0,0,0.2)";s.strokeStyle="#999999";s.lineWidth=1;s.clearRect(0,0,s.canvas.width,s.canvas.height);s.fillRect(0,0,s.canvas.width,s.canvas.height);s.clearRect(r,v,q,x);s.strokeRect(r,v,q,x);s=null}j.jqplot.CursorLegendRenderer=function(q){j.jqplot.TableLegendRenderer.call(this,q);this.formatString="%s"};j.jqplot.CursorLegendRenderer.prototype=new j.jqplot.TableLegendRenderer();j.jqplot.CursorLegendRenderer.prototype.constructor=j.jqplot.CursorLegendRenderer;j.jqplot.CursorLegendRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}if(this.show){var w=this._series,A;var r=document.createElement("div");this._elem=j(r);r=null;this._elem.addClass("jqplot-legend jqplot-cursor-legend");this._elem.css("position","absolute");var q=false;for(var x=0;x').appendTo(this._elem);E.data("seriesIndex",s);j(' | ').appendTo(E);var G=j(' | ');G.appendTo(E);G.data("seriesIndex",s);if(this.escapeHtml){G.text(D)}else{G.html(D)}E=null;G=null}return this._elem}})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.dateAxisRenderer.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.dateAxisRenderer.js
deleted file mode 100644
index 94a48c0d6e..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.dateAxisRenderer.js
+++ /dev/null
@@ -1,439 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function($) {
- /**
- * Class: $.jqplot.DateAxisRenderer
- * A plugin for a jqPlot to render an axis as a series of date values.
- * This renderer has no options beyond those supplied by the class.
- * It supplies it's own tick formatter, so the tickOptions.formatter option
- * should not be overridden.
- *
- * Thanks to Ken Synder for his enhanced Date instance methods which are
- * included with this code .
- *
- * To use this renderer, include the plugin in your source
- * >
- *
- * and supply the appropriate options to your plot
- *
- * > {axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}
- *
- * Dates can be passed into the axis in almost any recognizable value and
- * will be parsed. They will be rendered on the axis in the format
- * specified by tickOptions.formatString. e.g. tickOptions.formatString = '%Y-%m-%d'.
- *
- * Accecptable format codes
- * are:
- *
- * > Code Result Description
- * > == Years ==
- * > %Y 2008 Four-digit year
- * > %y 08 Two-digit year
- * > == Months ==
- * > %m 09 Two-digit month
- * > %#m 9 One or two-digit month
- * > %B September Full month name
- * > %b Sep Abbreviated month name
- * > == Days ==
- * > %d 05 Two-digit day of month
- * > %#d 5 One or two-digit day of month
- * > %e 5 One or two-digit day of month
- * > %A Sunday Full name of the day of the week
- * > %a Sun Abbreviated name of the day of the week
- * > %w 0 Number of the day of the week (0 = Sunday, 6 = Saturday)
- * > %o th The ordinal suffix string following the day of the month
- * > == Hours ==
- * > %H 23 Hours in 24-hour format (two digits)
- * > %#H 3 Hours in 24-hour integer format (one or two digits)
- * > %I 11 Hours in 12-hour format (two digits)
- * > %#I 3 Hours in 12-hour integer format (one or two digits)
- * > %p PM AM or PM
- * > == Minutes ==
- * > %M 09 Minutes (two digits)
- * > %#M 9 Minutes (one or two digits)
- * > == Seconds ==
- * > %S 02 Seconds (two digits)
- * > %#S 2 Seconds (one or two digits)
- * > %s 1206567625723 Unix timestamp (Seconds past 1970-01-01 00:00:00)
- * > == Milliseconds ==
- * > %N 008 Milliseconds (three digits)
- * > %#N 8 Milliseconds (one to three digits)
- * > == Timezone ==
- * > %O 360 difference in minutes between local time and GMT
- * > %Z Mountain Standard Time Name of timezone as reported by browser
- * > %G -06:00 Hours and minutes between GMT
- * > == Shortcuts ==
- * > %F 2008-03-26 %Y-%m-%d
- * > %T 05:06:30 %H:%M:%S
- * > %X 05:06:30 %H:%M:%S
- * > %x 03/26/08 %m/%d/%y
- * > %D 03/26/08 %m/%d/%y
- * > %#c Wed Mar 26 15:31:00 2008 %a %b %e %H:%M:%S %Y
- * > %v 3-Sep-2008 %e-%b-%Y
- * > %R 15:31 %H:%M
- * > %r 3:31:00 PM %I:%M:%S %p
- * > == Characters ==
- * > %n \n Newline
- * > %t \t Tab
- * > %% % Percent Symbol
- */
- $.jqplot.DateAxisRenderer = function() {
- $.jqplot.LinearAxisRenderer.call(this);
- this.date = new $.jsDate();
- };
-
- $.jqplot.DateAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
- $.jqplot.DateAxisRenderer.prototype.constructor = $.jqplot.DateAxisRenderer;
-
- $.jqplot.DateTickFormatter = function(format, val) {
- if (!format) {
- format = '%Y/%m/%d';
- }
- return $.jsDate.strftime(val, format);
- };
-
- $.jqplot.DateAxisRenderer.prototype.init = function(options){
- // prop: tickRenderer
- // A class of a rendering engine for creating the ticks labels displayed on the plot,
- // See <$.jqplot.AxisTickRenderer>.
- // this.tickRenderer = $.jqplot.AxisTickRenderer;
- // this.labelRenderer = $.jqplot.AxisLabelRenderer;
- this.tickOptions.formatter = $.jqplot.DateTickFormatter;
- this.daTickInterval = null;
- this._daTickInterval = null;
-
- $.extend(true, this, options);
-
- var db = this._dataBounds,
- stats,
- sum,
- s,
- d,
- pd,
- sd,
- intv;
-
- // Go through all the series attached to this axis and find
- // the min/max bounds for this axis.
- for (var i=0; i db.max) || db.max == null) {
- db.max = d[j][0];
- }
- if (j>0) {
- intv = Math.abs(d[j][0] - d[j-1][0]);
- stats.intervals.push(intv);
- if (stats.frequencies.hasOwnProperty(intv)) {
- stats.frequencies[intv] += 1;
- }
- else {
- stats.frequencies[intv] = 1;
- }
- }
- sum += intv;
-
- }
- else {
- d[j][1] = new $.jsDate(d[j][1]).getTime();
- pd[j][1] = new $.jsDate(d[j][1]).getTime();
- sd[j][1] = new $.jsDate(d[j][1]).getTime();
- if ((d[j][1] != null && d[j][1] < db.min) || db.min == null) {
- db.min = d[j][1];
- }
- if ((d[j][1] != null && d[j][1] > db.max) || db.max == null) {
- db.max = d[j][1];
- }
- if (j>0) {
- intv = Math.abs(d[j][1] - d[j-1][1]);
- stats.intervals.push(intv);
- if (stats.frequencies.hasOwnProperty(intv)) {
- stats.frequencies[intv] += 1;
- }
- else {
- stats.frequencies[intv] = 1;
- }
- }
- }
- sum += intv;
- }
-
- var tempf = 0,
- tempn=0;
- for (var n in stats.frequencies) {
- stats.sortedIntervals.push({interval:n, frequency:stats.frequencies[n]});
- }
- stats.sortedIntervals.sort(function(a, b){
- return b.frequency - a.frequency;
- });
-
- stats.min = $.jqplot.arrayMin(stats.intervals);
- stats.max = $.jqplot.arrayMax(stats.intervals);
- stats.mean = sum/d.length;
- this._intervalStats.push(stats);
- stats = sum = s = d = pd = sd = null;
- }
- db = null;
-
- };
-
- // called with scope of an axis
- $.jqplot.DateAxisRenderer.prototype.reset = function() {
- this.min = this._min;
- this.max = this._max;
- this.tickInterval = this._tickInterval;
- this.numberTicks = this._numberTicks;
- this.daTickInterval = this._daTickInterval;
- // this._ticks = this.__ticks;
- };
-
- $.jqplot.DateAxisRenderer.prototype.createTicks = function() {
- // we're are operating on an axis here
- var ticks = this._ticks;
- var userTicks = this.ticks;
- var name = this.name;
- // databounds were set on axis initialization.
- var db = this._dataBounds;
- var iv = this._intervalStats;
- var dim, interval;
- var min, max;
- var pos1, pos2;
- var tt, i;
-
- // if we already have ticks, use them.
- // ticks must be in order of increasing value.
-
- min = ((this.min != null) ? new $.jsDate(this.min).getTime() : db.min);
- max = ((this.max != null) ? new $.jsDate(this.max).getTime() : db.max);
-
- var range = max - min;
-
- if (userTicks.length) {
- // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed
- for (i=0; i= tumax) {
- tumin = min - range*(this.padMin - 1);
- tumax = max + range*(this.padMax - 1);
- ret = $.jqplot.LinearTickGenerator(tumin, tumax);
- }
-
- this.min = ret[0];
- this.max = ret[1];
- this.numberTicks = ret[2];
- this.tickInterval = ret[4];
- this.daTickInterval = [this.tickInterval/1000, 'seconds'];
-
- for (var i=0; i 200) {
- this.numberTicks = parseInt(3+(dim-200)/100, 10);
- }
- else {
- this.numberTicks = 2;
- }
- }
-
- if (this.daTickInterval == null) {
- this.daTickInterval = [range / (this.numberTicks-1)/1000, 'seconds'];
- }
- for (var i=0; iq.max)||q.max==null){q.max=l[e][0]}if(e>0){b=Math.abs(l[e][0]-l[e-1][0]);g.intervals.push(b);if(g.frequencies.hasOwnProperty(b)){g.frequencies[b]+=1}else{g.frequencies[b]=1}}k+=b}else{l[e][1]=new a.jsDate(l[e][1]).getTime();o[e][1]=new a.jsDate(l[e][1]).getTime();m[e][1]=new a.jsDate(l[e][1]).getTime();if((l[e][1]!=null&&l[e][1]q.max)||q.max==null){q.max=l[e][1]}if(e>0){b=Math.abs(l[e][1]-l[e-1][1]);g.intervals.push(b);if(g.frequencies.hasOwnProperty(b)){g.frequencies[b]+=1}else{g.frequencies[b]=1}}}k+=b}var p=0,h=0;for(var c in g.frequencies){g.sortedIntervals.push({interval:c,frequency:g.frequencies[c]})}g.sortedIntervals.sort(function(i,d){return d.frequency-i.frequency});g.min=a.jqplot.arrayMin(g.intervals);g.max=a.jqplot.arrayMax(g.intervals);g.mean=k/l.length;this._intervalStats.push(g);g=k=r=l=o=m=null}q=null};a.jqplot.DateAxisRenderer.prototype.reset=function(){this.min=this._min;this.max=this._max;this.tickInterval=this._tickInterval;this.numberTicks=this._numberTicks;this.daTickInterval=this._daTickInterval};a.jqplot.DateAxisRenderer.prototype.createTicks=function(){var z=this._ticks;var w=this.ticks;var B=this.name;var y=this._dataBounds;var e=this._intervalStats;var q,x;var o,s;var d,c;var b,u;o=((this.min!=null)?new a.jsDate(this.min).getTime():y.min);s=((this.max!=null)?new a.jsDate(this.max).getTime():y.max);var k=s-o;if(w.length){for(u=0;u=r){n=o-k*(this.padMin-1);r=s+k*(this.padMax-1);A=a.jqplot.LinearTickGenerator(n,r)}this.min=A[0];this.max=A[1];this.numberTicks=A[2];this.tickInterval=A[4];this.daTickInterval=[this.tickInterval/1000,"seconds"];for(var u=0;u200){this.numberTicks=parseInt(3+(q-200)/100,10)}else{this.numberTicks=2}}}if(this.daTickInterval==null){this.daTickInterval=[k/(this.numberTicks-1)/1000,"seconds"]}for(var u=0;u
- *
- * Properties described here are passed into the $.jqplot function
- * as options on the series renderer. For example:
- *
- * > plot2 = $.jqplot('chart2', [s1, s2], {
- * > seriesDefaults: {
- * > renderer:$.jqplot.DonutRenderer,
- * > rendererOptions:{
- * > sliceMargin: 2,
- * > innerDiameter: 110,
- * > startAngle: -90
- * > }
- * > }
- * > });
- *
- * A donut plot will trigger events on the plot target
- * according to user interaction. All events return the event object,
- * the series index, the point (slice) index, and the point data for
- * the appropriate slice.
- *
- * 'jqplotDataMouseOver' - triggered when user mouseing over a slice.
- * 'jqplotDataHighlight' - triggered the first time user mouses over a slice,
- * if highlighting is enabled.
- * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of
- * a highlighted slice.
- * 'jqplotDataClick' - triggered when the user clicks on a slice.
- * 'jqplotDataRightClick' - tiggered when the user right clicks on a slice if
- * the "captureRightClick" option is set to true on the plot.
- */
- $.jqplot.DonutRenderer = function(){
- $.jqplot.LineRenderer.call(this);
- };
-
- $.jqplot.DonutRenderer.prototype = new $.jqplot.LineRenderer();
- $.jqplot.DonutRenderer.prototype.constructor = $.jqplot.DonutRenderer;
-
- // called with scope of a series
- $.jqplot.DonutRenderer.prototype.init = function(options, plot) {
- // Group: Properties
- //
- // prop: diameter
- // Outer diameter of the donut, auto computed by default
- this.diameter = null;
- // prop: innerDiameter
- // Inner diameter of the donut, auto calculated by default.
- // If specified will override thickness value.
- this.innerDiameter = null;
- // prop: thickness
- // thickness of the donut, auto computed by default
- // Overridden by if innerDiameter is specified.
- this.thickness = null;
- // prop: padding
- // padding between the donut and plot edges, legend, etc.
- this.padding = 20;
- // prop: sliceMargin
- // angular spacing between donut slices in degrees.
- this.sliceMargin = 0;
- // prop: ringMargin
- // pixel distance between rings, or multiple series in a donut plot.
- // null will compute ringMargin based on sliceMargin.
- this.ringMargin = null;
- // prop: fill
- // true or false, wether to fil the slices.
- this.fill = true;
- // prop: shadowOffset
- // offset of the shadow from the slice and offset of
- // each succesive stroke of the shadow from the last.
- this.shadowOffset = 2;
- // prop: shadowAlpha
- // transparency of the shadow (0 = transparent, 1 = opaque)
- this.shadowAlpha = 0.07;
- // prop: shadowDepth
- // number of strokes to apply to the shadow,
- // each stroke offset shadowOffset from the last.
- this.shadowDepth = 5;
- // prop: highlightMouseOver
- // True to highlight slice when moused over.
- // This must be false to enable highlightMouseDown to highlight when clicking on a slice.
- this.highlightMouseOver = true;
- // prop: highlightMouseDown
- // True to highlight when a mouse button is pressed over a slice.
- // This will be disabled if highlightMouseOver is true.
- this.highlightMouseDown = false;
- // prop: highlightColors
- // an array of colors to use when highlighting a slice.
- this.highlightColors = [];
- // prop: dataLabels
- // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices.
- // Defaults to percentage of each pie slice.
- this.dataLabels = 'percent';
- // prop: showDataLabels
- // true to show data labels on slices.
- this.showDataLabels = false;
- // prop: dataLabelFormatString
- // Format string for data labels. If none, '%s' is used for "label" and for arrays, '%d' for value and '%d%%' for percentage.
- this.dataLabelFormatString = null;
- // prop: dataLabelThreshold
- // Threshhold in percentage (0 - 100) of pie area, below which no label will be displayed.
- // This applies to all label types, not just to percentage labels.
- this.dataLabelThreshold = 3;
- // prop: dataLabelPositionFactor
- // A Multiplier (0-1) of the pie radius which controls position of label on slice.
- // Increasing will slide label toward edge of pie, decreasing will slide label toward center of pie.
- this.dataLabelPositionFactor = 0.4;
- // prop: dataLabelNudge
- // Number of pixels to slide the label away from (+) or toward (-) the center of the pie.
- this.dataLabelNudge = 0;
- // prop: startAngle
- // Angle to start drawing donut in degrees.
- // According to orientation of canvas coordinate system:
- // 0 = on the positive x axis
- // -90 = on the positive y axis.
- // 90 = on the negaive y axis.
- // 180 or - 180 = on the negative x axis.
- this.startAngle = 0;
- this.tickRenderer = $.jqplot.DonutTickRenderer;
- // Used as check for conditions where donut shouldn't be drawn.
- this._drawData = true;
- this._type = 'donut';
-
- // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver
- if (options.highlightMouseDown && options.highlightMouseOver == null) {
- options.highlightMouseOver = false;
- }
-
- $.extend(true, this, options);
- if (this.diameter != null) {
- this.diameter = this.diameter - this.sliceMargin;
- }
- this._diameter = null;
- this._innerDiameter = null;
- this._radius = null;
- this._innerRadius = null;
- this._thickness = null;
- // references to the previous series in the plot to properly calculate diameters
- // and thicknesses of nested rings.
- this._previousSeries = [];
- this._numberSeries = 1;
- // array of [start,end] angles arrays, one for each slice. In radians.
- this._sliceAngles = [];
- // index of the currenty highlighted point, if any
- this._highlightedPoint = null;
-
- // set highlight colors if none provided
- if (this.highlightColors.length == 0) {
- for (var i=0; i 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);
- newrgb[j] = parseInt(newrgb[j], 10);
- }
- this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')');
- }
- }
-
- plot.postParseOptionsHooks.addOnce(postParseOptions);
- plot.postInitHooks.addOnce(postInit);
- plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);
- plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);
- plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);
- plot.eventListenerHooks.addOnce('jqplotClick', handleClick);
- plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);
- plot.postDrawHooks.addOnce(postPlotDraw);
-
-
- };
-
- $.jqplot.DonutRenderer.prototype.setGridData = function(plot) {
- // set gridData property. This will hold angle in radians of each data point.
- var stack = [];
- var td = [];
- var sa = this.startAngle/180*Math.PI;
- var tot = 0;
- // don't know if we have any valid data yet, so set plot to not draw.
- this._drawData = false;
- for (var i=0; i0) {
- stack[i] += stack[i-1];
- }
- tot += this.data[i][1];
- }
- var fact = Math.PI*2/stack[stack.length - 1];
-
- for (var i=0; i0) {
- stack[i] += stack[i-1];
- }
- tot += data[i][1];
- }
- var fact = Math.PI*2/stack[stack.length - 1];
-
- for (var i=0; i 6.282 + this.startAngle) {
- ang2 = 6.282 + this.startAngle;
- if (ang1 > ang2) {
- ang1 = 6.281 + this.startAngle;
- }
- }
- // Fix for IE, where it can't seem to handle 0 degree angles. Also avoids
- // ugly line on unfilled donuts.
- if (ang1 >= ang2) {
- return;
- }
- ctx.beginPath();
- ctx.fillStyle = color;
- ctx.strokeStyle = color;
- // ctx.lineWidth = lineWidth;
- ctx.arc(0, 0, r, ang1, ang2, false);
- ctx.lineTo(ri*Math.cos(ang2), ri*Math.sin(ang2));
- ctx.arc(0,0, ri, ang2, ang1, true);
- ctx.closePath();
- if (fill) {
- ctx.fill();
- }
- else {
- ctx.stroke();
- }
- }
-
- if (isShadow) {
- for (var i=0; i 1 && this.index > 0) ? this._previousSeries[0]._diameter : this._diameter;
- this._thickness = this.thickness || (od - this.innerDiameter - 2.0*ringmargin*this._numberSeries) / this._numberSeries/2.0;
- }
- else {
- this._thickness = this.thickness || mindim / 2 / (this._numberSeries + 1) * 0.85;
- }
-
- var r = this._radius = this._diameter/2;
- this._innerRadius = this._radius - this._thickness;
- var sa = this.startAngle / 180 * Math.PI;
- this._center = [(cw - trans * offx)/2 + trans * offx, (ch - trans*offy)/2 + trans * offy];
-
- if (this.shadow) {
- var shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')';
- for (var i=0; i= this.dataLabelThreshold) {
- var fstr, avgang = (ang1+ang2)/2, label;
-
- if (this.dataLabels == 'label') {
- fstr = this.dataLabelFormatString || '%s';
- label = $.jqplot.sprintf(fstr, gd[i][0]);
- }
- else if (this.dataLabels == 'value') {
- fstr = this.dataLabelFormatString || '%d';
- label = $.jqplot.sprintf(fstr, this.data[i][1]);
- }
- else if (this.dataLabels == 'percent') {
- fstr = this.dataLabelFormatString || '%d%%';
- label = $.jqplot.sprintf(fstr, gd[i][2]*100);
- }
- else if (this.dataLabels.constructor == Array) {
- fstr = this.dataLabelFormatString || '%s';
- label = $.jqplot.sprintf(fstr, this.dataLabels[i]);
- }
-
- var fact = this._innerRadius + this._thickness * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge;
-
- var x = this._center[0] + Math.cos(avgang) * fact + this.canvas._offsets.left;
- var y = this._center[1] + Math.sin(avgang) * fact + this.canvas._offsets.top;
-
- var labelelem = $('' + label + '').insertBefore(plot.eventCanvas._elem);
- x -= labelelem.width()/2;
- y -= labelelem.height()/2;
- x = Math.round(x);
- y = Math.round(y);
- labelelem.css({left: x, top: y});
- }
- }
-
- };
-
- $.jqplot.DonutAxisRenderer = function() {
- $.jqplot.LinearAxisRenderer.call(this);
- };
-
- $.jqplot.DonutAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
- $.jqplot.DonutAxisRenderer.prototype.constructor = $.jqplot.DonutAxisRenderer;
-
-
- // There are no traditional axes on a donut chart. We just need to provide
- // dummy objects with properties so the plot will render.
- // called with scope of axis object.
- $.jqplot.DonutAxisRenderer.prototype.init = function(options){
- //
- this.tickRenderer = $.jqplot.DonutTickRenderer;
- $.extend(true, this, options);
- // I don't think I'm going to need _dataBounds here.
- // have to go Axis scaling in a way to fit chart onto plot area
- // and provide u2p and p2u functionality for mouse cursor, etc.
- // for convienence set _dataBounds to 0 and 100 and
- // set min/max to 0 and 100.
- this._dataBounds = {min:0, max:100};
- this.min = 0;
- this.max = 100;
- this.showTicks = false;
- this.ticks = [];
- this.showMark = false;
- this.show = false;
- };
-
-
-
-
- $.jqplot.DonutLegendRenderer = function(){
- $.jqplot.TableLegendRenderer.call(this);
- };
-
- $.jqplot.DonutLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();
- $.jqplot.DonutLegendRenderer.prototype.constructor = $.jqplot.DonutLegendRenderer;
-
- /**
- * Class: $.jqplot.DonutLegendRenderer
- * Legend Renderer specific to donut plots. Set by default
- * when user creates a donut plot.
- */
- $.jqplot.DonutLegendRenderer.prototype.init = function(options) {
- // Group: Properties
- //
- // prop: numberRows
- // Maximum number of rows in the legend. 0 or null for unlimited.
- this.numberRows = null;
- // prop: numberColumns
- // Maximum number of columns in the legend. 0 or null for unlimited.
- this.numberColumns = null;
- $.extend(true, this, options);
- };
-
- // called with context of legend
- $.jqplot.DonutLegendRenderer.prototype.draw = function() {
- var legend = this;
- if (this.show) {
- var series = this._series;
- var ss = 'position:absolute;';
- ss += (this.background) ? 'background:'+this.background+';' : '';
- ss += (this.border) ? 'border:'+this.border+';' : '';
- ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';
- ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';
- ss += (this.textColor) ? 'color:'+this.textColor+';' : '';
- ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : '';
- ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : '';
- ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : '';
- ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : '';
- this._elem = $('');
- // Donut charts legends don't go by number of series, but by number of data points
- // in the series. Refactor things here for that.
-
- var pad = false,
- reverse = false,
- nr, nc;
- var s = series[0];
- var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors);
-
- if (s.show) {
- var pd = s.data;
- if (this.numberRows) {
- nr = this.numberRows;
- if (!this.numberColumns){
- nc = Math.ceil(pd.length/nr);
- }
- else{
- nc = this.numberColumns;
- }
- }
- else if (this.numberColumns) {
- nc = this.numberColumns;
- nr = Math.ceil(pd.length/this.numberColumns);
- }
- else {
- nr = pd.length;
- nc = 1;
- }
-
- var i, j, tr, td1, td2, lt, rs, color;
- var idx = 0;
-
- for (i=0; i').prependTo(this._elem);
- }
- else{
- tr = $('
').appendTo(this._elem);
- }
- for (j=0; j0){
- pad = true;
- }
- else{
- pad = false;
- }
- }
- else{
- if (i == nr -1){
- pad = false;
- }
- else{
- pad = true;
- }
- }
- rs = (pad) ? this.rowSpacing : '0';
-
- td1 = $(''+
- ' | ');
- td2 = $(' | ');
- if (this.escapeHtml){
- td2.text(lt);
- }
- else {
- td2.html(lt);
- }
- if (reverse) {
- td2.prependTo(tr);
- td1.prependTo(tr);
- }
- else {
- td1.appendTo(tr);
- td2.appendTo(tr);
- }
- pad = true;
- }
- idx++;
- }
- }
- }
- }
- return this._elem;
- };
-
- // $.jqplot.DonutLegendRenderer.prototype.pack = function(offsets) {
- // if (this.show) {
- // // fake a grid for positioning
- // var grid = {_top:offsets.top, _left:offsets.left, _right:offsets.right, _bottom:this._plotDimensions.height - offsets.bottom};
- // if (this.placement == 'insideGrid') {
- // switch (this.location) {
- // case 'nw':
- // var a = grid._left + this.xoffset;
- // var b = grid._top + this.yoffset;
- // this._elem.css('left', a);
- // this._elem.css('top', b);
- // break;
- // case 'n':
- // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- // var b = grid._top + this.yoffset;
- // this._elem.css('left', a);
- // this._elem.css('top', b);
- // break;
- // case 'ne':
- // var a = offsets.right + this.xoffset;
- // var b = grid._top + this.yoffset;
- // this._elem.css({right:a, top:b});
- // break;
- // case 'e':
- // var a = offsets.right + this.xoffset;
- // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- // this._elem.css({right:a, top:b});
- // break;
- // case 'se':
- // var a = offsets.right + this.xoffset;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({right:a, bottom:b});
- // break;
- // case 's':
- // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({left:a, bottom:b});
- // break;
- // case 'sw':
- // var a = grid._left + this.xoffset;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({left:a, bottom:b});
- // break;
- // case 'w':
- // var a = grid._left + this.xoffset;
- // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- // this._elem.css({left:a, top:b});
- // break;
- // default: // same as 'se'
- // var a = grid._right - this.xoffset;
- // var b = grid._bottom + this.yoffset;
- // this._elem.css({right:a, bottom:b});
- // break;
- // }
- //
- // }
- // else {
- // switch (this.location) {
- // case 'nw':
- // var a = this._plotDimensions.width - grid._left + this.xoffset;
- // var b = grid._top + this.yoffset;
- // this._elem.css('right', a);
- // this._elem.css('top', b);
- // break;
- // case 'n':
- // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- // var b = this._plotDimensions.height - grid._top + this.yoffset;
- // this._elem.css('left', a);
- // this._elem.css('bottom', b);
- // break;
- // case 'ne':
- // var a = this._plotDimensions.width - offsets.right + this.xoffset;
- // var b = grid._top + this.yoffset;
- // this._elem.css({left:a, top:b});
- // break;
- // case 'e':
- // var a = this._plotDimensions.width - offsets.right + this.xoffset;
- // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- // this._elem.css({left:a, top:b});
- // break;
- // case 'se':
- // var a = this._plotDimensions.width - offsets.right + this.xoffset;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({left:a, bottom:b});
- // break;
- // case 's':
- // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- // var b = this._plotDimensions.height - offsets.bottom + this.yoffset;
- // this._elem.css({left:a, top:b});
- // break;
- // case 'sw':
- // var a = this._plotDimensions.width - grid._left + this.xoffset;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({right:a, bottom:b});
- // break;
- // case 'w':
- // var a = this._plotDimensions.width - grid._left + this.xoffset;
- // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- // this._elem.css({right:a, top:b});
- // break;
- // default: // same as 'se'
- // var a = grid._right - this.xoffset;
- // var b = grid._bottom + this.yoffset;
- // this._elem.css({right:a, bottom:b});
- // break;
- // }
- // }
- // }
- // };
-
- // setup default renderers for axes and legend so user doesn't have to
- // called with scope of plot
- function preInit(target, data, options) {
- options = options || {};
- options.axesDefaults = options.axesDefaults || {};
- options.legend = options.legend || {};
- options.seriesDefaults = options.seriesDefaults || {};
- // only set these if there is a donut series
- var setopts = false;
- if (options.seriesDefaults.renderer == $.jqplot.DonutRenderer) {
- setopts = true;
- }
- else if (options.series) {
- for (var i=0; i < options.series.length; i++) {
- if (options.series[i].renderer == $.jqplot.DonutRenderer) {
- setopts = true;
- }
- }
- }
-
- if (setopts) {
- options.axesDefaults.renderer = $.jqplot.DonutAxisRenderer;
- options.legend.renderer = $.jqplot.DonutLegendRenderer;
- options.legend.preDraw = true;
- options.seriesDefaults.pointLabels = {show: false};
- }
- }
-
- // called with scope of plot.
- function postInit(target, data, options) {
- // if multiple series, add a reference to the previous one so that
- // donut rings can nest.
- for (var i=1; i570)?n[o]*0.8:n[o]+0.3*(255-n[o]);n[o]=parseInt(n[o],10)}this.highlightColors.push("rgb("+n[0]+","+n[1]+","+n[2]+")")}}t.postParseOptionsHooks.addOnce(l);t.postInitHooks.addOnce(g);t.eventListenerHooks.addOnce("jqplotMouseMove",b);t.eventListenerHooks.addOnce("jqplotMouseDown",a);t.eventListenerHooks.addOnce("jqplotMouseUp",j);t.eventListenerHooks.addOnce("jqplotClick",f);t.eventListenerHooks.addOnce("jqplotRightClick",m);t.postDrawHooks.addOnce(h)};e.jqplot.DonutRenderer.prototype.setGridData=function(s){var o=[];var t=[];var n=this.startAngle/180*Math.PI;var r=0;this._drawData=false;for(var q=0;q0){o[q]+=o[q-1]}r+=this.data[q][1]}var p=Math.PI*2/o[o.length-1];for(var q=0;q0){o[q]+=o[q-1]}r+=s[q][1]}var p=Math.PI*2/o[o.length-1];for(var q=0;q6.282+this.startAngle){t=6.282+this.startAngle;if(u>t){u=6.281+this.startAngle}}if(u>=t){return}x.beginPath();x.fillStyle=p;x.strokeStyle=p;x.arc(0,0,n,u,t,false);x.lineTo(v*Math.cos(t),v*Math.sin(t));x.arc(0,0,v,t,u,true);x.closePath();if(w){x.fill()}else{x.stroke()}}if(s){for(var q=0;q1&&this.index>0)?this._previousSeries[0]._diameter:this._diameter;this._thickness=this.thickness||(M-this.innerDiameter-2*X*this._numberSeries)/this._numberSeries/2}else{this._thickness=this.thickness||v/2/(this._numberSeries+1)*0.85}var K=this._radius=this._diameter/2;this._innerRadius=this._radius-this._thickness;var o=this.startAngle/180*Math.PI;this._center=[(s-u*q)/2+u*q,(H-u*p)/2+u*p];if(this.shadow){var L="rgba(0,0,0,"+this.shadowAlpha+")";for(var Q=0;Q=this.dataLabelThreshold){var S,U=(A+z)/2,C;if(this.dataLabels=="label"){S=this.dataLabelFormatString||"%s";C=e.jqplot.sprintf(S,V[Q][0])}else{if(this.dataLabels=="value"){S=this.dataLabelFormatString||"%d";C=e.jqplot.sprintf(S,this.data[Q][1])}else{if(this.dataLabels=="percent"){S=this.dataLabelFormatString||"%d%%";C=e.jqplot.sprintf(S,V[Q][2]*100)}else{if(this.dataLabels.constructor==Array){S=this.dataLabelFormatString||"%s";C=e.jqplot.sprintf(S,this.dataLabels[Q])}}}}var n=this._innerRadius+this._thickness*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var F=this._center[0]+Math.cos(U)*n+this.canvas._offsets.left;var E=this._center[1]+Math.sin(U)*n+this.canvas._offsets.top;var D=e(''+C+"").insertBefore(P.eventCanvas._elem);F-=D.width()/2;E-=D.height()/2;F=Math.round(F);E=Math.round(E);D.css({left:F,top:E})}}};e.jqplot.DonutAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.DonutAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.DonutAxisRenderer.prototype.constructor=e.jqplot.DonutAxisRenderer;e.jqplot.DonutAxisRenderer.prototype.init=function(n){this.tickRenderer=e.jqplot.DonutTickRenderer;e.extend(true,this,n);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.DonutLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.DonutLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.DonutLegendRenderer.prototype.constructor=e.jqplot.DonutLegendRenderer;e.jqplot.DonutLegendRenderer.prototype.init=function(n){this.numberRows=null;this.numberColumns=null;e.extend(true,this,n)};e.jqplot.DonutLegendRenderer.prototype.draw=function(){var q=this;if(this.show){var y=this._series;var B="position:absolute;";B+=(this.background)?"background:"+this.background+";":"";B+=(this.border)?"border:"+this.border+";":"";B+=(this.fontSize)?"font-size:"+this.fontSize+";":"";B+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";B+=(this.textColor)?"color:"+this.textColor+";":"";B+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";B+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";B+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";B+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=e('');var F=false,x=false,n,v;var z=y[0];var o=new e.jqplot.ColorGenerator(z.seriesColors);if(z.show){var G=z.data;if(this.numberRows){n=this.numberRows;if(!this.numberColumns){v=Math.ceil(G.length/n)}else{v=this.numberColumns}}else{if(this.numberColumns){v=this.numberColumns;n=Math.ceil(G.length/this.numberColumns)}else{n=G.length;v=1}}var E,D,p,t,r,u,w,C;var A=0;for(E=0;E').prependTo(this._elem)}else{p=e('
').appendTo(this._elem)}for(D=0;D0){F=true}else{F=false}}else{if(E==n-1){F=false}else{F=true}}w=(F)?this.rowSpacing:"0";t=e(' | ');r=e(' | ');if(this.escapeHtml){r.text(u)}else{r.html(u)}if(x){r.prependTo(p);t.prependTo(p)}else{t.appendTo(p);r.appendTo(p)}F=true}A++}}}}return this._elem};function c(r,q,o){o=o||{};o.axesDefaults=o.axesDefaults||{};o.legend=o.legend||{};o.seriesDefaults=o.seriesDefaults||{};var n=false;if(o.seriesDefaults.renderer==e.jqplot.DonutRenderer){n=true}else{if(o.series){for(var p=0;p= 0.6) ? rgba[3]*0.6 : rgba[3]*(2-rgba[3]);
- drag.color = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+alpha+')';
- }
- mr.color = drag.color;
- mr.init();
-
- var start = (neighbor.pointIndex > 0) ? neighbor.pointIndex - 1 : 0;
- var end = neighbor.pointIndex+2;
- drag._gridData = s.gridData.slice(start, end);
- }
-
- function handleMove(ev, gridpos, datapos, neighbor, plot) {
- if (plot.plugins.dragable.dragCanvas.isDragging) {
- var dc = plot.plugins.dragable.dragCanvas;
- var dp = dc._neighbor;
- var s = plot.series[dp.seriesIndex];
- var drag = s.plugins.dragable;
- var gd = s.gridData;
-
- // compute the new grid position with any constraints.
- var x = (drag.constrainTo == 'y') ? dp.gridData[0] : gridpos.x;
- var y = (drag.constrainTo == 'x') ? dp.gridData[1] : gridpos.y;
-
- // compute data values for any listeners.
- var xu = s._xaxis.series_p2u(x);
- var yu = s._yaxis.series_p2u(y);
-
- // clear the canvas then redraw effect at new position.
- var ctx = dc._ctx;
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
-
- // adjust our gridData for the new mouse position
- if (dp.pointIndex > 0) {
- drag._gridData[1] = [x, y];
- }
- else {
- drag._gridData[0] = [x, y];
- }
- plot.series[dp.seriesIndex].draw(dc._ctx, {gridData:drag._gridData, shadow:false, preventJqPlotSeriesDrawTrigger:true, color:drag.color, markerOptions:{color:drag.color, shadow:false}, trendline:{show:false}});
- plot.target.trigger('jqplotSeriesPointChange', [dp.seriesIndex, dp.pointIndex, [xu,yu], [x,y]]);
- }
- else if (neighbor != null) {
- var series = plot.series[neighbor.seriesIndex];
- if (series.isDragable) {
- var dc = plot.plugins.dragable.dragCanvas;
- if (!dc.isOver) {
- dc._cursors.push(ev.target.style.cursor);
- ev.target.style.cursor = "pointer";
- }
- dc.isOver = true;
- }
- }
- else if (neighbor == null) {
- var dc = plot.plugins.dragable.dragCanvas;
- if (dc.isOver) {
- ev.target.style.cursor = dc._cursors.pop();
- dc.isOver = false;
- }
- }
- }
-
- function handleDown(ev, gridpos, datapos, neighbor, plot) {
- var dc = plot.plugins.dragable.dragCanvas;
- dc._cursors.push(ev.target.style.cursor);
- if (neighbor != null) {
- var s = plot.series[neighbor.seriesIndex];
- var drag = s.plugins.dragable;
- if (s.isDragable && !dc.isDragging) {
- dc._neighbor = neighbor;
- dc.isDragging = true;
- initDragPoint(plot, neighbor);
- drag.markerRenderer.draw(s.gridData[neighbor.pointIndex][0], s.gridData[neighbor.pointIndex][1], dc._ctx);
- ev.target.style.cursor = "move";
- plot.target.trigger('jqplotDragStart', [neighbor.seriesIndex, neighbor.pointIndex, gridpos, datapos]);
- }
- }
- // Just in case of a hickup, we'll clear the drag canvas and reset.
- else {
- var ctx = dc._ctx;
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
- dc.isDragging = false;
- }
- }
-
- function handleUp(ev, gridpos, datapos, neighbor, plot) {
- if (plot.plugins.dragable.dragCanvas.isDragging) {
- var dc = plot.plugins.dragable.dragCanvas;
- // clear the canvas
- var ctx = dc._ctx;
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
- dc.isDragging = false;
- // redraw the series canvas at the new point.
- var dp = dc._neighbor;
- var s = plot.series[dp.seriesIndex];
- var drag = s.plugins.dragable;
- // compute the new grid position with any constraints.
- var x = (drag.constrainTo == 'y') ? dp.data[0] : datapos[s.xaxis];
- var y = (drag.constrainTo == 'x') ? dp.data[1] : datapos[s.yaxis];
- // var x = datapos[s.xaxis];
- // var y = datapos[s.yaxis];
- s.data[dp.pointIndex][0] = x;
- s.data[dp.pointIndex][1] = y;
- plot.drawSeries({preventJqPlotSeriesDrawTrigger:true}, dp.seriesIndex);
- dc._neighbor = null;
- ev.target.style.cursor = dc._cursors.pop();
- plot.target.trigger('jqplotDragStop', [gridpos, datapos]);
- }
- }
-})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.dragable.min.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.dragable.min.js
deleted file mode 100644
index 480d9a3379..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.dragable.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function(d){d.jqplot.Dragable=function(g){this.markerRenderer=new d.jqplot.MarkerRenderer({shadow:false});this.shapeRenderer=new d.jqplot.ShapeRenderer();this.isDragging=false;this.isOver=false;this._ctx;this._elem;this._point;this._gridData;this.color;this.constrainTo="none";d.extend(true,this,g)};function b(){d.jqplot.GenericCanvas.call(this);this.isDragging=false;this.isOver=false;this._neighbor;this._cursors=[]}b.prototype=new d.jqplot.GenericCanvas();b.prototype.constructor=b;d.jqplot.Dragable.parseOptions=function(i,h){var g=h||{};this.plugins.dragable=new d.jqplot.Dragable(g.dragable);this.isDragable=d.jqplot.config.enablePlugins};d.jqplot.Dragable.postPlotDraw=function(){if(this.plugins.dragable&&this.plugins.dragable.highlightCanvas){this.plugins.dragable.highlightCanvas.resetCanvas();this.plugins.dragable.highlightCanvas=null}this.plugins.dragable={previousCursor:"auto",isOver:false};this.plugins.dragable.dragCanvas=new b();this.eventCanvas._elem.before(this.plugins.dragable.dragCanvas.createElement(this._gridPadding,"jqplot-dragable-canvas",this._plotDimensions,this));var g=this.plugins.dragable.dragCanvas.setContext()};d.jqplot.preParseSeriesOptionsHooks.push(d.jqplot.Dragable.parseOptions);d.jqplot.postDrawHooks.push(d.jqplot.Dragable.postPlotDraw);d.jqplot.eventListenerHooks.push(["jqplotMouseMove",e]);d.jqplot.eventListenerHooks.push(["jqplotMouseDown",c]);d.jqplot.eventListenerHooks.push(["jqplotMouseUp",a]);function f(n,p){var q=n.series[p.seriesIndex];var m=q.plugins.dragable;var h=q.markerRenderer;var i=m.markerRenderer;i.style=h.style;i.lineWidth=h.lineWidth+2.5;i.size=h.size+5;if(!m.color){var l=d.jqplot.getColorComponents(h.color);var o=[l[0],l[1],l[2]];var k=(l[3]>=0.6)?l[3]*0.6:l[3]*(2-l[3]);m.color="rgba("+o[0]+","+o[1]+","+o[2]+","+k+")"}i.color=m.color;i.init();var g=(p.pointIndex>0)?p.pointIndex-1:0;var j=p.pointIndex+2;m._gridData=q.gridData.slice(g,j)}function e(o,l,h,t,m){if(m.plugins.dragable.dragCanvas.isDragging){var u=m.plugins.dragable.dragCanvas;var i=u._neighbor;var w=m.series[i.seriesIndex];var k=w.plugins.dragable;var r=w.gridData;var p=(k.constrainTo=="y")?i.gridData[0]:l.x;var n=(k.constrainTo=="x")?i.gridData[1]:l.y;var g=w._xaxis.series_p2u(p);var q=w._yaxis.series_p2u(n);var v=u._ctx;v.clearRect(0,0,v.canvas.width,v.canvas.height);if(i.pointIndex>0){k._gridData[1]=[p,n]}else{k._gridData[0]=[p,n]}m.series[i.seriesIndex].draw(u._ctx,{gridData:k._gridData,shadow:false,preventJqPlotSeriesDrawTrigger:true,color:k.color,markerOptions:{color:k.color,shadow:false},trendline:{show:false}});m.target.trigger("jqplotSeriesPointChange",[i.seriesIndex,i.pointIndex,[g,q],[p,n]])}else{if(t!=null){var j=m.series[t.seriesIndex];if(j.isDragable){var u=m.plugins.dragable.dragCanvas;if(!u.isOver){u._cursors.push(o.target.style.cursor);o.target.style.cursor="pointer"}u.isOver=true}}else{if(t==null){var u=m.plugins.dragable.dragCanvas;if(u.isOver){o.target.style.cursor=u._cursors.pop();u.isOver=false}}}}}function c(k,i,g,l,j){var m=j.plugins.dragable.dragCanvas;m._cursors.push(k.target.style.cursor);if(l!=null){var o=j.series[l.seriesIndex];var h=o.plugins.dragable;if(o.isDragable&&!m.isDragging){m._neighbor=l;m.isDragging=true;f(j,l);h.markerRenderer.draw(o.gridData[l.pointIndex][0],o.gridData[l.pointIndex][1],m._ctx);k.target.style.cursor="move";j.target.trigger("jqplotDragStart",[l.seriesIndex,l.pointIndex,i,g])}}else{var n=m._ctx;n.clearRect(0,0,n.canvas.width,n.canvas.height);m.isDragging=false}}function a(m,j,g,o,k){if(k.plugins.dragable.dragCanvas.isDragging){var p=k.plugins.dragable.dragCanvas;var q=p._ctx;q.clearRect(0,0,q.canvas.width,q.canvas.height);p.isDragging=false;var h=p._neighbor;var r=k.series[h.seriesIndex];var i=r.plugins.dragable;var n=(i.constrainTo=="y")?h.data[0]:g[r.xaxis];var l=(i.constrainTo=="x")?h.data[1]:g[r.yaxis];r.data[h.pointIndex][0]=n;r.data[h.pointIndex][1]=l;k.drawSeries({preventJqPlotSeriesDrawTrigger:true},h.seriesIndex);p._neighbor=null;m.target.style.cursor=p._cursors.pop();k.target.trigger("jqplotDragStop",[j,g])}}})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.enhancedLegendRenderer.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.enhancedLegendRenderer.js
deleted file mode 100644
index fc06d2078b..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.enhancedLegendRenderer.js
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function($) {
- // class $.jqplot.EnhancedLegendRenderer
- // Legend renderer which can specify the number of rows and/or columns in the legend.
- $.jqplot.EnhancedLegendRenderer = function(){
- $.jqplot.TableLegendRenderer.call(this);
- };
-
- $.jqplot.EnhancedLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();
- $.jqplot.EnhancedLegendRenderer.prototype.constructor = $.jqplot.EnhancedLegendRenderer;
-
- // called with scope of legend.
- $.jqplot.EnhancedLegendRenderer.prototype.init = function(options) {
- // prop: numberRows
- // Maximum number of rows in the legend. 0 or null for unlimited.
- this.numberRows = null;
- // prop: numberColumns
- // Maximum number of columns in the legend. 0 or null for unlimited.
- this.numberColumns = null;
- // prop: seriesToggle
- // false to not enable series on/off toggling on the legend.
- // true or a fadein/fadeout speed (number of milliseconds or 'fast', 'normal', 'slow')
- // to enable show/hide of series on click of legend item.
- this.seriesToggle = 'normal';
- // prop: disableIEFading
- // true to toggle series with a show/hide method only and not allow fading in/out.
- // This is to overcome poor performance of fade in some versions of IE.
- this.disableIEFading = true;
- $.extend(true, this, options);
-
- if (this.seriesToggle) {
- $.jqplot.postDrawHooks.push(postDraw);
- }
- };
-
- // called with scope of legend
- $.jqplot.EnhancedLegendRenderer.prototype.draw = function() {
- var legend = this;
- if (this.show) {
- var series = this._series;
- var s;
- var ss = 'position:absolute;';
- ss += (this.background) ? 'background:'+this.background+';' : '';
- ss += (this.border) ? 'border:'+this.border+';' : '';
- ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';
- ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';
- ss += (this.textColor) ? 'color:'+this.textColor+';' : '';
- ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : '';
- ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : '';
- ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : '';
- ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : '';
- this._elem = $('');
- if (this.seriesToggle) {
- this._elem.css('z-index', '3');
- }
-
- var pad = false,
- reverse = false,
- nr, nc;
- if (this.numberRows) {
- nr = this.numberRows;
- if (!this.numberColumns){
- nc = Math.ceil(series.length/nr);
- }
- else{
- nc = this.numberColumns;
- }
- }
- else if (this.numberColumns) {
- nc = this.numberColumns;
- nr = Math.ceil(series.length/this.numberColumns);
- }
- else {
- nr = series.length;
- nc = 1;
- }
-
- var i, j, tr, td1, td2, lt, rs;
- var idx = 0;
- // check to see if we need to reverse
- for (i=series.length-1; i>=0; i--) {
- if (series[i]._stack || series[i].renderer.constructor == $.jqplot.BezierCurveRenderer){
- reverse = true;
- }
- }
-
- for (i=0; i').prependTo(this._elem);
- }
- else{
- tr = $('
').appendTo(this._elem);
- }
- for (j=0; j0){
- pad = true;
- }
- else{
- pad = false;
- }
- }
- else{
- if (i == nr -1){
- pad = false;
- }
- else{
- pad = true;
- }
- }
- rs = (pad) ? this.rowSpacing : '0';
-
- td1 = $(''+
- ' | ');
- td2 = $(' | ');
- if (this.escapeHtml){
- td2.text(lt);
- }
- else {
- td2.html(lt);
- }
- if (reverse) {
- if (this.showLabels) {td2.prependTo(tr);}
- if (this.showSwatches) {td1.prependTo(tr);}
- }
- else {
- if (this.showSwatches) {td1.appendTo(tr);}
- if (this.showLabels) {td2.appendTo(tr);}
- }
-
- if (this.seriesToggle) {
- var speed;
- if (typeof(this.seriesToggle) == 'string' || typeof(this.seriesToggle) == 'number') {
- if (!$.jqplot.use_excanvas || !this.disableIEFading) {
- speed = this.seriesToggle;
- }
- }
- if (this.showSwatches) {
- td1.bind('click', {series:s, speed:speed}, s.toggleDisplay);
- td1.addClass('jqplot-seriesToggle');
- }
- if (this.showLabels) {
- td2.bind('click', {series:s, speed:speed}, s.toggleDisplay);
- td2.addClass('jqplot-seriesToggle');
- }
- }
-
- pad = true;
- }
- }
- idx++;
- }
- }
- }
- return this._elem;
- };
-
- // called with scope of plot.
- var postDraw = function () {
- if (this.legend.renderer.constructor == $.jqplot.EnhancedLegendRenderer && this.legend.seriesToggle){
- var e = this.legend._elem.detach();
- this.eventCanvas._elem.after(e);
- }
- };
-})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.enhancedLegendRenderer.min.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.enhancedLegendRenderer.min.js
deleted file mode 100644
index 90d3376688..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.enhancedLegendRenderer.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function(b){b.jqplot.EnhancedLegendRenderer=function(){b.jqplot.TableLegendRenderer.call(this)};b.jqplot.EnhancedLegendRenderer.prototype=new b.jqplot.TableLegendRenderer();b.jqplot.EnhancedLegendRenderer.prototype.constructor=b.jqplot.EnhancedLegendRenderer;b.jqplot.EnhancedLegendRenderer.prototype.init=function(c){this.numberRows=null;this.numberColumns=null;this.seriesToggle="normal";this.disableIEFading=true;b.extend(true,this,c);if(this.seriesToggle){b.jqplot.postDrawHooks.push(a)}};b.jqplot.EnhancedLegendRenderer.prototype.draw=function(){var e=this;if(this.show){var n=this._series;var o;var q="position:absolute;";q+=(this.background)?"background:"+this.background+";":"";q+=(this.border)?"border:"+this.border+";":"";q+=(this.fontSize)?"font-size:"+this.fontSize+";":"";q+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";q+=(this.textColor)?"color:"+this.textColor+";":"";q+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";q+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";q+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";q+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=b('');if(this.seriesToggle){this._elem.css("z-index","3")}var w=false,m=false,c,k;if(this.numberRows){c=this.numberRows;if(!this.numberColumns){k=Math.ceil(n.length/c)}else{k=this.numberColumns}}else{if(this.numberColumns){k=this.numberColumns;c=Math.ceil(n.length/this.numberColumns)}else{c=n.length;k=1}}var v,t,d,g,f,h,l;var p=0;for(v=n.length-1;v>=0;v--){if(n[v]._stack||n[v].renderer.constructor==b.jqplot.BezierCurveRenderer){m=true}}for(v=0;v').prependTo(this._elem)}else{d=b('
').appendTo(this._elem)}for(t=0;t0){w=true}else{w=false}}else{if(v==c-1){w=false}else{w=true}}l=(w)?this.rowSpacing:"0";g=b(' | ');f=b(' | ');if(this.escapeHtml){f.text(h)}else{f.html(h)}if(m){if(this.showLabels){f.prependTo(d)}if(this.showSwatches){g.prependTo(d)}}else{if(this.showSwatches){g.appendTo(d)}if(this.showLabels){f.appendTo(d)}}if(this.seriesToggle){var u;if(typeof(this.seriesToggle)=="string"||typeof(this.seriesToggle)=="number"){if(!b.jqplot.use_excanvas||!this.disableIEFading){u=this.seriesToggle}}if(this.showSwatches){g.bind("click",{series:o,speed:u},o.toggleDisplay);g.addClass("jqplot-seriesToggle")}if(this.showLabels){f.bind("click",{series:o,speed:u},o.toggleDisplay);f.addClass("jqplot-seriesToggle")}}w=true}}p++}}}return this._elem};var a=function(){if(this.legend.renderer.constructor==b.jqplot.EnhancedLegendRenderer&&this.legend.seriesToggle){var c=this.legend._elem.detach();this.eventCanvas._elem.after(c)}}})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.funnelRenderer.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.funnelRenderer.js
deleted file mode 100644
index e1cefd96cb..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.funnelRenderer.js
+++ /dev/null
@@ -1,938 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function($) {
- /**
- * Class: $.jqplot.FunnelRenderer
- * Plugin renderer to draw a funnel chart.
- * x values, if present, will be used as labels.
- * y values give area size.
- *
- * Funnel charts will draw a single series
- * only.
- *
- * To use this renderer, you need to include the
- * funnel renderer plugin, for example:
- *
- * >
- *
- * Properties described here are passed into the $.jqplot function
- * as options on the series renderer. For example:
- *
- * > plot2 = $.jqplot('chart2', [s1, s2], {
- * > seriesDefaults: {
- * > renderer:$.jqplot.FunnelRenderer,
- * > rendererOptions:{
- * > sectionMargin: 12,
- * > widthRatio: 0.3
- * > }
- * > }
- * > });
- *
- * IMPORTANT
- *
- * *The funnel renderer will reorder data in descending order* so the largest value in
- * the data set is first and displayed on top of the funnel. Data will then
- * be displayed in descending order down the funnel. The area of each funnel
- * section will correspond to the value of each data point relative to the sum
- * of all values. That is section area is proportional to section value divided by
- * sum of all section values.
- *
- * If your data is not in descending order when passed into the plot, *it will be
- * reordered* when stored in the series.data property. A copy of the unordered
- * data is kept in the series._unorderedData property.
- *
- * A funnel plot will trigger events on the plot target
- * according to user interaction. All events return the event object,
- * the series index, the point (section) index, and the point data for
- * the appropriate section. *Note* the point index will referr to the ordered
- * data, not the original unordered data.
- *
- * 'jqplotDataMouseOver' - triggered when mousing over a section.
- * 'jqplotDataHighlight' - triggered the first time user mouses over a section,
- * if highlighting is enabled.
- * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of
- * a highlighted section.
- * 'jqplotDataClick' - triggered when the user clicks on a section.
- * 'jqplotDataRightClick' - tiggered when the user right clicks on a section if
- * the "captureRightClick" option is set to true on the plot.
- */
- $.jqplot.FunnelRenderer = function(){
- $.jqplot.LineRenderer.call(this);
- };
-
- $.jqplot.FunnelRenderer.prototype = new $.jqplot.LineRenderer();
- $.jqplot.FunnelRenderer.prototype.constructor = $.jqplot.FunnelRenderer;
-
- // called with scope of a series
- $.jqplot.FunnelRenderer.prototype.init = function(options, plot) {
- // Group: Properties
- //
- // prop: padding
- // padding between the funnel and plot edges, legend, etc.
- this.padding = {top: 20, right: 20, bottom: 20, left: 20};
- // prop: sectionMargin
- // spacing between funnel sections in pixels.
- this.sectionMargin = 6;
- // prop: fill
- // true or false, wether to fill the areas.
- this.fill = true;
- // prop: shadowOffset
- // offset of the shadow from the area and offset of
- // each succesive stroke of the shadow from the last.
- this.shadowOffset = 2;
- // prop: shadowAlpha
- // transparency of the shadow (0 = transparent, 1 = opaque)
- this.shadowAlpha = 0.07;
- // prop: shadowDepth
- // number of strokes to apply to the shadow,
- // each stroke offset shadowOffset from the last.
- this.shadowDepth = 5;
- // prop: highlightMouseOver
- // True to highlight area when moused over.
- // This must be false to enable highlightMouseDown to highlight when clicking on a area.
- this.highlightMouseOver = true;
- // prop: highlightMouseDown
- // True to highlight when a mouse button is pressed over a area.
- // This will be disabled if highlightMouseOver is true.
- this.highlightMouseDown = false;
- // prop: highlightColors
- // array of colors to use when highlighting an area.
- this.highlightColors = [];
- // prop: widthRatio
- // The ratio of the width of the top of the funnel to the bottom.
- // a ratio of 0 will make an upside down pyramid.
- this.widthRatio = 0.2;
- // prop: lineWidth
- // width of line if areas are stroked and not filled.
- this.lineWidth = 2;
- // prop: dataLabels
- // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices.
- // Defaults to percentage of each pie slice.
- this.dataLabels = 'percent';
- // prop: showDataLabels
- // true to show data labels on slices.
- this.showDataLabels = false;
- // prop: dataLabelFormatString
- // Format string for data labels. If none, '%s' is used for "label" and for arrays, '%d' for value and '%d%%' for percentage.
- this.dataLabelFormatString = null;
- // prop: dataLabelThreshold
- // Threshhold in percentage (0 - 100) of pie area, below which no label will be displayed.
- // This applies to all label types, not just to percentage labels.
- this.dataLabelThreshold = 3;
- this._type = 'funnel';
-
- this.tickRenderer = $.jqplot.FunnelTickRenderer;
-
- // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver
- if (options.highlightMouseDown && options.highlightMouseOver == null) {
- options.highlightMouseOver = false;
- }
-
- $.extend(true, this, options);
-
- // index of the currenty highlighted point, if any
- this._highlightedPoint = null;
-
- // lengths of bases, or horizontal sides of areas of trapezoid.
- this._bases = [];
- // total area
- this._atot;
- // areas of segments.
- this._areas = [];
- // vertical lengths of segments.
- this._lengths = [];
- // angle of the funnel to vertical.
- this._angle;
- this._dataIndices = [];
-
- // sort data
- this._unorderedData = $.extend(true, [], this.data);
- var idxs = $.extend(true, [], this.data);
- for (var i=0; i 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.4 * (255 - newrgb[j]);
- newrgb[j] = parseInt(newrgb[j], 10);
- }
- this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')');
- }
- }
-
- plot.postParseOptionsHooks.addOnce(postParseOptions);
- plot.postInitHooks.addOnce(postInit);
- plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);
- plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);
- plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);
- plot.eventListenerHooks.addOnce('jqplotClick', handleClick);
- plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);
- plot.postDrawHooks.addOnce(postPlotDraw);
-
- };
-
- // gridData will be of form [label, percentage of total]
- $.jqplot.FunnelRenderer.prototype.setGridData = function(plot) {
- // set gridData property. This will hold angle in radians of each data point.
- var sum = 0;
- var td = [];
- for (var i=0; i this._lengths[i]*tolerance && count < 100) {
- this._lengths[i] = this._areas[i]/(this._bases[i] - this._lengths[i] * Math.tan(this._angle));
- err = Math.abs(this._lengths[i] - guess);
- this._bases[i+1] = this._bases[i] - (2*this._lengths[i]*Math.tan(this._angle));
- guess = this._lengths[i];
- count++;
- }
- lsum += this._lengths[i];
- }
-
- // figure out vertices of each section
- this._vertices = new Array(gd.length);
-
- // these are 4 coners of entire trapezoid
- var p0 = [loff, toff],
- p1 = [loff+this._bases[0], toff],
- p2 = [loff + (this._bases[0] - this._bases[this._bases.length-1])/2, toff + this._length],
- p3 = [p2[0] + this._bases[this._bases.length-1], p2[1]];
-
- // equations of right and left sides, returns x, y values given height of section (y value)
- function findleft (l) {
- var m = (p0[1] - p2[1])/(p0[0] - p2[0]);
- var b = p0[1] - m*p0[0];
- var y = l + p0[1];
-
- return [(y - b)/m, y];
- }
-
- function findright (l) {
- var m = (p1[1] - p3[1])/(p1[0] - p3[0]);
- var b = p1[1] - m*p1[0];
- var y = l + p1[1];
-
- return [(y - b)/m, y];
- }
-
- var x = offx, y = offy;
- var h=0, adj=0;
-
- for (i=0; i 0 && i < gd.length-1) {
- adj = sm/2;
- }
- else if (i == gd.length -1) {
- adj = 2*sm/3;
- }
- v.push(findleft(h+adj));
- v.push(findright(h+adj));
- h += this._lengths[i];
- if (i == 0) {
- adj = -2*sm/3;
- }
- else if (i > 0 && i < gd.length-1) {
- adj = -sm/2;
- }
- else if (i == gd.length - 1) {
- adj = 0;
- }
- v.push(findright(h+adj));
- v.push(findleft(h+adj));
-
- }
-
- if (this.shadow) {
- var shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')';
- for (var i=0; i= this.dataLabelThreshold) {
- var fstr, label;
-
- if (this.dataLabels == 'label') {
- fstr = this.dataLabelFormatString || '%s';
- label = $.jqplot.sprintf(fstr, gd[i][0]);
- }
- else if (this.dataLabels == 'value') {
- fstr = this.dataLabelFormatString || '%d';
- label = $.jqplot.sprintf(fstr, this.data[i][1]);
- }
- else if (this.dataLabels == 'percent') {
- fstr = this.dataLabelFormatString || '%d%%';
- label = $.jqplot.sprintf(fstr, gd[i][1]*100);
- }
- else if (this.dataLabels.constructor == Array) {
- fstr = this.dataLabelFormatString || '%s';
- label = $.jqplot.sprintf(fstr, this.dataLabels[this._dataIndices[i]]);
- }
-
- var fact = (this._radius ) * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge;
-
- var x = (v[0][0] + v[1][0])/2 + this.canvas._offsets.left;
- var y = (v[1][1] + v[2][1])/2 + this.canvas._offsets.top;
-
- var labelelem = $('' + label + '').insertBefore(plot.eventCanvas._elem);
- x -= labelelem.width()/2;
- y -= labelelem.height()/2;
- x = Math.round(x);
- y = Math.round(y);
- labelelem.css({left: x, top: y});
- }
-
- }
-
- };
-
- $.jqplot.FunnelAxisRenderer = function() {
- $.jqplot.LinearAxisRenderer.call(this);
- };
-
- $.jqplot.FunnelAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
- $.jqplot.FunnelAxisRenderer.prototype.constructor = $.jqplot.FunnelAxisRenderer;
-
-
- // There are no traditional axes on a funnel chart. We just need to provide
- // dummy objects with properties so the plot will render.
- // called with scope of axis object.
- $.jqplot.FunnelAxisRenderer.prototype.init = function(options){
- //
- this.tickRenderer = $.jqplot.FunnelTickRenderer;
- $.extend(true, this, options);
- // I don't think I'm going to need _dataBounds here.
- // have to go Axis scaling in a way to fit chart onto plot area
- // and provide u2p and p2u functionality for mouse cursor, etc.
- // for convienence set _dataBounds to 0 and 100 and
- // set min/max to 0 and 100.
- this._dataBounds = {min:0, max:100};
- this.min = 0;
- this.max = 100;
- this.showTicks = false;
- this.ticks = [];
- this.showMark = false;
- this.show = false;
- };
-
-
-
- /**
- * Class: $.jqplot.FunnelLegendRenderer
- * Legend Renderer specific to funnel plots. Set by default
- * when the user creates a funnel plot.
- */
- $.jqplot.FunnelLegendRenderer = function(){
- $.jqplot.TableLegendRenderer.call(this);
- };
-
- $.jqplot.FunnelLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();
- $.jqplot.FunnelLegendRenderer.prototype.constructor = $.jqplot.FunnelLegendRenderer;
-
- $.jqplot.FunnelLegendRenderer.prototype.init = function(options) {
- // Group: Properties
- //
- // prop: numberRows
- // Maximum number of rows in the legend. 0 or null for unlimited.
- this.numberRows = null;
- // prop: numberColumns
- // Maximum number of columns in the legend. 0 or null for unlimited.
- this.numberColumns = null;
- $.extend(true, this, options);
- };
-
- // called with context of legend
- $.jqplot.FunnelLegendRenderer.prototype.draw = function() {
- var legend = this;
- if (this.show) {
- var series = this._series;
- var ss = 'position:absolute;';
- ss += (this.background) ? 'background:'+this.background+';' : '';
- ss += (this.border) ? 'border:'+this.border+';' : '';
- ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';
- ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';
- ss += (this.textColor) ? 'color:'+this.textColor+';' : '';
- ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : '';
- ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : '';
- ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : '';
- ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : '';
- this._elem = $('');
- // Funnel charts legends don't go by number of series, but by number of data points
- // in the series. Refactor things here for that.
-
- var pad = false,
- reverse = false,
- nr, nc;
- var s = series[0];
- var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors);
-
- if (s.show) {
- var pd = s.data;
- if (this.numberRows) {
- nr = this.numberRows;
- if (!this.numberColumns){
- nc = Math.ceil(pd.length/nr);
- }
- else{
- nc = this.numberColumns;
- }
- }
- else if (this.numberColumns) {
- nc = this.numberColumns;
- nr = Math.ceil(pd.length/this.numberColumns);
- }
- else {
- nr = pd.length;
- nc = 1;
- }
-
- var i, j, tr, td1, td2, lt, rs, color;
- var idx = 0;
-
- for (i=0; i').prependTo(this._elem);
- }
- else{
- tr = $('
').appendTo(this._elem);
- }
- for (j=0; j0){
- pad = true;
- }
- else{
- pad = false;
- }
- }
- else{
- if (i == nr -1){
- pad = false;
- }
- else{
- pad = true;
- }
- }
- rs = (pad) ? this.rowSpacing : '0';
-
- td1 = $(''+
- ' | ');
- td2 = $(' | ');
- if (this.escapeHtml){
- td2.text(lt);
- }
- else {
- td2.html(lt);
- }
- if (reverse) {
- td2.prependTo(tr);
- td1.prependTo(tr);
- }
- else {
- td1.appendTo(tr);
- td2.appendTo(tr);
- }
- pad = true;
- }
- idx++;
- }
- }
- }
- }
- return this._elem;
- };
-
- // $.jqplot.FunnelLegendRenderer.prototype.pack = function(offsets) {
- // if (this.show) {
- // // fake a grid for positioning
- // var grid = {_top:offsets.top, _left:offsets.left, _right:offsets.right, _bottom:this._plotDimensions.height - offsets.bottom};
- // if (this.placement == 'insideGrid') {
- // switch (this.location) {
- // case 'nw':
- // var a = grid._left + this.xoffset;
- // var b = grid._top + this.yoffset;
- // this._elem.css('left', a);
- // this._elem.css('top', b);
- // break;
- // case 'n':
- // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- // var b = grid._top + this.yoffset;
- // this._elem.css('left', a);
- // this._elem.css('top', b);
- // break;
- // case 'ne':
- // var a = offsets.right + this.xoffset;
- // var b = grid._top + this.yoffset;
- // this._elem.css({right:a, top:b});
- // break;
- // case 'e':
- // var a = offsets.right + this.xoffset;
- // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- // this._elem.css({right:a, top:b});
- // break;
- // case 'se':
- // var a = offsets.right + this.xoffset;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({right:a, bottom:b});
- // break;
- // case 's':
- // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({left:a, bottom:b});
- // break;
- // case 'sw':
- // var a = grid._left + this.xoffset;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({left:a, bottom:b});
- // break;
- // case 'w':
- // var a = grid._left + this.xoffset;
- // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- // this._elem.css({left:a, top:b});
- // break;
- // default: // same as 'se'
- // var a = grid._right - this.xoffset;
- // var b = grid._bottom + this.yoffset;
- // this._elem.css({right:a, bottom:b});
- // break;
- // }
- //
- // }
- // else {
- // switch (this.location) {
- // case 'nw':
- // var a = this._plotDimensions.width - grid._left + this.xoffset;
- // var b = grid._top + this.yoffset;
- // this._elem.css('right', a);
- // this._elem.css('top', b);
- // break;
- // case 'n':
- // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- // var b = this._plotDimensions.height - grid._top + this.yoffset;
- // this._elem.css('left', a);
- // this._elem.css('bottom', b);
- // break;
- // case 'ne':
- // var a = this._plotDimensions.width - offsets.right + this.xoffset;
- // var b = grid._top + this.yoffset;
- // this._elem.css({left:a, top:b});
- // break;
- // case 'e':
- // var a = this._plotDimensions.width - offsets.right + this.xoffset;
- // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- // this._elem.css({left:a, top:b});
- // break;
- // case 'se':
- // var a = this._plotDimensions.width - offsets.right + this.xoffset;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({left:a, bottom:b});
- // break;
- // case 's':
- // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- // var b = this._plotDimensions.height - offsets.bottom + this.yoffset;
- // this._elem.css({left:a, top:b});
- // break;
- // case 'sw':
- // var a = this._plotDimensions.width - grid._left + this.xoffset;
- // var b = offsets.bottom + this.yoffset;
- // this._elem.css({right:a, bottom:b});
- // break;
- // case 'w':
- // var a = this._plotDimensions.width - grid._left + this.xoffset;
- // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- // this._elem.css({right:a, top:b});
- // break;
- // default: // same as 'se'
- // var a = grid._right - this.xoffset;
- // var b = grid._bottom + this.yoffset;
- // this._elem.css({right:a, bottom:b});
- // break;
- // }
- // }
- // }
- // };
-
- // setup default renderers for axes and legend so user doesn't have to
- // called with scope of plot
- function preInit(target, data, options) {
- options = options || {};
- options.axesDefaults = options.axesDefaults || {};
- options.legend = options.legend || {};
- options.seriesDefaults = options.seriesDefaults || {};
- // only set these if there is a funnel series
- var setopts = false;
- if (options.seriesDefaults.renderer == $.jqplot.FunnelRenderer) {
- setopts = true;
- }
- else if (options.series) {
- for (var i=0; i < options.series.length; i++) {
- if (options.series[i].renderer == $.jqplot.FunnelRenderer) {
- setopts = true;
- }
- }
- }
-
- if (setopts) {
- options.axesDefaults.renderer = $.jqplot.FunnelAxisRenderer;
- options.legend.renderer = $.jqplot.FunnelLegendRenderer;
- options.legend.preDraw = true;
- options.sortData = false;
- options.seriesDefaults.pointLabels = {show: false};
- }
- }
-
- function postInit(target, data, options) {
- // if multiple series, add a reference to the previous one so that
- // funnel rings can nest.
- for (var i=0; i570)?m[n]*0.8:m[n]+0.4*(255-m[n]);m[n]=parseInt(m[n],10)}this.highlightColors.push("rgb("+m[0]+","+m[1]+","+m[2]+")")}}t.postParseOptionsHooks.addOnce(k);t.postInitHooks.addOnce(g);t.eventListenerHooks.addOnce("jqplotMouseMove",a);t.eventListenerHooks.addOnce("jqplotMouseDown",b);t.eventListenerHooks.addOnce("jqplotMouseUp",j);t.eventListenerHooks.addOnce("jqplotClick",f);t.eventListenerHooks.addOnce("jqplotRightClick",l);t.postDrawHooks.addOnce(h)};e.jqplot.FunnelRenderer.prototype.setGridData=function(o){var n=0;var p=[];for(var m=0;mthis._lengths[Y]*n&&W<100){this._lengths[Y]=this._areas[Y]/(this._bases[Y]-this._lengths[Y]*Math.tan(this._angle));aa=Math.abs(this._lengths[Y]-E);this._bases[Y+1]=this._bases[Y]-(2*this._lengths[Y]*Math.tan(this._angle));E=this._lengths[Y];W++}Q+=this._lengths[Y]}this._vertices=new Array(B.length);var ae=[t,F],ad=[t+this._bases[0],F],ac=[t+(this._bases[0]-this._bases[this._bases.length-1])/2,F+this._length],ab=[ac[0]+this._bases[this._bases.length-1],ac[1]];function V(ag){var x=(ae[1]-ac[1])/(ae[0]-ac[0]);var v=ae[1]-x*ae[0];var ah=ag+ae[1];return[(ah-v)/x,ah]}function D(ag){var x=(ad[1]-ab[1])/(ad[0]-ab[0]);var v=ad[1]-x*ad[0];var ah=ag+ad[1];return[(ah-v)/x,ah]}var T=w,S=u;var Z=0,m=0;for(Y=0;Y0&&Y0&&Y=this.dataLabelThreshold){var K,X;if(this.dataLabels=="label"){K=this.dataLabelFormatString||"%s";X=e.jqplot.sprintf(K,B[Y][0])}else{if(this.dataLabels=="value"){K=this.dataLabelFormatString||"%d";X=e.jqplot.sprintf(K,this.data[Y][1])}else{if(this.dataLabels=="percent"){K=this.dataLabelFormatString||"%d%%";X=e.jqplot.sprintf(K,B[Y][1]*100)}else{if(this.dataLabels.constructor==Array){K=this.dataLabelFormatString||"%s";X=e.jqplot.sprintf(K,this.dataLabels[this._dataIndices[Y]])}}}}var s=(this._radius)*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var T=(U[0][0]+U[1][0])/2+this.canvas._offsets.left;var S=(U[1][1]+U[2][1])/2+this.canvas._offsets.top;var z=e(''+X+"").insertBefore(p.eventCanvas._elem);T-=z.width()/2;S-=z.height()/2;T=Math.round(T);S=Math.round(S);z.css({left:T,top:S})}}};e.jqplot.FunnelAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.FunnelAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.FunnelAxisRenderer.prototype.constructor=e.jqplot.FunnelAxisRenderer;e.jqplot.FunnelAxisRenderer.prototype.init=function(m){this.tickRenderer=e.jqplot.FunnelTickRenderer;e.extend(true,this,m);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.FunnelLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.FunnelLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.FunnelLegendRenderer.prototype.constructor=e.jqplot.FunnelLegendRenderer;e.jqplot.FunnelLegendRenderer.prototype.init=function(m){this.numberRows=null;this.numberColumns=null;e.extend(true,this,m)};e.jqplot.FunnelLegendRenderer.prototype.draw=function(){var p=this;if(this.show){var x=this._series;var A="position:absolute;";A+=(this.background)?"background:"+this.background+";":"";A+=(this.border)?"border:"+this.border+";":"";A+=(this.fontSize)?"font-size:"+this.fontSize+";":"";A+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";A+=(this.textColor)?"color:"+this.textColor+";":"";A+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";A+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";A+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";A+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=e('');var E=false,w=false,m,u;var y=x[0];var n=new e.jqplot.ColorGenerator(y.seriesColors);if(y.show){var F=y.data;if(this.numberRows){m=this.numberRows;if(!this.numberColumns){u=Math.ceil(F.length/m)}else{u=this.numberColumns}}else{if(this.numberColumns){u=this.numberColumns;m=Math.ceil(F.length/this.numberColumns)}else{m=F.length;u=1}}var D,C,o,r,q,t,v,B;var z=0;for(D=0;D').prependTo(this._elem)}else{o=e('
').appendTo(this._elem)}for(C=0;C0){E=true}else{E=false}}else{if(D==m-1){E=false}else{E=true}}v=(E)?this.rowSpacing:"0";r=e(' | ');q=e(' | ');if(this.escapeHtml){q.text(t)}else{q.html(t)}if(w){q.prependTo(o);r.prependTo(o)}else{r.appendTo(o);q.appendTo(o)}E=true}z++}}}}return this._elem};function c(q,p,n){n=n||{};n.axesDefaults=n.axesDefaults||{};n.legend=n.legend||{};n.seriesDefaults=n.seriesDefaults||{};var m=false;if(n.seriesDefaults.renderer==e.jqplot.FunnelRenderer){m=true}else{if(n.series){for(var o=0;o
- *
- * A tooltip providing information about the data point is enabled by default.
- * To disable the tooltip, set "showTooltip" to false.
- *
- * You can control what data is displayed in the tooltip with various
- * options. The "tooltipAxes" option controls wether the x, y or both
- * data values are displayed.
- *
- * Some chart types (e.g. hi-low-close) have more than one y value per
- * data point. To display the additional values in the tooltip, set the
- * "yvalues" option to the desired number of y values present (3 for a hlc chart).
- *
- * By default, data values will be formatted with the same formatting
- * specifiers as used to format the axis ticks. A custom format code
- * can be supplied with the tooltipFormatString option. This will apply
- * to all values in the tooltip.
- *
- * For more complete control, the "formatString" option can be set. This
- * Allows conplete control over tooltip formatting. Values are passed to
- * the format string in an order determined by the "tooltipAxes" and "yvalues"
- * options. So, if you have a hi-low-close chart and you just want to display
- * the hi-low-close values in the tooltip, you could set a formatString like:
- *
- * > highlighter: {
- * > tooltipAxes: 'y',
- * > yvalues: 3,
- * > formatString:'
- * > | hi: | %s |
- * > | low: | %s |
- * > | close: | %s |
'
- * > }
- *
- */
- $.jqplot.Highlighter = function(options) {
- // Group: Properties
- //
- //prop: show
- // true to show the highlight.
- this.show = $.jqplot.config.enablePlugins;
- // prop: markerRenderer
- // Renderer used to draw the marker of the highlighted point.
- // Renderer will assimilate attributes from the data point being highlighted,
- // so no attributes need set on the renderer directly.
- // Default is to turn off shadow drawing on the highlighted point.
- this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false});
- // prop: showMarker
- // true to show the marker
- this.showMarker = true;
- // prop: lineWidthAdjust
- // Pixels to add to the lineWidth of the highlight.
- this.lineWidthAdjust = 2.5;
- // prop: sizeAdjust
- // Pixels to add to the overall size of the highlight.
- this.sizeAdjust = 5;
- // prop: showTooltip
- // Show a tooltip with data point values.
- this.showTooltip = true;
- // prop: tooltipLocation
- // Where to position tooltip, 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'
- this.tooltipLocation = 'nw';
- // prop: fadeTooltip
- // true = fade in/out tooltip, flase = show/hide tooltip
- this.fadeTooltip = true;
- // prop: tooltipFadeSpeed
- // 'slow', 'def', 'fast', or number of milliseconds.
- this.tooltipFadeSpeed = "fast";
- // prop: tooltipOffset
- // Pixel offset of tooltip from the highlight.
- this.tooltipOffset = 2;
- // prop: tooltipAxes
- // Which axes to display in tooltip, 'x', 'y' or 'both', 'xy' or 'yx'
- // 'both' and 'xy' are equivalent, 'yx' reverses order of labels.
- this.tooltipAxes = 'both';
- // prop; tooltipSeparator
- // String to use to separate x and y axes in tooltip.
- this.tooltipSeparator = ', ';
- // prop; tooltipContentEditor
- // Function used to edit/augment/replace the formatted tooltip contents.
- // Called as str = tooltipContentEditor(str, seriesIndex, pointIndex)
- // where str is the generated tooltip html and seriesIndex and pointIndex identify
- // the data point being highlighted. Should return the html for the tooltip contents.
- this.tooltipContentEditor = null;
- // prop: useAxesFormatters
- // Use the x and y axes formatters to format the text in the tooltip.
- this.useAxesFormatters = true;
- // prop: tooltipFormatString
- // sprintf format string for the tooltip.
- // Uses Ash Searle's javascript sprintf implementation
- // found here: http://hexmen.com/blog/2007/03/printf-sprintf/
- // See http://perldoc.perl.org/functions/sprintf.html for reference.
- // Additional "p" and "P" format specifiers added by Chris Leonello.
- this.tooltipFormatString = '%.5P';
- // prop: formatString
- // alternative to tooltipFormatString
- // will format the whole tooltip text, populating with x, y values as
- // indicated by tooltipAxes option. So, you could have a tooltip like:
- // 'Date: %s, number of cats: %d' to format the whole tooltip at one go.
- // If useAxesFormatters is true, values will be formatted according to
- // Axes formatters and you can populate your tooltip string with
- // %s placeholders.
- this.formatString = null;
- // prop: yvalues
- // Number of y values to expect in the data point array.
- // Typically this is 1. Certain plots, like OHLC, will
- // have more y values in each data point array.
- this.yvalues = 1;
- // prop: bringSeriesToFront
- // This option requires jQuery 1.4+
- // True to bring the series of the highlighted point to the front
- // of other series.
- this.bringSeriesToFront = false;
- this._tooltipElem;
- this.isHighlighting = false;
-
- $.extend(true, this, options);
- };
-
- var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];
- var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7};
- var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];
-
- // axis.renderer.tickrenderer.formatter
-
- // called with scope of plot
- $.jqplot.Highlighter.init = function (target, data, opts){
- var options = opts || {};
- // add a highlighter attribute to the plot
- this.plugins.highlighter = new $.jqplot.Highlighter(options.highlighter);
- };
-
- // called within scope of series
- $.jqplot.Highlighter.parseOptions = function (defaults, options) {
- // Add a showHighlight option to the series
- // and set it to true by default.
- this.showHighlight = true;
- };
-
- // called within context of plot
- // create a canvas which we can draw on.
- // insert it before the eventCanvas, so eventCanvas will still capture events.
- $.jqplot.Highlighter.postPlotDraw = function() {
- // Memory Leaks patch
- if (this.plugins.highlighter && this.plugins.highlighter.highlightCanvas) {
- this.plugins.highlighter.highlightCanvas.resetCanvas();
- this.plugins.highlighter.highlightCanvas = null;
- }
-
- if (this.plugins.highlighter && this.plugins.highlighter._tooltipElem) {
- this.plugins.highlighter._tooltipElem.emptyForce();
- this.plugins.highlighter._tooltipElem = null;
- }
-
- this.plugins.highlighter.highlightCanvas = new $.jqplot.GenericCanvas();
-
- this.eventCanvas._elem.before(this.plugins.highlighter.highlightCanvas.createElement(this._gridPadding, 'jqplot-highlight-canvas', this._plotDimensions, this));
- this.plugins.highlighter.highlightCanvas.setContext();
-
- var elem = document.createElement('div');
- this.plugins.highlighter._tooltipElem = $(elem);
- elem = null;
- this.plugins.highlighter._tooltipElem.addClass('jqplot-highlighter-tooltip');
- this.plugins.highlighter._tooltipElem.css({position:'absolute', display:'none'});
-
- this.eventCanvas._elem.before(this.plugins.highlighter._tooltipElem);
- };
-
- $.jqplot.preInitHooks.push($.jqplot.Highlighter.init);
- $.jqplot.preParseSeriesOptionsHooks.push($.jqplot.Highlighter.parseOptions);
- $.jqplot.postDrawHooks.push($.jqplot.Highlighter.postPlotDraw);
-
- function draw(plot, neighbor) {
- var hl = plot.plugins.highlighter;
- var s = plot.series[neighbor.seriesIndex];
- var smr = s.markerRenderer;
- var mr = hl.markerRenderer;
- mr.style = smr.style;
- mr.lineWidth = smr.lineWidth + hl.lineWidthAdjust;
- mr.size = smr.size + hl.sizeAdjust;
- var rgba = $.jqplot.getColorComponents(smr.color);
- var newrgb = [rgba[0], rgba[1], rgba[2]];
- var alpha = (rgba[3] >= 0.6) ? rgba[3]*0.6 : rgba[3]*(2-rgba[3]);
- mr.color = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+alpha+')';
- mr.init();
- mr.draw(s.gridData[neighbor.pointIndex][0], s.gridData[neighbor.pointIndex][1], hl.highlightCanvas._ctx);
- }
-
- function showTooltip(plot, series, neighbor) {
- // neighbor looks like: {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}
- // gridData should be x,y pixel coords on the grid.
- // add the plot._gridPadding to that to get x,y in the target.
- var hl = plot.plugins.highlighter;
- var elem = hl._tooltipElem;
- if (hl.useAxesFormatters) {
- var xf = series._xaxis._ticks[0].formatter;
- var yf = series._yaxis._ticks[0].formatter;
- var xfstr = series._xaxis._ticks[0].formatString;
- var yfstr = series._yaxis._ticks[0].formatString;
- var str;
- var xstr = xf(xfstr, neighbor.data[0]);
- var ystrs = [];
- for (var i=1; i=0.6)?l[3]*0.6:l[3]*(2-l[3]);i.color="rgba("+n[0]+","+n[1]+","+n[2]+","+k+")";i.init();i.draw(p.gridData[o.pointIndex][0],p.gridData[o.pointIndex][1],j.highlightCanvas._ctx)}function g(w,q,m){var k=w.plugins.highlighter;var B=k._tooltipElem;if(k.useAxesFormatters){var u=q._xaxis._ticks[0].formatter;var h=q._yaxis._ticks[0].formatter;var C=q._xaxis._ticks[0].formatString;var r=q._yaxis._ticks[0].formatString;var v;var s=u(C,m.data[0]);var l=[];for(var z=1;z
- *
- * and supply the appropriate options to your plot
- *
- * > {axes:{xaxis:{renderer:$.jqplot.LogAxisRenderer}}}
- **/
- $.jqplot.LogAxisRenderer = function() {
- $.jqplot.LinearAxisRenderer.call(this);
- // prop: axisDefaults
- // Default properties which will be applied directly to the series.
- //
- // Group: Properties
- //
- // Properties
- //
- /// base - the logarithmic base, commonly 2, 10 or Math.E
- // tickDistribution - 'even' or 'power'. 'even' gives equal pixel
- // spacing of the ticks on the plot. 'power' gives ticks in powers
- // of 10.
- this.axisDefaults = {
- base : 10,
- tickDistribution :'even'
- };
- };
-
- $.jqplot.LogAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
- $.jqplot.LogAxisRenderer.prototype.constructor = $.jqplot.LogAxisRenderer;
-
- $.jqplot.LogAxisRenderer.prototype.init = function(options) {
- // prop: tickRenderer
- // A class of a rendering engine for creating the ticks labels displayed on the plot,
- // See <$.jqplot.AxisTickRenderer>.
- // this.tickRenderer = $.jqplot.AxisTickRenderer;
- // this.labelRenderer = $.jqplot.AxisLabelRenderer;
- $.extend(true, this.renderer, options);
- for (var d in this.renderer.axisDefaults) {
- if (this[d] == null) {
- this[d] = this.renderer.axisDefaults[d];
- }
- }
- var db = this._dataBounds;
- // Go through all the series attached to this axis and find
- // the min/max bounds for this axis.
- for (var i=0; i db.max) || db.max == null) {
- db.max = d[j][0];
- }
- }
- else {
- if ((d[j][1] != null && d[j][1] < db.min) || db.min == null) {
- db.min = d[j][1];
- }
- if ((d[j][1] != null && d[j][1] > db.max) || db.max == null) {
- db.max = d[j][1];
- }
- }
- }
- }
- };
-
- $.jqplot.LogAxisRenderer.prototype.createTicks = function() {
- // we're are operating on an axis here
- var ticks = this._ticks;
- var userTicks = this.ticks;
- var name = this.name;
- var db = this._dataBounds;
- var dim, interval;
- var min, max;
- var pos1, pos2;
- var tt, i;
-
- // if we already have ticks, use them.
- // ticks must be in order of increasing value.
- if (userTicks.length) {
- // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed
- for (i=0; i1.99) this.pad = 1.99;
- var range = max - min;
- var rmin, rmax;
-
- if (this.tickDistribution == 'even') {
- rmin = (this.min != null) ? this.min : min - min*((this.padMin-1)/2);
- rmax = (this.max != null) ? this.max : max + max*((this.padMax-1)/2);
- this.min = rmin;
- this.max = rmax;
- range = this.max - this.min;
-
- if (this.numberTicks == null){
- if (dim > 100) {
- this.numberTicks = parseInt(3+(dim-100)/75, 10);
- }
- else {
- this.numberTicks = 2;
- }
- }
-
- var u = Math.pow(this.base, (1/(this.numberTicks-1)*Math.log(this.max/this.min)/Math.log(this.base)));
- for (var i=0; i 100) {
- this.numberTicks = Math.round(Math.log(this.max/this.min)/Math.log(this.base) + 1);
- if (this.numberTicks < 2) {
- this.numberTicks = 2;
- }
- fittedTicks = parseInt(3+(dim-100)/75, 10);
- }
- else {
- this.numberTicks = 2;
- fittedTicks = 2;
- }
- // if we don't have enough ticks, add some intermediate ticks
- // how many to have between major ticks.
- if (this.numberTicks < fittedTicks-1) {
- minorTicks = Math.floor(fittedTicks/this.numberTicks);
- }
- }
-
- for (var i=0; i=0; j--) {
- var val = tt1-interval*(j+1);
- var t = new this.tickRenderer(this.tickOptions);
- if (!this.showTicks) {
- t.showLabel = false;
- t.showMark = false;
- }
- else if (!this.showTickMarks) {
- t.showMark = false;
- }
- t.setTick(val, this.name);
- this._ticks.push(t);
- }
- }
- }
- }
- }
- };
-
- $.jqplot.LogAxisRenderer.prototype.pack = function(pos, offsets) {
- var lb = parseInt(this.base, 10);
- var ticks = this._ticks;
- var trans = function (v) { return Math.log(v)/Math.log(lb); };
- var invtrans = function (v) { return Math.pow(Math.E, (Math.log(lb)*v)); };
- var max = trans(this.max);
- var min = trans(this.min);
- var offmax = offsets.max;
- var offmin = offsets.min;
- var lshow = (this._label == null) ? false : this._label.show;
-
- for (var p in pos) {
- this._elem.css(p, pos[p]);
- }
-
- this._offsets = offsets;
- // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.
- var pixellength = offmax - offmin;
- var unitlength = max - min;
-
- // point to unit and unit to point conversions references to Plot DOM element top left corner.
- this.p2u = function(p){
- return invtrans((p - offmin) * unitlength / pixellength + min);
- };
-
- this.u2p = function(u){
- return (trans(u) - min) * pixellength / unitlength + offmin;
- };
-
- if (this.name == 'xaxis' || this.name == 'x2axis'){
- this.series_u2p = function(u){
- return (trans(u) - min) * pixellength / unitlength;
- };
- this.series_p2u = function(p){
- return invtrans(p * unitlength / pixellength + min);
- };
- }
- // yaxis is max at top of canvas.
- else {
- this.series_u2p = function(u){
- return (trans(u) - max) * pixellength / unitlength;
- };
- this.series_p2u = function(p){
- return invtrans(p * unitlength / pixellength + max);
- };
- }
-
- if (this.show) {
- if (this.name == 'xaxis' || this.name == 'x2axis') {
- for (var i=0; i 0) {
- shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;
- }
- else {
- shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;
- }
- break;
- case 'middle':
- // if (t.angle > 0) {
- // shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
- // }
- // else {
- // shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;
- // }
- shim = -t.getHeight()/2;
- break;
- default:
- shim = -t.getHeight()/2;
- break;
- }
- }
- else {
- shim = -t.getHeight()/2;
- }
-
- var val = this.u2p(t.value) + shim + 'px';
- t._elem.css('top', val);
- t.pack();
- }
- }
- if (lshow) {
- var h = this._label._elem.outerHeight(true);
- this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');
- if (this.name == 'yaxis') {
- this._label._elem.css('left', '0px');
- }
- else {
- this._label._elem.css('right', '0px');
- }
- this._label.pack();
- }
- }
- }
- };
-})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.logAxisRenderer.min.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.logAxisRenderer.min.js
deleted file mode 100644
index 227c2ca975..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.logAxisRenderer.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function(a){a.jqplot.LogAxisRenderer=function(){a.jqplot.LinearAxisRenderer.call(this);this.axisDefaults={base:10,tickDistribution:"even"}};a.jqplot.LogAxisRenderer.prototype=new a.jqplot.LinearAxisRenderer();a.jqplot.LogAxisRenderer.prototype.constructor=a.jqplot.LogAxisRenderer;a.jqplot.LogAxisRenderer.prototype.init=function(e){a.extend(true,this.renderer,e);for(var h in this.renderer.axisDefaults){if(this[h]==null){this[h]=this.renderer.axisDefaults[h]}}var b=this._dataBounds;for(var f=0;fb.max)||b.max==null){b.max=h[c][0]}}else{if((h[c][1]!=null&&h[c][1]b.max)||b.max==null){b.max=h[c][1]}}}}};a.jqplot.LogAxisRenderer.prototype.createTicks=function(){var A=this._ticks;var x=this.ticks;var D=this.name;var z=this._dataBounds;var s,y;var o,v;var e,d;var b,w;if(x.length){for(w=0;w100){this.numberTicks=parseInt(3+(s-100)/75,10)}else{this.numberTicks=2}}var h=Math.pow(this.base,(1/(this.numberTicks-1)*Math.log(this.max/this.min)/Math.log(this.base)));for(var w=0;w100){this.numberTicks=Math.round(Math.log(this.max/this.min)/Math.log(this.base)+1);if(this.numberTicks<2){this.numberTicks=2}q=parseInt(3+(s-100)/75,10)}else{this.numberTicks=2;q=2}if(this.numberTicks=0;p--){var C=m-y*(p+1);var k=new this.tickRenderer(this.tickOptions);if(!this.showTicks){k.showLabel=false;k.showMark=false}else{if(!this.showTickMarks){k.showMark=false}}k.setTick(C,this.name);this._ticks.push(k)}}}}}}};a.jqplot.LogAxisRenderer.prototype.pack=function(f,e){var r=parseInt(this.base,10);var y=this._ticks;var d=function(h){return Math.log(h)/Math.log(r)};var b=function(h){return Math.pow(Math.E,(Math.log(r)*h))};var u=d(this.max);var s=d(this.min);var m=e.max;var k=e.min;var o=(this._label==null)?false:this._label.show;for(var q in f){this._elem.css(q,f[q])}this._offsets=e;var g=m-k;var j=u-s;this.p2u=function(h){return b((h-k)*j/g+s)};this.u2p=function(h){return(d(h)-s)*g/j+k};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(h){return(d(h)-s)*g/j};this.series_p2u=function(h){return b(h*j/g+s)}}else{this.series_u2p=function(h){return(d(h)-u)*g/j};this.series_p2u=function(h){return b(h*j/g+u)}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(var v=0;v0){c=-n._textRenderer.height*Math.cos(-n._textRenderer.angle)/2}else{c=-n.getHeight()+n._textRenderer.height*Math.cos(n._textRenderer.angle)/2}break;case"middle":c=-n.getHeight()/2;break;default:c=-n.getHeight()/2;break}}else{c=-n.getHeight()/2}var z=this.u2p(n.value)+c+"px";n._elem.css("top",z);n.pack()}}if(o){var x=this._label._elem.outerHeight(true);this._label._elem.css("top",m-g/2-x/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}}})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoAxisRenderer.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoAxisRenderer.js
deleted file mode 100644
index 991ed87895..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoAxisRenderer.js
+++ /dev/null
@@ -1,610 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function($) {
- // class: $.jqplot.MekkoAxisRenderer
- // An axis renderer for a Mekko chart.
- // Should be used with a Mekko chart where the mekkoRenderer is used on the series.
- // Displays the Y axis as a range from 0 to 1 (0 to 100%) and the x axis with a tick
- // for each series scaled to the sum of all the y values.
- $.jqplot.MekkoAxisRenderer = function() {
- };
-
- // called with scope of axis object.
- $.jqplot.MekkoAxisRenderer.prototype.init = function(options){
- // prop: tickMode
- // How to space the ticks on the axis.
- // 'bar' will place a tick at the width of each bar.
- // This is the default for the x axis.
- // 'even' will place ticks at even intervals. This is
- // the default for x2 axis and y axis. y axis cannot be changed.
- this.tickMode;
- // prop: barLabelRenderer
- // renderer to use to draw labels under each bar.
- this.barLabelRenderer = $.jqplot.AxisLabelRenderer;
- // prop: barLabels
- // array of labels to put under each bar.
- this.barLabels = this.barLabels || [];
- // prop: barLabelOptions
- // options object to pass to the bar label renderer.
- this.barLabelOptions = {};
- this.tickOptions = $.extend(true, {showGridline:false}, this.tickOptions);
- this._barLabels = [];
- $.extend(true, this, options);
- if (this.name == 'yaxis') {
- this.tickOptions.formatString = this.tickOptions.formatString || "%d\%";
- }
- var db = this._dataBounds;
- db.min = 0;
- // for y axes, scale always go from 0 to 1 (0 to 100%)
- if (this.name == 'yaxis' || this.name == 'y2axis') {
- db.max = 100;
- this.tickMode = 'even';
- }
- // For x axes, scale goes from 0 to sum of all y values.
- else if (this.name == 'xaxis'){
- this.tickMode = (this.tickMode == null) ? 'bar' : this.tickMode;
- for (var i=0; i dim) {
- dim = temp;
- }
- }
- }
-
- if (lshow) {
- w = this._label._elem.outerWidth(true);
- h = this._label._elem.outerHeight(true);
- }
- if (this.name == 'xaxis') {
- dim = dim + h;
- this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'});
- }
- else if (this.name == 'x2axis') {
- dim = dim + h;
- this._elem.css({'height':dim+'px', left:'0px', top:'0px'});
- }
- else if (this.name == 'yaxis') {
- dim = dim + w;
- this._elem.css({'width':dim+'px', left:'0px', top:'0px'});
- if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {
- this._label._elem.css('width', w+'px');
- }
- }
- else {
- dim = dim + w;
- this._elem.css({'width':dim+'px', right:'0px', top:'0px'});
- if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {
- this._label._elem.css('width', w+'px');
- }
- }
- }
- };
-
- // called with scope of axis
- $.jqplot.MekkoAxisRenderer.prototype.createTicks = function() {
- // we're are operating on an axis here
- var ticks = this._ticks;
- var userTicks = this.ticks;
- var name = this.name;
- // databounds were set on axis initialization.
- var db = this._dataBounds;
- var dim, interval;
- var min, max;
- var pos1, pos2;
- var t, tt, i, j;
-
- // if we already have ticks, use them.
- // ticks must be in order of increasing value.
-
- if (userTicks.length) {
- // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed
- for (i=0; i 0) {
- adj = Math.max(Math.log(min)/Math.LN10, 0.05);
- }
- min -= adj;
- max += adj;
- }
-
- var range = max - min;
- var rmin, rmax;
- var temp, prev, curr;
- var ynumticks = [3,5,6,11,21];
-
- // yaxis divide ticks in nice intervals from 0 to 1.
- if (this.name == 'yaxis' || this.name == 'y2axis') {
- this.min = 0;
- this.max = 100;
- // user didn't specify number of ticks.
- if (!this.numberTicks){
- if (this.tickInterval) {
- this.numberTicks = 3 + Math.ceil(range / this.tickInterval);
- }
- else {
- temp = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);
- for (i=0; i 1) {
- prev = curr;
- continue;
- }
- else if (curr < 1) {
- // was prev or is curr closer to one?
- if (Math.abs(prev - 1) < Math.abs(curr - 1)) {
- this.numberTicks = ynumticks[i-1];
- break;
- }
- else {
- this.numberTicks = ynumticks[i];
- break;
- }
- }
- else if (i == ynumticks.length -1) {
- this.numberTicks = ynumticks[i];
- }
- }
- this.tickInterval = range / (this.numberTicks - 1);
- }
- }
-
- // user did specify number of ticks.
- else {
- this.tickInterval = range / (this.numberTicks - 1);
- }
-
- for (var i=0; i temp) {
- t = new this.tickRenderer(this.tickOptions);
- if (!this.showTicks) {
- t.showLabel = false;
- t.showMark = false;
- }
- else if (!this.showTickMarks) {
- t.showMark = false;
- }
- t.setTick(this.max, this.name);
- this._ticks.push(t);
-
- }
- }
-
- else if (this.tickMode == 'even') {
- this.min = 0;
- this.max = this.max || db.max;
- // get a desired number of ticks
- var nt = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);
- range = this.max - this.min;
- this.numberTicks = nt;
- this.tickInterval = range / (this.numberTicks - 1);
-
- for (i=0; i 0) {
- shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;
- }
- else {
- shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;
- }
- break;
- case 'middle':
- shim = -t.getHeight()/2;
- break;
- default:
- shim = -t.getHeight()/2;
- break;
- }
- }
- else {
- shim = -t.getHeight()/2;
- }
-
- var val = this.u2p(t.value) + shim + 'px';
- t._elem.css('top', val);
- t.pack();
- }
- }
- if (lshow) {
- var h = this._label._elem.outerHeight(true);
- this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');
- if (this.name == 'yaxis') {
- this._label._elem.css('left', '0px');
- }
- else {
- this._label._elem.css('right', '0px');
- }
- this._label.pack();
- }
- }
- }
- };
-})(jQuery);
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoAxisRenderer.min.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoAxisRenderer.min.js
deleted file mode 100644
index fe79d7ce4d..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoAxisRenderer.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function(a){a.jqplot.MekkoAxisRenderer=function(){};a.jqplot.MekkoAxisRenderer.prototype.init=function(c){this.tickMode;this.barLabelRenderer=a.jqplot.AxisLabelRenderer;this.barLabels=this.barLabels||[];this.barLabelOptions={};this.tickOptions=a.extend(true,{showGridline:false},this.tickOptions);this._barLabels=[];a.extend(true,this,c);if(this.name=="yaxis"){this.tickOptions.formatString=this.tickOptions.formatString||"%d%"}var b=this._dataBounds;b.min=0;if(this.name=="yaxis"||this.name=="y2axis"){b.max=100;this.tickMode="even"}else{if(this.name=="xaxis"){this.tickMode=(this.tickMode==null)?"bar":this.tickMode;for(var d=0;dk){k=d}}}if(b){c=this._label._elem.outerWidth(true);j=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){k=k+j;this._elem.css({height:k+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){k=k+j;this._elem.css({height:k+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){k=k+c;this._elem.css({width:k+"px",left:"0px",top:"0px"});if(b&&this._label.constructor==a.jqplot.AxisLabelRenderer){this._label._elem.css("width",c+"px")}}else{k=k+c;this._elem.css({width:k+"px",right:"0px",top:"0px"});if(b&&this._label.constructor==a.jqplot.AxisLabelRenderer){this._label._elem.css("width",c+"px")}}}}}};a.jqplot.MekkoAxisRenderer.prototype.createTicks=function(){var z=this._ticks;var w=this.ticks;var B=this.name;var y=this._dataBounds;var p,x;var n,r;var d,c;var h,b,s,q;if(w.length){for(s=0;s0){g=Math.max(Math.log(n)/Math.LN10,0.05)}n-=g;r+=g}var k=r-n;var m,o;var v,l,u;var f=[3,5,6,11,21];if(this.name=="yaxis"||this.name=="y2axis"){this.min=0;this.max=100;if(!this.numberTicks){if(this.tickInterval){this.numberTicks=3+Math.ceil(k/this.tickInterval)}else{v=2+Math.ceil((p-(this.tickSpacing-1))/this.tickSpacing);for(s=0;s1){l=u;continue}else{if(u<1){if(Math.abs(l-1)v){h=new this.tickRenderer(this.tickOptions);if(!this.showTicks){h.showLabel=false;h.showMark=false}else{if(!this.showTickMarks){h.showMark=false}}h.setTick(this.max,this.name);this._ticks.push(h)}}else{if(this.tickMode=="even"){this.min=0;this.max=this.max||y.max;var A=2+Math.ceil((p-(this.tickSpacing-1))/this.tickSpacing);k=this.max-this.min;this.numberTicks=A;this.tickInterval=k/(this.numberTicks-1);for(s=0;s0){c=-n._textRenderer.height*Math.cos(-n._textRenderer.angle)/2}else{c=-n.getHeight()+n._textRenderer.height*Math.cos(n._textRenderer.angle)/2}break;case"middle":c=-n.getHeight()/2;break;default:c=-n.getHeight()/2;break}}else{c=-n.getHeight()/2}var D=this.u2p(n.value)+c+"px";n._elem.css("top",D);n.pack()}}if(o){var z=this._label._elem.outerHeight(true);this._label._elem.css("top",m-f/2-z/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}}})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoRenderer.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoRenderer.js
deleted file mode 100644
index 207f7061a7..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoRenderer.js
+++ /dev/null
@@ -1,436 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function($) {
- /**
- * Class: $.jqplot.MekkoRenderer
- * Draws a Mekko style chart which shows 3 dimensional data on a 2 dimensional graph.
- * the <$.jqplot.MekkoAxisRenderer> should be used with mekko charts. The mekko renderer
- * overrides the default legend renderer with it's own $.jqplot.MekkoLegendRenderer
- * which allows more flexibility to specify number of rows and columns in the legend.
- *
- * Data is specified per bar in the chart. You can specify data as an array of y values, or as
- * an array of [label, value] pairs. Note that labels are used only on the first series.
- * Labels on subsequent series are ignored:
- *
- * > bar1 = [['shirts', 8],['hats', 14],['shoes', 6],['gloves', 16],['dolls', 12]];
- * > bar2 = [15,6,9,13,6];
- * > bar3 = [['grumpy',4],['sneezy',2],['happy',7],['sleepy',9],['doc',7]];
- *
- * If you want to place labels for each bar under the axis, you use the barLabels option on
- * the axes. The bar labels can be styled with the ".jqplot-mekko-barLabel" css class.
- *
- * > barLabels = ['Mickey Mouse', 'Donald Duck', 'Goofy'];
- * > axes:{xaxis:{barLabels:barLabels}}
- *
- */
-
-
- $.jqplot.MekkoRenderer = function(){
- this.shapeRenderer = new $.jqplot.ShapeRenderer();
- // prop: borderColor
- // color of the borders between areas on the chart
- this.borderColor = null;
- // prop: showBorders
- // True to draw borders lines between areas on the chart.
- // False will draw borders lines with the same color as the area.
- this.showBorders = true;
- };
-
- // called with scope of series.
- $.jqplot.MekkoRenderer.prototype.init = function(options, plot) {
- this.fill = false;
- this.fillRect = true;
- this.strokeRect = true;
- this.shadow = false;
- // width of bar on x axis.
- this._xwidth = 0;
- this._xstart = 0;
- $.extend(true, this.renderer, options);
- // set the shape renderer options
- var opts = {lineJoin:'miter', lineCap:'butt', isarc:false, fillRect:this.fillRect, strokeRect:this.strokeRect};
- this.renderer.shapeRenderer.init(opts);
- plot.axes.x2axis._series.push(this);
- this._type = 'mekko';
- };
-
- // Method: setGridData
- // converts the user data values to grid coordinates and stores them
- // in the gridData array. Will convert user data into appropriate
- // rectangles.
- // Called with scope of a series.
- $.jqplot.MekkoRenderer.prototype.setGridData = function(plot) {
- // recalculate the grid data
- var xp = this._xaxis.series_u2p;
- var yp = this._yaxis.series_u2p;
- var data = this._plotData;
- this.gridData = [];
- // figure out width on x axis.
- // this._xwidth = this._sumy / plot._sumy * this.canvas.getWidth();
- this._xwidth = xp(this._sumy) - xp(0);
- if (this.index>0) {
- this._xstart = plot.series[this.index-1]._xstart + plot.series[this.index-1]._xwidth;
- }
- var totheight = this.canvas.getHeight();
- var sumy = 0;
- var cury;
- var curheight;
- for (var i=0; i');
- // Mekko charts legends don't go by number of series, but by number of data points
- // in the series. Refactor things here for that.
-
- var pad = false,
- reverse = true, // mekko charts are always stacked, so reverse
- nr, nc;
- var s = series[0];
- var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors);
-
- if (s.show) {
- var pd = s.data;
- if (this.numberRows) {
- nr = this.numberRows;
- if (!this.numberColumns){
- nc = Math.ceil(pd.length/nr);
- }
- else{
- nc = this.numberColumns;
- }
- }
- else if (this.numberColumns) {
- nc = this.numberColumns;
- nr = Math.ceil(pd.length/this.numberColumns);
- }
- else {
- nr = pd.length;
- nc = 1;
- }
-
- var i, j, tr, td1, td2, lt, rs, color;
- var idx = 0;
-
- for (i=0; i').prependTo(this._elem);
- }
- else{
- tr = $('
').appendTo(this._elem);
- }
- for (j=0; j0){
- pad = true;
- }
- else{
- pad = false;
- }
- }
- else{
- if (i == nr -1){
- pad = false;
- }
- else{
- pad = true;
- }
- }
- rs = (pad) ? this.rowSpacing : '0';
-
- td1 = $(''+
- ' | ');
- td2 = $(' | ');
- if (this.escapeHtml){
- td2.text(lt);
- }
- else {
- td2.html(lt);
- }
- if (reverse) {
- td2.prependTo(tr);
- td1.prependTo(tr);
- }
- else {
- td1.appendTo(tr);
- td2.appendTo(tr);
- }
- pad = true;
- }
- idx++;
- }
- }
-
- tr = null;
- td1 = null;
- td2 = null;
- }
- }
- return this._elem;
- };
-
- $.jqplot.MekkoLegendRenderer.prototype.pack = function(offsets) {
- if (this.show) {
- // fake a grid for positioning
- var grid = {_top:offsets.top, _left:offsets.left, _right:offsets.right, _bottom:this._plotDimensions.height - offsets.bottom};
- if (this.placement == 'insideGrid') {
- switch (this.location) {
- case 'nw':
- var a = grid._left + this.xoffset;
- var b = grid._top + this.yoffset;
- this._elem.css('left', a);
- this._elem.css('top', b);
- break;
- case 'n':
- var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- var b = grid._top + this.yoffset;
- this._elem.css('left', a);
- this._elem.css('top', b);
- break;
- case 'ne':
- var a = offsets.right + this.xoffset;
- var b = grid._top + this.yoffset;
- this._elem.css({right:a, top:b});
- break;
- case 'e':
- var a = offsets.right + this.xoffset;
- var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- this._elem.css({right:a, top:b});
- break;
- case 'se':
- var a = offsets.right + this.xoffset;
- var b = offsets.bottom + this.yoffset;
- this._elem.css({right:a, bottom:b});
- break;
- case 's':
- var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- var b = offsets.bottom + this.yoffset;
- this._elem.css({left:a, bottom:b});
- break;
- case 'sw':
- var a = grid._left + this.xoffset;
- var b = offsets.bottom + this.yoffset;
- this._elem.css({left:a, bottom:b});
- break;
- case 'w':
- var a = grid._left + this.xoffset;
- var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- this._elem.css({left:a, top:b});
- break;
- default: // same as 'se'
- var a = grid._right - this.xoffset;
- var b = grid._bottom + this.yoffset;
- this._elem.css({right:a, bottom:b});
- break;
- }
-
- }
- else {
- switch (this.location) {
- case 'nw':
- var a = this._plotDimensions.width - grid._left + this.xoffset;
- var b = grid._top + this.yoffset;
- this._elem.css('right', a);
- this._elem.css('top', b);
- break;
- case 'n':
- var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- var b = this._plotDimensions.height - grid._top + this.yoffset;
- this._elem.css('left', a);
- this._elem.css('bottom', b);
- break;
- case 'ne':
- var a = this._plotDimensions.width - offsets.right + this.xoffset;
- var b = grid._top + this.yoffset;
- this._elem.css({left:a, top:b});
- break;
- case 'e':
- var a = this._plotDimensions.width - offsets.right + this.xoffset;
- var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- this._elem.css({left:a, top:b});
- break;
- case 'se':
- var a = this._plotDimensions.width - offsets.right + this.xoffset;
- var b = offsets.bottom + this.yoffset;
- this._elem.css({left:a, bottom:b});
- break;
- case 's':
- var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- var b = this._plotDimensions.height - offsets.bottom + this.yoffset;
- this._elem.css({left:a, top:b});
- break;
- case 'sw':
- var a = this._plotDimensions.width - grid._left + this.xoffset;
- var b = offsets.bottom + this.yoffset;
- this._elem.css({right:a, bottom:b});
- break;
- case 'w':
- var a = this._plotDimensions.width - grid._left + this.xoffset;
- var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- this._elem.css({right:a, top:b});
- break;
- default: // same as 'se'
- var a = grid._right - this.xoffset;
- var b = grid._bottom + this.yoffset;
- this._elem.css({right:a, bottom:b});
- break;
- }
- }
- }
- };
-
- // setup default renderers for axes and legend so user doesn't have to
- // called with scope of plot
- function preInit(target, data, options) {
- options = options || {};
- options.axesDefaults = options.axesDefaults || {};
- options.legend = options.legend || {};
- options.seriesDefaults = options.seriesDefaults || {};
- var setopts = false;
- if (options.seriesDefaults.renderer == $.jqplot.MekkoRenderer) {
- setopts = true;
- }
- else if (options.series) {
- for (var i=0; i < options.series.length; i++) {
- if (options.series[i].renderer == $.jqplot.MekkoRenderer) {
- setopts = true;
- }
- }
- }
-
- if (setopts) {
- options.axesDefaults.renderer = $.jqplot.MekkoAxisRenderer;
- options.legend.renderer = $.jqplot.MekkoLegendRenderer;
- options.legend.preDraw = true;
- }
- }
-
- $.jqplot.preInitHooks.push(preInit);
-
-})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoRenderer.min.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoRenderer.min.js
deleted file mode 100644
index bb53e5f536..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.mekkoRenderer.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function(b){b.jqplot.MekkoRenderer=function(){this.shapeRenderer=new b.jqplot.ShapeRenderer();this.borderColor=null;this.showBorders=true};b.jqplot.MekkoRenderer.prototype.init=function(c,e){this.fill=false;this.fillRect=true;this.strokeRect=true;this.shadow=false;this._xwidth=0;this._xstart=0;b.extend(true,this.renderer,c);var d={lineJoin:"miter",lineCap:"butt",isarc:false,fillRect:this.fillRect,strokeRect:this.strokeRect};this.renderer.shapeRenderer.init(d);e.axes.x2axis._series.push(this);this._type="mekko"};b.jqplot.MekkoRenderer.prototype.setGridData=function(h){var e=this._xaxis.series_u2p;var c=this._yaxis.series_u2p;var g=this._plotData;this.gridData=[];this._xwidth=e(this._sumy)-e(0);if(this.index>0){this._xstart=h.series[this.index-1]._xstart+h.series[this.index-1]._xwidth}var l=this.canvas.getHeight();var d=0;var k;var j;for(var f=0;f');var w=false,n=true,c,l;var p=o[0];var d=new b.jqplot.ColorGenerator(p.seriesColors);if(p.show){var x=p.data;if(this.numberRows){c=this.numberRows;if(!this.numberColumns){l=Math.ceil(x.length/c)}else{l=this.numberColumns}}else{if(this.numberColumns){l=this.numberColumns;c=Math.ceil(x.length/this.numberColumns)}else{c=x.length;l=1}}var v,u,e,h,g,k,m,t;var q=0;for(v=0;v').prependTo(this._elem)}else{e=b('
').appendTo(this._elem)}for(u=0;u0){w=true}else{w=false}}else{if(v==c-1){w=false}else{w=true}}m=(w)?this.rowSpacing:"0";h=b(' | ');g=b(' | ');if(this.escapeHtml){g.text(k)}else{g.html(k)}if(n){g.prependTo(e);h.prependTo(e)}else{h.appendTo(e);g.appendTo(e)}w=true}q++}}e=null;h=null;g=null}}return this._elem};b.jqplot.MekkoLegendRenderer.prototype.pack=function(f){if(this.show){var e={_top:f.top,_left:f.left,_right:f.right,_bottom:this._plotDimensions.height-f.bottom};if(this.placement=="insideGrid"){switch(this.location){case"nw":var d=e._left+this.xoffset;var c=e._top+this.yoffset;this._elem.css("left",d);this._elem.css("top",c);break;case"n":var d=(f.left+(this._plotDimensions.width-f.right))/2-this.getWidth()/2;var c=e._top+this.yoffset;this._elem.css("left",d);this._elem.css("top",c);break;case"ne":var d=f.right+this.xoffset;var c=e._top+this.yoffset;this._elem.css({right:d,top:c});break;case"e":var d=f.right+this.xoffset;var c=(f.top+(this._plotDimensions.height-f.bottom))/2-this.getHeight()/2;this._elem.css({right:d,top:c});break;case"se":var d=f.right+this.xoffset;var c=f.bottom+this.yoffset;this._elem.css({right:d,bottom:c});break;case"s":var d=(f.left+(this._plotDimensions.width-f.right))/2-this.getWidth()/2;var c=f.bottom+this.yoffset;this._elem.css({left:d,bottom:c});break;case"sw":var d=e._left+this.xoffset;var c=f.bottom+this.yoffset;this._elem.css({left:d,bottom:c});break;case"w":var d=e._left+this.xoffset;var c=(f.top+(this._plotDimensions.height-f.bottom))/2-this.getHeight()/2;this._elem.css({left:d,top:c});break;default:var d=e._right-this.xoffset;var c=e._bottom+this.yoffset;this._elem.css({right:d,bottom:c});break}}else{switch(this.location){case"nw":var d=this._plotDimensions.width-e._left+this.xoffset;var c=e._top+this.yoffset;this._elem.css("right",d);this._elem.css("top",c);break;case"n":var d=(f.left+(this._plotDimensions.width-f.right))/2-this.getWidth()/2;var c=this._plotDimensions.height-e._top+this.yoffset;this._elem.css("left",d);this._elem.css("bottom",c);break;case"ne":var d=this._plotDimensions.width-f.right+this.xoffset;var c=e._top+this.yoffset;this._elem.css({left:d,top:c});break;case"e":var d=this._plotDimensions.width-f.right+this.xoffset;var c=(f.top+(this._plotDimensions.height-f.bottom))/2-this.getHeight()/2;this._elem.css({left:d,top:c});break;case"se":var d=this._plotDimensions.width-f.right+this.xoffset;var c=f.bottom+this.yoffset;this._elem.css({left:d,bottom:c});break;case"s":var d=(f.left+(this._plotDimensions.width-f.right))/2-this.getWidth()/2;var c=this._plotDimensions.height-f.bottom+this.yoffset;this._elem.css({left:d,top:c});break;case"sw":var d=this._plotDimensions.width-e._left+this.xoffset;var c=f.bottom+this.yoffset;this._elem.css({right:d,bottom:c});break;case"w":var d=this._plotDimensions.width-e._left+this.xoffset;var c=(f.top+(this._plotDimensions.height-f.bottom))/2-this.getHeight()/2;this._elem.css({right:d,top:c});break;default:var d=e._right-this.xoffset;var c=e._bottom+this.yoffset;this._elem.css({right:d,bottom:c});break}}}};function a(g,f,d){d=d||{};d.axesDefaults=d.axesDefaults||{};d.legend=d.legend||{};d.seriesDefaults=d.seriesDefaults||{};var c=false;if(d.seriesDefaults.renderer==b.jqplot.MekkoRenderer){c=true}else{if(d.series){for(var e=0;e
- *
- * Properties described here are passed into the $.jqplot function
- * as options on the series renderer. For example:
- *
- * > plot0 = $.jqplot('chart0',[[18]],{
- * > title: 'Network Speed',
- * > seriesDefaults: {
- * > renderer: $.jqplot.MeterGaugeRenderer,
- * > rendererOptions: {
- * > label: 'MB/s'
- * > }
- * > }
- * > });
- *
- * A meterGauge plot does not support events.
- */
- $.jqplot.MeterGaugeRenderer = function(){
- $.jqplot.LineRenderer.call(this);
- };
-
- $.jqplot.MeterGaugeRenderer.prototype = new $.jqplot.LineRenderer();
- $.jqplot.MeterGaugeRenderer.prototype.constructor = $.jqplot.MeterGaugeRenderer;
-
- // called with scope of a series
- $.jqplot.MeterGaugeRenderer.prototype.init = function(options) {
- // Group: Properties
- //
- // prop: diameter
- // Outer diameter of the meterGauge, auto computed by default
- this.diameter = null;
- // prop: padding
- // padding between the meterGauge and plot edges, auto
- // calculated by default.
- this.padding = null;
- // prop: shadowOffset
- // offset of the shadow from the gauge ring and offset of
- // each succesive stroke of the shadow from the last.
- this.shadowOffset = 2;
- // prop: shadowAlpha
- // transparency of the shadow (0 = transparent, 1 = opaque)
- this.shadowAlpha = 0.07;
- // prop: shadowDepth
- // number of strokes to apply to the shadow,
- // each stroke offset shadowOffset from the last.
- this.shadowDepth = 4;
- // prop: background
- // background color of the inside of the gauge.
- this.background = "#efefef";
- // prop: ringColor
- // color of the outer ring, hub, and needle of the gauge.
- this.ringColor = "#BBC6D0";
- // needle color not implemented yet.
- this.needleColor = "#C3D3E5";
- // prop: tickColor
- // color of the tick marks around the gauge.
- this.tickColor = "989898";
- // prop: ringWidth
- // width of the ring around the gauge. Auto computed by default.
- this.ringWidth = null;
- // prop: min
- // Minimum value on the gauge. Auto computed by default
- this.min;
- // prop: max
- // Maximum value on the gauge. Auto computed by default
- this.max;
- // prop: ticks
- // Array of tick values. Auto computed by default.
- this.ticks = [];
- // prop: showTicks
- // true to show ticks around gauge.
- this.showTicks = true;
- // prop: showTickLabels
- // true to show tick labels next to ticks.
- this.showTickLabels = true;
- // prop: label
- // A gauge label like 'kph' or 'Volts'
- this.label = null;
- // prop: labelHeightAdjust
- // Number of Pixels to offset the label up (-) or down (+) from its default position.
- this.labelHeightAdjust = 0;
- // prop: labelPosition
- // Where to position the label, either 'inside' or 'bottom'.
- this.labelPosition = 'inside';
- // prop: intervals
- // Array of ranges to be drawn around the gauge.
- // Array of form:
- // > [value1, value2, ...]
- // indicating the values for the first, second, ... intervals.
- this.intervals = [];
- // prop: intervalColors
- // Array of colors to use for the intervals.
- this.intervalColors = [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"];
- // prop: intervalInnerRadius
- // Radius of the inner circle of the interval ring.
- this.intervalInnerRadius = null;
- // prop: intervalOuterRadius
- // Radius of the outer circle of the interval ring.
- this.intervalOuterRadius = null;
- this.tickRenderer = $.jqplot.MeterGaugeTickRenderer;
- // ticks spaced every 1, 2, 2.5, 5, 10, 20, .1, .2, .25, .5, etc.
- this.tickPositions = [1, 2, 2.5, 5, 10];
- // prop: tickSpacing
- // Degrees between ticks. This is a target number, if
- // incompatible span and ticks are supplied, a suitable
- // spacing close to this value will be computed.
- this.tickSpacing = 30;
- this.numberMinorTicks = null;
- // prop: hubRadius
- // Radius of the hub at the bottom center of gauge which the needle attaches to.
- // Auto computed by default
- this.hubRadius = null;
- // prop: tickPadding
- // padding of the tick marks to the outer ring and the tick labels to marks.
- // Auto computed by default.
- this.tickPadding = null;
- // prop: needleThickness
- // Maximum thickness the needle. Auto computed by default.
- this.needleThickness = null;
- // prop: needlePad
- // Padding between needle and inner edge of the ring when the needle is at the min or max gauge value.
- this.needlePad = 6;
- // prop: pegNeedle
- // True will stop needle just below/above the min/max values if data is below/above min/max,
- // as if the meter is "pegged".
- this.pegNeedle = true;
- this._type = 'meterGauge';
-
- $.extend(true, this, options);
- this.type = null;
- this.numberTicks = null;
- this.tickInterval = null;
- // span, the sweep (in degrees) from min to max. This gauge is
- // a semi-circle.
- this.span = 180;
- // get rid of this nonsense
- // this.innerSpan = this.span;
- if (this.type == 'circular') {
- this.semiCircular = false;
- }
- else if (this.type != 'circular') {
- this.semiCircular = true;
- }
- else {
- this.semiCircular = (this.span <= 180) ? true : false;
- }
- this._tickPoints = [];
- // reference to label element.
- this._labelElm = null;
-
- // start the gauge at the beginning of the span
- this.startAngle = (90 + (360 - this.span)/2) * Math.PI/180;
- this.endAngle = (90 - (360 - this.span)/2) * Math.PI/180;
-
- this.setmin = !!(this.min == null);
- this.setmax = !!(this.max == null);
-
- // if given intervals and is an array of values, create labels and colors.
- if (this.intervals.length) {
- if (this.intervals[0].length == null || this.intervals.length == 1) {
- for (var i=0; i= this.data[0][1]) {
- this.max = this.intervals[this.intervals.length-1][0];
- this.setmax = false;
- }
- }
- else {
- this.setmax = false;
- }
- }
-
- else {
- // no ticks and no intervals supplied, put needle in middle
- this.min = (this.min == null) ? 0 : this.min;
- this.setmin = false;
- if (this.max == null) {
- this.max = this.data[0][1] * 1.25;
- this.setmax = true;
- }
- else {
- this.setmax = false;
- }
- }
- };
-
- $.jqplot.MeterGaugeRenderer.prototype.setGridData = function(plot) {
- // set gridData property. This will hold angle in radians of each data point.
- var stack = [];
- var td = [];
- var sa = this.startAngle;
- for (var i=0; i0) {
- stack[i] += stack[i-1];
- }
- }
- var fact = Math.PI*2/stack[stack.length - 1];
-
- for (var i=0; i0) {
- stack[i] += stack[i-1];
- }
- }
- var fact = Math.PI*2/stack[stack.length - 1];
-
- for (var i=0; i=0; i--) {
- temp = interval/(pos[i] * Math.pow(10, fact));
- if (temp == 4 || temp == 5) {
- return temp - 1;
- }
- }
- return null;
- }
-
- // called with scope of series
- $.jqplot.MeterGaugeRenderer.prototype.draw = function (ctx, gd, options) {
- var i;
- var opts = (options != undefined) ? options : {};
- // offset and direction of offset due to legend placement
- var offx = 0;
- var offy = 0;
- var trans = 1;
- if (options.legendInfo && options.legendInfo.placement == 'inside') {
- var li = options.legendInfo;
- switch (li.location) {
- case 'nw':
- offx = li.width + li.xoffset;
- break;
- case 'w':
- offx = li.width + li.xoffset;
- break;
- case 'sw':
- offx = li.width + li.xoffset;
- break;
- case 'ne':
- offx = li.width + li.xoffset;
- trans = -1;
- break;
- case 'e':
- offx = li.width + li.xoffset;
- trans = -1;
- break;
- case 'se':
- offx = li.width + li.xoffset;
- trans = -1;
- break;
- case 'n':
- offy = li.height + li.yoffset;
- break;
- case 's':
- offy = li.height + li.yoffset;
- trans = -1;
- break;
- default:
- break;
- }
- }
-
-
-
- // pre-draw so can get it's dimensions.
- if (this.label) {
- this._labelElem = $(''+this.label+'
');
- this.canvas._elem.after(this._labelElem);
- }
-
- var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;
- var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;
- var fill = (opts.fill != undefined) ? opts.fill : this.fill;
- var cw = ctx.canvas.width;
- var ch = ctx.canvas.height;
- if (this.padding == null) {
- this.padding = Math.round(Math.min(cw, ch)/30);
- }
- var w = cw - offx - 2 * this.padding;
- var h = ch - offy - 2 * this.padding;
- if (this.labelPosition == 'bottom' && this.label) {
- h -= this._labelElem.outerHeight(true);
- }
- var mindim = Math.min(w,h);
- var d = mindim;
-
- if (!this.diameter) {
- if (this.semiCircular) {
- if ( w >= 2*h) {
- if (!this.ringWidth) {
- this.ringWidth = 2*h/35;
- }
- this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8);
- this.innerPad = this.ringWidth/2 + this.needleThickness/2 + this.needlePad;
- this.diameter = 2 * (h - 2*this.innerPad);
- }
- else {
- if (!this.ringWidth) {
- this.ringWidth = w/35;
- }
- this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8);
- this.innerPad = this.ringWidth/2 + this.needleThickness/2 + this.needlePad;
- this.diameter = w - 2*this.innerPad;
- }
- // center taking into account legend and over draw for gauge bottom below hub.
- // this will be center of hub.
- this._center = [(cw - trans * offx)/2 + trans * offx, (ch + trans*offy - this.padding - this.ringWidth - this.innerPad)];
- }
- else {
- if (!this.ringWidth) {
- this.ringWidth = d/35;
- }
- this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8);
- this.innerPad = 0;
- this.diameter = d - this.ringWidth;
- // center in middle of canvas taking into account legend.
- // will be center of hub.
- this._center = [(cw-trans*offx)/2 + trans * offx, (ch-trans*offy)/2 + trans * offy];
- }
- }
-
- if (this._labelElem && this.labelPosition == 'bottom') {
- this._center[1] -= this._labelElem.outerHeight(true);
- }
-
- this._radius = this.diameter/2;
-
- this.tickSpacing = 6000/this.diameter;
-
- if (!this.hubRadius) {
- this.hubRadius = this.diameter/18;
- }
-
- this.shadowOffset = 0.5 + this.ringWidth/9;
- this.shadowWidth = this.ringWidth*1;
-
- this.tickPadding = 3 + Math.pow(this.diameter/20, 0.7);
- this.tickOuterRadius = this._radius - this.ringWidth/2 - this.tickPadding;
- this.tickLength = (this.showTicks) ? this._radius/13 : 0;
-
- if (this.ticks.length == 0) {
- // no ticks, lets make some.
- var max = this.max,
- min = this.min,
- setmax = this.setmax,
- setmin = this.setmin,
- ti = (max - min) * this.tickSpacing / this.span;
- var tf = Math.floor(parseFloat((Math.log(ti)/Math.log(10)).toFixed(11)));
- var tp = (ti/Math.pow(10, tf));
- (tp > 2 && tp <= 2.5) ? tp = 2.5 : tp = Math.ceil(tp);
- var t = this.tickPositions;
- var tpindex, nt;
-
- for (i=0; i 0) ? min - min % ti : min - min % ti - ti;
- if (!this.forceZero) {
- var diff = Math.min(min - tmin, 0.8*ti);
- var ntp = Math.floor(diff/t[tpindex]);
- if (ntp > 1) {
- tmin = tmin + t[tpindex] * (ntp-1);
- if (parseInt(tmin, 10) != tmin && parseInt(tmin-t[tpindex], 10) == tmin-t[tpindex]) {
- tmin = tmin - t[tpindex];
- }
- }
- }
- if (min == tmin) {
- min -= ti;
- }
- else {
- // tmin should always be lower than dataMin
- if (min - tmin > 0.23*ti) {
- min = tmin;
- }
- else {
- min = tmin -ti;
- nt += 1;
- }
- }
- nt += 1;
- var tmax = min + (nt - 1) * ti;
- if (max >= tmax) {
- tmax += ti;
- nt += 1;
- }
- // now tmax should always be mroe than dataMax
- if (tmax - max < 0.23*ti) {
- tmax += ti;
- nt += 1;
- }
- this.max = max = tmax;
- this.min = min;
-
- this.tickInterval = ti;
- this.numberTicks = nt;
- var it;
- for (i=0; i= tmax) {
- max = tmax + ti;
- nt += 1;
- }
- else {
- max = tmax;
- }
-
- this.tickInterval = this.tickInterval || ti;
- this.numberTicks = this.numberTicks || nt;
- var it;
- for (i=0; i 1) {
- var rstr = String(range);
- if (rstr.search(/\./) == -1) {
- var pos = rstr.search(/0+$/);
- nonSigDigits = (pos > 0) ? rstr.length - pos - 1 : 0;
- }
- }
- sigRange = range/Math.pow(10, nonSigDigits);
- for (i=0; i'+this.ticks[i][1]+'');
- this.canvas._elem.after(elem);
- ew = elem.outerWidth(true);
- eh = elem.outerHeight(true);
- l = this._tickPoints[i][0] - ew * (this._tickPoints[i][2]-Math.PI)/Math.PI - tp * Math.cos(this._tickPoints[i][2]);
- t = this._tickPoints[i][1] - eh/2 + eh/2 * Math.pow(Math.abs((Math.sin(this._tickPoints[i][2]))), 0.5) + tp/3 * Math.pow(Math.abs((Math.sin(this._tickPoints[i][2]))), 0.5) ;
- // t = this._tickPoints[i][1] - eh/2 - eh/2 * Math.sin(this._tickPoints[i][2]) - tp/2 * Math.sin(this._tickPoints[i][2]);
- elem.css({left:l, top:t});
- dim = ew*Math.cos(this._tickPoints[i][2]) + eh*Math.sin(Math.PI/2+this._tickPoints[i][2]/2);
- maxdim = (dim > maxdim) ? dim : maxdim;
- }
- }
-
- // draw the gauge label
- if (this.label && this.labelPosition == 'inside') {
- var l = this._center[0] + this.canvas._offsets.left;
- var tp = this.tickPadding * (1 - 1/(this.diameter/80+1));
- var t = 0.5*(this._center[1] + this.canvas._offsets.top - this.hubRadius) + 0.5*(this._center[1] + this.canvas._offsets.top - this.tickOuterRadius + this.tickLength + tp) + this.labelHeightAdjust;
- // this._labelElem = $(''+this.label+'
');
- // this.canvas._elem.after(this._labelElem);
- l -= this._labelElem.outerWidth(true)/2;
- t -= this._labelElem.outerHeight(true)/2;
- this._labelElem.css({left:l, top:t});
- }
-
- else if (this.label && this.labelPosition == 'bottom') {
- var l = this._center[0] + this.canvas._offsets.left - this._labelElem.outerWidth(true)/2;
- var t = this._center[1] + this.canvas._offsets.top + this.innerPad + + this.ringWidth + this.padding + this.labelHeightAdjust;
- this._labelElem.css({left:l, top:t});
-
- }
-
- // draw the intervals
-
- ctx.save();
- var inner = this.intervalInnerRadius || this.hubRadius * 1.5;
- if (this.intervalOuterRadius == null) {
- if (this.showTickLabels) {
- var outer = (this.tickOuterRadius - this.tickLength - this.tickPadding - this.diameter/8);
- }
- else {
- var outer = (this.tickOuterRadius - this.tickLength - this.diameter/16);
- }
- }
- else {
- var outer = this.intervalOuterRadius;
- }
- var range = this.max - this.min;
- var intrange = this.intervals[this.intervals.length-1] - this.min;
- var start, end, span = this.span*Math.PI/180;
- for (i=0; i this.max + dataspan*3/this.span) {
- datapoint = this.max + dataspan*3/this.span;
- }
- if (this.data[0][1] < this.min - dataspan*3/this.span) {
- datapoint = this.min - dataspan*3/this.span;
- }
- }
- var dataang = (datapoint - this.min)/dataspan * this.span * Math.PI/180 + this.startAngle;
-
-
- ctx.save();
- ctx.beginPath();
- ctx.fillStyle = this.ringColor;
- ctx.strokeStyle = this.ringColor;
- this.needleLength = (this.tickOuterRadius - this.tickLength) * 0.85;
- this.needleThickness = (this.needleThickness < 2) ? 2 : this.needleThickness;
- var endwidth = this.needleThickness * 0.4;
-
-
- var dl = this.needleLength/10;
- var dt = (this.needleThickness - endwidth)/10;
- var templ;
- for (var i=0; i<10; i++) {
- templ = this.needleThickness - i*dt;
- ctx.moveTo(dl*i*Math.cos(dataang), dl*i*Math.sin(dataang));
- ctx.lineWidth = templ;
- ctx.lineTo(dl*(i+1)*Math.cos(dataang), dl*(i+1)*Math.sin(dataang));
- ctx.stroke();
- }
-
- ctx.restore();
- }
- else {
- this._center = [(cw - trans * offx)/2 + trans * offx, (ch - trans*offy)/2 + trans * offy];
- }
- };
-
- $.jqplot.MeterGaugeAxisRenderer = function() {
- $.jqplot.LinearAxisRenderer.call(this);
- };
-
- $.jqplot.MeterGaugeAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
- $.jqplot.MeterGaugeAxisRenderer.prototype.constructor = $.jqplot.MeterGaugeAxisRenderer;
-
-
- // There are no traditional axes on a gauge chart. We just need to provide
- // dummy objects with properties so the plot will render.
- // called with scope of axis object.
- $.jqplot.MeterGaugeAxisRenderer.prototype.init = function(options){
- //
- this.tickRenderer = $.jqplot.MeterGaugeTickRenderer;
- $.extend(true, this, options);
- // I don't think I'm going to need _dataBounds here.
- // have to go Axis scaling in a way to fit chart onto plot area
- // and provide u2p and p2u functionality for mouse cursor, etc.
- // for convienence set _dataBounds to 0 and 100 and
- // set min/max to 0 and 100.
- this._dataBounds = {min:0, max:100};
- this.min = 0;
- this.max = 100;
- this.showTicks = false;
- this.ticks = [];
- this.showMark = false;
- this.show = false;
- };
-
- $.jqplot.MeterGaugeLegendRenderer = function(){
- $.jqplot.TableLegendRenderer.call(this);
- };
-
- $.jqplot.MeterGaugeLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();
- $.jqplot.MeterGaugeLegendRenderer.prototype.constructor = $.jqplot.MeterGaugeLegendRenderer;
-
- /**
- * Class: $.jqplot.MeterGaugeLegendRenderer
- *Meter gauges don't typically have a legend, this overrides the default legend renderer.
- */
- $.jqplot.MeterGaugeLegendRenderer.prototype.init = function(options) {
- // Maximum number of rows in the legend. 0 or null for unlimited.
- this.numberRows = null;
- // Maximum number of columns in the legend. 0 or null for unlimited.
- this.numberColumns = null;
- $.extend(true, this, options);
- };
-
- // called with context of legend
- $.jqplot.MeterGaugeLegendRenderer.prototype.draw = function() {
- if (this.show) {
- var series = this._series;
- var ss = 'position:absolute;';
- ss += (this.background) ? 'background:'+this.background+';' : '';
- ss += (this.border) ? 'border:'+this.border+';' : '';
- ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';
- ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';
- ss += (this.textColor) ? 'color:'+this.textColor+';' : '';
- ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : '';
- ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : '';
- ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : '';
- ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : '';
- this._elem = $('');
- // MeterGauge charts legends don't go by number of series, but by number of data points
- // in the series. Refactor things here for that.
-
- var pad = false,
- reverse = false,
- nr, nc;
- var s = series[0];
-
- if (s.show) {
- var pd = s.data;
- if (this.numberRows) {
- nr = this.numberRows;
- if (!this.numberColumns){
- nc = Math.ceil(pd.length/nr);
- }
- else{
- nc = this.numberColumns;
- }
- }
- else if (this.numberColumns) {
- nc = this.numberColumns;
- nr = Math.ceil(pd.length/this.numberColumns);
- }
- else {
- nr = pd.length;
- nc = 1;
- }
-
- var i, j, tr, td1, td2, lt, rs, color;
- var idx = 0;
-
- for (i=0; i').prependTo(this._elem);
- }
- else{
- tr = $('
').appendTo(this._elem);
- }
- for (j=0; j0){
- pad = true;
- }
- else{
- pad = false;
- }
- }
- else{
- if (i == nr -1){
- pad = false;
- }
- else{
- pad = true;
- }
- }
- rs = (pad) ? this.rowSpacing : '0';
-
- td1 = $(''+
- ' | ');
- td2 = $(' | ');
- if (this.escapeHtml){
- td2.text(lt);
- }
- else {
- td2.html(lt);
- }
- if (reverse) {
- td2.prependTo(tr);
- td1.prependTo(tr);
- }
- else {
- td1.appendTo(tr);
- td2.appendTo(tr);
- }
- pad = true;
- }
- idx++;
- }
- }
- }
- }
- return this._elem;
- };
-
-
- // setup default renderers for axes and legend so user doesn't have to
- // called with scope of plot
- function preInit(target, data, options) {
- // debugger
- options = options || {};
- options.axesDefaults = options.axesDefaults || {};
- options.legend = options.legend || {};
- options.seriesDefaults = options.seriesDefaults || {};
- options.grid = options.grid || {};
- options.gridPadding = options.gridPadding || {};
-
- // only set these if there is a gauge series
- var setopts = false;
- if (options.seriesDefaults.renderer == $.jqplot.MeterGaugeRenderer) {
- setopts = true;
- }
- else if (options.series) {
- for (var i=0; i < options.series.length; i++) {
- if (options.series[i].renderer == $.jqplot.MeterGaugeRenderer) {
- setopts = true;
- }
- }
- }
-
- if (setopts) {
- options.axesDefaults.renderer = $.jqplot.MeterGaugeAxisRenderer;
- options.legend.renderer = $.jqplot.MeterGaugeLegendRenderer;
- options.legend.preDraw = true;
- options.grid.background = options.grid.background || 'white';
- options.grid.drawGridlines = false;
- options.grid.borderWidth = (options.grid.borderWidth != null) ? options.grid.borderWidth : 0;
- options.grid.shadow = (options.grid.shadow != null) ? options.grid.shadow : false;
- options.gridPadding.top = (options.gridPadding.top != null) ? options.gridPadding.top : 0;
- options.gridPadding.bottom = (options.gridPadding.bottom != null) ? options.gridPadding.bottom : 0;
- options.gridPadding.left = (options.gridPadding.left != null) ? options.gridPadding.left : 0;
- options.gridPadding.right = (options.gridPadding.right != null) ? options.gridPadding.right : 0;
- }
- }
-
- // called with scope of plot
- function postParseOptions(options) {
- //
- }
-
- $.jqplot.preInitHooks.push(preInit);
- $.jqplot.postParseOptionsHooks.push(postParseOptions);
-
- $.jqplot.MeterGaugeTickRenderer = function() {
- $.jqplot.AxisTickRenderer.call(this);
- };
-
- $.jqplot.MeterGaugeTickRenderer.prototype = new $.jqplot.AxisTickRenderer();
- $.jqplot.MeterGaugeTickRenderer.prototype.constructor = $.jqplot.MeterGaugeTickRenderer;
-
-})(jQuery);
-
-
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.meterGaugeRenderer.min.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.meterGaugeRenderer.min.js
deleted file mode 100644
index ebd89cbf96..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.meterGaugeRenderer.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function(c){c.jqplot.MeterGaugeRenderer=function(){c.jqplot.LineRenderer.call(this)};c.jqplot.MeterGaugeRenderer.prototype=new c.jqplot.LineRenderer();c.jqplot.MeterGaugeRenderer.prototype.constructor=c.jqplot.MeterGaugeRenderer;c.jqplot.MeterGaugeRenderer.prototype.init=function(e){this.diameter=null;this.padding=null;this.shadowOffset=2;this.shadowAlpha=0.07;this.shadowDepth=4;this.background="#efefef";this.ringColor="#BBC6D0";this.needleColor="#C3D3E5";this.tickColor="989898";this.ringWidth=null;this.min;this.max;this.ticks=[];this.showTicks=true;this.showTickLabels=true;this.label=null;this.labelHeightAdjust=0;this.labelPosition="inside";this.intervals=[];this.intervalColors=["#4bb2c5","#EAA228","#c5b47f","#579575","#839557","#958c12","#953579","#4b5de4","#d8b83f","#ff5800","#0085cc","#c747a3","#cddf54","#FBD178","#26B4E3","#bd70c7"];this.intervalInnerRadius=null;this.intervalOuterRadius=null;this.tickRenderer=c.jqplot.MeterGaugeTickRenderer;this.tickPositions=[1,2,2.5,5,10];this.tickSpacing=30;this.numberMinorTicks=null;this.hubRadius=null;this.tickPadding=null;this.needleThickness=null;this.needlePad=6;this.pegNeedle=true;this._type="meterGauge";c.extend(true,this,e);this.type=null;this.numberTicks=null;this.tickInterval=null;this.span=180;if(this.type=="circular"){this.semiCircular=false}else{if(this.type!="circular"){this.semiCircular=true}else{this.semiCircular=(this.span<=180)?true:false}}this._tickPoints=[];this._labelElm=null;this.startAngle=(90+(360-this.span)/2)*Math.PI/180;this.endAngle=(90-(360-this.span)/2)*Math.PI/180;this.setmin=!!(this.min==null);this.setmax=!!(this.max==null);if(this.intervals.length){if(this.intervals[0].length==null||this.intervals.length==1){for(var f=0;f=this.data[0][1]){this.max=this.intervals[this.intervals.length-1][0];this.setmax=false}}else{this.setmax=false}}else{this.min=(this.min==null)?0:this.min;this.setmin=false;if(this.max==null){this.max=this.data[0][1]*1.25;this.setmax=true}else{this.setmax=false}}}};c.jqplot.MeterGaugeRenderer.prototype.setGridData=function(j){var f=[];var k=[];var e=this.startAngle;for(var h=0;h0){f[h]+=f[h-1]}}var g=Math.PI*2/f[f.length-1];for(var h=0;h0){f[h]+=f[h-1]}}var g=Math.PI*2/f[f.length-1];for(var h=0;h=0;h--){e=f/(j[h]*Math.pow(10,g));if(e==4||e==5){return e-1}}return null}c.jqplot.MeterGaugeRenderer.prototype.draw=function(X,aC,ap){var aa;var aM=(ap!=undefined)?ap:{};var ai=0;var ah=0;var at=1;if(ap.legendInfo&&ap.legendInfo.placement=="inside"){var aI=ap.legendInfo;switch(aI.location){case"nw":ai=aI.width+aI.xoffset;break;case"w":ai=aI.width+aI.xoffset;break;case"sw":ai=aI.width+aI.xoffset;break;case"ne":ai=aI.width+aI.xoffset;at=-1;break;case"e":ai=aI.width+aI.xoffset;at=-1;break;case"se":ai=aI.width+aI.xoffset;at=-1;break;case"n":ah=aI.height+aI.yoffset;break;case"s":ah=aI.height+aI.yoffset;at=-1;break;default:break}}if(this.label){this._labelElem=c(''+this.label+"
");this.canvas._elem.after(this._labelElem)}var m=(aM.shadow!=undefined)?aM.shadow:this.shadow;var N=(aM.showLine!=undefined)?aM.showLine:this.showLine;var I=(aM.fill!=undefined)?aM.fill:this.fill;var K=X.canvas.width;var S=X.canvas.height;if(this.padding==null){this.padding=Math.round(Math.min(K,S)/30)}var Q=K-ai-2*this.padding;var ab=S-ah-2*this.padding;if(this.labelPosition=="bottom"&&this.label){ab-=this._labelElem.outerHeight(true)}var L=Math.min(Q,ab);var ad=L;if(!this.diameter){if(this.semiCircular){if(Q>=2*ab){if(!this.ringWidth){this.ringWidth=2*ab/35}this.needleThickness=this.needleThickness||2+Math.pow(this.ringWidth,0.8);this.innerPad=this.ringWidth/2+this.needleThickness/2+this.needlePad;this.diameter=2*(ab-2*this.innerPad)}else{if(!this.ringWidth){this.ringWidth=Q/35}this.needleThickness=this.needleThickness||2+Math.pow(this.ringWidth,0.8);this.innerPad=this.ringWidth/2+this.needleThickness/2+this.needlePad;this.diameter=Q-2*this.innerPad}this._center=[(K-at*ai)/2+at*ai,(S+at*ah-this.padding-this.ringWidth-this.innerPad)]}else{if(!this.ringWidth){this.ringWidth=ad/35}this.needleThickness=this.needleThickness||2+Math.pow(this.ringWidth,0.8);this.innerPad=0;this.diameter=ad-this.ringWidth;this._center=[(K-at*ai)/2+at*ai,(S-at*ah)/2+at*ah]}}if(this._labelElem&&this.labelPosition=="bottom"){this._center[1]-=this._labelElem.outerHeight(true)}this._radius=this.diameter/2;this.tickSpacing=6000/this.diameter;if(!this.hubRadius){this.hubRadius=this.diameter/18}this.shadowOffset=0.5+this.ringWidth/9;this.shadowWidth=this.ringWidth*1;this.tickPadding=3+Math.pow(this.diameter/20,0.7);this.tickOuterRadius=this._radius-this.ringWidth/2-this.tickPadding;this.tickLength=(this.showTicks)?this._radius/13:0;if(this.ticks.length==0){var A=this.max,aL=this.min,q=this.setmax,aG=this.setmin,au=(A-aL)*this.tickSpacing/this.span;var aw=Math.floor(parseFloat((Math.log(au)/Math.log(10)).toFixed(11)));var an=(au/Math.pow(10,aw));(an>2&&an<=2.5)?an=2.5:an=Math.ceil(an);var T=this.tickPositions;var aA,ak;for(aa=0;aa0)?aL-aL%au:aL-aL%au-au;if(!this.forceZero){var D=Math.min(aL-aP,0.8*au);var o=Math.floor(D/T[aA]);if(o>1){aP=aP+T[aA]*(o-1);if(parseInt(aP,10)!=aP&&parseInt(aP-T[aA],10)==aP-T[aA]){aP=aP-T[aA]}}}if(aL==aP){aL-=au}else{if(aL-aP>0.23*au){aL=aP}else{aL=aP-au;ak+=1}}ak+=1;var E=aL+(ak-1)*au;if(A>=E){E+=au;ak+=1}if(E-A<0.23*au){E+=au;ak+=1}this.max=A=E;this.min=aL;this.tickInterval=au;this.numberTicks=ak;var O;for(aa=0;aa=E){A=E+au;ak+=1}else{A=E}this.tickInterval=this.tickInterval||au;this.numberTicks=this.numberTicks||ak;var O;for(aa=0;aa1){var aJ=String(P);if(aJ.search(/\./)==-1){var aF=aJ.search(/0+$/);av=(aF>0)?aJ.length-aF-1:0}}M=P/Math.pow(10,av);for(aa=0;aa'+this.ticks[aa][1]+"");this.canvas._elem.after(J);aO=J.outerWidth(true);g=J.outerHeight(true);W=this._tickPoints[aa][0]-aO*(this._tickPoints[aa][2]-Math.PI)/Math.PI-an*Math.cos(this._tickPoints[aa][2]);T=this._tickPoints[aa][1]-g/2+g/2*Math.pow(Math.abs((Math.sin(this._tickPoints[aa][2]))),0.5)+an/3*Math.pow(Math.abs((Math.sin(this._tickPoints[aa][2]))),0.5);J.css({left:W,top:T});G=aO*Math.cos(this._tickPoints[aa][2])+g*Math.sin(Math.PI/2+this._tickPoints[aa][2]/2);n=(G>n)?G:n}}if(this.label&&this.labelPosition=="inside"){var W=this._center[0]+this.canvas._offsets.left;var an=this.tickPadding*(1-1/(this.diameter/80+1));var T=0.5*(this._center[1]+this.canvas._offsets.top-this.hubRadius)+0.5*(this._center[1]+this.canvas._offsets.top-this.tickOuterRadius+this.tickLength+an)+this.labelHeightAdjust;W-=this._labelElem.outerWidth(true)/2;T-=this._labelElem.outerHeight(true)/2;this._labelElem.css({left:W,top:T})}else{if(this.label&&this.labelPosition=="bottom"){var W=this._center[0]+this.canvas._offsets.left-this._labelElem.outerWidth(true)/2;var T=this._center[1]+this.canvas._offsets.top+this.innerPad+ +this.ringWidth+this.padding+this.labelHeightAdjust;this._labelElem.css({left:W,top:T})}}X.save();var ax=this.intervalInnerRadius||this.hubRadius*1.5;if(this.intervalOuterRadius==null){if(this.showTickLabels){var ag=(this.tickOuterRadius-this.tickLength-this.tickPadding-this.diameter/8)}else{var ag=(this.tickOuterRadius-this.tickLength-this.diameter/16)}}else{var ag=this.intervalOuterRadius}var P=this.max-this.min;var aD=this.intervals[this.intervals.length-1]-this.min;var y,Z,u=this.span*Math.PI/180;for(aa=0;aathis.max+R*3/this.span){ay=this.max+R*3/this.span}if(this.data[0][1]');var f=false,q=false,u,o;var w=p[0];if(w.show){var t=w.data;if(this.numberRows){u=this.numberRows;if(!this.numberColumns){o=Math.ceil(t.length/u)}else{o=this.numberColumns}}else{if(this.numberColumns){o=this.numberColumns;u=Math.ceil(t.length/this.numberColumns)}else{u=t.length;o=1}}var n,m,r,g,e,l,k,h;var v=0;for(n=0;n').prependTo(this._elem)}else{r=c('
').appendTo(this._elem)}for(m=0;m0){f=true}else{f=false}}else{if(n==u-1){f=false}else{f=true}}k=(f)?this.rowSpacing:"0";g=c(' | ');e=c(' | ');if(this.escapeHtml){e.text(l)}else{e.html(l)}if(q){e.prependTo(r);g.prependTo(r)}else{g.appendTo(r);e.appendTo(r)}f=true}v++}}}}return this._elem};function a(j,h,f){f=f||{};f.axesDefaults=f.axesDefaults||{};f.legend=f.legend||{};f.seriesDefaults=f.seriesDefaults||{};f.grid=f.grid||{};f.gridPadding=f.gridPadding||{};var e=false;if(f.seriesDefaults.renderer==c.jqplot.MeterGaugeRenderer){e=true}else{if(f.series){for(var g=0;g
- *
- * You will most likely want to use a date axis renderer
- * for the x axis also, so include the date axis render js file also:
- *
- * >
- *
- * Then you set the renderer in the series options on your plot:
- *
- * > series: [{renderer:$.jqplot.OHLCRenderer}]
- *
- * For OHLC and candlestick charts, data should be specified
- * like so:
- *
- * > dat = [['07/06/2009',138.7,139.68,135.18,135.4], ['06/29/2009',143.46,144.66,139.79,140.02], ...]
- *
- * If the data array has only 4 values per point instead of 5,
- * the renderer will create a Hi Low Close chart instead. In that case,
- * data should be supplied like:
- *
- * > dat = [['07/06/2009',139.68,135.18,135.4], ['06/29/2009',144.66,139.79,140.02], ...]
- *
- * To generate a candlestick chart instead of an OHLC chart,
- * set the "candlestick" option to true:
- *
- * > series: [{renderer:$.jqplot.OHLCRenderer, rendererOptions:{candleStick:true}}],
- *
- */
- $.jqplot.OHLCRenderer = function(){
- // subclass line renderer to make use of some of it's methods.
- $.jqplot.LineRenderer.call(this);
- // prop: candleStick
- // true to render chart as candleStick.
- // Must have an open price, cannot be a hlc chart.
- this.candleStick = false;
- // prop: tickLength
- // length of the line in pixels indicating open and close price.
- // Default will auto calculate based on plot width and
- // number of points displayed.
- this.tickLength = 'auto';
- // prop: bodyWidth
- // width of the candlestick body in pixels. Default will auto calculate
- // based on plot width and number of candlesticks displayed.
- this.bodyWidth = 'auto';
- // prop: openColor
- // color of the open price tick mark. Default is series color.
- this.openColor = null;
- // prop: closeColor
- // color of the close price tick mark. Default is series color.
- this.closeColor = null;
- // prop: wickColor
- // color of the hi-lo line thorugh the candlestick body.
- // Default is the series color.
- this.wickColor = null;
- // prop: fillUpBody
- // true to render an "up" day (close price greater than open price)
- // with a filled candlestick body.
- this.fillUpBody = false;
- // prop: fillDownBody
- // true to render a "down" day (close price lower than open price)
- // with a filled candlestick body.
- this.fillDownBody = true;
- // prop: upBodyColor
- // Color of candlestick body of an "up" day. Default is series color.
- this.upBodyColor = null;
- // prop: downBodyColor
- // Color of candlestick body on a "down" day. Default is series color.
- this.downBodyColor = null;
- // prop: hlc
- // true if is a hi-low-close chart (no open price).
- // This is determined automatically from the series data.
- this.hlc = false;
- // prop: lineWidth
- // Width of the hi-low line and open/close ticks.
- // Must be set in the rendererOptions for the series.
- this.lineWidth = 1.5;
- this._tickLength;
- this._bodyWidth;
- };
-
- $.jqplot.OHLCRenderer.prototype = new $.jqplot.LineRenderer();
- $.jqplot.OHLCRenderer.prototype.constructor = $.jqplot.OHLCRenderer;
-
- // called with scope of series.
- $.jqplot.OHLCRenderer.prototype.init = function(options) {
- options = options || {};
- // lineWidth has to be set on the series, changes in renderer
- // constructor have no effect. set the default here
- // if no renderer option for lineWidth is specified.
- this.lineWidth = options.lineWidth || 1.5;
- $.jqplot.LineRenderer.prototype.init.call(this, options);
- this._type = 'ohlc';
- // set the yaxis data bounds here to account for hi and low values
- var db = this._yaxis._dataBounds;
- var d = this._plotData;
- // if data points have less than 5 values, force a hlc chart.
- if (d[0].length < 5) {
- this.renderer.hlc = true;
-
- for (var j=0; j db.max || db.max == null) {
- db.max = d[j][1];
- }
- }
- }
- else {
- for (var j=0; j db.max || db.max == null) {
- db.max = d[j][2];
- }
- }
- }
-
- };
-
- // called within scope of series.
- $.jqplot.OHLCRenderer.prototype.draw = function(ctx, gd, options) {
- var d = this.data;
- var xmin = this._xaxis.min;
- var xmax = this._xaxis.max;
- // index of last value below range of plot.
- var xminidx = 0;
- // index of first value above range of plot.
- var xmaxidx = d.length;
- var xp = this._xaxis.series_u2p;
- var yp = this._yaxis.series_u2p;
- var i, prevColor, ops, b, h, w, a, points;
- var o;
- var r = this.renderer;
- var opts = (options != undefined) ? options : {};
- var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;
- var fill = (opts.fill != undefined) ? opts.fill : this.fill;
- var fillAndStroke = (opts.fillAndStroke != undefined) ? opts.fillAndStroke : this.fillAndStroke;
- r.bodyWidth = (opts.bodyWidth != undefined) ? opts.bodyWidth : r.bodyWidth;
- r.tickLength = (opts.tickLength != undefined) ? opts.tickLength : r.tickLength;
- ctx.save();
- if (this.show) {
- var x, open, hi, low, close;
- // need to get widths based on number of points shown,
- // not on total number of points. Use the results
- // to speed up drawing in next step.
- for (var i=0; i open) {
- // draw wick
- if (r.wickColor) {
- o.color = r.wickColor;
- }
- else if (r.downBodyColor) {
- o.color = r.downBodyColor;
- }
- ops = $.extend(true, {}, opts, o);
- r.shapeRenderer.draw(ctx, [[x, hi], [x, open]], ops);
- r.shapeRenderer.draw(ctx, [[x, close], [x, low]], ops);
-
- o = {};
-
- b = open;
- h = close - open;
- // if color specified, use it
- if (r.fillDownBody) {
- o.fillRect = true;
- }
- else {
- o.strokeRect = true;
- w = w - this.lineWidth;
- a = x - w/2;
- }
- if (r.downBodyColor) {
- o.color = r.downBodyColor;
- o.fillStyle = r.downBodyColor;
- }
- points = [a, b, w, h];
- }
- // even, open = close
- else {
- // draw wick
- if (r.wickColor) {
- o.color = r.wickColor;
- }
- ops = $.extend(true, {}, opts, o);
- r.shapeRenderer.draw(ctx, [[x, hi], [x, low]], ops);
- o = {};
- o.fillRect = false;
- o.strokeRect = false;
- a = [x - w/2, open];
- b = [x + w/2, close];
- w = null;
- h = null;
- points = [a, b];
- }
- ops = $.extend(true, {}, opts, o);
- r.shapeRenderer.draw(ctx, points, ops);
- }
- else {
- prevColor = opts.color;
- if (r.openColor) {
- opts.color = r.openColor;
- }
- // draw open tick
- if (!r.hlc) {
- r.shapeRenderer.draw(ctx, [[x-r._tickLength, open], [x, open]], opts);
- }
- opts.color = prevColor;
- // draw wick
- if (r.wickColor) {
- opts.color = r.wickColor;
- }
- r.shapeRenderer.draw(ctx, [[x, hi], [x, low]], opts);
- opts.color = prevColor;
- // draw close tick
- if (r.closeColor) {
- opts.color = r.closeColor;
- }
- r.shapeRenderer.draw(ctx, [[x, close], [x+r._tickLength, close]], opts);
- opts.color = prevColor;
- }
- }
- }
-
- ctx.restore();
- };
-
- $.jqplot.OHLCRenderer.prototype.drawShadow = function(ctx, gd, options) {
- // This is a no-op, shadows drawn with lines.
- };
-
- // called with scope of plot.
- $.jqplot.OHLCRenderer.checkOptions = function(target, data, options) {
- // provide some sensible highlighter options by default
- // These aren't good for hlc, only for ohlc or candlestick
- if (!options.highlighter) {
- options.highlighter = {
- showMarker:false,
- tooltipAxes: 'y',
- yvalues: 4,
- formatString:'| date: | %s |
| open: | %s |
| hi: | %s |
| low: | %s |
| close: | %s |
'
- };
- }
- };
-
- //$.jqplot.preInitHooks.push($.jqplot.OHLCRenderer.checkOptions);
-
-})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.ohlcRenderer.min.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.ohlcRenderer.min.js
deleted file mode 100644
index 97a265a310..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.ohlcRenderer.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function(a){a.jqplot.OHLCRenderer=function(){a.jqplot.LineRenderer.call(this);this.candleStick=false;this.tickLength="auto";this.bodyWidth="auto";this.openColor=null;this.closeColor=null;this.wickColor=null;this.fillUpBody=false;this.fillDownBody=true;this.upBodyColor=null;this.downBodyColor=null;this.hlc=false;this.lineWidth=1.5;this._tickLength;this._bodyWidth};a.jqplot.OHLCRenderer.prototype=new a.jqplot.LineRenderer();a.jqplot.OHLCRenderer.prototype.constructor=a.jqplot.OHLCRenderer;a.jqplot.OHLCRenderer.prototype.init=function(e){e=e||{};this.lineWidth=e.lineWidth||1.5;a.jqplot.LineRenderer.prototype.init.call(this,e);this._type="ohlc";var b=this._yaxis._dataBounds;var f=this._plotData;if(f[0].length<5){this.renderer.hlc=true;for(var c=0;cb.max||b.max==null){b.max=f[c][1]}}}else{for(var c=0;cb.max||b.max==null){b.max=f[c][2]}}}};a.jqplot.OHLCRenderer.prototype.draw=function(A,N,j){var J=this.data;var v=this._xaxis.min;var z=this._xaxis.max;var l=0;var K=J.length;var p=this._xaxis.series_u2p;var G=this._yaxis.series_u2p;var D,E,f,M,F,n,O,C;var y;var u=this.renderer;var s=(j!=undefined)?j:{};var k=(s.shadow!=undefined)?s.shadow:this.shadow;var B=(s.fill!=undefined)?s.fill:this.fill;var c=(s.fillAndStroke!=undefined)?s.fillAndStroke:this.fillAndStroke;u.bodyWidth=(s.bodyWidth!=undefined)?s.bodyWidth:u.bodyWidth;u.tickLength=(s.tickLength!=undefined)?s.tickLength:u.tickLength;A.save();if(this.show){var m,q,g,Q,t;for(var D=0;Dq){if(u.wickColor){y.color=u.wickColor}else{if(u.downBodyColor){y.color=u.downBodyColor}}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,[[m,g],[m,q]],f);u.shapeRenderer.draw(A,[[m,t],[m,Q]],f);y={};M=q;F=t-q;if(u.fillDownBody){y.fillRect=true}else{y.strokeRect=true;n=n-this.lineWidth;O=m-n/2}if(u.downBodyColor){y.color=u.downBodyColor;y.fillStyle=u.downBodyColor}C=[O,M,n,F]}else{if(u.wickColor){y.color=u.wickColor}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,[[m,g],[m,Q]],f);y={};y.fillRect=false;y.strokeRect=false;O=[m-n/2,q];M=[m+n/2,t];n=null;F=null;C=[O,M]}}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,C,f)}else{E=s.color;if(u.openColor){s.color=u.openColor}if(!u.hlc){u.shapeRenderer.draw(A,[[m-u._tickLength,q],[m,q]],s)}s.color=E;if(u.wickColor){s.color=u.wickColor}u.shapeRenderer.draw(A,[[m,g],[m,Q]],s);s.color=E;if(u.closeColor){s.color=u.closeColor}u.shapeRenderer.draw(A,[[m,t],[m+u._tickLength,t]],s);s.color=E}}}A.restore()};a.jqplot.OHLCRenderer.prototype.drawShadow=function(b,d,c){};a.jqplot.OHLCRenderer.checkOptions=function(d,c,b){if(!b.highlighter){b.highlighter={showMarker:false,tooltipAxes:"y",yvalues:4,formatString:'| date: | %s |
| open: | %s |
| hi: | %s |
| low: | %s |
| close: | %s |
'}}}})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.pieRenderer.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.pieRenderer.js
deleted file mode 100644
index 4aa7340aac..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.pieRenderer.js
+++ /dev/null
@@ -1,898 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function($) {
- /**
- * Class: $.jqplot.PieRenderer
- * Plugin renderer to draw a pie chart.
- * x values, if present, will be used as slice labels.
- * y values give slice size.
- *
- * To use this renderer, you need to include the
- * pie renderer plugin, for example:
- *
- * >
- *
- * Properties described here are passed into the $.jqplot function
- * as options on the series renderer. For example:
- *
- * > plot2 = $.jqplot('chart2', [s1, s2], {
- * > seriesDefaults: {
- * > renderer:$.jqplot.PieRenderer,
- * > rendererOptions:{
- * > sliceMargin: 2,
- * > startAngle: -90
- * > }
- * > }
- * > });
- *
- * A pie plot will trigger events on the plot target
- * according to user interaction. All events return the event object,
- * the series index, the point (slice) index, and the point data for
- * the appropriate slice.
- *
- * 'jqplotDataMouseOver' - triggered when user mouseing over a slice.
- * 'jqplotDataHighlight' - triggered the first time user mouses over a slice,
- * if highlighting is enabled.
- * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of
- * a highlighted slice.
- * 'jqplotDataClick' - triggered when the user clicks on a slice.
- * 'jqplotDataRightClick' - tiggered when the user right clicks on a slice if
- * the "captureRightClick" option is set to true on the plot.
- */
- $.jqplot.PieRenderer = function(){
- $.jqplot.LineRenderer.call(this);
- };
-
- $.jqplot.PieRenderer.prototype = new $.jqplot.LineRenderer();
- $.jqplot.PieRenderer.prototype.constructor = $.jqplot.PieRenderer;
-
- // called with scope of a series
- $.jqplot.PieRenderer.prototype.init = function(options, plot) {
- // Group: Properties
- //
- // prop: diameter
- // Outer diameter of the pie, auto computed by default
- this.diameter = null;
- // prop: padding
- // padding between the pie and plot edges, legend, etc.
- this.padding = 20;
- // prop: sliceMargin
- // angular spacing between pie slices in degrees.
- this.sliceMargin = 0;
- // prop: fill
- // true or false, wether to fil the slices.
- this.fill = true;
- // prop: shadowOffset
- // offset of the shadow from the slice and offset of
- // each succesive stroke of the shadow from the last.
- this.shadowOffset = 2;
- // prop: shadowAlpha
- // transparency of the shadow (0 = transparent, 1 = opaque)
- this.shadowAlpha = 0.07;
- // prop: shadowDepth
- // number of strokes to apply to the shadow,
- // each stroke offset shadowOffset from the last.
- this.shadowDepth = 5;
- // prop: highlightMouseOver
- // True to highlight slice when moused over.
- // This must be false to enable highlightMouseDown to highlight when clicking on a slice.
- this.highlightMouseOver = true;
- // prop: highlightMouseDown
- // True to highlight when a mouse button is pressed over a slice.
- // This will be disabled if highlightMouseOver is true.
- this.highlightMouseDown = false;
- // prop: highlightColors
- // an array of colors to use when highlighting a slice.
- this.highlightColors = [];
- // prop: dataLabels
- // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices.
- // Defaults to percentage of each pie slice.
- this.dataLabels = 'percent';
- // prop: showDataLabels
- // true to show data labels on slices.
- this.showDataLabels = false;
- // prop: dataLabelFormatString
- // Format string for data labels. If none, '%s' is used for "label" and for arrays, '%d' for value and '%d%%' for percentage.
- this.dataLabelFormatString = null;
- // prop: dataLabelThreshold
- // Threshhold in percentage (0-100) of pie area, below which no label will be displayed.
- // This applies to all label types, not just to percentage labels.
- this.dataLabelThreshold = 3;
- // prop: dataLabelPositionFactor
- // A Multiplier (0-1) of the pie radius which controls position of label on slice.
- // Increasing will slide label toward edge of pie, decreasing will slide label toward center of pie.
- this.dataLabelPositionFactor = 0.52;
- // prop: dataLabelNudge
- // Number of pixels to slide the label away from (+) or toward (-) the center of the pie.
- this.dataLabelNudge = 2;
- // prop: dataLabelCenterOn
- // True to center the data label at its position.
- // False to set the inside facing edge of the label at its position.
- this.dataLabelCenterOn = true;
- // prop: startAngle
- // Angle to start drawing pie in degrees.
- // According to orientation of canvas coordinate system:
- // 0 = on the positive x axis
- // -90 = on the positive y axis.
- // 90 = on the negaive y axis.
- // 180 or - 180 = on the negative x axis.
- this.startAngle = 0;
- this.tickRenderer = $.jqplot.PieTickRenderer;
- // Used as check for conditions where pie shouldn't be drawn.
- this._drawData = true;
- this._type = 'pie';
-
- // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver
- if (options.highlightMouseDown && options.highlightMouseOver == null) {
- options.highlightMouseOver = false;
- }
-
- $.extend(true, this, options);
-
- if (this.sliceMargin < 0) {
- this.sliceMargin = 0;
- }
-
- this._diameter = null;
- this._radius = null;
- // array of [start,end] angles arrays, one for each slice. In radians.
- this._sliceAngles = [];
- // index of the currenty highlighted point, if any
- this._highlightedPoint = null;
-
- // set highlight colors if none provided
- if (this.highlightColors.length == 0) {
- for (var i=0; i 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);
- newrgb[j] = parseInt(newrgb[j], 10);
- }
- this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')');
- }
- }
-
- this.highlightColorGenerator = new $.jqplot.ColorGenerator(this.highlightColors);
-
- plot.postParseOptionsHooks.addOnce(postParseOptions);
- plot.postInitHooks.addOnce(postInit);
- plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);
- plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);
- plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);
- plot.eventListenerHooks.addOnce('jqplotClick', handleClick);
- plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);
- plot.postDrawHooks.addOnce(postPlotDraw);
- };
-
- $.jqplot.PieRenderer.prototype.setGridData = function(plot) {
- // set gridData property. This will hold angle in radians of each data point.
- var stack = [];
- var td = [];
- var sa = this.startAngle/180*Math.PI;
- var tot = 0;
- // don't know if we have any valid data yet, so set plot to not draw.
- this._drawData = false;
- for (var i=0; i0) {
- stack[i] += stack[i-1];
- }
- tot += this.data[i][1];
- }
- var fact = Math.PI*2/stack[stack.length - 1];
-
- for (var i=0; i0) {
- stack[i] += stack[i-1];
- }
- tot += data[i][1];
- }
- var fact = Math.PI*2/stack[stack.length - 1];
-
- for (var i=0; i 0 && absang > 0.01 && absang < 6.282) {
- rprime = parseFloat(sm) / 2.0 / calcRadiusAdjustment(ang);
- }
-
- return rprime;
- }
-
- $.jqplot.PieRenderer.prototype.drawSlice = function (ctx, ang1, ang2, color, isShadow) {
- if (this._drawData) {
- var r = this._radius;
- var fill = this.fill;
- var lineWidth = this.lineWidth;
- var sm = this.sliceMargin;
- if (this.fill == false) {
- sm += this.lineWidth;
- }
- ctx.save();
- ctx.translate(this._center[0], this._center[1]);
-
- var rprime = calcRPrime(ang1, ang2, this.sliceMargin, this.fill, this.lineWidth);
-
- var transx = rprime * Math.cos((ang1 + ang2) / 2.0);
- var transy = rprime * Math.sin((ang1 + ang2) / 2.0);
-
- if ((ang2 - ang1) <= Math.PI) {
- r -= rprime;
- }
- else {
- r += rprime;
- }
-
- ctx.translate(transx, transy);
-
- if (isShadow) {
- for (var i=0, l=this.shadowDepth; i 6.282 + this.startAngle) {
- ang2 = 6.282 + this.startAngle;
- if (ang1 > ang2) {
- ang1 = 6.281 + this.startAngle;
- }
- }
- // Fix for IE, where it can't seem to handle 0 degree angles. Also avoids
- // ugly line on unfilled pies.
- if (ang1 >= ang2) {
- return;
- }
-
- ctx.beginPath();
- ctx.fillStyle = color;
- ctx.strokeStyle = color;
- ctx.lineWidth = lineWidth;
- ctx.arc(0, 0, rad, ang1, ang2, false);
- ctx.lineTo(0,0);
- ctx.closePath();
-
- if (fill) {
- ctx.fill();
- }
- else {
- ctx.stroke();
- }
- }
- };
-
- // called with scope of series
- $.jqplot.PieRenderer.prototype.draw = function (ctx, gd, options, plot) {
- var i;
- var opts = (options != undefined) ? options : {};
- // offset and direction of offset due to legend placement
- var offx = 0;
- var offy = 0;
- var trans = 1;
- var colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors);
- if (options.legendInfo && options.legendInfo.placement == 'insideGrid') {
- var li = options.legendInfo;
- switch (li.location) {
- case 'nw':
- offx = li.width + li.xoffset;
- break;
- case 'w':
- offx = li.width + li.xoffset;
- break;
- case 'sw':
- offx = li.width + li.xoffset;
- break;
- case 'ne':
- offx = li.width + li.xoffset;
- trans = -1;
- break;
- case 'e':
- offx = li.width + li.xoffset;
- trans = -1;
- break;
- case 'se':
- offx = li.width + li.xoffset;
- trans = -1;
- break;
- case 'n':
- offy = li.height + li.yoffset;
- break;
- case 's':
- offy = li.height + li.yoffset;
- trans = -1;
- break;
- default:
- break;
- }
- }
-
- var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;
- var fill = (opts.fill != undefined) ? opts.fill : this.fill;
- var cw = ctx.canvas.width;
- var ch = ctx.canvas.height;
- var w = cw - offx - 2 * this.padding;
- var h = ch - offy - 2 * this.padding;
- var mindim = Math.min(w,h);
- var d = mindim;
-
- // Fixes issue #272. Thanks hugwijst!
- // reset slice angles array.
- this._sliceAngles = [];
-
- var sm = this.sliceMargin;
- if (this.fill == false) {
- sm += this.lineWidth;
- }
-
- var rprime;
- var maxrprime = 0;
-
- var ang, ang1, ang2, shadowColor;
- var sa = this.startAngle / 180 * Math.PI;
-
- // have to pre-draw shadows, so loop throgh here and calculate some values also.
- for (var i=0, l=gd.length; i Math.PI) {
- maxrprime = Math.max(rprime, maxrprime);
- }
- }
-
- if (this.diameter != null && this.diameter > 0) {
- this._diameter = this.diameter - 2*maxrprime;
- }
- else {
- this._diameter = d - 2*maxrprime;
- }
-
- // Need to check for undersized pie. This can happen if
- // plot area too small and legend is too big.
- if (this._diameter < 6) {
- $.jqplot.log('Diameter of pie too small, not rendering.');
- return;
- }
-
- var r = this._radius = this._diameter/2;
-
- this._center = [(cw - trans * offx)/2 + trans * offx + maxrprime * Math.cos(sa), (ch - trans*offy)/2 + trans * offy + maxrprime * Math.sin(sa)];
-
- if (this.shadow) {
- for (var i=0, l=gd.length; i= this.dataLabelThreshold) {
- var fstr, avgang = (this._sliceAngles[i][0] + this._sliceAngles[i][1])/2, label;
-
- if (this.dataLabels == 'label') {
- fstr = this.dataLabelFormatString || '%s';
- label = $.jqplot.sprintf(fstr, gd[i][0]);
- }
- else if (this.dataLabels == 'value') {
- fstr = this.dataLabelFormatString || '%d';
- label = $.jqplot.sprintf(fstr, this.data[i][1]);
- }
- else if (this.dataLabels == 'percent') {
- fstr = this.dataLabelFormatString || '%d%%';
- label = $.jqplot.sprintf(fstr, gd[i][2]*100);
- }
- else if (this.dataLabels.constructor == Array) {
- fstr = this.dataLabelFormatString || '%s';
- label = $.jqplot.sprintf(fstr, this.dataLabels[i]);
- }
-
- var fact = (this._radius ) * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge;
-
- var x = this._center[0] + Math.cos(avgang) * fact + this.canvas._offsets.left;
- var y = this._center[1] + Math.sin(avgang) * fact + this.canvas._offsets.top;
-
- var labelelem = $('' + label + '
').insertBefore(plot.eventCanvas._elem);
- if (this.dataLabelCenterOn) {
- x -= labelelem.width()/2;
- y -= labelelem.height()/2;
- }
- else {
- x -= labelelem.width() * Math.sin(avgang/2);
- y -= labelelem.height()/2;
- }
- x = Math.round(x);
- y = Math.round(y);
- labelelem.css({left: x, top: y});
- }
- }
- };
-
- $.jqplot.PieAxisRenderer = function() {
- $.jqplot.LinearAxisRenderer.call(this);
- };
-
- $.jqplot.PieAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
- $.jqplot.PieAxisRenderer.prototype.constructor = $.jqplot.PieAxisRenderer;
-
-
- // There are no traditional axes on a pie chart. We just need to provide
- // dummy objects with properties so the plot will render.
- // called with scope of axis object.
- $.jqplot.PieAxisRenderer.prototype.init = function(options){
- //
- this.tickRenderer = $.jqplot.PieTickRenderer;
- $.extend(true, this, options);
- // I don't think I'm going to need _dataBounds here.
- // have to go Axis scaling in a way to fit chart onto plot area
- // and provide u2p and p2u functionality for mouse cursor, etc.
- // for convienence set _dataBounds to 0 and 100 and
- // set min/max to 0 and 100.
- this._dataBounds = {min:0, max:100};
- this.min = 0;
- this.max = 100;
- this.showTicks = false;
- this.ticks = [];
- this.showMark = false;
- this.show = false;
- };
-
-
-
-
- $.jqplot.PieLegendRenderer = function(){
- $.jqplot.TableLegendRenderer.call(this);
- };
-
- $.jqplot.PieLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();
- $.jqplot.PieLegendRenderer.prototype.constructor = $.jqplot.PieLegendRenderer;
-
- /**
- * Class: $.jqplot.PieLegendRenderer
- * Legend Renderer specific to pie plots. Set by default
- * when user creates a pie plot.
- */
- $.jqplot.PieLegendRenderer.prototype.init = function(options) {
- // Group: Properties
- //
- // prop: numberRows
- // Maximum number of rows in the legend. 0 or null for unlimited.
- this.numberRows = null;
- // prop: numberColumns
- // Maximum number of columns in the legend. 0 or null for unlimited.
- this.numberColumns = null;
- $.extend(true, this, options);
- };
-
- // called with context of legend
- $.jqplot.PieLegendRenderer.prototype.draw = function() {
- var legend = this;
- if (this.show) {
- var series = this._series;
-
-
- this._elem = $(document.createElement('table'));
- this._elem.addClass('jqplot-table-legend');
-
- var ss = {position:'absolute'};
- if (this.background) {
- ss['background'] = this.background;
- }
- if (this.border) {
- ss['border'] = this.border;
- }
- if (this.fontSize) {
- ss['fontSize'] = this.fontSize;
- }
- if (this.fontFamily) {
- ss['fontFamily'] = this.fontFamily;
- }
- if (this.textColor) {
- ss['textColor'] = this.textColor;
- }
- if (this.marginTop != null) {
- ss['marginTop'] = this.marginTop;
- }
- if (this.marginBottom != null) {
- ss['marginBottom'] = this.marginBottom;
- }
- if (this.marginLeft != null) {
- ss['marginLeft'] = this.marginLeft;
- }
- if (this.marginRight != null) {
- ss['marginRight'] = this.marginRight;
- }
-
- this._elem.css(ss);
-
- // Pie charts legends don't go by number of series, but by number of data points
- // in the series. Refactor things here for that.
-
- var pad = false,
- reverse = false,
- nr,
- nc;
- var s = series[0];
- var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors);
-
- if (s.show) {
- var pd = s.data;
- if (this.numberRows) {
- nr = this.numberRows;
- if (!this.numberColumns){
- nc = Math.ceil(pd.length/nr);
- }
- else{
- nc = this.numberColumns;
- }
- }
- else if (this.numberColumns) {
- nc = this.numberColumns;
- nr = Math.ceil(pd.length/this.numberColumns);
- }
- else {
- nr = pd.length;
- nc = 1;
- }
-
- var i, j;
- var tr, td1, td2;
- var lt, rs, color;
- var idx = 0;
- var div0, div1;
-
- for (i=0; i0){
- pad = true;
- }
- else{
- pad = false;
- }
- }
- else{
- if (i == nr -1){
- pad = false;
- }
- else{
- pad = true;
- }
- }
- rs = (pad) ? this.rowSpacing : '0';
-
-
-
- td1 = $(document.createElement('td'));
- td1.addClass('jqplot-table-legend');
- td1.css({textAlign: 'center', paddingTop: rs});
-
- div0 = $(document.createElement('div'));
- div1 = $(document.createElement('div'));
- div1.addClass('jqplot-table-legend-swatch');
- div1.css({backgroundColor: color, borderColor: color});
- td1.append(div0.append(div1));
-
- td2 = $(document.createElement('td'));
- td2.addClass('jqplot-table-legend');
- td2.css('paddingTop', rs);
-
- if (this.escapeHtml){
- td2.text(lt);
- }
- else {
- td2.html(lt);
- }
- if (reverse) {
- td2.prependTo(tr);
- td1.prependTo(tr);
- }
- else {
- td1.appendTo(tr);
- td2.appendTo(tr);
- }
- pad = true;
- }
- idx++;
- }
- }
- }
- }
- return this._elem;
- };
-
- $.jqplot.PieRenderer.prototype.handleMove = function(ev, gridpos, datapos, neighbor, plot) {
- if (neighbor) {
- var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];
- plot.target.trigger('jqplotDataMouseOver', ins);
- if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.pieRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {
- plot.target.trigger('jqplotDataHighlight', ins);
- highlight (plot, ins[0], ins[1]);
- }
- }
- else if (neighbor == null) {
- unhighlight (plot);
- }
- };
-
-
- // this.eventCanvas._elem.bind($.jqplot.eventListenerHooks[i][0], {plot:this}, $.jqplot.eventListenerHooks[i][1]);
-
- // setup default renderers for axes and legend so user doesn't have to
- // called with scope of plot
- function preInit(target, data, options) {
- options = options || {};
- options.axesDefaults = options.axesDefaults || {};
- options.legend = options.legend || {};
- options.seriesDefaults = options.seriesDefaults || {};
- // only set these if there is a pie series
- var setopts = false;
- if (options.seriesDefaults.renderer == $.jqplot.PieRenderer) {
- setopts = true;
- }
- else if (options.series) {
- for (var i=0; i < options.series.length; i++) {
- if (options.series[i].renderer == $.jqplot.PieRenderer) {
- setopts = true;
- }
- }
- }
-
- if (setopts) {
- options.axesDefaults.renderer = $.jqplot.PieAxisRenderer;
- options.legend.renderer = $.jqplot.PieLegendRenderer;
- options.legend.preDraw = true;
- options.seriesDefaults.pointLabels = {show: false};
- }
- }
-
- function postInit(target, data, options) {
- for (var i=0; i570)?o[p]*0.8:o[p]+0.3*(255-o[p]);o[p]=parseInt(o[p],10)}this.highlightColors.push("rgb("+o[0]+","+o[1]+","+o[2]+")")}}this.highlightColorGenerator=new e.jqplot.ColorGenerator(this.highlightColors);u.postParseOptionsHooks.addOnce(m);u.postInitHooks.addOnce(g);u.eventListenerHooks.addOnce("jqplotMouseMove",b);u.eventListenerHooks.addOnce("jqplotMouseDown",a);u.eventListenerHooks.addOnce("jqplotMouseUp",l);u.eventListenerHooks.addOnce("jqplotClick",f);u.eventListenerHooks.addOnce("jqplotRightClick",n);u.postDrawHooks.addOnce(i)};e.jqplot.PieRenderer.prototype.setGridData=function(t){var p=[];var u=[];var o=this.startAngle/180*Math.PI;var s=0;this._drawData=false;for(var r=0;r0){p[r]+=p[r-1]}s+=this.data[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r0){p[r]+=p[r-1]}s+=t[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r0&&s>0.01&&s<6.282){w=parseFloat(p)/2/h(q)}return w}e.jqplot.PieRenderer.prototype.drawSlice=function(B,z,y,u,w){if(this._drawData){var p=this._radius;var A=this.fill;var x=this.lineWidth;var s=this.sliceMargin;if(this.fill==false){s+=this.lineWidth}B.save();B.translate(this._center[0],this._center[1]);var D=j(z,y,this.sliceMargin,this.fill,this.lineWidth);var o=D*Math.cos((z+y)/2);var C=D*Math.sin((z+y)/2);if((y-z)<=Math.PI){p-=D}else{p+=D}B.translate(o,C);if(w){for(var v=0,t=this.shadowDepth;v6.282+this.startAngle){y=6.282+this.startAngle;if(z>y){z=6.281+this.startAngle}}if(z>=y){return}B.beginPath();B.fillStyle=u;B.strokeStyle=u;B.lineWidth=x;B.arc(0,0,r,z,y,false);B.lineTo(0,0);B.closePath();if(A){B.fill()}else{B.stroke()}}};e.jqplot.PieRenderer.prototype.draw=function(B,z,E,o){var W;var H=(E!=undefined)?E:{};var t=0;var s=0;var N=1;var L=new e.jqplot.ColorGenerator(this.seriesColors);if(E.legendInfo&&E.legendInfo.placement=="insideGrid"){var J=E.legendInfo;switch(J.location){case"nw":t=J.width+J.xoffset;break;case"w":t=J.width+J.xoffset;break;case"sw":t=J.width+J.xoffset;break;case"ne":t=J.width+J.xoffset;N=-1;break;case"e":t=J.width+J.xoffset;N=-1;break;case"se":t=J.width+J.xoffset;N=-1;break;case"n":s=J.height+J.yoffset;break;case"s":s=J.height+J.yoffset;N=-1;break;default:break}}var K=(H.shadow!=undefined)?H.shadow:this.shadow;var A=(H.fill!=undefined)?H.fill:this.fill;var C=B.canvas.width;var I=B.canvas.height;var Q=C-t-2*this.padding;var X=I-s-2*this.padding;var M=Math.min(Q,X);var Y=M;this._sliceAngles=[];var v=this.sliceMargin;if(this.fill==false){v+=this.lineWidth}var q;var G=0;var R,aa,Z,ab;var D=this.startAngle/180*Math.PI;for(var W=0,V=z.length;WMath.PI){G=Math.max(q,G)}}if(this.diameter!=null&&this.diameter>0){this._diameter=this.diameter-2*G}else{this._diameter=Y-2*G}if(this._diameter<6){e.jqplot.log("Diameter of pie too small, not rendering.");return}var S=this._radius=this._diameter/2;this._center=[(C-N*t)/2+N*t+G*Math.cos(D),(I-N*s)/2+N*s+G*Math.sin(D)];if(this.shadow){for(var W=0,V=z.length;W=this.dataLabelThreshold){var F,U=(this._sliceAngles[W][0]+this._sliceAngles[W][1])/2,T;if(this.dataLabels=="label"){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,z[W][0])}else{if(this.dataLabels=="value"){F=this.dataLabelFormatString||"%d";T=e.jqplot.sprintf(F,this.data[W][1])}else{if(this.dataLabels=="percent"){F=this.dataLabelFormatString||"%d%%";T=e.jqplot.sprintf(F,z[W][2]*100)}else{if(this.dataLabels.constructor==Array){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,this.dataLabels[W])}}}}var p=(this._radius)*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var P=this._center[0]+Math.cos(U)*p+this.canvas._offsets.left;var O=this._center[1]+Math.sin(U)*p+this.canvas._offsets.top;var u=e(''+T+"
").insertBefore(o.eventCanvas._elem);if(this.dataLabelCenterOn){P-=u.width()/2;O-=u.height()/2}else{P-=u.width()*Math.sin(U/2);O-=u.height()/2}P=Math.round(P);O=Math.round(O);u.css({left:P,top:O})}}};e.jqplot.PieAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.PieAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.PieAxisRenderer.prototype.constructor=e.jqplot.PieAxisRenderer;e.jqplot.PieAxisRenderer.prototype.init=function(o){this.tickRenderer=e.jqplot.PieTickRenderer;e.extend(true,this,o);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.PieLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.PieLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.PieLegendRenderer.prototype.constructor=e.jqplot.PieLegendRenderer;e.jqplot.PieLegendRenderer.prototype.init=function(o){this.numberRows=null;this.numberColumns=null;e.extend(true,this,o)};e.jqplot.PieLegendRenderer.prototype.draw=function(){var r=this;if(this.show){var B=this._series;this._elem=e(document.createElement("table"));this._elem.addClass("jqplot-table-legend");var E={position:"absolute"};if(this.background){E.background=this.background}if(this.border){E.border=this.border}if(this.fontSize){E.fontSize=this.fontSize}if(this.fontFamily){E.fontFamily=this.fontFamily}if(this.textColor){E.textColor=this.textColor}if(this.marginTop!=null){E.marginTop=this.marginTop}if(this.marginBottom!=null){E.marginBottom=this.marginBottom}if(this.marginLeft!=null){E.marginLeft=this.marginLeft}if(this.marginRight!=null){E.marginRight=this.marginRight}this._elem.css(E);var I=false,A=false,o,y;var C=B[0];var p=new e.jqplot.ColorGenerator(C.seriesColors);if(C.show){var J=C.data;if(this.numberRows){o=this.numberRows;if(!this.numberColumns){y=Math.ceil(J.length/o)}else{y=this.numberColumns}}else{if(this.numberColumns){y=this.numberColumns;o=Math.ceil(J.length/this.numberColumns)}else{o=J.length;y=1}}var H,G;var q,w,v;var x,z,F;var D=0;var u,t;for(H=0;H0){I=true}else{I=false}}else{if(H==o-1){I=false}else{I=true}}z=(I)?this.rowSpacing:"0";w=e(document.createElement("td"));w.addClass("jqplot-table-legend");w.css({textAlign:"center",paddingTop:z});u=e(document.createElement("div"));t=e(document.createElement("div"));t.addClass("jqplot-table-legend-swatch");t.css({backgroundColor:F,borderColor:F});w.append(u.append(t));v=e(document.createElement("td"));v.addClass("jqplot-table-legend");v.css("paddingTop",z);if(this.escapeHtml){v.text(x)}else{v.html(x)}if(A){v.prependTo(q);w.prependTo(q)}else{w.appendTo(q);v.appendTo(q)}I=true}D++}}}}return this._elem};e.jqplot.PieRenderer.prototype.handleMove=function(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];r.target.trigger("jqplotDataMouseOver",o);if(r.series[o[0]].highlightMouseOver&&!(o[0]==r.plugins.pieRenderer.highlightedSeriesIndex&&o[1]==r.series[o[0]]._highlightedPoint)){r.target.trigger("jqplotDataHighlight",o);d(r,o[0],o[1])}}else{if(s==null){k(r)}}};function c(s,r,p){p=p||{};p.axesDefaults=p.axesDefaults||{};p.legend=p.legend||{};p.seriesDefaults=p.seriesDefaults||{};var o=false;if(p.seriesDefaults.renderer==e.jqplot.PieRenderer){o=true}else{if(p.series){for(var q=0;q
- *
- * By default, the last value in the data ponit array in the data series is used
- * for the label. For most series renderers, extra data can be added to the
- * data point arrays and the last value will be used as the label.
- *
- * For instance,
- * this series:
- *
- * > [[1,4], [3,5], [7,2]]
- *
- * Would, by default, use the y values in the labels.
- * Extra data can be added to the series like so:
- *
- * > [[1,4,'mid'], [3 5,'hi'], [7,2,'low']]
- *
- * And now the point labels would be 'mid', 'low', and 'hi'.
- *
- * Options to the point labels and a custom labels array can be passed into the
- * "pointLabels" option on the series option like so:
- *
- * > series:[{pointLabels:{
- * > labels:['mid', 'hi', 'low'],
- * > location:'se',
- * > ypadding: 12
- * > }
- * > }]
- *
- * A custom labels array in the options takes precendence over any labels
- * in the series data. If you have a custom labels array in the options,
- * but still want to use values from the series array as labels, set the
- * "labelsFromSeries" option to true.
- *
- * By default, html entities (<, >, etc.) are escaped in point labels.
- * If you want to include actual html markup in the labels,
- * set the "escapeHTML" option to false.
- *
- */
- $.jqplot.PointLabels = function(options) {
- // Group: Properties
- //
- // prop: show
- // show the labels or not.
- this.show = $.jqplot.config.enablePlugins;
- // prop: location
- // compass location where to position the label around the point.
- // 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'
- this.location = 'n';
- // prop: labelsFromSeries
- // true to use labels within data point arrays.
- this.labelsFromSeries = false;
- // prop: seriesLabelIndex
- // array index for location of labels within data point arrays.
- // if null, will use the last element of the data point array.
- this.seriesLabelIndex = null;
- // prop: labels
- // array of arrays of labels, one array for each series.
- this.labels = [];
- // actual labels that will get displayed.
- // needed to preserve user specified labels in labels array.
- this._labels = [];
- // prop: stackedValue
- // true to display value as stacked in a stacked plot.
- // no effect if labels is specified.
- this.stackedValue = false;
- // prop: ypadding
- // vertical padding in pixels between point and label
- this.ypadding = 6;
- // prop: xpadding
- // horizontal padding in pixels between point and label
- this.xpadding = 6;
- // prop: escapeHTML
- // true to escape html entities in the labels.
- // If you want to include markup in the labels, set to false.
- this.escapeHTML = true;
- // prop: edgeTolerance
- // Number of pixels that the label must be away from an axis
- // boundary in order to be drawn. Negative values will allow overlap
- // with the grid boundaries.
- this.edgeTolerance = -5;
- // prop: formatter
- // A class of a formatter for the tick text. sprintf by default.
- this.formatter = $.jqplot.DefaultTickFormatter;
- // prop: formatString
- // string passed to the formatter.
- this.formatString = '';
- // prop: hideZeros
- // true to not show a label for a value which is 0.
- this.hideZeros = false;
- this._elems = [];
-
- $.extend(true, this, options);
- };
-
- var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];
- var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7};
- var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];
-
- // called with scope of a series
- $.jqplot.PointLabels.init = function (target, data, seriesDefaults, opts){
- var options = $.extend(true, {}, seriesDefaults, opts);
- options.pointLabels = options.pointLabels || {};
- if (this.renderer.constructor == $.jqplot.BarRenderer && this.barDirection == 'horizontal' && !options.pointLabels.location) {
- options.pointLabels.location = 'e';
- }
- // add a pointLabels attribute to the series plugins
- this.plugins.pointLabels = new $.jqplot.PointLabels(options.pointLabels);
- this.plugins.pointLabels.setLabels.call(this);
- };
-
- // called with scope of series
- $.jqplot.PointLabels.prototype.setLabels = function() {
- var p = this.plugins.pointLabels;
- var labelIdx;
- if (p.seriesLabelIndex != null) {
- labelIdx = p.seriesLabelIndex;
- }
- else if (this.renderer.constructor == $.jqplot.BarRenderer && this.barDirection == 'horizontal') {
- labelIdx = 0;
- }
- else {
- labelIdx = this._plotData[0].length -1;
- }
- p._labels = [];
- if (p.labels.length == 0 || p.labelsFromSeries) {
- if (p.stackedValue) {
- if (this._plotData.length && this._plotData[0].length){
- // var idx = p.seriesLabelIndex || this._plotData[0].length -1;
- for (var i=0; i scr || elb + et > scb) {
- elem.remove();
- }
- elem = null;
- helem = null;
- }
- }
- };
-
- $.jqplot.postSeriesInitHooks.push($.jqplot.PointLabels.init);
- $.jqplot.postDrawSeriesHooks.push($.jqplot.PointLabels.draw);
-})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.pointLabels.min.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.pointLabels.min.js
deleted file mode 100644
index 86b3fd8c15..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.pointLabels.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function(c){c.jqplot.PointLabels=function(e){this.show=c.jqplot.config.enablePlugins;this.location="n";this.labelsFromSeries=false;this.seriesLabelIndex=null;this.labels=[];this._labels=[];this.stackedValue=false;this.ypadding=6;this.xpadding=6;this.escapeHTML=true;this.edgeTolerance=-5;this.formatter=c.jqplot.DefaultTickFormatter;this.formatString="";this.hideZeros=false;this._elems=[];c.extend(true,this,e)};var a=["nw","n","ne","e","se","s","sw","w"];var d={nw:0,n:1,ne:2,e:3,se:4,s:5,sw:6,w:7};var b=["se","s","sw","w","nw","n","ne","e"];c.jqplot.PointLabels.init=function(i,h,f,g){var e=c.extend(true,{},f,g);e.pointLabels=e.pointLabels||{};if(this.renderer.constructor==c.jqplot.BarRenderer&&this.barDirection=="horizontal"&&!e.pointLabels.location){e.pointLabels.location="e"}this.plugins.pointLabels=new c.jqplot.PointLabels(e.pointLabels);this.plugins.pointLabels.setLabels.call(this)};c.jqplot.PointLabels.prototype.setLabels=function(){var f=this.plugins.pointLabels;var h;if(f.seriesLabelIndex!=null){h=f.seriesLabelIndex}else{if(this.renderer.constructor==c.jqplot.BarRenderer&&this.barDirection=="horizontal"){h=0}else{h=this._plotData[0].length-1}}f._labels=[];if(f.labels.length==0||f.labelsFromSeries){if(f.stackedValue){if(this._plotData.length&&this._plotData[0].length){for(var e=0;eA||s+B>m){y.remove()}y=null;f=null}}};c.jqplot.postSeriesInitHooks.push(c.jqplot.PointLabels.init);c.jqplot.postDrawSeriesHooks.push(c.jqplot.PointLabels.draw)})(jQuery);
\ No newline at end of file
diff --git a/public/js/lib/jqplot/jqplot-plugins/jqplot.trendline.js b/public/js/lib/jqplot/jqplot-plugins/jqplot.trendline.js
deleted file mode 100644
index 57c6ec5f85..0000000000
--- a/public/js/lib/jqplot/jqplot-plugins/jqplot.trendline.js
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * jqPlot
- * Pure JavaScript plotting plugin using jQuery
- *
- * Version: 1.0.0b2_r792
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * Although not required, the author would appreciate an email letting him
- * know of any substantial use of jqPlot. You can reach the author at:
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
- *
- * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php .
- *
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- *
- * version 2007.04.27
- * author Ash Searle
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- * The author (Ash Searle) has placed this code in the public domain:
- * "This code is unrestricted: you are free to use it however you like."
- *
- */
-(function($) {
-
- /**
- * Class: $.jqplot.Trendline
- * Plugin which will automatically compute and draw trendlines for plotted data.
- */
- $.jqplot.Trendline = function() {
- // Group: Properties
-
- // prop: show
- // Wether or not to show the trend line.
- this.show = $.jqplot.config.enablePlugins;
- // prop: color
- // CSS color spec for the trend line.
- // By default this wil be the same color as the primary line.
- this.color = '#666666';
- // prop: renderer
- // Renderer to use to draw the trend line.
- // The data series that is plotted may not be rendered as a line.
- // Therefore, we use our own line renderer here to draw a trend line.
- this.renderer = new $.jqplot.LineRenderer();
- // prop: rendererOptions
- // Options to pass to the line renderer.
- // By default, markers are not shown on trend lines.
- this.rendererOptions = {marker:{show:false}};
- // prop: label
- // Label for the trend line to use in the legend.
- this.label = '';
- // prop: type
- // Either 'exponential', 'exp', or 'linear'.
- this.type = 'linear';
- // prop: shadow
- // true or false, wether or not to show the shadow.
- this.shadow = true;
- // prop: markerRenderer
- // Renderer to use to draw markers on the line.
- // I think this is wrong.
- this.markerRenderer = {show:false};
- // prop: lineWidth
- // Width of the trend line.
- this.lineWidth = 1.5;
- // prop: shadowAngle
- // Angle of the shadow on the trend line.
- this.shadowAngle = 45;
- // prop: shadowOffset
- // pixel offset for each stroke of the shadow.
- this.shadowOffset = 1.0;
- // prop: shadowAlpha
- // Alpha transparency of the shadow.
- this.shadowAlpha = 0.07;
- // prop: shadowDepth
- // number of strokes to make of the shadow.
- this.shadowDepth = 3;
- this.isTrendline = true;
-
- };
-
- $.jqplot.postSeriesInitHooks.push(parseTrendLineOptions);
- $.jqplot.postDrawSeriesHooks.push(drawTrendline);
- $.jqplot.addLegendRowHooks.push(addTrendlineLegend);
-
- // called witin scope of the legend object
- // current series passed in
- // must return null or an object {label:label, color:color}
- function addTrendlineLegend(series) {
- var lt = series.trendline.label.toString();
- var ret = null;
- if (this.renderer.constructor != $.jqplot.PieRenderer && series.trendline.show && lt) {
- ret = {label:lt, color:series.trendline.color};
- }
- return ret;
- }
-
- // called within scope of a series
- function parseTrendLineOptions (target, data, seriesDefaults, options, plot) {
- if (this.renderer.constructor == $.jqplot.LineRenderer) {
- this.trendline = new $.jqplot.Trendline();
- options = options || {};
- $.extend(true, this.trendline, {color:this.color}, seriesDefaults.trendline, options.trendline);
- this.trendline.renderer.init.call(this.trendline, null);
- }
- }
-
- // called within scope of series object
- function drawTrendline(sctx, options) {
- // if we have options, merge trendline options in with precedence
- options = $.extend(true, {}, this.trendline, options);
-
- if (options.show && this.renderer.constructor != $.jqplot.PieRenderer) {
- var fit;
- // this.renderer.setGridData.call(this);
- var data = options.data || this.data;
- fit = fitData(data, this.trendline.type);
- var gridData = options.gridData || this.renderer.makeGridData.call(this, fit.data);
- this.trendline.renderer.draw.call(this.trendline, sctx, gridData, {showLine:true, shadow:this.trendline.shadow});
- }
- }
-
- function regression(x, y, typ) {
- var type = (typ == null) ? 'linear' : typ;
- var N = x.length;
- var slope;
- var intercept;
- var SX = 0;
- var SY = 0;
- var SXX = 0;
- var SXY = 0;
- var SYY = 0;
- var Y = [];
- var X = [];
-
- if (type == 'linear') {
- X = x;
- Y = y;
- }
- else if (type == 'exp' || type == 'exponential') {
- for ( var i=0; i'+V+"");w("#"+U).addClass("jqplot-error");document.getElementById(U).style.background=w.jqplot.config.errorBackground;document.getElementById(U).style.border=w.jqplot.config.errorBorder;document.getElementById(U).style.fontFamily=w.jqplot.config.errorFontFamily;document.getElementById(U).style.fontSize=w.jqplot.config.errorFontSize;document.getElementById(U).style.fontStyle=w.jqplot.config.errorFontStyle;document.getElementById(U).style.fontWeight=w.jqplot.config.errorFontWeight}}else{T.init(U,Q,O);T.draw();T.themeEngine.init.call(T);return T}};w.jqplot.version="1.0.0b2_r792";w.jqplot.CanvasManager=function(){if(typeof w.jqplot.CanvasManager.canvases=="undefined"){w.jqplot.CanvasManager.canvases=[];w.jqplot.CanvasManager.free=[]}var O=[];this.getCanvas=function(){var R;var Q=true;if(!w.jqplot.use_excanvas){for(var S=0,P=w.jqplot.CanvasManager.canvases.length;S-1){this.syncTicks=true}else{if(this.syncTicks==null){this.syncTicks=false}}this.renderer.init.call(this,this.rendererOptions)};m.prototype.draw=function(O,P){if(this.__ticks){this.__ticks=null}return this.renderer.draw.call(this,O,P)};m.prototype.set=function(){this.renderer.set.call(this)};m.prototype.pack=function(P,O){if(this.show){this.renderer.pack.call(this,P,O)}if(this._min==null){this._min=this.min;this._max=this.max;this._tickInterval=this.tickInterval;this._numberTicks=this.numberTicks;this.__ticks=this._ticks}};m.prototype.reset=function(){this.renderer.reset.call(this)};m.prototype.resetScale=function(O){w.extend(true,this,{min:null,max:null,numberTicks:null,tickInterval:null,_ticks:[],ticks:[]},O);this.resetDataBounds()};m.prototype.resetDataBounds=function(){var O=this._dataBounds;O.min=null;O.max=null;var R=(this.show)?true:false;for(var Q=0;QO.max)||O.max==null){O.max=V[P][0]}}else{if((V[P][T]!=null&&V[P][T]O.max)||O.max==null){O.max=V[P][U]}}}if(R&&S.renderer.constructor!==w.jqplot.BarRenderer){R=false}else{if(R&&this._options.hasOwnProperty("forceTickAt0")&&this._options.forceTickAt0==false){R=false}else{if(R&&S.renderer.constructor===w.jqplot.BarRenderer){if(S.barDirection=="vertical"&&this.name!="xaxis"&&this.name!="x2axis"){if(this._options.pad!=null||this._options.padMin!=null){R=false}}else{if(S.barDirection=="horizontal"&&(this.name=="xaxis"||this.name=="x2axis")){if(this._options.pad!=null||this._options.padMin!=null){R=false}}}}}}}if(R&&this.renderer.constructor===w.jqplot.LinearAxisRenderer&&O.min>=0){this.padMin=1;this.forceTickAt0=true}};function h(O){w.jqplot.ElemContainer.call(this);this.show=false;this.location="ne";this.labels=[];this.showLabels=true;this.showSwatches=true;this.placement="insideGrid";this.xoffset=0;this.yoffset=0;this.border;this.background;this.textColor;this.fontFamily;this.fontSize;this.rowSpacing="0.5em";this.renderer=w.jqplot.TableLegendRenderer;this.rendererOptions={};this.preDraw=false;this.marginTop=null;this.marginRight=null;this.marginBottom=null;this.marginLeft=null;this.escapeHtml=false;this._series=[];w.extend(true,this,O)}h.prototype=new w.jqplot.ElemContainer();h.prototype.constructor=h;h.prototype.setOptions=function(O){w.extend(true,this,O);if(this.placement=="inside"){this.placement="insideGrid"}if(this.xoffset>0){if(this.placement=="insideGrid"){switch(this.location){case"nw":case"w":case"sw":if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break;case"ne":case"e":case"se":default:if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break}}else{if(this.placement=="outside"){switch(this.location){case"nw":case"w":case"sw":if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break;case"ne":case"e":case"se":default:if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break}}}this.xoffset=0}if(this.yoffset>0){if(this.placement=="outside"){switch(this.location){case"sw":case"s":case"se":if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break;case"ne":case"n":case"nw":default:if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break}}else{if(this.placement=="insideGrid"){switch(this.location){case"sw":case"s":case"se":if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break;case"ne":case"n":case"nw":default:if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break}}}this.yoffset=0}};h.prototype.init=function(){this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions)};h.prototype.draw=function(P){for(var O=0;O');this.target.append(ad);ad.height(ah);ad.width(ae);ad.css("top",this.eventCanvas._offsets.top);ad.css("left",this.eventCanvas._offsets.left);var ag=w('');ad.append(ag);ag.html(this.noDataIndicator.indicator);var af=ag.height();var ac=ag.width();ag.height(af);ag.width(ac);ag.css("top",(ah-af)/2+"px")})}}this.data=W;this.parseOptions(ab);if(this.textColor){this.target.css("color",this.textColor)}if(this.fontFamily){this.target.css("font-family",this.fontFamily)}if(this.fontSize){this.target.css("font-size",this.fontSize)}this.title.init();this.legend.init();this._sumy=0;this._sumx=0;for(var X=0;X0){W._prevPlotData=this.series[X-1]._plotData}W._sumy=0;W._sumx=0;for(V=W.data.length-1;V>-1;V--){W._sumy+=W.data[V][1];W._sumx+=W.data[V][0]}};this.getNextSeriesColor=(function(T){var S=0;var U=T.seriesColors;return function(){if(S0){this._gridPadding[Z[W]]=ac[Z[W]]}else{if(this._gridPadding[Z[W]]==null){this._gridPadding[Z[W]]=this._defaultGridPadding[Z[W]]}}}var ab=(this.legend.placement=="outsideGrid")?{top:this.title.getHeight(),left:0,right:0,bottom:0}:this._gridPadding;S.xaxis.pack({position:"absolute",bottom:this._gridPadding.bottom-S.xaxis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});S.yaxis.pack({position:"absolute",top:0,left:this._gridPadding.left-S.yaxis.getWidth(),height:this._height},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});S.x2axis.pack({position:"absolute",top:this._gridPadding.top-S.x2axis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});for(Y=8;Y>0;Y--){S[V[Y-1]].pack({position:"absolute",top:0,right:this._gridPadding.right-T[Y-1]},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top})}this.target.append(this.grid.createElement(this._gridPadding,this));this.grid.draw();for(Y=0;Y0;T--){U=X[T-1];if(S[U].show){W[U]=S[U].series_p2u(Y[U.charAt(0)])}}return{offsets:V,gridPos:Y,dataPos:W}}function R(S,T){var X=T.series;var aC,aB,aA,av,aw,ap,ao,ac,aa,af,ag,aq;var az,aD,ax,Y,an,at;var U,au;for(aA=T.seriesStack.length-1;aA>=0;aA--){aC=T.seriesStack[aA];av=X[aC];switch(av.renderer.constructor){case w.jqplot.BarRenderer:ap=S.x;ao=S.y;for(aB=0;aBan[0][0]&&apan[2][1]&&ao0&&-ao>=0){ac=2*Math.PI-Math.atan(-ao/ap)}else{if(ap>0&&-ao<0){ac=-Math.atan(-ao/ap)}else{if(ap<0){ac=Math.PI-Math.atan(-ao/ap)}else{if(ap==0&&-ao>0){ac=3*Math.PI/2}else{if(ap==0&&-ao<0){ac=Math.PI/2}else{if(ap==0&&ao==0){ac=0}}}}}}if(af){ac-=af;if(ac<0){ac+=2*Math.PI}else{if(ac>2*Math.PI){ac-=2*Math.PI}}}aa=av.sliceMargin/180*Math.PI;if(awav._innerRadius){for(aB=0;aB0)?av.gridData[aB-1][1]+aa:aa;aq=av.gridData[aB][1];if(ac>ag&&ac0&&-ao>=0){ac=2*Math.PI-Math.atan(-ao/ap)}else{if(ap>0&&-ao<0){ac=-Math.atan(-ao/ap)}else{if(ap<0){ac=Math.PI-Math.atan(-ao/ap)}else{if(ap==0&&-ao>0){ac=3*Math.PI/2}else{if(ap==0&&-ao<0){ac=Math.PI/2}else{if(ap==0&&ao==0){ac=0}}}}}}if(af){ac-=af;if(ac<0){ac+=2*Math.PI}else{if(ac>2*Math.PI){ac-=2*Math.PI}}}aa=av.sliceMargin/180*Math.PI;if(aw0)?av.gridData[aB-1][1]+aa:aa;aq=av.gridData[aB][1];if(ac>ag&&ac=ae[0][1]&&ao<=ae[3][1]&&ap>=Z[0]&&ap<=ak[0]){return{seriesIndex:av.index,pointIndex:aB,gridData:null,data:av.data[aB]}}}break;case w.jqplot.LineRenderer:ap=S.x;ao=S.y;aw=av.renderer;if(av.show){if(av.fill){var ad=false;if(ap>av._boundingBox[0][0]&&apav._boundingBox[1][1]&&ao=ao||ah[1]=ao){if(ai[0]+(ao-ai[1])/(ah[1]-ai[1])*(ah[0]-ai[0])0)?au:0;for(var aB=0;aB=ax[0]-aw._bodyWidth/2&&ap<=ax[0]+aw._bodyWidth/2&&ao>=ab(av.data[aB][2])&&ao<=ab(av.data[aB][3])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}else{if(!aw.hlc){var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._tickLength&&ap<=ax[0]+aw._tickLength&&ao>=ab(av.data[aB][2])&&ao<=ab(av.data[aB][3])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}else{var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._tickLength&&ap<=ax[0]+aw._tickLength&&ao>=ab(av.data[aB][1])&&ao<=ab(av.data[aB][2])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}}}else{if(ax[0]!=null&&ax[1]!=null){aD=Math.sqrt((ap-ax[0])*(ap-ax[0])+(ao-ax[1])*(ao-ax[1]));if(aD<=U&&(aD<=az||az==null)){az=aD;return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}}}}}break;default:ap=S.x;ao=S.y;aw=av.renderer;if(av.show){au=av.markerRenderer.size/2+av.neighborThreshold;U=(au>0)?au:0;for(var aB=0;aB=ax[0]-aw._bodyWidth/2&&ap<=ax[0]+aw._bodyWidth/2&&ao>=ab(av.data[aB][2])&&ao<=ab(av.data[aB][3])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}else{if(!aw.hlc){var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._tickLength&&ap<=ax[0]+aw._tickLength&&ao>=ab(av.data[aB][2])&&ao<=ab(av.data[aB][3])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}else{var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._tickLength&&ap<=ax[0]+aw._tickLength&&ao>=ab(av.data[aB][1])&&ao<=ab(av.data[aB][2])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}}}else{aD=Math.sqrt((ap-ax[0])*(ap-ax[0])+(ao-ax[1])*(ao-ax[1]));if(aD<=U&&(aD<=az||az==null)){az=aD;return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}}}break}}return null}this.onClick=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);var S=jQuery.Event("jqplotClick");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])};this.onDblClick=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);var S=jQuery.Event("jqplotDblClick");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])};this.onMouseDown=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);var S=jQuery.Event("jqplotMouseDown");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])};this.onMouseUp=function(U){var T=P(U);var S=jQuery.Event("jqplotMouseUp");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,null,U.data.plot])};this.onRightClick=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);if(W.captureRightClick){if(U.which==3){var S=jQuery.Event("jqplotRightClick");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])}else{var S=jQuery.Event("jqplotMouseUp");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])}}};this.onMouseMove=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);var S=jQuery.Event("jqplotMouseMove");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])};this.onMouseEnter=function(U){var T=P(U);var V=U.data.plot;var S=jQuery.Event("jqplotMouseEnter");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,null,V])};this.onMouseLeave=function(U){var T=P(U);var V=U.data.plot;var S=jQuery.Event("jqplotMouseLeave");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,null,V])};this.drawSeries=function(U,S){var W,V,T;S=(typeof(U)==="number"&&S==null)?U:S;U=(typeof(U)==="object")?U:{};if(S!=l){V=this.series[S];T=V.shadowCanvas._ctx;T.clearRect(0,0,T.canvas.width,T.canvas.height);V.drawShadow(T,U,this);T=V.canvas._ctx;T.clearRect(0,0,T.canvas.width,T.canvas.height);V.draw(T,U,this);if(V.renderer.constructor==w.jqplot.BezierCurveRenderer){if(S570)?O[Q]*0.8:O[Q]+0.3*(255-O[Q]);O[Q]=parseInt(O[Q],10)}R.push("rgb("+O[0]+","+O[1]+","+O[2]+")")}}else{var S=w.jqplot.getColorComponents(P);var O=[S[0],S[1],S[2]];var U=O[0]+O[1]+O[2];for(var Q=0;Q<3;Q++){O[Q]=(U>570)?O[Q]*0.8:O[Q]+0.3*(255-O[Q]);O[Q]=parseInt(O[Q],10)}R="rgb("+O[0]+","+O[1]+","+O[2]+")"}return R};w.jqplot.ColorGenerator=function(P){P=P||w.jqplot.config.defaultColors;var O=0;this.next=function(){if(O0){return P[O--]}else{O=P.length-1;return P[O]}};this.get=function(R){var Q=R-P.length*Math.floor(R/P.length);return P[Q]};this.setColors=function(Q){P=Q};this.reset=function(){O=0}};w.jqplot.hex2rgb=function(Q,O){Q=Q.replace("#","");if(Q.length==3){Q=Q.charAt(0)+Q.charAt(0)+Q.charAt(1)+Q.charAt(1)+Q.charAt(2)+Q.charAt(2)}var P;P="rgba("+parseInt(Q.slice(0,2),16)+", "+parseInt(Q.slice(2,4),16)+", "+parseInt(Q.slice(4,6),16);if(O){P+=", "+O}P+=")";return P};w.jqplot.rgb2hex=function(T){var Q=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *(?:, *[0-9.]*)?\)/;var O=T.match(Q);var S="#";for(var R=1;R<4;R++){var P;if(O[R].search(/%/)!=-1){P=parseInt(255*O[R]/100,10).toString(16);if(P.length==1){P="0"+P}}else{P=parseInt(O[R],10).toString(16);if(P.length==1){P="0"+P}}S+=P}return S};w.jqplot.normalize2rgb=function(P,O){if(P.search(/^ *rgba?\(/)!=-1){return P}else{if(P.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/)!=-1){return w.jqplot.hex2rgb(P,O)}else{throw"invalid color spec"}}};w.jqplot.getColorComponents=function(T){T=w.jqplot.colorKeywordMap[T]||T;var R=w.jqplot.normalize2rgb(T);var Q=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *,? *([0-9.]* *)?\)/;var O=R.match(Q);var P=[];for(var S=1;S<4;S++){if(O[S].search(/%/)!=-1){P[S-1]=parseInt(255*O[S]/100,10)}else{P[S-1]=parseInt(O[S],10)}}P[3]=parseFloat(O[4])?parseFloat(O[4]):1;return P};w.jqplot.colorKeywordMap={aliceblue:"rgb(240, 248, 255)",antiquewhite:"rgb(250, 235, 215)",aqua:"rgb( 0, 255, 255)",aquamarine:"rgb(127, 255, 212)",azure:"rgb(240, 255, 255)",beige:"rgb(245, 245, 220)",bisque:"rgb(255, 228, 196)",black:"rgb( 0, 0, 0)",blanchedalmond:"rgb(255, 235, 205)",blue:"rgb( 0, 0, 255)",blueviolet:"rgb(138, 43, 226)",brown:"rgb(165, 42, 42)",burlywood:"rgb(222, 184, 135)",cadetblue:"rgb( 95, 158, 160)",chartreuse:"rgb(127, 255, 0)",chocolate:"rgb(210, 105, 30)",coral:"rgb(255, 127, 80)",cornflowerblue:"rgb(100, 149, 237)",cornsilk:"rgb(255, 248, 220)",crimson:"rgb(220, 20, 60)",cyan:"rgb( 0, 255, 255)",darkblue:"rgb( 0, 0, 139)",darkcyan:"rgb( 0, 139, 139)",darkgoldenrod:"rgb(184, 134, 11)",darkgray:"rgb(169, 169, 169)",darkgreen:"rgb( 0, 100, 0)",darkgrey:"rgb(169, 169, 169)",darkkhaki:"rgb(189, 183, 107)",darkmagenta:"rgb(139, 0, 139)",darkolivegreen:"rgb( 85, 107, 47)",darkorange:"rgb(255, 140, 0)",darkorchid:"rgb(153, 50, 204)",darkred:"rgb(139, 0, 0)",darksalmon:"rgb(233, 150, 122)",darkseagreen:"rgb(143, 188, 143)",darkslateblue:"rgb( 72, 61, 139)",darkslategray:"rgb( 47, 79, 79)",darkslategrey:"rgb( 47, 79, 79)",darkturquoise:"rgb( 0, 206, 209)",darkviolet:"rgb(148, 0, 211)",deeppink:"rgb(255, 20, 147)",deepskyblue:"rgb( 0, 191, 255)",dimgray:"rgb(105, 105, 105)",dimgrey:"rgb(105, 105, 105)",dodgerblue:"rgb( 30, 144, 255)",firebrick:"rgb(178, 34, 34)",floralwhite:"rgb(255, 250, 240)",forestgreen:"rgb( 34, 139, 34)",fuchsia:"rgb(255, 0, 255)",gainsboro:"rgb(220, 220, 220)",ghostwhite:"rgb(248, 248, 255)",gold:"rgb(255, 215, 0)",goldenrod:"rgb(218, 165, 32)",gray:"rgb(128, 128, 128)",grey:"rgb(128, 128, 128)",green:"rgb( 0, 128, 0)",greenyellow:"rgb(173, 255, 47)",honeydew:"rgb(240, 255, 240)",hotpink:"rgb(255, 105, 180)",indianred:"rgb(205, 92, 92)",indigo:"rgb( 75, 0, 130)",ivory:"rgb(255, 255, 240)",khaki:"rgb(240, 230, 140)",lavender:"rgb(230, 230, 250)",lavenderblush:"rgb(255, 240, 245)",lawngreen:"rgb(124, 252, 0)",lemonchiffon:"rgb(255, 250, 205)",lightblue:"rgb(173, 216, 230)",lightcoral:"rgb(240, 128, 128)",lightcyan:"rgb(224, 255, 255)",lightgoldenrodyellow:"rgb(250, 250, 210)",lightgray:"rgb(211, 211, 211)",lightgreen:"rgb(144, 238, 144)",lightgrey:"rgb(211, 211, 211)",lightpink:"rgb(255, 182, 193)",lightsalmon:"rgb(255, 160, 122)",lightseagreen:"rgb( 32, 178, 170)",lightskyblue:"rgb(135, 206, 250)",lightslategray:"rgb(119, 136, 153)",lightslategrey:"rgb(119, 136, 153)",lightsteelblue:"rgb(176, 196, 222)",lightyellow:"rgb(255, 255, 224)",lime:"rgb( 0, 255, 0)",limegreen:"rgb( 50, 205, 50)",linen:"rgb(250, 240, 230)",magenta:"rgb(255, 0, 255)",maroon:"rgb(128, 0, 0)",mediumaquamarine:"rgb(102, 205, 170)",mediumblue:"rgb( 0, 0, 205)",mediumorchid:"rgb(186, 85, 211)",mediumpurple:"rgb(147, 112, 219)",mediumseagreen:"rgb( 60, 179, 113)",mediumslateblue:"rgb(123, 104, 238)",mediumspringgreen:"rgb( 0, 250, 154)",mediumturquoise:"rgb( 72, 209, 204)",mediumvioletred:"rgb(199, 21, 133)",midnightblue:"rgb( 25, 25, 112)",mintcream:"rgb(245, 255, 250)",mistyrose:"rgb(255, 228, 225)",moccasin:"rgb(255, 228, 181)",navajowhite:"rgb(255, 222, 173)",navy:"rgb( 0, 0, 128)",oldlace:"rgb(253, 245, 230)",olive:"rgb(128, 128, 0)",olivedrab:"rgb(107, 142, 35)",orange:"rgb(255, 165, 0)",orangered:"rgb(255, 69, 0)",orchid:"rgb(218, 112, 214)",palegoldenrod:"rgb(238, 232, 170)",palegreen:"rgb(152, 251, 152)",paleturquoise:"rgb(175, 238, 238)",palevioletred:"rgb(219, 112, 147)",papayawhip:"rgb(255, 239, 213)",peachpuff:"rgb(255, 218, 185)",peru:"rgb(205, 133, 63)",pink:"rgb(255, 192, 203)",plum:"rgb(221, 160, 221)",powderblue:"rgb(176, 224, 230)",purple:"rgb(128, 0, 128)",red:"rgb(255, 0, 0)",rosybrown:"rgb(188, 143, 143)",royalblue:"rgb( 65, 105, 225)",saddlebrown:"rgb(139, 69, 19)",salmon:"rgb(250, 128, 114)",sandybrown:"rgb(244, 164, 96)",seagreen:"rgb( 46, 139, 87)",seashell:"rgb(255, 245, 238)",sienna:"rgb(160, 82, 45)",silver:"rgb(192, 192, 192)",skyblue:"rgb(135, 206, 235)",slateblue:"rgb(106, 90, 205)",slategray:"rgb(112, 128, 144)",slategrey:"rgb(112, 128, 144)",snow:"rgb(255, 250, 250)",springgreen:"rgb( 0, 255, 127)",steelblue:"rgb( 70, 130, 180)",tan:"rgb(210, 180, 140)",teal:"rgb( 0, 128, 128)",thistle:"rgb(216, 191, 216)",tomato:"rgb(255, 99, 71)",turquoise:"rgb( 64, 224, 208)",violet:"rgb(238, 130, 238)",wheat:"rgb(245, 222, 179)",white:"rgb(255, 255, 255)",whitesmoke:"rgb(245, 245, 245)",yellow:"rgb(255, 255, 0)",yellowgreen:"rgb(154, 205, 50)"};w.jqplot.AxisLabelRenderer=function(O){w.jqplot.ElemContainer.call(this);this.axis;this.show=true;this.label="";this.fontFamily=null;this.fontSize=null;this.textColor=null;this._elem;this.escapeHTML=false;w.extend(true,this,O)};w.jqplot.AxisLabelRenderer.prototype=new w.jqplot.ElemContainer();w.jqplot.AxisLabelRenderer.prototype.constructor=w.jqplot.AxisLabelRenderer;w.jqplot.AxisLabelRenderer.prototype.init=function(O){w.extend(true,this,O)};w.jqplot.AxisLabelRenderer.prototype.draw=function(O,P){if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=w('');if(Number(this.label)){this._elem.css("white-space","nowrap")}if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}return this._elem};w.jqplot.AxisLabelRenderer.prototype.pack=function(){};w.jqplot.AxisTickRenderer=function(O){w.jqplot.ElemContainer.call(this);this.mark="outside";this.axis;this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.size=4;this.markSize=6;this.show=true;this.showLabel=true;this.label="";this.value=null;this._styles={};this.formatter=w.jqplot.DefaultTickFormatter;this.prefix="";this.formatString="";this.fontFamily;this.fontSize;this.textColor;this.escapeHTML=false;this._elem;this._breakTick=false;w.extend(true,this,O)};w.jqplot.AxisTickRenderer.prototype.init=function(O){w.extend(true,this,O)};w.jqplot.AxisTickRenderer.prototype=new w.jqplot.ElemContainer();w.jqplot.AxisTickRenderer.prototype.constructor=w.jqplot.AxisTickRenderer;w.jqplot.AxisTickRenderer.prototype.setTick=function(O,Q,P){this.value=O;this.axis=Q;if(P){this.isMinorTick=true}return this};w.jqplot.AxisTickRenderer.prototype.draw=function(){if(!this.label){this.label=this.prefix+this.formatter(this.formatString,this.value)}var P={position:"absolute"};if(Number(this.label)){P.whitSpace="nowrap"}if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=w(document.createElement("div"));this._elem.addClass("jqplot-"+this.axis+"-tick");if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}this._elem.css(P);for(var O in this._styles){this._elem.css(O,this._styles[O])}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}if(this._breakTick){this._elem.addClass("jqplot-breakTick")}return this._elem};w.jqplot.DefaultTickFormatter=function(O,P){if(typeof P=="number"){if(!O){O=w.jqplot.config.defaultTickFormatString}return w.jqplot.sprintf(O,P)}else{return String(P)}};w.jqplot.AxisTickRenderer.prototype.pack=function(){};w.jqplot.CanvasGridRenderer=function(){this.shadowRenderer=new w.jqplot.ShadowRenderer()};w.jqplot.CanvasGridRenderer.prototype.init=function(P){this._ctx;w.extend(true,this,P);var O={lineJoin:"miter",lineCap:"round",fill:false,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.shadowWidth,closePath:false,strokeStyle:this.shadowColor};this.renderer.shadowRenderer.init(O)};w.jqplot.CanvasGridRenderer.prototype.createElement=function(R){var Q;if(this._elem){if(w.jqplot.use_excanvas){Q=this._elem.get(0);window.G_vmlCanvasManager.uninitElement(Q);Q=null}this._elem.emptyForce();this._elem=null}Q=R.canvasManager.getCanvas();var O=this._plotDimensions.width;var P=this._plotDimensions.height;Q.width=O;Q.height=P;this._elem=w(Q);this._elem.addClass("jqplot-grid-canvas");this._elem.css({position:"absolute",left:0,top:0});Q=R.canvasManager.initCanvas(Q);this._top=this._offsets.top;this._bottom=P-this._offsets.bottom;this._left=this._offsets.left;this._right=O-this._offsets.right;this._width=this._right-this._left;this._height=this._bottom-this._top;Q=null;return this._elem};w.jqplot.CanvasGridRenderer.prototype.draw=function(){this._ctx=this._elem.get(0).getContext("2d");var Y=this._ctx;var ab=this._axes;Y.save();Y.clearRect(0,0,this._plotDimensions.width,this._plotDimensions.height);Y.fillStyle=this.backgroundColor||this.background;Y.fillRect(this._left,this._top,this._width,this._height);if(true){Y.save();Y.lineJoin="miter";Y.lineCap="butt";Y.lineWidth=this.gridLineWidth;Y.strokeStyle=this.gridLineColor;var ae,ad,W,X;var T=["xaxis","yaxis","x2axis","y2axis"];for(var ac=4;ac>0;ac--){var ag=T[ac-1];var O=ab[ag];var af=O._ticks;if(O.show){for(var Z=af.length;Z>0;Z--){var U=af[Z-1];if(U.show){var R=Math.round(O.u2p(U.value))+0.5;switch(ag){case"xaxis":if(U.showGridline&&this.drawGridlines){V(R,this._top,R,this._bottom)}if(U.showMark&&U.mark){W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;switch(X){case"outside":ae=this._bottom;ad=this._bottom+W;break;case"inside":ae=this._bottom-W;ad=this._bottom;break;case"cross":ae=this._bottom-W;ad=this._bottom+W;break;default:ae=this._bottom;ad=this._bottom+W;break}if(this.shadow){this.renderer.shadowRenderer.draw(Y,[[R,ae],[R,ad]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}V(R,ae,R,ad)}break;case"yaxis":if(U.showGridline&&this.drawGridlines){V(this._right,R,this._left,R)}if(U.showMark&&U.mark){W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;switch(X){case"outside":ae=this._left-W;ad=this._left;break;case"inside":ae=this._left;ad=this._left+W;break;case"cross":ae=this._left-W;ad=this._left+W;break;default:ae=this._left-W;ad=this._left;break}if(this.shadow){this.renderer.shadowRenderer.draw(Y,[[ae,R],[ad,R]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}V(ae,R,ad,R,{strokeStyle:O.borderColor})}break;case"x2axis":if(U.showGridline&&this.drawGridlines){V(R,this._bottom,R,this._top)}if(U.showMark&&U.mark){W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;switch(X){case"outside":ae=this._top-W;ad=this._top;break;case"inside":ae=this._top;ad=this._top+W;break;case"cross":ae=this._top-W;ad=this._top+W;break;default:ae=this._top-W;ad=this._top;break}if(this.shadow){this.renderer.shadowRenderer.draw(Y,[[R,ae],[R,ad]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}V(R,ae,R,ad)}break;case"y2axis":if(U.showGridline&&this.drawGridlines){V(this._left,R,this._right,R)}if(U.showMark&&U.mark){W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;switch(X){case"outside":ae=this._right;ad=this._right+W;break;case"inside":ae=this._right-W;ad=this._right;break;case"cross":ae=this._right-W;ad=this._right+W;break;default:ae=this._right;ad=this._right+W;break}if(this.shadow){this.renderer.shadowRenderer.draw(Y,[[ae,R],[ad,R]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}V(ae,R,ad,R,{strokeStyle:O.borderColor})}break;default:break}}}U=null}O=null;af=null}T=["y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis"];for(var ac=7;ac>0;ac--){var O=ab[T[ac-1]];var af=O._ticks;if(O.show){var P=af[O.numberTicks-1];var S=af[0];var Q=O.getLeft();var aa=[[Q,P.getTop()+P.getHeight()/2],[Q,S.getTop()+S.getHeight()/2+1]];if(this.shadow){this.renderer.shadowRenderer.draw(Y,aa,{lineCap:"butt",fill:false,closePath:false})}V(aa[0][0],aa[0][1],aa[1][0],aa[1][1],{lineCap:"butt",strokeStyle:O.borderColor,lineWidth:O.borderWidth});for(var Z=af.length;Z>0;Z--){var U=af[Z-1];W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;if(U.showMark&&U.mark){switch(X){case"outside":ae=Q;ad=Q+W;break;case"inside":ae=Q-W;ad=Q;break;case"cross":ae=Q-W;ad=Q+W;break;default:ae=Q;ad=Q+W;break}aa=[[ae,R],[ad,R]];if(this.shadow){this.renderer.shadowRenderer.draw(Y,aa,{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}V(ae,R,ad,R,{strokeStyle:O.borderColor})}U=null}S=null}O=null;af=null}Y.restore()}function V(al,ak,ai,ah,aj){Y.save();aj=aj||{};if(aj.lineWidth==null||aj.lineWidth!=0){w.extend(true,Y,aj);Y.beginPath();Y.moveTo(al,ak);Y.lineTo(ai,ah);Y.stroke();Y.restore()}}if(this.shadow){var aa=[[this._left,this._bottom],[this._right,this._bottom],[this._right,this._top]];this.renderer.shadowRenderer.draw(Y,aa)}if(this.borderWidth!=0&&this.drawBorder){V(this._left,this._top,this._right,this._top,{lineCap:"round",strokeStyle:ab.x2axis.borderColor,lineWidth:ab.x2axis.borderWidth});V(this._right,this._top,this._right,this._bottom,{lineCap:"round",strokeStyle:ab.y2axis.borderColor,lineWidth:ab.y2axis.borderWidth});V(this._right,this._bottom,this._left,this._bottom,{lineCap:"round",strokeStyle:ab.xaxis.borderColor,lineWidth:ab.xaxis.borderWidth});V(this._left,this._bottom,this._left,this._top,{lineCap:"round",strokeStyle:ab.yaxis.borderColor,lineWidth:ab.yaxis.borderWidth})}Y.restore();Y=null;ab=null};w.jqplot.DivTitleRenderer=function(){};w.jqplot.DivTitleRenderer.prototype.init=function(O){w.extend(true,this,O)};w.jqplot.DivTitleRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}var R=this.renderer;var Q=document.createElement("div");this._elem=w(Q);this._elem.addClass("jqplot-title");if(!this.text){this.show=false;this._elem.height(0);this._elem.width(0)}else{if(this.text){var O;if(this.color){O=this.color}else{if(this.textColor){O=this.textColor}}var P={position:"absolute",top:"0px",left:"0px"};if(this._plotWidth){P.width=this._plotWidth+"px"}if(this.fontSize){P.fontSize=this.fontSize}if(this.textAlign){P.textAlign=this.textAlign}else{P.textAlign="center"}if(O){P.color=O}if(this.paddingBottom){P.paddingBottom=this.paddingBottom}if(this.fontFamily){P.fontFamily=this.fontFamily}this._elem.css(P);this._elem.text(this.text)}}Q=null;return this._elem};w.jqplot.DivTitleRenderer.prototype.pack=function(){};w.jqplot.LineRenderer=function(){this.shapeRenderer=new w.jqplot.ShapeRenderer();this.shadowRenderer=new w.jqplot.ShadowRenderer()};w.jqplot.LineRenderer.prototype.init=function(P,T){P=P||{};this._type="line";var R={highlightMouseOver:P.highlightMouseOver,highlightMouseDown:P.highlightMouseDown,highlightColor:P.highlightColor};delete (P.highlightMouseOver);delete (P.highlightMouseDown);delete (P.highlightColor);w.extend(true,this.renderer,P);var S={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,strokeStyle:this.color,fillStyle:this.fillColor,lineWidth:this.lineWidth,closePath:this.fill};this.renderer.shapeRenderer.init(S);if(this.lineWidth>2.5){var Q=this.shadowOffset*(1+(Math.atan((this.lineWidth/2.5))/0.785398163-1)*0.6)}else{var Q=this.shadowOffset*Math.atan((this.lineWidth/2.5))/0.785398163}var O={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,angle:this.shadowAngle,offset:Q,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.lineWidth,closePath:this.fill};this.renderer.shadowRenderer.init(O);this._areaPoints=[];this._boundingBox=[[],[]];if(!this.isTrendline&&this.fill){this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColor=null;if(R.highlightMouseDown&&R.highlightMouseOver==null){R.highlightMouseOver=false}w.extend(true,this,{highlightMouseOver:R.highlightMouseOver,highlightMouseDown:R.highlightMouseDown,highlightColor:R.highlightColor});if(!this.highlightColor){this.highlightColor=w.jqplot.computeHighlightColors(this.fillColor)}if(this.highlighter){this.highlighter.show=false}}if(!this.isTrendline&&T){T.plugins.lineRenderer={};T.postInitHooks.addOnce(o);T.postDrawHooks.addOnce(M);T.eventListenerHooks.addOnce("jqplotMouseMove",d);T.eventListenerHooks.addOnce("jqplotMouseDown",a);T.eventListenerHooks.addOnce("jqplotMouseUp",L);T.eventListenerHooks.addOnce("jqplotClick",c);T.eventListenerHooks.addOnce("jqplotRightClick",j)}};w.jqplot.LineRenderer.prototype.setGridData=function(T){var P=this._xaxis.series_u2p;var S=this._yaxis.series_u2p;var Q=this._plotData;var R=this._prevPlotData;this.gridData=[];this._prevGridData=[];for(var O=0;O0;ah--){an.push(aa[ah-1])}if(R){this.renderer.shadowRenderer.draw(ad,an,X)}this._areaPoints=an;this.renderer.shapeRenderer.draw(ad,an,X)}}else{if(O){var am=an.slice(0)}if(this.index==0||!this._stack){var T=ad.canvas.height;an.unshift([an[0][0],T]);var ai=an.length;an.push([an[ai-1][0],T])}else{var aa=this._prevGridData;for(var ah=aa.length;ah>0;ah--){an.push(aa[ah-1])}}this._areaPoints=an;if(R){this.renderer.shadowRenderer.draw(ad,an,X)}this.renderer.shapeRenderer.draw(ad,an,X)}if(O){var af=w.extend(true,{},X,{fill:false,closePath:false});this.renderer.shapeRenderer.draw(ad,am,af);if(this.markerRenderer.show){for(ah=0;ahZ[0]||Y==null){Y=Z[0]}if(ajZ[1]||ae==null){ae=Z[1]}}this._boundingBox=[[Y,aj],[ab,ae]];if(this.markerRenderer.show&&!ag){for(ah=0;ahV){V=Q}}}S=null;T=null;if(O){P=this._label._elem.outerWidth(true);U=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){V=V+U;this._elem.css({height:V+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){V=V+U;this._elem.css({height:V+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){V=V+P;this._elem.css({width:V+"px",left:"0px",top:"0px"});if(O&&this._label.constructor==w.jqplot.AxisLabelRenderer){this._label._elem.css("width",P+"px")}}else{V=V+P;this._elem.css({width:V+"px",right:"0px",top:"0px"});if(O&&this._label.constructor==w.jqplot.AxisLabelRenderer){this._label._elem.css("width",P+"px")}}}}}};w.jqplot.LinearAxisRenderer.prototype.createTicks=function(){var ax=this._ticks;var an=this.ticks;var ae=this.name;var ag=this._dataBounds;var O,T;var aJ,al;var V,U;var aH,aE;var ak=this.min;var aI=this.max;var aA=this.numberTicks;var aM=this.tickInterval;if(an.length){for(aE=0;aEthis.breakPoints[0]&&aq[0]<=this.breakPoints[1]){ay.show=false;ay.showGridline=false;ay.label=aq[1]}else{ay.label=aq[1]}}}else{ay.label=aq[1]}ay.setTick(aq[0],this.name);this._ticks.push(ay)}else{ay.value=aq;if(this.breakPoints){if(aq==this.breakPoints[0]){ay.label=this.breakTickLabel;ay._breakTick=true;ay.showGridline=false;ay.showMark=false}else{if(aq>this.breakPoints[0]&&aq<=this.breakPoints[1]){ay.show=false;ay.showGridline=false}}}ay.setTick(aq,this.name);this._ticks.push(ay)}}this.numberTicks=an.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.tickInterval=(this.max-this.min)/(this.numberTicks-1)}else{if(ae=="xaxis"||ae=="x2axis"){O=this._plotDimensions.width}else{O=this._plotDimensions.height}aJ=((this.min!=null)?this.min:ag.min);al=((this.max!=null)?this.max:ag.max);var aa=al-aJ;var aw,ad;var Y;if(this.min==null&&this.max==null&&this.numberTicks==null&&this.tickInterval==null&&!this.autoscale){if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}if(this.forceTickAt0){if(aJ>0){aJ=0}if(al<0){al=0}}if(this.forceTickAt100){if(aJ>100){aJ=100}if(al<100){al=100}}var S=30;var at=Math.max(O,S+1);var ab=(at-S)/300;var ar=w.jqplot.LinearTickGenerator(aJ,al,ab);var ac=aJ+aa*(this.padMin-1);var au=al-aa*(this.padMax-1);if(aJ<=ac||al>=au){ac=aJ-aa*(this.padMin-1);au=al+aa*(this.padMax-1);ar=w.jqplot.LinearTickGenerator(ac,au,ab)}this.min=ar[0];this.max=ar[1];this.numberTicks=ar[2];this._autoFormatString=ar[3];this.tickInterval=ar[4]}else{if(aJ==al){var P=0.05;if(aJ>0){P=Math.max(Math.log(aJ)/Math.LN10,0.05)}aJ-=P;al+=P}if(this.autoscale&&this.min==null&&this.max==null){var Q,R,X;var ah=false;var ap=false;var af={min:null,max:null,average:null,stddev:null};for(var aE=0;aEaF){aF=av[aD]}}}var Z=(aF-aj)/aF;if(az.renderer.constructor==w.jqplot.BarRenderer){if(aj>=0&&(az.fillToZero||Z>0.1)){ah=true}else{ah=false;if(az.fill&&az.fillToZero&&aj<0&&aF>0){ap=true}else{ap=false}}}else{if(az.fill){if(aj>=0&&(az.fillToZero||Z>0.1)){ah=true}else{if(aj<0&&aF>0&&az.fillToZero){ah=false;ap=true}else{ah=false;ap=false}}}else{if(aj<0){ah=false}}}}}if(ah){this.numberTicks=2+Math.ceil((O-(this.tickSpacing-1))/this.tickSpacing);this.min=0;ak=0;R=al/(this.numberTicks-1);Y=Math.pow(10,Math.abs(Math.floor(Math.log(R)/Math.LN10)));if(R/Y==parseInt(R/Y,10)){R+=Y}this.tickInterval=Math.ceil(R/Y)*Y;this.max=this.tickInterval*(this.numberTicks-1)}else{if(ap){this.numberTicks=2+Math.ceil((O-(this.tickSpacing-1))/this.tickSpacing);var am=Math.ceil(Math.abs(aJ)/aa*(this.numberTicks-1));var aL=this.numberTicks-1-am;R=Math.max(Math.abs(aJ/am),Math.abs(al/aL));Y=Math.pow(10,Math.abs(Math.floor(Math.log(R)/Math.LN10)));this.tickInterval=Math.ceil(R/Y)*Y;this.max=this.tickInterval*aL;this.min=-this.tickInterval*am}else{if(this.numberTicks==null){if(this.tickInterval){this.numberTicks=3+Math.ceil(aa/this.tickInterval)}else{this.numberTicks=2+Math.ceil((O-(this.tickSpacing-1))/this.tickSpacing)}}if(this.tickInterval==null){R=aa/(this.numberTicks-1);if(R<1){Y=Math.pow(10,Math.abs(Math.floor(Math.log(R)/Math.LN10)))}else{Y=1}this.tickInterval=Math.ceil(R*Y*this.pad)/Y}else{Y=1/this.tickInterval}Q=this.tickInterval*(this.numberTicks-1);X=(Q-aa)/2;if(this.min==null){this.min=Math.floor(Y*(aJ-X))/Y}if(this.max==null){this.max=this.min+Q}}}}else{aw=(this.min!=null)?this.min:aJ-aa*(this.padMin-1);ad=(this.max!=null)?this.max:al+aa*(this.padMax-1);this.min=aw;this.max=ad;aa=this.max-this.min;if(this.numberTicks==null){if(this.tickInterval!=null){this.numberTicks=Math.ceil((this.max-this.min)/this.tickInterval)+1;this.max=this.min+this.tickInterval*(this.numberTicks-1)}else{if(O>100){this.numberTicks=parseInt(3+(O-100)/75,10)}else{this.numberTicks=2}}}if(this.tickInterval==null){this.tickInterval=aa/(this.numberTicks-1)}}if(this.renderer.constructor==w.jqplot.LinearAxisRenderer&&this._autoFormatString==""){aa=this.max-this.min;var aK=new this.tickRenderer(this.tickOptions);var ao=aK.formatString||w.jqplot.config.defaultTickFormatString;var ao=ao.match(w.jqplot.sprintf.regex)[0];var aG=0;if(ao){if(ao.search(/[fFeEgGpP]/)>-1){var aC=ao.match(/\%\.(\d{0,})?[eEfFgGpP]/);if(aC){aG=parseInt(aC[1],10)}else{aG=6}}else{if(ao.search(/[di]/)>-1){aG=0}}var W=Math.pow(10,-aG);if(this.tickIntervalthis.breakPoints[0]&&agthis.breakPoints[0]&&agthis.breakPoints[0]&&ag=this.breakPoints[1]){return(ag-aa)*R/S}else{return(ag+this.breakPoints[1]-this.breakPoints[0]-aa)*R/S}};this.series_p2u=function(ag){return ag*S/R+aa}}}else{this.p2u=function(ag){return(ag-T)*S/R+Z};this.u2p=function(ag){return(ag-Z)*R/S+T};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(ag){return(ag-Z)*R/S};this.series_p2u=function(ag){return ag*S/R+Z}}else{this.series_u2p=function(ag){return(ag-aa)*R/S};this.series_p2u=function(ag){return ag*S/R+aa}}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(var ab=0;ab0){O=-W._textRenderer.height*Math.cos(-W._textRenderer.angle)/2}else{O=-W.getHeight()+W._textRenderer.height*Math.cos(W._textRenderer.angle)/2}break;case"middle":O=-W.getHeight()/2;break;default:O=-W.getHeight()/2;break}}else{O=-W.getHeight()/2}var af=this.u2p(W.value)+O+"px";W._elem.css("top",af);W.pack()}}if(X){var ac=this._label._elem.outerHeight(true);this._label._elem.css("top",V-R/2-ac/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}ae=null};function e(O){O=Math.abs(O);if(O>1){return"%d"}var P=-Math.floor(Math.log(O)/Math.LN10);return"%."+P+"f"}function B(P,O){var Q=Math.floor(Math.log(P)/Math.LN10);var S=Math.pow(10,Q);var R=P/S;R=R/O;if(R<=0.38){return 0.1*S}if(R<=1.6){return 0.2*S}if(R<=4){return 0.5*S}if(R<=8){return S}if(R<=16){return 2*S}return 5*S}w.jqplot.LinearTickGenerator=function(Q,T,P){if(Q==T){T=(T)?0:1}P=P||1;if(T0?"floor":"ceil"](R))};N.prototype.getAbbrDayName=function(){return N.regional[this.locale]["dayNamesShort"][this.proxy.getDay()]};N.prototype.getAbbrMonthName=function(){return N.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()]};N.prototype.getAMPM=function(){return this.proxy.getHours()>=12?"PM":"AM"};N.prototype.getAmPm=function(){return this.proxy.getHours()>=12?"pm":"am"};N.prototype.getCentury=function(){return parseInt(this.proxy.getFullYear()/100,10)};N.prototype.getDate=function(){return this.proxy.getDate()};N.prototype.getDay=function(){return this.proxy.getDay()};N.prototype.getDayOfWeek=function(){var O=this.proxy.getDay();return O===0?7:O};N.prototype.getDayOfYear=function(){var P=this.proxy;var O=P-new Date(""+P.getFullYear()+"/1/1 GMT");O+=P.getTimezoneOffset()*60000;P=null;return parseInt(O/60000/60/24,10)+1};N.prototype.getDayName=function(){return N.regional[this.locale]["dayNames"][this.proxy.getDay()]};N.prototype.getFullWeekOfYear=function(){var R=this.proxy;var O=this.getDayOfYear();var Q=6-R.getDay();var P=parseInt((O+Q)/7,10);return P};N.prototype.getFullYear=function(){return this.proxy.getFullYear()};N.prototype.getGmtOffset=function(){var O=this.proxy.getTimezoneOffset()/60;var P=O<0?"+":"-";O=Math.abs(O);return P+y(Math.floor(O),2)+":"+y((O%1)*60,2)};N.prototype.getHours=function(){return this.proxy.getHours()};N.prototype.getHours12=function(){var O=this.proxy.getHours();return O>12?O-12:(O==0?12:O)};N.prototype.getIsoWeek=function(){var R=this.proxy;var Q=R.getWeekOfYear();var O=(new Date(""+R.getFullYear()+"/1/1")).getDay();var P=Q+(O>4||O<=1?0:1);if(P==53&&(new Date(""+R.getFullYear()+"/12/31")).getDay()<4){P=1}else{if(P===0){R=new N(new Date(""+(R.getFullYear()-1)+"/12/31"));P=R.getIsoWeek()}}R=null;return P};N.prototype.getMilliseconds=function(){return this.proxy.getMilliseconds()};N.prototype.getMinutes=function(){return this.proxy.getMinutes()};N.prototype.getMonth=function(){return this.proxy.getMonth()};N.prototype.getMonthName=function(){return N.regional[this.locale]["monthNames"][this.proxy.getMonth()]};N.prototype.getMonthNumber=function(){return this.proxy.getMonth()+1};N.prototype.getSeconds=function(){return this.proxy.getSeconds()};N.prototype.getShortYear=function(){return this.proxy.getYear()%100};N.prototype.getTime=function(){return this.proxy.getTime()};N.prototype.getTimezoneAbbr=function(){return this.proxy.toString().replace(/^.*\(([^)]+)\)$/,"$1")};N.prototype.getTimezoneName=function(){var O=/(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());return O[1]||O[2]||"GMT"+this.getGmtOffset()};N.prototype.getTimezoneOffset=function(){return this.proxy.getTimezoneOffset()};N.prototype.getWeekOfYear=function(){var O=this.getDayOfYear();var Q=7-this.getDayOfWeek();var P=parseInt((O+Q)/7,10);return P};N.prototype.getUnix=function(){return Math.round(this.proxy.getTime()/1000,0)};N.prototype.getYear=function(){return this.proxy.getYear()};N.prototype.next=function(O){O=O||"day";return this.clone().add(1,O)};N.prototype.set=function(){switch(arguments.length){case 0:this.proxy=new Date();break;case 1:if(f(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var Q=this.options=arguments[0];this.syntax=Q.syntax||this.syntax;this.defaultCentury=Q.defaultCentury||this.defaultCentury;this.proxy=N.createDate(Q.date)}else{this.proxy=N.createDate(arguments[0])}break;default:var O=[];for(var P=0;P0?"floor":"ceil"](O/12));var P=Q.getMonth()+(O%12);if(P==12){P=0;Q.setYear(Q.getFullYear()+1)}else{if(P==-1){P=11;Q.setYear(Q.getFullYear()-1)}}Q.setMonth(P)},diff:function(S,Q){var O=S.getFullYear()-Q.getFullYear();var P=S.getMonth()-Q.getMonth()+(O*12);var R=S.getDate()-Q.getDate();return P+(R/30)}},year:{add:function(P,O){P.setYear(P.getFullYear()+Math[O>0?"floor":"ceil"](O))},diff:function(P,O){return s.month.diff(P,O)/12}}};for(var G in s){if(G.substring(G.length-1)!="s"){s[G+"s"]=s[G]}}var u=function(S,R,P){if(N.formats[P]["shortcuts"][R]){return N.strftime(S,N.formats[P]["shortcuts"][R],P)}else{var O=(N.formats[P]["codes"][R]||"").split(".");var Q=S["get"+O[0]]?S["get"+O[0]]():"";if(O[1]){Q=y(Q,O[1])}return Q}};N.strftime=function(U,R,Q,V){var P="perl";var T=N.regional.getLocale();if(Q&&N.formats.hasOwnProperty(Q)){P=Q}else{if(Q&&N.regional.hasOwnProperty(Q)){T=Q}}if(V&&N.formats.hasOwnProperty(V)){P=V}else{if(V&&N.regional.hasOwnProperty(V)){T=V}}if(f(U)!="[object Object]"||U._type!="jsDate"){U=new N(U);U.locale=T}if(!R){R=U.formatString||N.regional[T]["formatString"]}var O=R||"%Y-%m-%d",W="",S;while(O.length>0){if(S=O.match(N.formats[P].codes.matcher)){W+=O.slice(0,S.index);W+=(S[1]||"")+u(U,S[2],P);O=O.slice(S.index+S[0].length)}else{W+=O;O=""}}return W};N.formats={ISO:"%Y-%m-%dT%H:%M:%S.%N%G",SQL:"%Y-%m-%d %H:%M:%S"};N.formats.perl={codes:{matcher:/()%(#?(%|[a-z]))/i,Y:"FullYear",y:"ShortYear.2",m:"MonthNumber.2","#m":"MonthNumber",B:"MonthName",b:"AbbrMonthName",d:"Date.2","#d":"Date",e:"Date",A:"DayName",a:"AbbrDayName",w:"Day",H:"Hours.2","#H":"Hours",I:"Hours12.2","#I":"Hours12",p:"AMPM",M:"Minutes.2","#M":"Minutes",S:"Seconds.2","#S":"Seconds",s:"Unix",N:"Milliseconds.3","#N":"Milliseconds",O:"TimezoneOffset",Z:"TimezoneName",G:"GmtOffset"},shortcuts:{F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",D:"%m/%d/%y","#c":"%a %b %e %H:%M:%S %Y",v:"%e-%b-%Y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};N.formats.php={codes:{matcher:/()%((%|[a-z]))/i,a:"AbbrDayName",A:"DayName",d:"Date.2",e:"Date",j:"DayOfYear.3",u:"DayOfWeek",w:"Day",U:"FullWeekOfYear.2",V:"IsoWeek.2",W:"WeekOfYear.2",b:"AbbrMonthName",B:"MonthName",m:"MonthNumber.2",h:"AbbrMonthName",C:"Century.2",y:"ShortYear.2",Y:"FullYear",H:"Hours.2",I:"Hours12.2",l:"Hours12",p:"AMPM",P:"AmPm",M:"Minutes.2",S:"Seconds.2",s:"Unix",O:"TimezoneOffset",z:"GmtOffset",Z:"TimezoneAbbr"},shortcuts:{D:"%m/%d/%y",F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};N.createDate=function(Q){if(Q==null){return new Date()}if(Q instanceof Date){return Q}if(typeof Q=="number"){return new Date(Q)}var V=String(Q).replace(/^\s*(.+)\s*$/g,"$1");V=V.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/,"$1/$2/$3");V=V.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i,"$1 $2 $3");var U=V.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i);if(U&&U.length>3){var Z=parseFloat(U[3]);var T=N.config.defaultCentury+Z;T=String(T);V=V.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i,U[1]+" "+U[2]+" "+T)}U=V.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/);function Y(ad,ac){var ai=parseFloat(ac[1]);var ah=parseFloat(ac[2]);var ag=parseFloat(ac[3]);var af=N.config.defaultCentury;var ab,aa,aj,ae;if(ai>31){aa=ag;aj=ah;ab=af+ai}else{aa=ah;aj=ai;ab=af+ag}ae=aj+"/"+aa+"/"+ab;return ad.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/,ae)}if(U&&U.length>3){V=Y(V,U)}var U=V.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/);if(U&&U.length>3){V=Y(V,U)}var S=0;var P=N.matchers.length;var X,O,W=V;while(S31){O=U;P=T+V}else{O=V;P=T+U}var W=J(Q[2],N.regional[this.locale]["monthNamesShort"]);if(W==-1){W=J(Q[2],N.regional[this.locale]["monthNames"])}R.setFullYear(P,W,O);R.setHours(0,0,0,0);return R}else{return S}}];function J(Q,R){if(R.indexOf){return R.indexOf(Q)}for(var O=0,P=R.length;O
=W)?"":Array(1+W-aa.length>>>0).join(X);return Z?aa+Y:Y+aa}function R(Y){var X=new String(Y);for(var W=10;W>0;W--){if(X==(X=X.replace(/^(\d+)(\d{3})/,"$1"+w.jqplot.sprintf.thousandsSeparator+"$2"))){break}}return X}function Q(ab,aa,ad,Y,Z,X){var ac=Y-ab.length;if(ac>0){var W=" ";if(X){W=" "}if(ad||!Z){ab=U(ab,Y,W,ad)}else{ab=ab.slice(0,aa.length)+U("",ac,"0",true)+ab.slice(aa.length)}}return ab}function V(ae,X,ac,Y,W,ab,ad,aa){var Z=ae>>>0;ac=ac&&Z&&{"2":"0b","8":"0","16":"0x"}[X]||"";ae=ac+U(Z.toString(X),ab||0,"0",false);return Q(ae,ac,Y,W,ad,aa)}function O(aa,ab,Y,W,Z,X){if(W!=null){aa=aa.slice(0,W)}return Q(aa,"",ab,Y,Z,X)}var P=arguments,S=0,T=P[S++];return T.replace(w.jqplot.sprintf.regex,function(ar,ad,ae,ah,au,ao,ab){if(ar=="%%"){return"%"}var ai=false,af="",ag=false,aq=false,ac=false,aa=false;for(var an=0;ae&&an-1?6:(ab=="d")?0:void (0)}else{if(ao=="*"){ao=+P[S++]}else{if(ao.charAt(0)=="*"){ao=+P[ao.slice(1,-1)]}else{ao=+ao}}}var ak=ad?P[ad.slice(0,-1)]:P[S++];switch(ab){case"s":if(ak==null){return""}return O(String(ak),ai,ah,ao,ag,ac);case"c":return O(String.fromCharCode(+ak),ai,ah,ao,ag,ac);case"b":return V(ak,2,aq,ai,ah,ao,ag,ac);case"o":return V(ak,8,aq,ai,ah,ao,ag,ac);case"x":return V(ak,16,aq,ai,ah,ao,ag,ac);case"X":return V(ak,16,aq,ai,ah,ao,ag,ac).toUpperCase();case"u":return V(ak,10,aq,ai,ah,ao,ag,ac);case"i":var Y=parseInt(+ak,10);if(isNaN(Y)){return""}var am=Y<0?"-":af;var ap=aa?R(String(Math.abs(Y))):String(Math.abs(Y));ak=am+U(ap,ao,"0",false);return Q(ak,am,ai,ah,ag,ac);case"d":var Y=Math.round(+ak);if(isNaN(Y)){return""}var am=Y<0?"-":af;var ap=aa?R(String(Math.abs(Y))):String(Math.abs(Y));ak=am+U(ap,ao,"0",false);return Q(ak,am,ai,ah,ag,ac);case"e":case"E":case"f":case"F":case"g":case"G":var Y=+ak;if(isNaN(Y)){return""}var am=Y<0?"-":af;var Z=["toExponential","toFixed","toPrecision"]["efg".indexOf(ab.toLowerCase())];var at=["toString","toUpperCase"]["eEfFgG".indexOf(ab)%2];var ap=Math.abs(Y)[Z](ao);ap=aa?R(ap):ap;ak=am+ap;return Q(ak,am,ai,ah,ag,ac)[at]();case"p":case"P":var Y=+ak;if(isNaN(Y)){return""}var am=Y<0?"-":af;var aj=String(Number(Math.abs(Y)).toExponential()).split(/e|E/);var X=(aj[0].indexOf(".")!=-1)?aj[0].length-1:aj[0].length;var al=(aj[1]<0)?-aj[1]-1:0;if(Math.abs(Y)<1){if(X+al<=ao){ak=am+Math.abs(Y).toPrecision(X)}else{if(X<=ao-1){ak=am+Math.abs(Y).toExponential(X-1)}else{ak=am+Math.abs(Y).toExponential(ao-1)}}}else{var W=(X<=ao)?X:ao;ak=am+Math.abs(Y).toPrecision(W)}var at=["toString","toUpperCase"]["pP".indexOf(ab)%2];return Q(ak,am,ai,ah,ag,ac)[at]();case"n":return"";default:return ar}})};w.jqplot.sprintf.thousandsSeparator=",";w.jqplot.sprintf.regex=/%%|%(\d+\$)?([-+#0&\' ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([nAscboxXuidfegpEGP])/g})(jQuery);
\ No newline at end of file
diff --git a/public/js/wn/ui/appframe.js b/public/js/wn/ui/appframe.js
index 0a0f4e3dae..ab0dea1133 100644
--- a/public/js/wn/ui/appframe.js
+++ b/public/js/wn/ui/appframe.js
@@ -2,7 +2,7 @@ wn.ui.AppFrame = Class.extend({
init: function(parent, title, module) {
this.set_document_title = true;
this.buttons = {};
- this.$w = $('').appendTo(parent);
+ this.$w = $('').prependTo(parent);
this.$titlebar = $('\
\