123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.fx.ext-dojo.complex"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.fx.ext-dojo.complex"] = true;
- dojo.provide("dojox.fx.ext-dojo.complex");
- (function(){
- var da = dojo.animateProperty;
- dojo.animateProperty = function(options){
- // summary:
- // An extension of dojo.animateProperty which adds functionality
- // that animates a "complex property". The primary example is the
- // clip style: rect(10px 30px 10px 50px).
- // Note this can also be used with (and is actually intended for)
- // CSS3 properties, such as transform:
- // transform: rotate(10deg) translateX(0px)
- //
- // description:
- // The standard animation doesn't know what to do with something like
- // rect(...). This class identifies complex properties by they being a
- // string and having parenthesis. If so, that property is made into a
- // dojox.fx._Complex object and the getValue() is obtained from
- // there.
- //
- // example:
- // | var ani = dojo.animateProperty({
- // | node:dojo.byId("myDiv"),
- // | duration:600,
- // | properties:{
- // | clip:{start:'rect(0px 50px 50px 0px)', end:'rect(10px 30px 30px 10px)'}
- // | }
- // | }).play();
- //
- var d = dojo;
- var ani = da(options);
-
- dojo.connect(ani, "beforeBegin", function(){
- // dojo.Animate original still invokes and still
- // works. We're appending this functionality to
- // modify targeted properties.
- ani.curve.getValue = function(r){
- // Overwriting dojo.Animate's curve.getValue
- // This is mostly duplicate code, except it looks
- // for an instance of dojox.fx._Complex.
- var ret = {};
- for(var p in this._properties){
- var prop = this._properties[p],
- start = prop.start;
- if(start instanceof d.Color){
- ret[p] = d.blendColors(start, prop.end, r, prop.tempColor).toCss();
- }else if(start instanceof dojox.fx._Complex){
- ret[p] = start.getValue(r);
- }else if(!d.isArray(start)){
- ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units || "px" : 0);
- }
- }
- return ret;
- };
-
- // this.properties has already been set, as has this.curve._properties.
- // We're fixing the props in curve which will have NaN attributes from
- // our string property.
- var pm = {};
- for(var p in this.properties){
- var o = this.properties[p];
- if(typeof(o.start) == "string" && /\(/.test(o.start)){
- this.curve._properties[p].start = new dojox.fx._Complex(o);
- }
- }
-
- });
- return ani; // dojo.Animation
- }
- })();
- dojo.declare("dojox.fx._Complex", null, {
- // summary:
- // A class that takes a complex property such as
- // clip style: rect(10px 30px 10px 50px), and breaks it
- // into seperate animatable units. The object has a getValue()
- // that will return a string with the modified units.
- //
- PROP: /\([+-]?[\w|,|#|\.|\s]*\)/g,
- constructor: function(options){
- var beg = options.start.match(this.PROP);
- var end = options.end.match(this.PROP);
- var begProps = dojo.map(beg, this.getProps, this);
- var endProps = dojo.map(end, this.getProps, this);
- this._properties = {};
- this.strProp = options.start;
- dojo.forEach(begProps, function(prop, i){
- dojo.forEach(prop, function(p, j){
- this.strProp = this.strProp.replace(p, "PROP_"+i+""+j);
- this._properties["PROP_"+i+""+j] = this.makePropObject(p, endProps[i][j])
- },this);
- },this);
- },
- getValue: function(/*Float*/r){
- // summary:
- // Returns a string with teh same integrity as the
- // original star and end, but with the modified units.
- var str = this.strProp, u;
- for(var nm in this._properties){
- var v, o = this._properties[nm];
- if(o.units == "isColor"){
- v = dojo.blendColors(o.beg, o.end, r).toCss(false);
- u = "";
- }else{
- v = ((o.end - o.beg) * r) + o.beg;
- u = o.units;
- }
- str = str.replace(nm, v + u);
- }
-
- return str; // String
- },
-
- makePropObject: function(/* String */beg, /* String */end){
- // summary:
- // Returns an object that stores the numeric value and
- // units of the beggining and ending properties.
- //
- var b = this.getNumAndUnits(beg);
- var e = this.getNumAndUnits(end);
- return {
- beg:b.num,
- end:e.num,
- units:b.units
- }; // Object
- },
-
- getProps: function(/* String */str){
- // summary:
- // Helper function that splits a stringified set of properties
- // into individual units.
- //
- str = str.substring(1, str.length-1);
- var s;
- if(/,/.test(str)){
- str = str.replace(/\s/g, "");
- s = str.split(",");
- }else{
- str = str.replace(/\s{2,}/g, " ");
- s = str.split(" ");
- }
- return s; // String
- },
- getNumAndUnits: function(prop){
- // summary:
- // Helper function that returns the numeric verion of the string
- // property (or dojo.Color object) and the unit in which it was
- // defined.
- //
- if(!prop){ return {}; }
- if(/#/.test(prop)){
- return {
- num: new dojo.Color(prop),
- units:"isColor"
- }; // Object
- }
- var o = {
- num:parseFloat(/-*[\d\.\d|\d]{1,}/.exec(prop).join(""))
- };
- o.units = /[a-z]{1,}/.exec(prop);//.join("");
- o.units = o.units && o.units.length ? o.units.join("") : "";
- return o; // Object
- }
- });
- }
|