
function addSetterGetter(obj){
obj.isAddSetterGetter=true;
obj.__defineGetter__('x',function(){return this.translate[0];});
obj.__defineSetter__('x',function(v){this.translate[0]=v;});
obj.__defineGetter__('y',function(){return this.translate[1];});
obj.__defineSetter__('y',function(v){this.translate[1]=v;});
obj.__defineGetter__('z',function(){return this.translate[2];});
obj.__defineSetter__('z',function(v){this.translate[2]=v;});
obj.__defineGetter__('rotationr',function(){return this.rotation[0];});
obj.__defineSetter__('rotationr',function(v){this.rotation[0]=v;});
obj.__defineGetter__('rotationx',function(){return this.rotation[1];});
obj.__defineSetter__('rotationx',function(v){this.rotation[1]=v;});
obj.__defineGetter__('rotationy',function(){return this.rotation[2];});
obj.__defineSetter__('rotationy',function(v){this.rotation[2]=v;});
obj.__defineGetter__('rotationz',function(){return this.rotation[3];});
obj.__defineSetter__('rotationz',function(v){this.rotation[3]=v;});
obj.__defineGetter__('scalex',function(){return this.scale[0];});
obj.__defineSetter__('scalex',function(v){this.scale[0]=v;});
obj.__defineGetter__('scaley',function(){return this.scale[1];});
obj.__defineSetter__('scaley',function(v){this.scale[1]=v;});
obj.__defineGetter__('fontsize',function(){return this.font_size;});
obj.__defineSetter__('fontsize',function(v){this.font_size=v;setf_text(this,this.text);});
obj.__defineGetter__('colr',function(){return this.color[0];});
obj.__defineSetter__('colr',function(v){this.color[0]=v;});
obj.__defineGetter__('colg',function(){return this.color[1];});
obj.__defineSetter__('colg',function(v){this.color[1]=v;});
obj.__defineGetter__('colb',function(){return this.color[2];});
obj.__defineSetter__('colb',function(v){this.color[2]=v;});
obj.__defineGetter__('cola',function(){return this.color[3];});
obj.__defineSetter__('cola',function(v){this.color[3]=v;});}

var JSTweener={
objects:[],
interval:50,
looping:false,
count:0,
defaultOptions:{
time:1,
delay:0,
transition:'easeNone',
onStart:undefined,
onStartParams:undefined,
onUpdate:undefined,
onUpdateParams:undefined,
onComplete:undefined,
onCompleteParams:undefined
},
inited:false,
init:function(){
this.inited=true;},
isTween:function(obj){
for(var i=0;i<this.objects.length;i++){
if(obj===this.objects[i].target){
return true;}
}
return false;},
stopTween:function (obj){
for(var i=0;i<this.objects.length;i++){
if(obj===this.objects[i].target)
{
console.log("stoptween",this.objects[i].target.name,obj.name);
this.objects.splice(i,1);
i--;}
}
},
addTween:function(obj,options){
var key;
var o={};
if(!this.inited)this.init();
if(!obj.isAddSetterGetter)
addSetterGetter(obj);
this.stopTween(obj);
o.target=obj;
o.param={};
for(key in options){
if(obj.hasOwnProperty(key))
{
o.param[key]={};
o.param[key].s=obj[key];
o.param[key].d=options[key]-obj[key];}
}
for(key in this.defaultOptions){
if(typeof options[key]!='undefined'){
o[key]=options[key];
delete options[key];}else {
o[key]=this.defaultOptions[key];}
}
if(typeof o.transition=='function'){
o.easing=o.transition;}else {
o.easing=this.easingFunctions[o.transition];}
o.startcount=o.delay*1000/this.interval+this.count;
o.stopcount=o.time*1000/this.interval+o.startcount;
o.on_started=false;

this.objects.push(o);
if(this.looping===false){
this.looping=true;
append_timer(this,this.interval,this.eventLoop);}
},
eventLoop:function(obj,count)
{
var i,len;
var finished=false;
var tween,func,target;
var val,key;
this.count=count;
for(i=0;i<this.objects.length;i++){
tween=this.objects[i];
func=tween.easing;
target=tween.target;

if(count<tween.startcount)
{
continue;}

if(count>=tween.stopcount){
this.objects.splice(i,1);
i--;
for(key in tween.param){
target[key]=tween.param[key].d+tween.param[key].s;}
if(typeof tween.onUpdate=='function'){
if(tween.onUpdateParams){
tween.onUpdate.call(target,target,tween.onUpdateParams);}else {
tween.onUpdate.call(target,target);}
}
if(typeof tween.onComplete=='function'){
if(tween.onCompleteParams){
tween.onComplete.call(target,target,tween.onCompleteParams);}else {
tween.onComplete(target,target);}
}

}
else
{
if(tween.on_started===false&&typeof tween.onStart=='function'){
if(tween.onStartParams){
tween.onStart.call(target,target,tween.onStartParams);}else {
tween.onStart.call(target,target);}
tween.on_started=true;}
for(key in tween.param){
val=func(count-tween.startcount,
tween.param[key].s,tween.param[key].d,
tween.stopcount-tween.startcount);
target[key]=Math.floor(val);}

if(typeof tween.onUpdate=='function'){
if(tween.onUpdateParams){
tween.onUpdate.call(target,target,tween.onUpdateParams);}else {
tween.onUpdate.call(target,target);}
}
}
}
if(redraw_flg!==undefined)
redraw_flg=true;
else
force_redraw();
if(this.objects.length===0)
{
delete_timer(this);
this.looping=false;
this.count=0;}
},
evalTween:function(tween,count)
{
var ret=false;
var func=tween.easing;
var target=tween.target;
if(count<tween.startcount)
{
return false;}
for(var key in tween.param){
if(count>=tween.stopcount){
target[key]=tween.param[key].d+tween.param[key].s;}else {
var val=func(count-tween.startcount,
tween.param[key].s,tween.param[key].d,
tween.stopcount-tween.startcount);
target[key]=Number(val);}
}

if(tween.on_started===false&&typeof tween.onStart=='function'){
if(tween.onStartParams){
tween.onStart.call(target,target,tween.onStartParams);}else {
tween.onStart.call(target,target);}
tween.on_started=true;}
if(typeof tween.onUpdate=='function'){
if(tween.onUpdateParams){
tween.onUpdate.call(target,target,tween.onUpdateParams);}else {
tween.onUpdate.call(target,target);}
}
if(count>=tween.stopcount){
if(typeof tween.onComplete=='function'){
if(tween.onCompleteParams){
tween.onComplete.call(target,target,tween.onCompleteParams);}else {
tween.onComplete(target,target);}
}
ret=true;}
return ret;}
};
JSTweener.Utils={
bezier2:function(t,p0,p1,p2){
return (1-t)*(1-t)*p0+2*t*(1-t)*p1+t*t*p2;},
bezier3:function(t,p0,p1,p2,p3){
return Math.pow(1-t,3)*p0+3*t*Math.pow(1-t,2)*p1+3*t*t*(1-t)*p2+t*t*t*p3;}
};

JSTweener.easingFunctions={
easeNone:function(t,b,c,d){
return c*t/d+b;},
easeInQuad:function(t,b,c,d){
return c*(t/=d)*t+b;},
easeOutQuad:function(t,b,c,d){
return -c*(t/=d)*(t-2)+b;},
easeInOutQuad:function(t,b,c,d){
if((t/=d/2)<1)return c/2*t*t+b;
return -c/2*((--t)*(t-2)-1)+b;},
easeInCubic:function(t,b,c,d){
return c*(t/=d)*t*t+b;},
easeOutCubic:function(t,b,c,d){
return c*((t=t/d-1)*t*t+1)+b;},
easeInOutCubic:function(t,b,c,d){
if((t/=d/2)<1)return c/2*t*t*t+b;
return c/2*((t-=2)*t*t+2)+b;},
easeOutInCubic:function(t,b,c,d){
if(t<d/2)return JSTweener.easingFunctions.easeOutCubic(t*2,b,c/2,d);
return JSTweener.easingFunctions.easeInCubic((t*2)-d,b+c/2,c/2,d);},
easeInQuart:function(t,b,c,d){
return c*(t/=d)*t*t*t+b;},
easeOutQuart:function(t,b,c,d){
return -c*((t=t/d-1)*t*t*t-1)+b;},
easeInOutQuart:function(t,b,c,d){
if((t/=d/2)<1)return c/2*t*t*t*t+b;
return -c/2*((t-=2)*t*t*t-2)+b;},
easeOutInQuart:function(t,b,c,d){
if(t<d/2)return JSTweener.easingFunctions.easeOutQuart(t*2,b,c/2,d);
return JSTweener.easingFunctions.easeInQuart((t*2)-d,b+c/2,c/2,d);},
easeInQuint:function(t,b,c,d){
return c*(t/=d)*t*t*t*t+b;},
easeOutQuint:function(t,b,c,d){
return c*((t=t/d-1)*t*t*t*t+1)+b;},
easeInOutQuint:function(t,b,c,d){
if((t/=d/2)<1)return c/2*t*t*t*t*t+b;
return c/2*((t-=2)*t*t*t*t+2)+b;},
easeOutInQuint:function(t,b,c,d){
if(t<d/2)return JSTweener.easingFunctions.easeOutQuint(t*2,b,c/2,d);
return JSTweener.easingFunctions.easeInQuint((t*2)-d,b+c/2,c/2,d);},
easeInSine:function(t,b,c,d){
return -c*Math.cos(t/d*(Math.PI/2))+c+b;},
easeOutSine:function(t,b,c,d){
return c*Math.sin(t/d*(Math.PI/2))+b;},
easeInOutSine:function(t,b,c,d){
return -c/2*(Math.cos(Math.PI*t/d)-1)+b;},
easeOutInSine:function(t,b,c,d){
if(t<d/2)return JSTweener.easingFunctions.easeOutSine(t*2,b,c/2,d);
return JSTweener.easingFunctions.easeInSine((t*2)-d,b+c/2,c/2,d);},
easeInExpo:function(t,b,c,d){
return(t==0)?b:c*Math.pow(2,10*(t/d-1))+b-c*0.001;},
easeOutExpo:function(t,b,c,d){
return(t==d)?b+c:c*1.001*(-Math.pow(2,-10*t/d)+1)+b;},
easeInOutExpo:function(t,b,c,d){
if(t==0)return b;
if(t==d)return b+c;
if((t/=d/2)<1)return c/2*Math.pow(2,10*(t-1))+b-c*0.0005;
return c/2*1.0005*(-Math.pow(2,-10*--t)+2)+b;},
easeOutInExpo:function(t,b,c,d){
if(t<d/2)return JSTweener.easingFunctions.easeOutExpo(t*2,b,c/2,d);
return JSTweener.easingFunctions.easeInExpo((t*2)-d,b+c/2,c/2,d);},
easeInCirc:function(t,b,c,d){
return -c*(Math.sqrt(1-(t/=d)*t)-1)+b;},
easeOutCirc:function(t,b,c,d){
return c*Math.sqrt(1-(t=t/d-1)*t)+b;},
easeInOutCirc:function(t,b,c,d){
if((t/=d/2)<1)return -c/2*(Math.sqrt(1-t*t)-1)+b;
return c/2*(Math.sqrt(1-(t-=2)*t)+1)+b;},
easeOutInCirc:function(t,b,c,d){
if(t<d/2)return JSTweener.easingFunctions.easeOutCirc(t*2,b,c/2,d);
return JSTweener.easingFunctions.easeInCirc((t*2)-d,b+c/2,c/2,d);},
easeInElastic:function(t,b,c,d,a,p){
var s;
if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;
if(!a||a<Math.abs(c)){a=c;s=p/4;}else s=p/(2*Math.PI)*Math.asin(c/a);
return -(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;},
easeOutElastic:function(t,b,c,d,a,p){
var s;
if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;
if(!a||a<Math.abs(c)){a=c;s=p/4;}else s=p/(2*Math.PI)*Math.asin(c/a);
return(a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b);},
easeInOutElastic:function(t,b,c,d,a,p){
var s;
if(t==0)return b;if((t/=d/2)==2)return b+c;if(!p)p=d*(.3*1.5);
if(!a||a<Math.abs(c)){a=c;s=p/4;}else s=p/(2*Math.PI)*Math.asin(c/a);
if(t<1)return -.5*(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;
return a*Math.pow(2,-10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p)*.5+c+b;},
easeOutInElastic:function(t,b,c,d,a,p){
if(t<d/2)return JSTweener.easingFunctions.easeOutElastic(t*2,b,c/2,d,a,p);
return JSTweener.easingFunctions.easeInElastic((t*2)-d,b+c/2,c/2,d,a,p);},
easeInBack:function(t,b,c,d,s){
if(s==undefined)s=1.70158;
return c*(t/=d)*t*((s+1)*t-s)+b;},
easeOutBack:function(t,b,c,d,s){
if(s==undefined)s=1.70158;
return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b;},
easeInOutBack:function(t,b,c,d,s){
if(s==undefined)s=1.70158;
if((t/=d/2)<1)return c/2*(t*t*(((s*=(1.525))+1)*t-s))+b;
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b;},
easeOutInBack:function(t,b,c,d,s){
if(t<d/2)return JSTweener.easingFunctions.easeOutBack(t*2,b,c/2,d,s);
return JSTweener.easingFunctions.easeInBack((t*2)-d,b+c/2,c/2,d,s);},
easeInBounce:function(t,b,c,d){
return c-JSTweener.easingFunctions.easeOutBounce(d-t,0,c,d)+b;},
easeOutBounce:function(t,b,c,d){
if((t/=d)<(1/2.75)){
return c*(7.5625*t*t)+b;}else if(t<(2/2.75)){
return c*(7.5625*(t-=(1.5/2.75))*t+.75)+b;}else if(t<(2.5/2.75)){
return c*(7.5625*(t-=(2.25/2.75))*t+.9375)+b;}else {
return c*(7.5625*(t-=(2.625/2.75))*t+.984375)+b;}
},
easeInOutBounce:function(t,b,c,d){
if(t<d/2)return JSTweener.easingFunctions.easeInBounce(t*2,0,c,d)*.5+b;
else return JSTweener.easingFunctions.easeOutBounce(t*2-d,0,c,d)*.5+c*.5+b;},
easeOutInBounce:function(t,b,c,d){
if(t<d/2)return JSTweener.easingFunctions.easeOutBounce(t*2,b,c/2,d);
return JSTweener.easingFunctions.easeInBounce((t*2)-d,b+c/2,c/2,d);}
};
JSTweener.easingFunctions.linear=JSTweener.easingFunctions.easeNone;
