void JS_fwrite( flusspferd::string fileName, flusspferd::string str )
{
	std::ofstream OutFile( ( std::string("./js_files/") + fileName.to_string()).c_str() );

	if( OutFile.is_open() )
	{
		OutFile.write( str.to_string().c_str(), MIN(str.size(),1024) );
	}
	OutFile.close();
}
flusspferd::value JS_getUserIdByUserName(flusspferd::string userName)
{
	PlayerIndex *playerIndex = CharacterUtil::getPlayerIndexByUserName(userName.to_string());

	if(playerIndex == NULL)
		return flusspferd::object();
	return flusspferd::value(playerIndex->id);
}
flusspferd::value JS_loadSingleObjectFromDatabase(flusspferd::string objectId)
{
	boost::uuids::string_generator uuidGenerator;

	Object *object = Object::loadSingleItem(uuidGenerator(objectId.to_string()), true);

	return lookupValue(object);
}
void JS_saveSingleObjectToDatabase(JSObject *object, flusspferd::string holderType, flusspferd::string holderId)
{
	if(object->toReal() && object->toReal()->IsPurged() == false) {

		if(holderType.size() < 1) {

			throw flusspferd::exception("Attempting to save object to database with an empty holder type.");
		}

		Object::saveItemToTopLevelHolder(holderType.c_str()[0], holderId.to_string(), object->toReal());
	}
}
flusspferd::value JS_sendQuery( flusspferd::string qBuffer )
{
	sql::Query MyQuery;
	try {
		MyQuery = gameDatabase->sendQuery( qBuffer.to_string() );
	} catch( sql::QueryException e ) {
		MudLog(BRF, LVL_APPR, TRUE, "JavaScript : sql::Query() : %s", e.getMessage().c_str());
		return flusspferd::value();
	}
	if( MyQuery.use_count() == 0 )
		return flusspferd::value();
	JSBindable *b = new sqlJSQuery( MyQuery );
	return lookupValue( b );
}
flusspferd::string JS_fread( flusspferd::string fileName )
{
	std::string inputBuffer;
	char cBuf[1025];
	std::ifstream InFile( (std::string("./js_files/") + fileName.to_string()).c_str() );
	if( InFile.is_open() )
	{
		InFile.get(cBuf, 1024);
		cBuf[ InFile.gcount() ] = '\0';
		InFile.close();
		return flusspferd::string( cBuf );
	}
	return flusspferd::string( "" );
}
flusspferd::array JS_loadObjectsByHolderFromDatabase(flusspferd::string holderType, flusspferd::string holderId)
{
	flusspferd::array objects = flusspferd::create_array();

	if(holderType.size() == 0) {

		throw flusspferd::exception("Attempting to load objects from holder of empty type.");
	}

	std::list< Object* > objectList = Object::loadItemList(true, holderType.c_str()[0], holderId.to_string());

	while(objectList.empty() == false) {
		objects.call("push", lookupValue(objectList.front()));
//		objects.push(lookupValue(objectList.front()));

		objectList.pop_front();
	}

	return objects;
}
flusspferd::string JS_md5( flusspferd::string key )
{
	return flusspferd::string(MD5::getHashFromString( key.to_string().c_str() ));
}
flusspferd::string JS_sqlEsc( flusspferd::string qBuffer )
{
	return sql::escapeString( qBuffer.to_string() );
}
flusspferd::string JS_getWeaveAttribute( int wVnum, flusspferd::string attribute )
{
	Weave *w = WeaveManager::GetManager().GetWeave( wVnum );
	return (w ? w->getAttribute(attribute.to_string()) : "<Invalid>");
}
int JS_getSkillVnum( flusspferd::string wName )
{
	Weave *w = WeaveManager::GetManager().GetWeave( wName.to_string() );
	return (w ? w->getVnum() : 0);
}
void JS_mudLog( int type, int lvl, flusspferd::string str )
{
	MudLog(type, lvl, TRUE, StringUtil::vaEscape( str.to_string() ).c_str());
}