/*	array: element, from (relative), to (relative), speed (seconds)
	function: new fader([object name], [array name])*/
function fader()
{
	var args=arguments;
	with(this)
	{
		this.el=[];this.fr=[];this.tr=[];this.dr=[];this.sp=[];this.ic=[];this.st=[];this.og=[];
		this._el=[];this._fr=[];this._tr=[];this._dr=[];
		this.ec=args.length-1;
		this.name=args[0];window[args[0]]=this;
		for (var i=1;i<=ec;i++)
		{
			el[i]=args[i][0];_el[i]=document.getElementById(el[i]);
			fr[i]=args[i][1];
			tr[i]=args[i][2];
			sp[i]=args[i][3]?args[i][3]:1/25;
			dr[i]=(tr[i]>=0?1:-1);
			tr[i]=(tr[i]*dr[i]);
			st[i]=0;
		}
		this.built=0;
		this.hold=0;this.held=0;this.holding=0;
		this.slink=0;
		this.rev=1;
		this.fl=0;
		this.fading=0;
		this.build=function()
		{
			if(!built)
			{
				for (var i=1;i<=ec;i++)
				{
					og[i]=fr[i]+(rev*dr[i]*tr[i]);_fr[i]=og[i];
					_dr[i]=(1-(2*rev))*dr[i];
					_tr[i]=tr[i];
					ic[i]=_tr[i]/(25*sp[i]);
					_el[i].style.display="block";
				}
				built=1;

			}
			if(held)
			{
				for (var i=1;i<=ec;i++)
				{
					if((_dr[i]==dr[i])==rev){og[i]=og[i]+(_dr[i]*(tr[i]));_dr[i]*=-1;}
					_fr[i]=_el[i].style.opacity?parseFloat(_el[i].style.opacity,10):((parseFloat(_el[i].filters.item("DXImageTransform.Microsoft.Alpha").opacity,10))/100);
					_tr[i]=(-1*(_dr[i]))*(_fr[i]-og[i])+tr[i];
				}
				held=0;
			}
			for (var i=1;i<=ec;i++){st[i]=0;};fl=0;
		}
		this.fade=function()
		{
			fading=1;
			for (var i=1;i<=ec;i++)
			{
				if(fl){_tr[i]=st[i]}else if(hold){held=1;holding=1;_tr[i]=st[i]};
				if (st[i]!=_tr[i])
				{
					st[i]=st[i]+ic[i];
					st[i]=st[i]>_tr[i]?_tr[i]:st[i];
					with (_el[i].style){opacity=((_dr[i]*st[i])+_fr[i]);filter="progid:DXImageTransform.Microsoft.Alpha(opacity="+((_dr[i]*100*st[i])+(100*_fr[i]))+")"}
				}
			}
			hold=0;var kg=0;for (i=1;i<=ec;i++){kg+=!(st[i]==_tr[i]);}
			if(kg||fl){if(fl){build();}setTimeout(name+".fade()",40);}else{fading=0;holding=0;built=held;if(!held&&slink){var islink=slink;slink=0;eval(islink+".start()");}}
		}
		this.start=function(){if(fading&&rev){flip();}else{rev=0;build();fade();}}
		this.halt=function(){if(!held&&fading){hold=1;}}
		this.trats=function(){if(fading&&!rev){flip();}else{rev=1;build();fade();}}
		this.flip=function(){fl=1;rev=!rev;held=1;}
	}
}
