/*	array: element, from (relative), direction(right, top, left, bottom), track, accelerate, decelerate, speed (seconds)
	function: new mover([object name], [array])*/
function mover()
{
	var args=arguments;
	with(this)
	{
		this.el=[];this.fr=[];this.og=[];this.ax=[];this.tr=[];this.ac=[];this.dc=[];this.sp=[];this.dr=[];this.ic=[];this.ps=[];
		this._el=[];this._ax=[];this._fr=[];this._dr=[];this._tr=[];this._sp=[];
		this.ec=args.length-1;
		this.name=args[0];window[name]=this;
		for (var i=1;i<=ec;i++)
		{
			el[i]=args[i][0];_el[i]=document.getElementById(el[i]).style;
			fr[i]=args[i][1];
			ax[i]=args[i][2];_ax[i]=ax[i];
			tr[i]=args[i][3];
			ac[i]=args[i][4];
			dc[i]=args[i][5];
			sp[i]=isNaN(args[i][6])?args[i][6]:(args[i][6]?args[i][6]:1/25);
			dr[i]=(tr[i]>=0?1:-1);
			tr[i]=(tr[i]*dr[i]);
			ps[i]=0;
		}
		this.fm=1;this._fm=0;this.ct=0;//frames (deafult 1), continuous movement (default no)
		this.built=0;
		this.hold=0;this.held=0;this.holding=0;
		this.slink=0;
		this.rev=1;
		this.fl=0;
		this.moving=0;
		this._dc=0;
		this.build=function()
		{
			if(!built)
			{
				for (var i=1;i<=ec;i++)
				{
					og[i]=parseInt(eval("_el[i]."+_ax[i]),10)+fr[i];
					_fr[i]=og[i];
					_dr[i]=(1-(2*rev))*dr[i];
					_tr[i]=tr[i];
					//thirds
					_sp[i]=isNaN(sp[i])?parseInt(sp[i])/100:(_tr[i]/(25*sp[i]));
					//thirds
					ic[i]=((ac[i]&&dc[i]))?_sp[i]*2:(((ac[i]||dc[i]))?_sp[i]*1.4:_sp[i]);
					//halves
					//ic[i]=((ac[i]&&dc[i]))?_sp[i]*4.5:(((ac[i]||dc[i]))?_sp[i]*2.5:_sp[i]);
					_el[i].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]=parseFloat(eval("_el[i]."+_ax[i]));
					_tr[i]=(-1*(_dr[i]))*(_fr[i]-og[i])+tr[i];
				}
				held=0;
			}
			for (var i=1;i<=ec;i++){ps[i]=0;}fl=0;
		}
		this.move=function()
		{
			moving=1;
			if(fl){_dc=0;!ct?slink=0:{};for (var i=1;i<=ec;i++){_tr[i]=ps[i]}}
			else if(hold){for (i=1;i<=ec;i++){held=1;holding=1;if(ac&&(ps[i]<(_tr[i]/3))){_tr[i]=ps[i]*1.1;}else if(dc&&(_tr[i]-ps[i]>(.1*(_tr[i]/3)))){_dc=1;_tr[i]=ps[i]+(_tr[i]/3)*.1}else{_tr[i]=ps[i]}}};
			for (i=1;i<=ec;i++)
			{
				if (ps[i]!=_tr[i])
				{
					//thirds
					ps[i]=((ps[i]<(_tr[i]/3))&&ac[i])?ic[i]/10+ps[i]+(ic[i]*(ps[i]/(_tr[i]/3))):(((ps[i]>(_tr[i]-(_tr[i]/3)))&&dc[i])?ic[i]/10+ps[i]+(ic[i]*((_tr[i]-ps[i])/(_tr[i]/3))):ps[i]+ic[i]*1.1);
					//halves
					//ps[i]=((ps[i]<(_tr[i]/3))&&ac[i])?ic[i]/10+ps[i]+(ic[i]*(ps[i]/(_tr[i]/2))):(((ps[i]>(_tr[i]-(_tr[i]/3)))&&dc[i])?ic[i]/10+ps[i]+(ic[i]*((_tr[i]-ps[i])/(_tr[i]/2))):1+ps[i]+ic[i]*1.1);
					ps[i]=ps[i]>_tr[i]?_tr[i]:ps[i];
					eval("_el[i]."+_ax[i]+"=(_dr[i]*ps[i])+_fr[i]+'px'");
				}
			}
			hold=0;var kg=0;for(i=1;i<=ec;i++){kg+=!(ps[i]==_tr[i]);}
			if(kg||fl){if(fl){build();}setTimeout(name+".move()",40);}else{_dc=0;moving=0;holding=0;built=held;if(((!held&&_fm==fm)||ct)&&slink){var islink=slink;slink=0;eval(islink+".start()");}}
		}
		this.start=function(){if(moving&&rev){flip();}else if(!held&&!moving&&((_fm<fm)||ct)){rev=0;build();_fm++;move();}else if(held&&!moving){_fm+=rev;rev=0;build();move();}}
		this.halt=function(){if(!held&&moving){hold=1;}}
		this.trats=function(){if(moving&&!rev){flip();}else if(!held&&!moving&&((_fm>0)||ct)){rev=1;build();_fm--;move();}else if(held&&!moving){_fm+=(rev-1);rev=1;build();move();}}
		this.flip=function(){held=1;rev=!rev;fl=1;if(rev){_fm--}else{_fm++}}
	}
}