void CSchemaItem::SerializeDatabaseItem( ATTRIBUTEIDTODATAMAP &valuesMap, IArchive &ar )
{
	if( valuesMap.find( m_hszLabel.GetUniqueID() ) == valuesMap.end() || valuesMap[m_hszLabel.GetUniqueID()] == NULL )
	{
		valuesMap[m_hszLabel.GetUniqueID()] = new DATABASEDATA( m_DefaultValue );
	}

	DATABASEDATA *value = valuesMap[m_hszLabel.GetUniqueID()];
	TCHAR *tag = (TCHAR*)m_hszLabel.GetString();
	if( ar.IsReading() )
	{
		DBRead( value, &ar, tag );
	}
	else
	{
		DBWrite( value, &ar, tag );
	}
}
void CPrecacheObject::Serialize( IArchive &ar )
{
	if( ar.IsReading() )
	{
		// Version
		ar.Read( m_iVersion );
	
		// Number of Entries
		unsigned int tmpCount;
		ar.Read( tmpCount );
	
		// Read Entries and insert into the list
		for( unsigned int i = 0; i < tmpCount; i++ )
		{
			CHashString hszResourceName;
			StdString szResourceName;
			ar.Read( szResourceName );
			hszResourceName.Init( szResourceName );
			m_ResourceSet.insert( hszResourceName.GetUniqueID());
		}
	}
	
	else
	{
		// Version
		ar.Write( m_iVersion, _T("Version") );
		
		// Number of Entries
		ar.Write( (int)m_ResourceSet.size(), _T("NumEntries") );

		// Write out all the Entries from the list
		RESOURCESET::iterator itr = m_ResourceSet.begin();
		StdString szPrecacheEntry( _T("PrecacheEntry") );
		while( itr != m_ResourceSet.end() )
		{
			ar.StartClass( szPrecacheEntry );
			ar.Write( m_ToolBox->GetHashString( *itr ), _T("Name") );
			ar.EndClass();
			itr++;
		}
	}
}
void CQHStateMachineActionHandler::Serialize( IArchive &ar )
{
	if( ar.IsReading() )
	{
		float fVersion;
		StdString tempStr;
		ar.Read( fVersion, _T("version") );
		if( fVersion > m_fCurrentVersion )
		{
			LPCTSTR fmt = _T("%s(%d): Unsupported version (%f) of state machine action handler");
			m_ToolBox->Log( LOGERROR, fmt, __FILE__, __LINE__, fVersion );
			return;
		}
		ar.Read( tempStr, _T("name") );
		m_szName.Init( tempStr );
		ar.Read( tempStr, _T("actionName") );
		m_szActionName.Init( tempStr );

		IComponent *amanagerComponent = m_ToolBox->GetComponent( GetManagerName() );
		CQHStateMachineManager *amanager = static_cast<CQHStateMachineManager*>( amanagerComponent );
		CQHStateMachineEvent *aparentEvent = amanager->GetEvent( GetParentName() );
		if( aparentEvent != NULL )
		{
			aparentEvent->AddActionHandler( this );
		}
		else
		{
			m_ToolBox->Log( LOGERROR, _T("Could not find parent event %s for action handler %s."), GetParentName()->GetString(), GetName()->GetString() );
		}
	}
	else
	{
		ar.Write( m_fCurrentVersion, _T("version") );
		ar.Write( m_szName.GetString(), _T("name") );
		ar.Write( m_szActionName.GetString(), _T("actionName") );
	}
}
void CSchemaItem::Serialize( IArchive &ar )
{
	if( ar.IsReading() )
	{
		StdString name; // Dummy variable to read the name. It should already be stored as CObjectTemplate
		StdString type;
		StdString attributeClass;

		ar.Read( m_fVersion, _T("Version") );
		ar.Read( name, _T("Name") );
		ar.Read( type, _T("Type") );
		ar.Read( attributeClass, _T("Class") );
		m_hszLabel.Init( name );
		m_hszType.Init( type );
		m_hszClass.Init( attributeClass );
		DBRead( &m_DefaultValue, &ar, _T("Default") ); // IMPORTANT: DBRead is dependent on m_hszType. Make sure m_hszType has been initialized before calling DBRead.

		// NOTE: We are assuming the order in which schema items are instantiated will be
		//       the order in which to read data items.
		if( m_Schema != NULL )
		{
			m_Schema->RegisterSchemaItem( this );
		}
	}
	else
	{
		ar.StartClass(_T("CSchemaItem"));

		ar.Write( m_fVersion, _T("Version") );
		ar.Write( m_hszLabel.GetString(), _T("Name") );
		ar.Write( m_hszType.GetString(), _T("Type") );
		ar.Write( m_hszClass.GetString(), _T("Class") );
		DBWrite( &m_DefaultValue, &ar, _T("Default") );

		ar.EndClass();
	}
}
//---------------------------------------------------------------------
// Function:	Serialize
// Description:	serializes the values
//				(deserializaton if ar.IsReading() returns ture)
//              The order of the values if bound
// Parameters:	ar - IArchive object which shows if we are reading or writing
//---------------------------------------------------------------------
void CProjectSettings::Serialize(IArchive &ar)
{
	unsigned int i;
	if (ar.IsReading())
	{
		// Restore everthing to default
		Init();

		// set the variables according to the data in the file
		ar.Read(m_szProjectName);
		ar.Read(m_szVersion);
		ar.Read(m_szDirectory);
		ar.Read(m_szStartScriptName);
		ar.Read(m_szLastWorldFile);
		ar.Read(m_iNumDlls);

		// clear the previous Dll list
		m_ProjectDLLs.clear();

		for (i=0; i<m_iNumDlls; i++)
		{
			StdString dllName;
			ar.Read(dllName);
			m_ProjectDLLs.push_back( dllName );
		}

		//reading the other tags are done in the loadSaver project
		//it attempts to call the serialize function of the objects
		//with the names of the xml tags.
	}
	else
	{
		ar.Write(m_szProjectName, "ProjectName");
		ar.Write(m_szVersion, "Version");
		ar.Write(m_szDirectory, "Directory");
		ar.Write(m_szStartScriptName, "StartupScript");
		ar.Write(m_szLastWorldFile, "LastWorldFile");
		ar.Write(m_iNumDlls, "NumDLLS");
		for (i=0; i<m_iNumDlls; i++)
		{
			ar.StartClass("ProjectDLL");
			ar.Write(m_ProjectDLLs[i], "name");
			ar.EndClass();
		}
	}

	// both save and load means that no change has happend "since last save"
	IsChangedSinceLastSave = FALSE;

	// make the project ready to save/close
	// save happens only if IsChangedSince... is also true, so incorrect
	// data can't be saved, because the dialog box checks consistency.
	SetSettingsStateConsistency( TRUE );

	//TODO: the following are necessary only on project load?
	// than they can be moved to the load part of the if branches above...

	// change EE resource directory manually
	EngineGetToolBox()->SetDirectories(NULL , &m_szDirectory);

	// Loading a new project usually changes the resource directory as well.
	// As the m_szDirectory setter would send out the change message but it is
	// not called if on project load, we need to send it manually
	// Although the new dir is the content of the message, the most plugins will
	// use only the message to recognize they need to refresh their value and they
	// we get the new value from EE toolbox instead of the content of this message.
	SETWORKINGDIRECTORIESPARAMS swdp;
	swdp.ResourceDirectory = NULL;
	swdp.BaseDirectory = &m_szDirectory;
	static DWORD msgHash_SetDirectories = CHashString(_T("SetResourceDirectory")).GetUniqueID();
	EngineGetToolBox()->SendMessage(msgHash_SetDirectories, sizeof(SETWORKINGDIRECTORIESPARAMS), &swdp );

	// we need to set the current working dir of the OS. 
	// this is a win32 plugin, so we can call it directly:
	SetCurrentDirectory( m_szDirectory.c_str() );
}
void CLuaScriptVarList::Serialize(IArchive &ar )
{
	if(ar.IsReading())
	{
		// Read the Schema File Name
		StdString tmpFileName;
		ar.Read( tmpFileName, _T("Schema") );
		m_SchemaFileName = tmpFileName;

		// Read the VarCount for Parsing Purposes
		unsigned int VarCount = 0;
		ar.Read( VarCount, _T("VarCount") );

		for( unsigned int i = 0; i < VarCount; i++ )
		{
			CLuaScriptVar tmpVar;
			StdString tmpStringName;
			StdString tmpStringValue;
			bool tmpBoolIsDefault;
			ar.Read( tmpStringName, _T("Name")  );
			ar.Read( tmpStringValue, _T("Value") );
			ar.Read( tmpBoolIsDefault, _T("Default") );
			tmpVar.SetName( tmpStringName );
			tmpVar.SetValue( tmpStringValue );
			tmpVar.SetIsDefault( tmpBoolIsDefault );

			bool bFound = false;

			for( unsigned int j = 0; j < m_Variables.size(); j++ )
			{
				if( tmpVar.GetName() == m_Variables[j].GetName() )
				{
					bFound = true;
					if( tmpVar.GetValueAsString() != m_Variables[j].GetValueAsString() )
					{
						m_Variables[j].SetValue( tmpVar.GetValueAsString() );
						m_Variables[j].SetIsDefault( false );
					}
					break;
				}
			}

			if( bFound == false )
			{
				m_Variables.push_back( tmpVar );
			}
		}
	}

	else
	{
		ar.Write( m_SchemaFileName.GetString(), _T("Schema") );

		// Read the VarCount for Parsing Purposes
		ar.Write( (unsigned int)m_Variables.size(), _T("VarCount") );

		for( unsigned int i = 0; i < m_Variables.size(); i++ )
		{
			ar.StartClass(_T("CLuaScriptVar") );
			ar.Write( m_Variables[i].GetName(), _T("Name") );
			ar.Write( m_Variables[i].GetValueAsString(), _T("Value") );
			ar.Write( m_Variables[i].GetIsDefault(), _T("Default") );
			ar.EndClass();
		}
	}

}
void CTimeOfDayObject::Serialize( IArchive &ar )
{
	if(ar.IsReading())
	{
		// clear lists otherwise we will keep adding to them!!
		m_vSunLightFrames.clear();
		m_vFogFrames.clear();

		ar.Read( m_fTimeStart, _T("TimeStart") );
		ar.Read( m_fTimeRate, _T("TimeRate") );
	
		int iNumSunLightFrames = 0;
		ar.Read( iNumSunLightFrames, _T("NumSunLightFrames") );
		int iNumFogFrames = 0;
		ar.Read( iNumFogFrames, _T("NumFogFrames") );

		for( int i = 0; i < iNumSunLightFrames; i++ )
		{
			SUNLIGHTKEYFRAME tmpSunLightFrame;
			ar.Read( tmpSunLightFrame.m_wszName, _T("Name") );
			ar.Read( tmpSunLightFrame.m_AmbientColor, _T("AmbientColor") );
			ar.Read( tmpSunLightFrame.m_FullbrightColor, _T("FulLBrightColor") );
			ar.Read( tmpSunLightFrame.m_fDawnWeight, _T("DawnWeight") );
			ar.Read( tmpSunLightFrame.m_fNightWeight, _T("NightWeight") );
			m_vSunLightFrames.push_back( tmpSunLightFrame );
		}

		for( int i = 0; i < iNumFogFrames; i++ )
		{
			FOGKEYFRAME tmpFogFrame;
			ar.Read( tmpFogFrame.m_wszName, _T("Name") );
			ar.Read( tmpFogFrame.m_FogColor, _T("FogColor") );
			ar.Read( tmpFogFrame.m_fFogStart, _T("FogStart") );
			ar.Read( tmpFogFrame.m_fFogEnd, _T("FogEnd") );
			m_vFogFrames.push_back( tmpFogFrame );
		}
	}

	else
	{
		ar.Write( m_fTimeStart, _T("TimeStart") );
		ar.Write( m_fTimeRate, _T("TimeRate") );
	
		ar.Write( (int)m_vSunLightFrames.size(), _T("NumSunLightFrames") );
		ar.Write( (int)m_vFogFrames.size(), _T("NumFogFrames") );

		for( unsigned int i = 0; i < m_vSunLightFrames.size(); i++ )
		{
			ar.StartClass( _T("SunLightFrame") );
			ar.Write( m_vSunLightFrames[i].m_wszName, _T("Name") );
			ar.Write( m_vSunLightFrames[i].m_AmbientColor, _T("AmbientColor") );
			ar.Write( m_vSunLightFrames[i].m_FullbrightColor, _T("FulLBrightColor") );
			ar.Write( m_vSunLightFrames[i].m_fDawnWeight, _T("DawnWeight") );
			ar.Write( m_vSunLightFrames[i].m_fNightWeight, _T("NightWeight") );
			ar.EndClass();
		}

		for( unsigned int i = 0; i < m_vFogFrames.size(); i++ )
		{
			ar.StartClass( _T("FogFrame") );
			ar.Write( m_vFogFrames[i].m_wszName, _T("Name") );
			ar.Write( m_vFogFrames[i].m_FogColor, _T("FogColor") );
			ar.Write( m_vFogFrames[i].m_fFogStart, _T("FogStart") );
			ar.Write( m_vFogFrames[i].m_fFogEnd, _T("FogEnd") );
			ar.EndClass();
		}
	}
}
void CLanguage::Serialize( IArchive &ar )
{
	float saveVersion = 1.0f;
	if (ar.IsReading())
	{
		float readVersion;
		StdString szLanguageName;
		
		ar.Read(readVersion, _T("Version"));
		ar.Read(szLanguageName, _T("LanguageName"));
		ar.Read(m_iNumEntries, _T("NumEntries"));
		
		m_hszLanguageName = szLanguageName;

		CREATEOBJECTPARAMS cop;
		INITOBJECTPARAMS iop;
		SERIALIZEOBJECTPARAMS sop;
		static DWORD msgCreateObject = CHashString(_T("CreateObject")).GetUniqueID();
		static DWORD msgSerializeObject = CHashString(_T("SerializeObject")).GetUniqueID();
		static DWORD msgInitObject = CHashString(_T("InitObject")).GetUniqueID();

		StdString szEntryObjName;
		CHashString hszEntryObjBase, hszEntryObjName;
		static CHashString hszEntryType(_T("CLanguageEntry"));

		for (UINT i=0; i<m_iNumEntries; i++)
		{
			szEntryObjName = m_hszLanguageName.GetString();
			szEntryObjName += _T("_Entry");
			hszEntryObjBase = szEntryObjName;

			GENERATEUNIQUEOBJECTNAMEPARAMS generateNameParams;
			generateNameParams.name = &hszEntryObjBase;
			generateNameParams.newname = &hszEntryObjName;
			static DWORD msgHash_GenerateUniqueObjectName = CHashString(_T("GenerateUniqueObjectName")).GetUniqueID();
			m_ToolBox->SendMessage(msgHash_GenerateUniqueObjectName, sizeof(generateNameParams), &generateNameParams );

			cop.name = &hszEntryObjName;
			cop.parentName = GetName();
			cop.typeName = &hszEntryType;

			if (m_ToolBox->SendMessage(msgCreateObject, sizeof(CREATEOBJECTPARAMS), &cop) == MSG_HANDLED)
			{
				sop.name = &hszEntryObjName;
				sop.archive = &ar;
				m_ToolBox->SendMessage(msgSerializeObject, sizeof(SERIALIZEOBJECTPARAMS), &sop);

				iop.name = &hszEntryObjName;
				m_ToolBox->SendMessage(msgInitObject, sizeof(INITOBJECTPARAMS), &iop);

				IObject *entryObj = SINGLETONINSTANCE(CLanguageManager)->GetObjectByName(&hszEntryObjName, &hszEntryType);
				if (entryObj)
				{
					ILanguageEntry *langEntry = dynamic_cast<ILanguageEntry*>(entryObj);
					if (langEntry)
					{
						IHashString *hsKey = langEntry->GetKey();
						if (hsKey)
						{
							ENTRYKEYMAP::iterator mapIter = m_mEntryMapByKey.find(hsKey->GetUniqueID());
							if (mapIter == m_mEntryMapByKey.end())
							{
								m_mEntryMapByKey[hsKey->GetUniqueID()] = langEntry;
							}
							else
							{
								m_ToolBox->Log(LOGERROR, _T("%s %d: duplicate key found for %s, deleting language entry!\n"), 
									__FILE__, __LINE__, hsKey->GetString());

								DELETEOBJECTPARAMS dop;
								dop.name = &hszEntryObjName;
								
								static DWORD msgDeleteObject = CHashString(_T("DeleteObject")).GetUniqueID();
								m_ToolBox->SendMessage(msgDeleteObject, sizeof(DELETEOBJECTPARAMS), &dop);
							}
						}
						else
						{
							m_ToolBox->Log(LOGERROR, _T("%s %d: could not get key string from entry!\n"), 
								__FILE__, __LINE__);
						}
					}
					else
					{
						m_ToolBox->Log(LOGERROR, _T("%s %d: could not cast to language entry!\n"), 
								__FILE__, __LINE__);
					}
				}
				else
				{
					m_ToolBox->Log(LOGERROR, _T("%s %d: could not get object pointer from manager!\n"), 
								__FILE__, __LINE__);
				}
			}
			else
			{
				m_ToolBox->Log(LOGERROR, _T("%s %d: could not create entry object %s!\n"), 
					__FILE__, __LINE__, hszEntryObjName.GetString());
			}
		}
	}
	else
	{
		ar.Write(saveVersion, _T("Version"));
		ar.Write(m_hszLanguageName.GetString(), _T("LanguageName"));
		ar.Write(m_iNumEntries, _T("NumEntries"));

		ENTRYKEYMAP::iterator mapIter = m_mEntryMapByKey.begin();
		for (; mapIter != m_mEntryMapByKey.end(); mapIter++)
		{
			ILanguageEntry *entry = mapIter->second;
			if (entry)
			{
				ar.StartClass(_T("CLanguageEntry"));
				entry->Serialize(ar);
				ar.EndClass();
			}
		}
	}
}
void CGUIItem::Serialize( IArchive &ar )
{
	if(ar.IsReading())
	{
		CHashString versionName;
		static DWORD msgHash_GetFileVersion = CHashString(_T("GetFileVersion")).GetUniqueID();
		DWORD retval = EngineGetToolBox()->SendMessage(msgHash_GetFileVersion, sizeof(IHashString), &versionName);

		static DWORD Vers2_0a = CHashString(_T("2.0a")).GetUniqueID();
		static DWORD Vers2_0b = CHashString(_T("2.0b")).GetUniqueID();
		static DWORD Vers2_0c = CHashString(_T("2.0c")).GetUniqueID();

		int verNum = 0;
		
		if (versionName.GetUniqueID() == Vers2_0a)
		{
			verNum = 3;
		}
		else if (versionName.GetUniqueID() == Vers2_0b)
		{
			verNum = 4;
		}
		else if (versionName.GetUniqueID() == Vers2_0c)
		{
			verNum = 5;
		}
		else 
		{
			m_ToolBox->Log(LOGERROR, _T("Bad GUI file version!"));
			assert(0);
			return;
		}

		float loadVersion = 0.0f;

		if (verNum >= 4)
		{
			ar.Read(loadVersion);
			if (loadVersion == 0.0f)
			{
				// initial serialize from editor; set to save version (up to date schema)
				loadVersion = m_fSaveVersion;
			}
		}

		ar.Read(m_szNorm);
		ar.Read(m_szHigh);
		ar.Read(m_szSelect);
		ar.Read(m_szGrayed);		
		ar.Read(m_szDecalNorm);
		ar.Read(m_szDecalHigh);
		ar.Read(m_szDecalSelect);
		ar.Read(m_szDecalGrayed);
		ar.Read(m_fDecalOffsetX);
		ar.Read(m_fDecalOffsetY);		
		ar.Read(m_szText);		
		ar.Read(m_szTextHigh);
		ar.Read(m_szTextSelect);
		ar.Read(m_szTextGrayed);
		ar.Read(m_szFont);		
		ar.Read(m_szFontBold);	
		ar.Read(m_iFontsize);
		ar.Read(m_iNormFontColor);
		ar.Read(m_iHighFontColor);
		ar.Read(m_iSelFontColor);
		ar.Read(m_iGrayFontColor);
		ar.Read(m_iTextOffSetX);
		ar.Read(m_iTextOffSetY);
		ar.Read(m_bCenterText);
		ar.Read(m_bSmartScale);
	
		CreateItem();
	}
	else
	{
		ar.Write(m_fSaveVersion, _T("Version"));
		ar.Write(m_szNorm, _T("NormTexture"));
		ar.Write(m_szHigh, _T("HighTexture"));
		ar.Write(m_szSelect, _T("SelectTexture"));
		ar.Write(m_szGrayed, _T("GrayTexture"));
		ar.Write(m_szDecalNorm, _T("NormDecalTexture"));
		ar.Write(m_szDecalHigh, _T("HighDecalTexture"));
		ar.Write(m_szDecalSelect, _T("SelectDecalTexture"));
		ar.Write(m_szDecalGrayed, _T("GrayDecalTexture"));
		ar.Write(m_fDecalOffsetX, _T("DecalOffsetX"));
		ar.Write(m_fDecalOffsetY, _T("DecalOffsetY"));		
		ar.Write(m_szText, _T("StaticText"));
		ar.Write(m_szTextHigh, _T("StaticTextHigh"));
		ar.Write(m_szTextSelect, _T("StaticTextSelect"));
		ar.Write(m_szTextGrayed, _T("StaticTextGrayed"));		
		ar.Write(m_szFont, _T("FontName"));
		ar.Write(m_szFontBold, _T("BoldFontName"));
		ar.Write(m_iFontsize, _T("Fontsize"));
		ar.Write(m_iNormFontColor, _T("NormFontColor"));
		ar.Write(m_iHighFontColor, _T("HighFontColor"));
		ar.Write(m_iSelFontColor, _T("SelFontColor"));
		ar.Write(m_iGrayFontColor, _T("GrayFontColor"));
		ar.Write(m_iTextOffSetX, _T("TextOffSetX"));
		ar.Write(m_iTextOffSetY, _T("TextOffSetY"));
		ar.Write(m_bCenterText, _T("CenterText"));
		ar.Write(m_bSmartScale, _T("SmartScale"));
	}
}
void CGUIStatusBar::Serialize(IArchive &ar)
{
	if(ar.IsReading())
	{
		CHashString versionName;
		static DWORD msgHash_GetFileVersion = CHashString(_T("GetFileVersion")).GetUniqueID();
		DWORD retval = EngineGetToolBox()->SendMessage(msgHash_GetFileVersion, sizeof(IHashString), &versionName);

		static DWORD vers2_0a = CHashString(_T("2.0a")).GetUniqueID();
		static DWORD vers2_0b = CHashString(_T("2.0b")).GetUniqueID();
		static DWORD vers2_0c = CHashString(_T("2.0c")).GetUniqueID();

		int verNum = 0;
		
		if (versionName.GetUniqueID() == vers2_0a)
		{
			verNum = 3;
		}
		else if (versionName.GetUniqueID() == vers2_0b)
		{
			verNum = 4;
		}
		else if (versionName.GetUniqueID() == vers2_0c)
		{
			verNum = 5;
		}
		else 
		{
			m_ToolBox->Log(LOGERROR, _T("Bad GUI file version!"));
			assert(0);
			return;
		}

		float unitVersion = 0.0f;
		
		if (verNum >= 4)
		{
			ar.Read(unitVersion);
			if (unitVersion == 0.0f)
			{
				// initial serialize from editor; set to save version (up to date schema)
				unitVersion = m_fSaveVersion;
			}
		}
		ar.Read(m_szFullTex);
		ar.Read(m_szBackgroundTex);		
		ar.Read(m_szTwoHundredTex);
		ar.Read(m_szThreeHundredTex);
		ar.Read(m_szFourHundredTex);
		if (unitVersion >= 1.1f)
		{
			ar.Read(m_szAnimGhostBarTex, _T("AnimGhostBarTex"));
		}
		ar.Read(m_bForwardRender);
		ar.Read(m_iLeftOffset);
		ar.Read(m_iTopOffset);
		ar.Read(m_iRightOffset);
		ar.Read(m_iBottomOffset);
		int percentage;
		ar.Read(percentage);
		m_fLastPercentage = m_fPercentComplete;
		m_fPercentComplete = (float)percentage / 100.f;		

		if (unitVersion >= 1.1f)
		{
			ar.Read(m_bAnimateBarShift, _T("AnimateBarShift"));
			ar.Read(m_fBarAnimationTime, _T("BarAnimationTime"));	
		}

		if (unitVersion >= 1.2f)
		{
			ar.Read(m_bLastPercentLinger, _T("LingerGhostAnim"));
			ar.Read(m_fLingerTime, _T("LingerTime"));
		}

		if (unitVersion >= 1.3f)
		{
			ar.Read(m_bIsLoadingBar, _T("IsLoadingBar"));
		}

		m_fBarAnimationET = 0.0f;
		
		CreateStatusBar();
	}
	else
	{
		ar.Write(m_fSaveVersion, _T("Version"));
		ar.Write(m_szFullTex, _T("FullTex"));
		ar.Write(m_szBackgroundTex, _T("BGTex"));
		ar.Write(m_szTwoHundredTex, _T("TwoHndrPcntTex"));
		ar.Write(m_szThreeHundredTex, _T("ThreeHndrPcntTex"));
		ar.Write(m_szFourHundredTex, _T("FourHndrPcntTex"));
		ar.Write(m_szAnimGhostBarTex, _T("AnimGhostBarTex"));
		ar.Write(m_bForwardRender, _T("FowardRender"));
		ar.Write(m_iLeftOffset, _T("LeftOffset"));
		ar.Write(m_iTopOffset, _T("TopOffset"));
		ar.Write(m_iRightOffset, _T("RightOffset"));
		ar.Write(m_iBottomOffset, _T("BottomOffset"));
		ar.Write(0, _T("EditorRenderPercent"));		
		ar.Write(m_bAnimateBarShift, _T("AnimateBarShift"));
		ar.Write(m_fBarAnimationTime, _T("BarAnimationTime"));
		ar.Write(m_bLastPercentLinger, _T("LingerGhostAnim"));
		ar.Write(m_fLingerTime, _T("LingerTime"));
		ar.Write(m_bIsLoadingBar, _T("IsLoadingBar"));
	}
}
void CGUIPage::Serialize(IArchive &ar)
{
	CGUIManager *manager;
	static CHashString managerName(_T("CGUIManager"));
	IObject *Object;
	StdString pageName;
	StdString guiName;
	StdString guiType;
	StdString type;
	int iNumGuiElements;
	OBJECTLIST::iterator olIter;

	if(ar.IsReading())
	{
		CHashString versionName;
		static DWORD msgHash_GetFileVersion = CHashString(_T("GetFileVersion")).GetUniqueID();
		DWORD retval = EngineGetToolBox()->SendMessage(msgHash_GetFileVersion, sizeof(IHashString), &versionName);

		static DWORD Vers2_0a = CHashString(_T("2.0a")).GetUniqueID();
		static DWORD Vers2_0b = CHashString(_T("2.0b")).GetUniqueID();
		static DWORD Vers2_0c = CHashString(_T("2.0c")).GetUniqueID();

		int verNum = 0;
		
		if (versionName.GetUniqueID() == Vers2_0a)
		{
			verNum = 3;
		}
		else if (versionName.GetUniqueID() == Vers2_0b)
		{
			verNum = 4;
		}
		else if (versionName.GetUniqueID() == Vers2_0c)
		{
			verNum = 5;
		}
		else 
		{
			m_ToolBox->Log(LOGERROR, _T("Bad GUI file version!"));
			assert(0);
			return;
		}

		float loadVersion = 0.0f;

		if (verNum >= 4)
		{
			ar.Read(loadVersion);
			if (loadVersion == 0.0f)
			{
				// initial serialize from editor; set to save version (up to date schema)
				loadVersion = m_fSaveVersion;
			}
		}

		ar.Read(iNumGuiElements);
		while(iNumGuiElements != 0)
		{
			ar.Read(guiName);
			ar.Read(guiType);

			CHashString szhGuiName(guiName.c_str());
			CHashString szhGuiType(guiType.c_str());

			// ask gui manager for the object to add
			manager = dynamic_cast<CGUIManager*>(EngineGetToolBox()->GetComponent( &managerName ));
			if (!manager)
			{
				EngineGetToolBox()->SetErrorValue(ERR_NULL_POINTER);
				EngineGetToolBox()->Log(LOGERROR, _T("could not cast IComponent from EngineToolBox to CGUIManager\n")); 
				return;
			}
			Object = manager->GetObject(&szhGuiName, &szhGuiType);
			if(Object == NULL)
			{
				CREATEOBJECTPARAMS cop;
				INITOBJECTPARAMS iop;
				cop.name = &szhGuiName;
				cop.typeName = &szhGuiType;
				cop.parentName = GetName();
				iop.name = &szhGuiName;

				static DWORD msgHash_CreateObject = CHashString(_T("CreateObject")).GetUniqueID();
				m_ToolBox->SendMessage(msgHash_CreateObject, sizeof(CREATEOBJECTPARAMS), &cop, NULL, NULL);
				static DWORD msgHash_InitObject = CHashString(_T("InitObject")).GetUniqueID();
				m_ToolBox->SendMessage(msgHash_InitObject, sizeof(INITOBJECTPARAMS), &cop, NULL, NULL);
				Object = manager->GetObject(&szhGuiName, &szhGuiType);
			}
			m_ObjectList.push_back(Object);
			iNumGuiElements--;
		}

	}
	else //ar.IsWritting()
	{
		TCHAR strNum[50];
		int count = 1;
		StdString itemName;
		StdString itemType;

		//pageName = GetName()->GetString();
		//type = GetComponentType()->GetString();
		iNumGuiElements = m_ObjectList.size();

		ar.Write(m_fSaveVersion, _T("Version"));

		// start the page class
		//ar.StartClass(type); // <CGUIPage
		// write the page's name
		//ar.Write( pageName, _T("Name") );
		// write the number of gui elements 
		ar.Write( iNumGuiElements, _T("NumGuiElements") );
		
		for(olIter = m_ObjectList.begin(); olIter != m_ObjectList.end();
			olIter++)
		{

			_ltot(count, strNum, 10);
			itemName = StdString(_T("GuiName")) + strNum;
			itemType = StdString(_T("GuiType")) + strNum;

			guiName = (*olIter)->GetName()->GetString();
			ar.Write( guiName, itemName );
			guiType = (*olIter)->GetComponentType()->GetString();
			ar.Write( guiType, itemType );
			count++;
		}
		//ar.EndClass(); // </CGUIPage>
	}
}
void CGUIStaticText::Serialize( IArchive &ar )
{
	float fSaveVersion = 1.2f;
	if(ar.IsReading())
	{
		CHashString versionName;
		static DWORD msgHash_GetFileVersion = CHashString(_T("GetFileVersion")).GetUniqueID();
		DWORD retval = EngineGetToolBox()->SendMessage(msgHash_GetFileVersion, sizeof(IHashString), &versionName);

		static DWORD vers2_0a = CHashString(_T("2.0a")).GetUniqueID();
		static DWORD vers2_0b = CHashString(_T("2.0b")).GetUniqueID();
		static DWORD vers2_0c = CHashString(_T("2.0c")).GetUniqueID();

		int verNum = 0;
		if (versionName.GetUniqueID() == vers2_0a)
		{
			verNum = 3;
		}
		else if (versionName.GetUniqueID() == vers2_0b)
		{
			verNum = 4;
		}
		else if (versionName.GetUniqueID() == vers2_0c)
		{
			verNum = 5;
		}
		else 
		{
			m_ToolBox->Log(LOGERROR, _T("Bad GUI file version!"));
			assert(0);
			return;
		}

		float loadVersion = 0.0f;

		if (verNum >= 4)
		{
			ar.Read(loadVersion);
			if (loadVersion == 0.0f)
			{
				// initial serialize from editor; set to save version (up to date schema)
				loadVersion = fSaveVersion;
			}
		}

		ar.Read(m_szNorm);
		ar.Read(m_szText);
		ar.Read(m_szFilename);
		ar.Read(m_bLoadFromFile);

		if (loadVersion >= 1.2f)
		{
			ar.Read(m_bUseLanguageEntry);
			ar.Read(m_szLangEntryKey);
		}
		
		ar.Read(m_szFont);
		ar.Read(m_iFontsize);
		
		ar.Read(m_iNormFontColor);
		ar.Read(m_iHighFontColor);
		ar.Read(m_iSelectFontColor);
		ar.Read(m_iGrayFontColor);
		ar.Read(m_iTextOffSetX);
		ar.Read(m_iTextOffSetY);
		ar.Read(m_bCenterText);
		ar.Read(m_bHideTexture);

		if (loadVersion >= 1.1f)
		{
			ar.Read(m_bUseFontShadow, _T("UseFontDropShadow"));
			ar.Read(m_iFontShadowColor, _T("FontShadowColor"));
			ar.Read(m_iFontShadowXScale, _T("FontShadowXScale"));
			ar.Read(m_iFontShadowYScale, _T("FontShadowYScale"));
			ar.Read(m_iFontShadowXOffset, _T("FontShadowXOffset"));
			ar.Read(m_iFontShadowYOffset, _T("FontShadowYOffset"));
		}

		CreateItem();
	}
	else
	{
		ar.Write(fSaveVersion, _T("Version"));
		ar.Write(m_szNorm, _T("NormTexture"));
		ar.Write(m_szText, _T("StaticText"));
		ar.Write(m_szFilename, _T("Filename"));
		ar.Write(m_bLoadFromFile, _T("LoadFromFile"));
		ar.Write(m_bUseLanguageEntry, _T("UseLanguageEntry"));
		ar.Write(m_szLangEntryKey, _T("LanguageEntryKey"));
		ar.Write(m_szFont, _T("FontName"));
		ar.Write(m_iFontsize, _T("Fontsize"));
		ar.Write(m_iNormFontColor, _T("NormFontColor"));
		ar.Write(m_iHighFontColor, _T("HighFontColor"));
		ar.Write(m_iSelectFontColor, _T("SelectFontColor"));
		ar.Write(m_iGrayFontColor, _T("GrayFontColor"));
		ar.Write(m_iTextOffSetX, _T("TextOffSetX"));
		ar.Write(m_iTextOffSetY, _T("TextOffSetY"));
		ar.Write(m_bCenterText, _T("CenterText"));
		ar.Write(m_bHideTexture, _T("HideTexture"));
		ar.Write(m_bUseFontShadow, _T("UseFontDropShadow"));
		ar.Write(m_iFontShadowColor, _T("FontShadowColor"));
		ar.Write(m_iFontShadowXScale, _T("FontShadowXScale"));
		ar.Write(m_iFontShadowYScale, _T("FontShadowYScale"));
		ar.Write(m_iFontShadowXOffset, _T("FontShadowXOffset"));
		ar.Write(m_iFontShadowYOffset, _T("FontShadowYOffset"));
	}
}