/*name, [step, start (default) or actual code(1), nothing or pause time (seconds)] or 0 to stop until the event finishes*/
function stepper()
{
	var args=arguments;
	with (this)
	{
		this.ec=args.length-1;this.name=args[0];window[name]=this;
		this.el=[];this.be=[];
		for (var i=1;i<=ec;i++)
		{
			el[i]=args[i];
		}
		this.stepping=0;
		this.waiting=0;
		this.ending=0;
		this.paused=0;
		this.halted=0;
		this.sc=1;
		this.slink=0;
		this.build=function()
		{
			if(sc>ec)
			{
				be[sc]=[0,name];
				ending=1;
			}
			else if (el[sc])
			{
				be[sc]=[el[sc][0]+(el[sc][1]?(isNaN(el[sc][1])?el[sc][1]:'.start()'):'.start()'),(el[sc][1]?(isNaN(el[sc][1])?(el[sc][2]?el[sc][2]*1000:0):el[sc][1]*1000):0)];
				if(sc<ec)
				{
					if (!el[sc+1]&&(el[sc][1]?(el[sc][1]!=';'):1)){eval(el[sc][0]+".slink='"+name+"'");}
				}
				else
				{
					if ((el[sc][1]?(el[sc][1]!=';'):1))
					{
						eval(el[sc][0]+".slink='"+name+"'");
						waiting=1;
					}
					else{ending=1;}
				}
			}
			else{be[sc]=[0,name];}
		}
		this.step=function()
		{
			if(ending)
			{
				if(be[sc][0]){setTimeout(be[sc][0],be[sc][1])};
				stepping=0;sc=1;if(slink){var islink=slink;slink=0;eval(islink+".start()");}
				for(i=1;i<=ec;i++){if(el[i]){if ((el[i][1]?(el[i][1]!=';'):1)){eval(el[i][0]+".slink=0");}}}
			}
			else
			{
				be[sc][0]?setTimeout(be[sc][0],be[sc][1]):waiting=1;
				sc++;
			}
		}
		this.start=function()
		{
			resume();
			if(halted){sc=1;halted=0;}
			stepping=1;waiting=0;ending=0;
			while(!halted&&!waiting&!paused&&stepping){build();step();};
		}
		this.add=function()
		{
			if(!stepping){el.splice(1,el.length-1)}
			for (var i=0;i<arguments.length;i++){ec=el.push(arguments[i])-1;}
		}
		this.halt=function(){if(stepping){halted=1;stepping=0;paused=0;waiting=0;sc=0;for(i=1;i<=ec;i++){if(el[i]){if ((el[i][1]?(el[i][1]!=';'):1)){eval(el[i][0]+".slink=0");}}}}}
		this.pause=function(){if(waiting){paused=sc;}}
		this.resume=function(){if(paused){sc=paused;paused=0;}}
	}
}







