Merge branch 'master' of github.com:DmitryBaranovskiy/raphael
authorDmitry Baranovskiy <dmitry@baranovskiy.com>
Fri, 18 Nov 2011 00:40:13 +0000 (11:40 +1100)
committerDmitry Baranovskiy <dmitry@baranovskiy.com>
Fri, 18 Nov 2011 00:40:13 +0000 (11:40 +1100)
1  2 
raphael.core.js

diff --combined raphael.core.js
@@@ -1,5 -1,5 +1,5 @@@
  // ┌─────────────────────────────────────────────────────────────────────┐ \\
 -// │ "Raphaël 2.0" - JavaScript Vector Library                           │ \\
 +// │ "Raphaël 2.0.1" - JavaScript Vector Library                         │ \\
  // ├─────────────────────────────────────────────────────────────────────┤ \\
  // │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com)   │ \\
  // │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com)             │ \\
@@@ -26,7 -26,7 +26,7 @@@
       - height (number)
       - callback (function) #optional callback function which is going to be executed in the context of newly created paper
       * or
 -     - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, <attributes>})
 +     - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, <attributes>}). See @Paper.add.
       - callback (function) #optional callback function which is going to be executed in the context of newly created paper
       * or
       - onReadyCallback (function) function that is going to be called on DOM ready event. You can also subscribe to this event via Eve’s “DOMLoad” event. In this case method returns `undefined`.
          if (R.is(first, "function")) {
              return loaded ? first() : eve.on("DOMload", first);
          } else if (R.is(first, array)) {
 -            var a = first,
 -                cnv = R._engine.create[apply](R, a.splice(0, 3 + R.is(a[0], nu))),
 -                res = cnv.set(),
 -                i = 0,
 -                ii = a.length,
 -                j;
 -            for (; i < ii; i++) {
 -                j = a[i] || {};
 -                elements[has](j.type) && res.push(cnv[j.type]().attr(j));
 -            }
 -            return res;
 +            return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first);
          } else {
              var args = Array.prototype.slice.call(arguments, 0);
              if (R.is(args[args.length - 1], "function")) {
@@@ -73,7 -83,7 +73,7 @@@
              }
          }
      }
 -    R.version = "2.0.0";
 +    R.version = "2.0.1";
      R.eve = eve;
      var loaded,
          separator = /[, ]+/,
              gradient: 0,
              height: 0,
              href: "http://raphaeljs.com/",
 +            "letter-spacing": 0,
              opacity: 1,
              path: "M0,0",
              r: 0,
              if (!matrix) {
                  return path;
              }
 -            var x, y, i, j, pathi;
 +            var x, y, i, j, ii, jj, pathi;
              path = path2curve(path);
              for (i = 0, ii = path.length; i < ii; i++) {
                  pathi = path[i];
       **
       * You can add your own method to the canvas. For example if you want to draw a pie chart,
       * you can create your own pie chart function and ship it as a Raphaël plugin. To do this
-      * you need to extend the `Raphael.fn` object. Please note that you can create your own namespaces
-      * inside the `fn` object — methods will be run in the context of canvas anyway. You should alter
-      * the `fn` object before a Raphaël instance is created, otherwise it will take no effect.
+      * you need to extend the `Raphael.fn` object. You should modify the `fn` object before a
+      * Raphaël instance is created, otherwise it will take no effect. Please note that the
+      * ability for namespaced plugins was removed in Raphael 2.0. It is up to the plugin to
+      * ensure any namespacing ensures proper context.
       > Usage
       | Raphael.fn.arrow = function (x1, y1, x2, y2, size) {
       |     return this.path( ... );
          eve("setWindow", R, g.win, newwin);
          g.win = newwin;
          g.doc = g.win.document;
 -        if (initWin) {
 -            initWin(g.win);
 +        if (R._engine.initWin) {
 +            R._engine.initWin(g.win);
          }
      };
      var toHex = function (color) {
                  clr.v = rgb.b;
              } else {
                  clr = {hex: "none"};
 -                crl.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;
 +                clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;
              }
          }
          clr.toString = rgbtoString;
  
      var preload = R._preload = function (src, f) {
          var img = g.doc.createElement("img");
 -        img.style.cssText = "position:absolute;left:-9999em;top-9999em";
 +        img.style.cssText = "position:absolute;left:-9999em;top:-9999em";
          img.onload = function () {
              f.call(this);
              this.onload = null;
              alpha: alpha
          };
      };
 +    R._removedFactory = function (methodname) {
 +        return function () {
 +            throw new Error("Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object");
 +        };
 +    };
      var pathDimensions = cacher(function (path) {
          if (!path) {
              return {x: 0, y: 0, width: 0, height: 0};
              el2.prev = el;
              el.next = el2;
          },
 -        removed = function (methodname) {
 -            return function () {
 -                throw new Error("Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object");
 -            };
 -        },
          extractTransform = R._extractTransform = function (el, tstr) {
              if (tstr == null) {
                  return el._.transform;
          matrixproto.toTransformString = function (shorter) {
              var s = shorter || this[split]();
              if (s.isSimple) {
 -                return "t" + [s.dx, s.dy] + "s" + [s.scalex, s.scaley, 0, 0] + "r" + [s.rotate, 0, 0];
 +                s.scalex = +s.scalex.toFixed(4);
 +                s.scaley = +s.scaley.toFixed(4);
 +                s.rotate = +s.rotate.toFixed(4);
 +                return  (s.dx && s.dy ? "t" + [s.dx, s.dy] : E) + 
 +                        (s.scalex != 1 || s.scaley != 1 ? "s" + [s.scalex, s.scaley, 0, 0] : E) +
 +                        (s.rotate ? "r" + [s.rotate, 0, 0] : E);
              } else {
                  return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];
              }
      elproto.unhover = function (f_in, f_out) {
          return this.unmouseover(f_in).unmouseout(f_out);
      };
 +    var draggable = [];
      /*\
       * Element.drag
       [ method ]
              eve("drag.start." + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e);
          }
          this._drag = {};
 +        draggable.push({el: this, start: start});
          this.mousedown(start);
          return this;
      };
       * Removes all drag event handlers from given element.
      \*/
      elproto.undrag = function () {
 -        var i = drag.length;
 -        while (i--) if (drag[i].el == this) {
 -            R.unmousedown(drag[i].start);
 -            drag.splice(i++, 1);
 +        var i = draggable.length;
 +        while (i--) if (draggable[i].el == this) {
 +            this.unmousedown(draggable[i].start);
 +            draggable.splice(i, 1);
              eve.unbind("drag.*." + this.id);
          }
 -        !drag.length && R.unmousemove(dragMove).unmouseup(dragUp);
 +        !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp);
      };
      /*\
       * Paper.circle
       = (object) original element
      \*/
      elproto.animateWith = function (element, anim, params, ms, easing, callback) {
 -        var a = params ? R.animation(params, ms, easing, callback) : anim;
 +        var a = params ? R.animation(params, ms, easing, callback) : anim,
              status = element.status(anim);
          return this.animate(a).status(a, status * anim.ms / a.ms);
      };
              return;
          }
          if (!isInAnim) {
 -            for (attr in params) if (params[has](attr)) {
 +            for (var attr in params) if (params[has](attr)) {
                  if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) {
                      from[attr] = element.attr(attr);
                      (from[attr] == null) && (from[attr] = availableAttrs[attr]);
          return out;
      };
  
 +    /*\
 +     * Paper.add
 +     [ method ]
 +     **
 +     * Imports elements in JSON array in format `{type: type, <attributes>}`
 +     **
 +     > Parameters
 +     **
 +     - json (array)
 +     = (object) resulting set of imported elements
 +     > Usage
 +     | paper.import([
 +     |     {
 +     |         type: "circle",
 +     |         cx: 10,
 +     |         cy: 10,
 +     |         r: 5
 +     |     },
 +     |     {
 +     |         type: "rect",
 +     |         x: 10,
 +     |         y: 10,
 +     |         width: 10,
 +     |         height: 10,
 +     |         fill: "#fc0"
 +     |     }
 +     | ]);
 +    \*/
 +    paperproto.add = function (json) {
 +        if (R.is(json, "array")) {
 +            var res = this.set(),
 +                i = 0,
 +                ii = json.length,
 +                j;
 +            for (; i < ii; i++) {
 +                j = json[i] || {};
 +                elements[has](j.type) && res.push(this[j.type]().attr(j));
 +            }
 +        }
 +        return res;
 +    };
 +
      /*\
       * Raphael.format
       [ method ]
       |     width = 40,
       |     height = 50;
       | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z"
-      | paper.path(Raphael.format("M{1},{2}h{3}v{4}h{5}z", x, y, width, height, -width));
+      | paper.path(Raphael.format("M{0},{1}h{2}v{3}h{4}z", x, y, width, height, -width));
      \*/
      R.format = function (token, params) {
          var args = R.is(params, array) ? [0][concat](params) : arguments;
      eve.on("DOMload", function () {
          loaded = true;
      });
- })();
+ })();