phocusAPI=function(){};
$pr=phocusAPI.prototype;

$pr.register=function(_class)
{
	_class.prototype=new phocusAPI();
	return _class.prototype;
}
$pr.trylist=function(arr)
{
	for(var i=0;i<arr.length;i++)
	{
		try
		{
			return arr[i]();
		} catch(e)
		{
			this.Catcher.log('WARNING!\r\ntrylist failure: '+e+'\r\n---------------------\r\n'+arr[i]+'\r\n---------------------');
		}
	}
	this.Catcher.log('Trylist exited without completing.');
	return false;
}
$pr.toString=function()
{
	return 'phocus javascript API V1.0 - By Liam Egan.';
}
$pr.discard=function(){};
phocus=new phocusAPI();

phocus.Catcher=
{
	errors:[],
	debug:false,

	log:function(err)
	{
		this.errors.push(err);
		if(this.debug)
			alert(err);
	},
	dump:function()
	{
		for(var i=0;i<this.errors.length;i++)
			alert(this.errors[i]);
	}
};

phocus.Runtime=
{
	frequency:20,
	c:0,
	length:0,
	runlist:{},
	
	// object, method, variabled, delay	, runtime, end object, end method, end variables
	addrun:function(o,m,v,d,r,eo,em,ev)
	{
		var p=this;
		var id='run_'+(this.c++);
		var nv=[];
		if(v)
			for(var i=0;i<v.length;i++)
				nv.push(v[i]);
		nv.push(null);
		nv.push(null);
		
		this.runlist[id]={o:o,m:m,v:nv,d:d,r:r,rr:r,eo:eo,em:em,ev:ev,id:id,escape:function(){p.removerun(this.id);}};
		if(this.length==0)
			this.startrun();
		this.length++;
		return this.runlist[id];
	},
	removerun:function(id)
	{
		if(!this.runlist[id])
			return;
		
		delete this.runlist[id];
		this.length--;
		if(this.length==0)
			this.stoprun();
	},
	startrun:function(){var _method=this.run; var _object=this;this.timer=setInterval(function(){_method.apply(_object)}, this.frequency);},
	stoprun:function(){clearInterval(this.timer);},
	run:function()
	{
		for(var i in this.runlist)
		{
			var it=this.runlist[i];
			if(it.d-->0)continue;
			if(it.r>0)
			{
				it.v[it.v.length-2]=it.r;
				it.v[it.v.length-1]=it.rr;
				var rtn=it.o[it.m].apply(it.o,it.v);
				it.r=typeof rtn=='number' ? rtn : it.r-1;
				if(it.r)continue;
			}
			
			if(it.eo==null)
				it.eo=phocus;
			if(it.em==null)
				it.em='discard';
			if(it.ev==null)
				it.ev=[];
			
			it.eo[it.em].apply(it.eo,it.ev);
			
			this.endrun(i);
		}
	},
	endrun:function(i)
	{
		this.removerun(i);
	}
};