summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/fx/_base.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/fx/_base.js')
-rw-r--r--js/dojo/dojox/fx/_base.js320
1 files changed, 320 insertions, 0 deletions
diff --git a/js/dojo/dojox/fx/_base.js b/js/dojo/dojox/fx/_base.js
new file mode 100644
index 0000000..335b649
--- /dev/null
+++ b/js/dojo/dojox/fx/_base.js
@@ -0,0 +1,320 @@
+//>>built
+define("dojox/fx/_base", ["dojo/_base/array","dojo/_base/lang", "dojo/_base/fx", "dojo/fx", "dojo/dom", "dojo/dom-style",
+ "dojo/dom-geometry", "dojo/_base/connect", "dojo/_base/html"],
+ function(arrayUtil, lang, baseFx, coreFx, dom, domStyle, domGeom, connectUtil, htmlUtil){
+// summary: Experimental and extended Animations beyond Dojo Core / Base functionality.
+// Provides advanced Lines, Animations, and convenience aliases.
+var dojoxFx = lang.getObject("dojox.fx", true);
+/*
+lang.mixin(dojox.fx, {
+
+ // anim: Function
+ // Alias of `dojo.anim` - the shorthand `dojo.animateProperty` with auto-play
+ anim: dojo.fx.anim,
+
+ // animateProperty: Function
+ // Alias of `dojo.animateProperty` - animate any CSS property
+ animateProperty: dojox.fx.animateProperty,
+
+ // fadeTo: Function
+ // Fade an element from an opacity to an opacity.
+ // Omit `start:` property to detect. `end:` property is required.
+ // Ultimately an alias to `dojo._fade`
+ fadeTo: dojo._fade,
+
+ // fadeIn: Function
+ // Alias of `dojo.fadeIn` - Fade a node in.
+ fadeIn: dojo.fadeIn,
+
+ // fadeOut: Function
+ // Alias of `dojo.fadeOut` - Fades a node out.
+ fadeOut: dojo.fadeOut,
+
+ // combine: Function
+ // Alias of `dojo.fx.combine` - Run an array of animations in parallel
+ combine: dojo.fx.combine,
+
+ // chain: Function
+ // Alias of `dojo.fx.chain` - Run an array of animations in sequence
+ chain: dojo.fx.chain,
+
+ // slideTo: Function
+ // Alias of `dojo.fx.slideTo` - Slide a node to a defined top/left coordinate
+ slideTo: dojo.fx.slideTo,
+
+ // wipeIn: Function
+ // Alias of `dojo.fx.wipeIn` - Wipe a node to visible
+ wipeIn: dojo.fx.wipeIn,
+
+ // wipeOut: Function
+ // Alias of `dojo.fx.wipeOut` - Wipe a node to non-visible
+ wipeOut: dojo.fx.wipeOut
+
+});
+*/
+
+dojoxFx.sizeTo = function(/* Object */args){
+ // summary:
+ // Creates an animation that will size a node
+ //
+ // description:
+ // Returns an animation that will size the target node
+ // defined in args Object about it's center to
+ // a width and height defined by (args.width, args.height),
+ // supporting an optional method: chain||combine mixin
+ // (defaults to chain).
+ //
+ // - works best on absolutely or relatively positioned elements
+ //
+ // example:
+ // | // size #myNode to 400px x 200px over 1 second
+ // | dojo.fx.sizeTo({
+ // | node:'myNode',
+ // | duration: 1000,
+ // | width: 400,
+ // | height: 200,
+ // | method: "combine"
+ // | }).play();
+ //
+
+ var node = args.node = dom.byId(args.node),
+ abs = "absolute";
+
+ var method = args.method || "chain";
+ if(!args.duration){ args.duration = 500; } // default duration needed
+ if(method == "chain"){ args.duration = Math.floor(args.duration / 2); }
+
+ var top, newTop, left, newLeft, width, height = null;
+
+ var init = (function(n){
+ return function(){
+ var cs = domStyle.getComputedStyle(n),
+ pos = cs.position,
+ w = cs.width,
+ h = cs.height
+ ;
+
+ top = (pos == abs ? n.offsetTop : parseInt(cs.top) || 0);
+ left = (pos == abs ? n.offsetLeft : parseInt(cs.left) || 0);
+ width = (w == "auto" ? 0 : parseInt(w));
+ height = (h == "auto" ? 0 : parseInt(h));
+
+ newLeft = left - Math.floor((args.width - width) / 2);
+ newTop = top - Math.floor((args.height - height) / 2);
+
+ if(pos != abs && pos != 'relative'){
+ var ret = domStyle.coords(n, true);
+ top = ret.y;
+ left = ret.x;
+ n.style.position = abs;
+ n.style.top = top + "px";
+ n.style.left = left + "px";
+ }
+ }
+ })(node);
+
+ var anim1 = baseFx.animateProperty(lang.mixin({
+ properties: {
+ height: function(){
+ init();
+ return { end: args.height || 0, start: height };
+ },
+ top: function(){
+ return { start: top, end: newTop };
+ }
+ }
+ }, args));
+ var anim2 = baseFx.animateProperty(lang.mixin({
+ properties: {
+ width: function(){
+ return { start: width, end: args.width || 0 }
+ },
+ left: function(){
+ return { start: left, end: newLeft }
+ }
+ }
+ }, args));
+
+ var anim = coreFx[(args.method == "combine" ? "combine" : "chain")]([anim1, anim2]);
+ return anim; // dojo.Animation
+
+};
+
+dojoxFx.slideBy = function(/* Object */args){
+ // summary:
+ // Returns an animation to slide a node by a defined offset.
+ //
+ // description:
+ // Returns an animation that will slide a node (args.node) from it's
+ // current position to it's current posision plus the numbers defined
+ // in args.top and args.left. standard dojo.fx mixin's apply.
+ //
+ // example:
+ // | // slide domNode 50px down, and 22px left
+ // | dojox.fx.slideBy({
+ // | node: domNode, duration:400,
+ // | top: 50, left: -22
+ // | }).play();
+
+ var node = args.node = dom.byId(args.node),
+ top, left;
+
+ var init = (function(n){
+ return function(){
+ var cs = domStyle.getComputedStyle(n);
+ var pos = cs.position;
+ top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0);
+ left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0);
+ if(pos != 'absolute' && pos != 'relative'){
+ var ret = domGeom.coords(n, true);
+ top = ret.y;
+ left = ret.x;
+ n.style.position = "absolute";
+ n.style.top = top + "px";
+ n.style.left = left + "px";
+ }
+ }
+ })(node);
+ init();
+
+ var _anim = baseFx.animateProperty(lang.mixin({
+ properties: {
+ // FIXME: is there a way to update the _Line after creation?
+ // null start values allow chaining to work, animateProperty will
+ // determine them for us (except in ie6? -- ugh)
+ top: top + (args.top || 0),
+ left: left + (args.left || 0)
+ }
+ }, args));
+ connectUtil.connect(_anim, "beforeBegin", _anim, init);
+ return _anim; // dojo.Animation
+};
+
+dojoxFx.crossFade = function(/* Object */args){
+ // summary:
+ // Returns an animation cross fading two element simultaneously
+ //
+ // args:
+ // args.nodes: Array - two element array of domNodes, or id's
+ //
+ // all other standard animation args mixins apply. args.node ignored.
+ //
+
+ // simple check for which node is visible, maybe too simple?
+ var node1 = args.nodes[0] = dom.byId(args.nodes[0]),
+ op1 = htmlUtil.style(node1,"opacity"),
+ node2 = args.nodes[1] = dom.byId(args.nodes[1]),
+ op2 = htmlUtil.style(node2, "opacity")
+ ;
+
+ var _anim = coreFx.combine([
+ baseFx[(op1 == 0 ? "fadeIn" : "fadeOut")](lang.mixin({
+ node: node1
+ },args)),
+ baseFx[(op1 == 0 ? "fadeOut" : "fadeIn")](lang.mixin({
+ node: node2
+ },args))
+ ]);
+ return _anim; // dojo.Animation
+};
+
+dojoxFx.highlight = function(/*Object*/ args){
+ // summary:
+ // Highlight a node
+ //
+ // description:
+ // Returns an animation that sets the node background to args.color
+ // then gradually fades back the original node background color
+ //
+ // example:
+ // | dojox.fx.highlight({ node:"foo" }).play();
+
+ var node = args.node = dom.byId(args.node);
+
+ args.duration = args.duration || 400;
+
+ // Assign default color light yellow
+ var startColor = args.color || '#ffff99',
+ endColor = htmlUtil.style(node, "backgroundColor")
+ ;
+
+ // safari "fix"
+ // safari reports rgba(0, 0, 0, 0) (black) as transparent color, while
+ // other browsers return "transparent", rendered as white by default by
+ // dojo.Color; now dojo.Color maps "transparent" to
+ // djConfig.transparentColor ([r, g, b]), if present; so we can use
+ // the color behind the effect node
+ if(endColor == "rgba(0, 0, 0, 0)"){
+ endColor = "transparent";
+ }
+
+ var anim = baseFx.animateProperty(lang.mixin({
+ properties: {
+ backgroundColor: { start: startColor, end: endColor }
+ }
+ }, args));
+
+ if(endColor == "transparent"){
+ connectUtil.connect(anim, "onEnd", anim, function(){
+ node.style.backgroundColor = endColor;
+ });
+ }
+
+ return anim; // dojo.Animation
+};
+
+
+dojoxFx.wipeTo = function(/*Object*/ args){
+ // summary:
+ // Animate a node wiping to a specific width or height
+ //
+ // description:
+ // Returns an animation that will expand the
+ // node defined in 'args' object from it's current to
+ // the height or width value given by the args object.
+ //
+ // default to height:, so leave height null and specify width:
+ // to wipeTo a width. note: this may be deprecated by a
+ //
+ // Note that the final value should not include
+ // units and should be an integer. Thus a valid args object
+ // would look something like this:
+ //
+ // | dojox.fx.wipeTo({ node: "nodeId", height: 200 }).play();
+ //
+ // Node must have no margin/border/padding, so put another
+ // node inside your target node for additional styling.
+
+ args.node = dom.byId(args.node);
+ var node = args.node, s = node.style;
+
+ var dir = (args.width ? "width" : "height"),
+ endVal = args[dir],
+ props = {}
+ ;
+
+ props[dir] = {
+ // wrapped in functions so we wait till the last second to query (in case value has changed)
+ start: function(){
+ // start at current [computed] height, but use 1px rather than 0
+ // because 0 causes IE to display the whole panel
+ s.overflow = "hidden";
+ if(s.visibility == "hidden" || s.display == "none"){
+ s[dir] = "1px";
+ s.display = "";
+ s.visibility = "";
+ return 1;
+ }else{
+ var now = htmlUtil.style(node,dir);
+ return Math.max(now, 1);
+ }
+ },
+ end: endVal
+ };
+
+ var anim = baseFx.animateProperty(lang.mixin({ properties: props }, args));
+ return anim; // dojo.Animation
+};
+
+return dojoxFx;
+});