Commits

Anonymous committed f289920

directory reorg for more sensible build and distribution system

Comments (0)

Files changed (30)

excanvas.js

-// Copyright 2006 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-
-// Known Issues:
-//
-// * Patterns are not implemented.
-// * Radial gradient are not implemented. The VML version of these look very
-//   different from the canvas one.
-// * Clipping paths are not implemented.
-// * Coordsize. The width and height attribute have higher priority than the
-//   width and height style values which isn't correct.
-// * Painting mode isn't implemented.
-// * Canvas width/height should is using content-box by default. IE in
-//   Quirks mode will draw the canvas using border-box. Either change your
-//   doctype to HTML5
-//   (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)
-//   or use Box Sizing Behavior from WebFX
-//   (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)
-// * Non uniform scaling does not correctly scale strokes.
-// * Optimize. There is always room for speed improvements.
-
-// Only add this code if we do not already have a canvas implementation
-if (!document.createElement('canvas').getContext) {
-
-(function() {
-
-  // alias some functions to make (compiled) code shorter
-  var m = Math;
-  var mr = m.round;
-  var ms = m.sin;
-  var mc = m.cos;
-  var abs = m.abs;
-  var sqrt = m.sqrt;
-
-  // this is used for sub pixel precision
-  var Z = 10;
-  var Z2 = Z / 2;
-
-  /**
-   * This funtion is assigned to the <canvas> elements as element.getContext().
-   * @this {HTMLElement}
-   * @return {CanvasRenderingContext2D_}
-   */
-  function getContext() {
-    return this.context_ ||
-        (this.context_ = new CanvasRenderingContext2D_(this));
-  }
-
-  var slice = Array.prototype.slice;
-
-  /**
-   * Binds a function to an object. The returned function will always use the
-   * passed in {@code obj} as {@code this}.
-   *
-   * Example:
-   *
-   *   g = bind(f, obj, a, b)
-   *   g(c, d) // will do f.call(obj, a, b, c, d)
-   *
-   * @param {Function} f The function to bind the object to
-   * @param {Object} obj The object that should act as this when the function
-   *     is called
-   * @param {*} var_args Rest arguments that will be used as the initial
-   *     arguments when the function is called
-   * @return {Function} A new function that has bound this
-   */
-  function bind(f, obj, var_args) {
-    var a = slice.call(arguments, 2);
-    return function() {
-      return f.apply(obj, a.concat(slice.call(arguments)));
-    };
-  }
-
-  var G_vmlCanvasManager_ = {
-    init: function(opt_doc) {
-      if (/MSIE/.test(navigator.userAgent) && !window.opera) {
-        var doc = opt_doc || document;
-        // Create a dummy element so that IE will allow canvas elements to be
-        // recognized.
-        doc.createElement('canvas');
-        doc.attachEvent('onreadystatechange', bind(this.init_, this, doc));
-      }
-    },
-
-    init_: function(doc) {
-      // create xmlns
-      if (!doc.namespaces['g_vml_']) {
-        doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml',
-                           '#default#VML');
-
-      }
-      if (!doc.namespaces['g_o_']) {
-        doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office',
-                           '#default#VML');
-      }
-
-      // Setup default CSS.  Only add one style sheet per document
-      if (!doc.styleSheets['ex_canvas_']) {
-        var ss = doc.createStyleSheet();
-        ss.owningElement.id = 'ex_canvas_';
-        ss.cssText = 'canvas{display:inline-block;overflow:hidden;' +
-            // default size is 300x150 in Gecko and Opera
-            'text-align:left;width:300px;height:150px}' +
-            'g_vml_\\:*{behavior:url(#default#VML)}' +
-            'g_o_\\:*{behavior:url(#default#VML)}';
-
-      }
-
-      // find all canvas elements
-      var els = doc.getElementsByTagName('canvas');
-      for (var i = 0; i < els.length; i++) {
-        this.initElement(els[i]);
-      }
-    },
-
-    /**
-     * Public initializes a canvas element so that it can be used as canvas
-     * element from now on. This is called automatically before the page is
-     * loaded but if you are creating elements using createElement you need to
-     * make sure this is called on the element.
-     * @param {HTMLElement} el The canvas element to initialize.
-     * @return {HTMLElement} the element that was created.
-     */
-    initElement: function(el) {
-      if (!el.getContext) {
-
-        el.getContext = getContext;
-
-        // Remove fallback content. There is no way to hide text nodes so we
-        // just remove all childNodes. We could hide all elements and remove
-        // text nodes but who really cares about the fallback content.
-        el.innerHTML = '';
-
-        // do not use inline function because that will leak memory
-        el.attachEvent('onpropertychange', onPropertyChange);
-        el.attachEvent('onresize', onResize);
-
-        var attrs = el.attributes;
-        if (attrs.width && attrs.width.specified) {
-          // TODO: use runtimeStyle and coordsize
-          // el.getContext().setWidth_(attrs.width.nodeValue);
-          el.style.width = attrs.width.nodeValue + 'px';
-        } else {
-          el.width = el.clientWidth;
-        }
-        if (attrs.height && attrs.height.specified) {
-          // TODO: use runtimeStyle and coordsize
-          // el.getContext().setHeight_(attrs.height.nodeValue);
-          el.style.height = attrs.height.nodeValue + 'px';
-        } else {
-          el.height = el.clientHeight;
-        }
-        //el.getContext().setCoordsize_()
-      }
-      return el;
-    }
-  };
-
-  function onPropertyChange(e) {
-    var el = e.srcElement;
-
-    switch (e.propertyName) {
-      case 'width':
-        el.style.width = el.attributes.width.nodeValue + 'px';
-        el.getContext().clearRect();
-        break;
-      case 'height':
-        el.style.height = el.attributes.height.nodeValue + 'px';
-        el.getContext().clearRect();
-        break;
-    }
-  }
-
-  function onResize(e) {
-    var el = e.srcElement;
-    if (el.firstChild) {
-      el.firstChild.style.width =  el.clientWidth + 'px';
-      el.firstChild.style.height = el.clientHeight + 'px';
-    }
-  }
-
-  G_vmlCanvasManager_.init();
-
-  // precompute "00" to "FF"
-  var dec2hex = [];
-  for (var i = 0; i < 16; i++) {
-    for (var j = 0; j < 16; j++) {
-      dec2hex[i * 16 + j] = i.toString(16) + j.toString(16);
-    }
-  }
-
-  function createMatrixIdentity() {
-    return [
-      [1, 0, 0],
-      [0, 1, 0],
-      [0, 0, 1]
-    ];
-  }
-
-  function matrixMultiply(m1, m2) {
-    var result = createMatrixIdentity();
-
-    for (var x = 0; x < 3; x++) {
-      for (var y = 0; y < 3; y++) {
-        var sum = 0;
-
-        for (var z = 0; z < 3; z++) {
-          sum += m1[x][z] * m2[z][y];
-        }
-
-        result[x][y] = sum;
-      }
-    }
-    return result;
-  }
-
-  function copyState(o1, o2) {
-    o2.fillStyle     = o1.fillStyle;
-    o2.lineCap       = o1.lineCap;
-    o2.lineJoin      = o1.lineJoin;
-    o2.lineWidth     = o1.lineWidth;
-    o2.miterLimit    = o1.miterLimit;
-    o2.shadowBlur    = o1.shadowBlur;
-    o2.shadowColor   = o1.shadowColor;
-    o2.shadowOffsetX = o1.shadowOffsetX;
-    o2.shadowOffsetY = o1.shadowOffsetY;
-    o2.strokeStyle   = o1.strokeStyle;
-    o2.globalAlpha   = o1.globalAlpha;
-    o2.arcScaleX_    = o1.arcScaleX_;
-    o2.arcScaleY_    = o1.arcScaleY_;
-    o2.lineScale_    = o1.lineScale_;
-  }
-
-  function processStyle(styleString) {
-    var str, alpha = 1;
-
-    styleString = String(styleString);
-    if (styleString.substring(0, 3) == 'rgb') {
-      var start = styleString.indexOf('(', 3);
-      var end = styleString.indexOf(')', start + 1);
-      var guts = styleString.substring(start + 1, end).split(',');
-
-      str = '#';
-      for (var i = 0; i < 3; i++) {
-        str += dec2hex[Number(guts[i])];
-      }
-
-      if (guts.length == 4 && styleString.substr(3, 1) == 'a') {
-        alpha = guts[3];
-      }
-    } else {
-      str = styleString;
-    }
-
-    return {color: str, alpha: alpha};
-  }
-
-  function processLineCap(lineCap) {
-    switch (lineCap) {
-      case 'butt':
-        return 'flat';
-      case 'round':
-        return 'round';
-      case 'square':
-      default:
-        return 'square';
-    }
-  }
-
-  /**
-   * This class implements CanvasRenderingContext2D interface as described by
-   * the WHATWG.
-   * @param {HTMLElement} surfaceElement The element that the 2D context should
-   * be associated with
-   */
-  function CanvasRenderingContext2D_(surfaceElement) {
-    this.m_ = createMatrixIdentity();
-
-    this.mStack_ = [];
-    this.aStack_ = [];
-    this.currentPath_ = [];
-
-    // Canvas context properties
-    this.strokeStyle = '#000';
-    this.fillStyle = '#000';
-
-    this.lineWidth = 1;
-    this.lineJoin = 'miter';
-    this.lineCap = 'butt';
-    this.miterLimit = Z * 1;
-    this.globalAlpha = 1;
-    this.canvas = surfaceElement;
-
-    var el = surfaceElement.ownerDocument.createElement('div');
-    el.style.width =  surfaceElement.clientWidth + 'px';
-    el.style.height = surfaceElement.clientHeight + 'px';
-    el.style.overflow = 'hidden';
-    el.style.position = 'absolute';
-    surfaceElement.appendChild(el);
-
-    this.element_ = el;
-    this.arcScaleX_ = 1;
-    this.arcScaleY_ = 1;
-    this.lineScale_ = 1;
-  }
-
-  var contextPrototype = CanvasRenderingContext2D_.prototype;
-  contextPrototype.clearRect = function() {
-    this.element_.innerHTML = '';
-  };
-
-  contextPrototype.beginPath = function() {
-    // TODO: Branch current matrix so that save/restore has no effect
-    //       as per safari docs.
-    this.currentPath_ = [];
-  };
-
-  contextPrototype.moveTo = function(aX, aY) {
-    var p = this.getCoords_(aX, aY);
-    this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y});
-    this.currentX_ = p.x;
-    this.currentY_ = p.y;
-  };
-
-  contextPrototype.lineTo = function(aX, aY) {
-    var p = this.getCoords_(aX, aY);
-    this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y});
-
-    this.currentX_ = p.x;
-    this.currentY_ = p.y;
-  };
-
-  contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
-                                            aCP2x, aCP2y,
-                                            aX, aY) {
-    var p = this.getCoords_(aX, aY);
-    var cp1 = this.getCoords_(aCP1x, aCP1y);
-    var cp2 = this.getCoords_(aCP2x, aCP2y);
-    bezierCurveTo(this, cp1, cp2, p);
-  };
-
-  // Helper function that takes the already fixed cordinates.
-  function bezierCurveTo(self, cp1, cp2, p) {
-    self.currentPath_.push({
-      type: 'bezierCurveTo',
-      cp1x: cp1.x,
-      cp1y: cp1.y,
-      cp2x: cp2.x,
-      cp2y: cp2.y,
-      x: p.x,
-      y: p.y
-    });
-    self.currentX_ = p.x;
-    self.currentY_ = p.y;
-  }
-
-  contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
-    // the following is lifted almost directly from
-    // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes
-
-    var cp = this.getCoords_(aCPx, aCPy);
-    var p = this.getCoords_(aX, aY);
-
-    var cp1 = {
-      x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_),
-      y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_)
-    };
-    var cp2 = {
-      x: cp1.x + (p.x - this.currentX_) / 3.0,
-      y: cp1.y + (p.y - this.currentY_) / 3.0
-    };
-
-    bezierCurveTo(this, cp1, cp2, p);
-  };
-
-  contextPrototype.arc = function(aX, aY, aRadius,
-                                  aStartAngle, aEndAngle, aClockwise) {
-    aRadius *= Z;
-    var arcType = aClockwise ? 'at' : 'wa';
-
-    var xStart = aX + mc(aStartAngle) * aRadius - Z2;
-    var yStart = aY + ms(aStartAngle) * aRadius - Z2;
-
-    var xEnd = aX + mc(aEndAngle) * aRadius - Z2;
-    var yEnd = aY + ms(aEndAngle) * aRadius - Z2;
-
-    // IE won't render arches drawn counter clockwise if xStart == xEnd.
-    if (xStart == xEnd && !aClockwise) {
-      xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something
-                       // that can be represented in binary
-    }
-
-    var p = this.getCoords_(aX, aY);
-    var pStart = this.getCoords_(xStart, yStart);
-    var pEnd = this.getCoords_(xEnd, yEnd);
-
-    this.currentPath_.push({type: arcType,
-                           x: p.x,
-                           y: p.y,
-                           radius: aRadius,
-                           xStart: pStart.x,
-                           yStart: pStart.y,
-                           xEnd: pEnd.x,
-                           yEnd: pEnd.y});
-
-  };
-
-  contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
-    this.moveTo(aX, aY);
-    this.lineTo(aX + aWidth, aY);
-    this.lineTo(aX + aWidth, aY + aHeight);
-    this.lineTo(aX, aY + aHeight);
-    this.closePath();
-  };
-
-  contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
-    var oldPath = this.currentPath_;
-    this.beginPath();
-
-    this.moveTo(aX, aY);
-    this.lineTo(aX + aWidth, aY);
-    this.lineTo(aX + aWidth, aY + aHeight);
-    this.lineTo(aX, aY + aHeight);
-    this.closePath();
-    this.stroke();
-
-    this.currentPath_ = oldPath;
-  };
-
-  contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
-    var oldPath = this.currentPath_;
-    this.beginPath();
-
-    this.moveTo(aX, aY);
-    this.lineTo(aX + aWidth, aY);
-    this.lineTo(aX + aWidth, aY + aHeight);
-    this.lineTo(aX, aY + aHeight);
-    this.closePath();
-    this.fill();
-
-    this.currentPath_ = oldPath;
-  };
-
-  contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
-    var gradient = new CanvasGradient_('gradient');
-    gradient.x0_ = aX0;
-    gradient.y0_ = aY0;
-    gradient.x1_ = aX1;
-    gradient.y1_ = aY1;
-    return gradient;
-  };
-
-  contextPrototype.createRadialGradient = function(aX0, aY0, aR0,
-                                                   aX1, aY1, aR1) {
-    var gradient = new CanvasGradient_('gradientradial');
-    gradient.x0_ = aX0;
-    gradient.y0_ = aY0;
-    gradient.r0_ = aR0;
-    gradient.x1_ = aX1;
-    gradient.y1_ = aY1;
-    gradient.r1_ = aR1;
-    return gradient;
-  };
-
-  contextPrototype.drawImage = function(image, var_args) {
-    var dx, dy, dw, dh, sx, sy, sw, sh;
-
-    // to find the original width we overide the width and height
-    var oldRuntimeWidth = image.runtimeStyle.width;
-    var oldRuntimeHeight = image.runtimeStyle.height;
-    image.runtimeStyle.width = 'auto';
-    image.runtimeStyle.height = 'auto';
-
-    // get the original size
-    var w = image.width;
-    var h = image.height;
-
-    // and remove overides
-    image.runtimeStyle.width = oldRuntimeWidth;
-    image.runtimeStyle.height = oldRuntimeHeight;
-
-    if (arguments.length == 3) {
-      dx = arguments[1];
-      dy = arguments[2];
-      sx = sy = 0;
-      sw = dw = w;
-      sh = dh = h;
-    } else if (arguments.length == 5) {
-      dx = arguments[1];
-      dy = arguments[2];
-      dw = arguments[3];
-      dh = arguments[4];
-      sx = sy = 0;
-      sw = w;
-      sh = h;
-    } else if (arguments.length == 9) {
-      sx = arguments[1];
-      sy = arguments[2];
-      sw = arguments[3];
-      sh = arguments[4];
-      dx = arguments[5];
-      dy = arguments[6];
-      dw = arguments[7];
-      dh = arguments[8];
-    } else {
-      throw Error('Invalid number of arguments');
-    }
-
-    var d = this.getCoords_(dx, dy);
-
-    var w2 = sw / 2;
-    var h2 = sh / 2;
-
-    var vmlStr = [];
-
-    var W = 10;
-    var H = 10;
-
-    // For some reason that I've now forgotten, using divs didn't work
-    vmlStr.push(' <g_vml_:group',
-                ' coordsize="', Z * W, ',', Z * H, '"',
-                ' coordorigin="0,0"' ,
-                ' style="width:', W, 'px;height:', H, 'px;position:absolute;');
-
-    // If filters are necessary (rotation exists), create them
-    // filters are bog-slow, so only create them if abbsolutely necessary
-    // The following check doesn't account for skews (which don't exist
-    // in the canvas spec (yet) anyway.
-
-    if (this.m_[0][0] != 1 || this.m_[0][1]) {
-      var filter = [];
-
-      // Note the 12/21 reversal
-      filter.push('M11=', this.m_[0][0], ',',
-                  'M12=', this.m_[1][0], ',',
-                  'M21=', this.m_[0][1], ',',
-                  'M22=', this.m_[1][1], ',',
-                  'Dx=', mr(d.x / Z), ',',
-                  'Dy=', mr(d.y / Z), '');
-
-      // Bounding box calculation (need to minimize displayed area so that
-      // filters don't waste time on unused pixels.
-      var max = d;
-      var c2 = this.getCoords_(dx + dw, dy);
-      var c3 = this.getCoords_(dx, dy + dh);
-      var c4 = this.getCoords_(dx + dw, dy + dh);
-
-      max.x = m.max(max.x, c2.x, c3.x, c4.x);
-      max.y = m.max(max.y, c2.y, c3.y, c4.y);
-
-      vmlStr.push('padding:0 ', mr(max.x / Z), 'px ', mr(max.y / Z),
-                  'px 0;filter:progid:DXImageTransform.Microsoft.Matrix(',
-                  filter.join(''), ", sizingmethod='clip');")
-    } else {
-      vmlStr.push('top:', mr(d.y / Z), 'px;left:', mr(d.x / Z), 'px;');
-    }
-
-    vmlStr.push(' ">' ,
-                '<g_vml_:image src="', image.src, '"',
-                ' style="width:', Z * dw, 'px;',
-                ' height:', Z * dh, 'px;"',
-                ' cropleft="', sx / w, '"',
-                ' croptop="', sy / h, '"',
-                ' cropright="', (w - sx - sw) / w, '"',
-                ' cropbottom="', (h - sy - sh) / h, '"',
-                ' />',
-                '</g_vml_:group>');
-
-    this.element_.insertAdjacentHTML('BeforeEnd',
-                                    vmlStr.join(''));
-  };
-
-  contextPrototype.stroke = function(aFill) {
-    var lineStr = [];
-    var lineOpen = false;
-    var a = processStyle(aFill ? this.fillStyle : this.strokeStyle);
-    var color = a.color;
-    var opacity = a.alpha * this.globalAlpha;
-
-    var W = 10;
-    var H = 10;
-
-    lineStr.push('<g_vml_:shape',
-                 ' filled="', !!aFill, '"',
-                 ' style="position:absolute;width:', W, 'px;height:', H, 'px;"',
-                 ' coordorigin="0 0" coordsize="', Z * W, ' ', Z * H, '"',
-                 ' stroked="', !aFill, '"',
-                 ' path="');
-
-    var newSeq = false;
-    var min = {x: null, y: null};
-    var max = {x: null, y: null};
-
-    for (var i = 0; i < this.currentPath_.length; i++) {
-      var p = this.currentPath_[i];
-      var c;
-
-      switch (p.type) {
-        case 'moveTo':
-          c = p;
-          lineStr.push(' m ', mr(p.x), ',', mr(p.y));
-          break;
-        case 'lineTo':
-          lineStr.push(' l ', mr(p.x), ',', mr(p.y));
-          break;
-        case 'close':
-          lineStr.push(' x ');
-          p = null;
-          break;
-        case 'bezierCurveTo':
-          lineStr.push(' c ',
-                       mr(p.cp1x), ',', mr(p.cp1y), ',',
-                       mr(p.cp2x), ',', mr(p.cp2y), ',',
-                       mr(p.x), ',', mr(p.y));
-          break;
-        case 'at':
-        case 'wa':
-          lineStr.push(' ', p.type, ' ',
-                       mr(p.x - this.arcScaleX_ * p.radius), ',',
-                       mr(p.y - this.arcScaleY_ * p.radius), ' ',
-                       mr(p.x + this.arcScaleX_ * p.radius), ',',
-                       mr(p.y + this.arcScaleY_ * p.radius), ' ',
-                       mr(p.xStart), ',', mr(p.yStart), ' ',
-                       mr(p.xEnd), ',', mr(p.yEnd));
-          break;
-      }
-
-
-      // TODO: Following is broken for curves due to
-      //       move to proper paths.
-
-      // Figure out dimensions so we can do gradient fills
-      // properly
-      if (p) {
-        if (min.x == null || p.x < min.x) {
-          min.x = p.x;
-        }
-        if (max.x == null || p.x > max.x) {
-          max.x = p.x;
-        }
-        if (min.y == null || p.y < min.y) {
-          min.y = p.y;
-        }
-        if (max.y == null || p.y > max.y) {
-          max.y = p.y;
-        }
-      }
-    }
-    lineStr.push(' ">');
-
-    if (!aFill) {
-      var lineWidth = this.lineScale_ * this.lineWidth;
-
-      // VML cannot correctly render a line if the width is less than 1px.
-      // In that case, we dilute the color to make the line look thinner.
-      if (lineWidth < 1) {
-        opacity *= lineWidth;
-      }
-
-      lineStr.push(
-        '<g_vml_:stroke',
-        ' opacity="', opacity, '"',
-        ' joinstyle="', this.lineJoin, '"',
-        ' miterlimit="', this.miterLimit, '"',
-        ' endcap="', processLineCap(this.lineCap), '"',
-        ' weight="', lineWidth, 'px"',
-        ' color="', color, '" />'
-      );
-    } else if (typeof this.fillStyle == 'object') {
-      var fillStyle = this.fillStyle;
-      var angle = 0;
-      var focus = {x: 0, y: 0};
-
-      // additional offset
-      var shift = 0;
-      // scale factor for offset
-      var expansion = 1;
-
-      if (fillStyle.type_ == 'gradient') {
-        var x0 = fillStyle.x0_ / this.arcScaleX_;
-        var y0 = fillStyle.y0_ / this.arcScaleY_;
-        var x1 = fillStyle.x1_ / this.arcScaleX_;
-        var y1 = fillStyle.y1_ / this.arcScaleY_;
-        var p0 = this.getCoords_(x0, y0);
-        var p1 = this.getCoords_(x1, y1);
-        var dx = p1.x - p0.x;
-        var dy = p1.y - p0.y;
-        angle = Math.atan2(dx, dy) * 180 / Math.PI;
-
-        // The angle should be a non-negative number.
-        if (angle < 0) {
-          angle += 360;
-        }
-
-        // Very small angles produce an unexpected result because they are
-        // converted to a scientific notation string.
-        if (angle < 1e-6) {
-          angle = 0;
-        }
-      } else {
-        var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_);
-        var width  = max.x - min.x;
-        var height = max.y - min.y;
-        focus = {
-          x: (p0.x - min.x) / width,
-          y: (p0.y - min.y) / height
-        };
-
-        width  /= this.arcScaleX_ * Z;
-        height /= this.arcScaleY_ * Z;
-        var dimension = m.max(width, height);
-        shift = 2 * fillStyle.r0_ / dimension;
-        expansion = 2 * fillStyle.r1_ / dimension - shift;
-      }
-
-      // We need to sort the color stops in ascending order by offset,
-      // otherwise IE won't interpret it correctly.
-      var stops = fillStyle.colors_;
-      stops.sort(function(cs1, cs2) {
-        return cs1.offset - cs2.offset;
-      });
-
-      var length = stops.length;
-      var color1 = stops[0].color;
-      var color2 = stops[length - 1].color;
-      var opacity1 = stops[0].alpha * this.globalAlpha;
-      var opacity2 = stops[length - 1].alpha * this.globalAlpha;
-
-      var colors = [];
-      for (var i = 0; i < length; i++) {
-        var stop = stops[i];
-        colors.push(stop.offset * expansion + shift + ' ' + stop.color);
-      }
-
-      // When colors attribute is used, the meanings of opacity and o:opacity2
-      // are reversed.
-      lineStr.push('<g_vml_:fill type="', fillStyle.type_, '"',
-                   ' method="none" focus="100%"',
-                   ' color="', color1, '"',
-                   ' color2="', color2, '"',
-                   ' colors="', colors.join(','), '"',
-                   ' opacity="', opacity2, '"',
-                   ' g_o_:opacity2="', opacity1, '"',
-                   ' angle="', angle, '"',
-                   ' focusposition="', focus.x, ',', focus.y, '" />');
-    } else {
-      lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity,
-                   '" />');
-    }
-
-    lineStr.push('</g_vml_:shape>');
-
-    this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
-  };
-
-  contextPrototype.fill = function() {
-    this.stroke(true);
-  }
-
-  contextPrototype.closePath = function() {
-    this.currentPath_.push({type: 'close'});
-  };
-
-  /**
-   * @private
-   */
-  contextPrototype.getCoords_ = function(aX, aY) {
-    var m = this.m_;
-    return {
-      x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2,
-      y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2
-    }
-  };
-
-  contextPrototype.save = function() {
-    var o = {};
-    copyState(this, o);
-    this.aStack_.push(o);
-    this.mStack_.push(this.m_);
-    this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
-  };
-
-  contextPrototype.restore = function() {
-    copyState(this.aStack_.pop(), this);
-    this.m_ = this.mStack_.pop();
-  };
-
-  contextPrototype.translate = function(aX, aY) {
-    var m1 = [
-      [1,  0,  0],
-      [0,  1,  0],
-      [aX, aY, 1]
-    ];
-
-    this.m_ = matrixMultiply(m1, this.m_);
-  };
-
-  contextPrototype.rotate = function(aRot) {
-    var c = mc(aRot);
-    var s = ms(aRot);
-
-    var m1 = [
-      [c,  s, 0],
-      [-s, c, 0],
-      [0,  0, 1]
-    ];
-
-    this.m_ = matrixMultiply(m1, this.m_);
-  };
-
-  contextPrototype.scale = function(aX, aY) {
-    this.arcScaleX_ *= aX;
-    this.arcScaleY_ *= aY;
-    var m1 = [
-      [aX, 0,  0],
-      [0,  aY, 0],
-      [0,  0,  1]
-    ];
-
-    var m = this.m_ = matrixMultiply(m1, this.m_);
-
-    // Get the line scale.
-    // Determinant of this.m_ means how much the area is enlarged by the
-    // transformation. So its square root can be used as a scale factor
-    // for width.
-    var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
-    this.lineScale_ = sqrt(abs(det));
-  };
-
-  /******** STUBS ********/
-  contextPrototype.clip = function() {
-    // TODO: Implement
-  };
-
-  contextPrototype.arcTo = function() {
-    // TODO: Implement
-  };
-
-  contextPrototype.createPattern = function() {
-    return new CanvasPattern_;
-  };
-
-  // Gradient / Pattern Stubs
-  function CanvasGradient_(aType) {
-    this.type_ = aType;
-    this.x0_ = 0;
-    this.y0_ = 0;
-    this.r0_ = 0;
-    this.x1_ = 0;
-    this.y1_ = 0;
-    this.r1_ = 0;
-    this.colors_ = [];
-  }
-
-  CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
-    aColor = processStyle(aColor);
-    this.colors_.push({offset: aOffset,
-                       color: aColor.color,
-                       alpha: aColor.alpha});
-  };
-
-  function CanvasPattern_() {}
-
-  // set up externs
-  G_vmlCanvasManager = G_vmlCanvasManager_;
-  CanvasRenderingContext2D = CanvasRenderingContext2D_;
-  CanvasGradient = CanvasGradient_;
-  CanvasPattern = CanvasPattern_;
-
-})();
-
-} // if

excanvas.min.js

-if(!document.createElement("canvas").getContext){(function(){var R=Math;var S=R.round;var O=R.sin;var a=R.cos;var J=R.abs;var Y=R.sqrt;var A=10;var K=A/2;function G(){return this.context_||(this.context_=new M(this))}var Q=Array.prototype.slice;function b(c,d,e){var Z=Q.call(arguments,2);return function(){return c.apply(d,Z.concat(Q.call(arguments)))}}var H={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var c=Z||document;c.createElement("canvas");c.attachEvent("onreadystatechange",b(this.init_,this,c))}},init_:function(e){if(!e.namespaces.g_vml_){e.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!e.namespaces.g_o_){e.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!e.styleSheets.ex_canvas_){var d=e.createStyleSheet();d.owningElement.id="ex_canvas_";d.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=e.getElementsByTagName("canvas");for(var Z=0;Z<c.length;Z++){this.initElement(c[Z])}},initElement:function(c){if(!c.getContext){c.getContext=G;c.innerHTML="";c.attachEvent("onpropertychange",X);c.attachEvent("onresize",B);var Z=c.attributes;if(Z.width&&Z.width.specified){c.style.width=Z.width.nodeValue+"px"}else{c.width=c.clientWidth}if(Z.height&&Z.height.specified){c.style.height=Z.height.nodeValue+"px"}else{c.height=c.clientHeight}}return c}};function X(c){var Z=c.srcElement;switch(c.propertyName){case"width":Z.style.width=Z.attributes.width.nodeValue+"px";Z.getContext().clearRect();break;case"height":Z.style.height=Z.attributes.height.nodeValue+"px";Z.getContext().clearRect();break}}function B(c){var Z=c.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}H.init();var E=[];for(var V=0;V<16;V++){for(var U=0;U<16;U++){E[V*16+U]=V.toString(16)+U.toString(16)}}function N(){return[[1,0,0],[0,1,0],[0,0,1]]}function D(e,d){var c=N();for(var Z=0;Z<3;Z++){for(var h=0;h<3;h++){var f=0;for(var g=0;g<3;g++){f+=e[Z][g]*d[g][h]}c[Z][h]=f}}return c}function T(c,Z){Z.fillStyle=c.fillStyle;Z.lineCap=c.lineCap;Z.lineJoin=c.lineJoin;Z.lineWidth=c.lineWidth;Z.miterLimit=c.miterLimit;Z.shadowBlur=c.shadowBlur;Z.shadowColor=c.shadowColor;Z.shadowOffsetX=c.shadowOffsetX;Z.shadowOffsetY=c.shadowOffsetY;Z.strokeStyle=c.strokeStyle;Z.globalAlpha=c.globalAlpha;Z.arcScaleX_=c.arcScaleX_;Z.arcScaleY_=c.arcScaleY_;Z.lineScale_=c.lineScale_}function C(c){var f,e=1;c=String(c);if(c.substring(0,3)=="rgb"){var h=c.indexOf("(",3);var Z=c.indexOf(")",h+1);var g=c.substring(h+1,Z).split(",");f="#";for(var d=0;d<3;d++){f+=E[Number(g[d])]}if(g.length==4&&c.substr(3,1)=="a"){e=g[3]}}else{f=c}return{color:f,alpha:e}}function P(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function M(c){this.m_=N();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=A*1;this.globalAlpha=1;this.canvas=c;var Z=c.ownerDocument.createElement("div");Z.style.width=c.clientWidth+"px";Z.style.height=c.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";c.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var I=M.prototype;I.clearRect=function(){this.element_.innerHTML=""};I.beginPath=function(){this.currentPath_=[]};I.moveTo=function(c,Z){var d=this.getCoords_(c,Z);this.currentPath_.push({type:"moveTo",x:d.x,y:d.y});this.currentX_=d.x;this.currentY_=d.y};I.lineTo=function(c,Z){var d=this.getCoords_(c,Z);this.currentPath_.push({type:"lineTo",x:d.x,y:d.y});this.currentX_=d.x;this.currentY_=d.y};I.bezierCurveTo=function(d,c,j,i,h,f){var Z=this.getCoords_(h,f);var g=this.getCoords_(d,c);var e=this.getCoords_(j,i);L(this,g,e,Z)};function L(Z,e,d,c){Z.currentPath_.push({type:"bezierCurveTo",cp1x:e.x,cp1y:e.y,cp2x:d.x,cp2y:d.y,x:c.x,y:c.y});Z.currentX_=c.x;Z.currentY_=c.y}I.quadraticCurveTo=function(h,d,c,Z){var g=this.getCoords_(h,d);var f=this.getCoords_(c,Z);var i={x:this.currentX_+2/3*(g.x-this.currentX_),y:this.currentY_+2/3*(g.y-this.currentY_)};var e={x:i.x+(f.x-this.currentX_)/3,y:i.y+(f.y-this.currentY_)/3};L(this,i,e,f)};I.arc=function(k,i,j,f,c,d){j*=A;var o=d?"at":"wa";var l=k+a(f)*j-K;var n=i+O(f)*j-K;var Z=k+a(c)*j-K;var m=i+O(c)*j-K;if(l==Z&&!d){l+=0.125}var e=this.getCoords_(k,i);var h=this.getCoords_(l,n);var g=this.getCoords_(Z,m);this.currentPath_.push({type:o,x:e.x,y:e.y,radius:j,xStart:h.x,yStart:h.y,xEnd:g.x,yEnd:g.y})};I.rect=function(d,c,Z,e){this.moveTo(d,c);this.lineTo(d+Z,c);this.lineTo(d+Z,c+e);this.lineTo(d,c+e);this.closePath()};I.strokeRect=function(d,c,Z,e){var f=this.currentPath_;this.beginPath();this.moveTo(d,c);this.lineTo(d+Z,c);this.lineTo(d+Z,c+e);this.lineTo(d,c+e);this.closePath();this.stroke();this.currentPath_=f};I.fillRect=function(d,c,Z,e){var f=this.currentPath_;this.beginPath();this.moveTo(d,c);this.lineTo(d+Z,c);this.lineTo(d+Z,c+e);this.lineTo(d,c+e);this.closePath();this.fill();this.currentPath_=f};I.createLinearGradient=function(c,e,Z,d){var f=new W("gradient");f.x0_=c;f.y0_=e;f.x1_=Z;f.y1_=d;return f};I.createRadialGradient=function(e,g,d,c,f,Z){var h=new W("gradientradial");h.x0_=e;h.y0_=g;h.r0_=d;h.x1_=c;h.y1_=f;h.r1_=Z;return h};I.drawImage=function(s,e){var l,j,n,AA,q,o,u,AC;var m=s.runtimeStyle.width;var r=s.runtimeStyle.height;s.runtimeStyle.width="auto";s.runtimeStyle.height="auto";var k=s.width;var y=s.height;s.runtimeStyle.width=m;s.runtimeStyle.height=r;if(arguments.length==3){l=arguments[1];j=arguments[2];q=o=0;u=n=k;AC=AA=y}else{if(arguments.length==5){l=arguments[1];j=arguments[2];n=arguments[3];AA=arguments[4];q=o=0;u=k;AC=y}else{if(arguments.length==9){q=arguments[1];o=arguments[2];u=arguments[3];AC=arguments[4];l=arguments[5];j=arguments[6];n=arguments[7];AA=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AB=this.getCoords_(l,j);var f=u/2;var c=AC/2;var z=[];var Z=10;var i=10;z.push(" <g_vml_:group",' coordsize="',A*Z,",",A*i,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",i,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]){var g=[];g.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",S(AB.x/A),",","Dy=",S(AB.y/A),"");var x=AB;var v=this.getCoords_(l+n,j);var t=this.getCoords_(l,j+AA);var p=this.getCoords_(l+n,j+AA);x.x=R.max(x.x,v.x,t.x,p.x);x.y=R.max(x.y,v.y,t.y,p.y);z.push("padding:0 ",S(x.x/A),"px ",S(x.y/A),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",g.join(""),", sizingmethod='clip');")}else{z.push("top:",S(AB.y/A),"px;left:",S(AB.x/A),"px;")}z.push(' ">','<g_vml_:image src="',s.src,'"',' style="width:',A*n,"px;"," height:",A*AA,'px;"',' cropleft="',q/k,'"',' croptop="',o/y,'"',' cropright="',(k-q-u)/k,'"',' cropbottom="',(y-o-AC)/y,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",z.join(""))};I.stroke=function(AE){var j=[];var k=false;var AP=C(AE?this.fillStyle:this.strokeStyle);var AA=AP.color;var AK=AP.alpha*this.globalAlpha;var f=10;var m=10;j.push("<g_vml_:shape",' filled="',!!AE,'"',' style="position:absolute;width:',f,"px;height:",m,'px;"',' coordorigin="0 0" coordsize="',A*f," ",A*m,'"',' stroked="',!AE,'"',' path="');var l=false;var AO={x:null,y:null};var w={x:null,y:null};for(var AJ=0;AJ<this.currentPath_.length;AJ++){var AI=this.currentPath_[AJ];var AN;switch(AI.type){case"moveTo":AN=AI;j.push(" m ",S(AI.x),",",S(AI.y));break;case"lineTo":j.push(" l ",S(AI.x),",",S(AI.y));break;case"close":j.push(" x ");AI=null;break;case"bezierCurveTo":j.push(" c ",S(AI.cp1x),",",S(AI.cp1y),",",S(AI.cp2x),",",S(AI.cp2y),",",S(AI.x),",",S(AI.y));break;case"at":case"wa":j.push(" ",AI.type," ",S(AI.x-this.arcScaleX_*AI.radius),",",S(AI.y-this.arcScaleY_*AI.radius)," ",S(AI.x+this.arcScaleX_*AI.radius),",",S(AI.y+this.arcScaleY_*AI.radius)," ",S(AI.xStart),",",S(AI.yStart)," ",S(AI.xEnd),",",S(AI.yEnd));break}if(AI){if(AO.x==null||AI.x<AO.x){AO.x=AI.x}if(w.x==null||AI.x>w.x){w.x=AI.x}if(AO.y==null||AI.y<AO.y){AO.y=AI.y}if(w.y==null||AI.y>w.y){w.y=AI.y}}}j.push(' ">');if(!AE){var v=this.lineScale_*this.lineWidth;if(v<1){AK*=v}j.push("<g_vml_:stroke",' opacity="',AK,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',P(this.lineCap),'"',' weight="',v,'px"',' color="',AA,'" />')}else{if(typeof this.fillStyle=="object"){var n=this.fillStyle;var t=0;var AH={x:0,y:0};var AB=0;var r=1;if(n.type_=="gradient"){var q=n.x0_/this.arcScaleX_;var d=n.y0_/this.arcScaleY_;var o=n.x1_/this.arcScaleX_;var AQ=n.y1_/this.arcScaleY_;var AM=this.getCoords_(q,d);var AL=this.getCoords_(o,AQ);var h=AL.x-AM.x;var g=AL.y-AM.y;t=Math.atan2(h,g)*180/Math.PI;if(t<0){t+=360}if(t<0.000001){t=0}}else{var AM=this.getCoords_(n.x0_,n.y0_);var Z=w.x-AO.x;var e=w.y-AO.y;AH={x:(AM.x-AO.x)/Z,y:(AM.y-AO.y)/e};Z/=this.arcScaleX_*A;e/=this.arcScaleY_*A;var AG=R.max(Z,e);AB=2*n.r0_/AG;r=2*n.r1_/AG-AB}var z=n.colors_;z.sort(function(i,c){return i.offset-c.offset});var u=z.length;var y=z[0].color;var x=z[u-1].color;var AD=z[0].alpha*this.globalAlpha;var AC=z[u-1].alpha*this.globalAlpha;var AF=[];for(var AJ=0;AJ<u;AJ++){var s=z[AJ];AF.push(s.offset*r+AB+" "+s.color)}j.push('<g_vml_:fill type="',n.type_,'"',' method="none" focus="100%"',' color="',y,'"',' color2="',x,'"',' colors="',AF.join(","),'"',' opacity="',AC,'"',' g_o_:opacity2="',AD,'"',' angle="',t,'"',' focusposition="',AH.x,",",AH.y,'" />')}else{j.push('<g_vml_:fill color="',AA,'" opacity="',AK,'" />')}}j.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",j.join(""))};I.fill=function(){this.stroke(true)};I.closePath=function(){this.currentPath_.push({type:"close"})};I.getCoords_=function(d,c){var Z=this.m_;return{x:A*(d*Z[0][0]+c*Z[1][0]+Z[2][0])-K,y:A*(d*Z[0][1]+c*Z[1][1]+Z[2][1])-K}};I.save=function(){var Z={};T(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=D(N(),this.m_)};I.restore=function(){T(this.aStack_.pop(),this);this.m_=this.mStack_.pop()};I.translate=function(d,c){var Z=[[1,0,0],[0,1,0],[d,c,1]];this.m_=D(Z,this.m_)};I.rotate=function(d){var f=a(d);var e=O(d);var Z=[[f,e,0],[-e,f,0],[0,0,1]];this.m_=D(Z,this.m_)};I.scale=function(f,e){this.arcScaleX_*=f;this.arcScaleY_*=e;var c=[[f,0,0],[0,e,0],[0,0,1]];var Z=this.m_=D(c,this.m_);var d=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];this.lineScale_=Y(J(d))};I.clip=function(){};I.arcTo=function(){};I.createPattern=function(){return new F};function W(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}W.prototype.addColorStop=function(c,Z){Z=C(Z);this.colors_.push({offset:c,color:Z.color,alpha:Z.alpha})};function F(){}G_vmlCanvasManager=H;CanvasRenderingContext2D=M;CanvasGradient=W;CanvasPattern=F})()};

jqplot.axisTickRenderer.js

-(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';
-        // 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;
-        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 = 4;
-        // prop: show
-        // wether or not to show the tick (mark and label).
-        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: 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 = '0.75em';
-        // prop: textColor
-        // css spec for the color attribute.
-        this.textColor = '';
-        this._elem;
-        
-        $.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;
-        var pox = '15px';
-        switch (axisName) {
-            case 'xaxis':
-                this._styles = {position:'absolute', top:'0px', left:pox, paddingTop:'10px'};
-                break;
-            case 'x2axis':
-                this._styles = {position:'absolute', bottom:'0px', left:pox, paddingBottom:'10px'};
-                break;
-            case 'yaxis':
-                this._styles = {position:'absolute', left:'0px', top:pox, paddingRight:'10px'};
-                break;
-            case 'y2axis':
-                this._styles = {position:'absolute', right:'0px', top:pox, paddingLeft:'10px'};
-                break;
-        }
-        if (isMinor) this.isMinorTick = true;
-        return this;
-    };
-    
-    $.jqplot.AxisTickRenderer.prototype.draw = function() {
-        if (!this.label) this.label = this.formatter(this.formatString, this.value);
-        style='';
-        if (Number(this.label)) style='style="white-space:nowrap;" ';
-        this._elem = $('<div '+style+'class="jqplot-axis-tick">'+this.label+'</div>');
-        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);
-        return this._elem;
-    };
-        
-    $.jqplot.DefaultTickFormatter = function (format, val) {
-        if (typeof val == 'number') {
-            if (!format) format = '%.1f';
-            return $.jqplot.sprintf(format, val);
-        }
-        else return String(val);
-    }
-})(jQuery);

jqplot.canvasGridRenderer.js

-(function($) {     
-    $.jqplot.CanvasGridRenderer = function(){};
-    
-    // called with context of Grid object
-    $.jqplot.CanvasGridRenderer.prototype.init = function(options) {
-        this._ctx;
-        $.extend(true, this, options);
-    }
-    
-    // called with context of Grid.
-    $.jqplot.CanvasGridRenderer.prototype.createElement = function() {
-        var elem = document.createElement('canvas');
-        var w = this._plotDimensions.width;
-        var h = this._plotDimensions.height;
-        elem.width = w;
-        elem.height = h;
-        if ($.browser.msie) // excanvas hack
-            elem = window.G_vmlCanvasManager.initElement(elem);
-        this._elem = $(elem);
-        this._elem.css({ position: 'absolute', left: 0, top: 0 });
-        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;
-        return this._elem;
-    };
-    //     
-    //     this.overlayCanvas = document.createElement('canvas');
-    //     this.overlayCanvas.width = this._width;
-    //     this.overlayCanvas.height = this._height;
-    //     if ($.browser.msie) // excanvas hack
-    //         this.overlayCanvas = window.G_vmlCanvasManager.initElement(this.overlayCanvas);
-    //     $(this.overlayCanvas).css({ position: 'absolute', left: 0, top: 0 });
-    //     this.target.append(this.overlayCanvas);
-    //     this.octx = this.overlayCanvas.getContext("2d");
-    // };
-    
-    $.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.fillStyle = this.background;
-        ctx.fillRect(this._left, this._top, this._width, this._height);
-        
-        if (this.drawGridlines) {
-            ctx.save();
-            ctx.lineJoin = 'miter';
-            ctx.lineCap = 'round';
-            ctx.lineWidth = 1;
-            ctx.strokeStyle = '#cccccc';
-            for (var name in axes) {
-                var axis = axes[name];
-                var ticks = axis._ticks;
-                if (axis.show) {
-                    for (var i=0; i<ticks.length; i++) {
-                        var t = axis._ticks[i];
-                        if (t.show && t.showGridline) {
-                            var pos = Math.round(axis.u2p(t.value)) + 0.5;
-                            switch (name) {
-                                case 'xaxis':
-                                    drawLine(pos, this._top, pos, this._bottom);
-                                    break;
-                                case 'yaxis':
-                                    drawLine(this._right, pos, this._left, pos);
-                                    break;
-                                case 'x2axis':
-                                    drawLine(pos, this._bottom, pos, this._top);
-                                    break;
-                                case 'y2axis':
-                                    drawLine(this._left, pos, this._right, pos);
-                                    break;
-                            }
-                        }
-                    }
-                }
-            }
-            ctx.restore();
-        }
-        
-        function drawLine(bx, by, ex, ey) {
-            ctx.beginPath();
-            ctx.moveTo(bx, by);
-            ctx.lineTo(ex, ey);
-            ctx.stroke();
-        }
-        // Now draw the tick marks.
-        ctx.save();
-        ctx.lineJoin = 'miter';
-        ctx.lineCap = 'round';
-        ctx.lineWidth = 1;
-        ctx.strokeStyle = '#cccccc';
-        for (var name in axes) {
-            var axis = axes[name];
-            if (axis.show) {
-                var t = axis._ticks;
-                for (var i=0; i<t.length; i++) {
-                    if (t[i].show && t[i].showMark && t[i].mark) {
-                        s = t[i].markSize;
-                        m = t[i].mark;
-                        var pos = Math.round(axis.u2p(t[i].value)) + 0.5;
-                        var b, e;
-                        switch (name)     {
-                            case 'xaxis':
-                                switch (m) {
-                                    case 'inside':
-                                        b = this._bottom-s;
-                                        e = this._bottom;
-                                        break;
-                                    case 'outside':
-                                        b = this._bottom;
-                                        e = this._bottom+s;
-                                        break;
-                                    case 'cross':
-                                        b = this._bottom-s;
-                                        e = this._bottom+s;
-                                        break;
-                                    default:
-                                        b = this._bottom;
-                                        e = this._bottom+s;
-                                        break;
-                                }
-                                drawLine(pos, b, pos, e);
-                                break;
-                            case 'yaxis':
-                                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;
-                                }
-                                drawLine(b, pos, e, pos);
-                                break;
-                            case 'x2axis':
-                                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;
-                                }
-                                drawLine(pos, b, pos, e);
-                                break;
-                            case 'y2axis':
-                                switch (m) {
-                                    case 'inside':
-                                        b = this._right-s;
-                                        e = this._right;
-                                        break;
-                                    case 'outside':
-                                        b = this._right;
-                                        e = this._right+s;
-                                        break;
-                                    case 'cross':
-                                        b = this._right-s;
-                                        e = this._right+s;
-                                        break;
-                                    default:
-                                        b = this._right;
-                                        e = this._right+s;
-                                        break;
-                                }
-                                drawLine(b, pos, e, pos);
-                                break;
-                        }
-                    }
-                }
-            }
-        }
-        ctx.restore();
-        ctx.lineWidth = this.borderWidth;
-        ctx.strokeStyle = this.borderColor;
-        ctx.strokeRect(this._left, this._top, this._width, this._height);
-        
-        // now draw the shadow
-        if (this.shadow) {
-            ctx.save();
-            for (var j=0; j<this.shadowDepth; j++) {
-                ctx.translate(Math.cos(this.shadowAngle*Math.PI/180)*this.shadowOffset, Math.sin(this.shadowAngle*Math.PI/180)*this.shadowOffset);
-                ctx.lineWidth = this.shadowWidth;
-                ctx.strokeStyle = 'rgba(0,0,0,'+this.shadowAlpha+')';
-                ctx.lineJoin = 'miter';
-                ctx.lineCap = 'round';
-                ctx.beginPath();
-                ctx.moveTo(this._left, this._bottom);
-                ctx.lineTo(this._right, this._bottom);
-                ctx.lineTo(this._right, this._top);
-                ctx.stroke();
-                //ctx.strokeRect(this._left, this._top, this._width, this._height);
-            }
-            ctx.restore();
-        }
-    
-        ctx.restore();
-    };
-})(jQuery); 

jqplot.categoryAxisRenderer.js

-(function($) {    
-    $.jqplot.CategoryAxisRenderer = function() {
-        $.jqplot.LinearAxisRenderer.call(this);
-    };
-    
-    $.jqplot.CategoryAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
-    $.jqplot.CategoryAxisRenderer.prototype.constructor = $.jqplot.CategoryAxisRenderer;
-    
-    $.jqplot.CategoryAxisRenderer.prototype.init = function(options){
-        $.extend(true, this, {tickOptions:{formatString:'%d'}}, options);
-        var db = this._dataBounds;
-        // Go through all the series attached to this axis and find
-        // the min/max bounds for this axis.
-        for (var i=0; i<this._series.length; i++) {
-            var s = this._series[i];
-            var d = s.data;
-            
-            for (var j=0; j<d.length; j++) { 
-                if (this.name == 'xaxis' || this.name == 'x2axis') {
-                    if (d[j][0] < db.min || db.min == null) db.min = d[j][0];
-                    if (d[j][0] > db.max || db.max == null) db.max = d[j][0];
-                }              
-                else {
-                    if (d[j][1] < db.min || db.min == null) db.min = d[j][1];
-                    if (d[j][1] > db.max || db.max == null) db.max = d[j][1];
-                }              
-            }
-        }
-    };
- 
-
-    $.jqplot.CategoryAxisRenderer.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;
-
-        // if we already have ticks, use them.
-        if (userTicks.length) {
-            this.min = 0.5;
-            this.max = userTicks.length + 0.5;
-            var range = this.max - this.min;
-            this.numberTicks = 2*userTicks.length + 1;
-            for (i=0; i<userTicks.length; i++){
-                tt = this.min + 2 * i * range / (this.numberTicks-1);
-                // need a marker before and after the tick
-                var t = new this.tickRenderer(this.tickOptions);
-                t.showLabel = false;
-                t.showMark = true;
-                t.showGridline = true;
-                t.setTick(tt, this.name);
-                this._ticks.push(t);
-                var t = new this.tickRenderer(this.tickOptions);
-                t.label = userTicks[i];
-                t.showLabel = true;
-                t.showMark = false;
-                t.showGridline = false;
-                t.setTick(tt+0.5, this.name);
-                this._ticks.push(t);
-            }
-            // now add the last tick at the end
-            var t = new this.tickRenderer(this.tickOptions);
-            t.showLabel = false;
-            t.showMark = true;
-            t.showGridline = true;
-            t.setTick(tt+1, this.name);
-            this._ticks.push(t);
-        }
-
-        // 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.min != null && this.max != null && this.numberTicks != null) {
-                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) != (this.max-this.min)/this.tickInterval) {
-                    this.tickInterval = null;
-                }
-            }
-        
-            // find out how many categories are in the lines and collect labels
-            var labels = [];
-            var numcats = 0;
-            var min = 0.5;
-            var max;
-            for (var i=0; i<this._series.length; i++) {
-                var s = this._series[i];
-                for (var j=0; j<s.data.length; j++) {
-                    var val = s.data[j][0];
-                    if ($.inArray(val, labels) == -1) {
-                        numcats += 1;      
-                        labels.push(val);
-                    }
-                    // for category axis, force the x values into category bins.
-                    s.data[j][0] = j+1;
-                }
-            }
-        
-            max = numcats + 0.5;
-            this.numberTicks = 2*numcats + 1;
-
-            var range = max - min;
-            this.min = min;
-            this.max = max;
-            var track = 0;
-            var maxVisibleTicks = parseInt(3+dim/45);
-            var skip = parseInt(numcats/maxVisibleTicks);
-
-
-            if (this.tickInterval == null) this.tickInterval = range / (this.numberTicks-1);
-            // if tickInterval is specified, we will ignore any computed maximum.
-            for (var i=0; i<this.numberTicks; i++){
-                tt = this.min + i * this.tickInterval;
-                var t = new this.tickRenderer(this.tickOptions);
-                // if even tick, it isn't a category, it's a divider
-                if (i/2 == parseInt(i/2)) {
-                    t.showLabel = false;
-                    t.showMark = true;
-                    t.showGridline = true;
-                }
-                else {
-                    if (skip>0 && track<skip) {
-                        t.showLabel = false;
-                        track += 1;
-                    }
-                    else {
-                        t.showLabel = true;
-                        track = 0;
-                    } 
-                    t.label = t.formatter(t.formatString, labels[(i-1)/2]);
-                    t.showMark = false;
-                    t.showGridline = false;
-                }
-                if (!this.showTicks) {
-                    t.showLabel = false;
-                    t.showMark = false;
-                }
-                else if (!this.showTickMarks) t.showMark = false;
-                t.setTick(tt, this.name);
-                this._ticks.push(t);
-            }
-        }
-    };
-    
-    
-})(jQuery);

jqplot.dateAxisRenderer.js

-(function($) {  
-    $.jqplot.DateAxisRenderer = function() {
-        $.jqplot.LinearAxisRenderer.call(this);
-    };
-    
-    $.jqplot.DateAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
-    $.jqplot.DateAxisRenderer.prototype.constructor = $.jqplot.DateAxisRenderer;
-    
-    $.jqplot.DateTickFormatter = function(format, val) {
-        if (!format) format = '%Y/%m/%d';
-        return Date.create(val).strftime(format);
-    }
-    
-    $.jqplot.DateAxisRenderer.prototype.init = function(options){
-        this.tickOptions.formatter = $.jqplot.DateTickFormatter;
-        this._tickInterval = null;
-        $.extend(true, this, options);
-        var db = this._dataBounds;
-        // Go through all the series attached to this axis and find
-        // the min/max bounds for this axis.
-        for (var i=0; i<this._series.length; i++) {
-            var s = this._series[i];
-            var d = s.data;
-            
-            for (var j=0; j<d.length; j++) { 
-                if (this.name == 'xaxis' || this.name == 'x2axis') {
-                    d[j][0] = Date.create(d[j][0]).getTime();
-                    if (d[j][0] < db.min || db.min == null) db.min = d[j][0];
-                    if (d[j][0] > db.max || db.max == null) db.max = d[j][0];
-                }              
-                else {
-                    d[j][1] = Date.create(d[j][1]).getTime();
-                    if (d[j][1] < db.min || db.min == null) db.min = d[j][1];
-                    if (d[j][1] > db.max || db.max == null) db.max = d[j][1];
-                }              
-            }
-        }
-    };
-    
-    $.jqplot.DateAxisRenderer.prototype.createTicks = function() {
-        // we're are operating on an axis here
-        var ticks = this._ticks;
-        var userTicks = this.ticks;
-        var name = this.name;
-        // databounds were set on axis initialization.
-        var db = this._dataBounds;
-        var dim, interval;
-        var min, max;
-        var pos1, pos2;
-        var tt, i;
-        
-        // if we already have ticks, use them.
-        // ticks must be in order of increasing value.
-        
-        if (userTicks.length) {
-            // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed
-            for (i=0; i<userTicks.length; i++){
-                var ut = userTicks[i];
-                var t = new this.tickRenderer(this.tickOptions);
-                if (ut.constructor == Array) {
-                    t.value = Date.create(ut[0]).getTime();
-                    t.label = ut[1];
-                    if (!this.showTicks) {
-                        t.showLabel = false;
-                        t.showMark = false;
-                    }
-                    else if (!this.showTickMarks) t.showMark = false;
-                    t.setTick(ut[0], this.name);
-                    this._ticks.push(t);
-                }
-                
-                else {
-                    t.value = Date.create(ut).getTime();
-                    if (!this.showTicks) {
-                        t.showLabel = false;
-                        t.showMark = false;
-                    }
-                    else if (!this.showTickMarks) t.showMark = false;
-                    t.setTick(t.value, 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)/1000, 'seconds'];
-        }
-        
-        // 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.min != null && this.max != null && this.numberTicks != null) {
-                this.tickInterval = null;
-            }
-            
-            // if user specified a tick interval, convert to usable.
-            if (this.tickInterval != null)
-            {
-                // if interval is a number or can be converted to one, use it.
-                // Assume it is in SECONDS!!!
-                if (Number(this.tickInterval)) {
-                    this._tickInterval = [Number(this.tickInterval), 'seconds'];
-                }
-                // else, parse out something we can build from.
-                else if (typeof this.tickInterval == "string") {
-                    var parts = this.tickInterval.split(' ');
-                    if (parts.length == 1) {
-                        this._tickInterval = [1, parts[0]];
-                    }
-                    else if (parts.length == 2) {
-                        this._tickInterval = [parts[0], parts[1]]
-                    }
-                }
-            }
-        
-            min = ((this.min != null) ? Date.create(this.min).getTime() : db.min);
-            max = ((this.max != null) ? Date.create(this.max).getTime() : db.max);
-
-            var range = max - min;
-            var rmin, rmax;
-        
-            rmin = (this.min != null) ? Date.create(this.min).getTime() : min - range/2*(this.pad - 1);
-            rmax = (this.max != null) ? Date.create(this.max).getTime() : max + range/2*(this.pad - 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) {
-                    var nc = Date.create(this.max).diff(this.min, this._tickInterval[1], true);
-                    this.numberTicks = Math.ceil(nc/this._tickInterval[0]) +1;
-                    //log(this._tickInterval, nc, this.numberTicks);
-                    this.max = Date.create(this.min).add(this.numberTicks-1, this._tickInterval[1]).getTime();
-                }
-                else if (dim > 100) {
-                    this.numberTicks = parseInt(3+(dim-100)/75);
-                }
-                else this.numberTicks = 2;
-            }
-    
-            if (this._tickInterval == null) this._tickInterval = [range / (this.numberTicks-1)/1000, 'seconds'];
-            for (var i=0; i<this.numberTicks; i++){
-                var min = Date.create(this.min);
-                tt = min.add(i*this._tickInterval[0], this._tickInterval[1]).getTime();
-                var t = new this.tickRenderer(this.tickOptions);
-                // var t = new $.jqplot.AxisTickRenderer(this.tickOptions);
-                if (!this.showTicks) {
-                    t.showLabel = false;
-                    t.showMark = false;
-                }
-                else if (!this.showTickMarks) t.showMark = false;
-                t.setTick(tt, this.name);
-                this._ticks.push(t);
-            }
-        }
-    };
-    
-    
-    
-    /**
-     * Date instance methods
-     *
-     * @author Ken Snyder (ken d snyder at gmail dot com)
-     * @date 2008-09-10
-     * @version 2.0.2 (
-http://kendsnyder.com/sandbox/date/)     * @license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
-     *
-     * @contributions Chris Leonello
-     * @comment Bug fix to 12 hour time and additions to handle milliseconds and 
-     * @comment 24 hour time without am/pm suffix
-     *
-     */
- 
-    // begin by creating a scope for utility variables
-    
-    //
-    // pre-calculate the number of milliseconds in a day
-    //  
-    
-    var day = 24 * 60 * 60 * 1000;
-    //
-    // function to add leading zeros
-    //
-    var zeroPad = function(number, digits) {
-        number = String(number);
-        while (number.length < digits) number = '0' + number;
-        return number;
-    };
-    //
-    // set up integers and functions for adding to a date or subtracting two dates
-    //
-    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
-    //
-    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 date instance and a format code and return the formatted value
-    //
-    var format = function(d, code) {
-            if (Date.prototype.strftime.formatShortcuts[code]) {
-                    // process any shortcuts recursively
-                    return d.strftime(Date.prototype.strftime.formatShortcuts[code]);
-            } else {
-                    // get the format code function and toPaddedString() argument
-                    var getter = (Date.prototype.strftime.formatCodes[code] || '').split('.');
-                    var nbr = d['get' + getter[0]] ? d['get' + getter[0]]() : '';
-                    // run toPaddedString() if specified
-                    if (getter[1]) nbr = zeroPad(nbr, getter[1]);
-                    // prepend the leading character
-                    return nbr;
-            }       
-    };
-    //
-    // Add methods to Date instances
-    //
-    var instanceMethods = {
-        //
-        // Return a date one day ahead (or any other unit)
-        //
-        // @param string unit
-        // units: year | month | day | week | hour | minute | second | millisecond
-        // @return object Date
-        //
-        succ: function(unit) {
-            return this.clone().add(1, unit);
-        },
-        //
-        // Add an arbitrary amount to the currently stored date
-        //
-        // @param integer/float number      
-        // @param string unit
-        // @return object Date (chainable)      
-        //
-        add: function(number, unit) {
-            var factor = multipliers[unit] || multipliers.day;
-            if (typeof factor == 'number') {
-                this.setTime(this.getTime() + (factor * number));
-            } else {
-                factor.add(this, number);
-            }
-            return this;
-        },
-        //
-        // Find the difference between the current and another date
-        //
-        // @param string/object dateObj
-        // @param string unit
-        // @param boolean allowDecimal
-        // @return integer/float
-        //
-        diff: function(dateObj, unit, allowDecimal) {
-            // ensure we have a Date object
-            dateObj = Date.create(dateObj);
-            if (dateObj === null) return null;
-            // get the multiplying factor integer or factor function
-            var factor = multipliers[unit] || multipliers.day;
-            if (typeof factor == 'number') {
-                // multiply
-                var unitDiff = (this.getTime() - dateObj.getTime()) / factor;
-            } else {
-                // run function
-                var unitDiff = factor.diff(this, dateObj);
-            }
-            // if decimals are not allowed, round toward zero
-            return (allowDecimal ? unitDiff : Math[unitDiff > 0 ? 'floor' : 'ceil'](unitDiff));          
-        },
-        //
-        // Convert a date to a string using traditional strftime format codes
-        //
-        // @param string formatStr
-        // @return string
-        //
-        strftime: function(formatStr) {
-            // default the format string to year-month-day
-            var source = formatStr || '%Y-%m-%d', result = '', match;
-            // replace each format code
-            while (source.length > 0) {
-                if (match = source.match(Date.prototype.strftime.formatCodes.matcher)) {
-                    result += source.slice(0, match.index);
-                    result += (match[1] || '') + format(this, match[2]);
-                    source = source.slice(match.index + match[0].length);
-                } else {
-                    result += source, source = '';
-                }
-            }
-            return result;
-        },
-        //
-        // Return a proper two-digit year integer
-        //
-        // @return integer
-        //
-        getShortYear: function() {
-            return this.getYear() % 100;
-        },
-        //
-        // Get the number of the current month, 1-12
-        //
-        // @return integer
-        //
-        getMonthNumber: function() {
-            return this.getMonth() + 1;
-        },
-        //
-        // Get the name of the current month
-        //
-        // @return string
-        //
-        getMonthName: function() {
-            return Date.MONTHNAMES[this.getMonth()];
-        },
-        //
-        // Get the abbreviated name of the current month
-        //
-        // @return string
-        //
-        getAbbrMonthName: function() {
-            return Date.ABBR_MONTHNAMES[this.getMonth()];
-        },
-        //
-        // Get the name of the current week day
-        //
-        // @return string
-        //      
-        getDayName: function() {
-            return Date.DAYNAMES[this.getDay()];
-        },
-        //
-        // Get the abbreviated name of the current week day
-        //
-        // @return string
-        //      
-        getAbbrDayName: function() {
-            return Date.ABBR_DAYNAMES[this.getDay()];
-        },
-        //
-        // Get the ordinal string associated with the day of the month (i.e. st, nd, rd, th)
-        //
-        // @return string
-        //      
-        getDayOrdinal: function() {
-            return Date.ORDINALNAMES[this.getDate() % 10];
-        },
-        //
-        // Get the current hour on a 12-hour scheme
-        //
-        // @return integer
-        //
-        getHours12: function() {
-            var hours = this.getHours();
-            return hours > 12 ? hours - 12 : (hours == 0 ? 12 : hours);
-        },
-        //
-        // Get the AM or PM for the current time
-        //
-        // @return string
-        //
-        getAmPm: function() {
-            return this.getHours() >= 12 ? 'PM' : 'AM';
-        },
-        //
-        // Get the current date as a Unix timestamp
-        //
-        // @return integer
-        //
-        getUnix: function() {
-            return Math.round(this.getTime() / 1000, 0);
-        },
-        //
-        // Get the GMT offset in hours and minutes (e.g. +06:30)
-        //
-        // @return string
-        //
-        getGmtOffset: function() {
-            // divide the minutes offset by 60
-            var hours = this.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 + zeroPad(Math.floor(hours), 2) + ':' + zeroPad((hours % 1) * 60, 2);
-        },
-        //
-        // Get the browser-reported name for the current timezone (e.g. MDT, Mountain Daylight Time)
-        //
-        // @return string
-        //
-        getTimezoneName: function() {
-            var match = /(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());
-            return match[1] || match[2] || 'GMT' + this.getGmtOffset();
-        },
-        //
-        // Convert the current date to an 8-digit integer (%Y%m%d)
-        //
-        // @return int
-        //
-        toYmdInt: function() {
-            return (this.getFullYear() * 10000) + (this.getMonthNumber() * 100) + this.getDate();
-        },  
-        //
-        // Create a copy of a date object
-        //
-        // @return object
-        //       
-        clone: function() {
-                return new Date(this.getTime());
-        }
-    };
-    for (var name in instanceMethods) Date.prototype[name] = instanceMethods[name];
-    //
-    // Add static methods to the date object
-    //
-    var staticMethods = {
-        //
-        // The heart of the date functionality: returns a date object if given a convertable value
-        //
-        // @param string/object/integer date
-        // @return object Date
-        //
-        create: function(date) {
-            // If the passed value is already a date object, return it
-            if (date instanceof Date) return date;
-            // If the passed value is an integer, interpret it as a unix timestamp
-            // 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);
-            // If the passed value is a string, attempt to parse it using Date.parse()
-            var parsable = String(date).replace(/^\s*(.+)\s*$/, '$1'), i = 0, length = Date.create.patterns.length, pattern;
-            var current = parsable;
-            while (i < length) {
-                ms = Date.parse(current);
-                if (!isNaN(ms)) return new Date(ms);
-                pattern = Date.create.patterns[i];
-                if (typeof pattern == 'function') {
-                    obj = pattern(current);
-                    if (obj instanceof Date) return obj;
-                } else {
-                    current = parsable.replace(pattern[0], pattern[1]);
-                }
-                i++;
-            }
-            return NaN;
-        },
-        //
-        // constants representing month names, day names, and ordinal names
-        // (same names as Ruby Date constants)
-        //
-        MONTHNAMES          : 'January February March April May June July August September October November December'.split(' '),
-        ABBR_MONTHNAMES : 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '),
-        DAYNAMES                : 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' '),
-        ABBR_DAYNAMES       : 'Sun Mon Tue Wed Thu Fri Sat'.split(' '),
-        ORDINALNAMES        : 'th st nd rd th th th th th th'.split(' '),
-        //
-        // Shortcut for full ISO-8601 date conversion
-        //
-        ISO: '%Y-%m-%dT%H:%M:%S.%N%G',
-        //
-        // Shortcut for SQL-type formatting
-        //
-        SQL: '%Y-%m-%d %H:%M:%S',
-        //
-        // Setter method for month, day, and ordinal names for i18n
-        //
-        // @param object newNames
-        //
-        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];
-        }
-    };
-    for (var name in staticMethods) Date[name] = staticMethods[name];
-    //
-    // format codes for strftime
-    //
-    // each code must be an array where the first member is the name of a Date.prototype function
-    // and optionally a second member indicating the number to pass to Number#toPaddedString()
-    //
-    Date.prototype.strftime.formatCodes = {
-        //
-        // 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',
-        o: 'DayOrdinal',
-        // 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 that will be translated into their longer version
-    //
-    // be sure that format shortcuts do not refer to themselves: this will cause an infinite loop
-    //
-    Date.prototype.strftime.formatShortcuts = {
-        // 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',
-        '%': '%'
-    };
-    //
-    // A list of conversion patterns (array arguments sent directly to gsub)
-    // Add, remove or splice a patterns to customize date parsing ability
-    //
-    Date.create.patterns = [
-        [/-/g, '/'], // US-style time with dashes => Parsable US-style time
-        [/st|nd|rd|th/g, ''], // remove st, nd, rd and th        
-        [/(3[01]|[0-2]\d)\s*\.\s*(1[0-2]|0\d)\s*\.\s*([1-9]\d{3})/, '$2/$1/$3'], // World time => Parsable US-style time
-        [/([1-9]\d{3})\s*-\s*(1[0-2]|0\d)\s*-\s*(3[01]|[0-2]\d)/, '$2/$3/$1'], // ISO-style time => Parsable US-style time
-        function(str) { // 12-hour or 24 hour time with milliseconds
-            // var match = str.match(/^(?:(.+)\s+)?([1-9]|1[012])(?:\s*\:\s*(\d\d))?(?:\s*\:\s*(\d\d))?\s*(am|pm)\s*$/i);
-            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 = Date.create(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), parseInt(match[4] || 0), ((parseFloat(match[5] || 0)) || 0)*1000);
-                return d;
-            }
-            else {
-                return str;
-            }
-        },
-        function(str) { // ISO timestamp with time zone.
-            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 = Date.create(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]), parseInt(match[4]), parseFloat(match[5])*1000);
-                return d;
-            }
-            else {
-                    return str;
-            }
-        }               
-    ];
-    
-    if ($.jqplot.debug) $.date = Date.create;
-   
-})(jQuery);
-

jqplot.divTitleRenderer.js

-(function($) {    
-    $.jqplot.DivTitleRenderer = function() {
-    };
-    
-    $.jqplot.DivTitleRenderer.prototype.init = function(options) {
-        $.extend(true, this, options);
-    };
-    
-    $.jqplot.DivTitleRenderer.prototype.draw = function() {
-        var r = this.renderer;
-        if (!this.text) {
-            this.show = false;
-            this._elem = $('<div style="height:0px;width:0px;"></div>');
-        }
-        else if (this.text) {
-            var styletext = 'padding-bottom:0.5em;position:absolute;top:0px;left:0px;';
-            styletext += (this._plotWidth) ? 'width:'+this._plotWidth+'px;' : '';
-            styletext += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';
-            styletext += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';
-            styletext += (this.textAlign) ? 'text-align:'+this.textAlign+';' : '';
-            styletext += (this.textColor) ? 'color:'+this.textColor+';' : '';
-            this._elem = $('<div class="jqplot-title" style="'+styletext+'">'+this.text+'</div>');
-        }
-        
-        return this._elem;
-    };
-    
-    $.jqplot.DivTitleRenderer.prototype.pack = function() {
-        // nothing to do here
-    };
-})(jQuery);  

jqplot.lineRenderer.js

-(function($) {
-    $.jqplot.LineRenderer = function(){
-    };
-    
-    // called with scope of series.
-    $.jqplot.LineRenderer.prototype.init = function(options) {
-        $.extend(true, this.renderer, options);
-    };
-    
-    $.jqplot.LineRenderer.prototype.setGridData = function() {
-        // recalculate the grid data
-        var xp = this._xaxis.series_u2p;
-        var yp = this._yaxis.series_u2p;
-        this.gridData = [];
-        this.gridData.push([xp.call(this._xaxis, this.data[0][0]), yp.call(this._yaxis, this.data[0][1])]);