diff --git a/gui/animation.cpp b/gui/animation.cpp
index 77d7b54..8c92278 100644
--- a/gui/animation.cpp
+++ b/gui/animation.cpp
@@ -28,109 +28,109 @@
 
 GUIAnimation::GUIAnimation(xml_node<>* node)
 {
-    xml_node<>* child;
-    xml_attribute<>* attr;
+	xml_node<>* child;
+	xml_attribute<>* attr;
 
-    mAnimation = NULL;
-    mFrame = 1;
-    mFPS = 1;
-    mLoop = -1;
-    mRender = 1;
-    mUpdateCount = 0;
+	mAnimation = NULL;
+	mFrame = 1;
+	mFPS = 1;
+	mLoop = -1;
+	mRender = 1;
+	mUpdateCount = 0;
 
-    if (!node)  return;
+	if (!node)  return;
 
-    child = node->first_node("resource");
-    if (child)
-    {
-        attr = child->first_attribute("name");
-        if (attr)
-            mAnimation = (AnimationResource*) PageManager::FindResource(attr->value());
-    }
+	child = node->first_node("resource");
+	if (child)
+	{
+		attr = child->first_attribute("name");
+		if (attr)
+			mAnimation = (AnimationResource*) PageManager::FindResource(attr->value());
+	}
 
-    // Load the placement
-    LoadPlacement(node->first_node("placement"), &mRenderX, &mRenderY, NULL, NULL, &mPlacement);
+	// Load the placement
+	LoadPlacement(node->first_node("placement"), &mRenderX, &mRenderY, NULL, NULL, &mPlacement);
 
-    child = node->first_node("speed");
-    if (child)
-    {
-        attr = child->first_attribute("fps");
-        if (attr)
-            mFPS = atoi(attr->value());
-        attr = child->first_attribute("render");
-        if (attr)
-            mRender = atoi(attr->value());
-    }
-    if (mFPS > 30)  mFPS = 30;
+	child = node->first_node("speed");
+	if (child)
+	{
+		attr = child->first_attribute("fps");
+		if (attr)
+			mFPS = atoi(attr->value());
+		attr = child->first_attribute("render");
+		if (attr)
+			mRender = atoi(attr->value());
+	}
+	if (mFPS > 30)  mFPS = 30;
 
-    child = node->first_node("loop");
-    if (child)
-    {
-        attr = child->first_attribute("frame");
-        if (attr)
-            mLoop = atoi(attr->value()) - 1;
-        attr = child->first_attribute("start");
-        if (attr)
-            mFrame = atoi(attr->value());
-    }
+	child = node->first_node("loop");
+	if (child)
+	{
+		attr = child->first_attribute("frame");
+		if (attr)
+			mLoop = atoi(attr->value()) - 1;
+		attr = child->first_attribute("start");
+		if (attr)
+			mFrame = atoi(attr->value());
+	}
 
-    // Fetch the render sizes
-    if (mAnimation && mAnimation->GetResource())
-    {
-        mRenderW = gr_get_width(mAnimation->GetResource());
-        mRenderH = gr_get_height(mAnimation->GetResource());
+	// Fetch the render sizes
+	if (mAnimation && mAnimation->GetResource())
+	{
+		mRenderW = gr_get_width(mAnimation->GetResource());
+		mRenderH = gr_get_height(mAnimation->GetResource());
 
-        // Adjust for placement
-        if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
-        {
-            if (mPlacement == CENTER)
-                mRenderX -= (mRenderW / 2);
-            else
-                mRenderX -= mRenderW;
-        }
-        if (mPlacement != TOP_LEFT && mPlacement != TOP_RIGHT)
-        {
-            if (mPlacement == CENTER)
-                mRenderY -= (mRenderH / 2);
-            else
-                mRenderY -= mRenderH;
-        }
-        SetPlacement(TOP_LEFT);
-    }
+		// Adjust for placement
+		if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
+		{
+			if (mPlacement == CENTER)
+				mRenderX -= (mRenderW / 2);
+			else
+				mRenderX -= mRenderW;
+		}
+		if (mPlacement != TOP_LEFT && mPlacement != TOP_RIGHT)
+		{
+			if (mPlacement == CENTER)
+				mRenderY -= (mRenderH / 2);
+			else
+				mRenderY -= mRenderH;
+		}
+		SetPlacement(TOP_LEFT);
+	}
 }
 
 int GUIAnimation::Render(void)
 {
-    if (!mAnimation || !mAnimation->GetResource(mFrame))      return -1;
+	if (!mAnimation || !mAnimation->GetResource(mFrame))	return -1;
 
-    gr_blit(mAnimation->GetResource(mFrame), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
-    return 0;
+	gr_blit(mAnimation->GetResource(mFrame), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+	return 0;
 }
 
 int GUIAnimation::Update(void)
 {
-    if (!mAnimation)        return -1;
+	if (!mAnimation)		return -1;
 
-    // Handle the "end-of-animation" state
-    if (mLoop == -2)        return 0;
+	// Handle the "end-of-animation" state
+	if (mLoop == -2)		return 0;
 
-    // Determine if we need the next frame yet...
-    if (++mUpdateCount > 30 / mFPS)
-    {
-        mUpdateCount = 0;
-        if (++mFrame >= mAnimation->GetResourceCount())
-        {
-            if (mLoop < 0)
-            {
-                mFrame = mAnimation->GetResourceCount() - 1;
-                mLoop = -2;
-            }
-            else
-                mFrame = mLoop;
-        }
-        if (mRender == 2)   return 2;
-        return (Render() == 0 ? 1 : -1);
-    }
-    return 0;
+	// Determine if we need the next frame yet...
+	if (++mUpdateCount > 30 / mFPS)
+	{
+		mUpdateCount = 0;
+		if (++mFrame >= mAnimation->GetResourceCount())
+		{
+			if (mLoop < 0)
+			{
+				mFrame = mAnimation->GetResourceCount() - 1;
+				mLoop = -2;
+			}
+			else
+				mFrame = mLoop;
+		}
+		if (mRender == 2)	return 2;
+		return (Render() == 0 ? 1 : -1);
+	}
+	return 0;
 }
 
