/* DynAPI Distribution Fader Animation Extension The DynAPI Distribution is distributed under the terms of the GNU LGPL license. requires: DynLayer, Fader */ function TextAnimation(x,y,text,animBy,dlyr){ this.EventObject = EventObject; this.EventObject(); this._chars=[]; this._lyrPool=[]; this._text=text; this._animBy=null; this._inUse=0; this._dlyr=(dlyr||dynapi.document); this.setLocation(x,y); this.animateBy(animBy); this.visible=true; var me=this; // use delegate "me" var fn=function(){ me._created=true; me._split(); } if(this._dlyr!=dynapi.document) this._dlyr.onCreate(fn); else { var e={onload:fn}; this._dlyr.addEventListener(e); } }; var p = dynapi.setPrototype('TextAnimation','EventObject'); p._clear = function(){ var l; var p=this._lyrPool; var c=this._chars; for(var i=0;i<c.length;i++){ l=c[i]; l.setVisible(false); l.removeAllEventListeners(); p[p.length]=l; } this._chars.length=0; }; p._createCharLayer=function(t){ var l; var p=this._lyrPool; if (!p.length) l = this._dlyr.addChild(new DynLayer()); else { l = p[p.length-1]; p.length--; }; l._ta=this; l.setHTML(t); if(l._created) { // resize char layer l.setSize(1,1); // why mozilla,gecko,ie?? l.setSize(l.getContentWidth(),l.getContentHeight()); } l.setVisible(this.visible); if(dynapi.ua.ie) l.css.filter='alpha(opacity=100)'; else l.css.MozOpacity = 1; return l; }; p._exec = function(cmd,i){ window.setTimeout(cmd,(this._ms*i)+5); }; p._resize=function(align){ var x=this.x; var y=this.y; var i,l,c=this._chars; for(i=0;i<c.length;i++){ l=c[i]; // resize char layer if(l._created) { l.setSize(1,1); // why mozilla,gecko,ie?? l.setSize(l.getContentWidth(),l.getContentHeight()); if(align) { l.setLocation(x,y); x+=l.w; } } } }; p._split = function(){ var i,ar,lyr; var t=this._text; var c=this._chars; var x=this.x; var y=this.y; if(!t||!this._created) return; this._clear(); if(this._animBy=='all') { // By all t='<nobr>'+t+'</nobr>'; lyr=c[0]=this._createCharLayer(t); lyr.setLocation(x,y); }else { // By word or letter if (this._animBy=='word') { t=t.replace(/\s/g,' '); ar=t.split(' '); } else { ar=t.split(''); } for(i=0;i<ar.length;i++){ if (ar[i]==' ') ar[i]=' '; lyr=c[i]=this._createCharLayer(ar[i]); lyr.setLocation(x,y); x+=lyr.w; } } if(lyr) lyr.addEventListener(TextAnimation._tiggerEvents); }; p.animateBy=function(s,delay){ // all, letter, word this._animBy=s||this._animBy||'letter'; this.setDelay(delay); this._split(); }; p.getCharLayer = function(i){ if (i>=0 && i<this.chars.length) return this.chars[i]; }; p.setDelay = function(delay){ this._ms=delay||this._ms||50; }; p.setFont=function(size,family){ }; p.setLocation=function(x,y){ x=x||0; y=y||0; var byX=x-this.x; var byY=y-this.y; var c=this._chars; this.x=x; this.y=y; for (var i=0;i<c.length;i++){ l=c[i]; l.setLocation(l.x+byX,l.y+byY); } }; p.setText=function(t,animBy,delay){ this._text=t||''; this.setDelay(delay); this.animateBy(animBy); }; p.setVisible = function(b){ var c=this._chars; this.visible=b; for (var i=0;i<c.length;i++) c[i].setVisible(b); }; // Trigger Events var fn = function(e){ var o=e.getSource(); o._ta._inUse--; if(!o._ta._inUse) window.setTimeout(o._ta+'.invokeEvent("animfinish")',55); }; TextAnimation._tiggerEvents = { onpathfinish:fn, onfadein:fn, onfadeout:fn }; // Effects // ------------------------ // Apear p.appear = function(){ var i,ext,c=this._chars; this._exec(this+'.invokeEvent("animstart")',1); for (i=0;i<c.length;i++) { if(!this._inUse) c[i].setVisible(false); if(i==(c.length-1)) ext=c[i]+'.invokeEvent("pathfinish")'; this._exec(c[i]+'.setVisible(true);;'+ext,i); } this._inUse++; }; // Bounce p.bounce = function(h,modifier){ var i,l,c; c=this._chars; h=(h||100); modifier=(modifier<-1)? -1:(modifier||0); this._exec(this+'.invokeEvent("animstart")',1); // setup bounce chars for (i=0;i<c.length; i++) { l=c[i]; l._bonctmr=i<<modifier; l._boncyv=0; l._boncmaxv=8; l._boncy=-l.h; l.setLocation(null,this.y-h); if(!this._inUse) l.setVisible(true); this._exec(this+'._startBounce('+i+','+h+');',i); } this._inUse++; }; p._startBounce = function(i,h){ var l,y,c,ext; var c=this._chars; l=c[i]; if (l._bonctmr>0) l._bonctmr--; else { yv=l._boncyv; //y=l._boncy; l._boncy+=yv; if (yv<l._boncmaxv) l._boncyv++; if (l._boncy>h-l.h) { l._boncy=h-l.h; l._boncyv=-l._boncyv; if (l._boncmaxv>0) l._boncmaxv--; } l.setLocation(null,(this.y-h)+l._boncy+l.h); } if(l._boncmaxv!=0){ this._exec(this+'._startBounce('+i+','+h+');'+ext,1); } else if(i==(c.length-1)) { this._exec(l+'.invokeEvent("pathfinish")',1); } }; // Fade In p.fadeIn = function(inc,ms){ var i,c=this._chars; this._exec(this+'.invokeEvent("animstart")',1); for (i=0;i<c.length;i++) this._exec(c[i]+'.fadeIn('+inc+','+ms+');',i); this._inUse++; }; // Fade Out p.fadeOut = function(inc,ms){ var i,c=this._chars; this._exec(this+'.invokeEvent("animstart")',1); for (i=0;i<c.length;i++) this._exec(c[i]+'.fadeOut('+inc+','+ms+');',i); this._inUse++; }; // Fly From p.flyFrom = function(x,y,inc,ms){ var i,l,c=this._chars; this._exec(this+'.invokeEvent("animstart")',1); for (i=0;i<c.length;i++) { l=c[i]; this._exec( ((!this._inUse)? l+'.setVisible(true);':'') +l+'.slideTo('+l.x+','+l.y+','+inc+','+ms+');' ,i); l.setLocation(x,y); } this._inUse++; }; p.zoomText = function(from,to,inc,ms){ var i,l,c; c=this._chars; this._exec(this+'.invokeEvent("animstart")',1); // setup chars for (i=0;i<c.length; i++) { l=c[i]; l._zTo = to||20; l._zFrom = from||10; l._zMs=(ms)? ms:50; l._zInc=(inc)? Math.abs(inc):5; l.css.fontSize=l._zFrom+'px'; if (l._zFrom>l._zTo) l._zInc*=-1; if(!this._inUse) l.setVisible(true); this._exec(this+'._startZoom('+i+');',i); } this._inUse++; }; p._startZoom= function(i){ var l,y,c,ext; var l=this._chars[i]; var inc = l._zInc; var from = l._zFrom; var to = l._zTo; from+=inc; if ((inc<0 && from<=to)|| (inc>0 && from>=to)) from=to; l._zFrom=from; l.css.fontSize=from+'px'; l.setSize(0,0); // ?? l.setSize(l.getContentWidth(),l.getContentHeight()); if(i==0) l.setLocation(null,this.y-(l.h/2)); else l.setLocation(this._chars[i-1].x+this._chars[i-1].w,this.y-(l.h/2)); if(from!=to) l._zTmr=window.setTimeout(this+'._startZoom('+i+')',l._zMs); else if(i==(this._chars.length-1)) { this._exec(l+'.invokeEvent("pathfinish")',1); } }; // to-do: p.wave = function(){}; p.nudge = function(){}; p.quake = function(){};