From 884bca1184cdfe60ba8f6f3f54a2566206cd9e2f Mon Sep 17 00:00:00 2001
From: Adam Amstrong
Date: Thu, 29 Sep 2011 00:01:09 +0000
Subject: [PATCH] remove non-minimum javascripts
git-svn-id: http://www.observium.org/svn/observer/trunk@2607 61d68cd4-352d-0410-923a-c4978735b2b8
---
html/js/jqplot/jquery.jqplot.js | 8716 ----------------
html/js/jqplot/jquery.js | 8936 -----------------
.../plugins/jqplot.BezierCurveRenderer.js | 312 -
html/js/jqplot/plugins/jqplot.barRenderer.js | 709 --
.../js/jqplot/plugins/jqplot.blockRenderer.js | 234 -
.../jqplot/plugins/jqplot.bubbleRenderer.js | 754 --
.../plugins/jqplot.canvasAxisLabelRenderer.js | 207 -
.../plugins/jqplot.canvasAxisTickRenderer.js | 247 -
.../js/jqplot/plugins/jqplot.canvasOverlay.js | 705 --
.../plugins/jqplot.canvasTextRenderer.js | 420 -
.../plugins/jqplot.categoryAxisRenderer.js | 636 --
html/js/jqplot/plugins/jqplot.ciParser.js | 115 -
html/js/jqplot/plugins/jqplot.cursor.js | 1051 --
.../jqplot/plugins/jqplot.dateAxisRenderer.js | 439 -
.../js/jqplot/plugins/jqplot.donutRenderer.js | 910 --
.../plugins/jqplot.enhancedLegendRenderer.js | 199 -
.../jqplot/plugins/jqplot.funnelRenderer.js | 938 --
html/js/jqplot/plugins/jqplot.highlighter.js | 421 -
html/js/jqplot/plugins/jqplot.json2.js | 475 -
.../jqplot/plugins/jqplot.logAxisRenderer.js | 446 -
.../plugins/jqplot.mekkoAxisRenderer.js | 610 --
.../js/jqplot/plugins/jqplot.mekkoRenderer.js | 436 -
.../plugins/jqplot.meterGaugeRenderer.js | 1033 --
html/js/jqplot/plugins/jqplot.ohlcRenderer.js | 372 -
html/js/jqplot/plugins/jqplot.pieRenderer.js | 898 --
html/js/jqplot/plugins/jqplot.pointLabels.js | 353 -
html/js/jqplot/plugins/jqplot.trendline.js | 220 -
html/js/jquery-1.5.2.min.js | 16 -
html/js/jquery.js | 8316 ---------------
html/js/{jqplot => }/jquery.min.js | 0
html/js/overlib.js | 1491 ---
html/js/overlib_adaptive_width.js | 100 -
html/js/overlib_anchor.js | 333 -
html/js/{Mini => }/overlib_anchor_mini.js | 0
html/js/overlib_centerpopup.js | 89 -
.../js/{Mini => }/overlib_centerpopup_mini.js | 0
html/js/overlib_crossframe.js | 105 -
html/js/{Mini => }/overlib_crossframe_mini.js | 0
html/js/overlib_cssstyle.js | 182 -
html/js/{Mini => }/overlib_csstyle_mini.js | 0
html/js/overlib_debug.js | 177 -
html/js/{Mini => }/overlib_debug_mini.js | 0
html/js/overlib_exclusive.js | 123 -
html/js/{Mini => }/overlib_exclusive_mini.js | 0
html/js/overlib_followscroll.js | 175 -
.../{Mini => }/overlib_followscroll_mini.js | 0
html/js/overlib_hideform.js | 135 -
html/js/{Mini => }/overlib_hideform_mini.js | 0
html/js/{Mini => }/overlib_mini.js | 0
html/js/overlib_setonoff.js | 101 -
html/js/{Mini => }/overlib_setonoff_mini.js | 0
html/js/overlib_shadow.js | 270 -
html/js/{Mini => }/overlib_shadow_mini.js | 0
53 files changed, 42405 deletions(-)
delete mode 100644 html/js/jqplot/jquery.jqplot.js
delete mode 100644 html/js/jqplot/jquery.js
delete mode 100644 html/js/jqplot/plugins/jqplot.BezierCurveRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.barRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.blockRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.bubbleRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.canvasAxisLabelRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.canvasAxisTickRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.canvasOverlay.js
delete mode 100644 html/js/jqplot/plugins/jqplot.canvasTextRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.categoryAxisRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.ciParser.js
delete mode 100644 html/js/jqplot/plugins/jqplot.cursor.js
delete mode 100644 html/js/jqplot/plugins/jqplot.dateAxisRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.donutRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.enhancedLegendRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.funnelRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.highlighter.js
delete mode 100644 html/js/jqplot/plugins/jqplot.json2.js
delete mode 100644 html/js/jqplot/plugins/jqplot.logAxisRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.mekkoAxisRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.mekkoRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.meterGaugeRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.ohlcRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.pieRenderer.js
delete mode 100644 html/js/jqplot/plugins/jqplot.pointLabels.js
delete mode 100644 html/js/jqplot/plugins/jqplot.trendline.js
delete mode 100644 html/js/jquery-1.5.2.min.js
delete mode 100644 html/js/jquery.js
rename html/js/{jqplot => }/jquery.min.js (100%)
delete mode 100644 html/js/overlib.js
delete mode 100644 html/js/overlib_adaptive_width.js
delete mode 100644 html/js/overlib_anchor.js
rename html/js/{Mini => }/overlib_anchor_mini.js (100%)
delete mode 100644 html/js/overlib_centerpopup.js
rename html/js/{Mini => }/overlib_centerpopup_mini.js (100%)
delete mode 100644 html/js/overlib_crossframe.js
rename html/js/{Mini => }/overlib_crossframe_mini.js (100%)
delete mode 100644 html/js/overlib_cssstyle.js
rename html/js/{Mini => }/overlib_csstyle_mini.js (100%)
delete mode 100644 html/js/overlib_debug.js
rename html/js/{Mini => }/overlib_debug_mini.js (100%)
delete mode 100644 html/js/overlib_exclusive.js
rename html/js/{Mini => }/overlib_exclusive_mini.js (100%)
delete mode 100644 html/js/overlib_followscroll.js
rename html/js/{Mini => }/overlib_followscroll_mini.js (100%)
delete mode 100644 html/js/overlib_hideform.js
rename html/js/{Mini => }/overlib_hideform_mini.js (100%)
rename html/js/{Mini => }/overlib_mini.js (100%)
delete mode 100644 html/js/overlib_setonoff.js
rename html/js/{Mini => }/overlib_setonoff_mini.js (100%)
delete mode 100644 html/js/overlib_shadow.js
rename html/js/{Mini => }/overlib_shadow_mini.js (100%)
diff --git a/html/js/jqplot/jquery.jqplot.js b/html/js/jqplot/jquery.jqplot.js
deleted file mode 100644
index 8a795a5cd..000000000
--- a/html/js/jqplot/jquery.jqplot.js
+++ /dev/null
@@ -1,8716 +0,0 @@
-/**
- * Title: jqPlot Charts
- *
- * Pure JavaScript plotting plugin for jQuery.
- *
- * About: Version
- *
- * 1.0.0b2_r792
- *
- * About: Copyright & License
- *
- * Copyright (c) 2009-2011 Chris Leonello
- * jqPlot is currently available for use in all personal or commercial projects
- * under both the MIT and GPL version 2.0 licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- * See and contained within this distribution for further information.
- *
- * 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. This is, of course, not required.
- *
- * 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."
- *
- *
- * About: Introduction
- *
- * jqPlot requires jQuery (1.4+ required for certain features). jQuery 1.4.2 is included in the distribution.
- * To use jqPlot include jQuery, the jqPlot jQuery plugin, the jqPlot css file and optionally
- * the excanvas script for IE support in your web page:
- *
- * >
- * >
- * >
- * >
- *
- * jqPlot can be customized by overriding the defaults of any of the objects which make
- * up the plot. The general usage of jqplot is:
- *
- * > chart = $.jqplot('targetElemId', [dataArray,...], {optionsObject});
- *
- * The options available to jqplot are detailed in in the jqPlotOptions.txt file.
- *
- * An actual call to $.jqplot() may look like the
- * examples below:
- *
- * > chart = $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]);
- *
- * or
- *
- * > dataArray = [34,12,43,55,77];
- * > chart = $.jqplot('targetElemId', [dataArray, ...], {title:'My Plot', axes:{yaxis:{min:20, max:100}}});
- *
- * For more inforrmation, see .
- *
- * About: Usage
- *
- * See
- *
- * About: Available Options
- *
- * See for a list of options available thorugh the options object (not complete yet!)
- *
- * About: Options Usage
- *
- * See
- *
- * About: Changes
- *
- * See
- *
- */
-
-(function($) {
- // make sure undefined is undefined
- var undefined;
-
- $.fn.emptyForce = function() {
- for ( var i = 0, elem; (elem = $(this)[i]) != null; i++ ) {
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- }
-
- // Remove any remaining nodes
- if ($.jqplot_use_excanvas) {
- elem.outerHTML = "";
- }
- else {
- while ( elem.firstChild ) {
- elem.removeChild( elem.firstChild );
- }
- }
-
- elem = null;
- }
-
- return $(this);
- };
-
- $.fn.removeChildForce = function(parent) {
- while ( parent.firstChild ) {
- this.removeChildForce( parent.firstChild );
- parent.removeChild( parent.firstChild );
- }
- };
-
-
- /**
- * Namespace: $.jqplot
- * jQuery function called by the user to create a plot.
- *
- * Parameters:
- * target - ID of target element to render the plot into.
- * data - an array of data series.
- * options - user defined options object. See the individual classes for available options.
- *
- * Properties:
- * config - object to hold configuration information for jqPlot plot object.
- *
- * attributes:
- * enablePlugins - False to disable plugins by default. Plugins must then be explicitly
- * enabled in the individual plot options. Default: false.
- * This property sets the "show" property of certain plugins to true or false.
- * Only plugins that can be immediately active upon loading are affected. This includes
- * non-renderer plugins like cursor, dragable, highlighter, and trendline.
- * defaultHeight - Default height for plots where no css height specification exists. This
- * is a jqplot wide default.
- * defaultWidth - Default height for plots where no css height specification exists. This
- * is a jqplot wide default.
- */
-
- $.jqplot = function(target, data, options) {
- var _data, _options;
-
- if (options == null) {
- if (jQuery.isArray(data)) {
- _data = data;
- _options = null;
- }
-
- else if (typeof(data) === 'object') {
- _data = null;
- _options = data;
- }
- }
- else {
- _data = data;
- _options = options;
- }
- var plot = new jqPlot();
- // remove any error class that may be stuck on target.
- $('#'+target).removeClass('jqplot-error');
-
- if ($.jqplot.config.catchErrors) {
- try {
- plot.init(target, _data, _options);
- plot.draw();
- plot.themeEngine.init.call(plot);
- return plot;
- }
- catch(e) {
- var msg = $.jqplot.config.errorMessage || e.message;
- $('#'+target).append('
'+msg+'
');
- $('#'+target).addClass('jqplot-error');
- document.getElementById(target).style.background = $.jqplot.config.errorBackground;
- document.getElementById(target).style.border = $.jqplot.config.errorBorder;
- document.getElementById(target).style.fontFamily = $.jqplot.config.errorFontFamily;
- document.getElementById(target).style.fontSize = $.jqplot.config.errorFontSize;
- document.getElementById(target).style.fontStyle = $.jqplot.config.errorFontStyle;
- document.getElementById(target).style.fontWeight = $.jqplot.config.errorFontWeight;
- }
- }
- else {
- plot.init(target, _data, _options);
- plot.draw();
- plot.themeEngine.init.call(plot);
- return plot;
- }
- };
-
- $.jqplot.version = "1.0.0b2_r792";
-
- // canvas manager to reuse canvases on the plot.
- // Should help solve problem of canvases not being freed and
- // problem of waiting forever for firefox to decide to free memory.
- $.jqplot.CanvasManager = function() {
- // canvases are managed globally so that they can be reused
- // across plots after they have been freed
- if (typeof $.jqplot.CanvasManager.canvases == 'undefined') {
- $.jqplot.CanvasManager.canvases = [];
- $.jqplot.CanvasManager.free = [];
- }
-
- var myCanvases = [];
-
- this.getCanvas = function() {
- var canvas;
- var makeNew = true;
-
- if (!$.jqplot.use_excanvas) {
- for (var i = 0, l = $.jqplot.CanvasManager.canvases.length; i < l; i++) {
- if ($.jqplot.CanvasManager.free[i] === true) {
- makeNew = false;
- canvas = $.jqplot.CanvasManager.canvases[i];
- // $(canvas).removeClass('jqplot-canvasManager-free').addClass('jqplot-canvasManager-inuse');
- $.jqplot.CanvasManager.free[i] = false;
- myCanvases.push(i);
- break;
- }
- }
- }
-
- if (makeNew) {
- canvas = document.createElement('canvas');
- myCanvases.push($.jqplot.CanvasManager.canvases.length);
- $.jqplot.CanvasManager.canvases.push(canvas);
- $.jqplot.CanvasManager.free.push(false);
- }
-
- return canvas;
- };
-
- // this method has to be used after settings the dimesions
- // on the element returned by getCanvas()
- this.initCanvas = function(canvas) {
- if ($.jqplot.use_excanvas) {
- return window.G_vmlCanvasManager.initElement(canvas);
- }
- return canvas;
- };
-
- this.freeAllCanvases = function() {
- for (var i = 0, l=myCanvases.length; i < l; i++) {
- this.freeCanvas(myCanvases[i]);
- }
- myCanvases = [];
- };
-
- this.freeCanvas = function(idx) {
- if ($.jqplot.use_excanvas) {
- // excanvas can't be reused, but properly unset
- window.G_vmlCanvasManager.uninitElement($.jqplot.CanvasManager.canvases[idx]);
- $.jqplot.CanvasManager.canvases[idx] = null;
- }
- else {
- var canvas = $.jqplot.CanvasManager.canvases[idx];
- canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);
- $(canvas).unbind().removeAttr('class').removeAttr('style');
- // Style attributes seemed to be still hanging around. wierd. Some ticks
- // still retained a left: 0px attribute after reusing a canvas.
- $(canvas).css({left: '', top: '', position: ''});
- // setting size to 0 may save memory of unused canvases?
- canvas.width = 0;
- canvas.height = 0;
- $.jqplot.CanvasManager.free[idx] = true;
- }
- };
-
- };
-
-
- // Convienence function that won't hang IE or FF without FireBug.
- $.jqplot.log = function() {
- if (window.console) {
- console.log.apply(console, arguments);
- }
- };
-
- $.jqplot.config = {
- enablePlugins:false,
- defaultHeight:300,
- defaultWidth:400,
- UTCAdjust:false,
- timezoneOffset: new Date(new Date().getTimezoneOffset() * 60000),
- errorMessage: '',
- errorBackground: '',
- errorBorder: '',
- errorFontFamily: '',
- errorFontSize: '',
- errorFontStyle: '',
- errorFontWeight: '',
- catchErrors: false,
- defaultTickFormatString: "%.1f",
- defaultColors: [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
- defaultNegativeColors: [ "#498991", "#C08840", "#9F9274", "#546D61", "#646C4A", "#6F6621", "#6E3F5F", "#4F64B0", "#A89050", "#C45923", "#187399", "#945381", "#959E5C", "#C7AF7B", "#478396", "#907294"]
- };
-
-
- $.jqplot.arrayMax = function( array ){
- return Math.max.apply( Math, array );
- };
-
- $.jqplot.arrayMin = function( array ){
- return Math.min.apply( Math, array );
- };
-
- $.jqplot.enablePlugins = $.jqplot.config.enablePlugins;
-
- // canvas related tests taken from modernizer:
- // Copyright (c) 2009 - 2010 Faruk Ates.
- // http://www.modernizr.com
-
- $.jqplot.support_canvas = function() {
- if (typeof $.jqplot.support_canvas.result == 'undefined') {
- $.jqplot.support_canvas.result = !!document.createElement('canvas').getContext;
- }
- return $.jqplot.support_canvas.result;
- };
-
- $.jqplot.support_canvas_text = function() {
- if (typeof $.jqplot.support_canvas_text.result == 'undefined') {
- $.jqplot.support_canvas_text.result = !!(document.createElement('canvas').getContext && typeof document.createElement('canvas').getContext('2d').fillText == 'function');
- }
- return $.jqplot.support_canvas_text.result;
- };
-
- $.jqplot.use_excanvas = ($.browser.msie && !$.jqplot.support_canvas()) ? true : false;
-
- /**
- *
- * Hooks: jqPlot Pugin Hooks
- *
- * $.jqplot.preInitHooks - called before initialization.
- * $.jqplot.postInitHooks - called after initialization.
- * $.jqplot.preParseOptionsHooks - called before user options are parsed.
- * $.jqplot.postParseOptionsHooks - called after user options are parsed.
- * $.jqplot.preDrawHooks - called before plot draw.
- * $.jqplot.postDrawHooks - called after plot draw.
- * $.jqplot.preDrawSeriesHooks - called before each series is drawn.
- * $.jqplot.postDrawSeriesHooks - called after each series is drawn.
- * $.jqplot.preDrawLegendHooks - called before the legend is drawn.
- * $.jqplot.addLegendRowHooks - called at the end of legend draw, so plugins
- * can add rows to the legend table.
- * $.jqplot.preSeriesInitHooks - called before series is initialized.
- * $.jqplot.postSeriesInitHooks - called after series is initialized.
- * $.jqplot.preParseSeriesOptionsHooks - called before series related options
- * are parsed.
- * $.jqplot.postParseSeriesOptionsHooks - called after series related options
- * are parsed.
- * $.jqplot.eventListenerHooks - called at the end of plot drawing, binds
- * listeners to the event canvas which lays on top of the grid area.
- * $.jqplot.preDrawSeriesShadowHooks - called before series shadows are drawn.
- * $.jqplot.postDrawSeriesShadowHooks - called after series shadows are drawn.
- *
- */
-
- $.jqplot.preInitHooks = [];
- $.jqplot.postInitHooks = [];
- $.jqplot.preParseOptionsHooks = [];
- $.jqplot.postParseOptionsHooks = [];
- $.jqplot.preDrawHooks = [];
- $.jqplot.postDrawHooks = [];
- $.jqplot.preDrawSeriesHooks = [];
- $.jqplot.postDrawSeriesHooks = [];
- $.jqplot.preDrawLegendHooks = [];
- $.jqplot.addLegendRowHooks = [];
- $.jqplot.preSeriesInitHooks = [];
- $.jqplot.postSeriesInitHooks = [];
- $.jqplot.preParseSeriesOptionsHooks = [];
- $.jqplot.postParseSeriesOptionsHooks = [];
- $.jqplot.eventListenerHooks = [];
- $.jqplot.preDrawSeriesShadowHooks = [];
- $.jqplot.postDrawSeriesShadowHooks = [];
-
- // A superclass holding some common properties and methods.
- $.jqplot.ElemContainer = function() {
- this._elem;
- this._plotWidth;
- this._plotHeight;
- this._plotDimensions = {height:null, width:null};
- };
-
- $.jqplot.ElemContainer.prototype.createElement = function(el, offsets, clss, cssopts, attrib) {
- this._offsets = offsets;
- var klass = clss || 'jqplot';
- var elem = document.createElement(el);
- this._elem = $(elem);
- this._elem.addClass(klass);
- this._elem.css(cssopts);
- this._elem.attr(attrib);
- // avoid memory leak;
- elem = null;
- return this._elem;
- };
-
- $.jqplot.ElemContainer.prototype.getWidth = function() {
- if (this._elem) {
- return this._elem.outerWidth(true);
- }
- else {
- return null;
- }
- };
-
- $.jqplot.ElemContainer.prototype.getHeight = function() {
- if (this._elem) {
- return this._elem.outerHeight(true);
- }
- else {
- return null;
- }
- };
-
- $.jqplot.ElemContainer.prototype.getPosition = function() {
- if (this._elem) {
- return this._elem.position();
- }
- else {
- return {top:null, left:null, bottom:null, right:null};
- }
- };
-
- $.jqplot.ElemContainer.prototype.getTop = function() {
- return this.getPosition().top;
- };
-
- $.jqplot.ElemContainer.prototype.getLeft = function() {
- return this.getPosition().left;
- };
-
- $.jqplot.ElemContainer.prototype.getBottom = function() {
- return this._elem.css('bottom');
- };
-
- $.jqplot.ElemContainer.prototype.getRight = function() {
- return this._elem.css('right');
- };
-
-
- /**
- * Class: Axis
- * An individual axis object. Cannot be instantiated directly, but created
- * by the Plot oject. Axis properties can be set or overriden by the
- * options passed in from the user.
- *
- */
- function Axis(name) {
- $.jqplot.ElemContainer.call(this);
- // Group: Properties
- //
- // Axes options are specified within an axes object at the top level of the
- // plot options like so:
- // > {
- // > axes: {
- // > xaxis: {min: 5},
- // > yaxis: {min: 2, max: 8, numberTicks:4},
- // > x2axis: {pad: 1.5},
- // > y2axis: {ticks:[22, 44, 66, 88]}
- // > }
- // > }
- // There are 2 x axes, 'xaxis' and 'x2axis', and
- // 9 yaxes, 'yaxis', 'y2axis'. 'y3axis', ... Any or all of which may be specified.
- this.name = name;
- this._series = [];
- // prop: show
- // Wether to display the axis on the graph.
- this.show = false;
- // prop: tickRenderer
- // A class of a rendering engine for creating the ticks labels displayed on the plot,
- // See <$.jqplot.AxisTickRenderer>.
- this.tickRenderer = $.jqplot.AxisTickRenderer;
- // prop: tickOptions
- // Options that will be passed to the tickRenderer, see <$.jqplot.AxisTickRenderer> options.
- this.tickOptions = {};
- // prop: labelRenderer
- // A class of a rendering engine for creating an axis label.
- this.labelRenderer = $.jqplot.AxisLabelRenderer;
- // prop: labelOptions
- // Options passed to the label renderer.
- this.labelOptions = {};
- // prop: label
- // Label for the axis
- this.label = null;
- // prop: showLabel
- // true to show the axis label.
- this.showLabel = true;
- // prop: min
- // minimum value of the axis (in data units, not pixels).
- this.min=null;
- // prop: max
- // maximum value of the axis (in data units, not pixels).
- this.max=null;
- // prop: autoscale
- // Autoscale the axis min and max values to provide sensible tick spacing.
- // If axis min or max are set, autoscale will be turned off.
- // The numberTicks, tickInterval and pad options do work with
- // autoscale, although tickInterval has not been tested yet.
- // padMin and padMax do nothing when autoscale is on.
- this.autoscale = false;
- // prop: pad
- // Padding to extend the range above and below the data bounds.
- // The data range is multiplied by this factor to determine minimum and maximum axis bounds.
- // A value of 0 will be interpreted to mean no padding, and pad will be set to 1.0.
- this.pad = 1.2;
- // prop: padMax
- // Padding to extend the range above data bounds.
- // The top of the data range is multiplied by this factor to determine maximum axis bounds.
- // A value of 0 will be interpreted to mean no padding, and padMax will be set to 1.0.
- this.padMax = null;
- // prop: padMin
- // Padding to extend the range below data bounds.
- // The bottom of the data range is multiplied by this factor to determine minimum axis bounds.
- // A value of 0 will be interpreted to mean no padding, and padMin will be set to 1.0.
- this.padMin = null;
- // prop: ticks
- // 1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.
- // If no label is specified, the value is formatted into an appropriate label.
- this.ticks = [];
- // prop: numberTicks
- // Desired number of ticks. Default is to compute automatically.
- this.numberTicks;
- // prop: tickInterval
- // number of units between ticks. Mutually exclusive with numberTicks.
- this.tickInterval;
- // prop: renderer
- // A class of a rendering engine that handles tick generation,
- // scaling input data to pixel grid units and drawing the axis element.
- this.renderer = $.jqplot.LinearAxisRenderer;
- // prop: rendererOptions
- // renderer specific options. See <$.jqplot.LinearAxisRenderer> for options.
- this.rendererOptions = {};
- // prop: showTicks
- // Wether to show the ticks (both marks and labels) or not.
- // Will not override showMark and showLabel options if specified on the ticks themselves.
- this.showTicks = true;
- // prop: showTickMarks
- // Wether to show the tick marks (line crossing grid) or not.
- // Overridden by showTicks and showMark option of tick itself.
- this.showTickMarks = true;
- // prop: showMinorTicks
- // Wether or not to show minor ticks. This is renderer dependent.
- // The default <$.jqplot.LinearAxisRenderer> does not have minor ticks.
- this.showMinorTicks = true;
- // prop: useSeriesColor
- // Use the color of the first series associated with this axis for the
- // tick marks and line bordering this axis.
- this.useSeriesColor = false;
- // prop: borderWidth
- // width of line stroked at the border of the axis. Defaults
- // to the width of the grid boarder.
- this.borderWidth = null;
- // prop: borderColor
- // color of the border adjacent to the axis. Defaults to grid border color.
- this.borderColor = null;
- // minimum and maximum values on the axis.
- this._dataBounds = {min:null, max:null};
- // statistics (min, max, mean) as well as actual data intervals for each series attached to axis.
- // holds collection of {intervals:[], min:, max:, mean: } objects for each series on axis.
- this._intervalStats = [];
- // pixel position from the top left of the min value and max value on the axis.
- this._offsets = {min:null, max:null};
- this._ticks=[];
- this._label = null;
- // prop: syncTicks
- // true to try and synchronize tick spacing across multiple axes so that ticks and
- // grid lines line up. This has an impact on autoscaling algorithm, however.
- // In general, autoscaling an individual axis will work better if it does not
- // have to sync ticks.
- this.syncTicks = null;
- // prop: tickSpacing
- // Approximate pixel spacing between ticks on graph. Used during autoscaling.
- // This number will be an upper bound, actual spacing will be less.
- this.tickSpacing = 75;
- // Properties to hold the original values for min, max, ticks, tickInterval and numberTicks
- // so they can be restored if altered by plugins.
- this._min = null;
- this._max = null;
- this._tickInterval = null;
- this._numberTicks = null;
- this.__ticks = null;
- // hold original user options.
- this._options = {};
- }
-
- Axis.prototype = new $.jqplot.ElemContainer();
- Axis.prototype.constructor = Axis;
-
- Axis.prototype.init = function() {
- this.renderer = new this.renderer();
- // set the axis name
- this.tickOptions.axis = this.name;
- // if showMark or showLabel tick options not specified, use value of axis option.
- // showTicks overrides showTickMarks.
- if (this.tickOptions.showMark == null) {
- this.tickOptions.showMark = this.showTicks;
- }
- if (this.tickOptions.showMark == null) {
- this.tickOptions.showMark = this.showTickMarks;
- }
- if (this.tickOptions.showLabel == null) {
- this.tickOptions.showLabel = this.showTicks;
- }
-
- if (this.label == null || this.label == '') {
- this.showLabel = false;
- }
- else {
- this.labelOptions.label = this.label;
- }
- if (this.showLabel == false) {
- this.labelOptions.show = false;
- }
- // set the default padMax, padMin if not specified
- // special check, if no padding desired, padding
- // should be set to 1.0
- if (this.pad == 0) {
- this.pad = 1.0;
- }
- if (this.padMax == 0) {
- this.padMax = 1.0;
- }
- if (this.padMin == 0) {
- this.padMin = 1.0;
- }
- if (this.padMax == null) {
- this.padMax = (this.pad-1)/2 + 1;
- }
- if (this.padMin == null) {
- this.padMin = (this.pad-1)/2 + 1;
- }
- // now that padMin and padMax are correctly set, reset pad in case user has supplied
- // padMin and/or padMax
- this.pad = this.padMax + this.padMin - 1;
- if (this.min != null || this.max != null) {
- this.autoscale = false;
- }
- // if not set, sync ticks for y axes but not x by default.
- if (this.syncTicks == null && this.name.indexOf('y') > -1) {
- this.syncTicks = true;
- }
- else if (this.syncTicks == null){
- this.syncTicks = false;
- }
- this.renderer.init.call(this, this.rendererOptions);
-
- };
-
- Axis.prototype.draw = function(ctx, plot) {
- // Memory Leaks patch
- if (this.__ticks) {
- this.__ticks = null;
- }
-
- return this.renderer.draw.call(this, ctx, plot);
-
- };
-
- Axis.prototype.set = function() {
- this.renderer.set.call(this);
- };
-
- Axis.prototype.pack = function(pos, offsets) {
- if (this.show) {
- this.renderer.pack.call(this, pos, offsets);
- }
- // these properties should all be available now.
- if (this._min == null) {
- this._min = this.min;
- this._max = this.max;
- this._tickInterval = this.tickInterval;
- this._numberTicks = this.numberTicks;
- this.__ticks = this._ticks;
- }
- };
-
- // reset the axis back to original values if it has been scaled, zoomed, etc.
- Axis.prototype.reset = function() {
- this.renderer.reset.call(this);
- };
-
- Axis.prototype.resetScale = function(opts) {
- $.extend(true, this, {min: null, max: null, numberTicks: null, tickInterval: null, _ticks: [], ticks: []}, opts);
- this.resetDataBounds();
- };
-
- Axis.prototype.resetDataBounds = function() {
- // Go through all the series attached to this axis and find
- // the min/max bounds for this axis.
- var db = this._dataBounds;
- db.min = null;
- db.max = null;
- // check for when to force min 0 on bar series plots.
- var doforce = (this.show) ? true : false;
- for (var i=0; i db.max) || db.max == null) {
- db.max = d[j][0];
- }
- }
- else {
- if ((d[j][minyidx] != null && d[j][minyidx] < db.min) || db.min == null) {
- db.min = d[j][minyidx];
- }
- if ((d[j][maxyidx] != null && d[j][maxyidx] > db.max) || db.max == null) {
- db.max = d[j][maxyidx];
- }
- }
- }
-
- // Hack to not pad out bottom of bar plots unless user has specified a padding.
- // every series will have a chance to set doforce to false. once it is set to
- // false, it cannot be reset to true.
- // If any series attached to axis is not a bar, wont force 0.
- if (doforce && s.renderer.constructor !== $.jqplot.BarRenderer) {
- doforce = false;
- }
-
- else if (doforce && this._options.hasOwnProperty('forceTickAt0') && this._options.forceTickAt0 == false) {
- doforce = false;
- }
-
- else if (doforce && s.renderer.constructor === $.jqplot.BarRenderer) {
- if (s.barDirection == 'vertical' && this.name != 'xaxis' && this.name != 'x2axis') {
- if (this._options.pad != null || this._options.padMin != null) {
- doforce = false;
- }
- }
-
- else if (s.barDirection == 'horizontal' && (this.name == 'xaxis' || this.name == 'x2axis')) {
- if (this._options.pad != null || this._options.padMin != null) {
- doforce = false;
- }
- }
-
- }
- }
-
- if (doforce && this.renderer.constructor === $.jqplot.LinearAxisRenderer && db.min >= 0) {
- this.padMin = 1.0;
- this.forceTickAt0 = true;
- }
- };
-
- /**
- * Class: Legend
- * Legend object. Cannot be instantiated directly, but created
- * by the Plot oject. Legend properties can be set or overriden by the
- * options passed in from the user.
- */
- function Legend(options) {
- $.jqplot.ElemContainer.call(this);
- // Group: Properties
-
- // prop: show
- // Wether to display the legend on the graph.
- this.show = false;
- // prop: location
- // Placement of the legend. one of the compass directions: nw, n, ne, e, se, s, sw, w
- this.location = 'ne';
- // prop: labels
- // Array of labels to use. By default the renderer will look for labels on the series.
- // Labels specified in this array will override labels specified on the series.
- this.labels = [];
- // prop: showLabels
- // true to show the label text on the legend.
- this.showLabels = true;
- // prop: showSwatch
- // true to show the color swatches on the legend.
- this.showSwatches = true;
- // prop: placement
- // "insideGrid" places legend inside the grid area of the plot.
- // "outsideGrid" places the legend outside the grid but inside the plot container,
- // shrinking the grid to accomodate the legend.
- // "inside" synonym for "insideGrid",
- // "outside" places the legend ouside the grid area, but does not shrink the grid which
- // can cause the legend to overflow the plot container.
- this.placement = "insideGrid";
- // prop: xoffset
- // DEPRECATED. Set the margins on the legend using the marginTop, marginLeft, etc.
- // properties or via CSS margin styling of the .jqplot-table-legend class.
- this.xoffset = 0;
- // prop: yoffset
- // DEPRECATED. Set the margins on the legend using the marginTop, marginLeft, etc.
- // properties or via CSS margin styling of the .jqplot-table-legend class.
- this.yoffset = 0;
- // prop: border
- // css spec for the border around the legend box.
- this.border;
- // prop: background
- // css spec for the background of the legend box.
- this.background;
- // prop: textColor
- // css color spec for the legend text.
- this.textColor;
- // prop: fontFamily
- // css font-family spec for the legend text.
- this.fontFamily;
- // prop: fontSize
- // css font-size spec for the legend text.
- this.fontSize ;
- // prop: rowSpacing
- // css padding-top spec for the rows in the legend.
- this.rowSpacing = '0.5em';
- // renderer
- // A class that will create a DOM object for the legend,
- // see <$.jqplot.TableLegendRenderer>.
- this.renderer = $.jqplot.TableLegendRenderer;
- // prop: rendererOptions
- // renderer specific options passed to the renderer.
- this.rendererOptions = {};
- // prop: predraw
- // Wether to draw the legend before the series or not.
- // Used with series specific legend renderers for pie, donut, mekko charts, etc.
- this.preDraw = false;
- // prop: marginTop
- // CSS margin for the legend DOM element. This will set an element
- // CSS style for the margin which will override any style sheet setting.
- // The default will be taken from the stylesheet.
- this.marginTop = null;
- // prop: marginRight
- // CSS margin for the legend DOM element. This will set an element
- // CSS style for the margin which will override any style sheet setting.
- // The default will be taken from the stylesheet.
- this.marginRight = null;
- // prop: marginBottom
- // CSS margin for the legend DOM element. This will set an element
- // CSS style for the margin which will override any style sheet setting.
- // The default will be taken from the stylesheet.
- this.marginBottom = null;
- // prop: marginLeft
- // CSS margin for the legend DOM element. This will set an element
- // CSS style for the margin which will override any style sheet setting.
- // The default will be taken from the stylesheet.
- this.marginLeft = null;
-
- this.escapeHtml = false;
- this._series = [];
-
- $.extend(true, this, options);
- }
-
- Legend.prototype = new $.jqplot.ElemContainer();
- Legend.prototype.constructor = Legend;
-
- Legend.prototype.setOptions = function(options) {
- $.extend(true, this, options);
-
- // Try to emulate deprecated behaviour
- // if user has specified xoffset or yoffset, copy these to
- // the margin properties.
-
- 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;
- }
-
- // TO-DO:
- // Handle case where offsets are < 0.
- //
- };
-
- Legend.prototype.init = function() {
- this.renderer = new this.renderer();
- this.renderer.init.call(this, this.rendererOptions);
- };
-
- Legend.prototype.draw = function(offsets) {
- for (var i=0; i<$.jqplot.preDrawLegendHooks.length; i++){
- $.jqplot.preDrawLegendHooks[i].call(this, offsets);
- }
- return this.renderer.draw.call(this, offsets);
- };
-
- Legend.prototype.pack = function(offsets) {
- this.renderer.pack.call(this, offsets);
- };
-
- /**
- * Class: Title
- * Plot Title object. Cannot be instantiated directly, but created
- * by the Plot oject. Title properties can be set or overriden by the
- * options passed in from the user.
- *
- * Parameters:
- * text - text of the title.
- */
- function Title(text) {
- $.jqplot.ElemContainer.call(this);
- // Group: Properties
-
- // prop: text
- // text of the title;
- this.text = text;
- // prop: show
- // wether or not to show the title
- this.show = true;
- // prop: fontFamily
- // css font-family spec for the text.
- this.fontFamily;
- // prop: fontSize
- // css font-size spec for the text.
- this.fontSize ;
- // prop: textAlign
- // css text-align spec for the text.
- this.textAlign;
- // prop: textColor
- // css color spec for the text.
- this.textColor;
- // prop: renderer
- // A class for creating a DOM element for the title,
- // see <$.jqplot.DivTitleRenderer>.
- this.renderer = $.jqplot.DivTitleRenderer;
- // prop: rendererOptions
- // renderer specific options passed to the renderer.
- this.rendererOptions = {};
- }
-
- Title.prototype = new $.jqplot.ElemContainer();
- Title.prototype.constructor = Title;
-
- Title.prototype.init = function() {
- this.renderer = new this.renderer();
- this.renderer.init.call(this, this.rendererOptions);
- };
-
- Title.prototype.draw = function(width) {
- return this.renderer.draw.call(this, width);
- };
-
- Title.prototype.pack = function() {
- this.renderer.pack.call(this);
- };
-
-
- /**
- * Class: Series
- * An individual data series object. Cannot be instantiated directly, but created
- * by the Plot oject. Series properties can be set or overriden by the
- * options passed in from the user.
- */
- function Series() {
- $.jqplot.ElemContainer.call(this);
- // Group: Properties
- // Properties will be assigned from a series array at the top level of the
- // options. If you had two series and wanted to change the color and line
- // width of the first and set the second to use the secondary y axis with
- // no shadow and supply custom labels for each:
- // > {
- // > series:[
- // > {color: '#ff4466', lineWidth: 5, label:'good line'},
- // > {yaxis: 'y2axis', shadow: false, label:'bad line'}
- // > ]
- // > }
-
- // prop: show
- // wether or not to draw the series.
- this.show = true;
- // prop: xaxis
- // which x axis to use with this series, either 'xaxis' or 'x2axis'.
- this.xaxis = 'xaxis';
- this._xaxis;
- // prop: yaxis
- // which y axis to use with this series, either 'yaxis' or 'y2axis'.
- this.yaxis = 'yaxis';
- this._yaxis;
- this.gridBorderWidth = 2.0;
- // prop: renderer
- // A class of a renderer which will draw the series,
- // see <$.jqplot.LineRenderer>.
- this.renderer = $.jqplot.LineRenderer;
- // prop: rendererOptions
- // Options to pass on to the renderer.
- this.rendererOptions = {};
- this.data = [];
- this.gridData = [];
- // prop: label
- // Line label to use in the legend.
- this.label = '';
- // prop: showLabel
- // true to show label for this series in the legend.
- this.showLabel = true;
- // prop: color
- // css color spec for the series
- this.color;
- // prop: lineWidth
- // width of the line in pixels. May have different meanings depending on renderer.
- this.lineWidth = 2.5;
- // prop: lineJoin
- // Canvas lineJoin style between segments of series.
- this.lineJoin = 'round';
- // prop: lineCap
- // Canvas lineCap style at ends of line.
- this.lineCap = 'round';
- // prop: shadow
- // wether or not to draw a shadow on the line
- this.shadow = true;
- // prop: shadowAngle
- // Shadow angle in degrees
- this.shadowAngle = 45;
- // prop: shadowOffset
- // Shadow offset from line in pixels
- this.shadowOffset = 1.25;
- // prop: shadowDepth
- // Number of times shadow is stroked, each stroke offset shadowOffset from the last.
- this.shadowDepth = 3;
- // prop: shadowAlpha
- // Alpha channel transparency of shadow. 0 = transparent.
- this.shadowAlpha = '0.1';
- // prop: breakOnNull
- // Wether line segments should be be broken at null value.
- // False will join point on either side of line.
- this.breakOnNull = false;
- // prop: markerRenderer
- // A class of a renderer which will draw marker (e.g. circle, square, ...) at the data points,
- // see <$.jqplot.MarkerRenderer>.
- this.markerRenderer = $.jqplot.MarkerRenderer;
- // prop: markerOptions
- // renderer specific options to pass to the markerRenderer,
- // see <$.jqplot.MarkerRenderer>.
- this.markerOptions = {};
- // prop: showLine
- // wether to actually draw the line or not. Series will still be renderered, even if no line is drawn.
- this.showLine = true;
- // prop: showMarker
- // wether or not to show the markers at the data points.
- this.showMarker = true;
- // prop: index
- // 0 based index of this series in the plot series array.
- this.index;
- // prop: fill
- // true or false, wether to fill under lines or in bars.
- // May not be implemented in all renderers.
- this.fill = false;
- // prop: fillColor
- // CSS color spec to use for fill under line. Defaults to line color.
- this.fillColor;
- // prop: fillAlpha
- // Alpha transparency to apply to the fill under the line.
- // Use this to adjust alpha separate from fill color.
- this.fillAlpha;
- // prop: fillAndStroke
- // If true will stroke the line (with color this.color) as well as fill under it.
- // Applies only when fill is true.
- this.fillAndStroke = false;
- // prop: disableStack
- // true to not stack this series with other series in the plot.
- // To render properly, non-stacked series must come after any stacked series
- // in the plot's data series array. So, the plot's data series array would look like:
- // > [stackedSeries1, stackedSeries2, ..., nonStackedSeries1, nonStackedSeries2, ...]
- // disableStack will put a gap in the stacking order of series, and subsequent
- // stacked series will not fill down through the non-stacked series and will
- // most likely not stack properly on top of the non-stacked series.
- this.disableStack = false;
- // _stack is set by the Plot if the plot is a stacked chart.
- // will stack lines or bars on top of one another to build a "mountain" style chart.
- // May not be implemented in all renderers.
- this._stack = false;
- // prop: neighborThreshold
- // how close or far (in pixels) the cursor must be from a point marker to detect the point.
- this.neighborThreshold = 4;
- // prop: fillToZero
- // true will force bar and filled series to fill toward zero on the fill Axis.
- this.fillToZero = false;
- // prop: fillToValue
- // fill a filled series to this value on the fill axis.
- // Works in conjunction with fillToZero, so that must be true.
- this.fillToValue = 0;
- // prop: fillAxis
- // Either 'x' or 'y'. Which axis to fill the line toward if fillToZero is true.
- // 'y' means fill up/down to 0 on the y axis for this series.
- this.fillAxis = 'y';
- // prop: useNegativeColors
- // true to color negative values differently in filled and bar charts.
- this.useNegativeColors = true;
- this._stackData = [];
- // _plotData accounts for stacking. If plots not stacked, _plotData and data are same. If
- // stacked, _plotData is accumulation of stacking data.
- this._plotData = [];
- // _plotValues hold the individual x and y values that will be plotted for this series.
- this._plotValues = {x:[], y:[]};
- // statistics about the intervals between data points. Used for auto scaling.
- this._intervals = {x:{}, y:{}};
- // data from the previous series, for stacked charts.
- this._prevPlotData = [];
- this._prevGridData = [];
- this._stackAxis = 'y';
- this._primaryAxis = '_xaxis';
- // give each series a canvas to draw on. This should allow for redrawing speedups.
- this.canvas = new $.jqplot.GenericCanvas();
- this.shadowCanvas = new $.jqplot.GenericCanvas();
- this.plugins = {};
- // sum of y values in this series.
- this._sumy = 0;
- this._sumx = 0;
- this._type = '';
- }
-
- Series.prototype = new $.jqplot.ElemContainer();
- Series.prototype.constructor = Series;
-
- Series.prototype.init = function(index, gridbw, plot) {
- // weed out any null values in the data.
- this.index = index;
- this.gridBorderWidth = gridbw;
- var d = this.data;
- var temp = [], i;
- for (i=0; i.
- this.renderer = $.jqplot.CanvasGridRenderer;
- // prop: rendererOptions
- // Options to pass on to the renderer,
- // see <$.jqplot.CanvasGridRenderer>.
- this.rendererOptions = {};
- this._offsets = {top:null, bottom:null, left:null, right:null};
- }
-
- Grid.prototype = new $.jqplot.ElemContainer();
- Grid.prototype.constructor = Grid;
-
- Grid.prototype.init = function() {
- this.renderer = new this.renderer();
- this.renderer.init.call(this, this.rendererOptions);
- };
-
- Grid.prototype.createElement = function(offsets,plot) {
- this._offsets = offsets;
- return this.renderer.createElement.call(this, plot);
- };
-
- Grid.prototype.draw = function() {
- this.renderer.draw.call(this);
- };
-
- $.jqplot.GenericCanvas = function() {
- $.jqplot.ElemContainer.call(this);
- this._ctx;
- };
-
- $.jqplot.GenericCanvas.prototype = new $.jqplot.ElemContainer();
- $.jqplot.GenericCanvas.prototype.constructor = $.jqplot.GenericCanvas;
-
- $.jqplot.GenericCanvas.prototype.createElement = function(offsets, clss, plotDimensions, plot) {
- this._offsets = offsets;
- var klass = 'jqplot';
- if (clss != undefined) {
- klass = clss;
- }
- var elem;
-
- // if (this._elem) {
- // // Memory Leaks patch
- // if ($.jqplot.use_excanvas) {
- // window.G_vmlCanvasManager.uninitElement(this._elem.get(0));
- // }
- // }
- // else {
- // // don't use the canvas manager with excanvas.
- // if ($.jqplot.use_excanvas) {
- // elem = document.createElement('canvas');
- // }
- // else {
- // elem = plot.canvasManager.getCanvas();
- // }
-
- // }
-
- elem = plot.canvasManager.getCanvas();
-
- // if new plotDimensions supplied, use them.
- if (plotDimensions != null) {
- this._plotDimensions = plotDimensions;
- }
-
- elem.width = this._plotDimensions.width - this._offsets.left - this._offsets.right;
- elem.height = this._plotDimensions.height - this._offsets.top - this._offsets.bottom;
- this._elem = $(elem);
- this._elem.css({ position: 'absolute', left: this._offsets.left, top: this._offsets.top });
-
- this._elem.addClass(klass);
-
- elem = plot.canvasManager.initCanvas(elem);
-
- elem = null;
- return this._elem;
- };
-
- $.jqplot.GenericCanvas.prototype.setContext = function() {
- this._ctx = this._elem.get(0).getContext("2d");
- return this._ctx;
- };
-
- // Memory Leaks patch
- $.jqplot.GenericCanvas.prototype.resetCanvas = function() {
- if (this._elem) {
- if ($.jqplot.use_excanvas) {
- window.G_vmlCanvasManager.uninitElement(this._elem.get(0));
- }
-
- //this._elem.remove();
- this._elem.emptyForce();
- }
-
- this._ctx = null;
- };
-
- $.jqplot.HooksManager = function () {
- this.hooks =[];
- };
-
- $.jqplot.HooksManager.prototype.addOnce = function(fn) {
- var havehook = false, i;
- for (i=0; i {
- // > axesDefaults:{min:0},
- // > series:[{color:'#6633dd'}],
- // > title: 'A Plot'
- // > }
- //
- // prop: data
- // user's data. Data should *NOT* be specified in the options object,
- // but be passed in as the second argument to the $.jqplot() function.
- // The data property is described here soley for reference.
- // The data should be in the form of an array of 2D or 1D arrays like
- // > [ [[x1, y1], [x2, y2],...], [y1, y2, ...] ].
- this.data = [];
- // prop dataRenderer
- // A callable which can be used to preprocess data passed into the plot.
- // Will be called with 2 arguments, the plot data and a reference to the plot.
- this.dataRenderer;
- // prop dataRendererOptions
- // Options that will be passed to the dataRenderer.
- // Can be of any type.
- this.dataRendererOptions;
- // prop noDataIndicator
- // Options to set up a mock plot with a data loading indicator if no data is specified.
- this.noDataIndicator = {
- show: false,
- indicator: 'Loading Data...',
- axes: {
- xaxis: {
- min: 0,
- max: 10,
- tickInterval: 2,
- show: true
- },
- yaxis: {
- min: 0,
- max: 12,
- tickInterval: 3,
- show: true
- }
- }
- };
- // The id of the dom element to render the plot into
- this.targetId = null;
- // the jquery object for the dom target.
- this.target = null;
- this.defaults = {
- // prop: axesDefaults
- // default options that will be applied to all axes.
- // see for axes options.
- axesDefaults: {},
- axes: {xaxis:{}, yaxis:{}, x2axis:{}, y2axis:{}, y3axis:{}, y4axis:{}, y5axis:{}, y6axis:{}, y7axis:{}, y8axis:{}, y9axis:{}},
- // prop: seriesDefaults
- // default options that will be applied to all series.
- // see for series options.
- seriesDefaults: {},
- series:[]
- };
- // prop: series
- // Array of series object options.
- // see for series specific options.
- this.series = [];
- // prop: axes
- // up to 4 axes are supported, each with it's own options,
- // See for axis specific options.
- this.axes = {xaxis: new Axis('xaxis'), yaxis: new Axis('yaxis'), x2axis: new Axis('x2axis'), y2axis: new Axis('y2axis'), y3axis: new Axis('y3axis'), y4axis: new Axis('y4axis'), y5axis: new Axis('y5axis'), y6axis: new Axis('y6axis'), y7axis: new Axis('y7axis'), y8axis: new Axis('y8axis'), y9axis: new Axis('y9axis')};
- // prop: grid
- // See for grid specific options.
- this.grid = new Grid();
- // prop: legend
- // see <$.jqplot.TableLegendRenderer>
- this.legend = new Legend();
- this.baseCanvas = new $.jqplot.GenericCanvas();
- // array of series indicies. Keep track of order
- // which series canvases are displayed, lowest
- // to highest, back to front.
- this.seriesStack = [];
- this.previousSeriesStack = [];
- this.eventCanvas = new $.jqplot.GenericCanvas();
- this._width = null;
- this._height = null;
- this._plotDimensions = {height:null, width:null};
- this._gridPadding = {top:null, right:null, bottom:null, left:null};
- this._defaultGridPadding = {top:10, right:10, bottom:23, left:10};
- // a shortcut for axis syncTicks options. Not implemented yet.
- this.syncXTicks = true;
- // a shortcut for axis syncTicks options. Not implemented yet.
- this.syncYTicks = true;
- // prop: seriesColors
- // Ann array of CSS color specifications that will be applied, in order,
- // to the series in the plot. Colors will wrap around so, if their
- // are more series than colors, colors will be reused starting at the
- // beginning. For pie charts, this specifies the colors of the slices.
- this.seriesColors = $.jqplot.config.defaultColors;
- this.negativeSeriesColors = $.jqplot.config.defaultNegativeColors;
- // prop: sortData
- // false to not sort the data passed in by the user.
- // Many bar, stakced and other graphs as well as many plugins depend on
- // having sorted data.
- this.sortData = true;
- var seriesColorsIndex = 0;
- // prop textColor
- // css spec for the css color attribute. Default for the entire plot.
- this.textColor;
- // prop; fontFamily
- // css spec for the font-family attribute. Default for the entire plot.
- this.fontFamily;
- // prop: fontSize
- // css spec for the font-size attribute. Default for the entire plot.
- this.fontSize;
- // prop: title
- // Title object. See for specific options. As a shortcut, you
- // can specify the title option as just a string like: title: 'My Plot'
- // and this will create a new title object with the specified text.
- this.title = new Title();
- // container to hold all of the merged options. Convienence for plugins.
- this.options = {};
- // prop: stackSeries
- // true or false, creates a stack or "mountain" plot.
- // Not all series renderers may implement this option.
- this.stackSeries = false;
- // prop: defaultAxisStart
- // 1-D data series are internally converted into 2-D [x,y] data point arrays
- // by jqPlot. This is the default starting value for the missing x or y value.
- // The added data will be a monotonically increasing series (e.g. [1, 2, 3, ...])
- // starting at this value.
- this.defaultAxisStart = 1;
- // array to hold the cumulative stacked series data.
- // used to ajust the individual series data, which won't have access to other
- // series data.
- this._stackData = [];
- // array that holds the data to be plotted. This will be the series data
- // merged with the the appropriate data from _stackData according to the stackAxis.
- this._plotData = [];
- // Namespece to hold plugins. Generally non-renderer plugins add themselves to here.
- this.plugins = {};
- // Count how many times the draw method has been called while the plot is visible.
- // Mostly used to test if plot has never been dran (=0), has been successfully drawn
- // into a visible container once (=1) or draw more than once into a visible container.
- // Can use this in tests to see if plot has been visibly drawn at least one time.
- // After plot has been visibly drawn once, it generally doesn't need redrawn if its
- // container is hidden and shown.
- this._drawCount = 0;
- // this.doCustomEventBinding = true;
- // prop: drawIfHidden
- // True to execute the draw method even if the plot target is hidden.
- // Generally, this should be false. Most plot elements will not be sized/
- // positioned correclty if renderered into a hidden container. To render into
- // a hidden container, call the replot method when the container is shown.
- this.drawIfHidden = false;
- // true to intercept right click events and fire a 'jqplotRightClick' event.
- // this will also block the context menu.
- this.captureRightClick = false;
- this.themeEngine = new $.jqplot.ThemeEngine();
- // sum of y values for all series in plot.
- // used in mekko chart.
- this._sumy = 0;
- this._sumx = 0;
- this.preInitHooks = new $.jqplot.HooksManager();
- this.postInitHooks = new $.jqplot.HooksManager();
- this.preParseOptionsHooks = new $.jqplot.HooksManager();
- this.postParseOptionsHooks = new $.jqplot.HooksManager();
- this.preDrawHooks = new $.jqplot.HooksManager();
- this.postDrawHooks = new $.jqplot.HooksManager();
- this.preDrawSeriesHooks = new $.jqplot.HooksManager();
- this.postDrawSeriesHooks = new $.jqplot.HooksManager();
- this.preDrawLegendHooks = new $.jqplot.HooksManager();
- this.addLegendRowHooks = new $.jqplot.HooksManager();
- this.preSeriesInitHooks = new $.jqplot.HooksManager();
- this.postSeriesInitHooks = new $.jqplot.HooksManager();
- this.preParseSeriesOptionsHooks = new $.jqplot.HooksManager();
- this.postParseSeriesOptionsHooks = new $.jqplot.HooksManager();
- this.eventListenerHooks = new $.jqplot.EventListenerManager();
- this.preDrawSeriesShadowHooks = new $.jqplot.HooksManager();
- this.postDrawSeriesShadowHooks = new $.jqplot.HooksManager();
-
- this.colorGenerator = $.jqplot.ColorGenerator;
-
- this.canvasManager = new $.jqplot.CanvasManager();
-
- // Group: methods
- //
- // method: init
- // sets the plot target, checks data and applies user
- // options to plot.
- this.init = function(target, data, options) {
- options = options || {};
- for (var i=0; i<$.jqplot.preInitHooks.length; i++) {
- $.jqplot.preInitHooks[i].call(this, target, data, options);
- }
-
- for (var i=0; i');
- this.target.append(temp);
- temp.height(eh);
- temp.width(ew);
- temp.css('top', this.eventCanvas._offsets.top);
- temp.css('left', this.eventCanvas._offsets.left);
-
- var temp2 = $('');
- temp.append(temp2);
- temp2.html(this.noDataIndicator.indicator);
- var th = temp2.height();
- var tw = temp2.width();
- temp2.height(th);
- temp2.width(tw);
- temp2.css('top', (eh - th)/2 + 'px');
- });
-
- }
- }
-
- this.data = data;
-
- this.parseOptions(options);
-
- 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 i=0; i0) {
- series._prevPlotData = this.series[index-1]._plotData;
- }
- series._sumy = 0;
- series._sumx = 0;
- for (i=series.data.length-1; i>-1; i--) {
- series._sumy += series.data[i][1];
- series._sumx += series.data[i][0];
- }
- };
-
- // this.setData = function(seriesIndex, newdata) {
- // // if newdata is null, assume all data is passed in as first argument
- // if (newdata == null) {
-
- // }
- // };
-
- // function to safely return colors from the color array and wrap around at the end.
- this.getNextSeriesColor = (function(t) {
- var idx = 0;
- var sc = t.seriesColors;
-
- return function () {
- if (idx < sc.length) {
- return sc[idx++];
- }
- else {
- idx = 0;
- return sc[idx++];
- }
- };
- })(this);
-
- this.parseOptions = function(options){
- for (var i=0; i 0) {
- this._gridPadding[arr[n]] = gridPadding[arr[n]];
- }
- else if (this._gridPadding[arr[n]] == null) {
- this._gridPadding[arr[n]] = this._defaultGridPadding[arr[n]];
- }
- }
-
- var legendPadding = (this.legend.placement == 'outsideGrid') ? {top:this.title.getHeight(), left: 0, right: 0, bottom: 0} : this._gridPadding;
-
- ax.xaxis.pack({position:'absolute', bottom:this._gridPadding.bottom - ax.xaxis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right});
- ax.yaxis.pack({position:'absolute', top:0, left:this._gridPadding.left - ax.yaxis.getWidth(), height:this._height}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});
- ax.x2axis.pack({position:'absolute', top:this._gridPadding.top - ax.x2axis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right});
- for (i=8; i>0; i--) {
- ax[ra[i-1]].pack({position:'absolute', top:0, right:this._gridPadding.right - rapad[i-1]}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});
- }
- // ax.y2axis.pack({position:'absolute', top:0, right:0}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});
-
- this.target.append(this.grid.createElement(this._gridPadding, this));
- this.grid.draw();
-
- // put the shadow canvases behind the series canvases so shadows don't overlap on stacked bars.
- for (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 to check if event location is over a area area
- function checkIntersection(gridpos, plot) {
- var series = plot.series;
- var i, j, k, s, r, x, y, theta, sm, sa, minang, maxang;
- var d0, d, p, pp, points, bw;
- var threshold, t;
- for (k=plot.seriesStack.length-1; k>=0; k--) {
- i = plot.seriesStack[k];
- s = series[i];
- switch (s.renderer.constructor) {
- case $.jqplot.BarRenderer:
- x = gridpos.x;
- y = gridpos.y;
- for (j=0; jpoints[0][0] && xpoints[2][1] && y 0 && -y >= 0) {
- theta = 2*Math.PI - Math.atan(-y/x);
- }
- else if (x > 0 && -y < 0) {
- theta = -Math.atan(-y/x);
- }
- else if (x < 0) {
- theta = Math.PI - Math.atan(-y/x);
- }
- else if (x == 0 && -y > 0) {
- theta = 3*Math.PI/2;
- }
- else if (x == 0 && -y < 0) {
- theta = Math.PI/2;
- }
- else if (x == 0 && y == 0) {
- theta = 0;
- }
- if (sa) {
- theta -= sa;
- if (theta < 0) {
- theta += 2*Math.PI;
- }
- else if (theta > 2*Math.PI) {
- theta -= 2*Math.PI;
- }
- }
-
- sm = s.sliceMargin/180*Math.PI;
- if (r < s._radius && r > s._innerRadius) {
- for (j=0; j0) ? s.gridData[j-1][1]+sm : sm;
- maxang = s.gridData[j][1];
- if (theta > minang && theta < maxang) {
- return {seriesIndex:s.index, pointIndex:j, gridData:s.gridData[j], data:s.data[j]};
- }
- }
- }
- break;
-
- case $.jqplot.PieRenderer:
- sa = s.startAngle/180*Math.PI;
- x = gridpos.x - s._center[0];
- y = gridpos.y - s._center[1];
- r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
- if (x > 0 && -y >= 0) {
- theta = 2*Math.PI - Math.atan(-y/x);
- }
- else if (x > 0 && -y < 0) {
- theta = -Math.atan(-y/x);
- }
- else if (x < 0) {
- theta = Math.PI - Math.atan(-y/x);
- }
- else if (x == 0 && -y > 0) {
- theta = 3*Math.PI/2;
- }
- else if (x == 0 && -y < 0) {
- theta = Math.PI/2;
- }
- else if (x == 0 && y == 0) {
- theta = 0;
- }
- if (sa) {
- theta -= sa;
- if (theta < 0) {
- theta += 2*Math.PI;
- }
- else if (theta > 2*Math.PI) {
- theta -= 2*Math.PI;
- }
- }
-
- sm = s.sliceMargin/180*Math.PI;
- if (r < s._radius) {
- for (j=0; j0) ? s.gridData[j-1][1]+sm : sm;
- maxang = s.gridData[j][1];
- if (theta > minang && theta < maxang) {
- return {seriesIndex:s.index, pointIndex:j, gridData:s.gridData[j], data:s.data[j]};
- }
- }
- }
- break;
-
- case $.jqplot.BubbleRenderer:
- x = gridpos.x;
- y = gridpos.y;
- var ret = null;
-
- if (s.show) {
- for (var j=0; j= cv[0][1] && y <= cv[3][1] && x >= lex[0] && x <= rex[0]) {
- return {seriesIndex:s.index, pointIndex:j, gridData:null, data:s.data[j]};
- }
- }
- break;
-
- case $.jqplot.LineRenderer:
- x = gridpos.x;
- y = gridpos.y;
- r = s.renderer;
- if (s.show) {
- if (s.fill) {
- // first check if it is in bounding box
- var inside = false;
- if (x>s._boundingBox[0][0] && xs._boundingBox[1][1] && y= y || vertex2[1] < y && vertex1[1] >= y) {
- if (vertex1[0] + (y - vertex1[1]) / (vertex2[1] - vertex1[1]) * (vertex2[0] - vertex1[0]) < x) {
- inside = !inside;
- }
- }
-
- j = ii;
- }
- }
- if (inside) {
- return {seriesIndex:i, pointIndex:null, gridData:s.gridData, data:s.data, points:s._areaPoints};
- }
- break;
-
- }
- else {
- t = s.markerRenderer.size/2+s.neighborThreshold;
- threshold = (t > 0) ? t : 0;
- for (var j=0; j= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {
- return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
- }
- }
- // if an open hi low close chart
- else if (!r.hlc){
- var yp = s._yaxis.series_u2p;
- if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {
- return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
- }
- }
- // a hi low close chart
- else {
- var yp = s._yaxis.series_u2p;
- if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) {
- return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
- }
- }
-
- }
- else if (p[0] != null && p[1] != null){
- d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );
- if (d <= threshold && (d <= d0 || d0 == null)) {
- d0 = d;
- return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
- }
- }
- }
- }
- }
- break;
-
- default:
- x = gridpos.x;
- y = gridpos.y;
- r = s.renderer;
- if (s.show) {
- t = s.markerRenderer.size/2+s.neighborThreshold;
- threshold = (t > 0) ? t : 0;
- for (var j=0; j= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {
- return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
- }
- }
- // if an open hi low close chart
- else if (!r.hlc){
- var yp = s._yaxis.series_u2p;
- if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {
- return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
- }
- }
- // a hi low close chart
- else {
- var yp = s._yaxis.series_u2p;
- if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) {
- return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
- }
- }
-
- }
- else {
- d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );
- if (d <= threshold && (d <= d0 || d0 == null)) {
- d0 = d;
- return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
- }
- }
- }
- }
- break;
- }
- }
-
- return null;
- }
-
-
-
- this.onClick = function(ev) {
- // Event passed in is normalized and will have data attribute.
- // Event passed out is unnormalized.
- var positions = getEventPosition(ev);
- var p = ev.data.plot;
- var neighbor = checkIntersection(positions.gridPos, p);
- var evt = jQuery.Event('jqplotClick');
- evt.pageX = ev.pageX;
- evt.pageY = ev.pageY;
- $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
- };
-
- this.onDblClick = function(ev) {
- // Event passed in is normalized and will have data attribute.
- // Event passed out is unnormalized.
- var positions = getEventPosition(ev);
- var p = ev.data.plot;
- var neighbor = checkIntersection(positions.gridPos, p);
- var evt = jQuery.Event('jqplotDblClick');
- evt.pageX = ev.pageX;
- evt.pageY = ev.pageY;
- $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
- };
-
- this.onMouseDown = function(ev) {
- var positions = getEventPosition(ev);
- var p = ev.data.plot;
- var neighbor = checkIntersection(positions.gridPos, p);
- var evt = jQuery.Event('jqplotMouseDown');
- evt.pageX = ev.pageX;
- evt.pageY = ev.pageY;
- $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
- };
-
- this.onMouseUp = function(ev) {
- var positions = getEventPosition(ev);
- var evt = jQuery.Event('jqplotMouseUp');
- evt.pageX = ev.pageX;
- evt.pageY = ev.pageY;
- $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, ev.data.plot]);
- };
-
- this.onRightClick = function(ev) {
- var positions = getEventPosition(ev);
- var p = ev.data.plot;
- var neighbor = checkIntersection(positions.gridPos, p);
- if (p.captureRightClick) {
- if (ev.which == 3) {
- var evt = jQuery.Event('jqplotRightClick');
- evt.pageX = ev.pageX;
- evt.pageY = ev.pageY;
- $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
- }
- else {
- var evt = jQuery.Event('jqplotMouseUp');
- evt.pageX = ev.pageX;
- evt.pageY = ev.pageY;
- $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
- }
- }
- };
-
- this.onMouseMove = function(ev) {
- var positions = getEventPosition(ev);
- var p = ev.data.plot;
- var neighbor = checkIntersection(positions.gridPos, p);
- var evt = jQuery.Event('jqplotMouseMove');
- evt.pageX = ev.pageX;
- evt.pageY = ev.pageY;
- $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
- };
-
- this.onMouseEnter = function(ev) {
- var positions = getEventPosition(ev);
- var p = ev.data.plot;
- var evt = jQuery.Event('jqplotMouseEnter');
- evt.pageX = ev.pageX;
- evt.pageY = ev.pageY;
- $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]);
- };
-
- this.onMouseLeave = function(ev) {
- var positions = getEventPosition(ev);
- var p = ev.data.plot;
- var evt = jQuery.Event('jqplotMouseLeave');
- evt.pageX = ev.pageX;
- evt.pageY = ev.pageY;
- $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]);
- };
-
- // method: drawSeries
- // Redraws all or just one series on the plot. No axis scaling
- // is performed and no other elements on the plot are redrawn.
- // options is an options object to pass on to the series renderers.
- // It can be an empty object {}. idx is the series index
- // to redraw if only one series is to be redrawn.
- this.drawSeries = function(options, idx){
- var i, series, ctx;
- // if only one argument passed in and it is a number, use it ad idx.
- idx = (typeof(options) === "number" && idx == null) ? options : idx;
- options = (typeof(options) === "object") ? options : {};
- // draw specified series
- if (idx != undefined) {
- series = this.series[idx];
- ctx = series.shadowCanvas._ctx;
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
- series.drawShadow(ctx, options, this);
- ctx = series.canvas._ctx;
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
- series.draw(ctx, options, this);
- if (series.renderer.constructor == $.jqplot.BezierCurveRenderer) {
- if (idx < this.series.length - 1) {
- this.drawSeries(idx+1);
- }
- }
- }
-
- else {
- // if call series drawShadow method first, in case all series shadows
- // should be drawn before any series. This will ensure, like for
- // stacked bar plots, that shadows don't overlap series.
- for (i=0; i 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);
- newrgb[j] = parseInt(newrgb[j], 10);
- }
- ret.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')');
- }
- }
- else {
- var rgba = $.jqplot.getColorComponents(colors);
- var newrgb = [rgba[0], rgba[1], rgba[2]];
- var sum = newrgb[0] + newrgb[1] + newrgb[2];
- for (var j=0; j<3; j++) {
- // when darkening, lowest color component can be is 60.
- newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);
- newrgb[j] = parseInt(newrgb[j], 10);
- }
- ret = 'rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')';
- }
- return ret;
- };
-
- $.jqplot.ColorGenerator = function(colors) {
- colors = colors || $.jqplot.config.defaultColors;
- var idx = 0;
-
- this.next = function () {
- if (idx < colors.length) {
- return colors[idx++];
- }
- else {
- idx = 0;
- return colors[idx++];
- }
- };
-
- this.previous = function () {
- if (idx > 0) {
- return colors[idx--];
- }
- else {
- idx = colors.length-1;
- return colors[idx];
- }
- };
-
- // get a color by index without advancing pointer.
- this.get = function(i) {
- var idx = i - colors.length * Math.floor(i/colors.length);
- return colors[idx];
- };
-
- this.setColors = function(c) {
- colors = c;
- };
-
- this.reset = function() {
- idx = 0;
- };
- };
-
- // convert a hex color string to rgb string.
- // h - 3 or 6 character hex string, with or without leading #
- // a - optional alpha
- $.jqplot.hex2rgb = function(h, a) {
- h = h.replace('#', '');
- if (h.length == 3) {
- h = h.charAt(0)+h.charAt(0)+h.charAt(1)+h.charAt(1)+h.charAt(2)+h.charAt(2);
- }
- var rgb;
- rgb = 'rgba('+parseInt(h.slice(0,2), 16)+', '+parseInt(h.slice(2,4), 16)+', '+parseInt(h.slice(4,6), 16);
- if (a) {
- rgb += ', '+a;
- }
- rgb += ')';
- return rgb;
- };
-
- // convert an rgb color spec to a hex spec. ignore any alpha specification.
- $.jqplot.rgb2hex = function(s) {
- var pat = /rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *(?:, *[0-9.]*)?\)/;
- var m = s.match(pat);
- var h = '#';
- for (var i=1; i<4; i++) {
- var temp;
- if (m[i].search(/%/) != -1) {
- temp = parseInt(255*m[i]/100, 10).toString(16);
- if (temp.length == 1) {
- temp = '0'+temp;
- }
- }
- else {
- temp = parseInt(m[i], 10).toString(16);
- if (temp.length == 1) {
- temp = '0'+temp;
- }
- }
- h += temp;
- }
- return h;
- };
-
- // given a css color spec, return an rgb css color spec
- $.jqplot.normalize2rgb = function(s, a) {
- if (s.search(/^ *rgba?\(/) != -1) {
- return s;
- }
- else if (s.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/) != -1) {
- return $.jqplot.hex2rgb(s, a);
- }
- else {
- throw 'invalid color spec';
- }
- };
-
- // extract the r, g, b, a color components out of a css color spec.
- $.jqplot.getColorComponents = function(s) {
- // check to see if a color keyword.
- s = $.jqplot.colorKeywordMap[s] || s;
- var rgb = $.jqplot.normalize2rgb(s);
- var pat = /rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *,? *([0-9.]* *)?\)/;
- var m = rgb.match(pat);
- var ret = [];
- for (var i=1; i<4; i++) {
- if (m[i].search(/%/) != -1) {
- ret[i-1] = parseInt(255*m[i]/100, 10);
- }
- else {
- ret[i-1] = parseInt(m[i], 10);
- }
- }
- ret[3] = parseFloat(m[4]) ? parseFloat(m[4]) : 1.0;
- return ret;
- };
-
- $.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)'};
-
-
-
- // class: $.jqplot.AxisLabelRenderer
- // Renderer to place labels on the axes.
- $.jqplot.AxisLabelRenderer = function(options) {
- // Group: Properties
- $.jqplot.ElemContainer.call(this);
- // name of the axis associated with this tick
- this.axis;
- // prop: show
- // wether or not to show the tick (mark and label).
- this.show = true;
- // prop: label
- // The text or html for the label.
- this.label = '';
- this.fontFamily = null;
- this.fontSize = null;
- this.textColor = null;
- this._elem;
- // prop: escapeHTML
- // true to escape HTML entities in the label.
- this.escapeHTML = false;
-
- $.extend(true, this, options);
- };
-
- $.jqplot.AxisLabelRenderer.prototype = new $.jqplot.ElemContainer();
- $.jqplot.AxisLabelRenderer.prototype.constructor = $.jqplot.AxisLabelRenderer;
-
- $.jqplot.AxisLabelRenderer.prototype.init = function(options) {
- $.extend(true, this, options);
- };
-
- $.jqplot.AxisLabelRenderer.prototype.draw = function(ctx, plot) {
- // Memory Leaks patch
- if (this._elem) {
- this._elem.emptyForce();
- this._elem = null;
- }
-
- this._elem = $('');
-
- 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;
- };
-
- $.jqplot.AxisLabelRenderer.prototype.pack = function() {
- };
-
- // class: $.jqplot.AxisTickRenderer
- // A "tick" object showing the value of a tick/gridline on the plot.
- $.jqplot.AxisTickRenderer = function(options) {
- // Group: Properties
- $.jqplot.ElemContainer.call(this);
- // prop: mark
- // tick mark on the axis. One of 'inside', 'outside', 'cross', '' or null.
- this.mark = 'outside';
- // name of the axis associated with this tick
- this.axis;
- // prop: showMark
- // wether or not to show the mark on the axis.
- this.showMark = true;
- // prop: showGridline
- // wether or not to draw the gridline on the grid at this tick.
- this.showGridline = true;
- // prop: isMinorTick
- // if this is a minor tick.
- this.isMinorTick = false;
- // prop: size
- // Length of the tick beyond the grid in pixels.
- // DEPRECATED: This has been superceeded by markSize
- this.size = 4;
- // prop: markSize
- // Length of the tick marks in pixels. For 'cross' style, length
- // will be stoked above and below axis, so total length will be twice this.
- this.markSize = 6;
- // prop: show
- // wether or not to show the tick (mark and label).
- // Setting this to false requires more testing. It is recommended
- // to set showLabel and showMark to false instead.
- this.show = true;
- // prop: showLabel
- // wether or not to show the label.
- this.showLabel = true;
- this.label = '';
- this.value = null;
- this._styles = {};
- // prop: formatter
- // A class of a formatter for the tick text. sprintf by default.
- this.formatter = $.jqplot.DefaultTickFormatter;
- // prop: prefix
- // String to prepend to the tick label.
- // Prefix is prepended to the formatted tick label.
- this.prefix = '';
- // prop: formatString
- // string passed to the formatter.
- this.formatString = '';
- // prop: fontFamily
- // css spec for the font-family css attribute.
- this.fontFamily;
- // prop: fontSize
- // css spec for the font-size css attribute.
- this.fontSize;
- // prop: textColor
- // css spec for the color attribute.
- this.textColor;
- // prop: escapeHTML
- // true to escape HTML entities in the label.
- this.escapeHTML = false;
- this._elem;
- this._breakTick = false;
-
- $.extend(true, this, options);
- };
-
- $.jqplot.AxisTickRenderer.prototype.init = function(options) {
- $.extend(true, this, options);
- };
-
- $.jqplot.AxisTickRenderer.prototype = new $.jqplot.ElemContainer();
- $.jqplot.AxisTickRenderer.prototype.constructor = $.jqplot.AxisTickRenderer;
-
- $.jqplot.AxisTickRenderer.prototype.setTick = function(value, axisName, isMinor) {
- this.value = value;
- this.axis = axisName;
- if (isMinor) {
- this.isMinorTick = true;
- }
- return this;
- };
-
- $.jqplot.AxisTickRenderer.prototype.draw = function() {
- if (!this.label) {
- this.label = this.prefix + this.formatter(this.formatString, this.value);
- }
- var style = {position: 'absolute'};
- if (Number(this.label)) {
- style['whitSpace'] = 'nowrap';
- }
-
- // Memory Leaks patch
- if (this._elem) {
- this._elem.emptyForce();
- this._elem = null;
- }
-
- this._elem = $(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(style);
-
- for (var s in this._styles) {
- this._elem.css(s, this._styles[s]);
- }
- 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;
- };
-
- $.jqplot.DefaultTickFormatter = function (format, val) {
- if (typeof val == 'number') {
- if (!format) {
- format = $.jqplot.config.defaultTickFormatString;
- }
- return $.jqplot.sprintf(format, val);
- }
- else {
- return String(val);
- }
- };
-
- $.jqplot.AxisTickRenderer.prototype.pack = function() {
- };
-
- // Class: $.jqplot.CanvasGridRenderer
- // The default jqPlot grid renderer, creating a grid on a canvas element.
- // The renderer has no additional options beyond the class.
- $.jqplot.CanvasGridRenderer = function(){
- this.shadowRenderer = new $.jqplot.ShadowRenderer();
- };
-
- // called with context of Grid object
- $.jqplot.CanvasGridRenderer.prototype.init = function(options) {
- this._ctx;
- $.extend(true, this, options);
- // set the shadow renderer options
- var sopts = {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(sopts);
- };
-
- // called with context of Grid.
- $.jqplot.CanvasGridRenderer.prototype.createElement = function(plot) {
- var elem;
- // Memory Leaks patch
- if (this._elem) {
- if ($.jqplot.use_excanvas) {
- elem = this._elem.get(0);
- window.G_vmlCanvasManager.uninitElement(elem);
- elem = null;
- }
-
- this._elem.emptyForce();
- this._elem = null;
- }
-
- elem = plot.canvasManager.getCanvas();
-
- var w = this._plotDimensions.width;
- var h = this._plotDimensions.height;
- elem.width = w;
- elem.height = h;
- this._elem = $(elem);
- this._elem.addClass('jqplot-grid-canvas');
- this._elem.css({ position: 'absolute', left: 0, top: 0 });
-
- elem = plot.canvasManager.initCanvas(elem);
-
- this._top = this._offsets.top;
- this._bottom = h - this._offsets.bottom;
- this._left = this._offsets.left;
- this._right = w - this._offsets.right;
- this._width = this._right - this._left;
- this._height = this._bottom - this._top;
- // avoid memory leak
- elem = null;
- return this._elem;
- };
-
- $.jqplot.CanvasGridRenderer.prototype.draw = function() {
- this._ctx = this._elem.get(0).getContext("2d");
- var ctx = this._ctx;
- var axes = this._axes;
- // Add the grid onto the grid canvas. This is the bottom most layer.
- ctx.save();
- ctx.clearRect(0, 0, this._plotDimensions.width, this._plotDimensions.height);
- ctx.fillStyle = this.backgroundColor || this.background;
- ctx.fillRect(this._left, this._top, this._width, this._height);
-
- if (true) {
- ctx.save();
- ctx.lineJoin = 'miter';
- ctx.lineCap = 'butt';
- ctx.lineWidth = this.gridLineWidth;
- ctx.strokeStyle = this.gridLineColor;
- var b, e, s, m;
- var ax = ['xaxis', 'yaxis', 'x2axis', 'y2axis'];
- for (var i=4; i>0; i--) {
- var name = ax[i-1];
- var axis = axes[name];
- var ticks = axis._ticks;
- if (axis.show) {
- for (var j=ticks.length; j>0; j--) {
- var t = ticks[j-1];
- if (t.show) {
- var pos = Math.round(axis.u2p(t.value)) + 0.5;
- switch (name) {
- case 'xaxis':
- // draw the grid line
- if (t.showGridline && this.drawGridlines) {
- drawLine(pos, this._top, pos, this._bottom);
- }
-
- // draw the mark
- if (t.showMark && t.mark) {
- s = t.markSize;
- m = t.mark;
- var pos = Math.round(axis.u2p(t.value)) + 0.5;
- switch (m) {
- case 'outside':
- b = this._bottom;
- e = this._bottom+s;
- break;
- case 'inside':
- b = this._bottom-s;
- e = this._bottom;
- break;
- case 'cross':
- b = this._bottom-s;
- e = this._bottom+s;
- break;
- default:
- b = this._bottom;
- e = this._bottom+s;
- break;
- }
- // draw the shadow
- if (this.shadow) {
- this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});
- }
- // draw the line
- drawLine(pos, b, pos, e);
- }
- break;
- case 'yaxis':
- // draw the grid line
- if (t.showGridline && this.drawGridlines) {
- drawLine(this._right, pos, this._left, pos);
- }
- // draw the mark
- if (t.showMark && t.mark) {
- s = t.markSize;
- m = t.mark;
- var pos = Math.round(axis.u2p(t.value)) + 0.5;
- switch (m) {
- case 'outside':
- b = this._left-s;
- e = this._left;
- break;
- case 'inside':
- b = this._left;
- e = this._left+s;
- break;
- case 'cross':
- b = this._left-s;
- e = this._left+s;
- break;
- default:
- b = this._left-s;
- e = this._left;
- break;
- }
- // draw the shadow
- if (this.shadow) {
- this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});
- }
- drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});
- }
- break;
- case 'x2axis':
- // draw the grid line
- if (t.showGridline && this.drawGridlines) {
- drawLine(pos, this._bottom, pos, this._top);
- }
- // draw the mark
- if (t.showMark && t.mark) {
- s = t.markSize;
- m = t.mark;
- var pos = Math.round(axis.u2p(t.value)) + 0.5;
- switch (m) {
- case 'outside':
- b = this._top-s;
- e = this._top;
- break;
- case 'inside':
- b = this._top;
- e = this._top+s;
- break;
- case 'cross':
- b = this._top-s;
- e = this._top+s;
- break;
- default:
- b = this._top-s;
- e = this._top;
- break;
- }
- // draw the shadow
- if (this.shadow) {
- this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});
- }
- drawLine(pos, b, pos, e);
- }
- break;
- case 'y2axis':
- // draw the grid line
- if (t.showGridline && this.drawGridlines) {
- drawLine(this._left, pos, this._right, pos);
- }
- // draw the mark
- if (t.showMark && t.mark) {
- s = t.markSize;
- m = t.mark;
- var pos = Math.round(axis.u2p(t.value)) + 0.5;
- switch (m) {
- case 'outside':
- b = this._right;
- e = this._right+s;
- break;
- case 'inside':
- b = this._right-s;
- e = this._right;
- break;
- case 'cross':
- b = this._right-s;
- e = this._right+s;
- break;
- default:
- b = this._right;
- e = this._right+s;
- break;
- }
- // draw the shadow
- if (this.shadow) {
- this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});
- }
- drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});
- }
- break;
- default:
- break;
- }
- }
- }
- t = null;
- }
- axis = null;
- ticks = null;
- }
- // Now draw grid lines for additional y axes
- ax = ['y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis'];
- for (var i=7; i>0; i--) {
- var axis = axes[ax[i-1]];
- var ticks = axis._ticks;
- if (axis.show) {
- var tn = ticks[axis.numberTicks-1];
- var t0 = ticks[0];
- var left = axis.getLeft();
- var points = [[left, tn.getTop() + tn.getHeight()/2], [left, t0.getTop() + t0.getHeight()/2 + 1.0]];
- // draw the shadow
- if (this.shadow) {
- this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', fill:false, closePath:false});
- }
- // draw the line
- drawLine(points[0][0], points[0][1], points[1][0], points[1][1], {lineCap:'butt', strokeStyle:axis.borderColor, lineWidth:axis.borderWidth});
- // draw the tick marks
- for (var j=ticks.length; j>0; j--) {
- var t = ticks[j-1];
- s = t.markSize;
- m = t.mark;
- var pos = Math.round(axis.u2p(t.value)) + 0.5;
- if (t.showMark && t.mark) {
- switch (m) {
- case 'outside':
- b = left;
- e = left+s;
- break;
- case 'inside':
- b = left-s;
- e = left;
- break;
- case 'cross':
- b = left-s;
- e = left+s;
- break;
- default:
- b = left;
- e = left+s;
- break;
- }
- points = [[b,pos], [e,pos]];
- // draw the shadow
- if (this.shadow) {
- this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});
- }
- // draw the line
- drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});
- }
- t = null;
- }
- t0 = null;
- }
- axis = null;
- ticks = null;
- }
-
- ctx.restore();
- }
-
- function drawLine(bx, by, ex, ey, opts) {
- ctx.save();
- opts = opts || {};
- if (opts.lineWidth == null || opts.lineWidth != 0){
- $.extend(true, ctx, opts);
- ctx.beginPath();
- ctx.moveTo(bx, by);
- ctx.lineTo(ex, ey);
- ctx.stroke();
- ctx.restore();
- }
- }
-
- if (this.shadow) {
- var points = [[this._left, this._bottom], [this._right, this._bottom], [this._right, this._top]];
- this.renderer.shadowRenderer.draw(ctx, points);
- }
- // Now draw border around grid. Use axis border definitions. start at
- // upper left and go clockwise.
- if (this.borderWidth != 0 && this.drawBorder) {
- drawLine (this._left, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth});
- drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth});
- drawLine (this._right, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth});
- drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth});
- }
- // ctx.lineWidth = this.borderWidth;
- // ctx.strokeStyle = this.borderColor;
- // ctx.strokeRect(this._left, this._top, this._width, this._height);
-
- ctx.restore();
- ctx = null;
- axes = null;
- };
-
- // Class: $.jqplot.DivTitleRenderer
- // The default title renderer for jqPlot. This class has no options beyond the class.
- $.jqplot.DivTitleRenderer = function() {
- };
-
- $.jqplot.DivTitleRenderer.prototype.init = function(options) {
- $.extend(true, this, options);
- };
-
- $.jqplot.DivTitleRenderer.prototype.draw = function() {
- // Memory Leaks patch
- if (this._elem) {
- this._elem.emptyForce();
- this._elem = null;
- }
-
- var r = this.renderer;
- var elem = document.createElement('div');
- this._elem = $(elem);
- this._elem.addClass('jqplot-title');
-
- if (!this.text) {
- this.show = false;
- this._elem.height(0);
- this._elem.width(0);
- }
- else if (this.text) {
- var color;
- if (this.color) {
- color = this.color;
- }
- else if (this.textColor) {
- color = this.textColor;
- }
-
- // don't trust that a stylesheet is present, set the position.
- var styles = {position:'absolute', top:'0px', left:'0px'};
-
- if (this._plotWidth) {
- styles['width'] = this._plotWidth+'px';
- }
- if (this.fontSize) {
- styles['fontSize'] = this.fontSize;
- }
- if (this.textAlign) {
- styles['textAlign'] = this.textAlign;
- }
- else {
- styles['textAlign'] = 'center';
- }
- if (color) {
- styles['color'] = color;
- }
- if (this.paddingBottom) {
- styles['paddingBottom'] = this.paddingBottom;
- }
- if (this.fontFamily) {
- styles['fontFamily'] = this.fontFamily;
- }
-
- this._elem.css(styles);
- this._elem.text(this.text);
-
-
- // styletext += (this._plotWidth) ? 'width:'+this._plotWidth+'px;' : '';
- // styletext += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';
- // styletext += (this.textAlign) ? 'text-align:'+this.textAlign+';' : 'text-align:center;';
- // styletext += (color) ? 'color:'+color+';' : '';
- // styletext += (this.paddingBottom) ? 'padding-bottom:'+this.paddingBottom+';' : '';
- // this._elem = $('
'+this.text+'
');
- // if (this.fontFamily) {
- // this._elem.css('font-family', this.fontFamily);
- // }
- }
-
- elem = null;
-
- return this._elem;
- };
-
- $.jqplot.DivTitleRenderer.prototype.pack = function() {
- // nothing to do here
- };
-
- // Class: $.jqplot.LineRenderer
- // The default line renderer for jqPlot, this class has no options beyond the class.
- // Draws series as a line.
- $.jqplot.LineRenderer = function(){
- this.shapeRenderer = new $.jqplot.ShapeRenderer();
- this.shadowRenderer = new $.jqplot.ShadowRenderer();
- };
-
- // called with scope of series.
- $.jqplot.LineRenderer.prototype.init = function(options, plot) {
- options = options || {};
- this._type='line';
- var lopts = {highlightMouseOver: options.highlightMouseOver, highlightMouseDown: options.highlightMouseDown, highlightColor: options.highlightColor};
-
- delete (options.highlightMouseOver);
- delete (options.highlightMouseDown);
- delete (options.highlightColor);
-
- $.extend(true, this.renderer, options);
- // set the shape renderer options
- var opts = {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(opts);
- // set the shadow renderer options
- // scale the shadowOffset to the width of the line.
- if (this.lineWidth > 2.5) {
- var shadow_offset = this.shadowOffset* (1 + (Math.atan((this.lineWidth/2.5))/0.785398163 - 1)*0.6);
- // var shadow_offset = this.shadowOffset;
- }
- // for skinny lines, don't make such a big shadow.
- else {
- var shadow_offset = this.shadowOffset*Math.atan((this.lineWidth/2.5))/0.785398163;
- }
- var sopts = {lineJoin:this.lineJoin, lineCap:this.lineCap, fill:this.fill, isarc:false, angle:this.shadowAngle, offset:shadow_offset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.lineWidth, closePath:this.fill};
- this.renderer.shadowRenderer.init(sopts);
- this._areaPoints = [];
- this._boundingBox = [[],[]];
-
- if (!this.isTrendline && this.fill) {
-
- // prop: highlightMouseOver
- // True to highlight area on a filled plot when moused over.
- // This must be false to enable highlightMouseDown to highlight when clicking on an area on a filled plot.
- this.highlightMouseOver = true;
- // prop: highlightMouseDown
- // True to highlight when a mouse button is pressed over an area on a filled plot.
- // This will be disabled if highlightMouseOver is true.
- this.highlightMouseDown = false;
- // prop: highlightColor
- // color to use when highlighting an area on a filled plot.
- this.highlightColor = null;
- // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver
- if (lopts.highlightMouseDown && lopts.highlightMouseOver == null) {
- lopts.highlightMouseOver = false;
- }
-
- $.extend(true, this, {highlightMouseOver: lopts.highlightMouseOver, highlightMouseDown: lopts.highlightMouseDown, highlightColor: lopts.highlightColor});
-
- if (!this.highlightColor) {
- this.highlightColor = $.jqplot.computeHighlightColors(this.fillColor);
- }
- // turn off (disable) the highlighter plugin
- if (this.highlighter) {
- this.highlighter.show = false;
- }
- }
-
- if (!this.isTrendline && plot) {
- plot.plugins.lineRenderer = {};
- plot.postInitHooks.addOnce(postInit);
- plot.postDrawHooks.addOnce(postPlotDraw);
- 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);
- }
-
- };
-
- // Method: setGridData
- // converts the user data values to grid coordinates and stores them
- // in the gridData array.
- // Called with scope of a series.
- $.jqplot.LineRenderer.prototype.setGridData = function(plot) {
- // recalculate the grid data
- var xp = this._xaxis.series_u2p;
- var yp = this._yaxis.series_u2p;
- var data = this._plotData;
- var pdata = this._prevPlotData;
- this.gridData = [];
- this._prevGridData = [];
- for (var i=0; i0; i--) {
- gd.push(prev[i-1]);
- // this._areaPoints.push(prev[i-1]);
- }
- if (shadow) {
- this.renderer.shadowRenderer.draw(ctx, gd, opts);
- }
- this._areaPoints = gd;
- this.renderer.shapeRenderer.draw(ctx, gd, opts);
- }
- }
- /////////////////////////
- // Not filled to zero
- ////////////////////////
- else {
- // if stoking line as well as filling, get a copy of line data.
- if (fillAndStroke) {
- var fasgd = gd.slice(0);
- }
- // if not stacked, fill down to axis
- if (this.index == 0 || !this._stack) {
- // var gridymin = this._yaxis.series_u2p(this._yaxis.min) - this.gridBorderWidth / 2;
- var gridymin = ctx.canvas.height;
- // IE doesn't return new length on unshift
- gd.unshift([gd[0][0], gridymin]);
- var len = gd.length;
- gd.push([gd[len - 1][0], gridymin]);
- }
- // if stacked, fill to line below
- else {
- var prev = this._prevGridData;
- for (var i=prev.length; i>0; i--) {
- gd.push(prev[i-1]);
- }
- }
- this._areaPoints = gd;
-
- if (shadow) {
- this.renderer.shadowRenderer.draw(ctx, gd, opts);
- }
-
- this.renderer.shapeRenderer.draw(ctx, gd, opts);
- }
- if (fillAndStroke) {
- var fasopts = $.extend(true, {}, opts, {fill:false, closePath:false});
- this.renderer.shapeRenderer.draw(ctx, fasgd, fasopts);
- //////////
- // TODO: figure out some way to do shadows nicely
- // if (shadow) {
- // this.renderer.shadowRenderer.draw(ctx, fasgd, fasopts);
- // }
- // now draw the markers
- if (this.markerRenderer.show) {
- for (i=0; i p[0] || xmin == null) {
- xmin = p[0];
- }
- if (ymax < p[1] || ymax == null) {
- ymax = p[1];
- }
- if (xmax < p[0] || xmax == null) {
- xmax = p[0];
- }
- if (ymin > p[1] || ymin == null) {
- ymin = p[1];
- }
- }
- this._boundingBox = [[xmin, ymax], [xmax, ymin]];
-
- // now draw the markers
- if (this.markerRenderer.show && !fill) {
- for (i=0; i object.
- $.jqplot.LinearAxisRenderer = function() {
- };
-
- // called with scope of axis object.
- $.jqplot.LinearAxisRenderer.prototype.init = function(options){
- // prop: breakPoints
- // EXPERIMENTAL!! Use at your own risk!
- // Works only with linear axes and the default tick renderer.
- // Array of [start, stop] points to create a broken axis.
- // Broken axes have a "jump" in them, which is an immediate
- // transition from a smaller value to a larger value.
- // Currently, axis ticks MUST be manually assigned if using breakPoints
- // by using the axis ticks array option.
- this.breakPoints = null;
- // prop: breakTickLabel
- // Label to use at the axis break if breakPoints are specified.
- this.breakTickLabel = "≈";
- // prop: forceTickAt0
- // This will ensure that there is always a tick mark at 0.
- // If data range is strictly positive or negative,
- // this will force 0 to be inside the axis bounds unless
- // the appropriate axis pad (pad, padMin or padMax) is set
- // to 0, then this will force an axis min or max value at 0.
- // This has know effect when any of the following options
- // are set: autoscale, min, max, numberTicks or tickInterval.
- this.forceTickAt0 = false;
- // prop: forceTickAt100
- // This will ensure that there is always a tick mark at 100.
- // If data range is strictly above or below 100,
- // this will force 100 to be inside the axis bounds unless
- // the appropriate axis pad (pad, padMin or padMax) is set
- // to 0, then this will force an axis min or max value at 100.
- // This has know effect when any of the following options
- // are set: autoscale, min, max, numberTicks or tickInterval.
- this.forceTickAt100 = false;
- this._autoFormatString = '';
- this._overrideFormatString = false;
- $.extend(true, this, options);
- if (this.breakPoints) {
- if (!$.isArray(this.breakPoints)) {
- this.breakPoints = null;
- }
- else if (this.breakPoints.length < 2 || this.breakPoints[1] <= this.breakPoints[0]) {
- this.breakPoints = null;
- }
- }
- this.resetDataBounds();
- };
-
- // called with scope of axis
- $.jqplot.LinearAxisRenderer.prototype.draw = function(ctx, plot) {
- if (this.show) {
- // populate the axis label and value properties.
- // createTicks is a method on the renderer, but
- // call it within the scope of the axis.
- this.renderer.createTicks.call(this);
- // fill a div with axes labels in the right direction.
- // Need to pregenerate each axis to get it's bounds and
- // position it and the labels correctly on the plot.
- var dim=0;
- var temp;
- // Added for theming.
- if (this._elem) {
- // Memory Leaks patch
- //this._elem.empty();
- this._elem.emptyForce();
- this._elem = null;
- }
-
- this._elem = $(document.createElement('div'));
- this._elem.addClass('jqplot-axis jqplot-'+this.name);
- this._elem.css('posiiton', 'absolute');
-
-
- if (this.name == 'xaxis' || this.name == 'x2axis') {
- this._elem.width(this._plotDimensions.width);
- }
- else {
- this._elem.height(this._plotDimensions.height);
- }
-
- // create a _label object.
- this.labelOptions.axis = this.name;
- this._label = new this.labelRenderer(this.labelOptions);
- if (this._label.show) {
- var elem = this._label.draw(ctx, plot);
- elem.appendTo(this._elem);
- elem = null;
- }
-
- var t = this._ticks;
- var tick;
- for (var i=0; i dim) {
- dim = temp;
- }
- }
- }
- tick = null;
- t = null;
-
- 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.LinearAxisRenderer.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 tt, i;
- // get a copy of user's settings for min/max.
- var userMin = this.min;
- var userMax = this.max;
- var userNT = this.numberTicks;
- var userTI = this.tickInterval;
-
- // 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 this.breakPoints[0] && ut[0] <= this.breakPoints[1]) {
- t.show = false;
- t.showGridline = false;
- t.label = ut[1];
- }
- else {
- t.label = ut[1];
- }
- }
- else {
- t.label = ut[1];
- }
- t.setTick(ut[0], this.name);
- this._ticks.push(t);
- }
-
- else {
- t.value = ut;
- if (this.breakPoints) {
- if (ut == this.breakPoints[0]) {
- t.label = this.breakTickLabel;
- t._breakTick = true;
- t.showGridline = false;
- t.showMark = false;
- }
- else if (ut > this.breakPoints[0] && ut <= this.breakPoints[1]) {
- t.show = false;
- t.showGridline = false;
- }
- }
- t.setTick(ut, this.name);
- this._ticks.push(t);
- }
- }
- this.numberTicks = userTicks.length;
- this.min = this._ticks[0].value;
- this.max = this._ticks[this.numberTicks-1].value;
- this.tickInterval = (this.max - this.min) / (this.numberTicks - 1);
- }
-
- // we don't have any ticks yet, let's make some!
- else {
- if (name == 'xaxis' || name == 'x2axis') {
- dim = this._plotDimensions.width;
- }
- else {
- dim = this._plotDimensions.height;
- }
-
- // // if min, max and number of ticks specified, user can't specify interval.
- // if (!this.autoscale && this.min != null && this.max != null && this.numberTicks != null) {
- // console.log('doing this');
- // this.tickInterval = null;
- // }
-
- // if max, min, and interval specified and interval won't fit, ignore interval.
- // if (this.min != null && this.max != null && this.tickInterval != null) {
- // if (parseInt((this.max-this.min)/this.tickInterval, 10) != (this.max-this.min)/this.tickInterval) {
- // this.tickInterval = null;
- // }
- // }
-
- min = ((this.min != null) ? this.min : db.min);
- max = ((this.max != null) ? this.max : db.max);
-
- var range = max - min;
- var rmin, rmax;
- var temp;
-
- // Doing complete autoscaling
- if (this.min == null && this.max == null && this.numberTicks == null && this.tickInterval == null && !this.autoscale) {
- // check to see if we can override tick format string with autocalculated one
- if (this.tickOptions == null || !this.tickOptions.formatString) {
- this._overrideFormatString = true;
- }
-
-
- // Check if user must have tick at 0 or 100 and ensure they are in range.
- // The autoscaling algorithm will always place ticks at 0 and 100 if they are in range.
- if (this.forceTickAt0) {
- if (min > 0) {
- min = 0;
- }
- if (max < 0) {
- max = 0;
- }
- }
-
- if (this.forceTickAt100) {
- if (min > 100) {
- min = 100;
- }
- if (max < 100) {
- max = 100;
- }
- }
-
- // console.log(this.name);
- var threshold = 30;
- var tdim = Math.max(dim, threshold+1);
- var scalefact = (tdim-threshold)/300.0;
- // scalefact = 1;
- var ret = $.jqplot.LinearTickGenerator(min, max, scalefact);
- // calculate a padded max and min, points should be less than these
- // so that they aren't too close to the edges of the plot.
- // User can adjust how much padding is allowed with pad, padMin and PadMax options.
- var tumin = min + range*(this.padMin - 1);
- var tumax = max - range*(this.padMax - 1);
-
- if (min <=tumin || max >= tumax) {
- tumin = min - range*(this.padMin - 1);
- tumax = max + range*(this.padMax - 1);
- ret = $.jqplot.LinearTickGenerator(tumin, tumax, scalefact);
- }
-
-
- // if (ret[2] > max_number_ticks) {
- // ret[4] = Math.ceil(r[2]/max_number_ticks) * ret[4];
-
- // }
-
- this.min = ret[0];
- this.max = ret[1];
- this.numberTicks = ret[2];
- this._autoFormatString = ret[3];
- //this.tickInterval = Math.abs(this.max - this.min)/(this.numberTicks - 1);
- this.tickInterval = ret[4];
- // console.log('numberticks: %s, interval: %s', ret[2], ret[4]);
- }
-
- // User has specified some axis scale related option, can use auto algorithm
- else {
-
- // if min and max are same, space them out a bit
- if (min == max) {
- var adj = 0.05;
- if (min > 0) {
- adj = Math.max(Math.log(min)/Math.LN10, 0.05);
- }
- min -= adj;
- max += adj;
- }
-
- // autoscale. Can't autoscale if min or max is supplied.
- // Will use numberTicks and tickInterval if supplied. Ticks
- // across multiple axes may not line up depending on how
- // bars are to be plotted.
- if (this.autoscale && this.min == null && this.max == null) {
- var rrange, ti, margin;
- var forceMinZero = false;
- var forceZeroLine = false;
- var intervals = {min:null, max:null, average:null, stddev:null};
- // if any series are bars, or if any are fill to zero, and if this
- // is the axis to fill toward, check to see if we can start axis at zero.
- for (var i=0; i vmax) {
- vmax = vals[j];
- }
- }
- var dp = (vmax - vmin) / vmax;
- // is this sries a bar?
- if (s.renderer.constructor == $.jqplot.BarRenderer) {
- // if no negative values and could also check range.
- if (vmin >= 0 && (s.fillToZero || dp > 0.1)) {
- forceMinZero = true;
- }
- else {
- forceMinZero = false;
- if (s.fill && s.fillToZero && vmin < 0 && vmax > 0) {
- forceZeroLine = true;
- }
- else {
- forceZeroLine = false;
- }
- }
- }
-
- // if not a bar and filling, use appropriate method.
- else if (s.fill) {
- if (vmin >= 0 && (s.fillToZero || dp > 0.1)) {
- forceMinZero = true;
- }
- else if (vmin < 0 && vmax > 0 && s.fillToZero) {
- forceMinZero = false;
- forceZeroLine = true;
- }
- else {
- forceMinZero = false;
- forceZeroLine = false;
- }
- }
-
- // if not a bar and not filling, only change existing state
- // if it doesn't make sense
- else if (vmin < 0) {
- forceMinZero = false;
- }
- }
- }
-
- // check if we need make axis min at 0.
- if (forceMinZero) {
- // compute number of ticks
- this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);
- this.min = 0;
- userMin = 0;
- // what order is this range?
- // what tick interval does that give us?
- ti = max/(this.numberTicks-1);
- temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));
- if (ti/temp == parseInt(ti/temp, 10)) {
- ti += temp;
- }
- this.tickInterval = Math.ceil(ti/temp) * temp;
- this.max = this.tickInterval * (this.numberTicks - 1);
- }
-
- // check if we need to make sure there is a tick at 0.
- else if (forceZeroLine) {
- // compute number of ticks
- this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);
- var ntmin = Math.ceil(Math.abs(min)/range*(this.numberTicks-1));
- var ntmax = this.numberTicks - 1 - ntmin;
- ti = Math.max(Math.abs(min/ntmin), Math.abs(max/ntmax));
- temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));
- this.tickInterval = Math.ceil(ti/temp) * temp;
- this.max = this.tickInterval * ntmax;
- this.min = -this.tickInterval * ntmin;
- }
-
- // if nothing else, do autoscaling which will try to line up ticks across axes.
- else {
- if (this.numberTicks == null){
- if (this.tickInterval) {
- this.numberTicks = 3 + Math.ceil(range / this.tickInterval);
- }
- else {
- this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);
- }
- }
-
- if (this.tickInterval == null) {
- // get a tick interval
- ti = range/(this.numberTicks - 1);
-
- if (ti < 1) {
- temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));
- }
- else {
- temp = 1;
- }
- this.tickInterval = Math.ceil(ti*temp*this.pad)/temp;
- }
- else {
- temp = 1 / this.tickInterval;
- }
-
- // try to compute a nicer, more even tick interval
- // temp = Math.pow(10, Math.floor(Math.log(ti)/Math.LN10));
- // this.tickInterval = Math.ceil(ti/temp) * temp;
- rrange = this.tickInterval * (this.numberTicks - 1);
- margin = (rrange - range)/2;
-
- if (this.min == null) {
- this.min = Math.floor(temp*(min-margin))/temp;
- }
- if (this.max == null) {
- this.max = this.min + rrange;
- }
- }
- }
-
- // Use the default algorithm which pads each axis to make the chart
- // centered nicely on the grid.
- else {
- rmin = (this.min != null) ? this.min : min - range*(this.padMin - 1);
- rmax = (this.max != null) ? this.max : max + range*(this.padMax - 1);
- this.min = rmin;
- this.max = rmax;
- range = this.max - this.min;
-
- if (this.numberTicks == null){
- // if tickInterval is specified by user, we will ignore computed maximum.
- // max will be equal or greater to fit even # of ticks.
- 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 (dim > 100) {
- this.numberTicks = parseInt(3+(dim-100)/75, 10);
- }
- else {
- this.numberTicks = 2;
- }
- }
-
- if (this.tickInterval == null) {
- this.tickInterval = range / (this.numberTicks-1);
- }
- }
-
- if (this.renderer.constructor == $.jqplot.LinearAxisRenderer && this._autoFormatString == '') {
- // fix for misleading tick display with small range and low precision.
- range = this.max - this.min;
- // figure out precision
- var temptick = new this.tickRenderer(this.tickOptions);
- // use the tick formatString or, the default.
- var fs = temptick.formatString || $.jqplot.config.defaultTickFormatString;
- var fs = fs.match($.jqplot.sprintf.regex)[0];
- var precision = 0;
- if (fs) {
- if (fs.search(/[fFeEgGpP]/) > -1) {
- var m = fs.match(/\%\.(\d{0,})?[eEfFgGpP]/);
- if (m) {
- precision = parseInt(m[1], 10);
- }
- else {
- precision = 6;
- }
- }
- else if (fs.search(/[di]/) > -1) {
- precision = 0;
- }
- // fact will be <= 1;
- var fact = Math.pow(10, -precision);
- if (this.tickInterval < fact) {
- // need to correct underrange
- if (userNT == null && userTI == null) {
- this.tickInterval = fact;
- if (userMax == null && userMin == null) {
- // this.min = Math.floor((this._dataBounds.min - this.tickInterval)/fact) * fact;
- this.min = Math.floor(this._dataBounds.min/fact) * fact;
- if (this.min == this._dataBounds.min) {
- this.min = this._dataBounds.min - this.tickInterval;
- }
- // this.max = Math.ceil((this._dataBounds.max + this.tickInterval)/fact) * fact;
- this.max = Math.ceil(this._dataBounds.max/fact) * fact;
- if (this.max == this._dataBounds.max) {
- this.max = this._dataBounds.max + this.tickInterval;
- }
- var n = (this.max - this.min)/this.tickInterval;
- n = n.toFixed(11);
- n = Math.ceil(n);
- this.numberTicks = n + 1;
- }
- else if (userMax == null) {
- // add one tick for top of range.
- var n = (this._dataBounds.max - this.min) / this.tickInterval;
- n = n.toFixed(11);
- this.numberTicks = Math.ceil(n) + 2;
- this.max = this.min + this.tickInterval * (this.numberTicks-1);
- }
- else if (userMin == null) {
- // add one tick for bottom of range.
- var n = (this.max - this._dataBounds.min) / this.tickInterval;
- n = n.toFixed(11);
- this.numberTicks = Math.ceil(n) + 2;
- this.min = this.max - this.tickInterval * (this.numberTicks-1);
- }
- else {
- // calculate a number of ticks so max is within axis scale
- this.numberTicks = Math.ceil((userMax - userMin)/this.tickInterval) + 1;
- // if user's min and max don't fit evenly in ticks, adjust.
- // This takes care of cases such as user min set to 0, max set to 3.5 but tick
- // format string set to %d (integer ticks)
- this.min = Math.floor(userMin*Math.pow(10, precision))/Math.pow(10, precision);
- this.max = Math.ceil(userMax*Math.pow(10, precision))/Math.pow(10, precision);
- // this.max = this.min + this.tickInterval*(this.numberTicks-1);
- this.numberTicks = Math.ceil((this.max - this.min)/this.tickInterval) + 1;
- }
- }
- }
- }
- }
-
- }
-
- if (this._overrideFormatString && this._autoFormatString != '') {
- this.tickOptions = this.tickOptions || {};
- this.tickOptions.formatString = this._autoFormatString;
- }
-
- for (var i=0; i plot.axes.yaxis.renderer.resetTickValues.call(plot.axes.yaxis, yarr);
- //
- $.jqplot.LinearAxisRenderer.prototype.resetTickValues = function(opts) {
- if ($.isArray(opts) && opts.length == this._ticks.length) {
- var t;
- for (var i=0; i this.breakPoints[0] && u < this.breakPoints[1]){
- u = this.breakPoints[0];
- }
- if (u <= this.breakPoints[0]) {
- return (u - min) * pixellength / unitlength + offmin;
- }
- else {
- return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength + offmin;
- }
- };
-
- if (this.name.charAt(0) == 'x'){
- this.series_u2p = function(u){
- if (u > this.breakPoints[0] && u < this.breakPoints[1]){
- u = this.breakPoints[0];
- }
- if (u <= this.breakPoints[0]) {
- return (u - min) * pixellength / unitlength;
- }
- else {
- return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength;
- }
- };
- this.series_p2u = function(p){
- return p * unitlength / pixellength + min;
- };
- }
-
- else {
- this.series_u2p = function(u){
- if (u > this.breakPoints[0] && u < this.breakPoints[1]){
- u = this.breakPoints[0];
- }
- if (u >= this.breakPoints[1]) {
- return (u - max) * pixellength / unitlength;
- }
- else {
- return (u + this.breakPoints[1] - this.breakPoints[0] - max) * pixellength / unitlength;
- }
- };
- this.series_p2u = function(p){
- return p * unitlength / pixellength + max;
- };
- }
- }
- else {
- this.p2u = function(p){
- return (p - offmin) * unitlength / pixellength + min;
- };
-
- this.u2p = function(u){
- return (u - min) * pixellength / unitlength + offmin;
- };
-
- if (this.name == 'xaxis' || this.name == 'x2axis'){
- this.series_u2p = function(u){
- return (u - min) * pixellength / unitlength;
- };
- this.series_p2u = function(p){
- return p * unitlength / pixellength + min;
- };
- }
-
- else {
- this.series_u2p = function(u){
- return (u - max) * pixellength / unitlength;
- };
- this.series_p2u = function(p){
- return 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();
- }
- }
- }
-
- ticks = null;
- };
-
-
- /**
- * The following code was generaously given to me a while back by Scott Prahl.
- * He did a good job at computing axes min, max and number of ticks for the
- * case where the user has not set any scale related parameters (tickInterval,
- * numberTicks, min or max). I had ignored this use case for a long time,
- * focusing on the more difficult case where user has set some option controlling
- * tick generation. Anyway, about time I got this into jqPlot.
- * Thanks Scott!!
- */
-
- /**
- * Copyright (c) 2010 Scott Prahl
- * The next three routines are currently available for use in all personal
- * or commercial projects under both the MIT and GPL version 2.0 licenses.
- * This means that you can choose the license that best suits your project
- * and use it accordingly.
- */
-
- // A good format string depends on the interval. If the interval is greater
- // than 1 then there is no need to show any decimal digits. If it is < 1.0, then
- // use the magnitude of the interval to determine the number of digits to show.
- function bestFormatString (interval)
- {
- interval = Math.abs(interval);
- if (interval > 1) {return '%d';}
-
- var expv = -Math.floor(Math.log(interval)/Math.LN10);
- return '%.' + expv + 'f';
- }
-
- // This will return an interval of form 2 * 10^n, 5 * 10^n or 10 * 10^n
- function bestLinearInterval(range, scalefact) {
- var expv = Math.floor(Math.log(range)/Math.LN10);
- var magnitude = Math.pow(10, expv);
- // 0 < f < 10
- var f = range / magnitude;
- // console.log('f: %s, scaled: %s ', f, f/scalefact);
- // for large plots, scalefact will decrease f and increase number of ticks.
- // for small plots, scalefact will increase f and decrease number of ticks.
- f = f/scalefact;
-
- // for large plots, smaller interval, more ticks.
- if (f<=0.38) {return 0.1*magnitude;}
- if (f<=1.6) {return 0.2*magnitude;}
- if (f<=4.0) {return 0.5*magnitude;}
- if (f<=8.0) {return magnitude;}
- // for very small plots, larger interval, less ticks in number ticks
- if (f<=16.0) {return 2*magnitude;}
- return 5*magnitude;
- }
-
- // Given the min and max for a dataset, return suitable endpoints
- // for the graphing, a good number for the number of ticks, and a
- // format string so that extraneous digits are not displayed.
- // returned is an array containing [min, max, nTicks, format]
- $.jqplot.LinearTickGenerator = function(axis_min, axis_max, scalefact) {
- // if endpoints are equal try to include zero otherwise include one
- if (axis_min == axis_max) {
- axis_max = (axis_max) ? 0 : 1;
- }
-
- scalefact = scalefact || 1.0;
-
- // make sure range is positive
- if (axis_max < axis_min) {
- var a = axis_max;
- axis_max = axis_min;
- axis_min = a;
- }
-
- var ss = bestLinearInterval(axis_max - axis_min, scalefact);
- var r = [];
-
- // Figure out the axis min, max and number of ticks
- // the min and max will be some multiple of the tick interval,
- // 1*10^n, 2*10^n or 5*10^n. This gaurantees that, if the
- // axis min is negative, 0 will be a tick.
- r[0] = Math.floor(axis_min / ss) * ss; // min
- r[1] = Math.ceil(axis_max / ss) * ss; // max
- r[2] = Math.round((r[1]-r[0])/ss+1.0); // number of ticks
- r[3] = bestFormatString(ss); // format string
- r[4] = ss; // tick Interval
- return r;
- };
-
-
- // class: $.jqplot.MarkerRenderer
- // The default jqPlot marker renderer, rendering the points on the line.
- $.jqplot.MarkerRenderer = function(options){
- // Group: Properties
-
- // prop: show
- // wether or not to show the marker.
- this.show = true;
- // prop: style
- // One of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare
- this.style = 'filledCircle';
- // prop: lineWidth
- // size of the line for non-filled markers.
- this.lineWidth = 2;
- // prop: size
- // Size of the marker (diameter or circle, length of edge of square, etc.)
- this.size = 9.0;
- // prop: color
- // color of marker. Will be set to color of series by default on init.
- this.color = '#666666';
- // prop: shadow
- // wether or not to draw a shadow on the line
- this.shadow = true;
- // prop: shadowAngle
- // Shadow angle in degrees
- this.shadowAngle = 45;
- // prop: shadowOffset
- // Shadow offset from line in pixels
- this.shadowOffset = 1;
- // prop: shadowDepth
- // Number of times shadow is stroked, each stroke offset shadowOffset from the last.
- this.shadowDepth = 3;
- // prop: shadowAlpha
- // Alpha channel transparency of shadow. 0 = transparent.
- this.shadowAlpha = '0.07';
- // prop: shadowRenderer
- // Renderer that will draws the shadows on the marker.
- this.shadowRenderer = new $.jqplot.ShadowRenderer();
- // prop: shapeRenderer
- // Renderer that will draw the marker.
- this.shapeRenderer = new $.jqplot.ShapeRenderer();
-
- $.extend(true, this, options);
- };
-
- $.jqplot.MarkerRenderer.prototype.init = function(options) {
- $.extend(true, this, options);
- var sdopt = {angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, lineWidth:this.lineWidth, depth:this.shadowDepth, closePath:true};
- if (this.style.indexOf('filled') != -1) {
- sdopt.fill = true;
- }
- if (this.style.indexOf('ircle') != -1) {
- sdopt.isarc = true;
- sdopt.closePath = false;
- }
- this.shadowRenderer.init(sdopt);
-
- var shopt = {fill:false, isarc:false, strokeStyle:this.color, fillStyle:this.color, lineWidth:this.lineWidth, closePath:true};
- if (this.style.indexOf('filled') != -1) {
- shopt.fill = true;
- }
- if (this.style.indexOf('ircle') != -1) {
- shopt.isarc = true;
- shopt.closePath = false;
- }
- this.shapeRenderer.init(shopt);
- };
-
- $.jqplot.MarkerRenderer.prototype.drawDiamond = function(x, y, ctx, fill, options) {
- var stretch = 1.2;
- var dx = this.size/2/stretch;
- var dy = this.size/2*stretch;
- var points = [[x-dx, y], [x, y+dy], [x+dx, y], [x, y-dy]];
- if (this.shadow) {
- this.shadowRenderer.draw(ctx, points);
- }
- this.shapeRenderer.draw(ctx, points, options);
- };
-
- $.jqplot.MarkerRenderer.prototype.drawPlus = function(x, y, ctx, fill, options) {
- var stretch = 1.0;
- var dx = this.size/2*stretch;
- var dy = this.size/2*stretch;
- var points1 = [[x, y-dy], [x, y+dy]];
- var points2 = [[x+dx, y], [x-dx, y]];
- var opts = $.extend(true, {}, this.options, {closePath:false});
- if (this.shadow) {
- this.shadowRenderer.draw(ctx, points1, {closePath:false});
- this.shadowRenderer.draw(ctx, points2, {closePath:false});
- }
- this.shapeRenderer.draw(ctx, points1, opts);
- this.shapeRenderer.draw(ctx, points2, opts);
- };
-
- $.jqplot.MarkerRenderer.prototype.drawX = function(x, y, ctx, fill, options) {
- var stretch = 1.0;
- var dx = this.size/2*stretch;
- var dy = this.size/2*stretch;
- var opts = $.extend(true, {}, this.options, {closePath:false});
- var points1 = [[x-dx, y-dy], [x+dx, y+dy]];
- var points2 = [[x-dx, y+dy], [x+dx, y-dy]];
- if (this.shadow) {
- this.shadowRenderer.draw(ctx, points1, {closePath:false});
- this.shadowRenderer.draw(ctx, points2, {closePath:false});
- }
- this.shapeRenderer.draw(ctx, points1, opts);
- this.shapeRenderer.draw(ctx, points2, opts);
- };
-
- $.jqplot.MarkerRenderer.prototype.drawDash = function(x, y, ctx, fill, options) {
- var stretch = 1.0;
- var dx = this.size/2*stretch;
- var dy = this.size/2*stretch;
- var points = [[x-dx, y], [x+dx, y]];
- if (this.shadow) {
- this.shadowRenderer.draw(ctx, points);
- }
- this.shapeRenderer.draw(ctx, points, options);
- };
-
- $.jqplot.MarkerRenderer.prototype.drawLine = function(p1, p2, ctx, fill, options) {
- var points = [p1, p2];
- if (this.shadow) {
- this.shadowRenderer.draw(ctx, points);
- }
- this.shapeRenderer.draw(ctx, points, options);
- };
-
- $.jqplot.MarkerRenderer.prototype.drawSquare = function(x, y, ctx, fill, options) {
- var stretch = 1.0;
- var dx = this.size/2/stretch;
- var dy = this.size/2*stretch;
- var points = [[x-dx, y-dy], [x-dx, y+dy], [x+dx, y+dy], [x+dx, y-dy]];
- if (this.shadow) {
- this.shadowRenderer.draw(ctx, points);
- }
- this.shapeRenderer.draw(ctx, points, options);
- };
-
- $.jqplot.MarkerRenderer.prototype.drawCircle = function(x, y, ctx, fill, options) {
- var radius = this.size/2;
- var end = 2*Math.PI;
- var points = [x, y, radius, 0, end, true];
- if (this.shadow) {
- this.shadowRenderer.draw(ctx, points);
- }
- this.shapeRenderer.draw(ctx, points, options);
- };
-
- $.jqplot.MarkerRenderer.prototype.draw = function(x, y, ctx, options) {
- options = options || {};
- // hack here b/c shape renderer uses canvas based color style options
- // and marker uses css style names.
- if (options.show == null || options.show != false) {
- if (options.color && !options.fillStyle) {
- options.fillStyle = options.color;
- }
- if (options.color && !options.strokeStyle) {
- options.strokeStyle = options.color;
- }
- switch (this.style) {
- case 'diamond':
- this.drawDiamond(x,y,ctx, false, options);
- break;
- case 'filledDiamond':
- this.drawDiamond(x,y,ctx, true, options);
- break;
- case 'circle':
- this.drawCircle(x,y,ctx, false, options);
- break;
- case 'filledCircle':
- this.drawCircle(x,y,ctx, true, options);
- break;
- case 'square':
- this.drawSquare(x,y,ctx, false, options);
- break;
- case 'filledSquare':
- this.drawSquare(x,y,ctx, true, options);
- break;
- case 'x':
- this.drawX(x,y,ctx, true, options);
- break;
- case 'plus':
- this.drawPlus(x,y,ctx, true, options);
- break;
- case 'dash':
- this.drawDash(x,y,ctx, true, options);
- break;
- case 'line':
- this.drawLine(x, y, ctx, false, options);
- break;
- default:
- this.drawDiamond(x,y,ctx, false, options);
- break;
- }
- }
- };
-
- // class: $.jqplot.shadowRenderer
- // The default jqPlot shadow renderer, rendering shadows behind shapes.
- $.jqplot.ShadowRenderer = function(options){
- // Group: Properties
-
- // prop: angle
- // Angle of the shadow in degrees. Measured counter-clockwise from the x axis.
- this.angle = 45;
- // prop: offset
- // Pixel offset at the given shadow angle of each shadow stroke from the last stroke.
- this.offset = 1;
- // prop: alpha
- // alpha transparency of shadow stroke.
- this.alpha = 0.07;
- // prop: lineWidth
- // width of the shadow line stroke.
- this.lineWidth = 1.5;
- // prop: lineJoin
- // How line segments of the shadow are joined.
- this.lineJoin = 'miter';
- // prop: lineCap
- // how ends of the shadow line are rendered.
- this.lineCap = 'round';
- // prop; closePath
- // whether line path segment is closed upon itself.
- this.closePath = false;
- // prop: fill
- // whether to fill the shape.
- this.fill = false;
- // prop: depth
- // how many times the shadow is stroked. Each stroke will be offset by offset at angle degrees.
- this.depth = 3;
- this.strokeStyle = 'rgba(0,0,0,0.1)';
- // prop: isarc
- // wether the shadow is an arc or not.
- this.isarc = false;
-
- $.extend(true, this, options);
- };
-
- $.jqplot.ShadowRenderer.prototype.init = function(options) {
- $.extend(true, this, options);
- };
-
- // function: draw
- // draws an transparent black (i.e. gray) shadow.
- //
- // ctx - canvas drawing context
- // points - array of points or [x, y, radius, start angle (rad), end angle (rad)]
- $.jqplot.ShadowRenderer.prototype.draw = function(ctx, points, options) {
- ctx.save();
- var opts = (options != null) ? options : {};
- var fill = (opts.fill != null) ? opts.fill : this.fill;
- var closePath = (opts.closePath != null) ? opts.closePath : this.closePath;
- var offset = (opts.offset != null) ? opts.offset : this.offset;
- var alpha = (opts.alpha != null) ? opts.alpha : this.alpha;
- var depth = (opts.depth != null) ? opts.depth : this.depth;
- var isarc = (opts.isarc != null) ? opts.isarc : this.isarc;
- ctx.lineWidth = (opts.lineWidth != null) ? opts.lineWidth : this.lineWidth;
- ctx.lineJoin = (opts.lineJoin != null) ? opts.lineJoin : this.lineJoin;
- ctx.lineCap = (opts.lineCap != null) ? opts.lineCap : this.lineCap;
- ctx.strokeStyle = opts.strokeStyle || this.strokeStyle || 'rgba(0,0,0,'+alpha+')';
- ctx.fillStyle = opts.fillStyle || this.fillStyle || 'rgba(0,0,0,'+alpha+')';
- for (var j=0; j'+
- // '
');
- // elem.appendTo(tr);
- if (this.escapeHtml) {
- td.text(label);
- }
- else {
- td.html(label);
- }
- }
- td = null;
- div0 = null;
- div1 = null;
- tr = null;
- elem = null;
- };
-
- // called with scope of legend
- $.jqplot.TableLegendRenderer.prototype.draw = function() {
- if (this._elem) {
- this._elem.emptyForce();
- this._elem = null;
- }
-
- if (this.show) {
- var series = this._series;
- // make a table. one line label per row.
- var elem = document.createElement('table');
- this._elem = $(elem);
- 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;
- }
-
-
- var pad = false,
- reverse = false,
- s;
- for (var i = 0; i< series.length; i++) {
- s = series[i];
- if (s._stack || s.renderer.constructor == $.jqplot.BezierCurveRenderer){
- reverse = true;
- }
- if (s.show && s.showLabel) {
- var lt = this.labels[i] || s.label.toString();
- if (lt) {
- var color = s.color;
- if (reverse && i < series.length - 1){
- pad = true;
- }
- else if (reverse && i == series.length - 1){
- pad = false;
- }
- this.renderer.addrow.call(this, lt, color, pad, reverse);
- 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) {
- this.renderer.addrow.call(this, item.label, item.color, pad);
- pad = true;
- }
- }
- lt = null;
- }
- }
- }
- return this._elem;
- };
-
- $.jqplot.TableLegendRenderer.prototype.pack = function(offsets) {
- if (this.show) {
- if (this.placement == 'insideGrid') {
- switch (this.location) {
- case 'nw':
- var a = offsets.left;
- var b = offsets.top;
- 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 = offsets.top;
- this._elem.css('left', a);
- this._elem.css('top', b);
- break;
- case 'ne':
- var a = offsets.right;
- var b = offsets.top;
- this._elem.css({right:a, top:b});
- break;
- case 'e':
- var a = offsets.right;
- 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;
- var b = offsets.bottom;
- 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._elem.css({left:a, bottom:b});
- break;
- case 'sw':
- var a = offsets.left;
- var b = offsets.bottom;
- this._elem.css({left:a, bottom:b});
- break;
- case 'w':
- var a = offsets.left;
- 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 = offsets.right;
- var b = offsets.bottom;
- this._elem.css({right:a, bottom:b});
- break;
- }
-
- }
- else if (this.placement == 'outside'){
- switch (this.location) {
- case 'nw':
- var a = this._plotDimensions.width - offsets.left;
- var b = offsets.top;
- 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 - offsets.top;
- this._elem.css('left', a);
- this._elem.css('bottom', b);
- break;
- case 'ne':
- var a = this._plotDimensions.width - offsets.right;
- var b = offsets.top;
- this._elem.css({left:a, top:b});
- break;
- case 'e':
- var a = this._plotDimensions.width - offsets.right;
- 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;
- var b = offsets.bottom;
- 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._elem.css({left:a, top:b});
- break;
- case 'sw':
- var a = this._plotDimensions.width - offsets.left;
- var b = offsets.bottom;
- this._elem.css({right:a, bottom:b});
- break;
- case 'w':
- var a = this._plotDimensions.width - offsets.left;
- 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 = offsets.right;
- var b = offsets.bottom;
- this._elem.css({right:a, bottom:b});
- break;
- }
- }
- else {
- switch (this.location) {
- case 'nw':
- this._elem.css({left:0, top:offsets.top});
- break;
- case 'n':
- var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- this._elem.css({left: a, top:offsets.top});
- break;
- case 'ne':
- this._elem.css({right:0, top:offsets.top});
- break;
- case 'e':
- var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- this._elem.css({right:offsets.right, top:b});
- break;
- case 'se':
- this._elem.css({right:offsets.right, bottom:offsets.bottom});
- break;
- case 's':
- var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
- this._elem.css({left: a, bottom:offsets.bottom});
- break;
- case 'sw':
- this._elem.css({left:offsets.left, bottom:offsets.bottom});
- break;
- case 'w':
- var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
- this._elem.css({left:offsets.left, top:b});
- break;
- default: // same as 'se'
- this._elem.css({right:offsets.right, bottom:offsets.bottom});
- break;
- }
- }
- }
- };
-
- /**
- * Class: $.jqplot.ThemeEngine
- * Theme Engine provides a programatic way to change some of the more
- * common jqplot styling options such as fonts, colors and grid options.
- * A theme engine instance is created with each plot. The theme engine
- * manages a collection of themes which can be modified, added to, or
- * applied to the plot.
- *
- * The themeEngine class is not instantiated directly.
- * When a plot is initialized, the current plot options are scanned
- * an a default theme named "Default" is created. This theme is
- * used as the basis for other themes added to the theme engine and
- * is always available.
- *
- * A theme is a simple javascript object with styling parameters for
- * various entities of the plot. A theme has the form:
- *
- *
- * > {
- * > _name:f "Default",
- * > target: {
- * > backgroundColor: "transparent"
- * > },
- * > legend: {
- * > textColor: null,
- * > fontFamily: null,
- * > fontSize: null,
- * > border: null,
- * > background: null
- * > },
- * > title: {
- * > textColor: "rgb(102, 102, 102)",
- * > fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif",
- * > fontSize: "19.2px",
- * > textAlign: "center"
- * > },
- * > seriesStyles: {},
- * > series: [{
- * > color: "#4bb2c5",
- * > lineWidth: 2.5,
- * > shadow: true,
- * > fillColor: "#4bb2c5",
- * > showMarker: true,
- * > markerOptions: {
- * > color: "#4bb2c5",
- * > show: true,
- * > style: 'filledCircle',
- * > lineWidth: 1.5,
- * > size: 4,
- * > shadow: true
- * > }
- * > }],
- * > grid: {
- * > drawGridlines: true,
- * > gridLineColor: "#cccccc",
- * > gridLineWidth: 1,
- * > backgroundColor: "#fffdf6",
- * > borderColor: "#999999",
- * > borderWidth: 2,
- * > shadow: true
- * > },
- * > axesStyles: {
- * > label: {},
- * > ticks: {}
- * > },
- * > axes: {
- * > xaxis: {
- * > borderColor: "#999999",
- * > borderWidth: 2,
- * > ticks: {
- * > show: true,
- * > showGridline: true,
- * > showLabel: true,
- * > showMark: true,
- * > size: 4,
- * > textColor: "",
- * > whiteSpace: "nowrap",
- * > fontSize: "12px",
- * > fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif"
- * > },
- * > label: {
- * > textColor: "rgb(102, 102, 102)",
- * > whiteSpace: "normal",
- * > fontSize: "14.6667px",
- * > fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif",
- * > fontWeight: "400"
- * > }
- * > },
- * > yaxis: {
- * > borderColor: "#999999",
- * > borderWidth: 2,
- * > ticks: {
- * > show: true,
- * > showGridline: true,
- * > showLabel: true,
- * > showMark: true,
- * > size: 4,
- * > textColor: "",
- * > whiteSpace: "nowrap",
- * > fontSize: "12px",
- * > fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif"
- * > },
- * > label: {
- * > textColor: null,
- * > whiteSpace: null,
- * > fontSize: null,
- * > fontFamily: null,
- * > fontWeight: null
- * > }
- * > },
- * > x2axis: {...
- * > },
- * > ...
- * > y9axis: {...
- * > }
- * > }
- * > }
- *
- * "seriesStyles" is a style object that will be applied to all series in the plot.
- * It will forcibly override any styles applied on the individual series. "axesStyles" is
- * a style object that will be applied to all axes in the plot. It will also forcibly
- * override any styles on the individual axes.
- *
- * The example shown above has series options for a line series. Options for other
- * series types are shown below:
- *
- * Bar Series:
- *
- * > {
- * > color: "#4bb2c5",
- * > seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
- * > lineWidth: 2.5,
- * > shadow: true,
- * > barPadding: 2,
- * > barMargin: 10,
- * > barWidth: 15.09375,
- * > highlightColors: ["rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)"]
- * > }
- *
- * Pie Series:
- *
- * > {
- * > seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
- * > padding: 20,
- * > sliceMargin: 0,
- * > fill: true,
- * > shadow: true,
- * > startAngle: 0,
- * > lineWidth: 2.5,
- * > highlightColors: ["rgb(129,201,214)", "rgb(240,189,104)", "rgb(214,202,165)", "rgb(137,180,158)", "rgb(168,180,137)", "rgb(180,174,89)", "rgb(180,113,161)", "rgb(129,141,236)", "rgb(227,205,120)", "rgb(255,138,76)", "rgb(76,169,219)", "rgb(215,126,190)", "rgb(220,232,135)", "rgb(200,167,96)", "rgb(103,202,235)", "rgb(208,154,215)"]
- * > }
- *
- * Funnel Series:
- *
- * > {
- * > color: "#4bb2c5",
- * > lineWidth: 2,
- * > shadow: true,
- * > padding: {
- * > top: 20,
- * > right: 20,
- * > bottom: 20,
- * > left: 20
- * > },
- * > sectionMargin: 6,
- * > seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
- * > highlightColors: ["rgb(147,208,220)", "rgb(242,199,126)", "rgb(220,210,178)", "rgb(154,191,172)", "rgb(180,191,154)", "rgb(191,186,112)", "rgb(191,133,174)", "rgb(147,157,238)", "rgb(231,212,139)", "rgb(255,154,102)", "rgb(102,181,224)", "rgb(221,144,199)", "rgb(225,235,152)", "rgb(200,167,96)", "rgb(124,210,238)", "rgb(215,169,221)"]
- * > }
- *
- */
- $.jqplot.ThemeEngine = function(){
- // Group: Properties
- //
- // prop: themes
- // hash of themes managed by the theme engine.
- // Indexed by theme name.
- this.themes = {};
- // prop: activeTheme
- // Pointer to currently active theme
- this.activeTheme=null;
-
- };
-
- // called with scope of plot
- $.jqplot.ThemeEngine.prototype.init = function() {
- // get the Default theme from the current plot settings.
- var th = new $.jqplot.Theme({_name:'Default'});
- var n, i, nn;
-
- for (n in th.target) {
- if (n == "textColor") {
- th.target[n] = this.target.css('color');
- }
- else {
- th.target[n] = this.target.css(n);
- }
- }
-
- if (this.title.show && this.title._elem) {
- for (n in th.title) {
- if (n == "textColor") {
- th.title[n] = this.title._elem.css('color');
- }
- else {
- th.title[n] = this.title._elem.css(n);
- }
- }
- }
-
- for (n in th.grid) {
- th.grid[n] = this.grid[n];
- }
- if (th.grid.backgroundColor == null && this.grid.background != null) {
- th.grid.backgroundColor = this.grid.background;
- }
- if (this.legend.show && this.legend._elem) {
- for (n in th.legend) {
- if (n == 'textColor') {
- th.legend[n] = this.legend._elem.css('color');
- }
- else {
- th.legend[n] = this.legend._elem.css(n);
- }
- }
- }
- var s;
-
- for (i=0; iObject with extended date parsing and formatting capabilities.
- * This library borrows many concepts and ideas from the Date Instance
- * Methods by Ken Snyder along with some parts of Ken's actual code.
- *
- *
jsDate takes a different approach by not extending the built-in
- * Date Object, improving date parsing, allowing for multiple formatting
- * syntaxes and multiple and more easily expandable localization.
- *
- * @author Chris Leonello
- * @date #date#
- * @version #VERSION#
- * @copyright (c) 2010 Chris Leonello
- * jsDate is currently available for use in all personal or commercial projects
- * under both the MIT and GPL version 2.0 licenses. This means that you can
- * choose the license that best suits your project and use it accordingly.
- *
- *
Ken's origianl Date Instance Methods and copyright notice:
- *
- * Ken Snyder (ken d snyder at gmail dot com)
- * 2008-09-10
- * version 2.0.2 (http://kendsnyder.com/sandbox/date/)
- * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
- *
- *
- * @class
- * @name jsDate
- * @param {String | Number | Array | Date Object | Options Object} arguments Optional arguments, either a parsable date/time string,
- * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],
- * a Date object, or an options object of form {syntax: "perl", date:some Date} where all options are optional.
- */
-
- var jsDate = function () {
-
- this.syntax = jsDate.config.syntax;
- this._type = "jsDate";
- this.utcOffset = new Date().getTimezoneOffset * 60000;
- this.proxy = new Date();
- this.options = {};
- this.locale = jsDate.regional.getLocale();
- this.formatString = '';
- this.defaultCentury = jsDate.config.defaultCentury;
-
- switch ( arguments.length ) {
- case 0:
- break;
- case 1:
- // other objects either won't have a _type property or,
- // if they do, it shouldn't be set to "jsDate", so
- // assume it is an options argument.
- if (get_type(arguments[0]) == "[object Object]" && arguments[0]._type != "jsDate") {
- var opts = this.options = arguments[0];
- this.syntax = opts.syntax || this.syntax;
- this.defaultCentury = opts.defaultCentury || this.defaultCentury;
- this.proxy = jsDate.createDate(opts.date);
- }
- else {
- this.proxy = jsDate.createDate(arguments[0]);
- }
- break;
- default:
- var a = [];
- for ( var i=0; i 0 ? 'floor' : 'ceil'](unitDiff));
- };
-
- /**
- * Get the abbreviated name of the current week day
- *
- * @returns {String}
- */
-
- jsDate.prototype.getAbbrDayName = function() {
- return jsDate.regional[this.locale]["dayNamesShort"][this.proxy.getDay()];
- };
-
- /**
- * Get the abbreviated name of the current month
- *
- * @returns {String}
- */
-
- jsDate.prototype.getAbbrMonthName = function() {
- return jsDate.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()];
- };
-
- /**
- * Get UPPER CASE AM or PM for the current time
- *
- * @returns {String}
- */
-
- jsDate.prototype.getAMPM = function() {
- return this.proxy.getHours() >= 12 ? 'PM' : 'AM';
- };
-
- /**
- * Get lower case am or pm for the current time
- *
- * @returns {String}
- */
-
- jsDate.prototype.getAmPm = function() {
- return this.proxy.getHours() >= 12 ? 'pm' : 'am';
- };
-
- /**
- * Get the century (19 for 20th Century)
- *
- * @returns {Integer} Century (19 for 20th century).
- */
- jsDate.prototype.getCentury = function() {
- return parseInt(this.proxy.getFullYear()/100, 10);
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getDate = function() {
- return this.proxy.getDate();
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getDay = function() {
- return this.proxy.getDay();
- };
-
- /**
- * Get the Day of week 1 (Monday) thru 7 (Sunday)
- *
- * @returns {Integer} Day of week 1 (Monday) thru 7 (Sunday)
- */
- jsDate.prototype.getDayOfWeek = function() {
- var dow = this.proxy.getDay();
- return dow===0?7:dow;
- };
-
- /**
- * Get the day of the year
- *
- * @returns {Integer} 1 - 366, day of the year
- */
- jsDate.prototype.getDayOfYear = function() {
- var d = this.proxy;
- var ms = d - new Date('' + d.getFullYear() + '/1/1 GMT');
- ms += d.getTimezoneOffset()*60000;
- d = null;
- return parseInt(ms/60000/60/24, 10)+1;
- };
-
- /**
- * Get the name of the current week day
- *
- * @returns {String}
- */
-
- jsDate.prototype.getDayName = function() {
- return jsDate.regional[this.locale]["dayNames"][this.proxy.getDay()];
- };
-
- /**
- * Get the week number of the given year, starting with the first Sunday as the first week
- * @returns {Integer} Week number (13 for the 13th full week of the year).
- */
- jsDate.prototype.getFullWeekOfYear = function() {
- var d = this.proxy;
- var doy = this.getDayOfYear();
- var rdow = 6-d.getDay();
- var woy = parseInt((doy+rdow)/7, 10);
- return woy;
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getFullYear = function() {
- return this.proxy.getFullYear();
- };
-
- /**
- * Get the GMT offset in hours and minutes (e.g. +06:30)
- *
- * @returns {String}
- */
-
- jsDate.prototype.getGmtOffset = function() {
- // divide the minutes offset by 60
- var hours = this.proxy.getTimezoneOffset() / 60;
- // decide if we are ahead of or behind GMT
- var prefix = hours < 0 ? '+' : '-';
- // remove the negative sign if any
- hours = Math.abs(hours);
- // add the +/- to the padded number of hours to : to the padded minutes
- return prefix + addZeros(Math.floor(hours), 2) + ':' + addZeros((hours % 1) * 60, 2);
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getHours = function() {
- return this.proxy.getHours();
- };
-
- /**
- * Get the current hour on a 12-hour scheme
- *
- * @returns {Integer}
- */
-
- jsDate.prototype.getHours12 = function() {
- var hours = this.proxy.getHours();
- return hours > 12 ? hours - 12 : (hours == 0 ? 12 : hours);
- };
-
-
- jsDate.prototype.getIsoWeek = function() {
- var d = this.proxy;
- var woy = d.getWeekOfYear();
- var dow1_1 = (new Date('' + d.getFullYear() + '/1/1')).getDay();
- // First week is 01 and not 00 as in the case of %U and %W,
- // so we add 1 to the final result except if day 1 of the year
- // is a Monday (then %W returns 01).
- // We also need to subtract 1 if the day 1 of the year is
- // Friday-Sunday, so the resulting equation becomes:
- var idow = woy + (dow1_1 > 4 || dow1_1 <= 1 ? 0 : 1);
- if(idow == 53 && (new Date('' + d.getFullYear() + '/12/31')).getDay() < 4)
- {
- idow = 1;
- }
- else if(idow === 0)
- {
- d = new jsDate(new Date('' + (d.getFullYear()-1) + '/12/31'));
- idow = d.getIsoWeek();
- }
- d = null;
- return idow;
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getMilliseconds = function() {
- return this.proxy.getMilliseconds();
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getMinutes = function() {
- return this.proxy.getMinutes();
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getMonth = function() {
- return this.proxy.getMonth();
- };
-
- /**
- * Get the name of the current month
- *
- * @returns {String}
- */
-
- jsDate.prototype.getMonthName = function() {
- return jsDate.regional[this.locale]["monthNames"][this.proxy.getMonth()];
- };
-
- /**
- * Get the number of the current month, 1-12
- *
- * @returns {Integer}
- */
-
- jsDate.prototype.getMonthNumber = function() {
- return this.proxy.getMonth() + 1;
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getSeconds = function() {
- return this.proxy.getSeconds();
- };
-
- /**
- * Return a proper two-digit year integer
- *
- * @returns {Integer}
- */
-
- jsDate.prototype.getShortYear = function() {
- return this.proxy.getYear() % 100;
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getTime = function() {
- return this.proxy.getTime();
- };
-
- /**
- * Get the timezone abbreviation
- *
- * @returns {String} Abbreviation for the timezone
- */
- jsDate.prototype.getTimezoneAbbr = function() {
- return this.proxy.toString().replace(/^.*\(([^)]+)\)$/, '$1');
- };
-
- /**
- * Get the browser-reported name for the current timezone (e.g. MDT, Mountain Daylight Time)
- *
- * @returns {String}
- */
- jsDate.prototype.getTimezoneName = function() {
- var match = /(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());
- return match[1] || match[2] || 'GMT' + this.getGmtOffset();
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getTimezoneOffset = function() {
- return this.proxy.getTimezoneOffset();
- };
-
-
- /**
- * Get the week number of the given year, starting with the first Monday as the first week
- * @returns {Integer} Week number (13 for the 13th week of the year).
- */
- jsDate.prototype.getWeekOfYear = function() {
- var doy = this.getDayOfYear();
- var rdow = 7 - this.getDayOfWeek();
- var woy = parseInt((doy+rdow)/7, 10);
- return woy;
- };
-
- /**
- * Get the current date as a Unix timestamp
- *
- * @returns {Integer}
- */
-
- jsDate.prototype.getUnix = function() {
- return Math.round(this.proxy.getTime() / 1000, 0);
- };
-
- /**
- * Implements Date functionality
- */
- jsDate.prototype.getYear = function() {
- return this.proxy.getYear();
- };
-
- /**
- * Return a date one day ahead (or any other unit)
- *
- * @param {String} unit Optional, year | month | day | week | hour | minute | second | millisecond
- * @returns {jsDate}
- */
-
- jsDate.prototype.next = function(unit) {
- unit = unit || 'day';
- return this.clone().add(1, unit);
- };
-
- /**
- * Set the jsDate instance to a new date.
- *
- * @param {String | Number | Array | Date Object | jsDate Object | Options Object} arguments Optional arguments,
- * either a parsable date/time string,
- * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],
- * a Date object, jsDate Object or an options object of form {syntax: "perl", date:some Date} where all options are optional.
- */
- jsDate.prototype.set = function() {
- switch ( arguments.length ) {
- case 0:
- this.proxy = new Date();
- break;
- case 1:
- // other objects either won't have a _type property or,
- // if they do, it shouldn't be set to "jsDate", so
- // assume it is an options argument.
- if (get_type(arguments[0]) == "[object Object]" && arguments[0]._type != "jsDate") {
- var opts = this.options = arguments[0];
- this.syntax = opts.syntax || this.syntax;
- this.defaultCentury = opts.defaultCentury || this.defaultCentury;
- this.proxy = jsDate.createDate(opts.date);
- }
- else {
- this.proxy = jsDate.createDate(arguments[0]);
- }
- break;
- default:
- var a = [];
- for ( var i=0; ijsDate attempts to detect locale when loaded and defaults to 'en'.
- * If a localization is detected which is not available, jsDate defaults to 'en'.
- * Additional localizations can be added after jsDate loads. After adding a localization,
- * call the jsDate.regional.getLocale() method. Currently, en, fr and de are defined.
- *
- *
Localizations must be an object and have the following properties defined: monthNames, monthNamesShort, dayNames, dayNamesShort and Localizations are added like:
- *
- * jsDate.regional['en'] = {
- * monthNames : 'January February March April May June July August September October November December'.split(' '),
- * monthNamesShort : 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '),
- * dayNames : 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' '),
- * dayNamesShort : 'Sun Mon Tue Wed Thu Fri Sat'.split(' ')
- * };
- *
- *
After adding localizations, call jsDate.regional.getLocale(); to update the locale setting with the
- * new localizations.
- */
-
- jsDate.regional = {
- 'en': {
- monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'],
- monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
- dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
- dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
- formatString: '%Y-%m-%d %H:%M:%S'
- },
-
- 'fr': {
- monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
- monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Déc'],
- dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
- dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
- formatString: '%Y-%m-%d %H:%M:%S'
- },
-
- 'de': {
- monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
- monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'],
- dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
- dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
- formatString: '%Y-%m-%d %H:%M:%S'
- },
-
- 'es': {
- monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
- monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', 'Jul','Ago','Sep','Oct','Nov','Dic'],
- dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'],
- dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'],
- formatString: '%Y-%m-%d %H:%M:%S'
- },
-
- 'ru': {
- monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
- monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'],
- dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
- dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
- formatString: '%Y-%m-%d %H:%M:%S'
- },
-
- 'ar': {
- monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران','تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
- monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
- dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'],
- dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],
- formatString: '%Y-%m-%d %H:%M:%S'
- },
-
- 'pt': {
- monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
- monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],
- dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
- dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
- formatString: '%Y-%m-%d %H:%M:%S'
- },
-
- 'pt-BR': {
- monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
- monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],
- dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
- dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
- formatString: '%Y-%m-%d %H:%M:%S'
- }
-
-
- };
-
- // Set english variants to 'en'
- jsDate.regional['en-US'] = jsDate.regional['en-GB'] = jsDate.regional['en'];
-
- /**
- * Try to determine the users locale based on the lang attribute of the html page. Defaults to 'en'
- * if it cannot figure out a locale of if the locale does not have a localization defined.
- * @returns {String} locale
- */
-
- jsDate.regional.getLocale = function () {
- var l = jsDate.config.defaultLocale;
-
- if ( document && document.getElementsByTagName('html') && document.getElementsByTagName('html')[0].lang ) {
- l = document.getElementsByTagName('html')[0].lang;
- if (!jsDate.regional.hasOwnProperty(l)) {
- l = jsDate.config.defaultLocale;
- }
- }
-
- return l;
- };
-
- // ms in day
- var day = 24 * 60 * 60 * 1000;
-
- // padd a number with zeros
- var addZeros = function(num, digits) {
- num = String(num);
- var i = digits - num.length;
- var s = String(Math.pow(10, i)).slice(1);
- return s.concat(num);
- };
-
- // representations used for calculating differences between dates.
- // This borrows heavily from Ken Snyder's work.
- var multipliers = {
- millisecond: 1,
- second: 1000,
- minute: 60 * 1000,
- hour: 60 * 60 * 1000,
- day: day,
- week: 7 * day,
- month: {
- // add a number of months
- add: function(d, number) {
- // add any years needed (increments of 12)
- multipliers.year.add(d, Math[number > 0 ? 'floor' : 'ceil'](number / 12));
- // ensure that we properly wrap betwen December and January
- var prevMonth = d.getMonth() + (number % 12);
- if (prevMonth == 12) {
- prevMonth = 0;
- d.setYear(d.getFullYear() + 1);
- } else if (prevMonth == -1) {
- prevMonth = 11;
- d.setYear(d.getFullYear() - 1);
- }
- d.setMonth(prevMonth);
- },
- // get the number of months between two Date objects (decimal to the nearest day)
- diff: function(d1, d2) {
- // get the number of years
- var diffYears = d1.getFullYear() - d2.getFullYear();
- // get the number of remaining months
- var diffMonths = d1.getMonth() - d2.getMonth() + (diffYears * 12);
- // get the number of remaining days
- var diffDays = d1.getDate() - d2.getDate();
- // return the month difference with the days difference as a decimal
- return diffMonths + (diffDays / 30);
- }
- },
- year: {
- // add a number of years
- add: function(d, number) {
- d.setYear(d.getFullYear() + Math[number > 0 ? 'floor' : 'ceil'](number));
- },
- // get the number of years between two Date objects (decimal to the nearest day)
- diff: function(d1, d2) {
- return multipliers.month.diff(d1, d2) / 12;
- }
- }
- };
- //
- // Alias each multiplier with an 's' to allow 'year' and 'years' for example.
- // This comes from Ken Snyders work.
- //
- for (var unit in multipliers) {
- if (unit.substring(unit.length - 1) != 's') { // IE will iterate newly added properties :|
- multipliers[unit + 's'] = multipliers[unit];
- }
- }
-
- //
- // take a jsDate instance and a format code and return the formatted value.
- // This is a somewhat modified version of Ken Snyder's method.
- //
- var format = function(d, code, syntax) {
- // if shorcut codes are used, recursively expand those.
- if (jsDate.formats[syntax]["shortcuts"][code]) {
- return jsDate.strftime(d, jsDate.formats[syntax]["shortcuts"][code], syntax);
- } else {
- // get the format code function and addZeros() argument
- var getter = (jsDate.formats[syntax]["codes"][code] || '').split('.');
- var nbr = d['get' + getter[0]] ? d['get' + getter[0]]() : '';
- if (getter[1]) {
- nbr = addZeros(nbr, getter[1]);
- }
- return nbr;
- }
- };
-
- /**
- * @static
- * Static function for convert a date to a string according to a given format. Also acts as namespace for strftime format codes.
- *
strftime formatting can be accomplished without creating a jsDate object by calling jsDate.strftime():
- * @param {String | Number | Array | jsDate Object | Date Object} date A parsable date string, JavaScript time stamp, Array of form [year, month, day, hours, minutes, seconds, milliseconds], jsDate Object or Date object.
- * @param {String} formatString String with embedded date formatting codes.
- * See: {@link jsDate.formats}.
- * @param {String} syntax Optional syntax to use [default perl].
- * @param {String} locale Optional locale to use.
- * @returns {String} Formatted representation of the date.
- */
- //
- // Logic as implemented here is very similar to Ken Snyder's Date Instance Methods.
- //
- jsDate.strftime = function(d, formatString, syntax, locale) {
- var syn = 'perl';
- var loc = jsDate.regional.getLocale();
-
- // check if syntax and locale are available or reversed
- if (syntax && jsDate.formats.hasOwnProperty(syntax)) {
- syn = syntax;
- }
- else if (syntax && jsDate.regional.hasOwnProperty(syntax)) {
- loc = syntax;
- }
-
- if (locale && jsDate.formats.hasOwnProperty(locale)) {
- syn = locale;
- }
- else if (locale && jsDate.regional.hasOwnProperty(locale)) {
- loc = locale;
- }
-
- if (get_type(d) != "[object Object]" || d._type != "jsDate") {
- d = new jsDate(d);
- d.locale = loc;
- }
- if (!formatString) {
- formatString = d.formatString || jsDate.regional[loc]['formatString'];
- }
- // default the format string to year-month-day
- var source = formatString || '%Y-%m-%d',
- result = '',
- match;
- // replace each format code
- while (source.length > 0) {
- if (match = source.match(jsDate.formats[syn].codes.matcher)) {
- result += source.slice(0, match.index);
- result += (match[1] || '') + format(d, match[2], syn);
- source = source.slice(match.index + match[0].length);
- } else {
- result += source;
- source = '';
- }
- }
- return result;
- };
-
- /**
- * @namespace
- * Namespace to hold format codes and format shortcuts. "perl" and "php" format codes
- * and shortcuts are defined by default. Additional codes and shortcuts can be
- * added like:
- *
- *
- * jsDate.formats["perl"] = {
- * "codes": {
- * matcher: /someregex/,
- * Y: "fullYear", // name of "get" method without the "get",
- * ..., // more codes
- * },
- * "shortcuts": {
- * F: '%Y-%m-%d',
- * ..., // more shortcuts
- * }
- * };
- *
- *
- *
Additionally, ISO and SQL shortcuts are defined and can be accesses via:
- * jsDate.formats.ISO and jsDate.formats.SQL
- */
-
- jsDate.formats = {
- ISO:'%Y-%m-%dT%H:%M:%S.%N%G',
- SQL:'%Y-%m-%d %H:%M:%S'
- };
-
- /**
- * Perl format codes and shortcuts for strftime.
- *
- * A hash (object) of codes where each code must be an array where the first member is
- * the name of a Date.prototype or jsDate.prototype function to call
- * and optionally a second member indicating the number to pass to addZeros()
- *
- *
The following format codes are defined:
- *
- *
- * 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)
- *
- * == 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 03:31:00 PM %I:%M:%S %p
- *
- * == Characters ==
- * %n \n Newline
- * %t \t Tab
- * %% % Percent Symbol
- *
- *
- *
Formatting shortcuts that will be translated into their longer version.
- * Be sure that format shortcuts do not refer to themselves: this will cause an infinite loop.
- *
- *
Format codes and format shortcuts can be redefined after the jsDate
- * module is imported.
- *
- *
Note that if you redefine the whole hash (object), you must supply a "matcher"
- * regex for the parser. The default matcher is:
- *
- * /()%(#?(%|[a-z]))/i
- *
- *
which corresponds to the Perl syntax used by default.
- *
- *
By customizing the matcher and format codes, nearly any strftime functionality is possible.
- */
-
- jsDate.formats.perl = {
- codes: {
- //
- // 2-part regex matcher for format codes
- //
- // first match must be the character before the code (to account for escaping)
- // second match must be the format code character(s)
- //
- matcher: /()%(#?(%|[a-z]))/i,
- // year
- Y: 'FullYear',
- y: 'ShortYear.2',
- // month
- m: 'MonthNumber.2',
- '#m': 'MonthNumber',
- B: 'MonthName',
- b: 'AbbrMonthName',
- // day
- d: 'Date.2',
- '#d': 'Date',
- e: 'Date',
- A: 'DayName',
- a: 'AbbrDayName',
- w: 'Day',
- // hours
- H: 'Hours.2',
- '#H': 'Hours',
- I: 'Hours12.2',
- '#I': 'Hours12',
- p: 'AMPM',
- // minutes
- M: 'Minutes.2',
- '#M': 'Minutes',
- // seconds
- S: 'Seconds.2',
- '#S': 'Seconds',
- s: 'Unix',
- // milliseconds
- N: 'Milliseconds.3',
- '#N': 'Milliseconds',
- // timezone
- O: 'TimezoneOffset',
- Z: 'TimezoneName',
- G: 'GmtOffset'
- },
-
- shortcuts: {
- // date
- F: '%Y-%m-%d',
- // time
- T: '%H:%M:%S',
- X: '%H:%M:%S',
- // local format date
- x: '%m/%d/%y',
- D: '%m/%d/%y',
- // local format extended
- '#c': '%a %b %e %H:%M:%S %Y',
- // local format short
- v: '%e-%b-%Y',
- R: '%H:%M',
- r: '%I:%M:%S %p',
- // tab and newline
- t: '\t',
- n: '\n',
- '%': '%'
- }
- };
-
- /**
- * PHP format codes and shortcuts for strftime.
- *
- * A hash (object) of codes where each code must be an array where the first member is
- * the name of a Date.prototype or jsDate.prototype function to call
- * and optionally a second member indicating the number to pass to addZeros()
- *
- *
The following format codes are defined:
- *
- *
- * Code Result Description
- * === Days ===
- * %a Sun through Sat An abbreviated textual representation of the day
- * %A Sunday - Saturday A full textual representation of the day
- * %d 01 to 31 Two-digit day of the month (with leading zeros)
- * %e 1 to 31 Day of the month, with a space preceding single digits.
- * %j 001 to 366 Day of the year, 3 digits with leading zeros
- * %u 1 - 7 (Mon - Sun) ISO-8601 numeric representation of the day of the week
- * %w 0 - 6 (Sun - Sat) Numeric representation of the day of the week
- *
- * === Week ===
- * %U 13 Full Week number, starting with the first Sunday as the first week
- * %V 01 through 53 ISO-8601:1988 week number, starting with the first week of the year
- * with at least 4 weekdays, with Monday being the start of the week
- * %W 46 A numeric representation of the week of the year,
- * starting with the first Monday as the first week
- * === Month ===
- * %b Jan through Dec Abbreviated month name, based on the locale
- * %B January - December Full month name, based on the locale
- * %h Jan through Dec Abbreviated month name, based on the locale (an alias of %b)
- * %m 01 - 12 (Jan - Dec) Two digit representation of the month
- *
- * === Year ===
- * %C 19 Two digit century (year/100, truncated to an integer)
- * %y 09 for 2009 Two digit year
- * %Y 2038 Four digit year
- *
- * === Time ===
- * %H 00 through 23 Two digit representation of the hour in 24-hour format
- * %I 01 through 12 Two digit representation of the hour in 12-hour format
- * %l 1 through 12 Hour in 12-hour format, with a space preceeding single digits
- * %M 00 through 59 Two digit representation of the minute
- * %p AM/PM UPPER-CASE 'AM' or 'PM' based on the given time
- * %P am/pm lower-case 'am' or 'pm' based on the given time
- * %r 09:34:17 PM Same as %I:%M:%S %p
- * %R 00:35 Same as %H:%M
- * %S 00 through 59 Two digit representation of the second
- * %T 21:34:17 Same as %H:%M:%S
- * %X 03:59:16 Preferred time representation based on locale, without the date
- * %z -0500 or EST Either the time zone offset from UTC or the abbreviation
- * %Z -0500 or EST The time zone offset/abbreviation option NOT given by %z
- *
- * === Time and Date ===
- * %D 02/05/09 Same as %m/%d/%y
- * %F 2009-02-05 Same as %Y-%m-%d (commonly used in database datestamps)
- * %s 305815200 Unix Epoch Time timestamp (same as the time() function)
- * %x 02/05/09 Preferred date representation, without the time
- *
- * === Miscellaneous ===
- * %n --- A newline character (\n)
- * %t --- A Tab character (\t)
- * %% --- A literal percentage character (%)
- *
- */
-
- jsDate.formats.php = {
- codes: {
- //
- // 2-part regex matcher for format codes
- //
- // first match must be the character before the code (to account for escaping)
- // second match must be the format code character(s)
- //
- matcher: /()%((%|[a-z]))/i,
- // day
- a: 'AbbrDayName',
- A: 'DayName',
- d: 'Date.2',
- e: 'Date',
- j: 'DayOfYear.3',
- u: 'DayOfWeek',
- w: 'Day',
- // week
- U: 'FullWeekOfYear.2',
- V: 'IsoWeek.2',
- W: 'WeekOfYear.2',
- // month
- b: 'AbbrMonthName',
- B: 'MonthName',
- m: 'MonthNumber.2',
- h: 'AbbrMonthName',
- // year
- C: 'Century.2',
- y: 'ShortYear.2',
- Y: 'FullYear',
- // time
- 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',
- '%': '%'
- }
- };
- //
- // Conceptually, the logic implemented here is similar to Ken Snyder's Date Instance Methods.
- // I use his idea of a set of parsers which can be regular expressions or functions,
- // iterating through those, and then seeing if Date.parse() will create a date.
- // The parser expressions and functions are a little different and some bugs have been
- // worked out. Also, a lot of "pre-parsing" is done to fix implementation
- // variations of Date.parse() between browsers.
- //
- jsDate.createDate = function(date) {
- // if passing in multiple arguments, try Date constructor
- if (date == null) {
- return new Date();
- }
- // If the passed value is already a date object, return it
- if (date instanceof Date) {
- return date;
- }
- // if (typeof date == 'number') return new Date(date * 1000);
- // If the passed value is an integer, interpret it as a javascript timestamp
- if (typeof date == 'number') {
- return new Date(date);
- }
-
- // Before passing strings into Date.parse(), have to normalize them for certain conditions.
- // If strings are not formatted staccording to the EcmaScript spec, results from Date parse will be implementation dependent.
- //
- // For example:
- // * FF and Opera assume 2 digit dates are pre y2k, Chome assumes <50 is pre y2k, 50+ is 21st century.
- // * Chrome will correctly parse '1984-1-25' into localtime, FF and Opera will not parse.
- // * Both FF, Chrome and Opera will parse '1984/1/25' into localtime.
-
- // remove leading and trailing spaces
- var parsable = String(date).replace(/^\s*(.+)\s*$/g, '$1');
-
- // replace dahses (-) with slashes (/) in dates like n[nnn]/n[n]/n[nnn]
- parsable = parsable.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/, "$1/$2/$3");
-
- /////////
- // Need to check for '15-Dec-09' also.
- // FF will not parse, but Chrome will.
- // Chrome will set date to 2009 as well.
- /////////
-
- // first check for 'dd-mmm-yyyy' or 'dd/mmm/yyyy' like '15-Dec-2010'
- parsable = parsable.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i, "$1 $2 $3");
-
- // Now check for 'dd-mmm-yy' or 'dd/mmm/yy' and normalize years to default century.
- var match = parsable.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i);
- if (match && match.length > 3) {
- var m3 = parseFloat(match[3]);
- var ny = jsDate.config.defaultCentury + m3;
- ny = String(ny);
-
- // now replace 2 digit year with 4 digit year
- parsable = parsable.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i, match[1] +' '+ match[2] +' '+ ny);
-
- }
-
- // Check for '1/19/70 8:14PM'
- // where starts with mm/dd/yy or yy/mm/dd and have something after
- // Check if 1st postiion is greater than 31, assume it is year.
- // Assme all 2 digit years are 1900's.
- // Finally, change them into US style mm/dd/yyyy representations.
- match = parsable.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/);
-
- function h1(parsable, match) {
- var m1 = parseFloat(match[1]);
- var m2 = parseFloat(match[2]);
- var m3 = parseFloat(match[3]);
- var cent = jsDate.config.defaultCentury;
- var ny, nd, nm, str;
-
- if (m1 > 31) { // first number is a year
- nd = m3;
- nm = m2;
- ny = cent + m1;
- }
-
- else { // last number is the year
- nd = m2;
- nm = m1;
- ny = cent + m3;
- }
-
- str = nm+'/'+nd+'/'+ny;
-
- // now replace 2 digit year with 4 digit year
- return parsable.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/, str);
-
- }
-
- if (match && match.length > 3) {
- parsable = h1(parsable, match);
- }
-
- // Now check for '1/19/70' with nothing after and do as above
- var match = parsable.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/);
-
- if (match && match.length > 3) {
- parsable = h1(parsable, match);
- }
-
-
- var i = 0;
- var length = jsDate.matchers.length;
- var pattern,
- ms,
- current = parsable;
- while (i < length) {
- ms = Date.parse(current);
- if (!isNaN(ms)) {
- return new Date(ms);
- }
- pattern = jsDate.matchers[i];
- if (typeof pattern == 'function') {
- var obj = pattern.call(jsDate, current);
- if (obj instanceof Date) {
- return obj;
- }
- } else {
- current = parsable.replace(pattern[0], pattern[1]);
- }
- i++;
- }
- return NaN;
- };
-
-
- /**
- * @static
- * Handy static utility function to return the number of days in a given month.
- * @param {Integer} year Year
- * @param {Integer} month Month (1-12)
- * @returns {Integer} Number of days in the month.
- */
- //
- // handy utility method Borrowed right from Ken Snyder's Date Instance Mehtods.
- //
- jsDate.daysInMonth = function(year, month) {
- if (month == 2) {
- return new Date(year, 1, 29).getDate() == 29 ? 29 : 28;
- }
- return [undefined,31,undefined,31,30,31,30,31,31,30,31,30,31][month];
- };
-
-
- //
- // An Array of regular expressions or functions that will attempt to match the date string.
- // Functions are called with scope of a jsDate instance.
- //
- jsDate.matchers = [
- // convert dd.mmm.yyyy to mm/dd/yyyy (world date to US date).
- [/(3[01]|[0-2]\d)\s*\.\s*(1[0-2]|0\d)\s*\.\s*([1-9]\d{3})/, '$2/$1/$3'],
- // convert yyyy-mm-dd to mm/dd/yyyy (ISO date to US date).
- [/([1-9]\d{3})\s*-\s*(1[0-2]|0\d)\s*-\s*(3[01]|[0-2]\d)/, '$2/$3/$1'],
- // Handle 12 hour or 24 hour time with milliseconds am/pm and optional date part.
- function(str) {
- var match = str.match(/^(?:(.+)\s+)?([012]?\d)(?:\s*\:\s*(\d\d))?(?:\s*\:\s*(\d\d(\.\d*)?))?\s*(am|pm)?\s*$/i);
- // opt. date hour opt. minute opt. second opt. msec opt. am or pm
- if (match) {
- if (match[1]) {
- var d = this.createDate(match[1]);
- if (isNaN(d)) {
- return;
- }
- } else {
- var d = new Date();
- d.setMilliseconds(0);
- }
- var hour = parseFloat(match[2]);
- if (match[6]) {
- hour = match[6].toLowerCase() == 'am' ? (hour == 12 ? 0 : hour) : (hour == 12 ? 12 : hour + 12);
- }
- d.setHours(hour, parseInt(match[3] || 0, 10), parseInt(match[4] || 0, 10), ((parseFloat(match[5] || 0)) || 0)*1000);
- return d;
- }
- else {
- return str;
- }
- },
- // Handle ISO timestamp with time zone.
- function(str) {
- var match = str.match(/^(?:(.+))[T|\s+]([012]\d)(?:\:(\d\d))(?:\:(\d\d))(?:\.\d+)([\+\-]\d\d\:\d\d)$/i);
- if (match) {
- if (match[1]) {
- var d = this.createDate(match[1]);
- if (isNaN(d)) {
- return;
- }
- } else {
- var d = new Date();
- d.setMilliseconds(0);
- }
- var hour = parseFloat(match[2]);
- d.setHours(hour, parseInt(match[3], 10), parseInt(match[4], 10), parseFloat(match[5])*1000);
- return d;
- }
- else {
- return str;
- }
- },
- // Try to match ambiguous strings like 12/8/22.
- // Use FF date assumption that 2 digit years are 20th century (i.e. 1900's).
- // This may be redundant with pre processing of date already performed.
- function(str) {
- var match = str.match(/^([0-3]?\d)\s*[-\/.\s]{1}\s*([a-zA-Z]{3,9})\s*[-\/.\s]{1}\s*([0-3]?\d)$/);
- if (match) {
- var d = new Date();
- var cent = jsDate.config.defaultCentury;
- var m1 = parseFloat(match[1]);
- var m3 = parseFloat(match[3]);
- var ny, nd, nm;
- if (m1 > 31) { // first number is a year
- nd = m3;
- ny = cent + m1;
- }
-
- else { // last number is the year
- nd = m1;
- ny = cent + m3;
- }
-
- var nm = inArray(match[2], jsDate.regional[this.locale]["monthNamesShort"]);
-
- if (nm == -1) {
- nm = inArray(match[2], jsDate.regional[this.locale]["monthNames"]);
- }
-
- d.setFullYear(ny, nm, nd);
- d.setHours(0,0,0,0);
- return d;
- }
-
- else {
- return str;
- }
- }
- ];
-
- //
- // I think John Reisig published this method on his blog, ejohn.
- //
- function inArray( elem, array ) {
- if ( array.indexOf ) {
- return array.indexOf( elem );
- }
-
- for ( var i = 0, length = array.length; i < length; i++ ) {
- if ( array[ i ] === elem ) {
- return i;
- }
- }
-
- return -1;
- }
-
- //
- // Thanks to Kangax, Christian Sciberras and Stack Overflow for this method.
- //
- function get_type(thing){
- if(thing===null) return "[object Null]"; // special case
- return Object.prototype.toString.call(thing);
- }
-
- $.jsDate = jsDate;
-
-
- /**
- * JavaScript printf/sprintf functions.
- *
- * This code has been adapted from the publicly available sprintf methods
- * by Ash Searle. His original header follows:
- *
- * This code is unrestricted: you are free to use it however you like.
- *
- * The functions should work as expected, performing left or right alignment,
- * truncating strings, outputting numbers with a required precision etc.
- *
- * For complex cases, these functions follow the Perl implementations of
- * (s)printf, allowing arguments to be passed out-of-order, and to set the
- * precision or length of the output based on arguments instead of fixed
- * numbers.
- *
- * See http://perldoc.perl.org/functions/sprintf.html for more information.
- *
- * Implemented:
- * - zero and space-padding
- * - right and left-alignment,
- * - base X prefix (binary, octal and hex)
- * - positive number prefix
- * - (minimum) width
- * - precision / truncation / maximum width
- * - out of order arguments
- *
- * Not implemented (yet):
- * - vector flag
- * - size (bytes, words, long-words etc.)
- *
- * Will not implement:
- * - %n or %p (no pass-by-reference in JavaScript)
- *
- * @version 2007.04.27
- * @author Ash Searle
- *
- * You can see the original work and comments on his blog:
- * http://hexmen.com/blog/2007/03/printf-sprintf/
- * http://hexmen.com/js/sprintf.js
- */
-
- /**
- * @Modifications 2009.05.26
- * @author Chris Leonello
- *
- * Added %p %P specifier
- * Acts like %g or %G but will not add more significant digits to the output than present in the input.
- * Example:
- * Format: '%.3p', Input: 0.012, Output: 0.012
- * Format: '%.3g', Input: 0.012, Output: 0.0120
- * Format: '%.4p', Input: 12.0, Output: 12.0
- * Format: '%.4g', Input: 12.0, Output: 12.00
- * Format: '%.4p', Input: 4.321e-5, Output: 4.321e-5
- * Format: '%.4g', Input: 4.321e-5, Output: 4.3210e-5
- */
- $.jqplot.sprintf = function() {
- function pad(str, len, chr, leftJustify) {
- var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
- return leftJustify ? str + padding : padding + str;
-
- }
-
- function thousand_separate(value) {
- var value_str = new String(value);
- for (var i=10; i>0; i--) {
- if (value_str == (value_str = value_str.replace(/^(\d+)(\d{3})/, "$1"+$.jqplot.sprintf.thousandsSeparator+"$2"))) break;
- }
- return value_str;
- }
-
- function justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace) {
- var diff = minWidth - value.length;
- if (diff > 0) {
- var spchar = ' ';
- if (htmlSpace) { spchar = ' '; }
- if (leftJustify || !zeroPad) {
- value = pad(value, minWidth, spchar, leftJustify);
- } else {
- value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
- }
- }
- return value;
- }
-
- function formatBaseX(value, base, prefix, leftJustify, minWidth, precision, zeroPad, htmlSpace) {
- // Note: casts negative numbers to positive ones
- var number = value >>> 0;
- prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
- value = prefix + pad(number.toString(base), precision || 0, '0', false);
- return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);
- }
-
- function formatString(value, leftJustify, minWidth, precision, zeroPad, htmlSpace) {
- if (precision != null) {
- value = value.slice(0, precision);
- }
- return justify(value, '', leftJustify, minWidth, zeroPad, htmlSpace);
- }
-
- var a = arguments, i = 0, format = a[i++];
-
- return format.replace($.jqplot.sprintf.regex, function(substring, valueIndex, flags, minWidth, _, precision, type) {
- if (substring == '%%') { return '%'; }
-
- // parse flags
- var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, htmlSpace = false, thousandSeparation = false;
- for (var j = 0; flags && j < flags.length; j++) switch (flags.charAt(j)) {
- case ' ': positivePrefix = ' '; break;
- case '+': positivePrefix = '+'; break;
- case '-': leftJustify = true; break;
- case '0': zeroPad = true; break;
- case '#': prefixBaseX = true; break;
- case '&': htmlSpace = true; break;
- case '\'': thousandSeparation = true; break;
- }
-
- // parameters may be null, undefined, empty-string or real valued
- // we want to ignore null, undefined and empty-string values
-
- if (!minWidth) {
- minWidth = 0;
- }
- else if (minWidth == '*') {
- minWidth = +a[i++];
- }
- else if (minWidth.charAt(0) == '*') {
- minWidth = +a[minWidth.slice(1, -1)];
- }
- else {
- minWidth = +minWidth;
- }
-
- // Note: undocumented perl feature:
- if (minWidth < 0) {
- minWidth = -minWidth;
- leftJustify = true;
- }
-
- if (!isFinite(minWidth)) {
- throw new Error('$.jqplot.sprintf: (minimum-)width must be finite');
- }
-
- if (!precision) {
- precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
- }
- else if (precision == '*') {
- precision = +a[i++];
- }
- else if (precision.charAt(0) == '*') {
- precision = +a[precision.slice(1, -1)];
- }
- else {
- precision = +precision;
- }
-
- // grab value using valueIndex if required?
- var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];
-
- switch (type) {
- case 's': {
- if (value == null) {
- return '';
- }
- return formatString(String(value), leftJustify, minWidth, precision, zeroPad, htmlSpace);
- }
- case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad, htmlSpace);
- case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad,htmlSpace);
- case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);
- case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);
- case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace).toUpperCase();
- case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);
- case 'i': {
- var number = parseInt(+value, 10);
- if (isNaN(number)) {
- return '';
- }
- var prefix = number < 0 ? '-' : positivePrefix;
- var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number));
- value = prefix + pad(number_str, precision, '0', false);
- //value = prefix + pad(String(Math.abs(number)), precision, '0', false);
- return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);
- }
- case 'd': {
- var number = Math.round(+value);
- if (isNaN(number)) {
- return '';
- }
- var prefix = number < 0 ? '-' : positivePrefix;
- var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number));
- value = prefix + pad(number_str, precision, '0', false);
- return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);
- }
- case 'e':
- case 'E':
- case 'f':
- case 'F':
- case 'g':
- case 'G':
- {
- var number = +value;
- if (isNaN(number)) {
- return '';
- }
- var prefix = number < 0 ? '-' : positivePrefix;
- var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
- var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
- var number_str = Math.abs(number)[method](precision);
- number_str = thousandSeparation ? thousand_separate(number_str): number_str;
- value = prefix + number_str;
- return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform]();
- }
- case 'p':
- case 'P':
- {
- // make sure number is a number
- var number = +value;
- if (isNaN(number)) {
- return '';
- }
- var prefix = number < 0 ? '-' : positivePrefix;
-
- var parts = String(Number(Math.abs(number)).toExponential()).split(/e|E/);
- var sd = (parts[0].indexOf('.') != -1) ? parts[0].length - 1 : parts[0].length;
- var zeros = (parts[1] < 0) ? -parts[1] - 1 : 0;
-
- if (Math.abs(number) < 1) {
- if (sd + zeros <= precision) {
- value = prefix + Math.abs(number).toPrecision(sd);
- }
- else {
- if (sd <= precision - 1) {
- value = prefix + Math.abs(number).toExponential(sd-1);
- }
- else {
- value = prefix + Math.abs(number).toExponential(precision-1);
- }
- }
- }
- else {
- var prec = (sd <= precision) ? sd : precision;
- value = prefix + Math.abs(number).toPrecision(prec);
- }
- var textTransform = ['toString', 'toUpperCase']['pP'.indexOf(type) % 2];
- return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform]();
- }
- case 'n': return '';
- default: return substring;
- }
- });
- };
-
- $.jqplot.sprintf.thousandsSeparator = ',';
-
- $.jqplot.sprintf.regex = /%%|%(\d+\$)?([-+#0&\' ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([nAscboxXuidfegpEGP])/g;
-
-})(jQuery);
diff --git a/html/js/jqplot/jquery.js b/html/js/jqplot/jquery.js
deleted file mode 100644
index 5d5a1d58e..000000000
--- a/html/js/jqplot/jquery.js
+++ /dev/null
@@ -1,8936 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.6.1
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu May 12 15:04:36 2011 -0400
- */
-(function( window, undefined ) {
-
-// Use the correct document accordingly with window argument (sandbox)
-var document = window.document,
- navigator = window.navigator,
- location = window.location;
-var jQuery = (function() {
-
-// Define a local copy of jQuery
-var jQuery = function( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
- },
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- // A central reference to the root jQuery(document)
- rootjQuery,
-
- // A simple way to check for HTML strings or ID strings
- // (both of which we optimize for)
- quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
- // Check if a string has a non-whitespace character in it
- rnotwhite = /\S/,
-
- // Used for trimming whitespace
- trimLeft = /^\s+/,
- trimRight = /\s+$/,
-
- // Check for digits
- rdigit = /\d/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
- // Useragent RegExp
- rwebkit = /(webkit)[ \/]([\w.]+)/,
- ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
- rmsie = /(msie) ([\w.]+)/,
- rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
-
- // Keep a UserAgent string for use with jQuery.browser
- userAgent = navigator.userAgent,
-
- // For matching the engine and version of the browser
- browserMatch,
-
- // The deferred used on DOM ready
- readyList,
-
- // The ready event handler
- DOMContentLoaded,
-
- // Save a reference to some core methods
- toString = Object.prototype.toString,
- hasOwn = Object.prototype.hasOwnProperty,
- push = Array.prototype.push,
- slice = Array.prototype.slice,
- trim = String.prototype.trim,
- indexOf = Array.prototype.indexOf,
-
- // [[Class]] -> type pairs
- class2type = {};
-
-jQuery.fn = jQuery.prototype = {
- constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
-
- // Handle $(""), $(null), or $(undefined)
- if ( !selector ) {
- return this;
- }
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
- // The body element only exists once, optimize finding it
- if ( selector === "body" && !context && document.body ) {
- this.context = document;
- this[0] = document.body;
- this.selector = selector;
- this.length = 1;
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- // Are we dealing with HTML string or an ID?
- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = quickExpr.exec( selector );
- }
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
- doc = (context ? context.ownerDocument || context : document);
-
- // If a single string is passed in and it's a single tag
- // just do a createElement and skip the rest
- ret = rsingleTag.exec( selector );
-
- if ( ret ) {
- if ( jQuery.isPlainObject( context ) ) {
- selector = [ document.createElement( ret[1] ) ];
- jQuery.fn.attr.call( selector, context, true );
-
- } else {
- selector = [ doc.createElement( ret[1] ) ];
- }
-
- } else {
- ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
- }
-
- return jQuery.merge( this, selector );
-
- // HANDLE: $("#id")
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return (context || rootjQuery).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if (selector.selector !== undefined) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector: "",
-
- // The current version of jQuery being used
- jquery: "1.6.1",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- toArray: function() {
- return slice.call( this, 0 );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems, name, selector ) {
- // Build a new jQuery matched element set
- var ret = this.constructor();
-
- if ( jQuery.isArray( elems ) ) {
- push.apply( ret, elems );
-
- } else {
- jQuery.merge( ret, elems );
- }
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" ) {
- ret.selector = this.selector + (this.selector ? " " : "") + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready: function( fn ) {
- // Attach the listeners
- jQuery.bindReady();
-
- // Add the callback
- readyList.done( fn );
-
- return this;
- },
-
- eq: function( i ) {
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, +i + 1 );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ),
- "slice", slice.call(arguments).join(",") );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
-
- end: function() {
- return this.prevObject || this.constructor(null);
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: [].sort,
- splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray(src) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend({
- noConflict: function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
- // Either a released hold or an DOMready/load event and not yet ready
- if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger( "ready" ).unbind( "ready" );
- }
- }
- },
-
- bindReady: function() {
- if ( readyList ) {
- return;
- }
-
- readyList = jQuery._Deferred();
-
- // Catch cases where $(document).ready() is called after the
- // browser event has already occurred.
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Mozilla, Opera and webkit nightlies currently support this event
- if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
-
- // If IE event model is used
- } else if ( document.attachEvent ) {
- // ensure firing before onload,
- // maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var toplevel = false;
-
- try {
- toplevel = window.frameElement == null;
- } catch(e) {}
-
- if ( document.documentElement.doScroll && toplevel ) {
- doScrollCheck();
- }
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return jQuery.type(obj) === "function";
- },
-
- isArray: Array.isArray || function( obj ) {
- return jQuery.type(obj) === "array";
- },
-
- // A crude way of determining if an object is a window
- isWindow: function( obj ) {
- return obj && typeof obj === "object" && "setInterval" in obj;
- },
-
- isNaN: function( obj ) {
- return obj == null || !rdigit.test( obj ) || isNaN( obj );
- },
-
- type: function( obj ) {
- return obj == null ?
- String( obj ) :
- class2type[ toString.call(obj) ] || "object";
- },
-
- isPlainObject: function( obj ) {
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !hasOwn.call(obj, "constructor") &&
- !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
- return false;
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
-
- var key;
- for ( key in obj ) {}
-
- return key === undefined || hasOwn.call( obj, key );
- },
-
- isEmptyObject: function( obj ) {
- for ( var name in obj ) {
- return false;
- }
- return true;
- },
-
- error: function( msg ) {
- throw msg;
- },
-
- parseJSON: function( data ) {
- if ( typeof data !== "string" || !data ) {
- return null;
- }
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
-
- return (new Function( "return " + data ))();
-
- }
- jQuery.error( "Invalid JSON: " + data );
- },
-
- // Cross-browser xml parsing
- // (xml & tmp used internally)
- parseXML: function( data , xml , tmp ) {
-
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data , "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
-
- tmp = xml.documentElement;
-
- if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
- jQuery.error( "Invalid XML: " + data );
- }
-
- return xml;
- },
-
- noop: function() {},
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && rnotwhite.test( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
- }
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
- },
-
- // args is for internal usage only
- each: function( object, callback, args ) {
- var name, i = 0,
- length = object.length,
- isObj = length === undefined || jQuery.isFunction( object );
-
- if ( args ) {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.apply( object[ name ], args ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.apply( object[ i++ ], args ) === false ) {
- break;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
- break;
- }
- }
- }
- }
-
- return object;
- },
-
- // Use native String.trim function wherever possible
- trim: trim ?
- function( text ) {
- return text == null ?
- "" :
- trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function( text ) {
- return text == null ?
- "" :
- text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
- },
-
- // results is for internal usage only
- makeArray: function( array, results ) {
- var ret = results || [];
-
- if ( array != null ) {
- // The window, strings (and functions) also have 'length'
- // The extra typeof function check is to prevent crashes
- // in Safari 2 (See: #3039)
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- var type = jQuery.type( array );
-
- if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
- push.call( ret, array );
- } else {
- jQuery.merge( ret, array );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, array ) {
-
- if ( indexOf ) {
- return indexOf.call( array, elem );
- }
-
- for ( var i = 0, length = array.length; i < length; i++ ) {
- if ( array[ i ] === elem ) {
- return i;
- }
- }
-
- return -1;
- },
-
- merge: function( first, second ) {
- var i = first.length,
- j = 0;
-
- if ( typeof second.length === "number" ) {
- for ( var l = second.length; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, inv ) {
- var ret = [], retVal;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var value, key, ret = [],
- i = 0,
- length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return ret.concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- if ( typeof context === "string" ) {
- var tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- var args = slice.call( arguments, 2 ),
- proxy = function() {
- return fn.apply( context, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Mutifunctional method to get and set values to a collection
- // The value/s can be optionally by executed if its a function
- access: function( elems, key, value, exec, fn, pass ) {
- var length = elems.length;
-
- // Setting many attributes
- if ( typeof key === "object" ) {
- for ( var k in key ) {
- jQuery.access( elems, k, key[k], exec, fn, value );
- }
- return elems;
- }
-
- // Setting one attribute
- if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = !pass && exec && jQuery.isFunction(value);
-
- for ( var i = 0; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
- }
-
- return elems;
- }
-
- // Getting an attribute
- return length ? fn( elems[0], key ) : undefined;
- },
-
- now: function() {
- return (new Date()).getTime();
- },
-
- // Use of jQuery.browser is frowned upon.
- // More details: http://docs.jquery.com/Utilities/jQuery.browser
- uaMatch: function( ua ) {
- ua = ua.toLowerCase();
-
- var match = rwebkit.exec( ua ) ||
- ropera.exec( ua ) ||
- rmsie.exec( ua ) ||
- ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
- [];
-
- return { browser: match[1] || "", version: match[2] || "0" };
- },
-
- sub: function() {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- return jQuerySub;
- },
-
- browser: {}
-});
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
- jQuery.browser[ browserMatch.browser ] = true;
- jQuery.browser.version = browserMatch.version;
-}
-
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
- jQuery.browser.safari = true;
-}
-
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
- trimLeft = /^[\s\xA0]+/;
- trimRight = /[\s\xA0]+$/;
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
- DOMContentLoaded = function() {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- };
-
-} else if ( document.attachEvent ) {
- DOMContentLoaded = function() {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( document.readyState === "complete" ) {
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
- jQuery.ready();
- }
- };
-}
-
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
- if ( jQuery.isReady ) {
- return;
- }
-
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll("left");
- } catch(e) {
- setTimeout( doScrollCheck, 1 );
- return;
- }
-
- // and execute any waiting functions
- jQuery.ready();
-}
-
-// Expose jQuery to the global object
-return jQuery;
-
-})();
-
-
-var // Promise methods
- promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
- // Static reference to slice
- sliceDeferred = [].slice;
-
-jQuery.extend({
- // Create a simple deferred (one callbacks list)
- _Deferred: function() {
- var // callbacks list
- callbacks = [],
- // stored [ context , args ]
- fired,
- // to avoid firing when already doing so
- firing,
- // flag to know if the deferred has been cancelled
- cancelled,
- // the deferred itself
- deferred = {
-
- // done( f1, f2, ...)
- done: function() {
- if ( !cancelled ) {
- var args = arguments,
- i,
- length,
- elem,
- type,
- _fired;
- if ( fired ) {
- _fired = fired;
- fired = 0;
- }
- for ( i = 0, length = args.length; i < length; i++ ) {
- elem = args[ i ];
- type = jQuery.type( elem );
- if ( type === "array" ) {
- deferred.done.apply( deferred, elem );
- } else if ( type === "function" ) {
- callbacks.push( elem );
- }
- }
- if ( _fired ) {
- deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
- }
- }
- return this;
- },
-
- // resolve with given context and args
- resolveWith: function( context, args ) {
- if ( !cancelled && !fired && !firing ) {
- // make sure args are available (#8421)
- args = args || [];
- firing = 1;
- try {
- while( callbacks[ 0 ] ) {
- callbacks.shift().apply( context, args );
- }
- }
- finally {
- fired = [ context, args ];
- firing = 0;
- }
- }
- return this;
- },
-
- // resolve with this as context and given arguments
- resolve: function() {
- deferred.resolveWith( this, arguments );
- return this;
- },
-
- // Has this deferred been resolved?
- isResolved: function() {
- return !!( firing || fired );
- },
-
- // Cancel
- cancel: function() {
- cancelled = 1;
- callbacks = [];
- return this;
- }
- };
-
- return deferred;
- },
-
- // Full fledged deferred (two callbacks list)
- Deferred: function( func ) {
- var deferred = jQuery._Deferred(),
- failDeferred = jQuery._Deferred(),
- promise;
- // Add errorDeferred methods, then and promise
- jQuery.extend( deferred, {
- then: function( doneCallbacks, failCallbacks ) {
- deferred.done( doneCallbacks ).fail( failCallbacks );
- return this;
- },
- always: function() {
- return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
- },
- fail: failDeferred.done,
- rejectWith: failDeferred.resolveWith,
- reject: failDeferred.resolve,
- isRejected: failDeferred.isResolved,
- pipe: function( fnDone, fnFail ) {
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( {
- done: [ fnDone, "resolve" ],
- fail: [ fnFail, "reject" ]
- }, function( handler, data ) {
- var fn = data[ 0 ],
- action = data[ 1 ],
- returned;
- if ( jQuery.isFunction( fn ) ) {
- deferred[ handler ](function() {
- returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise().then( newDefer.resolve, newDefer.reject );
- } else {
- newDefer[ action ]( returned );
- }
- });
- } else {
- deferred[ handler ]( newDefer[ action ] );
- }
- });
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- if ( obj == null ) {
- if ( promise ) {
- return promise;
- }
- promise = obj = {};
- }
- var i = promiseMethods.length;
- while( i-- ) {
- obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
- }
- return obj;
- }
- });
- // Make sure only one callback list will be used
- deferred.done( failDeferred.cancel ).fail( deferred.cancel );
- // Unexpose cancel
- delete deferred.cancel;
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
- return deferred;
- },
-
- // Deferred helper
- when: function( firstParam ) {
- var args = arguments,
- i = 0,
- length = args.length,
- count = length,
- deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
- firstParam :
- jQuery.Deferred();
- function resolveFunc( i ) {
- return function( value ) {
- args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- if ( !( --count ) ) {
- // Strange bug in FF4:
- // Values changed onto the arguments object sometimes end up as undefined values
- // outside the $.when method. Cloning the object into a fresh array solves the issue
- deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
- }
- };
- }
- if ( length > 1 ) {
- for( ; i < length; i++ ) {
- if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
- args[ i ].promise().then( resolveFunc(i), deferred.reject );
- } else {
- --count;
- }
- }
- if ( !count ) {
- deferred.resolveWith( deferred, args );
- }
- } else if ( deferred !== firstParam ) {
- deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
- }
- return deferred.promise();
- }
-});
-
-
-
-jQuery.support = (function() {
-
- var div = document.createElement( "div" ),
- documentElement = document.documentElement,
- all,
- a,
- select,
- opt,
- input,
- marginDiv,
- support,
- fragment,
- body,
- bodyStyle,
- tds,
- events,
- eventName,
- i,
- isSupported;
-
- // Preliminary tests
- div.setAttribute("className", "t");
- div.innerHTML = "
a";
-
- all = div.getElementsByTagName( "*" );
- a = div.getElementsByTagName( "a" )[ 0 ];
-
- // Can't get basic test support
- if ( !all || !all.length || !a ) {
- return {};
- }
-
- // First batch of supports tests
- select = document.createElement( "select" );
- opt = select.appendChild( document.createElement("option") );
- input = div.getElementsByTagName( "input" )[ 0 ];
-
- support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody: !div.getElementsByTagName( "tbody" ).length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName( "link" ).length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- style: /top/.test( a.getAttribute("style") ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.55$/.test( a.style.opacity ),
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat: !!a.style.cssFloat,
-
- // Make sure that if no value is specified for a checkbox
- // that it defaults to "on".
- // (WebKit defaults to "" instead)
- checkOn: ( input.value === "on" ),
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- optSelected: opt.selected,
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- getSetAttribute: div.className !== "t",
-
- // Will be defined later
- submitBubbles: true,
- changeBubbles: true,
- focusinBubbles: false,
- deleteExpando: true,
- noCloneEvent: true,
- inlineBlockNeedsLayout: false,
- shrinkWrapBlocks: false,
- reliableMarginRight: true
- };
-
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Test to see if it's possible to delete an expando from an element
- // Fails in Internet Explorer
- try {
- delete div.test;
- } catch( e ) {
- support.deleteExpando = false;
- }
-
- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
- div.attachEvent( "onclick", function click() {
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- support.noCloneEvent = false;
- div.detachEvent( "onclick", click );
- });
- div.cloneNode( true ).fireEvent( "onclick" );
- }
-
- // Check if a radio maintains it's value
- // after being appended to the DOM
- input = document.createElement("input");
- input.value = "t";
- input.setAttribute("type", "radio");
- support.radioValue = input.value === "t";
-
- input.setAttribute("checked", "checked");
- div.appendChild( input );
- fragment = document.createDocumentFragment();
- fragment.appendChild( div.firstChild );
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- div.innerHTML = "";
-
- // Figure out if the W3C box model works as expected
- div.style.width = div.style.paddingLeft = "1px";
-
- // We use our own, invisible, body
- body = document.createElement( "body" );
- bodyStyle = {
- visibility: "hidden",
- width: 0,
- height: 0,
- border: 0,
- margin: 0,
- // Set background to avoid IE crashes when removing (#9028)
- background: "none"
- };
- for ( i in bodyStyle ) {
- body.style[ i ] = bodyStyle[ i ];
- }
- body.appendChild( div );
- documentElement.insertBefore( body, documentElement.firstChild );
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
-
- support.boxModel = div.offsetWidth === 2;
-
- if ( "zoom" in div.style ) {
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- // (IE < 8 does this)
- div.style.display = "inline";
- div.style.zoom = 1;
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "";
- div.innerHTML = "";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
- }
-
- div.innerHTML = "
t
";
- tds = div.getElementsByTagName( "td" );
-
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Check if empty table cells still have offsetWidth/Height
- // (IE < 8 fail this test)
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
- div.innerHTML = "";
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. For more
- // info see bug #3333
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- if ( document.defaultView && document.defaultView.getComputedStyle ) {
- marginDiv = document.createElement( "div" );
- marginDiv.style.width = "0";
- marginDiv.style.marginRight = "0";
- div.appendChild( marginDiv );
- support.reliableMarginRight =
- ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
- }
-
- // Remove the body element we added
- body.innerHTML = "";
- documentElement.removeChild( body );
-
- // Technique from Juriy Zaytsev
- // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
- // We only care about the case where non-standard event systems
- // are used, namely in IE. Short-circuiting here helps us to
- // avoid an eval call (in setAttribute) which can cause CSP
- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
- if ( div.attachEvent ) {
- for( i in {
- submit: 1,
- change: 1,
- focusin: 1
- } ) {
- eventName = "on" + i;
- isSupported = ( eventName in div );
- if ( !isSupported ) {
- div.setAttribute( eventName, "return;" );
- isSupported = ( typeof div[ eventName ] === "function" );
- }
- support[ i + "Bubbles" ] = isSupported;
- }
- }
-
- return support;
-})();
-
-// Keep track of boxModel
-jQuery.boxModel = jQuery.support.boxModel;
-
-
-
-
-var rbrace = /^(?:\{.*\}|\[.*\])$/,
- rmultiDash = /([a-z])([A-Z])/g;
-
-jQuery.extend({
- cache: {},
-
- // Please use with caution
- uuid: 0,
-
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
- "applet": true
- },
-
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data: function( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
- return;
- }
-
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- elem[ jQuery.expando ] = id = ++jQuery.uuid;
- } else {
- id = jQuery.expando;
- }
- }
-
- if ( !cache[ id ] ) {
- cache[ id ] = {};
-
- // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
- // metadata on plain JS objects when the object is serialized using
- // JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
- } else {
- cache[ id ] = jQuery.extend(cache[ id ], name);
- }
- }
-
- thisCache = cache[ id ];
-
- // Internal jQuery data is stored in a separate object inside the object's data
- // cache in order to avoid key collisions between internal data and user-defined
- // data
- if ( pvt ) {
- if ( !thisCache[ internalKey ] ) {
- thisCache[ internalKey ] = {};
- }
-
- thisCache = thisCache[ internalKey ];
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
- // not attempt to inspect the internal events object using jQuery.data, as this
- // internal data object is undocumented and subject to change.
- if ( name === "events" && !thisCache[name] ) {
- return thisCache[ internalKey ] && thisCache[ internalKey ].events;
- }
-
- return getByName ? thisCache[ jQuery.camelCase( name ) ] : thisCache;
- },
-
- removeData: function( elem, name, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var internalKey = jQuery.expando, isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
-
- // See jQuery.data for more information
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
- var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
-
- if ( thisCache ) {
- delete thisCache[ name ];
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( !isEmptyDataObject(thisCache) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( pvt ) {
- delete cache[ id ][ internalKey ];
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject(cache[ id ]) ) {
- return;
- }
- }
-
- var internalCache = cache[ id ][ internalKey ];
-
- // Browsers that fail expando deletion also refuse to delete expandos on
- // the window, but it will allow it on all other JS objects; other browsers
- // don't care
- if ( jQuery.support.deleteExpando || cache != window ) {
- delete cache[ id ];
- } else {
- cache[ id ] = null;
- }
-
- // We destroyed the entire user cache at once because it's faster than
- // iterating through each key, but we need to continue to persist internal
- // data if it existed
- if ( internalCache ) {
- cache[ id ] = {};
- // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
- // metadata on plain JS objects when the object is serialized using
- // JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
-
- cache[ id ][ internalKey ] = internalCache;
-
- // Otherwise, we need to eliminate the expando on the node to avoid
- // false lookups in the cache for entries that no longer exist
- } else if ( isNode ) {
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( jQuery.support.deleteExpando ) {
- delete elem[ jQuery.expando ];
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( jQuery.expando );
- } else {
- elem[ jQuery.expando ] = null;
- }
- }
- },
-
- // For internal use only.
- _data: function( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData: function( elem ) {
- if ( elem.nodeName ) {
- var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- if ( match ) {
- return !(match === true || elem.getAttribute("classid") !== match);
- }
- }
-
- return true;
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ) {
- var data = null;
-
- if ( typeof key === "undefined" ) {
- if ( this.length ) {
- data = jQuery.data( this[0] );
-
- if ( this[0].nodeType === 1 ) {
- var attr = this[0].attributes, name;
- for ( var i = 0, l = attr.length; i < l; i++ ) {
- name = attr[i].name;
-
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.substring(5) );
-
- dataAttr( this[0], name, data[ name ] );
- }
- }
- }
- }
-
- return data;
-
- } else if ( typeof key === "object" ) {
- return this.each(function() {
- jQuery.data( this, key );
- });
- }
-
- var parts = key.split(".");
- parts[1] = parts[1] ? "." + parts[1] : "";
-
- if ( value === undefined ) {
- data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
- // Try to fetch any internally stored data first
- if ( data === undefined && this.length ) {
- data = jQuery.data( this[0], key );
- data = dataAttr( this[0], key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
-
- } else {
- return this.each(function() {
- var $this = jQuery( this ),
- args = [ parts[0], value ];
-
- $this.triggerHandler( "setData" + parts[1] + "!", args );
- jQuery.data( this, key, value );
- $this.triggerHandler( "changeData" + parts[1] + "!", args );
- });
- }
- },
-
- removeData: function( key ) {
- return this.each(function() {
- jQuery.removeData( this, key );
- });
- }
-});
-
-function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
- var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- !jQuery.isNaN( data ) ? parseFloat( data ) :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
-// property to be considered empty objects; this property always exists in
-// order to make sure JSON.stringify does not expose internal metadata
-function isEmptyDataObject( obj ) {
- for ( var name in obj ) {
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
-
-
-
-
-function handleQueueMarkDefer( elem, type, src ) {
- var deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- defer = jQuery.data( elem, deferDataKey, undefined, true );
- if ( defer &&
- ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
- ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
- // Give room for hard-coded callbacks to fire first
- // and eventually mark/queue something else on the element
- setTimeout( function() {
- if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
- !jQuery.data( elem, markDataKey, undefined, true ) ) {
- jQuery.removeData( elem, deferDataKey, true );
- defer.resolve();
- }
- }, 0 );
- }
-}
-
-jQuery.extend({
-
- _mark: function( elem, type ) {
- if ( elem ) {
- type = (type || "fx") + "mark";
- jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
- }
- },
-
- _unmark: function( force, elem, type ) {
- if ( force !== true ) {
- type = elem;
- elem = force;
- force = false;
- }
- if ( elem ) {
- type = type || "fx";
- var key = type + "mark",
- count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
- if ( count ) {
- jQuery.data( elem, key, count, true );
- } else {
- jQuery.removeData( elem, key, true );
- handleQueueMarkDefer( elem, type, "mark" );
- }
- }
- },
-
- queue: function( elem, type, data ) {
- if ( elem ) {
- type = (type || "fx") + "queue";
- var q = jQuery.data( elem, type, undefined, true );
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !q || jQuery.isArray(data) ) {
- q = jQuery.data( elem, type, jQuery.makeArray(data), true );
- } else {
- q.push( data );
- }
- }
- return q || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- fn = queue.shift(),
- defer;
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- }
-
- if ( fn ) {
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift("inprogress");
- }
-
- fn.call(elem, function() {
- jQuery.dequeue(elem, type);
- });
- }
-
- if ( !queue.length ) {
- jQuery.removeData( elem, type + "queue", true );
- handleQueueMarkDefer( elem, type, "queue" );
- }
- }
-});
-
-jQuery.fn.extend({
- queue: function( type, data ) {
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- }
-
- if ( data === undefined ) {
- return jQuery.queue( this[0], type );
- }
- return this.each(function() {
- var queue = jQuery.queue( this, type, data );
-
- if ( type === "fx" && queue[0] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- dequeue: function( type ) {
- return this.each(function() {
- jQuery.dequeue( this, type );
- });
- },
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
- type = type || "fx";
-
- return this.queue( type, function() {
- var elem = this;
- setTimeout(function() {
- jQuery.dequeue( elem, type );
- }, time );
- });
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, object ) {
- if ( typeof type !== "string" ) {
- object = type;
- type = undefined;
- }
- type = type || "fx";
- var defer = jQuery.Deferred(),
- elements = this,
- i = elements.length,
- count = 1,
- deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- tmp;
- function resolve() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- }
- while( i-- ) {
- if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
- ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
- jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
- jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
- count++;
- tmp.done( resolve );
- }
- }
- resolve();
- return defer.promise();
- }
-});
-
-
-
-
-var rclass = /[\n\t\r]/g,
- rspace = /\s+/,
- rreturn = /\r/g,
- rtype = /^(?:button|input)$/i,
- rfocusable = /^(?:button|input|object|select|textarea)$/i,
- rclickable = /^a(?:rea)?$/i,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- rinvalidChar = /\:/,
- formHook, boolHook;
-
-jQuery.fn.extend({
- attr: function( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.attr );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.prop );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each(function() {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch( e ) {}
- });
- },
-
- addClass: function( value ) {
- if ( jQuery.isFunction( value ) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- self.addClass( value.call(this, i, self.attr("class") || "") );
- });
- }
-
- if ( value && typeof value === "string" ) {
- var classNames = (value || "").split( rspace );
-
- for ( var i = 0, l = this.length; i < l; i++ ) {
- var elem = this[i];
-
- if ( elem.nodeType === 1 ) {
- if ( !elem.className ) {
- elem.className = value;
-
- } else {
- var className = " " + elem.className + " ",
- setClass = elem.className;
-
- for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
- setClass += " " + classNames[c];
- }
- }
- elem.className = jQuery.trim( setClass );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- if ( jQuery.isFunction(value) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- self.removeClass( value.call(this, i, self.attr("class")) );
- });
- }
-
- if ( (value && typeof value === "string") || value === undefined ) {
- var classNames = (value || "").split( rspace );
-
- for ( var i = 0, l = this.length; i < l; i++ ) {
- var elem = this[i];
-
- if ( elem.nodeType === 1 && elem.className ) {
- if ( value ) {
- var className = (" " + elem.className + " ").replace(rclass, " ");
- for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
- className = className.replace(" " + classNames[c] + " ", " ");
- }
- elem.className = jQuery.trim( className );
-
- } else {
- elem.className = "";
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
- });
- }
-
- return this.each(function() {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- state = stateVal,
- classNames = value.split( rspace );
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space seperated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
- }
-
- } else if ( type === "undefined" || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // toggle whole className
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
-
- hasClass: function( selector ) {
- var className = " " + selector + " ";
- for ( var i = 0, l = this.length; i < l; i++ ) {
- if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val: function( value ) {
- var hooks, ret,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- return (elem.value || "").replace(rreturn, "");
- }
-
- return undefined;
- }
-
- var isFunction = jQuery.isFunction( value );
-
- return this.each(function( i ) {
- var self = jQuery(this), val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, self.val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map(val, function ( value ) {
- return value == null ? "" : value + "";
- });
- }
-
- hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- });
- }
-});
-
-jQuery.extend({
- valHooks: {
- option: {
- get: function( elem ) {
- // attributes.value is undefined in Blackberry 4.7 but
- // uses .value. See #6932
- var val = elem.attributes.value;
- return !val || val.specified ? elem.value : elem.text;
- }
- },
- select: {
- get: function( elem ) {
- var value,
- index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type === "select-one";
-
- // Nothing was selected
- if ( index < 0 ) {
- return null;
- }
-
- // Loop through all the selected options
- for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
- var option = options[ i ];
-
- // Don't return options that are disabled or in a disabled optgroup
- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var values = jQuery.makeArray( value );
-
- jQuery(elem).find("option").each(function() {
- this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
- });
-
- if ( !values.length ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- attrFn: {
- val: true,
- css: true,
- html: true,
- text: true,
- data: true,
- width: true,
- height: true,
- offset: true
- },
-
- attrFix: {
- // Always normalize to ensure hook usage
- tabindex: "tabIndex"
- },
-
- attr: function( elem, name, value, pass ) {
- var nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
- }
-
- if ( pass && name in jQuery.attrFn ) {
- return jQuery( elem )[ name ]( value );
- }
-
- // Fallback to prop when attributes are not supported
- if ( !("getAttribute" in elem) ) {
- return jQuery.prop( elem, name, value );
- }
-
- var ret, hooks,
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- // Normalize the name if needed
- name = notxml && jQuery.attrFix[ name ] || name;
-
- hooks = jQuery.attrHooks[ name ];
-
- if ( !hooks ) {
- // Use boolHook for boolean attributes
- if ( rboolean.test( name ) &&
- (typeof value === "boolean" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) {
-
- hooks = boolHook;
-
- // Use formHook for forms and if the name contains certain characters
- } else if ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) {
- hooks = formHook;
- }
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return undefined;
-
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, "" + value );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && notxml ) {
- return hooks.get( elem, name );
-
- } else {
-
- ret = elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret === null ?
- undefined :
- ret;
- }
- },
-
- removeAttr: function( elem, name ) {
- var propName;
- if ( elem.nodeType === 1 ) {
- name = jQuery.attrFix[ name ] || name;
-
- if ( jQuery.support.getSetAttribute ) {
- // Use removeAttribute in browsers that support it
- elem.removeAttribute( name );
- } else {
- jQuery.attr( elem, name, "" );
- elem.removeAttributeNode( elem.getAttributeNode( name ) );
- }
-
- // Set corresponding property to false for boolean attributes
- if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
- elem[ propName ] = false;
- }
- }
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
- jQuery.error( "type property can't be changed" );
- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to it's default in case type is set after value
- // This is for element creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- },
- tabIndex: {
- get: function( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- var attributeNode = elem.getAttributeNode("tabIndex");
-
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- undefined;
- }
- }
- },
-
- propFix: {
- tabindex: "tabIndex",
- readonly: "readOnly",
- "for": "htmlFor",
- "class": "className",
- maxlength: "maxLength",
- cellspacing: "cellSpacing",
- cellpadding: "cellPadding",
- rowspan: "rowSpan",
- colspan: "colSpan",
- usemap: "useMap",
- frameborder: "frameBorder",
- contenteditable: "contentEditable"
- },
-
- prop: function( elem, name, value ) {
- var nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
- }
-
- var ret, hooks,
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- // Try to normalize/fix the name
- name = notxml && jQuery.propFix[ name ] || name;
-
- hooks = jQuery.propHooks[ name ];
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- return (elem[ name ] = value);
- }
-
- } else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {
- return ret;
-
- } else {
- return elem[ name ];
- }
- }
- },
-
- propHooks: {}
-});
-
-// Hook for boolean attributes
-boolHook = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- return elem[ jQuery.propFix[ name ] || name ] ?
- name.toLowerCase() :
- undefined;
- },
- set: function( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = value;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
-};
-
-// Use the value property for back compat
-// Use the formHook for button elements in IE6/7 (#1954)
-jQuery.attrHooks.value = {
- get: function( elem, name ) {
- if ( formHook && jQuery.nodeName( elem, "button" ) ) {
- return formHook.get( elem, name );
- }
- return elem.value;
- },
- set: function( elem, value, name ) {
- if ( formHook && jQuery.nodeName( elem, "button" ) ) {
- return formHook.set( elem, value, name );
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !jQuery.support.getSetAttribute ) {
-
- // propFix is more comprehensive and contains all fixes
- jQuery.attrFix = jQuery.propFix;
-
- // Use this for any attribute on a form in IE6/7
- formHook = jQuery.attrHooks.name = jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret;
- ret = elem.getAttributeNode( name );
- // Return undefined if nodeValue is empty string
- return ret && ret.nodeValue !== "" ?
- ret.nodeValue :
- undefined;
- },
- set: function( elem, value, name ) {
- // Check form objects in IE (multiple bugs related)
- // Only use nodeValue if the attribute node exists on the form
- var ret = elem.getAttributeNode( name );
- if ( ret ) {
- ret.nodeValue = value;
- return value;
- }
- }
- };
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- });
- });
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
- jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- get: function( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
- }
- });
- });
-}
-
-if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
- // Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
- },
- set: function( elem, value ) {
- return (elem.style.cssText = "" + value);
- }
- };
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
- get: function( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- }
- });
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
- jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- get: function( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- }
- };
- });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
- }
- }
- });
-});
-
-
-
-
-var hasOwn = Object.prototype.hasOwnProperty,
- rnamespaces = /\.(.*)$/,
- rformElems = /^(?:textarea|input|select)$/i,
- rperiod = /\./g,
- rspaces = / /g,
- rescape = /[^\w\s.|`]/g,
- fcleanup = function( nm ) {
- return nm.replace(rescape, "\\$&");
- };
-
-/*
- * A number of helper functions used for managing events.
- * Many of the ideas behind this code originated from
- * Dean Edwards' addEvent library.
- */
-jQuery.event = {
-
- // Bind an event to an element
- // Original by Dean Edwards
- add: function( elem, types, handler, data ) {
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- if ( handler === false ) {
- handler = returnFalse;
- } else if ( !handler ) {
- // Fixes bug #7229. Fix recommended by jdalton
- return;
- }
-
- var handleObjIn, handleObj;
-
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- }
-
- // Make sure that the function being executed has a unique ID
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure
- var elemData = jQuery._data( elem );
-
- // If no elemData is found then we must be trying to bind to one of the
- // banned noData elements
- if ( !elemData ) {
- return;
- }
-
- var events = elemData.events,
- eventHandle = elemData.handle;
-
- if ( !events ) {
- elemData.events = events = {};
- }
-
- if ( !eventHandle ) {
- elemData.handle = eventHandle = function( e ) {
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.handle.apply( eventHandle.elem, arguments ) :
- undefined;
- };
- }
-
- // Add elem as a property of the handle function
- // This is to prevent a memory leak with non-native events in IE.
- eventHandle.elem = elem;
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- types = types.split(" ");
-
- var type, i = 0, namespaces;
-
- while ( (type = types[ i++ ]) ) {
- handleObj = handleObjIn ?
- jQuery.extend({}, handleObjIn) :
- { handler: handler, data: data };
-
- // Namespaced event handlers
- if ( type.indexOf(".") > -1 ) {
- namespaces = type.split(".");
- type = namespaces.shift();
- handleObj.namespace = namespaces.slice(0).sort().join(".");
-
- } else {
- namespaces = [];
- handleObj.namespace = "";
- }
-
- handleObj.type = type;
- if ( !handleObj.guid ) {
- handleObj.guid = handler.guid;
- }
-
- // Get the current list of functions bound to this event
- var handlers = events[ type ],
- special = jQuery.event.special[ type ] || {};
-
- // Init the event handler queue
- if ( !handlers ) {
- handlers = events[ type ] = [];
-
- // Check for a special event handler
- // Only use addEventListener/attachEvent if the special
- // events handler returns false
- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add the function to the element's handler list
- handlers.push( handleObj );
-
- // Keep track of which events have been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- global: {},
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, pos ) {
- // don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- if ( handler === false ) {
- handler = returnFalse;
- }
-
- var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
- elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
- events = elemData && elemData.events;
-
- if ( !elemData || !events ) {
- return;
- }
-
- // types is actually an event object here
- if ( types && types.type ) {
- handler = types.handler;
- types = types.type;
- }
-
- // Unbind all events for the element
- if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
- types = types || "";
-
- for ( type in events ) {
- jQuery.event.remove( elem, type + types );
- }
-
- return;
- }
-
- // Handle multiple events separated by a space
- // jQuery(...).unbind("mouseover mouseout", fn);
- types = types.split(" ");
-
- while ( (type = types[ i++ ]) ) {
- origType = type;
- handleObj = null;
- all = type.indexOf(".") < 0;
- namespaces = [];
-
- if ( !all ) {
- // Namespaced event handlers
- namespaces = type.split(".");
- type = namespaces.shift();
-
- namespace = new RegExp("(^|\\.)" +
- jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
- }
-
- eventType = events[ type ];
-
- if ( !eventType ) {
- continue;
- }
-
- if ( !handler ) {
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( all || namespace.test( handleObj.namespace ) ) {
- jQuery.event.remove( elem, origType, handleObj.handler, j );
- eventType.splice( j--, 1 );
- }
- }
-
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
-
- for ( j = pos || 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( handler.guid === handleObj.guid ) {
- // remove the given handler for the given type
- if ( all || namespace.test( handleObj.namespace ) ) {
- if ( pos == null ) {
- eventType.splice( j--, 1 );
- }
-
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
-
- if ( pos != null ) {
- break;
- }
- }
- }
-
- // remove generic event handler if no more handlers exist
- if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
- if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- ret = null;
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- var handle = elemData.handle;
- if ( handle ) {
- handle.elem = null;
- }
-
- delete elemData.events;
- delete elemData.handle;
-
- if ( jQuery.isEmptyObject( elemData ) ) {
- jQuery.removeData( elem, undefined, true );
- }
- }
- },
-
- // Events that are safe to short-circuit if no handlers are attached.
- // Native DOM events should not be added, they may have inline handlers.
- customEvent: {
- "getData": true,
- "setData": true,
- "changeData": true
- },
-
- trigger: function( event, data, elem, onlyHandlers ) {
- // Event object or event type
- var type = event.type || event,
- namespaces = [],
- exclusive;
-
- if ( type.indexOf("!") >= 0 ) {
- // Exclusive events trigger only for the exact event (no namespaces)
- type = type.slice(0, -1);
- exclusive = true;
- }
-
- if ( type.indexOf(".") >= 0 ) {
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split(".");
- type = namespaces.shift();
- namespaces.sort();
- }
-
- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
- // No jQuery handlers for this event type, and it can't have inline handlers
- return;
- }
-
- // Caller can pass in an Event, Object, or just an event type string
- event = typeof event === "object" ?
- // jQuery.Event object
- event[ jQuery.expando ] ? event :
- // Object literal
- new jQuery.Event( type, event ) :
- // Just the event type (string)
- new jQuery.Event( type );
-
- event.type = type;
- event.exclusive = exclusive;
- event.namespace = namespaces.join(".");
- event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
-
- // triggerHandler() and global events don't bubble or run the default action
- if ( onlyHandlers || !elem ) {
- event.preventDefault();
- event.stopPropagation();
- }
-
- // Handle a global trigger
- if ( !elem ) {
- // TODO: Stop taunting the data cache; remove global events and always attach to document
- jQuery.each( jQuery.cache, function() {
- // internalKey variable is just used to make it easier to find
- // and potentially change this stuff later; currently it just
- // points to jQuery.expando
- var internalKey = jQuery.expando,
- internalCache = this[ internalKey ];
- if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
- jQuery.event.trigger( event, data, internalCache.handle.elem );
- }
- });
- return;
- }
-
- // Don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- event.target = elem;
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data ? jQuery.makeArray( data ) : [];
- data.unshift( event );
-
- var cur = elem,
- // IE doesn't like method names with a colon (#3533, #8272)
- ontype = type.indexOf(":") < 0 ? "on" + type : "";
-
- // Fire event on the current element, then bubble up the DOM tree
- do {
- var handle = jQuery._data( cur, "handle" );
-
- event.currentTarget = cur;
- if ( handle ) {
- handle.apply( cur, data );
- }
-
- // Trigger an inline bound script
- if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
- event.result = false;
- event.preventDefault();
- }
-
- // Bubble up to document, then to window
- cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
- } while ( cur && !event.isPropagationStopped() );
-
- // If nobody prevented the default action, do it now
- if ( !event.isDefaultPrevented() ) {
- var old,
- special = jQuery.event.special[ type ] || {};
-
- if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction)() check here because IE6/7 fails that test.
- // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
- try {
- if ( ontype && elem[ type ] ) {
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
-
- if ( old ) {
- elem[ ontype ] = null;
- }
-
- jQuery.event.triggered = type;
- elem[ type ]();
- }
- } catch ( ieError ) {}
-
- if ( old ) {
- elem[ ontype ] = old;
- }
-
- jQuery.event.triggered = undefined;
- }
- }
-
- return event.result;
- },
-
- handle: function( event ) {
- event = jQuery.event.fix( event || window.event );
- // Snapshot the handlers list since a called handler may add/remove events.
- var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
- run_all = !event.exclusive && !event.namespace,
- args = Array.prototype.slice.call( arguments, 0 );
-
- // Use the fix-ed Event rather than the (read-only) native event
- args[0] = event;
- event.currentTarget = this;
-
- for ( var j = 0, l = handlers.length; j < l; j++ ) {
- var handleObj = handlers[ j ];
-
- // Triggered event must 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event.
- if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
- // Pass in a reference to the handler function itself
- // So that we can later remove it
- event.handler = handleObj.handler;
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- var ret = handleObj.handler.apply( this, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
-
- if ( event.isImmediatePropagationStopped() ) {
- break;
- }
- }
- }
- return event.result;
- },
-
- props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // store a copy of the original event object
- // and "clone" to set read-only properties
- var originalEvent = event;
- event = jQuery.Event( originalEvent );
-
- for ( var i = this.props.length, prop; i; ) {
- prop = this.props[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary
- if ( !event.target ) {
- // Fixes #1925 where srcElement might not be defined either
- event.target = event.srcElement || document;
- }
-
- // check if target is a textnode (safari)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && event.fromElement ) {
- event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
- }
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && event.clientX != null ) {
- var eventDocument = event.target.ownerDocument || document,
- doc = eventDocument.documentElement,
- body = eventDocument.body;
-
- event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
- event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
- }
-
- // Add which for key events
- if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
- event.which = event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
- if ( !event.metaKey && event.ctrlKey ) {
- event.metaKey = event.ctrlKey;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && event.button !== undefined ) {
- event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
- }
-
- return event;
- },
-
- // Deprecated, use jQuery.guid instead
- guid: 1E8,
-
- // Deprecated, use jQuery.proxy instead
- proxy: jQuery.proxy,
-
- special: {
- ready: {
- // Make sure the ready event is setup
- setup: jQuery.bindReady,
- teardown: jQuery.noop
- },
-
- live: {
- add: function( handleObj ) {
- jQuery.event.add( this,
- liveConvert( handleObj.origType, handleObj.selector ),
- jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
- },
-
- remove: function( handleObj ) {
- jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
- }
- },
-
- beforeunload: {
- setup: function( data, namespaces, eventHandle ) {
- // We only want to do this special case on windows
- if ( jQuery.isWindow( this ) ) {
- this.onbeforeunload = eventHandle;
- }
- },
-
- teardown: function( namespaces, eventHandle ) {
- if ( this.onbeforeunload === eventHandle ) {
- this.onbeforeunload = null;
- }
- }
- }
- }
-};
-
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function( elem, type, handle ) {
- if ( elem.detachEvent ) {
- elem.detachEvent( "on" + type, handle );
- }
- };
-
-jQuery.Event = function( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !this.preventDefault ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // timeStamp is buggy for some events on Firefox(#3843)
- // So we won't rely on the native value
- this.timeStamp = jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
- return false;
-}
-function returnTrue() {
- return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- preventDefault: function() {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
-
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // otherwise set the returnValue property of the original event to false (IE)
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation: function() {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
- // if stopPropagation exists run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation: function() {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse
-};
-
-// Checks if an event happened on an element within another element
-// Used in jQuery.event.special.mouseenter and mouseleave handlers
-var withinElement = function( event ) {
- // Check if mouse(over|out) are still within the same parent element
- var parent = event.relatedTarget;
-
- // set the correct event type
- event.type = event.data;
-
- // Firefox sometimes assigns relatedTarget a XUL element
- // which we cannot access the parentNode property of
- try {
-
- // Chrome does something similar, the parentNode property
- // can be accessed but is null.
- if ( parent && parent !== document && !parent.parentNode ) {
- return;
- }
-
- // Traverse up the tree
- while ( parent && parent !== this ) {
- parent = parent.parentNode;
- }
-
- if ( parent !== this ) {
- // handle event if we actually just moused on to a non sub-element
- jQuery.event.handle.apply( this, arguments );
- }
-
- // assuming we've left the element since we most likely mousedover a xul element
- } catch(e) { }
-},
-
-// In case of event delegation, we only need to rename the event.type,
-// liveHandler will take care of the rest.
-delegate = function( event ) {
- event.type = event.data;
- jQuery.event.handle.apply( this, arguments );
-};
-
-// Create mouseenter and mouseleave events
-jQuery.each({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- setup: function( data ) {
- jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
- },
- teardown: function( data ) {
- jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
- }
- };
-});
-
-// submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup: function( data, namespaces ) {
- if ( !jQuery.nodeName( this, "form" ) ) {
- jQuery.event.add(this, "click.specialSubmit", function( e ) {
- var elem = e.target,
- type = elem.type;
-
- if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
- trigger( "submit", this, arguments );
- }
- });
-
- jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
- var elem = e.target,
- type = elem.type;
-
- if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
- trigger( "submit", this, arguments );
- }
- });
-
- } else {
- return false;
- }
- },
-
- teardown: function( namespaces ) {
- jQuery.event.remove( this, ".specialSubmit" );
- }
- };
-
-}
-
-// change delegation, happens here so we have bind.
-if ( !jQuery.support.changeBubbles ) {
-
- var changeFilters,
-
- getVal = function( elem ) {
- var type = elem.type, val = elem.value;
-
- if ( type === "radio" || type === "checkbox" ) {
- val = elem.checked;
-
- } else if ( type === "select-multiple" ) {
- val = elem.selectedIndex > -1 ?
- jQuery.map( elem.options, function( elem ) {
- return elem.selected;
- }).join("-") :
- "";
-
- } else if ( jQuery.nodeName( elem, "select" ) ) {
- val = elem.selectedIndex;
- }
-
- return val;
- },
-
- testChange = function testChange( e ) {
- var elem = e.target, data, val;
-
- if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
- return;
- }
-
- data = jQuery._data( elem, "_change_data" );
- val = getVal(elem);
-
- // the current data will be also retrieved by beforeactivate
- if ( e.type !== "focusout" || elem.type !== "radio" ) {
- jQuery._data( elem, "_change_data", val );
- }
-
- if ( data === undefined || val === data ) {
- return;
- }
-
- if ( data != null || val ) {
- e.type = "change";
- e.liveFired = undefined;
- jQuery.event.trigger( e, arguments[1], elem );
- }
- };
-
- jQuery.event.special.change = {
- filters: {
- focusout: testChange,
-
- beforedeactivate: testChange,
-
- click: function( e ) {
- var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
-
- if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
- testChange.call( this, e );
- }
- },
-
- // Change has to be called before submit
- // Keydown will be called before keypress, which is used in submit-event delegation
- keydown: function( e ) {
- var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
-
- if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
- (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
- type === "select-multiple" ) {
- testChange.call( this, e );
- }
- },
-
- // Beforeactivate happens also before the previous element is blurred
- // with this event you can't trigger a change event, but you can store
- // information
- beforeactivate: function( e ) {
- var elem = e.target;
- jQuery._data( elem, "_change_data", getVal(elem) );
- }
- },
-
- setup: function( data, namespaces ) {
- if ( this.type === "file" ) {
- return false;
- }
-
- for ( var type in changeFilters ) {
- jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
- }
-
- return rformElems.test( this.nodeName );
- },
-
- teardown: function( namespaces ) {
- jQuery.event.remove( this, ".specialChange" );
-
- return rformElems.test( this.nodeName );
- }
- };
-
- changeFilters = jQuery.event.special.change.filters;
-
- // Handle when the input is .focus()'d
- changeFilters.focus = changeFilters.beforeactivate;
-}
-
-function trigger( type, elem, args ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- // Don't pass args or remember liveFired; they apply to the donor event.
- var event = jQuery.extend( {}, args[ 0 ] );
- event.type = type;
- event.originalEvent = {};
- event.liveFired = undefined;
- jQuery.event.handle.call( elem, event );
- if ( event.isDefaultPrevented() ) {
- args[ 0 ].preventDefault();
- }
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
- jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0;
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
- }
- },
- teardown: function() {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
- }
- }
- };
-
- function handler( donor ) {
- // Donor event is always a native one; fix it and switch its type.
- // Let focusin/out handler cancel the donor focus/blur event.
- var e = jQuery.event.fix( donor );
- e.type = fix;
- e.originalEvent = {};
- jQuery.event.trigger( e, null, e.target );
- if ( e.isDefaultPrevented() ) {
- donor.preventDefault();
- }
- }
- });
-}
-
-jQuery.each(["bind", "one"], function( i, name ) {
- jQuery.fn[ name ] = function( type, data, fn ) {
- var handler;
-
- // Handle object literals
- if ( typeof type === "object" ) {
- for ( var key in type ) {
- this[ name ](key, data, type[key], fn);
- }
- return this;
- }
-
- if ( arguments.length === 2 || data === false ) {
- fn = data;
- data = undefined;
- }
-
- if ( name === "one" ) {
- handler = function( event ) {
- jQuery( this ).unbind( event, handler );
- return fn.apply( this, arguments );
- };
- handler.guid = fn.guid || jQuery.guid++;
- } else {
- handler = fn;
- }
-
- if ( type === "unload" && name !== "one" ) {
- this.one( type, data, fn );
-
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- jQuery.event.add( this[i], type, handler, data );
- }
- }
-
- return this;
- };
-});
-
-jQuery.fn.extend({
- unbind: function( type, fn ) {
- // Handle object literals
- if ( typeof type === "object" && !type.preventDefault ) {
- for ( var key in type ) {
- this.unbind(key, type[key]);
- }
-
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- jQuery.event.remove( this[i], type, fn );
- }
- }
-
- return this;
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.live( types, data, fn, selector );
- },
-
- undelegate: function( selector, types, fn ) {
- if ( arguments.length === 0 ) {
- return this.unbind( "live" );
-
- } else {
- return this.die( types, null, fn, selector );
- }
- },
-
- trigger: function( type, data ) {
- return this.each(function() {
- jQuery.event.trigger( type, data, this );
- });
- },
-
- triggerHandler: function( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-});
-
-var liveMap = {
- focus: "focusin",
- blur: "focusout",
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-};
-
-jQuery.each(["live", "die"], function( i, name ) {
- jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
- var type, i = 0, match, namespaces, preType,
- selector = origSelector || this.selector,
- context = origSelector ? this : jQuery( this.context );
-
- if ( typeof types === "object" && !types.preventDefault ) {
- for ( var key in types ) {
- context[ name ]( key, data, types[key], selector );
- }
-
- return this;
- }
-
- if ( name === "die" && !types &&
- origSelector && origSelector.charAt(0) === "." ) {
-
- context.unbind( origSelector );
-
- return this;
- }
-
- if ( data === false || jQuery.isFunction( data ) ) {
- fn = data || returnFalse;
- data = undefined;
- }
-
- types = (types || "").split(" ");
-
- while ( (type = types[ i++ ]) != null ) {
- match = rnamespaces.exec( type );
- namespaces = "";
-
- if ( match ) {
- namespaces = match[0];
- type = type.replace( rnamespaces, "" );
- }
-
- if ( type === "hover" ) {
- types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
- continue;
- }
-
- preType = type;
-
- if ( liveMap[ type ] ) {
- types.push( liveMap[ type ] + namespaces );
- type = type + namespaces;
-
- } else {
- type = (liveMap[ type ] || type) + namespaces;
- }
-
- if ( name === "live" ) {
- // bind live handler
- for ( var j = 0, l = context.length; j < l; j++ ) {
- jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
- { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
- }
-
- } else {
- // unbind live handler
- context.unbind( "live." + liveConvert( type, selector ), fn );
- }
- }
-
- return this;
- };
-});
-
-function liveHandler( event ) {
- var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
- elems = [],
- selectors = [],
- events = jQuery._data( this, "events" );
-
- // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
- if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
- return;
- }
-
- if ( event.namespace ) {
- namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
- }
-
- event.liveFired = this;
-
- var live = events.live.slice(0);
-
- for ( j = 0; j < live.length; j++ ) {
- handleObj = live[j];
-
- if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
- selectors.push( handleObj.selector );
-
- } else {
- live.splice( j--, 1 );
- }
- }
-
- match = jQuery( event.target ).closest( selectors, event.currentTarget );
-
- for ( i = 0, l = match.length; i < l; i++ ) {
- close = match[i];
-
- for ( j = 0; j < live.length; j++ ) {
- handleObj = live[j];
-
- if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
- elem = close.elem;
- related = null;
-
- // Those two events require additional checking
- if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
- event.type = handleObj.preType;
- related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
-
- // Make sure not to accidentally match a child element with the same selector
- if ( related && jQuery.contains( elem, related ) ) {
- related = elem;
- }
- }
-
- if ( !related || related !== elem ) {
- elems.push({ elem: elem, handleObj: handleObj, level: close.level });
- }
- }
- }
- }
-
- for ( i = 0, l = elems.length; i < l; i++ ) {
- match = elems[i];
-
- if ( maxLevel && match.level > maxLevel ) {
- break;
- }
-
- event.currentTarget = match.elem;
- event.data = match.handleObj.data;
- event.handleObj = match.handleObj;
-
- ret = match.handleObj.origHandler.apply( match.elem, arguments );
-
- if ( ret === false || event.isPropagationStopped() ) {
- maxLevel = match.level;
-
- if ( ret === false ) {
- stop = false;
- }
- if ( event.isImmediatePropagationStopped() ) {
- break;
- }
- }
- }
-
- return stop;
-}
-
-function liveConvert( type, selector ) {
- return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
-}
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
- }
-
- return arguments.length > 0 ?
- this.bind( name, data, fn ) :
- this.trigger( name );
- };
-
- if ( jQuery.attrFn ) {
- jQuery.attrFn[ name ] = true;
- }
-});
-
-
-
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
- done = 0,
- toString = Object.prototype.toString,
- hasDuplicate = false,
- baseHasDuplicate = true,
- rBackslash = /\\/g,
- rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-// Thus far that includes Google Chrome.
-[0, 0].sort(function() {
- baseHasDuplicate = false;
- return 0;
-});
-
-var Sizzle = function( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
-
- var origContext = context;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
- return [];
- }
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var m, set, checkSet, extra, ret, cur, pop, i,
- prune = true,
- contextXML = Sizzle.isXML( context ),
- parts = [],
- soFar = selector;
-
- // Reset the position of the chunker regexp (start from head)
- do {
- chunker.exec( "" );
- m = chunker.exec( soFar );
-
- if ( m ) {
- soFar = m[3];
-
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = m[3];
- break;
- }
- }
- } while ( m );
-
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context );
-
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- selector = parts.shift();
-
- if ( Expr.relative[ selector ] ) {
- selector += parts.shift();
- }
-
- set = posProcess( selector, set );
- }
- }
-
- } else {
- // Take a shortcut and set the context if the root selector is an ID
- // (but not if it'll be faster if the inner selector is an ID)
- if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
- Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
- ret = Sizzle.find( parts.shift(), context, contextXML );
- context = ret.expr ?
- Sizzle.filter( ret.expr, ret.set )[0] :
- ret.set[0];
- }
-
- if ( context ) {
- ret = seed ?
- { expr: parts.pop(), set: makeArray(seed) } :
- Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
- set = ret.expr ?
- Sizzle.filter( ret.expr, ret.set ) :
- ret.set;
-
- if ( parts.length > 0 ) {
- checkSet = makeArray( set );
-
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- cur = parts.pop();
- pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop, contextXML );
- }
-
- } else {
- checkSet = parts = [];
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- Sizzle.error( cur || selector );
- }
-
- if ( toString.call(checkSet) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
-
- } else if ( context && context.nodeType === 1 ) {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
- results.push( set[i] );
- }
- }
-
- } else {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
-
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, origContext, results, seed );
- Sizzle.uniqueSort( results );
- }
-
- return results;
-};
-
-Sizzle.uniqueSort = function( results ) {
- if ( sortOrder ) {
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( var i = 1; i < results.length; i++ ) {
- if ( results[i] === results[ i - 1 ] ) {
- results.splice( i--, 1 );
- }
- }
- }
- }
-
- return results;
-};
-
-Sizzle.matches = function( expr, set ) {
- return Sizzle( expr, null, null, set );
-};
-
-Sizzle.matchesSelector = function( node, expr ) {
- return Sizzle( expr, null, null, [node] ).length > 0;
-};
-
-Sizzle.find = function( expr, context, isXML ) {
- var set;
-
- if ( !expr ) {
- return [];
- }
-
- for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
- var match,
- type = Expr.order[i];
-
- if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- var left = match[1];
- match.splice( 1, 1 );
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace( rBackslash, "" );
- set = Expr.find[ type ]( match, context, isXML );
-
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( "*" ) :
- [];
- }
-
- return { set: set, expr: expr };
-};
-
-Sizzle.filter = function( expr, set, inplace, not ) {
- var match, anyFound,
- old = expr,
- result = [],
- curLoop = set,
- isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
- while ( expr && set.length ) {
- for ( var type in Expr.filter ) {
- if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
- var found, item,
- filter = Expr.filter[ type ],
- left = match[1];
-
- anyFound = false;
-
- match.splice(1,1);
-
- if ( left.substr( left.length - 1 ) === "\\" ) {
- continue;
- }
-
- if ( curLoop === result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
- if ( !match ) {
- anyFound = found = true;
-
- } else if ( match === true ) {
- continue;
- }
- }
-
- if ( match ) {
- for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- var pass = not ^ !!found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
-
- } else {
- curLoop[i] = false;
- }
-
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- // Improper expression
- if ( expr === old ) {
- if ( anyFound == null ) {
- Sizzle.error( expr );
-
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
-};
-
-Sizzle.error = function( msg ) {
- throw "Syntax error, unrecognized expression: " + msg;
-};
-
-var Expr = Sizzle.selectors = {
- order: [ "ID", "NAME", "TAG" ],
-
- match: {
- ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
- ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
- TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
- CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
- POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
- PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
- },
-
- leftMatch: {},
-
- attrMap: {
- "class": "className",
- "for": "htmlFor"
- },
-
- attrHandle: {
- href: function( elem ) {
- return elem.getAttribute( "href" );
- },
- type: function( elem ) {
- return elem.getAttribute( "type" );
- }
- },
-
- relative: {
- "+": function(checkSet, part){
- var isPartStr = typeof part === "string",
- isTag = isPartStr && !rNonWord.test( part ),
- isPartStrNotTag = isPartStr && !isTag;
-
- if ( isTag ) {
- part = part.toLowerCase();
- }
-
- for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
- if ( (elem = checkSet[i]) ) {
- while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
- checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
- elem || false :
- elem === part;
- }
- }
-
- if ( isPartStrNotTag ) {
- Sizzle.filter( part, checkSet, true );
- }
- },
-
- ">": function( checkSet, part ) {
- var elem,
- isPartStr = typeof part === "string",
- i = 0,
- l = checkSet.length;
-
- if ( isPartStr && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
-
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- var parent = elem.parentNode;
- checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
- }
- }
-
- } else {
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- checkSet[i] = isPartStr ?
- elem.parentNode :
- elem.parentNode === part;
- }
- }
-
- if ( isPartStr ) {
- Sizzle.filter( part, checkSet, true );
- }
- }
- },
-
- "": function(checkSet, part, isXML){
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
- },
-
- "~": function( checkSet, part, isXML ) {
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
- }
- },
-
- find: {
- ID: function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- },
-
- NAME: function( match, context ) {
- if ( typeof context.getElementsByName !== "undefined" ) {
- var ret = [],
- results = context.getElementsByName( match[1] );
-
- for ( var i = 0, l = results.length; i < l; i++ ) {
- if ( results[i].getAttribute("name") === match[1] ) {
- ret.push( results[i] );
- }
- }
-
- return ret.length === 0 ? null : ret;
- }
- },
-
- TAG: function( match, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( match[1] );
- }
- }
- },
- preFilter: {
- CLASS: function( match, curLoop, inplace, result, not, isXML ) {
- match = " " + match[1].replace( rBackslash, "" ) + " ";
-
- if ( isXML ) {
- return match;
- }
-
- for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
- if ( elem ) {
- if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
- if ( !inplace ) {
- result.push( elem );
- }
-
- } else if ( inplace ) {
- curLoop[i] = false;
- }
- }
- }
-
- return false;
- },
-
- ID: function( match ) {
- return match[1].replace( rBackslash, "" );
- },
-
- TAG: function( match, curLoop ) {
- return match[1].replace( rBackslash, "" ).toLowerCase();
- },
-
- CHILD: function( match ) {
- if ( match[1] === "nth" ) {
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- match[2] = match[2].replace(/^\+|\s*/g, '');
-
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
- match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
- // calculate the numbers (first)n+(last) including if they are negative
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
- else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // TODO: Move to normal caching system
- match[0] = done++;
-
- return match;
- },
-
- ATTR: function( match, curLoop, inplace, result, not, isXML ) {
- var name = match[1] = match[1].replace( rBackslash, "" );
-
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- // Handle if an un-quoted value was used
- match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
-
- PSEUDO: function( match, curLoop, inplace, result, not ) {
- if ( match[1] === "not" ) {
- // If we're dealing with a complex expression, or a simple one
- if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
- match[3] = Sizzle(match[3], null, null, curLoop);
-
- } else {
- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
-
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
-
- return false;
- }
-
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
-
- return match;
- },
-
- POS: function( match ) {
- match.unshift( true );
-
- return match;
- }
- },
-
- filters: {
- enabled: function( elem ) {
- return elem.disabled === false && elem.type !== "hidden";
- },
-
- disabled: function( elem ) {
- return elem.disabled === true;
- },
-
- checked: function( elem ) {
- return elem.checked === true;
- },
-
- selected: function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- parent: function( elem ) {
- return !!elem.firstChild;
- },
-
- empty: function( elem ) {
- return !elem.firstChild;
- },
-
- has: function( elem, i, match ) {
- return !!Sizzle( match[3], elem ).length;
- },
-
- header: function( elem ) {
- return (/h\d/i).test( elem.nodeName );
- },
-
- text: function( elem ) {
- var attr = elem.getAttribute( "type" ), type = elem.type;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
- },
-
- radio: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
- },
-
- checkbox: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
- },
-
- file: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
- },
-
- password: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
- },
-
- submit: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "submit" === elem.type;
- },
-
- image: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
- },
-
- reset: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "reset" === elem.type;
- },
-
- button: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && "button" === elem.type || name === "button";
- },
-
- input: function( elem ) {
- return (/input|select|textarea|button/i).test( elem.nodeName );
- },
-
- focus: function( elem ) {
- return elem === elem.ownerDocument.activeElement;
- }
- },
- setFilters: {
- first: function( elem, i ) {
- return i === 0;
- },
-
- last: function( elem, i, match, array ) {
- return i === array.length - 1;
- },
-
- even: function( elem, i ) {
- return i % 2 === 0;
- },
-
- odd: function( elem, i ) {
- return i % 2 === 1;
- },
-
- lt: function( elem, i, match ) {
- return i < match[3] - 0;
- },
-
- gt: function( elem, i, match ) {
- return i > match[3] - 0;
- },
-
- nth: function( elem, i, match ) {
- return match[3] - 0 === i;
- },
-
- eq: function( elem, i, match ) {
- return match[3] - 0 === i;
- }
- },
- filter: {
- PSEUDO: function( elem, match, i, array ) {
- var name = match[1],
- filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
-
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
-
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var j = 0, l = not.length; j < l; j++ ) {
- if ( not[j] === elem ) {
- return false;
- }
- }
-
- return true;
-
- } else {
- Sizzle.error( name );
- }
- },
-
- CHILD: function( elem, match ) {
- var type = match[1],
- node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- return true;
-
- case "nth":
- var first = match[2],
- last = match[3];
-
- if ( first === 1 && last === 0 ) {
- return true;
- }
-
- var doneName = match[0],
- parent = elem.parentNode;
-
- if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
- var count = 0;
-
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.nodeIndex = ++count;
- }
- }
-
- parent.sizcache = doneName;
- }
-
- var diff = elem.nodeIndex - last;
-
- if ( first === 0 ) {
- return diff === 0;
-
- } else {
- return ( diff % first === 0 && diff / first >= 0 );
- }
- }
- },
-
- ID: function( elem, match ) {
- return elem.nodeType === 1 && elem.getAttribute("id") === match;
- },
-
- TAG: function( elem, match ) {
- return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
- },
-
- CLASS: function( elem, match ) {
- return (" " + (elem.className || elem.getAttribute("class")) + " ")
- .indexOf( match ) > -1;
- },
-
- ATTR: function( elem, match ) {
- var name = match[1],
- result = Expr.attrHandle[ name ] ?
- Expr.attrHandle[ name ]( elem ) :
- elem[ name ] != null ?
- elem[ name ] :
- elem.getAttribute( name ),
- value = result + "",
- type = match[2],
- check = match[4];
-
- return result == null ?
- type === "!=" :
- type === "=" ?
- value === check :
- type === "*=" ?
- value.indexOf(check) >= 0 :
- type === "~=" ?
- (" " + value + " ").indexOf(check) >= 0 :
- !check ?
- value && result !== false :
- type === "!=" ?
- value !== check :
- type === "^=" ?
- value.indexOf(check) === 0 :
- type === "$=" ?
- value.substr(value.length - check.length) === check :
- type === "|=" ?
- value === check || value.substr(0, check.length + 1) === check + "-" :
- false;
- },
-
- POS: function( elem, match, i, array ) {
- var name = match[2],
- filter = Expr.setFilters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- }
- }
- }
-};
-
-var origPOS = Expr.match.POS,
- fescape = function(all, num){
- return "\\" + (num - 0 + 1);
- };
-
-for ( var type in Expr.match ) {
- Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
- Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
-}
-
-var makeArray = function( array, results ) {
- array = Array.prototype.slice.call( array, 0 );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-try {
- Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
-} catch( e ) {
- makeArray = function( array, results ) {
- var i = 0,
- ret = results || [];
-
- if ( toString.call(array) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
-
- } else {
- if ( typeof array.length === "number" ) {
- for ( var l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
-
- } else {
- for ( ; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
-}
-
-var sortOrder, siblingCheck;
-
-if ( document.documentElement.compareDocumentPosition ) {
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
- return a.compareDocumentPosition ? -1 : 1;
- }
-
- return a.compareDocumentPosition(b) & 4 ? -1 : 1;
- };
-
-} else {
- sortOrder = function( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
- siblingCheck = function( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
- };
-}
-
-// Utility function for retreiving the text value of an array of DOM nodes
-Sizzle.getText = function( elems ) {
- var ret = "", elem;
-
- for ( var i = 0; elems[i]; i++ ) {
- elem = elems[i];
-
- // Get the text from text nodes and CDATA nodes
- if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
- ret += elem.nodeValue;
-
- // Traverse everything else, except comment nodes
- } else if ( elem.nodeType !== 8 ) {
- ret += Sizzle.getText( elem.childNodes );
- }
- }
-
- return ret;
-};
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
- // We're going to inject a fake input element with a specified name
- var form = document.createElement("div"),
- id = "script" + (new Date()).getTime(),
- root = document.documentElement;
-
- form.innerHTML = "";
-
- // Inject it into the root element, check its status, and remove it quickly
- root.insertBefore( form, root.firstChild );
-
- // The workaround has to do additional checks after a getElementById
- // Which slows things down for other browsers (hence the branching)
- if ( document.getElementById( id ) ) {
- Expr.find.ID = function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
-
- return m ?
- m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
- [m] :
- undefined :
- [];
- }
- };
-
- Expr.filter.ID = function( elem, match ) {
- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
-
- // release memory in IE
- root = form = null;
-})();
-
-(function(){
- // Check to see if the browser returns only elements
- // when doing getElementsByTagName("*")
-
- // Create a fake element
- var div = document.createElement("div");
- div.appendChild( document.createComment("") );
-
- // Make sure no comments are found
- if ( div.getElementsByTagName("*").length > 0 ) {
- Expr.find.TAG = function( match, context ) {
- var results = context.getElementsByTagName( match[1] );
-
- // Filter out possible comments
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-
- // Check to see if an attribute returns normalized href attributes
- div.innerHTML = "";
-
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute("href") !== "#" ) {
-
- Expr.attrHandle.href = function( elem ) {
- return elem.getAttribute( "href", 2 );
- };
- }
-
- // release memory in IE
- div = null;
-})();
-
-if ( document.querySelectorAll ) {
- (function(){
- var oldSizzle = Sizzle,
- div = document.createElement("div"),
- id = "__sizzle__";
-
- div.innerHTML = "";
-
- // Safari can't handle uppercase or unicode characters when
- // in quirks mode.
- if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
- return;
- }
-
- Sizzle = function( query, context, extra, seed ) {
- context = context || document;
-
- // Only use querySelectorAll on non-XML documents
- // (ID selectors don't work in non-HTML documents)
- if ( !seed && !Sizzle.isXML(context) ) {
- // See if we find a selector to speed up
- var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-
- if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
- // Speed-up: Sizzle("TAG")
- if ( match[1] ) {
- return makeArray( context.getElementsByTagName( query ), extra );
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
- return makeArray( context.getElementsByClassName( match[2] ), extra );
- }
- }
-
- if ( context.nodeType === 9 ) {
- // Speed-up: Sizzle("body")
- // The body element only exists once, optimize finding it
- if ( query === "body" && context.body ) {
- return makeArray( [ context.body ], extra );
-
- // Speed-up: Sizzle("#ID")
- } else if ( match && match[3] ) {
- var elem = context.getElementById( match[3] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id === match[3] ) {
- return makeArray( [ elem ], extra );
- }
-
- } else {
- return makeArray( [], extra );
- }
- }
-
- try {
- return makeArray( context.querySelectorAll(query), extra );
- } catch(qsaError) {}
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- var oldContext = context,
- old = context.getAttribute( "id" ),
- nid = old || id,
- hasParent = context.parentNode,
- relativeHierarchySelector = /^\s*[+~]/.test( query );
-
- if ( !old ) {
- context.setAttribute( "id", nid );
- } else {
- nid = nid.replace( /'/g, "\\$&" );
- }
- if ( relativeHierarchySelector && hasParent ) {
- context = context.parentNode;
- }
-
- try {
- if ( !relativeHierarchySelector || hasParent ) {
- return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
- }
-
- } catch(pseudoError) {
- } finally {
- if ( !old ) {
- oldContext.removeAttribute( "id" );
- }
- }
- }
- }
-
- return oldSizzle(query, context, extra, seed);
- };
-
- for ( var prop in oldSizzle ) {
- Sizzle[ prop ] = oldSizzle[ prop ];
- }
-
- // release memory in IE
- div = null;
- })();
-}
-
-(function(){
- var html = document.documentElement,
- matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
- if ( matches ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9 fails this)
- var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
- pseudoWorks = false;
-
- try {
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( document.documentElement, "[test!='']:sizzle" );
-
- } catch( pseudoError ) {
- pseudoWorks = true;
- }
-
- Sizzle.matchesSelector = function( node, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
-
- if ( !Sizzle.isXML( node ) ) {
- try {
- if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
- var ret = matches.call( node, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || !disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9, so check for that
- node.document && node.document.nodeType !== 11 ) {
- return ret;
- }
- }
- } catch(e) {}
- }
-
- return Sizzle(expr, null, null, [node]).length > 0;
- };
- }
-})();
-
-(function(){
- var div = document.createElement("div");
-
- div.innerHTML = "";
-
- // Opera can't find a second classname (in 9.6)
- // Also, make sure that getElementsByClassName actually exists
- if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
- return;
- }
-
- // Safari caches class attributes, doesn't catch changes (in 3.2)
- div.lastChild.className = "e";
-
- if ( div.getElementsByClassName("e").length === 1 ) {
- return;
- }
-
- Expr.order.splice(1, 0, "CLASS");
- Expr.find.CLASS = function( match, context, isXML ) {
- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
- return context.getElementsByClassName(match[1]);
- }
- };
-
- // release memory in IE
- div = null;
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 && !isXML ){
- elem.sizcache = doneName;
- elem.sizset = i;
- }
-
- if ( elem.nodeName.toLowerCase() === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem.sizcache = doneName;
- elem.sizset = i;
- }
-
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-if ( document.documentElement.contains ) {
- Sizzle.contains = function( a, b ) {
- return a !== b && (a.contains ? a.contains(b) : true);
- };
-
-} else if ( document.documentElement.compareDocumentPosition ) {
- Sizzle.contains = function( a, b ) {
- return !!(a.compareDocumentPosition(b) & 16);
- };
-
-} else {
- Sizzle.contains = function() {
- return false;
- };
-}
-
-Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-var posProcess = function( selector, context ) {
- var match,
- tmpSet = [],
- later = "",
- root = context.nodeType ? [context] : context;
-
- // Position selectors must be done after the filter
- // And so must :not(positional) so we move all PSEUDOs to the end
- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.PSEUDO, "" );
- }
-
- selector = Expr.relative[selector] ? selector + "*" : selector;
-
- for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet );
- }
-
- return Sizzle.filter( later, tmpSet );
-};
-
-// EXPOSE
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.filters;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})();
-
-
-var runtil = /Until$/,
- rparentsprev = /^(?:parents|prevUntil|prevAll)/,
- // Note: This RegExp should be improved, or likely pulled from Sizzle
- rmultiselector = /,/,
- isSimple = /^.[^:#\[\.,]*$/,
- slice = Array.prototype.slice,
- POS = jQuery.expr.match.POS,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend({
- find: function( selector ) {
- var self = this,
- i, l;
-
- if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter(function() {
- for ( i = 0, l = self.length; i < l; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- });
- }
-
- var ret = this.pushStack( "", "find", selector ),
- length, n, r;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice(n--, 1);
- break;
- }
- }
- }
- }
- }
-
- return ret;
- },
-
- has: function( target ) {
- var targets = jQuery( target );
- return this.filter(function() {
- for ( var i = 0, l = targets.length; i < l; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- });
- },
-
- not: function( selector ) {
- return this.pushStack( winnow(this, selector, false), "not", selector);
- },
-
- filter: function( selector ) {
- return this.pushStack( winnow(this, selector, true), "filter", selector );
- },
-
- is: function( selector ) {
- return !!selector && ( typeof selector === "string" ?
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
- },
-
- closest: function( selectors, context ) {
- var ret = [], i, l, cur = this[0];
-
- // Array
- if ( jQuery.isArray( selectors ) ) {
- var match, selector,
- matches = {},
- level = 1;
-
- if ( cur && selectors.length ) {
- for ( i = 0, l = selectors.length; i < l; i++ ) {
- selector = selectors[i];
-
- if ( !matches[ selector ] ) {
- matches[ selector ] = POS.test( selector ) ?
- jQuery( selector, context || this.context ) :
- selector;
- }
- }
-
- while ( cur && cur.ownerDocument && cur !== context ) {
- for ( selector in matches ) {
- match = matches[ selector ];
-
- if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
- ret.push({ selector: selector, elem: cur, level: level });
- }
- }
-
- cur = cur.parentNode;
- level++;
- }
- }
-
- return ret;
- }
-
- // String
- var pos = POS.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- cur = this[i];
-
- while ( cur ) {
- if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
- ret.push( cur );
- break;
-
- } else {
- cur = cur.parentNode;
- if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
- break;
- }
- }
- }
- }
-
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
- if ( !elem || typeof elem === "string" ) {
- return jQuery.inArray( this[0],
- // If it receives a string, the selector is used
- // If it receives nothing, the siblings are used
- elem ? jQuery( elem ) : this.parent().children() );
- }
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add: function( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
- },
-
- andSelf: function() {
- return this.add( this.prevObject );
- }
-});
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-jQuery.each({
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return jQuery.nth( elem, 2, "nextSibling" );
- },
- prev: function( elem ) {
- return jQuery.nth( elem, 2, "previousSibling" );
- },
- nextAll: function( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return jQuery.sibling( elem.parentNode.firstChild, elem );
- },
- children: function( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.makeArray( elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until ),
- // The variable 'args' was introduced in
- // https://github.com/jquery/jquery/commit/52a0238
- // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
- // http://code.google.com/p/v8/issues/detail?id=1050
- args = slice.call(arguments);
-
- if ( !runtil.test( name ) ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
- if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
-
- return this.pushStack( ret, name, args.join(",") );
- };
-});
-
-jQuery.extend({
- filter: function( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 ?
- jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
- jQuery.find.matches(expr, elems);
- },
-
- dir: function( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- nth: function( cur, result, dir, elem ) {
- result = result || 1;
- var num = 0;
-
- for ( ; cur; cur = cur[dir] ) {
- if ( cur.nodeType === 1 && ++num === result ) {
- break;
- }
- }
-
- return cur;
- },
-
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep(elements, function( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
- });
-
- } else if ( qualifier.nodeType ) {
- return jQuery.grep(elements, function( elem, i ) {
- return (elem === qualifier) === keep;
- });
-
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep(elements, function( elem ) {
- return elem.nodeType === 1;
- });
-
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter(qualifier, filtered, !keep);
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
- }
- }
-
- return jQuery.grep(elements, function( elem, i ) {
- return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
- });
-}
-
-
-
-
-var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
- rtagName = /<([\w:]+)/,
- rtbody = /", "" ],
- legend: [ 1, "" ],
- thead: [ 1, "
", "
" ],
- tr: [ 2, "
", "
" ],
- td: [ 3, "
", "
" ],
- col: [ 2, "
", "
" ],
- area: [ 1, "" ],
- _default: [ 0, "", "" ]
- };
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE can't serialize and
- *
- * Data must be supplied in
- * the form:
- *
- * > [[x1, y1, r1,