diff --git a/gui/checkbox.cpp b/gui/checkbox.cpp
index 077d5e2..b6d5e63 100644
--- a/gui/checkbox.cpp
+++ b/gui/checkbox.cpp
@@ -26,63 +26,64 @@
 #include "objects.hpp"
 
 GUICheckbox::GUICheckbox(xml_node<>* node)
-    : Conditional(node)
+	: Conditional(node)
 {
-    xml_attribute<>* attr;
-    xml_node<>* child;
+	xml_attribute<>* attr;
+	xml_node<>* child;
 
-    mChecked = NULL;
-    mUnchecked = NULL;
-    mLabel = NULL;
-    mRendered = false;
+	mChecked = NULL;
+	mUnchecked = NULL;
+	mLabel = NULL;
+	mRendered = false;
 
-    mLastState = 0;
+	mLastState = 0;
 
-    if (!node)  return;
+	if (!node)
+		return;
 
-    // The label can be loaded directly
-    mLabel = new GUIText(node);
+	// The label can be loaded directly
+	mLabel = new GUIText(node);
 
-    // Read the check states
-    child = node->first_node("image");
-    if (child)
-    {
-        attr = child->first_attribute("checked");
-        if (attr)
-            mChecked = PageManager::FindResource(attr->value());
-        attr = child->first_attribute("unchecked");
-        if (attr)
-            mUnchecked = PageManager::FindResource(attr->value());
-    }
+	// Read the check states
+	child = node->first_node("image");
+	if (child)
+	{
+		attr = child->first_attribute("checked");
+		if (attr)
+			mChecked = PageManager::FindResource(attr->value());
+		attr = child->first_attribute("unchecked");
+		if (attr)
+			mUnchecked = PageManager::FindResource(attr->value());
+	}
 
-    // Get the variable data
-    child = node->first_node("data");
-    if (child)
-    {
-        attr = child->first_attribute("variable");
-        if (attr)
-            mVarName = attr->value();
-        attr = child->first_attribute("default");
-        if (attr)
-            DataManager::SetValue(mVarName, attr->value());
-    }
+	// Get the variable data
+	child = node->first_node("data");
+	if (child)
+	{
+		attr = child->first_attribute("variable");
+		if (attr)
+			mVarName = attr->value();
+		attr = child->first_attribute("default");
+		if (attr)
+			DataManager::SetValue(mVarName, attr->value());
+	}
 
-    mCheckW = 0;    mCheckH = 0;
-    if (mChecked && mChecked->GetResource())
-    {
-        mCheckW = gr_get_width(mChecked->GetResource());
-        mCheckH = gr_get_height(mChecked->GetResource());
-    }
-    else if (mUnchecked && mUnchecked->GetResource())
-    {
-        mCheckW = gr_get_width(mUnchecked->GetResource());
-        mCheckH = gr_get_height(mUnchecked->GetResource());
-    }
+	mCheckW = 0;	mCheckH = 0;
+	if (mChecked && mChecked->GetResource())
+	{
+		mCheckW = gr_get_width(mChecked->GetResource());
+		mCheckH = gr_get_height(mChecked->GetResource());
+	}
+	else if (mUnchecked && mUnchecked->GetResource())
+	{
+		mCheckW = gr_get_width(mUnchecked->GetResource());
+		mCheckH = gr_get_height(mUnchecked->GetResource());
+	}
 
-    int x, y, w, h;
-    mLabel->GetRenderPos(x, y, w, h);
-    SetRenderPos(x, y, 0, 0);
-    return;
+	int x, y, w, h;
+	mLabel->GetRenderPos(x, y, w, h);
+	SetRenderPos(x, y, 0, 0);
+	return;
 }
 
 GUICheckbox::~GUICheckbox()
@@ -91,78 +92,81 @@
 
 int GUICheckbox::Render(void)
 {
-    if (!isConditionTrue())
-    {
-        mRendered = false;
-        return 0;
-    }
+	if (!isConditionTrue())
+	{
+		mRendered = false;
+		return 0;
+	}
 
-    int ret = 0;
-    int lastState = 0;
-    DataManager::GetValue(mVarName, lastState);
+	int ret = 0;
+	int lastState = 0;
+	DataManager::GetValue(mVarName, lastState);
 
-    if (lastState)
-    {
-        if (mChecked && mChecked->GetResource())
-            gr_blit(mChecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
-    }
-    else
-    {
-        if (mUnchecked && mUnchecked->GetResource())
-            gr_blit(mUnchecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
-    }
-    if (mLabel)     ret = mLabel->Render();
-    mLastState = lastState;
-    mRendered = true;
-    return ret;
+	if (lastState)
+	{
+		if (mChecked && mChecked->GetResource())
+			gr_blit(mChecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
+	}
+	else
+	{
+		if (mUnchecked && mUnchecked->GetResource())
+			gr_blit(mUnchecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
+	}
+	if (mLabel)
+		ret = mLabel->Render();
+	mLastState = lastState;
+	mRendered = true;
+	return ret;
 }
 
 int GUICheckbox::Update(void)
 {
-    if (!isConditionTrue())     return (mRendered ? 2 : 0);
-    if (!mRendered)             return 2;
+	if (!isConditionTrue())	return (mRendered ? 2 : 0);
+	if (!mRendered)			return 2;
 
-    int lastState = 0;
-    DataManager::GetValue(mVarName, lastState);
+	int lastState = 0;
+	DataManager::GetValue(mVarName, lastState);
 
-    if (lastState != mLastState)
-        return 2;
-    return 0;
+	if (lastState != mLastState)
+		return 2;
+	return 0;
 }
 
 int GUICheckbox::SetRenderPos(int x, int y, int w, int h)
 {
-    mRenderX = x;
-    mRenderY = y;
+	mRenderX = x;
+	mRenderY = y;
 
-    if (w || h)     return -1;
+	if (w || h)
+		return -1;
 
-    int textW, textH;
-    mLabel->GetCurrentBounds(textW, textH);
+	int textW, textH;
+	mLabel->GetCurrentBounds(textW, textH);
 
-    w = textW + mCheckW + 5;
-    mRenderW = w;
-    mRenderH = mCheckH;
+	w = textW + mCheckW + 5;
+	mRenderW = w;
+	mRenderH = mCheckH;
 
-    mTextX = mRenderX + mCheckW + 5;
-    mTextY = mRenderY + ((mCheckH / 2) - (textH / 2));
+	mTextX = mRenderX + mCheckW + 5;
+	mTextY = mRenderY + ((mCheckH / 2) - (textH / 2));
 
-    mLabel->SetRenderPos(mTextX, mTextY, 0, 0);
-    SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
-    return 0;
+	mLabel->SetRenderPos(mTextX, mTextY, 0, 0);
+	SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+	return 0;
 }
 
 int GUICheckbox::NotifyTouch(TOUCH_STATE state, int x, int y)
 {
-    if (!isConditionTrue())     return -1;
+	if (!isConditionTrue())
+		return -1;
 
-    if (state == TOUCH_RELEASE)
-    {
-        int lastState;
-        DataManager::GetValue(mVarName, lastState);
-        lastState = (lastState == 0) ? 1 : 0;
-        DataManager::SetValue(mVarName, lastState);
-    }
-    return 0;
+	if (state == TOUCH_RELEASE)
+	{
+		int lastState;
+		DataManager::GetValue(mVarName, lastState);
+		lastState = (lastState == 0) ? 1 : 0;
+		DataManager::SetValue(mVarName, lastState);
+	}
+	return 0;
 }
 
