Undo = new function()
{
  var _undo = new Array();
	var _redo = new Array();
	
	return{
    
		Add: function(undoObject)
		{
		  _undo.push(undoObject);
		},
		
		CanRedo: function()
		{
		  return _redo.length > 0;
		},
		
		CanUndo: function()
		{
		  return _undo.length > 0;
		},
		
		Redo: function()
		{
		  try{
			
  		  var obj = _redo.pop();
  			
  			if(obj == null)
  			  return;
  			
  			_undo.push(obj);
  			
  			obj.Redo();
				
		  }catch(err){Log.Add("Undo.Redo", err, LogType.Error);}
		},
		
		Reset: function()
		{
		  _undo.reset();
			_redo.reset();
		},
		
		Undo: function()
		{
		  try{
  		  var obj = _undo.pop();
  			
  			if(obj == null)
  			  return;
  			
  			_redo.push(obj);
  			
  			obj.Undo();

		  }catch(err){Log.Add("Undo.Undo", err, LogType.Error);}
		}
	}
}

function UndoObject()
{
  var _undoCallback = null;
	
	var _undoParameters = null;
	
  var _redoCallback = null;
	
	var _redoParameters = null;	
	
	
  
	
	this.AddRedo = function(redoCallback, redoParams)
	{
    _redoCallback = redoCallback;
  	
  	_redoParameters = redoParams;	
	}	

	
  this.AddUndo = function(undoCallback, undoParams)
	{
    _undoCallback = undoCallback;
  	
  	_undoParameters = undoParams;	
	}
	

  this.Redo = function()
	{
	  try{
  	  _redoCallback(_redoParameters);
    }catch(err){Log.Add("UndoObject.Execute", err, LogType.Error);}			
	}		

	
  this.Undo = function()
	{
	  try{
  	  _undoCallback(_undoParameters);
    }catch(err){Log.Add("UndoObject.Execute", err, LogType.Error);}			
	}
}	
