//
// Env
//
string	CCommandEventManager::CEnvironment::replace(const string &text)
{
	uint	start = 0, stop;
	string	replaced = text;

	do
	{
		start = replaced.find_first_of('$', start);
		if (start == string::npos || start == replaced.size()-1)
			break;

		if (replaced[start+1] == '$')
		{
			replaced.erase(start, 1);
			++start;
			continue;
		}
		else if (replaced[start+1] == '(')
		{
			stop = replaced.find_first_of(')', start+1);
			if (stop == string::npos)
				break;
			string	val = get(replaced.substr(start+2, stop-start-2));
			replaced.erase(start, stop-start+1);
			replaced.insert(start, val);
			start += val.size();
		}
		else if (replaced[start+1] == '[')
		{
			stop = replaced.find_first_of(']', start+1);
			if (stop == string::npos)
				break;

			string	var = replaced.substr(start+2, stop-start-2);
			string	val = "";
			ICommand::TCommand::iterator	it = ICommand::Commands->find(var);
			if (it != ICommand::Commands->end())
			{
				IVariable	*variable = dynamic_cast<IVariable*>((*it).second);
				if (variable != NULL)
				{
					val = variable->toString();
				}
			}
			replaced.erase(start, stop-start+1);
			replaced.insert(start, val);
			start += val.size();
		}
		else
		{
			++start;
		}
	}
	while (start < replaced.size());

	return replaced;
}
/**
 * cbShardOpenStateFile()
 * Callback for ShardOpenStateFile
 */
void	cbShardOpenStateFile(IVariable &var)
{
	// remove previous file change callback
	if (!ShardOpenStateFileName.empty())
	{
		CFile::removeFileChangeCallback(ShardOpenStateFileName);
		nlinfo("Removed callback for ShardOpenStateFileName file '%s'", ShardOpenStateFileName.c_str());
	}

	ShardOpenStateFileName = var.toString();

	if (!ShardOpenStateFileName.empty())
	{
		// set new callback for the file
		CFile::addFileChangeCallback(ShardOpenStateFileName, updateShardOpenFromFile);
		nlinfo("Set callback for ShardOpenStateFileName file '%s'", ShardOpenStateFileName.c_str());

		// and update state from file...
		updateShardOpenFromFile(ShardOpenStateFileName);
	}
}