/*const*/var INTERVAL_SOMETIMES=2;
/*const*/var INTERVAL_RARELY=4;
/*const*/var INTERVAL_NEVER=0;
/*const*/var INTERVAL_ALWAYS=-1;
/*const*/var INTERVAL_ONCE=-2;

function Posture(id, src, baseurl, geo){
	this.id=id||'';

	var base=new Image();
	base.loaded=false;
	base.onload=function(){this.loaded=true;}
	
/******************/
	//if(!Config.mode)
	//	src=src.replace(/\.png$/, '.gif');
	var baseUrl=baseurl;
	this.width=geo.width||K_WIDTH;
	this.height=geo.height||K_HEIGHT;

	//var tm=0;
	this.center=[-1,-1];
	//var regions={};
	var regions=[];

	var anims={};
	var aid='';
	var tstart=0;
	
	var cvs;
	var ctx;
	
/****/
	base.src=baseUrl+((Config.gif)?src.replace(/\.png/, '.gif'):src);
	
/****/
	this.Init=function(isClear){
		//base.src=baseUrl;
		var an=anims[aid];
		if(an){
			an.tid=0;
			for(var i=0;i<an.toons.length;an.toons[i++].Init());
		}
		tstart=0;
		aid='';
		
		if(Config.mode && ctx){
			ctx.clearRect(0,0, this.width, this.height);

			if(!isClear && base.loaded)
				ctx.drawImage(base, 0, 0);
		}
		return this;
	};
	
	this.SetPoint=function(elm){
		var name=elm.getAttribute('name');
		var area=elm.getAttribute('area');
		switch(name){
		case 'center':
			this.center=area.split(',');
			break;
		default:
			break;
		}
		return this;
	};//

	this.SetRegion=function(elm){
		var name=elm.getAttribute('name');
		var area=elm.getAttribute('area');
		//regions[name]=area.split(',');
		var tmp=area.split(',');
		if(name.search(/^On/i)==-1)
			name='On'+name;
		tmp.unshift(name);
		regions.push(tmp);
		return this;
	};//

	this.AddAnim=function(elm){
		var name=elm.getAttribute('name');
		var interval=elm.getAttribute('interval');
		if(interval=='sometimes')
			interval=INTERVAL_SOMETIMES;
		else if(interval=='rarely')
			interval=INTERVAL_RARELY;
		else if(interval=='always')
			interval=INTERVAL_ALWAYS;
		else if(interval=='never')
			interval=INTERVAL_NEVER;
		else if(interval=='runonce')
			interval=INTERVAL_ONCE;
		
		if(interval>0)
			interval*=1000/ANIM_INTERVAL;
		if(!anims[name])
			anims[name]={interval:interval,tid:0,toons:[]};

		for(var i=0,toon;toon=elm.childNodes[i];i++){
			if(toon.nodeType!=1)
				continue;
			var eff=toon.getAttribute('effect');
			var img=null;
			var delay=toon.getAttribute('delay');
			var pos=toon.getAttribute('position');
			var tim=toon.getAttribute('time');
			var formula=toon.getAttribute('formula');
			
			if(eff=='overlay'||eff=='repaint'){
				img=new Image();
				img.loaded=false;
				img.onload=function(){this.loaded=true;}
				img.src=baseUrl+toon.getAttribute('src');
			}
			anims[name].toons.push(new Toon(eff,img,delay,pos,tim,formula));
		}

		if(interval=='runonce' || interval=='never')
			anims[name].toons.push(new Toon('nothing'));

		return this;
	};
	
	this.GetSize=function(){
		//return [width, height];
		return [this.width, this.height];
	};

	/** use "poseObj.width" will be faster **/
	this.GetWidth=function(){
		return this.width;
	};
	
	/** use "poseObj.height" will be faster **/
	this.GetHeight=function(){
		return this.height;
	};
	
	this.HitTest=function(x, y){
		for(var i=0,r;r=regions[i];i++){
			if(x<r[1] || r[3]<x || y<r[2] || r[4]<y)
				continue;
			return r[0];
		}
		return '';
	};//

	/****/
	this.Draw=function(canvas, now){
		ctx=canvas;
		//ctx=cvs.getContext('2d');
		if(!Config.mode){
			ctx.src=base.src;
			return this;
		}

		if(!aid){//if(aid)
			r=Math.random();
			for(var i in anims){
				if(anims[i].interval==INTERVAL_NEVER)
					continue;
				if(r*anims[i].interval<1){
					aid=i;
					break;
				}
			}//for(anims)
		}//if(aid)
		
		if(aid){
			//ctx.drawImage(base, 0, 0);
			//ctx.clearRect(0,0, this.width, this.height);
			return this.Anim(now);
		}else if(!tstart){
			tstart=now;
			
			if(base.loaded)
				ctx.drawImage(base, 0, 0);
		}
		return 0;
	};//

	/****/
	this.Anim=function(now){
		
		var an=anims[aid];
		if(an.tid<an.toons.length)
			an.tid+=an.toons[an.tid].Run(ctx, now);
		if(an.toons.length && an.tid>=an.toons.length && an.interval!=INTERVAL_ONCE){
			//an.tid=0;
			//tstart=0;
			//aid='';
			this.Init();
		}
		
		return an.tid;
	};//
	
	/****/
	this.IsAnim=function(){
		var an=anims[aid];
		if(!an)
			return false;
		return (an.interval==INTERVAL_ONCE && 0<=an.tid && an.tid<an.toons.length);
	};//

	/****/
	this.GetAnimType=function(){
		if(aid=='')
			return '';
		var an=anims[aid];
		if(!an)
			return '';
		return an.interval;
	};//
	
	/****/
	this.GetAnimId=function(){
		if(aid=='')
			return -1;
		var an=anims[aid];
		if(!an)
			return -1;
		return an.tid;
	};//
	
/**************
embeded functions
**************/
	/****/
	this.toString=function(){
		return 'id:'+this.id+', aid:'+aid+', tstart:'+tstart;
	};//

/**************
private functions
**************/
/******************/
	function Toon(aEff,aImg,aDelay,aPos,aTim,aFormula){
		var eff=aEff||'';
		var img=aImg||null;
		var delay=aDelay||0;
		var pos=aPos?aPos.split(','):[0,0];
		var tim=aTim||0;
		var formula=aFormula||'';
		
		var start=0;
		
		this.Run;
		
		if(pos.length<2)
			pos=[0,0];
		else
			U.ArrayParseFloat(pos);
		

		if(eff=='overlay'){
			this.Run=OverLay;
			delete Repaint;
			delete Move;
			delete Restore;
			delete Wait;
			delete DoNothing;
		}else if(eff=='repaint'){
			this.Run=Repaint;
			delete OverLay;
			delete Move;
			delete Restore;
			delete Wait;
			delete DoNothing;
		}else if(eff=='move'){
			this.Run=Move;
			delete OverLay;
			delete Repaint;
			delete Restore;
			delete Wait;
			delete DoNothing;
		}else if(eff=='restore'){
			this.Run=Restore;
			delete OverLay;
			delete Repaint;
			delete Move;
			delete Wait;
			delete DoNothing;
		}else if(eff=='wait'){
			this.Run=Wait;
			delete OverLay;
			delete Repaint;
			delete Move;
			delete Restore;
			delete DoNothing;
		}else{
			this.Run=DoNothing;
			delete OverLay;
			delete Repaint;
			delete Move;
			delete Restore;
			delete Wait;
		}
		
		this.Init=function(){
			start=0;
		};
		
		/****/
		function Move(ctx, now){
			;
			return 1;
		};
		
		/****/
		function OverLay(ctx,now){
			if(!start)
				start=now;
			var t=now-start;
			if(t<delay)
				return 0;
			if(img.loaded)
				ctx.drawImage(img, pos[0], pos[1], img.width, img.height);
			
			if(t<tim)
				return 0;
			
			start=now;
			return 1;
		};
		
		/****/
		function Repaint(ctx,now){
			if(!start)
				start=now;
			var t=now-start;
			if(t<delay)
				return 0;
			
			ctx.clearRect(0, 0, img.width, img.height);
			ctx.drawImage(img, pos[0], pos[1], img.width, img.height);
			
			if(t<tim)
				return 0;
			
			start=now;
			return 1;
		};
		
		/****/
		function Restore(ctx,now){
			if(base.loaded)
				ctx.drawImage(base, 0, 0);
			return 1;
		}
		
		/****/
		function Wait(ctx,now){
			if(!start)
				start=now;
			var t=now-start;
			if(t<delay || t<tim)
				return 0;
			
			start=now;
			return 1;
		};
		
		/****/
		function DoNothing(ctx,now){
			return 1;
		};
	
	}

}//


