
var LateBound = {};

LateBound.init= function()
{
	this.m_works = new Array();
	this.m_workers = new Array();
};
LateBound.loadAdhoc= function(workId, objectId, objectUrl)
{
	if(eval("(typeof(" + objectId + ") != 'undefined' && " + objectId + "!= null)"))
		this.setWorkObject(workId, objectId);
	else
	{
		var _workId = workId;
		var _objectId = objectId;
		
		var _objects = this.m_works[workId];
	
	    if(!_objects)
	    {
		    _objects = new Array();
		    this.m_works[workId] = _objects;
	    }
	    
	    if(typeof(_objects[_objectId]) == "undefined")
	    {
	        _objects[_objectId] = false;
		    JsUtility.attachCallback(objectId, 
					function(object)
					{
						LateBound.setWorkObject(_workId, _objectId);
					});
					
		    JsUtility.registerScript(objectUrl);
		}
	}
};
LateBound.setWorkObject= function(workId, objectId)
{
	var _objects = this.m_works[workId];
	
	if(!_objects)
	{
		_objects = new Array();
		this.m_works[workId] = _objects;
	}
	
	_objects[objectId] = true;
}
LateBound.checkWork= function(workId)
{
	var _state = this.m_workers[workId];
	if(_state && !_state.Running)
	{
		_state.Running = true;
		for(var i=0; i < _state.Objects.length; i++)
		{
		    var _works = this.m_works[_state.WorkId];
		    
			if(!_works || !_works[_state.Objects[i]])
			{
				_state.Running = false;
				return;
			}
		}
		
		window.clearInterval(_state.Interval);
		delete this.m_works[_state.WorkId];
		delete this.m_workers[_state.WorkId];
		
		if(_state.Code)
		    eval(_state.Code);
		    
		JsUtility.invokeCallback("Work:" + workId, _state);    
	}
}
LateBound.waitAllThenExecute= function(workId, objects, evalCode)
{
	var _workId = workId;
	var _state = {WorkId: _workId, Objects: objects, Code: evalCode};
	this.m_workers[_workId] = _state;
	_state.Interval = window.setInterval(function()
										{
											LateBound.checkWork(_workId);
										}, 
										100);
};


LateBound.init();

