// JavaScript Document

function animaConstructor(){
	if(!this.element.animaList) this.element.animaList=new Object();
	while(this.element.firstChild) this.element.removeChild(this.element.firstChild);
	var self=this.element.animaList[this.aName]=this;
	var result=null;
	var c,type;
	self.playing=false;
	self.anim=new Object();
	self.frameCount=0;
	self.hiddenChildren=new Array();
	self.animations=new Array();
	self.animCount=0;
	if(self.toWidth==null) self.toWidth=self.element.offsetWidth||0;
	if(self.toHeight==null) self.toHeight=self.element.offsetHeight||0;
	if(self.fps<=0) self.fps=vgLib[self.vgClassName].defaults.fps;
	self.frameNum=Math.ceil(self.animTime/1000*self.fps);
	
	self.nextFrame=function(){self.animate();}
	
	self.start=function(){
		if(self.animInterval) self.stop();
		self.frameTime=Math.round(self.animTime/self.frameNum);
		self.frameNum=Math.ceil(self.animTime/1000*self.fps);
		var types=self.types=self.type.toLowerCase().split(/,\s*/);
		for(type in types){
			switch(types[type]){
			case 'resize':
				self.fromWidth=stripPX(self.element.style.width);
				self.fromHeight=stripPX(self.element.style.height);
				break;
			case 'motion':
				self.fromX=self.element.offsetLeft;
				self.fromY=self.element.offsetTop;
				break;
			}
		}
				
		if(self.hideChildren)
			for(var c in self.element.childNodes)
				if(self.element.childNodes[c].style && (self.element.childNodes[c].style.visibility.toLowerCase()=='visible' || self.element.childNodes[c].style.visibility=='')){
					self.hiddenChildren.push(self.element.childNodes[c]);
					if(self.hiddenChildren) self.element.childNodes[c].style.visibility='hidden';
				}
				
		self.animInterval=window.setInterval(self.nextFrame,self.frameTime);
	}
	
	self.play=function(){
		if(!self.playing){
			var types=self.types=self.type.toLowerCase().split(/\s*,\s*/);
			for(type in types){
				
				if(self.anim[types[type].trim()]){
					self.animations.push(self.anim[types[type].trim()]);
				}else{
					alert('Invalid animation type "'+types[type].trim()+'"!');
					return false;
				}
				
				switch(types[type]){
				case 'motion':
					self.fromX=self.element.offsetLeft;
					self.fromY=self.element.offsetTop;
					break;
				case 'resize':
					self.fromWidth=stripPX(self.element.style.width);
					self.fromHeight=stripPX(self.element.style.height);
					self.element.style.overflow='hidden';
					self.innerDiv=document.createElement('div');
					
					while(self.element.firstChild)
						self.innerDiv.appendChild(self.element.firstChild);
					
					self.element.appendChild(self.innerDiv);
					break;
				case 'slideshowfade':
					self.element.appendChild(self.imgTag2=document.createElement('img'));
					self.imgTag2.style.position='absolute'
					self.imgTag2.style.right='0px';
					self.imgTag2.src='images/whitepixel.JPG';
				case 'slideshow':
					if(!self.sources){
						alert('Missing images for slideshow!');
						continue;
					}
					self.element.appendChild(self.imgTag=document.createElement('img'));
					self.imgTag.src=self.sources[0];
					self.element.style.position='relative';
					self.imgTag.style.position='absolute';
					self.imgTag.style.right='0px';
					if(isIE){
/*						self.imgTag.filters='progid:DXImageTransform.Microsoft.Alpha(opacity=0)';
						self.imgTag2.filters='progid:DXImageTransform.Microsoft.Alpha(opacity=0)';*/
					}
					break;
				}
			}
			
			self.playing=true;
			self.animate=self.stepForward;
			if(self.onstep)result=self.onstep;
			if(self.onminframe && self.frameCount<=0) result=self.onminframe;
			if(result){
				if(result.match(/^\w+$/)){
					if(typeof eval(result)=='function') eval(result+'()');
				}else
					eval(result);
			}
			switch(self.trigger.toLowerCase()){
			case 'pull':
				self.start();
				break;
			case 'none':
				break;
			}
		}
	}
	
	self.stop=function(){
		if(self.animInterval) window.clearInterval(self.animInterval);
		self.playing=false;
		self.animInterval=false;
		if(self.frameNum>0){
			result=null;
			if(self.onmaxframe && self.frameCount>=self.frameNum) result=self.onmaxframe;
			if(self.onminframe && self.frameCount<=0) result=self.onminframe;
			if(result){
				eval(result);
			}
			
			if((self.frameCount>=self.frameNum && (self.rebound || self.continuous))){
				self.animate=self.stepBackward;
				if(self.reboundTime) window.setTimeout(self.start,self.reboundTime);
				else self.start();
			}else
				self.frameCount=0;
		}
		
		if(self.continuous && self.frameCount<=0){
			self.animate=self.stepForward;
			if(self.reboundTime) window.setTimeout(self.start,self.reboundTime);
			else self.start();
		}
		
		for(var c in self.hiddenChildren)
			self.hiddenChildren[c].style.visibility='visible';
		
		return null;
	}
	
	self.anim.fadeout=function(){
		if(isIE) self.element.filters.alpha.opacity=100-Math.round(self.frameCount*100/self.frameNum);
		else self.element.style.opacity=1-Math.round(self.frameCount*100/self.frameNum)/100;
	}
	
	self.anim.fadein=function(){
		if(isIE) self.filters.alpha.opacity=Math.round(self.frameCount*100/self.frameNum);
		else self.element.style.opacity=Math.round(self.frameCount*100/self.frameNum)/100;
	}
	
	self.anim.motion=function(){
		self.element.style.left=(self.frameCount/self.frameNum*(self.toX-self.fromX)+self.fromX)+"px";
		self.element.style.top=(self.frameCount/self.frameNum*(self.toY-self.fromY)+self.fromY)+"px";
	}
	
	self.anim.resize=function(){
		self.element.style.width=((self.frameCount/self.frameNum*(self.toWidth-self.fromWidth)+self.fromWidth))+"px";
		self.element.style.height=((self.frameCount/self.frameNum*(self.toHeight-self.fromHeight)+self.fromHeight))+"px";
	}
	
	self.anim.slideshow=function(){
		if(self.frameCount==0) self.imgTag.src=self.sources[self.animCount++%self.sources.length];
	}
	
	self.anim.slideshowfade=function(){
		window.status=self.frameCount+"/"+self.frameNum;
		if(self.frameCount==0)
			self.imgTag.src=self.sources[(self.animCount+=1)%self.sources.length];
		else if(self.frameCount==self.frameNum)
			self.imgTag2.src=self.sources[(self.animCount+=1)%self.sources.length];
			
		if(isIE){
			self.imgTag.style.filter='alpha(opacity='+(Math.round(self.frameCount*100/self.frameNum))+')';
			self.imgTag2.style.filter='alpha(opacity='+(100-Math.round(self.frameCount*100/self.frameNum))+')';
		}else{
			self.imgTag.style.opacity=Math.round(self.frameCount*100/self.frameNum)/100;
		}
	}
	
	self.stepForward=function(){
		if(self.frameCount>=self.frameNum) return self.stop();
		self.frameCount++;
		for(var a in self.animations) self.animations[a]();
	}
	
	self.stepBackward=function(){
		if(self.frameCount<=0) return self.stop();
		self.frameCount--;
		for(var a in self.animations) self.animations[a]();
	}
	
	self.play();
}

registerClassConstructor("anima",animaConstructor);

setClassDefaults("anima",{
				 "type":null,
				 "animTime":2000,
				 "fps":30,
				 "hideChildren":false,
				 "applytochildren":true,
				 "trigger":"pull",
				 "onminframe":null,
				 "onmaxframe":null,
				 "onstep":null,
				 "rebound":false,
				 "reboundTime":1000,
				 "toX":null,
				 "toY":null,
				 "toWidth":null,
				 "toHeight":null,
				 "continuous":false,
				 "aName":null
				 });

setClassRequires("anima",[
						  "type",
						  "aName"
						  ]);